[
  {
    "path": ".cursor/rules/general.mdc",
    "content": "---\ndescription:\nglobs:\nalwaysApply: false\n---\n---\ndescription: General TypeScript coding guidelines\nglobs:\n---\n\n## General\n\n- Write elegant, concise, and readable code\n- Prefer `const` over `let` (never use `var`)\n- Use kebab-case for file and directory names\n- Use clear, descriptive names for variables, functions, and components\n\n## Modules\n\n### Imports & Exports\n\n- Always use ESM `import` and `export` (never use CJS `require`)\n  - File imports should never use an extension (NOT `.js`, `.ts` or `.tsx`).\n  - GOOD examples:\n    - `import { Foo } from './foo'`\n    - `import { type Route } from './types/root'`\n    - `import zod from 'zod'`\n    - `import { logger } from '~/types'`\n  - BAD examples:\n    - `import { Foo } from './foo.js'`\n    - `import { type Route } from './types/root.js'`\n    - `import { Foo } from './foo.ts'`\n- Always prefer named exports over default exports\n\n### Packages\n\nAll packages must follow these `package.json` rules:\n\n- `type` must be set to `module`\n\n## TypeScript\n\n- Avoid semicolons at the end of lines\n- Use TypeScript's utility types (e.g., `Partial`, `Pick`, `Omit`) to manipulate existing types\n- Create custom types for complex data structures used throughout the application\n- If possible, avoid using `any`/`unknown` or casting values like `(value as any)` in TypeScript outside of test files e.g. `*.test.ts` or test fixtures e.g. `**/test-data.ts`.\n- Don't rely on `typeof`, `ReturnType<>`, `Awaited<>`, etc for complex type inference (it's ok for simple types)\n- You can use `as const` as needed for better type inference\n- Functions should accept an object parameter instead of multiple parameters\n  - Good examples:\n    ```ts\n    function myFunction({ foo, bar }: { foo: boolean; bar: string }) {}\n    function VideoPlayer({ sid }: { sid: string }) {}\n    ```\n  - Bad examples:\n    ```ts\n    function myFunction(foo: boolean, bar: string, baz: number) {}\n    ```\n- Arguments should generally be destructured in the function definition, not the function body.\n  - Good example:\n    ```ts\n    function myFunction({ foo, bar }: { foo: boolean; bar: string }) {}\n    ```\n  - Bad example:\n    ```ts\n    function myFunction(args: { foo: boolean; bar: string }) {\n      const { foo, bar } = args\n    }\n    ```\n- Zod should be used to parse untrusted data, but not for data that is trusted like function arguments\n- Prefer Zod unions over Zod enums\n  - For example, this union `z.union([ z.literal('youtube'), z.literal('spotify') ])` is better than this enum `z.enum([ 'youtube', 'spotify' ])`\n- Promises (and `async` functions which implicitly create Promises) must always be properly handled, either via:\n  - Using `await` to wait for the Promise to resolve successfully\n  - Using `.then` or `.catch` to handle Promise resolution\n  - Returning a Promise to a calling function which itself has to handle the Promise.\n\n## Node.js\n\n- Utilize the `node:` protocol when importing Node.js modules (e.g., `import fs from 'node:fs/promises'`)\n- Prefer promise-based APIs over Node's legacy callback APIs\n- Use environment variables for secrets (avoid hardcoding sensitive information)\n\n### Web Standard APIs\n\nAlways prefer using standard web APIs like `fetch`, `WebSocket`, and `ReadableStream` when possible. Avoid redundant libraries (like `node-fetch`).\n\n- Prefer the `fetch` API for making HTTP requests instead of Node.js modules like `http` or `https`\n  - Use the native `fetch` API instead of `node-fetch` or polyfilled `cross-fetch`\n  - Use the `ky` library for HTTP requests instead of `axios` or `superagent`\n- Use the WHATWG `URL` and `URLSearchParams` classes instead of the Node.js `url` module\n- Use `Request` and `Response` objects from the Fetch API instead of Node.js-specific request and response objects\n\n## Error Handling\n\n- Prefer `async`/`await` over `.then()` and `.catch()`\n- Always handle errors correctly (eg: `try`/`catch` or `.catch()`)\n- Avoid swallowing errors silently; always log or handle caught errors appropriately\n\n## Comments\n\nComments should be used to document and explain code. They should complement the use of descriptive variable and function names and type declarations.\n\n- Add comments to explain complex sections of code\n- Add comments that will improve the autocompletion preview in IDEs (eg: functions and types)\n- Don't add comments that just reword symbol names or repeat type declarations\n- Use **JSDoc** formatting for comments (not TSDoc or inline comments)\n\n## Logging\n\n- Just use `console` for logging.\n\n## Testing\n\n### Unit Testing\n\n- **All unit tests should use Vitest**\n  - DO NOT attempt to install or use other testing libraries like Jest\n- Test files should be named `[target].test.ts` and placed in the same directory as the code they are testing (NOT a separate directory)\n  - Good example: `src/my-file.ts` and `src/my-file.test.ts`\n  - Bad example: `src/my-file.ts` and `src/test/my-file.test.ts` or `test/my-file.test.ts` or `src/__tests__/my-file.test.ts`\n- Tests should be run with `pnpm test:unit`\n- It's acceptable to use `any`/`unknown` in test files (such as `*.test.ts`) or test fixtures (like `**/test-data.ts`) to facilitate mocking or stubbing external modules or partial function arguments, referencing the usage guidelines in the TypeScript section.\n- Frontend react code does not need unit tests\n\n### Test Coverage\n\n- Test critical business logic and edge cases\n- Don't add tests for trivial code or just to increase test coverage\n- Don't make tests too brittle or flaky by relying on implementation details\n\n## Git\n\n- When possible, combine the `git add` and `git commit` commands into a single `git commit -am` command, to speed things up\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\ntab_width = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": ".github/funding.yml",
    "content": "github: [transitive-bullshit]\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: CI\n\non: [push]\n\njobs:\n  test:\n    name: Test Node.js ${{ matrix.node-version }}\n    runs-on: ubuntu-latest\n\n    strategy:\n      fail-fast: true\n      matrix:\n        node-version:\n          - 22\n\n    env:\n      TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}\n      TURBO_TEAM: ${{ vars.TURBO_TEAM }}\n      NODE_OPTIONS: --max-old-space-size=8192\n\n    steps:\n      - uses: actions/checkout@v4\n      - uses: pnpm/action-setup@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: 'pnpm'\n\n      - run: pnpm install --frozen-lockfile --strict-peer-dependencies\n\n      - name: Cache turbo build setup\n        uses: actions/cache@v4\n        with:\n          path: .turbo\n          key: ${{ runner.os }}-node-${{ matrix.node-version }}-turbo-${{ github.sha }}\n          restore-keys: |\n            ${{ runner.os }}-node-${{ matrix.node-version }}-turbo-\n\n      - run: pnpm build\n      - run: pnpm test\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  push:\n    tags:\n      - 'v*'\n  workflow_dispatch:\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - uses: pnpm/action-setup@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n          cache: pnpm\n      - run: pnpm dlx changelogithub\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\nnode_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n.next/\n\n# production\nbuild/\ndist/\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# dotenv files\n.env\n.env.production\n.env.staging\n.env.test\n.env*.local\n\n# cloudflare env vars\n.dev.vars\n.dev.vars.production\n.dev.vars.staging\n.dev.vars.test\n\n# turbo\n.turbo\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n\nold/\nout/\n\n.wrangler\n.sentryclirc\n.eslintcache\n.nitro\n.tanstack\n\n.xmcp\n"
  },
  {
    "path": ".npmrc",
    "content": "enable-pre-post-scripts=true\npackage-manager-strict=false\n"
  },
  {
    "path": ".prettierignore",
    "content": "# autogenerated files\npackages/types/src/openapi.d.ts\napps/web/src/routeTree.gen.ts\nlegacy/packages/openapi-to-ts/fixtures/generated\nexamples/mcp-servers/xmcp/xmcp-env.d.ts\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"Debug API\",\n      \"type\": \"node\",\n      \"request\": \"launch\",\n\n      // Debug server in VSCode\n      \"cwd\": \"${workspaceFolder}/apps/api\",\n      \"program\": \"src/server.ts\",\n      // \"program\": \"${file}\",\n\n      /*\n       * Path to tsx binary\n       * Assuming locally installed\n       */\n      \"runtimeExecutable\": \"tsx\",\n\n      /*\n       * Open terminal when debugging starts (Optional)\n       * Useful to see console.logs\n       */\n      \"console\": \"integratedTerminal\",\n      \"internalConsoleOptions\": \"neverOpen\",\n\n      // Files to exclude from debugger (e.g. call stack)\n      \"skipFiles\": [\n        // Node.js internal core modules\n        \"<node_internals>/**\"\n\n        // Ignore all dependencies (optional)\n        // \"${workspaceFolder}/node_modules/**\"\n      ]\n    }\n    // Wrangler's vscode support seems to be extremely buggy. It sometimes works\n    // 1/10th of the time, but nothing I tried could improve that consistency.\n    // Will use browser debugger instead for now.\n    // {\n    //   \"name\": \"gateway\",\n    //   \"type\": \"node\",\n    //   \"request\": \"attach\",\n    //   \"port\": 9229,\n    //   \"cwd\": \"${workspaceFolder}/apps/gateway\",\n    //   // \"cwd\": \"${workspaceFolder}\",\n    //   // \"cwd\": \"/\",\n    //   \"attachExistingChildren\": false,\n    //   \"autoAttachChildProcesses\": false,\n    //   \"sourceMaps\": true,\n    //   \"outFiles\": [\"${workspaceFolder}/apps/gateway/.wrangler/tmp/**/*\"],\n    //   \"resolveSourceMapLocations\": null,\n    //   // \"resolveSourceMapLocations\": [\"**\", \"!**/node_modules/**\"],\n    //   \"skipFiles\": [\"<node_internals>/**\"],\n    //   \"internalConsoleOptions\": \"neverOpen\",\n    //   \"restart\": true\n    // },\n    // {\n    //   \"name\": \"Wrangler\",\n    //   \"type\": \"node\",\n    //   \"request\": \"attach\",\n    //   \"port\": 9229,\n    //   \"cwd\": \"/\",\n    //   \"resolveSourceMapLocations\": null,\n    //   \"attachExistingChildren\": false,\n    //   \"autoAttachChildProcesses\": false,\n    //   \"sourceMaps\": true // works with or without this line (supposedly)\n    // }\n  ]\n  // \"compounds\": [\n  //   {\n  //     \"name\": \"Debug Workers\",\n  //     \"configurations\": [\"gateway\"],\n  //     \"stopAll\": true\n  //   }\n  // ]\n}\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nThis is a monorepo for Agentic - a platform that provides API gateway services for MCP (Model Context Protocol) and OpenAPI integrations.\n\n### Core Architecture\n\nThe platform consists of:\n\n- **API Service** (`apps/api/`) - Platform backend API with authentication, billing, and resource management\n- **Gateway Service** (`apps/gateway/`) - Cloudflare Worker that proxies requests to origin MCP/OpenAPI services\n- **Website** (`apps/web/`) - Next.js site for both the marketing site and authenticated webapp\n- **E2E Tests** (`apps/e2e/`) - End-to-end test suite for HTTP and MCP gateway requests\n- **Shared Packages** (`packages/`) - Common utilities, types, validators, and config\n- **StdLib Packages** (`stdlib/`) - TS AI SDK adapters\n\nThe gateway accepts HTTP requests at `https://gateway.agentic.so/deploymentIdentifier/tool-name` or `https://gateway.agentic.so/deploymentIdentifier/mcp` for MCP.\n\n### Development Commands\n\n**Main development workflow:**\n\n- `pnpm dev` - Start all services in development mode\n- `pnpm build` - Build all packages and apps (except for the website)\n- `pnpm test` - Run all tests (format, lint, typecheck, unit, but not e2e tests)\n- `pnpm clean` - Clean all build artifacts\n\n**Individual test commands:**\n\n- `pnpm test:format` - Check code formatting with Prettier\n- `pnpm test:lint` - Run ESLint across all packages\n- `pnpm test:typecheck` - Run TypeScript type checking\n- `pnpm test:unit` - Run unit tests with Vitest\n\n**Code quality:**\n\n- `pnpm fix` - Auto-fix formatting and linting issues\n- `pnpm knip` - Check for unused dependencies\n\n**E2E testing:**\n\n- (from the `apps/e2e` directory)\n- `pnpm e2e` - Run all E2E tests\n- `pnpm e2e-http` - Run HTTP edge E2E tests\n- `pnpm e2e-mcp` - Run MCP edge E2E tests\n\n### Key Database Models\n\nThe system uses Drizzle ORM with PostgreSQL. Core entities:\n\n- **User** - Platform users\n- **Team** - Organizations with members and billing\n- **Project** - Namespace API products comprised of immutable Deployments\n- **Deployment** - Immutable instances of MCP/OpenAPI services, including gateway and pricing config\n- **Consumer** - Customer subscription tracking usage and billing\n\n### Agentic Configuration\n\nAgentic projects use `agentic.config.{ts,js,json}` files to define:\n\n- Project name and metadata\n- Origin adapter (MCP server or OpenAPI spec)\n- Tool configurations and permissions\n- Pricing plans and rate limits\n- Authentication requirements\n\nThe platform supports both MCP servers and OpenAPI specifications as origin adapters.\n\n### Gateway Request Flow\n\n1. Request hits gateway with deployment identifier\n2. Gateway validates consumer authentication/rate limits/caching\n3. Request is transformed and forwarded to origin service\n4. Response is processed and returned with appropriate headers\n5. Usage is tracked for billing and analytics\n\n### Environment Setup\n\nAll apps require environment variables for:\n\n- Database connections (`DATABASE_URL`)\n- External services (Stripe, GitHub, Resend, Sentry)\n- Internal services (API, gateway, etc)\n- Authentication secrets\n- Stripe secrets\n- Admin API keys\n- Sentry DSN\n- etc\n\n## Coding Conventions\n\n### General\n\n- Write elegant, concise, and readable code\n- Prefer `const` over `let` (never use `var`)\n- Use kebab-case for file and directory names\n- Use clear, descriptive names for variables, functions, and components\n\n### Modules\n\n- Always use ESM `import` and `export` (never use CJS `require`)\n  - File imports should never use an extension (NOT `.js`, `.ts` or `.tsx`).\n  - GOOD examples:\n    - `import { Foo } from './foo'`\n    - `import { type Route } from './types/root'`\n    - `import zod from 'zod'`\n    - `import { logger } from '~/types'`\n  - BAD examples:\n    - `import { Foo } from './foo.js'`\n    - `import { type Route } from './types/root.js'`\n    - `import { Foo } from './foo.ts'`\n- Always prefer named exports over default exports except for when default exports are required (like in Next.js `page.tsx` components)\n\n### Packages\n\nAll packages must follow these `package.json` rules:\n\n- `type` must be set to `module`\n\n### TypeScript\n\n- Avoid semicolons at the end of lines\n- Use TypeScript's utility types (e.g., `Partial`, `Pick`, `Omit`) to manipulate existing types\n- Create custom types for complex data structures used throughout the application\n- If possible, avoid using `any`/`unknown` or casting values like `(value as any)` in TypeScript outside of test files e.g. `*.test.ts` or test fixtures e.g. `**/test-data.ts`.\n- Try not to rely on `typeof`, `ReturnType<>`, `Awaited<>`, etc for complex type inference (it's ok for simple types)\n- You can use `as const` as needed for better type inference\n- Functions should accept an object parameter instead of multiple parameters\n  - GOOD examples:\n    ```ts\n    function myFunction({ foo, bar }: { foo: boolean; bar: string }) {}\n    function VideoPlayer({ sid }: { sid: string }) {}\n    ```\n  - BAD examples:\n    ```ts\n    function myFunction(foo: boolean, bar: string, baz: number) {}\n    ```\n- Arguments should generally be destructured in the function definition, not the function body.\n  - GOOD example:\n    ```ts\n    function myFunction({ foo, bar }: { foo: boolean; bar: string }) {}\n    function exampleWithOptionalParams({\n      foo = 'example'\n    }: { foo?: string } = {}) {}\n    ```\n  - BAD example:\n    ```ts\n    function myFunction(opts: { foo: boolean; bar: string }) {\n      const { foo, bar } = opts\n    }\n    ```\n- Zod should be used to parse untrusted data, but not for data that is trusted like function arguments\n- Prefer Zod unions over Zod enums\n  - For example, this union `z.union([ z.literal('youtube'), z.literal('spotify') ])` is better than this enum `z.enum([ 'youtube', 'spotify' ])`\n- Promises (and `async` functions which implicitly create Promises) must always be properly handled, either via:\n  - Using `await` to wait for the Promise to resolve successfully\n  - Using `.then` or `.catch` to handle Promise resolution\n  - Returning a Promise to a calling function which itself has to handle the Promise.\n\n## Node.js\n\n- Utilize the `node:` protocol when importing Node.js modules (e.g., `import fs from 'node:fs/promises'`)\n- Prefer promise-based APIs over Node's legacy callback APIs\n- Use environment variables for secrets (avoid hardcoding sensitive information)\n\n### Web Standard APIs\n\nAlways prefer using standard web APIs like `fetch`, `WebSocket`, and `ReadableStream` when possible. Avoid redundant libraries (like `node-fetch`).\n\n- Prefer the `fetch` API for making HTTP requests instead of Node.js modules like `http` or `https`\n  - Prefer using the `ky` `fetch` wrapper for HTTP requests instead of `axios`, `superagent`, `node-fetch` or any other HTTP request library\n  - Never use `node-fetch`; prefer `ky` or native `fetch` directly\n- Use the WHATWG `URL` and `URLSearchParams` classes instead of the Node.js `url` module\n- Use `Request` and `Response` objects from the Fetch API instead of Node.js-specific request and response objects\n\n### Error Handling\n\n- Prefer `async`/`await` over `.then()` and `.catch()`\n- Always handle errors correctly (eg: `try`/`catch` or `.catch()`)\n- Avoid swallowing errors silently; always log or handle caught errors appropriately\n\n### Comments\n\nComments should be used to document and explain code. They should complement the use of descriptive variable and function names and type declarations.\n\n- Add comments to explain complex sections of code\n- Add comments that will improve the autocompletion preview in IDEs (eg: functions and types)\n- Don't add comments that just reword symbol names or repeat type declarations\n- Use **JSDoc** formatting for comments (not TSDoc or inline comments)\n\n### Logging\n\n- Just use `console` for logging.\n\n### Testing\n\n#### Unit Testing\n\n- **All unit tests should use Vitest**\n  - DO NOT attempt to install or use other testing libraries like Jest\n- Test files should be named `[target].test.ts` and placed in the same directory as the code they are testing (NOT a separate directory)\n  - GOOD example: `src/my-file.ts` and `src/my-file.test.ts`\n  - BAD example: `src/my-file.ts` and `src/test/my-file.test.ts` or `test/my-file.test.ts` or `src/__tests__/my-file.test.ts`\n- Tests should be run with `pnpm test:unit`\n- You may use `any`/`unknown` in test files (such as `*.test.ts`) or test fixtures (like `**/test-data.ts`) to facilitate mocking or stubbing external modules or partial function arguments, referencing the usage guidelines in the TypeScript section.\n- Frontend react code does not need unit tests\n\n#### Test Coverage\n\n- Test critical business logic and edge cases\n- Don't add tests for trivial code or just to increase test coverage\n- Don't make tests too brittle or flaky by relying on implementation details\n\n### Git\n\n- When possible, combine the `git add` and `git commit` commands into a single `git commit -am` command, to speed things up\n"
  },
  {
    "path": "Tiltfile",
    "content": "# 🌊 run `tilt up` to start\n# then open http://localhost:10350/r/(all)/overview\n\nload('ext://uibutton', 'cmd_button', 'bool_input', 'location')\n# Find docs on Tilt at https://docs.tilt.dev/api.html#api.local_resource\n# Find icons at https://fonts.google.com/icons\n \nlocal_resource(\n    '🍍 API',\n    serve_dir='apps/api',\n    serve_cmd='pnpm dev:server',\n    links=[ link('http://localhost:3001/v1/health', 'API'), ],\n    labels=['Agentic']\n)\n\nlocal_resource(\n    '🌶️ Web',\n    serve_dir='apps/web',\n    serve_cmd='pnpm dev',\n    links=[ link('http://localhost:3000', 'Web'), ],\n    labels=['Agentic']\n)\n\nlocal_resource(\n    '🍉 Gateway',\n    serve_dir='apps/gateway',\n    serve_cmd='pnpm dev',\n    labels=['Agentic']\n)\n\nlocal_resource(\n    '🧪 E2E Tests',\n    cmd='echo 0',\n    labels=['Testing'],\n    auto_init=False\n)\n\nlocal_resource(\n    '🔍 Drizzle Studio',\n    serve_dir='apps/api',\n    serve_cmd='pnpm drizzle-kit studio',\n    links=[ link('https://local.drizzle.studio', 'Drizzle Studio'), ],\n    labels=['Services'],\n)\n\nlocal_resource(\n    '💸 Stripe Webhooks',\n    serve_dir='apps/api',\n    serve_cmd='pnpm dev:stripe',\n    # links=[ link('http://localhost:4983', 'Stripe Webhooks'), ],\n    labels=['Services'],\n)\n\ncmd_button(\n    'Seed Database',\n    argv=['sh', '-c', 'cd apps/e2e && pnpm run seed-db'],\n    location=location.NAV,\n    icon_name='nature',\n    text='Seed Database',\n)\n"
  },
  {
    "path": "apps/api/drizzle.config.ts",
    "content": "import { defineConfig } from 'drizzle-kit'\n\nexport default defineConfig({\n  out: './drizzle',\n  schema: './src/db/schema/index.ts',\n  dialect: 'postgresql',\n  dbCredentials: {\n    // eslint-disable-next-line no-process-env\n    url: process.env.DATABASE_URL!\n  }\n})\n"
  },
  {
    "path": "apps/api/package.json",
    "content": "{\n  \"name\": \"api\",\n  \"private\": true,\n  \"version\": \"8.4.4\",\n  \"description\": \"Internal Agentic platform API service.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"apps/api\"\n  },\n  \"type\": \"module\",\n  \"source\": \"./src/server.ts\",\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"dev\": \"run-p dev:*\",\n    \"dev:server\": \"dotenvx run -- tsx src/server.ts\",\n    \"dev:stripe\": \"dotenvx run -- stripe listen --forward-to http://localhost:3001/v1/webhooks/stripe\",\n    \"prod\": \"run-p prod:*\",\n    \"prod:server\": \"dotenvx run -o -f .env.production -- tsx src/server.ts\",\n    \"prod:stripe\": \"dotenvx run -o -f .env.production -- stripe listen --forward-to http://localhost:3001/v1/webhooks/stripe\",\n    \"start\": \"tsx src/server.ts\",\n    \"drizzle-kit\": \"dotenvx run -- drizzle-kit\",\n    \"drizzle-kit:prod\": \"dotenvx run -o -f .env.production -- drizzle-kit\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"[ -n \\\"$CI\\\" ] || dotenvx run -- vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-emails\": \"workspace:*\",\n    \"@agentic/platform-hono\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@agentic/platform-validators\": \"workspace:*\",\n    \"@aws-sdk/client-s3\": \"^3.726.1\",\n    \"@aws-sdk/s3-request-presigner\": \"^3.726.1\",\n    \"@dicebear/collection\": \"catalog:\",\n    \"@dicebear/core\": \"catalog:\",\n    \"@fisch0920/drizzle-orm\": \"catalog:\",\n    \"@fisch0920/drizzle-zod\": \"catalog:\",\n    \"@hono/node-server\": \"catalog:\",\n    \"@hono/zod-openapi\": \"catalog:\",\n    \"@paralleldrive/cuid2\": \"catalog:\",\n    \"@sentry/node\": \"catalog:\",\n    \"bcryptjs\": \"catalog:\",\n    \"exit-hook\": \"catalog:\",\n    \"file-type\": \"^21.0.0\",\n    \"hono\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"mrmime\": \"^2.0.1\",\n    \"octokit\": \"catalog:\",\n    \"p-all\": \"catalog:\",\n    \"postgres\": \"catalog:\",\n    \"restore-cursor\": \"catalog:\",\n    \"semver\": \"catalog:\",\n    \"stripe\": \"catalog:\",\n    \"type-fest\": \"catalog:\",\n    \"zod-validation-error\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@types/semver\": \"catalog:\",\n    \"drizzle-kit\": \"catalog:\",\n    \"drizzle-orm\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "apps/api/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# Agentic API <!-- omit from toc -->\n\n> Backend API for the Agentic platform.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so)\n\n## Dependencies\n\n- **Postgres**\n  - `DATABASE_URL` - Postgres connection string\n  - [On macOS](https://wiki.postgresql.org/wiki/Homebrew): `brew install postgresql && brew services start postgresql`\n  - You'll need to run `pnpm drizzle-kit push` to set up your database schema\n- **S3** - Required to use file attachments\n  - Any S3-compatible provider is supported, such as [Cloudflare R2](https://developers.cloudflare.com/r2/)\n  - Alterantively, you can use a local S3 server like [MinIO](https://github.com/minio/minio#homebrew-recommended) or [LocalStack](https://github.com/localstack/localstack)\n    - To run LocalStack on macOS: `brew install localstack/tap/localstack-cli && localstack start -d`\n    - To run MinIO macOS: `brew install minio/stable/minio && minio server /data`\n  - I recommend using Cloudflare R2, though – it's amazing and should be free for most use cases!\n  - `S3_BUCKET` - Required\n  - `S3_REGION` - Optional; defaults to `auto`\n  - `S3_ENDPOINT` - Required; example: `https://<id>.r2.cloudflarestorage.com`\n  - `ACCESS_KEY_ID` - Required ([cloudflare R2 docs](https://developers.cloudflare.com/r2/api/s3/tokens/))\n  - `SECRET_ACCESS_KEY` - Required ([cloudflare R2 docs](https://developers.cloudflare.com/r2/api/s3/tokens/))\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "apps/api/src/api-v1/auth/github-callback.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport type { OpenAPIHono } from '@hono/zod-openapi'\nimport { assert } from '@agentic/platform-core'\n\nimport { authStorage } from './utils'\n\nexport function registerV1GitHubOAuthCallback(\n  app: OpenAPIHono<DefaultHonoEnv>\n) {\n  return app.get('auth/github/callback', async (c) => {\n    const logger = c.get('logger')\n    const query = c.req.query()\n\n    assert(query.state, 400, 'State is required')\n\n    const entry = await authStorage.get(['github', query.state, 'redirectUri'])\n    assert(entry, 400, 'Redirect URI not found')\n    const redirectUri = entry.redirectUri\n    assert(entry.redirectUri, 400, 'Redirect URI not found')\n\n    const url = new URL(redirectUri)\n    for (const [key, value] of Object.entries(query)) {\n      url.searchParams.set(key, value)\n    }\n\n    logger.info('GitHub auth callback', query, '=>', url.toString(), {\n      rawUrl: redirectUri,\n      query\n    })\n    return c.redirect(url.toString())\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/auth/github-exchange.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport { createAuthToken } from '@/lib/auth/create-auth-token'\nimport { upsertOrLinkUserAccount } from '@/lib/auth/upsert-or-link-user-account'\nimport {\n  exchangeGitHubOAuthCodeForAccessToken,\n  getGitHubClient\n} from '@/lib/external/github'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { authSessionResponseSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Exchanges a GitHub OAuth code for an Agentic auth session.',\n  tags: ['auth'],\n  operationId: 'exchangeOAuthCodeWithGitHub',\n  method: 'post',\n  path: 'auth/github/exchange',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: z\n            .object({\n              code: z.string()\n            })\n            .passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'An auth session',\n      content: {\n        'application/json': {\n          schema: authSessionResponseSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GitHubOAuthExchange(\n  app: OpenAPIHono<DefaultHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const logger = c.get('logger')\n    const body = c.req.valid('json')\n\n    const result = await exchangeGitHubOAuthCodeForAccessToken(body)\n    logger.info('github oauth', result)\n\n    const client = getGitHubClient({ accessToken: result.access_token! })\n    const { data: ghUser } = await client.rest.users.getAuthenticated()\n\n    logger.info('github user', ghUser)\n\n    if (!ghUser.email) {\n      const { data: emails } = await client.request('GET /user/emails')\n      const primary = emails.find((e) => e.primary)\n      const verified = emails.find((e) => e.verified)\n      const fallback = emails.find((e) => e.email)\n      const email = primary?.email || verified?.email || fallback?.email\n      ghUser.email = email!\n    }\n\n    assert(\n      ghUser.email,\n      'Error authenticating with GitHub: user email is required.'\n    )\n\n    const now = Date.now()\n    const user = await upsertOrLinkUserAccount({\n      partialAccount: {\n        provider: 'github',\n        accountId: `${ghUser.id}`,\n        accountUsername: ghUser.login.toLowerCase(),\n        accessToken: result.access_token,\n        refreshToken: result.refresh_token,\n        // `expires_in` and `refresh_token_expires_in` are given in seconds\n        accessTokenExpiresAt: result.expires_in\n          ? new Date(now + result.expires_in * 1000)\n          : undefined,\n        refreshTokenExpiresAt: result.refresh_token_expires_in\n          ? new Date(now + result.refresh_token_expires_in * 1000)\n          : undefined,\n        scope: result.scope || undefined\n      },\n      partialUser: {\n        email: ghUser.email,\n        isEmailVerified: true,\n        name: ghUser.name || undefined,\n        username: ghUser.login.toLowerCase(),\n        image: ghUser.avatar_url\n      }\n    })\n\n    logger.info('github user result', user)\n\n    const token = await createAuthToken(user)\n    return c.json(parseZodSchema(authSessionResponseSchema, { token, user }))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/auth/github-init.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport { env } from '@/lib/env'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { authStorage } from './utils'\n\nconst route = createRoute({\n  description: 'Starts a GitHub OAuth flow.',\n  tags: ['auth'],\n  operationId: 'initGitHubOAuthFlow',\n  method: 'get',\n  path: 'auth/github/init',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: z\n      .object({\n        redirect_uri: z.string(),\n        client_id: z.string().optional(),\n        scope: z.string().optional()\n      })\n      .passthrough()\n  },\n  responses: {\n    302: {\n      description: 'Redirected to GitHub'\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GitHubOAuthInitFlow(\n  app: OpenAPIHono<DefaultHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const logger = c.get('logger')\n    const {\n      client_id: clientId = env.GITHUB_CLIENT_ID,\n      scope = 'user:email',\n      redirect_uri: redirectUri\n    } = c.req.query()\n\n    const state = crypto.randomUUID()\n\n    // TODO: unique identifier!\n    // TODO: THIS IS IMPORTANT!! if multiple users are authenticating with github concurrently, this will currently really mess things up...\n    await authStorage.set(['github', state, 'redirectUri'], { redirectUri })\n\n    const publicRedirectUri = `${env.apiBaseUrl}/v1/auth/github/callback`\n\n    const url = new URL('https://github.com/login/oauth/authorize')\n    url.searchParams.append('client_id', clientId)\n    url.searchParams.append('scope', scope)\n    url.searchParams.append('state', state)\n    url.searchParams.append('redirect_uri', publicRedirectUri)\n\n    logger.info('Redirecting to GitHub', {\n      url: url.toString(),\n      clientId,\n      scope,\n      publicRedirectUri\n    })\n\n    return c.redirect(url.toString())\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/auth/schemas.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nimport { schema } from '@/db'\n\nexport const authSessionResponseSchema = z\n  .object({\n    token: z.string().nonempty(),\n    user: schema.userSelectSchema\n  })\n  .openapi('AuthSession')\n"
  },
  {
    "path": "apps/api/src/api-v1/auth/sign-in-with-password.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport type { Context } from 'hono'\nimport { assert, parseZodSchema } from '@agentic/platform-core'\nimport { isValidPassword } from '@agentic/platform-validators'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\nimport { compare } from 'bcryptjs'\n\nimport { and, db, eq, schema } from '@/db'\nimport { createAuthToken } from '@/lib/auth/create-auth-token'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { authSessionResponseSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Signs in with email and password.',\n  tags: ['auth'],\n  operationId: 'signInWithPassword',\n  method: 'post',\n  path: 'auth/password/signin',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: z.object({\n            email: z.string().email(),\n            password: z.string().refine((password) => isValidPassword(password))\n          })\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'An auth session',\n      content: {\n        'application/json': {\n          schema: authSessionResponseSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1SignInWithPassword(app: OpenAPIHono<DefaultHonoEnv>) {\n  return app.openapi(route, trySignIn)\n}\n\nexport async function trySignIn(\n  c: Context<\n    DefaultHonoEnv,\n    'auth/password/signin',\n    {\n      in: {\n        json: {\n          password: string\n          email: string\n        }\n      }\n      out: {\n        json: {\n          password: string\n          email: string\n        }\n      }\n    }\n  >\n) {\n  const { email, password } = c.req.valid('json')\n\n  const user = await db.query.users.findFirst({\n    where: eq(schema.users.email, email)\n  })\n  assert(user, 404, `User not found \"${email}\"`)\n\n  const account = await db.query.accounts.findFirst({\n    where: and(\n      eq(schema.accounts.userId, user.id),\n      eq(schema.accounts.provider, 'password')\n    )\n  })\n  assert(account?.password, 404, `User \"${email}\" does not have a password set`)\n  assert(compare(password, account.password), 403, 'Authentication error')\n\n  const token = await createAuthToken(user)\n  return c.json(parseZodSchema(authSessionResponseSchema, { token, user }))\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/auth/sign-up-with-password.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { parseZodSchema } from '@agentic/platform-core'\nimport { isValidPassword } from '@agentic/platform-validators'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\nimport { genSalt, hash } from 'bcryptjs'\n\nimport { usernameSchema } from '@/db'\nimport { createAuthToken } from '@/lib/auth/create-auth-token'\nimport { upsertOrLinkUserAccount } from '@/lib/auth/upsert-or-link-user-account'\nimport { ensureUniqueNamespace } from '@/lib/ensure-unique-namespace'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { authSessionResponseSchema } from './schemas'\nimport { trySignIn } from './sign-in-with-password'\n\nconst route = createRoute({\n  description: 'Signs up for a new account with email and password.',\n  tags: ['auth'],\n  operationId: 'signUpWithPassword',\n  method: 'post',\n  path: 'auth/password/signup',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: z.object({\n            username: usernameSchema,\n            email: z.string().email(),\n            password: z.string().refine((password) => isValidPassword(password))\n          })\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'An auth session',\n      content: {\n        'application/json': {\n          schema: authSessionResponseSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1SignUpWithPassword(app: OpenAPIHono<DefaultHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    try {\n      // try signing in to see if the user already exists\n      return await trySignIn(c)\n    } catch {\n      // Ignore errors\n    }\n\n    const { username, email, password } = c.req.valid('json')\n    await ensureUniqueNamespace(username, { label: 'username' })\n\n    const salt = await genSalt()\n    const hashedPassword = await hash(password, salt)\n\n    // TODO: fail if username is taken\n    const user = await upsertOrLinkUserAccount({\n      partialAccount: {\n        provider: 'password',\n        accountId: email,\n        password: hashedPassword\n      },\n      partialUser: {\n        username,\n        email\n      }\n    })\n\n    const token = await createAuthToken(user)\n    return c.json(parseZodSchema(authSessionResponseSchema, { token, user }))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/auth/utils.ts",
    "content": "import { DrizzleAuthStorage } from '@/lib/auth/drizzle-auth-storage'\n\nexport const authStorage = DrizzleAuthStorage()\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/admin-activate-consumer.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { aclAdmin } from '@/lib/acl-admin'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponse410,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { consumerIdParamsSchema } from './schemas'\nimport { setAdminCacheControlForConsumer } from './utils'\n\nconst route = createRoute({\n  description:\n    \"Activates a consumer signifying that at least one API call has been made using the consumer's API token. This method is idempotent and admin-only.\",\n  tags: ['admin', 'consumers'],\n  operationId: 'adminActivateConsumer',\n  method: 'put',\n  path: 'admin/consumers/{consumerId}/activate',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: consumerIdParamsSchema\n  },\n  responses: {\n    200: {\n      description: 'An admin consumer object',\n      content: {\n        'application/json': {\n          schema: schema.consumerAdminSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409,\n    ...openapiErrorResponse410\n  }\n})\n\nexport function registerV1AdminActivateConsumer(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { consumerId } = c.req.valid('param')\n    await aclAdmin(c)\n\n    const [consumer] = await db\n      .update(schema.consumers)\n      .set({ activated: true })\n      .where(eq(schema.consumers.id, consumerId))\n      .returning()\n    assert(consumer, 404, `Consumer not found \"${consumerId}\"`)\n\n    setAdminCacheControlForConsumer(c, consumer)\n    return c.json(parseZodSchema(schema.consumerAdminSelectSchema, consumer))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/admin-get-consumer-by-api-key.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { aclAdmin } from '@/lib/acl-admin'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { consumerApiKeyParamsSchema, populateConsumerSchema } from './schemas'\nimport { setAdminCacheControlForConsumer } from './utils'\n\nconst route = createRoute({\n  description: 'Gets a consumer by API key. This route is admin-only.',\n  tags: ['admin', 'consumers'],\n  operationId: 'adminGetConsumerByApiKey',\n  method: 'get',\n  // TODO: is it wise to use a path param for the API key? especially wehn it'll\n  // be cached in cloudflare's shared cache?\n  path: 'admin/consumers/api-keys/{apiKey}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: consumerApiKeyParamsSchema,\n    query: populateConsumerSchema\n  },\n  responses: {\n    200: {\n      description: 'An admin consumer object',\n      content: {\n        'application/json': {\n          schema: schema.consumerAdminSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1AdminGetConsumerByApiKey(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { apiKey } = c.req.valid('param')\n    const { populate = [] } = c.req.valid('query')\n    await aclAdmin(c)\n\n    const consumer = await db.query.consumers.findFirst({\n      where: eq(schema.consumers.token, apiKey),\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(consumer, 404, `API key not found \"${apiKey}\"`)\n\n    setAdminCacheControlForConsumer(c, consumer)\n    return c.json(parseZodSchema(schema.consumerAdminSelectSchema, consumer))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/create-billing-portal-session.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { upsertStripeCustomer } from '@/lib/billing/upsert-stripe-customer'\nimport { env } from '@/lib/env'\nimport { stripe } from '@/lib/external/stripe'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponse410,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nconst route = createRoute({\n  description:\n    'Creates a Stripe billing portal session for the authenticated user.',\n  tags: ['consumers'],\n  operationId: 'createBillingPortalSession',\n  method: 'post',\n  path: 'consumers/billing-portal',\n  security: openapiAuthenticatedSecuritySchemas,\n  responses: {\n    200: {\n      description: 'A billing portal session URL',\n      content: {\n        'application/json': {\n          schema: z.object({\n            url: z.string().url()\n          })\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409,\n    ...openapiErrorResponse410\n  }\n})\n\nexport function registerV1CreateBillingPortalSession(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { stripeCustomer } = await upsertStripeCustomer(c)\n\n    const portalSession = await stripe.billingPortal.sessions.create({\n      customer: stripeCustomer.id,\n      return_url: `${env.AGENTIC_WEB_BASE_URL}/app/consumers`\n    })\n\n    return c.json({ url: portalSession.url })\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/create-consumer-billing-portal-session.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { env } from '@/lib/env'\nimport { stripe } from '@/lib/external/stripe'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponse410,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { consumerIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Creates a Stripe billing portal session for a customer.',\n  tags: ['consumers'],\n  operationId: 'createConsumerBillingPortalSession',\n  method: 'post',\n  path: 'consumers/{consumerId}/billing-portal',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: consumerIdParamsSchema\n  },\n  responses: {\n    200: {\n      description: 'A billing portal session URL',\n      content: {\n        'application/json': {\n          schema: z.object({\n            url: z.string().url()\n          })\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409,\n    ...openapiErrorResponse410\n  }\n})\n\nexport function registerV1CreateConsumerBillingPortalSession(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { consumerId } = c.req.valid('param')\n    const consumer = await db.query.consumers.findFirst({\n      where: eq(schema.consumers.id, consumerId)\n    })\n    assert(consumer, 404, `Consumer not found \"${consumerId}\"`)\n    await acl(c, consumer, { label: 'Consumer' })\n\n    const portalSession = await stripe.billingPortal.sessions.create({\n      customer: consumer._stripeCustomerId,\n      return_url: `${env.AGENTIC_WEB_BASE_URL}/app/consumers/${consumerId}`\n    })\n\n    return c.json({ url: portalSession.url })\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/create-consumer-checkout-session.ts",
    "content": "import { parseZodSchema, pick } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { schema } from '@/db'\nimport { upsertConsumerStripeCheckout } from '@/lib/consumers/upsert-consumer-stripe-checkout'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponse410,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nconst route = createRoute({\n  description:\n    'Creates a Stripe checkout session for a consumer to modify their subscription to a project.',\n  tags: ['consumers'],\n  operationId: 'createConsumerCheckoutSession',\n  method: 'post',\n  path: 'consumers/checkout',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.consumerInsertSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'A consumer object',\n      content: {\n        'application/json': {\n          schema: z.object({\n            checkoutSession: z.object({\n              id: z.string(),\n              url: z.string().url()\n            }),\n            consumer: schema.consumerSelectSchema\n          })\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409,\n    ...openapiErrorResponse410\n  }\n})\n\nexport function registerV1CreateConsumerCheckoutSession(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const body = c.req.valid('json')\n    const { checkoutSession, consumer } = await upsertConsumerStripeCheckout(\n      c,\n      body\n    )\n\n    return c.json({\n      checkoutSession: pick(checkoutSession, 'id', 'url'),\n      consumer: parseZodSchema(schema.consumerSelectSchema, consumer)\n    })\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/create-consumer.ts",
    "content": "import { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { schema } from '@/db'\nimport { upsertConsumer } from '@/lib/consumers/upsert-consumer'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponse410,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nconst route = createRoute({\n  description:\n    \"Upserts a consumer by modifying a customer's subscription to a project.\",\n  tags: ['consumers'],\n  operationId: 'createConsumer',\n  method: 'post',\n  path: 'consumers',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.consumerInsertSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'A consumer object',\n      content: {\n        'application/json': {\n          schema: schema.consumerSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409,\n    ...openapiErrorResponse410\n  }\n})\n\nexport function registerV1CreateConsumer(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const body = c.req.valid('json')\n    const consumer = await upsertConsumer(c, body)\n\n    return c.json(parseZodSchema(schema.consumerSelectSchema, consumer))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/get-consumer-by-project-identifier.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { and, db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { aclPublicProject } from '@/lib/acl-public-project'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { projectIdentifierAndPopulateConsumerSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Gets a consumer for the authenticated user and the given project identifier.',\n  tags: ['consumers'],\n  operationId: 'getConsumerByProjectIdentifier',\n  method: 'get',\n  path: 'consumers/by-project-identifier',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: projectIdentifierAndPopulateConsumerSchema\n  },\n  responses: {\n    200: {\n      description: 'A consumer object',\n      content: {\n        'application/json': {\n          schema: schema.consumerSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetConsumerByProjectIdentifier(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { projectIdentifier, populate = [] } = c.req.valid('query')\n    const userId = c.get('userId')\n\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.identifier, projectIdentifier)\n    })\n    assert(project, 404, `Project not found \"${projectIdentifier}\"`)\n    aclPublicProject(project)\n\n    const consumer = await db.query.consumers.findFirst({\n      where: and(\n        eq(schema.consumers.userId, userId),\n        eq(schema.consumers.projectId, project.id)\n      ),\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(\n      consumer,\n      404,\n      `Consumer not found for user \"${userId}\" and project \"${projectIdentifier}\"`\n    )\n    await acl(c, consumer, { label: 'Consumer' })\n\n    return c.json(parseZodSchema(schema.consumerSelectSchema, consumer))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/get-consumer.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { consumerIdParamsSchema, populateConsumerSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Gets a consumer by ID.',\n  tags: ['consumers'],\n  operationId: 'getConsumer',\n  method: 'get',\n  path: 'consumers/{consumerId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: consumerIdParamsSchema,\n    query: populateConsumerSchema\n  },\n  responses: {\n    200: {\n      description: 'A consumer object',\n      content: {\n        'application/json': {\n          schema: schema.consumerSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetConsumer(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { consumerId } = c.req.valid('param')\n    const { populate = [] } = c.req.valid('query')\n\n    const consumer = await db.query.consumers.findFirst({\n      where: eq(schema.consumers.id, consumerId),\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(consumer, 404, `Consumer not found \"${consumerId}\"`)\n    await acl(c, consumer, { label: 'Consumer' })\n\n    return c.json(parseZodSchema(schema.consumerSelectSchema, consumer))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/list-consumers.ts",
    "content": "import { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { ensureAuthUser } from '@/lib/ensure-auth-user'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { paginationAndPopulateConsumerSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Lists all of the customer subscriptions for the current user.',\n  tags: ['consumers'],\n  operationId: 'listConsumers',\n  method: 'get',\n  path: 'consumers',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: paginationAndPopulateConsumerSchema\n  },\n  responses: {\n    200: {\n      description: 'A list of consumers',\n      content: {\n        'application/json': {\n          schema: z.array(schema.consumerSelectSchema)\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1ListConsumers(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const {\n      offset = 0,\n      limit = 10,\n      sort = 'desc',\n      sortBy = 'createdAt',\n      populate = []\n    } = c.req.valid('query')\n\n    const user = await ensureAuthUser(c)\n\n    const consumers = await db.query.consumers.findMany({\n      where: eq(schema.consumers.userId, user.id),\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      },\n      orderBy: (consumers, { asc, desc }) => [\n        sort === 'desc' ? desc(consumers[sortBy]) : asc(consumers[sortBy])\n      ],\n      offset,\n      limit\n    })\n\n    return c.json(\n      parseZodSchema(z.array(schema.consumerSelectSchema), consumers)\n    )\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/list-project-consumers.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { projectIdParamsSchema } from '../projects/schemas'\nimport { paginationAndPopulateConsumerSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Lists all of the customers for a project.',\n  tags: ['consumers'],\n  operationId: 'listConsumersForProject',\n  method: 'get',\n  path: 'projects/{projectId}/consumers',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: projectIdParamsSchema,\n    query: paginationAndPopulateConsumerSchema\n  },\n  responses: {\n    200: {\n      description: 'A list of consumers subscribed to the given project',\n      content: {\n        'application/json': {\n          schema: z.array(schema.consumerSelectSchema)\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1ListConsumersForProject(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const {\n      offset = 0,\n      limit = 10,\n      sort = 'desc',\n      sortBy = 'createdAt',\n      populate = []\n    } = c.req.valid('query')\n\n    const { projectId } = c.req.valid('param')\n    assert(projectId, 400, 'Project ID is required')\n\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.id, projectId)\n    })\n    assert(project, 404, `Project not found \"${projectId}\"`)\n    await acl(c, project, { label: 'Project' })\n\n    const consumers = await db.query.consumers.findMany({\n      where: eq(schema.consumers.projectId, projectId),\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      },\n      orderBy: (consumers, { asc, desc }) => [\n        sort === 'desc' ? desc(consumers[sortBy]) : asc(consumers[sortBy])\n      ],\n      offset,\n      limit\n    })\n\n    return c.json(\n      parseZodSchema(z.array(schema.consumerSelectSchema), consumers)\n    )\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/refresh-consumer-api-key.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { createConsumerApiKey } from '@/lib/create-consumer-api-key'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { consumerIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: \"Refreshes a consumer's API key.\",\n  tags: ['consumers'],\n  operationId: 'refreshConsumerApiKey',\n  method: 'post',\n  path: 'consumers/{consumerId}/refresh-api-key',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: consumerIdParamsSchema\n  },\n  responses: {\n    200: {\n      description: 'A consumer object',\n      content: {\n        'application/json': {\n          schema: schema.consumerSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1RefreshConsumerApiKey(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { consumerId } = c.req.valid('param')\n\n    let consumer = await db.query.consumers.findFirst({\n      where: eq(schema.consumers.id, consumerId)\n    })\n    assert(consumer, 404, 'Consumer not found')\n    await acl(c, consumer, { label: 'Consumer' })\n\n    // Update the consumer's API token\n    ;[consumer] = await db\n      .update(schema.consumers)\n      .set({\n        token: await createConsumerApiKey()\n      })\n      .where(eq(schema.consumers.id, consumer.id))\n      .returning()\n    assert(consumer, 500, 'Error updating consumer')\n\n    return c.json(parseZodSchema(schema.consumerSelectSchema, consumer))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/schemas.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nimport {\n  consumerIdSchema,\n  consumerRelationsSchema,\n  paginationSchema,\n  projectIdentifierSchema\n} from '@/db'\n\nexport const consumerIdParamsSchema = z.object({\n  consumerId: consumerIdSchema.openapi({\n    param: {\n      description: 'Consumer ID',\n      name: 'consumerId',\n      in: 'path'\n    }\n  })\n})\n\nexport const consumerApiKeyParamsSchema = z.object({\n  apiKey: z\n    .string()\n    .nonempty()\n    .openapi({\n      param: {\n        description: 'Consumer API key',\n        name: 'apiKey',\n        in: 'path'\n      }\n    })\n})\n\nexport const projectIdentifierQuerySchema = z.object({\n  projectIdentifier: projectIdentifierSchema\n})\n\nexport const populateConsumerSchema = z.object({\n  populate: z\n    .union([consumerRelationsSchema, z.array(consumerRelationsSchema)])\n    .default([])\n    .transform((p) => (Array.isArray(p) ? p : [p]))\n    .optional()\n})\n\nexport const paginationAndPopulateConsumerSchema = z.object({\n  ...paginationSchema.shape,\n  ...populateConsumerSchema.shape\n})\n\nexport const projectIdentifierAndPopulateConsumerSchema = z.object({\n  ...projectIdentifierQuerySchema.shape,\n  ...populateConsumerSchema.shape\n})\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/update-consumer.ts",
    "content": "import { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { schema } from '@/db'\nimport { upsertConsumer } from '@/lib/consumers/upsert-consumer'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponse410,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { consumerIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    \"Updates a consumer's subscription to a different deployment or pricing plan. Set `plan` to undefined to cancel the subscription.\",\n  tags: ['consumers'],\n  operationId: 'updateConsumer',\n  method: 'post',\n  path: 'consumers/{consumerId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: consumerIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.consumerUpdateSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'A consumer object',\n      content: {\n        'application/json': {\n          schema: schema.consumerSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409,\n    ...openapiErrorResponse410\n  }\n})\n\nexport function registerV1UpdateConsumer(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { consumerId } = c.req.valid('param')\n    const body = c.req.valid('json')\n\n    const consumer = await upsertConsumer(c, {\n      ...body,\n      consumerId\n    })\n\n    return c.json(parseZodSchema(schema.consumerSelectSchema, consumer))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/consumers/utils.ts",
    "content": "import type { RawConsumer } from '@/db'\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport { setPublicCacheControl } from '@/lib/cache-control'\nimport { env } from '@/lib/env'\n\nexport function setAdminCacheControlForConsumer(\n  c: AuthenticatedHonoContext,\n  consumer: RawConsumer\n) {\n  if (\n    consumer.plan === 'free' ||\n    !consumer.activated ||\n    !consumer.isStripeSubscriptionActive\n  ) {\n    // TODO: should we cache free-tier consumers for longer on prod?\n    // We really don't want free tier customers to cause our backend API so\n    // much traffic, but we'd also like for customers upgrading to a paid tier\n    // to have a snappy, smooth experience – without having to wait for their\n    // free tier subscription to expire from the cache.\n    setPublicCacheControl(c.res, env.isProd ? '30s' : '10s')\n  } else {\n    // We don't want the gateway hitting our API too often, so cache active\n    // customer subscriptions for longer in production\n    setPublicCacheControl(c.res, env.isProd ? '30m' : '1m')\n  }\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/admin-get-deployment-by-identifier.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { aclAdmin } from '@/lib/acl-admin'\nimport { setPublicCacheControl } from '@/lib/cache-control'\nimport { tryGetDeploymentByIdentifier } from '@/lib/deployments/try-get-deployment-by-identifier'\nimport { env } from '@/lib/env'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { deploymentIdentifierAndPopulateSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Gets a deployment by its public identifier. This route is admin-only.',\n  tags: ['admin', 'deployments'],\n  operationId: 'adminGetDeploymentByIdentifier',\n  method: 'get',\n  path: 'admin/deployments/by-identifier',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: deploymentIdentifierAndPopulateSchema\n  },\n  responses: {\n    200: {\n      description: 'An admin deployment object',\n      content: {\n        'application/json': {\n          schema: schema.deploymentAdminSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1AdminGetDeploymentByIdentifier(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { deploymentIdentifier, populate = [] } = c.req.valid('query')\n    await aclAdmin(c)\n\n    const { project, ...deployment } = await tryGetDeploymentByIdentifier(c, {\n      deploymentIdentifier,\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true])),\n        project: true\n      }\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentIdentifier}\"`)\n    assert(\n      project,\n      404,\n      `Project not found for deployment \"${deploymentIdentifier}\"`\n    )\n    await acl(c, deployment, { label: 'Deployment' })\n\n    // TODO: ensure that the deployment's project is either public OR the\n    // consumer has access to it?\n\n    const hasPopulateProject = populate.includes('project')\n\n    if (env.isProd) {\n      // Published deployments are immutable, so cache them for longer in production\n      setPublicCacheControl(c.res, deployment.published ? '1h' : '5m')\n    } else {\n      setPublicCacheControl(c.res, '10s')\n    }\n\n    return c.json(\n      parseZodSchema(schema.deploymentAdminSelectSchema, {\n        ...deployment,\n        ...(hasPopulateProject ? { project } : {}),\n        _secret: project._secret\n      })\n    )\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/create-deployment.ts",
    "content": "import { resolveAgenticProjectConfig } from '@agentic/platform'\nimport { assert, parseZodSchema, sha256, slugify } from '@agentic/platform-core'\nimport {\n  isValidDeploymentIdentifier,\n  parseProjectIdentifier\n} from '@agentic/platform-validators'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { normalizeDeploymentVersion } from '@/lib/deployments/normalize-deployment-version'\nimport { publishDeployment } from '@/lib/deployments/publish-deployment'\nimport { ensureAuthUser } from '@/lib/ensure-auth-user'\nimport { env } from '@/lib/env'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\nimport { uploadFileUrlToStorage } from '@/lib/storage'\n\nimport { createDeploymentQuerySchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Creates a new deployment within a project.',\n  tags: ['deployments'],\n  operationId: 'createDeployment',\n  method: 'post',\n  path: 'deployments',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: createDeploymentQuerySchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.deploymentInsertSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'A deployment object',\n      content: {\n        'application/json': {\n          schema: schema.deploymentSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409\n  }\n})\n\nexport function registerV1CreateDeployment(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const user = await ensureAuthUser(c)\n    const { publish } = c.req.valid('query')\n    const body = c.req.valid('json')\n    const teamMember = c.get('teamMember')\n    const logger = c.get('logger')\n\n    const inputNamespace = teamMember ? teamMember.teamSlug : user.username\n    const slug = body.slug ?? slugify(body.name) // TODO: don't duplicate this logic here\n    const inputProjectIdentifier = `@${inputNamespace}/${slug}`\n    const { projectIdentifier, projectNamespace, projectSlug } =\n      parseProjectIdentifier(inputProjectIdentifier)\n\n    let project = await db.query.projects.findFirst({\n      where: eq(schema.projects.identifier, projectIdentifier),\n      with: {\n        lastPublishedDeployment: true\n      }\n    })\n\n    if (!project) {\n      // Used for testing e2e fixtures in the development marketplace\n      const isPrivate = !(\n        (user.username === 'dev' && env.isDev) ||\n        user.username === 'agentic'\n      )\n\n      // Used to simplify recreating the demo `@agentic/search` project during\n      // development while we're frequently resetting the database\n      const secret =\n        projectIdentifier === '@dev/search' ||\n        projectIdentifier === '@agentic/search'\n          ? env.AGENTIC_SEARCH_PROXY_SECRET\n          : await sha256()\n\n      // Upsert the project if it doesn't already exist\n      // The typecast is necessary here because we're not populating the\n      // lastPublishedDeployment, but that's fine because it's a new project\n      // so it will be empty anyway.\n      project = (\n        await db\n          .insert(schema.projects)\n          .values({\n            name: body.name,\n            identifier: projectIdentifier,\n            namespace: projectNamespace,\n            slug: projectSlug,\n            userId: user.id,\n            teamId: teamMember?.teamId,\n            private: isPrivate,\n            _secret: secret\n          })\n          .returning()\n      )[0] as typeof project\n    }\n\n    assert(project, 404, `Project not found \"${projectIdentifier}\"`)\n    await acl(c, project, { label: 'Project' })\n    const projectId = project.id\n\n    // TODO: investigate better short hash generation\n    const hash = (await sha256()).slice(0, 8)\n    const deploymentIdentifier = `${project.identifier}@${hash}`\n    assert(\n      isValidDeploymentIdentifier(deploymentIdentifier),\n      400,\n      `Invalid deployment identifier \"${deploymentIdentifier}\"`\n    )\n\n    let { version } = body\n    if (publish) {\n      assert(\n        version,\n        400,\n        `Deployment \"version\" field is required to publish deployment \"${deploymentIdentifier}\"`\n      )\n    }\n\n    if (version) {\n      version = normalizeDeploymentVersion({\n        deploymentIdentifier,\n        project,\n        version\n      })\n    }\n\n    // Validate project config, including:\n    // - pricing plans\n    // - origin adapter config\n    // - origin API base URL\n    // - origin adapter OpenAPI or MCP specs\n    // - tool definitions\n    const agenticProjectConfig = await resolveAgenticProjectConfig(body, {\n      label: `deployment \"${deploymentIdentifier}\"`,\n      logger,\n      uploadFileUrlToStorage: async (source) => {\n        return uploadFileUrlToStorage(source, {\n          prefix: projectIdentifier\n        })\n      }\n    })\n\n    // Create the deployment\n    let [deployment] = await db\n      .insert(schema.deployments)\n      .values({\n        iconUrl: user.image,\n        ...agenticProjectConfig,\n        identifier: deploymentIdentifier,\n        hash,\n        userId: user.id,\n        teamId: teamMember?.teamId,\n        projectId,\n        version\n      })\n      .returning()\n    assert(\n      deployment,\n      500,\n      `Failed to create deployment \"${deploymentIdentifier}\"`\n    )\n\n    // Update the project\n    await db\n      .update(schema.projects)\n      .set({\n        lastDeploymentId: deployment.id\n      })\n      .where(eq(schema.projects.id, projectId))\n\n    if (publish) {\n      deployment = await publishDeployment(c, {\n        deployment,\n        version: deployment.version!\n      })\n    }\n\n    return c.json(parseZodSchema(schema.deploymentSelectSchema, deployment))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/get-deployment-by-identifier.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { tryGetDeploymentByIdentifier } from '@/lib/deployments/try-get-deployment-by-identifier'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { deploymentIdentifierAndPopulateSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Gets a deployment by its identifier (eg, \"@username/project-slug@latest\").',\n  tags: ['deployments'],\n  operationId: 'getDeploymentByIdentifier',\n  method: 'get',\n  path: 'deployments/by-identifier',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: deploymentIdentifierAndPopulateSchema\n  },\n  responses: {\n    200: {\n      description: 'A deployment object',\n      content: {\n        'application/json': {\n          schema: schema.deploymentSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetDeploymentByIdentifier(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { deploymentIdentifier, populate = [] } = c.req.valid('query')\n\n    const deployment = await tryGetDeploymentByIdentifier(c, {\n      deploymentIdentifier,\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentIdentifier}\"`)\n    await acl(c, deployment, { label: 'Deployment' })\n\n    return c.json(parseZodSchema(schema.deploymentSelectSchema, deployment))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/get-deployment.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { getDeploymentById } from '@/lib/deployments/get-deployment-by-id'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { deploymentIdParamsSchema, populateDeploymentSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Gets a deployment by its ID',\n  tags: ['deployments'],\n  operationId: 'getDeployment',\n  method: 'get',\n  path: 'deployments/{deploymentId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: deploymentIdParamsSchema,\n    query: populateDeploymentSchema\n  },\n  responses: {\n    200: {\n      description: 'A deployment object',\n      content: {\n        'application/json': {\n          schema: schema.deploymentSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetDeployment(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { deploymentId } = c.req.valid('param')\n    const { populate = [] } = c.req.valid('query')\n\n    const deployment = await getDeploymentById({\n      deploymentId,\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentId}\"`)\n    await acl(c, deployment, { label: 'Deployment' })\n\n    return c.json(parseZodSchema(schema.deploymentSelectSchema, deployment))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/get-public-deployment-by-identifier.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport { schema } from '@/db'\nimport { aclPublicProject } from '@/lib/acl-public-project'\nimport { setPublicCacheControl } from '@/lib/cache-control'\nimport { tryGetDeploymentByIdentifier } from '@/lib/deployments/try-get-deployment-by-identifier'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { deploymentIdentifierAndPopulateSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Gets a public deployment by its identifier (eg, \"@username/project-slug@latest\").',\n  tags: ['deployments'],\n  operationId: 'getPublicDeploymentByIdentifier',\n  method: 'get',\n  path: 'deployments/public/by-identifier',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: deploymentIdentifierAndPopulateSchema\n  },\n  responses: {\n    200: {\n      description: 'A deployment object',\n      content: {\n        'application/json': {\n          schema: schema.deploymentSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetPublicDeploymentByIdentifier(\n  app: OpenAPIHono<DefaultHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { deploymentIdentifier, populate = [] } = c.req.valid('query')\n\n    const deployment = await tryGetDeploymentByIdentifier(c, {\n      deploymentIdentifier,\n      with: {\n        project: true,\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentIdentifier}\"`)\n    assert(\n      deployment.project,\n      404,\n      `Project not found for deployment \"${deploymentIdentifier}\"`\n    )\n    aclPublicProject(deployment.project!)\n\n    if (deployment.published) {\n      // Note that published deployments should be immutable\n      setPublicCacheControl(c.res, '1m')\n    } else {\n      setPublicCacheControl(c.res, '10s')\n    }\n\n    return c.json(parseZodSchema(schema.deploymentSelectSchema, deployment))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/list-deployments.ts",
    "content": "import { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { and, db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { ensureAuthUser } from '@/lib/ensure-auth-user'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\nimport { tryGetProjectByIdentifier } from '@/lib/projects/try-get-project-by-identifier'\n\nimport { paginationAndPopulateAndFilterDeploymentSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Lists deployments the user or team has access to, optionally filtering by project.',\n  tags: ['deployments'],\n  operationId: 'listDeployments',\n  method: 'get',\n  path: 'deployments',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: paginationAndPopulateAndFilterDeploymentSchema\n  },\n  responses: {\n    200: {\n      description: 'A list of deployments',\n      content: {\n        'application/json': {\n          schema: z.array(schema.deploymentSelectSchema)\n        }\n      }\n    },\n    ...openapiErrorResponses\n  }\n})\n\nexport function registerV1ListDeployments(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const {\n      offset = 0,\n      limit = 10,\n      sort = 'desc',\n      sortBy = 'createdAt',\n      populate = [],\n      projectIdentifier,\n      deploymentIdentifier\n    } = c.req.valid('query')\n\n    const userId = c.get('userId')\n    const teamMember = c.get('teamMember')\n    const user = await ensureAuthUser(c)\n    const isAdmin = user.role === 'admin'\n\n    let projectId: string | undefined\n\n    if (projectIdentifier) {\n      const project = await tryGetProjectByIdentifier(c, {\n        projectIdentifier\n      })\n      await acl(c, project, { label: 'Project' })\n      projectId = project.id\n    }\n\n    const deployments = await db.query.deployments.findMany({\n      where: and(\n        isAdmin\n          ? undefined\n          : teamMember\n            ? eq(schema.deployments.teamId, teamMember.teamId)\n            : eq(schema.deployments.userId, userId),\n        projectId ? eq(schema.deployments.projectId, projectId) : undefined,\n        deploymentIdentifier\n          ? eq(schema.deployments.identifier, deploymentIdentifier)\n          : undefined\n      ),\n      with: {\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      },\n      orderBy: (deployments, { asc, desc }) => [\n        sort === 'desc' ? desc(deployments[sortBy]) : asc(deployments[sortBy])\n      ],\n      offset,\n      limit\n    })\n\n    return c.json(\n      parseZodSchema(z.array(schema.deploymentSelectSchema), deployments)\n    )\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/publish-deployment.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { getDeploymentById } from '@/lib/deployments/get-deployment-by-id'\nimport { publishDeployment } from '@/lib/deployments/publish-deployment'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { deploymentIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Publishes a deployment.',\n  tags: ['deployments'],\n  operationId: 'publishDeployment',\n  method: 'post',\n  path: 'deployments/{deploymentId}/publish',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: deploymentIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.deploymentPublishSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'A deployment object',\n      content: {\n        'application/json': {\n          schema: schema.deploymentSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1PublishDeployment(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { deploymentId } = c.req.valid('param')\n    const { version } = c.req.valid('json')\n\n    // First ensure the deployment exists and the user has access to it\n    const deployment = await getDeploymentById({ deploymentId })\n    assert(deployment, 404, `Deployment not found \"${deploymentId}\"`)\n    await acl(c, deployment, { label: 'Deployment' })\n\n    const publishedDeployment = await publishDeployment(c, {\n      deployment,\n      version\n    })\n\n    return c.json(\n      parseZodSchema(schema.deploymentSelectSchema, publishedDeployment)\n    )\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/schemas.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nimport {\n  deploymentIdentifierSchema,\n  deploymentIdSchema,\n  deploymentRelationsSchema,\n  paginationSchema,\n  projectIdentifierSchema\n} from '@/db'\n\nexport const deploymentIdParamsSchema = z.object({\n  deploymentId: deploymentIdSchema.openapi({\n    param: {\n      description: 'deployment ID',\n      name: 'deploymentId',\n      in: 'path'\n    }\n  })\n})\n\nexport const createDeploymentQuerySchema = z.object({\n  publish: z\n    .union([z.literal('true'), z.literal('false')])\n    .default('false')\n    .transform((p) => p === 'true')\n})\n\nexport const filterDeploymentSchema = z.object({\n  projectIdentifier: projectIdentifierSchema.optional(),\n  deploymentIdentifier: deploymentIdentifierSchema.optional()\n})\n\nexport const populateDeploymentSchema = z.object({\n  populate: z\n    .union([deploymentRelationsSchema, z.array(deploymentRelationsSchema)])\n    .default([])\n    .transform((p) => (Array.isArray(p) ? p : [p]))\n    .optional()\n})\n\nexport const deploymentIdentifierQuerySchema = z.object({\n  deploymentIdentifier: deploymentIdentifierSchema\n})\n\nexport const deploymentIdentifierAndPopulateSchema = z.object({\n  ...populateDeploymentSchema.shape,\n  ...deploymentIdentifierQuerySchema.shape\n})\n\nexport const paginationAndPopulateAndFilterDeploymentSchema = z.object({\n  ...paginationSchema.shape,\n  ...populateDeploymentSchema.shape,\n  ...filterDeploymentSchema.shape\n})\n"
  },
  {
    "path": "apps/api/src/api-v1/deployments/update-deployment.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { getDeploymentById } from '@/lib/deployments/get-deployment-by-id'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { deploymentIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Updates a deployment.',\n  tags: ['deployments'],\n  operationId: 'updateDeployment',\n  method: 'post',\n  path: 'deployments/{deploymentId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: deploymentIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.deploymentUpdateSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'A deployment object',\n      content: {\n        'application/json': {\n          schema: schema.deploymentSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1UpdateDeployment(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { deploymentId } = c.req.valid('param')\n    const body = c.req.valid('json')\n\n    // First ensure the deployment exists and the user has access to it\n    let deployment = await getDeploymentById({ deploymentId })\n    assert(deployment, 404, `Deployment not found \"${deploymentId}\"`)\n    await acl(c, deployment, { label: 'Deployment' })\n\n    // Update the deployment\n    ;[deployment] = await db\n      .update(schema.deployments)\n      .set(body)\n      .where(eq(schema.deployments.id, deploymentId))\n      .returning()\n    assert(deployment, 500, `Failed to update deployment \"${deploymentId}\"`)\n\n    return c.json(parseZodSchema(schema.deploymentSelectSchema, deployment))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/health-check.ts",
    "content": "import { createRoute, z } from '@hono/zod-openapi'\n\nimport type { HonoApp } from '@/lib/types'\n\nconst route = createRoute({\n  description: 'Health check endpoint.',\n  operationId: 'healthCheck',\n  method: 'get',\n  path: 'health',\n  responses: {\n    200: {\n      description: 'OK',\n      content: {\n        'application/json': {\n          schema: z.object({\n            status: z.string()\n          })\n        }\n      }\n    }\n  }\n})\n\nexport function registerHealthCheck(app: HonoApp) {\n  return app.openapi(route, async (c) => {\n    return c.json({ status: 'ok' })\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/index.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport * as middleware from '@/lib/middleware'\nimport { defaultHook, registerOpenAPIErrorResponses } from '@/lib/openapi-utils'\n\nimport { registerV1GitHubOAuthCallback } from './auth/github-callback'\nimport { registerV1GitHubOAuthExchange } from './auth/github-exchange'\nimport { registerV1GitHubOAuthInitFlow } from './auth/github-init'\nimport { registerV1SignInWithPassword } from './auth/sign-in-with-password'\nimport { registerV1SignUpWithPassword } from './auth/sign-up-with-password'\nimport { registerV1AdminActivateConsumer } from './consumers/admin-activate-consumer'\nimport { registerV1AdminGetConsumerByApiKey } from './consumers/admin-get-consumer-by-api-key'\nimport { registerV1CreateBillingPortalSession } from './consumers/create-billing-portal-session'\nimport { registerV1CreateConsumer } from './consumers/create-consumer'\nimport { registerV1CreateConsumerBillingPortalSession } from './consumers/create-consumer-billing-portal-session'\nimport { registerV1CreateConsumerCheckoutSession } from './consumers/create-consumer-checkout-session'\nimport { registerV1GetConsumer } from './consumers/get-consumer'\nimport { registerV1GetConsumerByProjectIdentifier } from './consumers/get-consumer-by-project-identifier'\nimport { registerV1ListConsumers } from './consumers/list-consumers'\nimport { registerV1ListConsumersForProject } from './consumers/list-project-consumers'\nimport { registerV1RefreshConsumerApiKey } from './consumers/refresh-consumer-api-key'\nimport { registerV1UpdateConsumer } from './consumers/update-consumer'\nimport { registerV1AdminGetDeploymentByIdentifier } from './deployments/admin-get-deployment-by-identifier'\nimport { registerV1CreateDeployment } from './deployments/create-deployment'\nimport { registerV1GetDeployment } from './deployments/get-deployment'\nimport { registerV1GetDeploymentByIdentifier } from './deployments/get-deployment-by-identifier'\nimport { registerV1GetPublicDeploymentByIdentifier } from './deployments/get-public-deployment-by-identifier'\nimport { registerV1ListDeployments } from './deployments/list-deployments'\nimport { registerV1PublishDeployment } from './deployments/publish-deployment'\nimport { registerV1UpdateDeployment } from './deployments/update-deployment'\nimport { registerHealthCheck } from './health-check'\nimport { registerV1CreateProject } from './projects/create-project'\nimport { registerV1GetProject } from './projects/get-project'\nimport { registerV1GetProjectByIdentifier } from './projects/get-project-by-identifier'\nimport { registerV1GetPublicProject } from './projects/get-public-project'\nimport { registerV1GetPublicProjectByIdentifier } from './projects/get-public-project-by-identifier'\nimport { registerV1ListProjects } from './projects/list-projects'\nimport { registerV1ListPublicProjects } from './projects/list-public-projects'\nimport { registerV1UpdateProject } from './projects/update-project'\nimport { registerV1GetSignedStorageUploadUrl } from './storage/get-signed-storage-upload-url'\nimport { registerV1CreateTeam } from './teams/create-team'\nimport { registerV1DeleteTeam } from './teams/delete-team'\nimport { registerV1GetTeam } from './teams/get-team'\nimport { registerV1ListTeams } from './teams/list-teams'\nimport { registerV1CreateTeamMember } from './teams/members/create-team-member'\nimport { registerV1DeleteTeamMember } from './teams/members/delete-team-member'\nimport { registerV1UpdateTeamMember } from './teams/members/update-team-member'\nimport { registerV1UpdateTeam } from './teams/update-team'\nimport { registerV1GetUser } from './users/get-user'\nimport { registerV1UpdateUser } from './users/update-user'\nimport { registerV1StripeWebhook } from './webhooks/stripe-webhook'\n\n// Note that the order of some of these routes is important because of\n// wildcards, so be careful when updating them or adding new routes.\n\nexport const apiV1 = new OpenAPIHono<DefaultHonoEnv>({ defaultHook })\n\napiV1.openAPIRegistry.registerComponent('securitySchemes', 'Bearer', {\n  type: 'http',\n  scheme: 'bearer',\n  bearerFormat: 'JWT'\n})\n\nregisterOpenAPIErrorResponses(apiV1)\n\n// Public routes\nconst publicRouter = new OpenAPIHono<DefaultHonoEnv>({ defaultHook })\n\n// Private, authenticated routes\nconst privateRouter = new OpenAPIHono<AuthenticatedHonoEnv>({ defaultHook })\n\nregisterHealthCheck(publicRouter)\n\n// Auth\nregisterV1SignInWithPassword(publicRouter)\nregisterV1SignUpWithPassword(publicRouter)\nregisterV1GitHubOAuthExchange(publicRouter)\nregisterV1GitHubOAuthInitFlow(publicRouter)\nregisterV1GitHubOAuthCallback(publicRouter)\n\n// Users\nregisterV1GetUser(privateRouter)\nregisterV1UpdateUser(privateRouter)\n\n// Teams\nregisterV1CreateTeam(privateRouter)\nregisterV1ListTeams(privateRouter)\nregisterV1GetTeam(privateRouter)\nregisterV1DeleteTeam(privateRouter)\nregisterV1UpdateTeam(privateRouter)\n\n// Team members\nregisterV1CreateTeamMember(privateRouter)\nregisterV1UpdateTeamMember(privateRouter)\nregisterV1DeleteTeamMember(privateRouter)\n\n// Storage\nregisterV1GetSignedStorageUploadUrl(privateRouter)\n\n// Public projects\nregisterV1ListPublicProjects(publicRouter)\nregisterV1GetPublicProjectByIdentifier(publicRouter) // must be before `registerV1GetPublicProject`\nregisterV1GetPublicProject(publicRouter)\n\n// Private projects\nregisterV1CreateProject(privateRouter)\nregisterV1ListProjects(privateRouter)\nregisterV1GetProjectByIdentifier(privateRouter) // must be before `registerV1GetProject`\nregisterV1GetProject(privateRouter)\nregisterV1UpdateProject(privateRouter)\n\n// Consumers\nregisterV1GetConsumerByProjectIdentifier(privateRouter) // must be before `registerV1GetConsumer`\nregisterV1CreateBillingPortalSession(privateRouter)\nregisterV1GetConsumer(privateRouter)\nregisterV1CreateConsumer(privateRouter)\nregisterV1CreateConsumerCheckoutSession(privateRouter)\nregisterV1CreateConsumerBillingPortalSession(privateRouter)\nregisterV1UpdateConsumer(privateRouter)\nregisterV1RefreshConsumerApiKey(privateRouter)\nregisterV1ListConsumers(privateRouter)\nregisterV1ListConsumersForProject(privateRouter)\n\n// Deployments\nregisterV1GetPublicDeploymentByIdentifier(publicRouter)\nregisterV1GetDeploymentByIdentifier(privateRouter) // must be before `registerV1GetDeployment`\nregisterV1GetDeployment(privateRouter)\nregisterV1CreateDeployment(privateRouter)\nregisterV1UpdateDeployment(privateRouter)\nregisterV1ListDeployments(privateRouter)\nregisterV1PublishDeployment(privateRouter)\n\n// Internal admin routes\nregisterV1AdminGetConsumerByApiKey(privateRouter)\nregisterV1AdminActivateConsumer(privateRouter)\nregisterV1AdminGetDeploymentByIdentifier(privateRouter)\n\n// Webhook event handlers\nregisterV1StripeWebhook(publicRouter)\n\n// Setup routes and middleware\napiV1.route('/', publicRouter)\napiV1.use(middleware.authenticate)\napiV1.use(middleware.team)\napiV1.use(middleware.me)\napiV1.route('/', privateRouter)\n\n// API route types to be used by Hono's RPC client.\n// Should include all routes except for internal and admin routes.\n// NOTE: Removing for now because Hono's RPC client / types are clunky and slow.\n// export type ApiRoutes =\n//   | ReturnType<typeof registerHealthCheck>\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/create-project.ts",
    "content": "import { assert, parseZodSchema, sha256 } from '@agentic/platform-core'\nimport { parseProjectIdentifier } from '@agentic/platform-validators'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, schema } from '@/db'\nimport { ensureAuthUser } from '@/lib/ensure-auth-user'\nimport { env } from '@/lib/env'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nconst route = createRoute({\n  description: 'Creates a new project.',\n  tags: ['projects'],\n  operationId: 'createProject',\n  method: 'post',\n  path: 'projects',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.projectInsertSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'The created project',\n      content: {\n        'application/json': {\n          schema: schema.projectSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses\n  }\n})\n\nexport function registerV1CreateProject(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const body = c.req.valid('json')\n    const user = await ensureAuthUser(c)\n\n    // if (body.teamId) {\n    //   await aclTeamMember(c, { teamId: body.teamId })\n    // }\n\n    const teamMember = c.get('teamMember')\n    const namespace = teamMember ? teamMember.teamSlug : user.username\n    const identifier = `@${namespace}/${body.slug}`\n    const { projectIdentifier, projectNamespace, projectSlug } =\n      parseProjectIdentifier(identifier)\n\n    // Used for testing e2e fixtures in the development marketplace\n    const isPrivate = !(\n      (user.username === 'dev' && env.isDev) ||\n      user.username === 'agentic'\n    )\n\n    // Used to simplify recreating the demo `@agentic/search` project during\n    // development while we're frequently resetting the database\n    const secret =\n      projectIdentifier === '@dev/search' ||\n      projectIdentifier === '@agentic/search'\n        ? env.AGENTIC_SEARCH_PROXY_SECRET\n        : await sha256()\n\n    const [project] = await db\n      .insert(schema.projects)\n      .values({\n        ...body,\n        identifier: projectIdentifier,\n        namespace: projectNamespace,\n        slug: projectSlug,\n        teamId: teamMember?.teamId,\n        userId: user.id,\n        private: isPrivate,\n        _secret: secret\n      })\n      .returning()\n    assert(project, 500, `Failed to create project \"${body.name}\"`)\n\n    return c.json(parseZodSchema(schema.projectSelectSchema, project))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/get-project-by-identifier.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { projectIdentifierAndPopulateSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Gets a project by its public identifier (eg, \"@username/project-slug\").',\n  tags: ['projects'],\n  operationId: 'getProjectByIdentifier',\n  method: 'get',\n  path: 'projects/by-identifier',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: projectIdentifierAndPopulateSchema\n  },\n  responses: {\n    200: {\n      description: 'A project',\n      content: {\n        'application/json': {\n          schema: schema.projectSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetProjectByIdentifier(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { projectIdentifier, populate = [] } = c.req.valid('query')\n\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.identifier, projectIdentifier),\n      with: {\n        lastPublishedDeployment: true,\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(project, 404, `Project not found \"${projectIdentifier}\"`)\n    await acl(c, project, { label: 'Project' })\n\n    return c.json(parseZodSchema(schema.projectSelectSchema, project))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/get-project.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { populateProjectSchema, projectIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Gets a project by ID.',\n  tags: ['projects'],\n  operationId: 'getProject',\n  method: 'get',\n  path: 'projects/{projectId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: projectIdParamsSchema,\n    query: populateProjectSchema\n  },\n  responses: {\n    200: {\n      description: 'A project',\n      content: {\n        'application/json': {\n          schema: schema.projectSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetProject(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { projectId } = c.req.valid('param')\n    const { populate = [] } = c.req.valid('query')\n\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.id, projectId),\n      with: {\n        lastPublishedDeployment: true,\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    assert(project, 404, `Project not found \"${projectId}\"`)\n    await acl(c, project, { label: 'Project' })\n\n    return c.json(parseZodSchema(schema.projectSelectSchema, project))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/get-public-project-by-identifier.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport { db, eq, schema } from '@/db'\nimport { aclPublicProject } from '@/lib/acl-public-project'\nimport { setPublicCacheControl } from '@/lib/cache-control'\nimport { env } from '@/lib/env'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { projectIdentifierAndPopulateSchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Gets a public project by its public identifier (eg, \"@username/project-slug\").',\n  tags: ['projects'],\n  operationId: 'getPublicProjectByIdentifier',\n  method: 'get',\n  path: 'projects/public/by-identifier',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: projectIdentifierAndPopulateSchema\n  },\n  responses: {\n    200: {\n      description: 'A project',\n      content: {\n        'application/json': {\n          schema: schema.projectSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetPublicProjectByIdentifier(\n  app: OpenAPIHono<DefaultHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { projectIdentifier, populate = [] } = c.req.valid('query')\n\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.identifier, projectIdentifier),\n      with: {\n        lastPublishedDeployment: true,\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    aclPublicProject(project, projectIdentifier)\n    setPublicCacheControl(c.res, env.isProd ? '1m' : '10s')\n\n    return c.json(parseZodSchema(schema.projectSelectSchema, project))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/get-public-project.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport { db, eq, schema } from '@/db'\nimport { aclPublicProject } from '@/lib/acl-public-project'\nimport { setPublicCacheControl } from '@/lib/cache-control'\nimport { env } from '@/lib/env'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { populateProjectSchema, projectIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Gets a public project by ID.',\n  tags: ['projects'],\n  operationId: 'getPublicProject',\n  method: 'get',\n  path: 'projects/public/{projectId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: projectIdParamsSchema,\n    query: populateProjectSchema\n  },\n  responses: {\n    200: {\n      description: 'A project',\n      content: {\n        'application/json': {\n          schema: schema.projectSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetPublicProject(app: OpenAPIHono<DefaultHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { projectId } = c.req.valid('param')\n    const { populate = [] } = c.req.valid('query')\n\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.id, projectId),\n      with: {\n        lastPublishedDeployment: true,\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      }\n    })\n    aclPublicProject(project, projectId)\n    setPublicCacheControl(c.res, env.isProd ? '1m' : '10s')\n\n    return c.json(parseZodSchema(schema.projectSelectSchema, project))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/list-projects.ts",
    "content": "import { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { ensureAuthUser } from '@/lib/ensure-auth-user'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { paginationAndPopulateProjectSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Lists projects owned by the authenticated user or team.',\n  tags: ['projects'],\n  operationId: 'listProjects',\n  method: 'get',\n  path: 'projects',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: paginationAndPopulateProjectSchema\n  },\n  responses: {\n    200: {\n      description: 'A list of projects',\n      content: {\n        'application/json': {\n          schema: z.array(schema.projectSelectSchema)\n        }\n      }\n    },\n    ...openapiErrorResponses\n  }\n})\n\nexport function registerV1ListProjects(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const {\n      offset = 0,\n      limit = 10,\n      sort = 'desc',\n      sortBy = 'createdAt',\n      populate = []\n    } = c.req.valid('query')\n\n    const user = await ensureAuthUser(c)\n    const teamMember = c.get('teamMember')\n    const isAdmin = user.role === 'admin'\n\n    const projects = await db.query.projects.findMany({\n      where: isAdmin\n        ? undefined\n        : teamMember\n          ? eq(schema.projects.teamId, teamMember.teamId)\n          : eq(schema.projects.userId, user.id),\n      with: {\n        lastPublishedDeployment: true,\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      },\n      orderBy: (projects, { asc, desc }) => [\n        sort === 'desc' ? desc(projects[sortBy]) : asc(projects[sortBy])\n      ],\n      offset,\n      limit\n    })\n\n    return c.json(parseZodSchema(z.array(schema.projectSelectSchema), projects))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/list-public-projects.ts",
    "content": "import { env } from 'node:process'\n\nimport type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport {\n  and,\n  arrayContains,\n  db,\n  eq,\n  isNotNull,\n  isNull,\n  not,\n  or,\n  schema\n} from '@/db'\nimport { setPublicCacheControl } from '@/lib/cache-control'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { listPublicProjectsQuerySchema } from './schemas'\n\nconst route = createRoute({\n  description:\n    'Lists projects that have been published publicly to the marketplace.',\n  tags: ['projects'],\n  operationId: 'listPublicProjects',\n  method: 'get',\n  path: 'projects/public',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: listPublicProjectsQuerySchema\n  },\n  responses: {\n    200: {\n      description: 'A list of projects',\n      content: {\n        'application/json': {\n          schema: z.array(schema.projectSelectSchema)\n        }\n      }\n    },\n    ...openapiErrorResponses\n  }\n})\n\nexport function registerV1ListPublicProjects(app: OpenAPIHono<DefaultHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const {\n      offset = 0,\n      limit = 10,\n      sort = 'desc',\n      sortBy = 'createdAt',\n      populate = [],\n      tag,\n      notTag\n    } = c.req.valid('query')\n\n    const projects = await db.query.projects.findMany({\n      // List projects that are not private and have at least one published deployment\n      // And optionally match a given tag\n      where: and(\n        eq(schema.projects.private, false),\n        isNotNull(schema.projects.lastPublishedDeploymentId),\n        tag ? arrayContains(schema.projects.tags, [tag]) : undefined,\n        notTag\n          ? or(\n              not(arrayContains(schema.projects.tags, [notTag])),\n              isNull(schema.projects.tags)\n            )\n          : undefined\n      ),\n      with: {\n        lastPublishedDeployment: true,\n        ...Object.fromEntries(populate.map((field) => [field, true]))\n      },\n      orderBy: (projects, { asc, desc }) => [\n        sort === 'desc' ? desc(projects[sortBy]) : asc(projects[sortBy])\n      ],\n      offset,\n      limit\n    })\n    setPublicCacheControl(c.res, env.isProd ? '1m' : '10s')\n\n    return c.json(parseZodSchema(z.array(schema.projectSelectSchema), projects))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/schemas.ts",
    "content": "// import { isValidNamespace } from '@agentic/platform-validators'\nimport { z } from '@hono/zod-openapi'\n\nimport {\n  paginationSchema,\n  projectIdentifierSchema,\n  projectIdSchema,\n  projectRelationsSchema\n} from '@/db'\n\nexport const projectIdParamsSchema = z.object({\n  projectId: projectIdSchema.openapi({\n    param: {\n      description: 'Project ID',\n      name: 'projectId',\n      in: 'path'\n    }\n  })\n})\n\n// export const namespaceParamsSchema = z.object({\n//   namespace: z\n//     .string()\n//     .refine((namespace) => isValidNamespace(namespace), {\n//       message: 'Invalid namespace'\n//     })\n//     .openapi({\n//       param: {\n//         description: 'Namespace',\n//         name: 'namespace',\n//         in: 'path'\n//       }\n//     })\n// })\n\nexport const projectIdentifierQuerySchema = z.object({\n  projectIdentifier: projectIdentifierSchema\n})\n\nexport const filterPublicProjectSchema = z.object({\n  tag: z.string().optional(),\n  notTag: z.string().optional()\n})\n\nexport const populateProjectSchema = z.object({\n  populate: z\n    .union([projectRelationsSchema, z.array(projectRelationsSchema)])\n    .default([])\n    .transform((p) => (Array.isArray(p) ? p : [p]))\n    .optional()\n})\n\nexport const projectIdentifierAndPopulateSchema = z.object({\n  ...populateProjectSchema.shape,\n  ...projectIdentifierQuerySchema.shape\n})\n\nexport const paginationAndPopulateProjectSchema = z.object({\n  ...paginationSchema.shape,\n  ...populateProjectSchema.shape\n})\n\nexport const listPublicProjectsQuerySchema = z.object({\n  ...paginationSchema.shape,\n  ...populateProjectSchema.shape,\n  ...filterPublicProjectSchema.shape\n})\n"
  },
  {
    "path": "apps/api/src/api-v1/projects/update-project.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { projectIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Updates a project.',\n  tags: ['projects'],\n  operationId: 'updateProject',\n  method: 'post',\n  path: 'projects/{projectId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: projectIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.projectUpdateSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'The updated project',\n      content: {\n        'application/json': {\n          schema: schema.projectSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1UpdateProject(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { projectId } = c.req.valid('param')\n    const body = c.req.valid('json')\n\n    // First ensure the project exists and the user has access to it\n    let project = await db.query.projects.findFirst({\n      where: eq(schema.projects.id, projectId)\n    })\n    assert(project, 404, `Project not found \"${projectId}\"`)\n    await acl(c, project, { label: 'Project' })\n\n    // Update the project\n    ;[project] = await db\n      .update(schema.projects)\n      .set(body)\n      .where(eq(schema.projects.id, projectId))\n      .returning()\n    assert(project, 500, `Failed to update project \"${projectId}\"`)\n\n    return c.json(parseZodSchema(schema.projectSelectSchema, project))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/storage/get-signed-storage-upload-url.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, projectIdentifierSchema, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\nimport {\n  getStorageObjectPublicUrl,\n  getStorageSignedUploadUrl\n} from '@/lib/storage'\n\nexport const getSignedUploadUrlQuerySchema = z.object({\n  projectIdentifier: projectIdentifierSchema,\n\n  /**\n   * Should be a hash of the contents of the file to upload with the correct\n   * file extension.\n   *\n   * @example `9f86d081884c7d659a2feaa0c55ad015a.png`\n   */\n  key: z\n    .string()\n    .nonempty()\n    .describe(\n      'Should be a hash of the contents of the file to upload with the correct file extension (eg, \"9f86d081884c7d659a2feaa0c55ad015a.png\").'\n    )\n})\n\nconst route = createRoute({\n  description:\n    \"Gets a signed URL for uploading a file to Agentic's blob storage. Files are namespaced to a given project and are identified by a key that should be a hash of the file's contents, with the correct file extension.\",\n  tags: ['storage'],\n  operationId: 'getSignedStorageUploadUrl',\n  method: 'get',\n  path: 'storage/signed-upload-url',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: getSignedUploadUrlQuerySchema\n  },\n  responses: {\n    200: {\n      description: 'A signed upload URL',\n      content: {\n        'application/json': {\n          schema: z.object({\n            signedUploadUrl: z\n              .string()\n              .url()\n              .describe('The signed upload URL.'),\n            publicObjectUrl: z\n              .string()\n              .url()\n              .describe('The public URL the object will have once uploaded.')\n          })\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetSignedStorageUploadUrl(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { projectIdentifier, key } = c.req.valid('query')\n\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.identifier, projectIdentifier)\n    })\n    assert(project, 404, `Project not found \"${projectIdentifier}\"`)\n    await acl(c, project, { label: 'Project' })\n\n    const compoundKey = `${project.identifier}/${key}`\n    const signedUploadUrl = await getStorageSignedUploadUrl(compoundKey)\n    const publicObjectUrl = getStorageObjectPublicUrl(compoundKey)\n\n    return c.json({ signedUploadUrl, publicObjectUrl })\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/create-team.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, schema } from '@/db'\nimport { ensureAuthUser } from '@/lib/ensure-auth-user'\nimport { ensureUniqueNamespace } from '@/lib/ensure-unique-namespace'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nconst route = createRoute({\n  description: 'Creates a new team.',\n  tags: ['teams'],\n  operationId: 'createTeam',\n  method: 'post',\n  path: 'teams',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.teamInsertSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'The created team',\n      content: {\n        'application/json': {\n          schema: schema.teamSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses\n  }\n})\n\nexport function registerV1CreateTeam(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const user = await ensureAuthUser(c)\n    const body = c.req.valid('json')\n\n    await ensureUniqueNamespace(body.slug, { label: 'Team slug' })\n\n    return db.transaction(async (tx) => {\n      const [team] = await tx\n        .insert(schema.teams)\n        .values({\n          ...body,\n          ownerId: user.id\n        })\n        .returning()\n      assert(team, 500, `Failed to create team \"${body.slug}\"`)\n\n      const [teamMember] = await tx\n        .insert(schema.teamMembers)\n        .values({\n          userId: user.id,\n          teamId: team.id,\n          teamSlug: team.slug,\n          role: 'admin',\n          confirmed: true\n        })\n        .returning()\n      assert(\n        teamMember,\n        500,\n        `Failed to create team member owner for team \"${body.slug}\"`\n      )\n\n      return c.json(parseZodSchema(schema.teamSelectSchema, team))\n    })\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/delete-team.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { aclTeamAdmin } from '@/lib/acl-team-admin'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { teamIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Deletes a team by ID.',\n  tags: ['teams'],\n  operationId: 'deleteTeam',\n  method: 'delete',\n  path: 'teams/{teamId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: teamIdParamsSchema\n  },\n  responses: {\n    200: {\n      description: 'The team that was deleted',\n      content: {\n        'application/json': {\n          schema: schema.teamSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1DeleteTeam(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { teamId } = c.req.valid('param')\n    await aclTeamAdmin(c, { teamId })\n\n    const [team] = await db\n      .delete(schema.teams)\n      .where(eq(schema.teams.id, teamId))\n      .returning()\n    assert(team, 404, `Team not found \"${teamId}\"`)\n\n    return c.json(parseZodSchema(schema.teamSelectSchema, team))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/get-team.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { aclTeamMember } from '@/lib/acl-team-member'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { teamIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Gets a team by ID.',\n  tags: ['teams'],\n  operationId: 'getTeam',\n  method: 'get',\n  path: 'teams/{teamId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: teamIdParamsSchema\n  },\n  responses: {\n    200: {\n      description: 'A team object',\n      content: {\n        'application/json': {\n          schema: schema.teamSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetTeam(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { teamId } = c.req.valid('param')\n    await aclTeamMember(c, { teamId })\n\n    const team = await db.query.teams.findFirst({\n      where: eq(schema.teams.id, teamId)\n    })\n    assert(team, 404, `Team not found \"${teamId}\"`)\n\n    return c.json(parseZodSchema(schema.teamSelectSchema, team))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/list-teams.ts",
    "content": "import { parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, paginationSchema, schema } from '@/db'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nconst route = createRoute({\n  description: 'Lists all teams the authenticated user belongs to.',\n  tags: ['teams'],\n  operationId: 'listTeams',\n  method: 'get',\n  path: 'teams',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    query: paginationSchema\n  },\n  responses: {\n    200: {\n      description: 'A list of teams',\n      content: {\n        'application/json': {\n          schema: z.array(schema.teamSelectSchema)\n        }\n      }\n    },\n    ...openapiErrorResponses\n  }\n})\n\nexport function registerV1ListTeams(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const {\n      offset = 0,\n      limit = 10,\n      sort = 'desc',\n      sortBy = 'createdAt'\n    } = c.req.valid('query')\n    const userId = c.get('userId')\n\n    // schema.teamMembers._.columns\n\n    const teamMembers = await db.query.teamMembers.findMany({\n      where: eq(schema.teamMembers.userId, userId),\n      with: {\n        team: true\n      },\n      orderBy: (teamMembers, { asc, desc }) => [\n        sort === 'desc' ? desc(teamMembers[sortBy]) : asc(teamMembers[sortBy])\n      ],\n      offset,\n      limit\n    })\n\n    return c.json(parseZodSchema(z.array(schema.teamSelectSchema), teamMembers))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/members/create-team-member.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { and, db, eq, schema } from '@/db'\nimport { aclTeamAdmin } from '@/lib/acl-team-admin'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponse409,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { teamIdParamsSchema } from '../schemas'\n\nconst route = createRoute({\n  description: 'Creates a new team member.',\n  tags: ['teams'],\n  operationId: 'createTeamMember',\n  method: 'post',\n  path: 'teams/{teamId}/members',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: teamIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.teamMemberInsertSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'The created team member',\n      content: {\n        'application/json': {\n          schema: schema.teamMemberSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404,\n    ...openapiErrorResponse409\n  }\n})\n\nexport function registerV1CreateTeamMember(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { teamId } = c.req.valid('param')\n    const body = c.req.valid('json')\n    await aclTeamAdmin(c, { teamId })\n\n    const team = await db.query.teams.findFirst({\n      where: eq(schema.teams.id, teamId)\n    })\n    assert(team, 404, `Team not found \"${teamId}\"`)\n\n    const existingTeamMember = await db.query.teamMembers.findFirst({\n      where: and(\n        eq(schema.teamMembers.teamId, teamId),\n        eq(schema.teamMembers.userId, body.userId)\n      )\n    })\n    assert(\n      existingTeamMember,\n      409,\n      `User \"${body.userId}\" is already a member of team \"${teamId}\"`\n    )\n\n    const [teamMember] = await db\n      .insert(schema.teamMembers)\n      .values({\n        ...body,\n        teamId,\n        teamSlug: team.slug\n      })\n      .returning()\n    assert(\n      teamMember,\n      500,\n      `Failed to create team member \"${body.userId}\"for team \"${teamId}\"`\n    )\n\n    // TODO: send team invite email\n\n    return c.json(parseZodSchema(schema.teamMemberSelectSchema, teamMember))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/members/delete-team-member.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { and, db, eq, schema } from '@/db'\nimport { aclTeamAdmin } from '@/lib/acl-team-admin'\nimport { aclTeamMember } from '@/lib/acl-team-member'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { teamIdTeamMemberUserIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Deletes a team member.',\n  tags: ['teams'],\n  operationId: 'deleteTeamMember',\n  method: 'delete',\n  path: 'teams/{teamId}/members/{userId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: teamIdTeamMemberUserIdParamsSchema\n  },\n  responses: {\n    200: {\n      description: 'The deleted team member',\n      content: {\n        'application/json': {\n          schema: schema.teamMemberSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1DeleteTeamMember(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { teamId, userId } = c.req.valid('param')\n\n    await aclTeamAdmin(c, { teamId })\n    await aclTeamMember(c, { teamId, userId })\n\n    const [teamMember] = await db\n      .delete(schema.teamMembers)\n      .where(\n        and(\n          eq(schema.teamMembers.teamId, teamId),\n          eq(schema.teamMembers.userId, userId)\n        )\n      )\n      .returning()\n    assert(\n      teamMember,\n      400,\n      `Failed to update team member \"${userId}\" for team \"${teamId}\"`\n    )\n\n    return c.json(parseZodSchema(schema.teamMemberSelectSchema, teamMember))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/members/schemas.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nimport { userIdSchema } from '@/db'\n\nimport { teamIdParamsSchema } from '../schemas'\n\nexport const teamIdTeamMemberUserIdParamsSchema = z.object({\n  ...teamIdParamsSchema.shape,\n\n  userId: userIdSchema.openapi({\n    param: {\n      description: 'Team member user ID',\n      name: 'userId',\n      in: 'path'\n    }\n  })\n})\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/members/update-team-member.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { and, db, eq, schema } from '@/db'\nimport { aclTeamAdmin } from '@/lib/acl-team-admin'\nimport { aclTeamMember } from '@/lib/acl-team-member'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { teamIdTeamMemberUserIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Updates a team member.',\n  tags: ['teams'],\n  operationId: 'updateTeamMember',\n  method: 'post',\n  path: 'teams/{teamId}/members/{userId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: teamIdTeamMemberUserIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.teamMemberUpdateSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'The updated team member',\n      content: {\n        'application/json': {\n          schema: schema.teamMemberSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1UpdateTeamMember(\n  app: OpenAPIHono<AuthenticatedHonoEnv>\n) {\n  return app.openapi(route, async (c) => {\n    const { teamId, userId } = c.req.valid('param')\n    const body = c.req.valid('json')\n\n    await aclTeamAdmin(c, { teamId })\n    await aclTeamMember(c, { teamId, userId })\n\n    const [teamMember] = await db\n      .update(schema.teamMembers)\n      .set(body)\n      .where(\n        and(\n          eq(schema.teamMembers.teamId, teamId),\n          eq(schema.teamMembers.userId, userId)\n        )\n      )\n      .returning()\n    assert(\n      teamMember,\n      400,\n      `Failed to update team member \"${userId}\" for team \"${teamId}\"`\n    )\n\n    return c.json(parseZodSchema(schema.teamMemberSelectSchema, teamMember))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/schemas.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nimport { teamIdSchema } from '@/db'\n\nexport const teamIdParamsSchema = z.object({\n  teamId: teamIdSchema.openapi({\n    param: {\n      description: 'Team ID',\n      name: 'teamId',\n      in: 'path'\n    }\n  })\n})\n"
  },
  {
    "path": "apps/api/src/api-v1/teams/update-team.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { aclTeamAdmin } from '@/lib/acl-team-admin'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { teamIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Updates a team.',\n  tags: ['teams'],\n  operationId: 'updateTeam',\n  method: 'post',\n  path: 'teams/{teamId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: teamIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.teamUpdateSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'The updated team',\n      content: {\n        'application/json': {\n          schema: schema.teamSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1UpdateTeam(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { teamId } = c.req.valid('param')\n    const body = c.req.valid('json')\n    await aclTeamAdmin(c, { teamId })\n\n    const [team] = await db\n      .update(schema.teams)\n      .set(body)\n      .where(eq(schema.teams.id, teamId))\n      .returning()\n    assert(team, 404, `Team not found \"${teamId}\"`)\n\n    return c.json(parseZodSchema(schema.teamSelectSchema, team))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/users/get-user.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { setPublicCacheControl } from '@/lib/cache-control'\nimport { env } from '@/lib/env'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { userIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Gets a user by ID.',\n  tags: ['users'],\n  operationId: 'getUser',\n  method: 'get',\n  path: 'users/{userId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: userIdParamsSchema\n  },\n  responses: {\n    200: {\n      description: 'A user object',\n      content: {\n        'application/json': {\n          schema: schema.userSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1GetUser(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { userId } = c.req.valid('param')\n    await acl(c, { userId }, { label: 'User' })\n\n    const user = await db.query.users.findFirst({\n      where: eq(schema.users.id, userId)\n    })\n    assert(user, 404, `User not found \"${userId}\"`)\n    setPublicCacheControl(c.res, env.isProd ? '30s' : '10s')\n\n    return c.json(parseZodSchema(schema.userSelectSchema, user))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/users/schemas.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nimport { userIdSchema } from '@/db'\n\nexport const userIdParamsSchema = z.object({\n  userId: userIdSchema.openapi({\n    param: {\n      description: 'User ID',\n      name: 'userId',\n      in: 'path'\n    }\n  })\n})\n"
  },
  {
    "path": "apps/api/src/api-v1/users/update-user.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport { createRoute, type OpenAPIHono } from '@hono/zod-openapi'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { db, eq, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport {\n  openapiAuthenticatedSecuritySchemas,\n  openapiErrorResponse404,\n  openapiErrorResponses\n} from '@/lib/openapi-utils'\n\nimport { userIdParamsSchema } from './schemas'\n\nconst route = createRoute({\n  description: 'Updates a user by ID.',\n  tags: ['users'],\n  operationId: 'updateUser',\n  method: 'post',\n  path: 'users/{userId}',\n  security: openapiAuthenticatedSecuritySchemas,\n  request: {\n    params: userIdParamsSchema,\n    body: {\n      required: true,\n      content: {\n        'application/json': {\n          schema: schema.userUpdateSchema\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'A user object',\n      content: {\n        'application/json': {\n          schema: schema.userSelectSchema\n        }\n      }\n    },\n    ...openapiErrorResponses,\n    ...openapiErrorResponse404\n  }\n})\n\nexport function registerV1UpdateUser(app: OpenAPIHono<AuthenticatedHonoEnv>) {\n  return app.openapi(route, async (c) => {\n    const { userId } = c.req.valid('param')\n    await acl(c, { userId }, { label: 'User' })\n    const body = c.req.valid('json')\n\n    const [user] = await db\n      .update(schema.users)\n      .set(body)\n      .where(eq(schema.users.id, userId))\n      .returning()\n    assert(user, 404, `User not found \"${userId}\"`)\n\n    return c.json(parseZodSchema(schema.userSelectSchema, user))\n  })\n}\n"
  },
  {
    "path": "apps/api/src/api-v1/webhooks/stripe-webhook.ts",
    "content": "import type Stripe from 'stripe'\nimport { assert, HttpError } from '@agentic/platform-core'\n\nimport type { HonoApp } from '@/lib/types'\nimport {\n  and,\n  db,\n  eq,\n  getStripePriceIdForPricingPlanLineItem,\n  type RawConsumer,\n  type RawDeployment,\n  type RawProject,\n  schema\n} from '@/db'\nimport { setConsumerStripeSubscriptionStatus } from '@/lib/consumers/utils'\nimport { env } from '@/lib/env'\nimport { stripe } from '@/lib/external/stripe'\n\nconst relevantStripeEvents = new Set<Stripe.Event.Type>([\n  // Stripe Checkout Sessions\n  'checkout.session.completed',\n\n  // TODO: Handle these events\n  // 'checkout.session.expired',\n  // 'checkout.session.async_payment_failed',\n  // 'checkout.session.async_payment_succeeded',\n\n  // Stripe Subscriptions\n  'customer.subscription.created',\n\n  // TODO: Test these events which should be able to all use the same code path\n  'customer.subscription.updated',\n  'customer.subscription.paused',\n  'customer.subscription.resumed',\n  'customer.subscription.deleted'\n\n  // TODO: Handle these events\n  // 'customer.subscription.pending_update_applied',\n  // 'customer.subscription.pending_update_expired',\n  // 'customer.subscription.trial_will_end'\n])\n\nexport function registerV1StripeWebhook(app: HonoApp) {\n  return app.post('webhooks/stripe', async (ctx) => {\n    const logger = ctx.get('logger')\n    const body = await ctx.req.text()\n    const signature = ctx.req.header('Stripe-Signature')\n    assert(\n      signature,\n      400,\n      'error invalid stripe webhook event: missing signature'\n    )\n\n    let event: Stripe.Event\n\n    try {\n      event = stripe.webhooks.constructEvent(\n        body,\n        signature,\n        env.STRIPE_WEBHOOK_SECRET\n      )\n    } catch (err) {\n      throw new HttpError({\n        message: 'error invalid stripe webhook event: signature mismatch',\n        cause: err,\n        statusCode: 400\n      })\n    }\n\n    // Shouldn't ever happen because the signatures _should_ be different, but\n    // it's a useful sanity check just in case.\n    assert(\n      event.livemode === env.isStripeLive,\n      400,\n      'error invalid stripe webhook event: livemode mismatch'\n    )\n\n    if (!relevantStripeEvents.has(event.type)) {\n      return ctx.json({ status: 'ok' })\n    }\n\n    logger.info('stripe webhook', event.type, event.data?.object)\n\n    try {\n      switch (event.type) {\n        case 'checkout.session.completed': {\n          const checkoutSession = event.data.object\n          const { subscription: subscriptionOrId } = checkoutSession\n          assert(subscriptionOrId, 400, 'missing subscription')\n          const { consumerId, plan, userId, projectId, deploymentId } =\n            checkoutSession.metadata ?? {}\n          assert(consumerId, 400, 'missing metadata.consumerId')\n          assert(plan !== undefined, 400, 'missing metadata.plan')\n\n          const subscriptionId =\n            typeof subscriptionOrId === 'string'\n              ? subscriptionOrId\n              : subscriptionOrId.id\n\n          const [subscription, consumer, deployment] = await Promise.all([\n            // Make sure we have the full subscription instead of just the id\n            typeof subscriptionOrId === 'string'\n              ? stripe.subscriptions.retrieve(subscriptionId)\n              : subscriptionOrId,\n\n            db.query.consumers.findFirst({\n              where: and(eq(schema.consumers.id, consumerId)),\n              with: { project: true }\n            }),\n\n            deploymentId\n              ? db.query.deployments.findFirst({\n                  where: and(eq(schema.deployments.id, deploymentId))\n                })\n              : undefined\n          ])\n          assert(\n            subscription,\n            404,\n            `stripe subscription \"${subscriptionId}\" not found`\n          )\n          assert(consumer, 404, `consumer \"${consumerId}\" not found`)\n          if (deploymentId) {\n            assert(deployment, 404, `deployment \"${deploymentId}\" not found`)\n          }\n          const { project } = consumer\n          assert(project, 404, `project \"${projectId}\" not found`)\n\n          // TODO: Treat this as a transaction...\n          await Promise.all([\n            // Ensure the underlying Stripe Subscription has all the necessary\n            // metadata\n            stripe.subscriptions.update(subscription.id, {\n              metadata: {\n                ...subscription.metadata,\n                ...checkoutSession.metadata\n              }\n            }),\n\n            // Sync our Consumer's state with the Stripe Subscription's state\n            syncConsumerWithStripeSubscription({\n              consumer,\n              deployment,\n              project,\n              subscription,\n              plan,\n              userId,\n              projectId,\n              deploymentId\n            })\n          ])\n          break\n        }\n\n        case 'customer.subscription.created': {\n          // Stripe Checkout-created subscriptions won't have the metadata\n          // necessary to identify the consumer, so ignore this event for now.\n          const subscription = event.data.object\n          const { consumerId, userId, projectId, deploymentId, plan } =\n            subscription.metadata\n\n          // TODO: This should be coming from Stripe Checkout, and a subsequent\n          // webhook event should record the subscription and initialize the\n          // consumer, but it feels wrong to me to just be logging and ignore\n          // this event. In the future, if we support both Stripe Checkout and\n          // non-Stripe Checkout-based subscription flows, then this codepath\n          // should act very similarly to `customer.subscription.updated`.\n          if (\n            !consumerId ||\n            !userId ||\n            !projectId ||\n            !deploymentId ||\n            plan === undefined\n          ) {\n            break\n          }\n\n          // Intentional fallthrough\n        }\n\n        case 'customer.subscription.paused':\n        case 'customer.subscription.resumed':\n        case 'customer.subscription.deleted':\n        case 'customer.subscription.updated': {\n          // https://docs.stripe.com/billing/subscriptions/overview#subscription-statuses\n          const subscription = event.data.object\n          const { consumerId, userId, projectId, deploymentId, plan } =\n            subscription.metadata\n          assert(consumerId, 'missing metadata.consumerId')\n          assert(plan !== undefined, 400, 'missing metadata.plan')\n\n          logger.info('stripe webhook', event.type, {\n            consumerId,\n            userId,\n            projectId,\n            deploymentId,\n            plan,\n            status: subscription.status\n          })\n\n          const [consumer, deployment] = await Promise.all([\n            db.query.consumers.findFirst({\n              where: eq(schema.consumers.id, consumerId),\n              with: { project: true }\n            }),\n\n            deploymentId\n              ? db.query.deployments.findFirst({\n                  where: and(eq(schema.deployments.id, deploymentId))\n                })\n              : undefined\n          ])\n          assert(consumer, 404, `consumer \"${consumerId}\" not found`)\n          if (deploymentId) {\n            assert(deployment, 404, `deployment \"${deploymentId}\" not found`)\n          }\n          const { project } = consumer\n\n          // Sync our Consumer's state with the Stripe Subscription's state\n          await syncConsumerWithStripeSubscription({\n            consumer,\n            deployment,\n            project,\n            subscription,\n            plan,\n            userId,\n            projectId,\n            deploymentId\n          })\n          break\n        }\n\n        default:\n          logger.warn(\n            `unexpected unhandled event \"${event.id}\" type \"${event.type}\"`,\n            event.data?.object\n          )\n      }\n    } catch (err: any) {\n      throw new HttpError({\n        message: `error processing stripe webhook event \"${event.id}\" type \"${event.type}\": ${err.message}`,\n        cause: err.cause ?? err,\n        statusCode: err.statusCode ?? err\n      })\n    }\n\n    return ctx.json({ status: 'ok' })\n  })\n}\n\n/**\n * Sync our database Consumer's state with the Stripe Subscription's state.\n *\n * For anything billing-related, Stripe's resources is always considered the\n * single source of truth. Our database's `Consumer` state should always be\n * derived from the corresponding Stripe subscription.\n */\nexport async function syncConsumerWithStripeSubscription({\n  consumer,\n  project,\n  deployment,\n  subscription,\n  plan,\n  userId,\n  projectId,\n  deploymentId\n}: {\n  consumer: RawConsumer\n  project: RawProject\n  deployment?: RawDeployment\n  subscription: Stripe.Subscription\n  plan: string | null | undefined\n  userId?: string\n  projectId?: string\n  deploymentId?: string\n}): Promise<RawConsumer> {\n  // These extra checks aren't really necessary, but they're nice sanity checks\n  // to ensure metadata consistency with our consumer\n  assert(\n    consumer.userId === userId,\n    400,\n    `consumer \"${consumer.id}\" user \"${consumer.userId}\" does not match stripe checkout metadata user \"${userId}\"`\n  )\n  assert(\n    consumer.projectId === projectId,\n    400,\n    `consumer \"${consumer.id}\" project \"${consumer.projectId}\" does not match stripe checkout metadata project \"${projectId}\"`\n  )\n\n  consumer._stripeSubscriptionId = subscription.id\n  consumer.stripeStatus = subscription.status\n  consumer.plan = plan as any // TODO: types\n  setConsumerStripeSubscriptionStatus(consumer)\n\n  if (deploymentId) {\n    consumer.deploymentId = deploymentId\n  }\n\n  const pricingPlan = plan\n    ? deployment?.pricingPlans.find((p) => p.slug === plan)\n    : undefined\n\n  if (pricingPlan) {\n    for (const lineItem of pricingPlan.lineItems) {\n      const stripeSubscriptionItemId =\n        consumer._stripeSubscriptionItemIdMap[lineItem.slug]\n\n      const stripePriceId: string | undefined = stripeSubscriptionItemId\n        ? undefined\n        : await getStripePriceIdForPricingPlanLineItem({\n            pricingPlan,\n            pricingPlanLineItem: lineItem,\n            project\n          })\n\n      const stripeSubscriptionItem: Stripe.SubscriptionItem | undefined =\n        subscription.items.data.find((item) =>\n          stripeSubscriptionItemId\n            ? item.id === stripeSubscriptionItemId\n            : item.price.id === stripePriceId\n        )\n\n      assert(\n        stripeSubscriptionItem,\n        500,\n        `Error post-processing stripe subscription \"${subscription.id}\" for line-item \"${lineItem.slug}\" on plan \"${pricingPlan.slug}\"`\n      )\n\n      consumer._stripeSubscriptionItemIdMap[lineItem.slug] =\n        stripeSubscriptionItem.id\n      assert(\n        consumer._stripeSubscriptionItemIdMap[lineItem.slug],\n        500,\n        `Error post-processing stripe subscription \"${subscription.id}\" for line-item \"${lineItem.slug}\" on plan \"${pricingPlan.slug}\"`\n      )\n    }\n  }\n\n  const [updatedConsumer] = await db\n    .update(schema.consumers)\n    .set(consumer)\n    .where(eq(schema.consumers.id, consumer.id))\n    .returning()\n  assert(updatedConsumer, 500, `consumer \"${consumer.id}\" not found`)\n\n  // TODO: invoke provider webhooks\n  // event.data.customer = consumer.getPublicDocument()\n  // await invokeWebhooks(consumer.project, event)\n\n  return updatedConsumer\n}\n"
  },
  {
    "path": "apps/api/src/db/index.ts",
    "content": "import { drizzle } from '@fisch0920/drizzle-orm/postgres-js'\nimport postgres from 'postgres'\n\nimport { env } from '@/lib/env'\n\nimport * as schema from './schema'\n\ntype PostgresClient = ReturnType<typeof postgres>\n\nlet _postgresClient: PostgresClient | undefined\nconst postgresClient =\n  _postgresClient ?? (_postgresClient = postgres(env.DATABASE_URL))\n\nexport const db = drizzle({ client: postgresClient, schema })\n\nexport * as schema from './schema'\nexport {\n  createIdForModel,\n  idMaxLength,\n  idPrefixMap,\n  type ModelType\n} from './schema/common'\nexport * from './schemas'\nexport type * from './types'\nexport * from './utils'\nexport {\n  and,\n  arrayContained,\n  arrayContains,\n  arrayOverlaps,\n  asc,\n  between,\n  desc,\n  eq,\n  exists,\n  gt,\n  gte,\n  ilike,\n  inArray,\n  isNotNull,\n  isNull,\n  like,\n  lt,\n  lte,\n  ne,\n  not,\n  notBetween,\n  notExists,\n  notIlike,\n  notInArray,\n  notLike,\n  or\n} from '@fisch0920/drizzle-orm'\n"
  },
  {
    "path": "apps/api/src/db/schema/account.ts",
    "content": "import { relations } from '@fisch0920/drizzle-orm'\nimport { index, pgTable, text, timestamp } from '@fisch0920/drizzle-orm/pg-core'\n\nimport { userIdSchema } from '../schemas'\nimport {\n  accountPrimaryId,\n  authProviderTypeEnum,\n  createSelectSchema,\n  timestamps,\n  userId\n} from './common'\nimport { users } from './user'\n\nexport const accounts = pgTable(\n  'accounts',\n  {\n    ...accountPrimaryId,\n    ...timestamps,\n\n    userId: userId()\n      .notNull()\n      .references(() => users.id, { onDelete: 'cascade' }),\n    provider: authProviderTypeEnum().notNull(),\n\n    /** Provider-specific account ID (or email in the case of `password` provider) */\n    accountId: text().notNull(),\n\n    password: text(),\n\n    /** Provider-specific username */\n    accountUsername: text(),\n\n    /** Standard OAuth2 access token */\n    accessToken: text(),\n\n    /** Standard OAuth2 refresh token */\n    refreshToken: text(),\n\n    /** Standard OAuth2 access token expires at */\n    accessTokenExpiresAt: timestamp(),\n\n    /** Standard OAuth2 refresh token expires at */\n    refreshTokenExpiresAt: timestamp(),\n\n    /** OAuth scope(s) */\n    scope: text()\n  },\n  (table) => [\n    index('account_provider_idx').on(table.provider),\n    index('account_userId_idx').on(table.userId),\n    index('account_createdAt_idx').on(table.createdAt),\n    index('account_updatedAt_idx').on(table.updatedAt),\n    index('account_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const accountsRelations = relations(accounts, ({ one }) => ({\n  user: one(users, {\n    fields: [accounts.userId],\n    references: [users.id]\n  })\n}))\n\nexport const accountSelectSchema = createSelectSchema(accounts, {\n  userId: userIdSchema\n})\n  .omit({\n    password: true,\n    accessToken: true,\n    refreshToken: true,\n    accessTokenExpiresAt: true,\n    refreshTokenExpiresAt: true\n  })\n  .strip()\n  .openapi('Account')\n"
  },
  {
    "path": "apps/api/src/db/schema/auth-data.ts",
    "content": "import { jsonb, pgTable, text, timestamp } from '@fisch0920/drizzle-orm/pg-core'\n\nimport { timestamps } from './common'\n\n// Simple key-value store of JSON data for OpenAuth-related state.\n// TODO: remove this and/or replace this with non-openauth version\nexport const authData = pgTable('auth_data', {\n  // Example ID keys:\n  // \"oauth:refresh\\u001fuser:f99d3004946f9abb\\u001f2cae301e-3fdc-40c4-8cda-83b25a616d06\"\n  // \"signing:key\\u001ff001a516-838d-4c88-aa9e-719d8fc9d5a3\"\n  // \"email\\u001ft@t.com\\u001fpassword\"\n  // \"encryption:key\\u001f14d3c324-f9c7-4867-81a9-b0b77b0db0be\"\n  id: text().primaryKey(),\n  ...timestamps,\n\n  value: jsonb().$type<Record<string, any>>().notNull(),\n  expiry: timestamp()\n})\n"
  },
  {
    "path": "apps/api/src/db/schema/common.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { getIdSchemaForModelType } from '../schemas'\nimport {\n  createIdForModel,\n  idMaxLength,\n  idPrefixMap,\n  type ModelType\n} from './common'\n\nfor (const modelType of Object.keys(idPrefixMap)) {\n  test(`${modelType} id`, () => {\n    for (let i = 0; i < 100; ++i) {\n      const id = createIdForModel(modelType as ModelType)\n      expect(id.startsWith(idPrefixMap[modelType as ModelType])).toBe(true)\n      expect(id.length).toBeLessThanOrEqual(idMaxLength)\n      expect(getIdSchemaForModelType(modelType as ModelType).parse(id)).toBe(id)\n    }\n  })\n}\n"
  },
  {
    "path": "apps/api/src/db/schema/common.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport { type Equal, sql, type Writable } from '@fisch0920/drizzle-orm'\nimport {\n  pgEnum,\n  type PgTimestampBuilderInitial,\n  type PgTimestampConfig,\n  type PgTimestampStringBuilderInitial,\n  type PgVarcharBuilderInitial,\n  type PgVarcharConfig,\n  timestamp as timestampImpl,\n  varchar\n} from '@fisch0920/drizzle-orm/pg-core'\nimport { createSchemaFactory } from '@fisch0920/drizzle-zod'\nimport { z } from '@hono/zod-openapi'\nimport { createId as createCuid2 } from '@paralleldrive/cuid2'\n\nexport const namespaceMaxLength = 256 as const\nexport const projectSlugMaxLength = 256 as const\nexport const projectNameMaxLength = 1024 as const\n\n// prefix is max 5 characters\n// separator is 1 character\n// cuid2 is max 24 characters\n// so use 32 characters to be safe for storing ids\nexport const idMaxLength = 32 as const\n\nexport const idPrefixMap = {\n  team: 'team',\n  project: 'proj',\n  deployment: 'depl',\n  consumer: 'csmr',\n  logEntry: 'log',\n\n  // auth\n  user: 'user',\n  account: 'acct'\n} as const\n\nexport type ModelType = keyof typeof idPrefixMap\n\nexport function createIdForModel(modelType: ModelType): string {\n  const prefix = idPrefixMap[modelType]\n  assert(prefix, 500, `Invalid model type: ${modelType}`)\n\n  return `${prefix}_${createCuid2()}`\n}\n\n/**\n * Returns the primary `id` key to use for a given model type.\n */\nfunction getPrimaryId(modelType: ModelType) {\n  return {\n    id: id()\n      .primaryKey()\n      .$defaultFn(() => createIdForModel(modelType))\n  }\n}\n\nexport const projectPrimaryId = getPrimaryId('project')\nexport const deploymentPrimaryId = getPrimaryId('deployment')\nexport const consumerPrimaryId = getPrimaryId('consumer')\nexport const logEntryPrimaryId = getPrimaryId('logEntry')\nexport const teamPrimaryId = getPrimaryId('team')\nexport const userPrimaryId = getPrimaryId('user')\nexport const accountPrimaryId = getPrimaryId('account')\n\n/**\n * All of our model primary ids have the following format:\n *\n * `${modelPrefix}_${cuid2}`\n */\nexport function id<U extends string, T extends Readonly<[U, ...U[]]>>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, typeof idMaxLength> {\n  return varchar({ length: idMaxLength, ...config })\n}\n\nexport const projectId = id\nexport const deploymentId = id\nexport const consumerId = id\nexport const logEntryId = id\nexport const teamId = id\nexport const userId = id\n\nexport function stripeId<U extends string, T extends Readonly<[U, ...U[]]>>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, 255> {\n  return varchar({ length: 255, ...config })\n}\n\n/**\n * `namespace/project-slug`\n */\nexport function projectIdentifier<\n  U extends string,\n  T extends Readonly<[U, ...U[]]>\n>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, 514> {\n  return varchar({ length: 514, ...config })\n}\n\n/**\n * `namespace/project-slug@hash`\n */\nexport function deploymentIdentifier<\n  U extends string,\n  T extends Readonly<[U, ...U[]]>\n>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, 530> {\n  return varchar({ length: 530, ...config })\n}\n\nexport function username<U extends string, T extends Readonly<[U, ...U[]]>>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, typeof namespaceMaxLength> {\n  return varchar({ length: namespaceMaxLength, ...config })\n}\n\nexport function teamSlug<U extends string, T extends Readonly<[U, ...U[]]>>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, typeof namespaceMaxLength> {\n  return varchar({ length: namespaceMaxLength, ...config })\n}\n\nexport function projectNamespace<\n  U extends string,\n  T extends Readonly<[U, ...U[]]>\n>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, typeof namespaceMaxLength> {\n  return varchar({ length: namespaceMaxLength, ...config })\n}\n\nexport function projectSlug<U extends string, T extends Readonly<[U, ...U[]]>>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, typeof projectSlugMaxLength> {\n  return varchar({ length: projectSlugMaxLength, ...config })\n}\n\nexport function projectName<U extends string, T extends Readonly<[U, ...U[]]>>(\n  config?: PgVarcharConfig<T | Writable<T>, never>\n): PgVarcharBuilderInitial<'', Writable<T>, typeof projectNameMaxLength> {\n  return varchar({ length: projectNameMaxLength, ...config })\n}\n\n/**\n * Timestamp with mode `string`\n */\nexport function timestamp<\n  TMode extends PgTimestampConfig['mode'] & {} = 'string'\n>(\n  config?: PgTimestampConfig<TMode>\n): Equal<TMode, 'string'> extends true\n  ? PgTimestampStringBuilderInitial<''>\n  : PgTimestampBuilderInitial<''> {\n  return timestampImpl<TMode>({\n    mode: 'string' as unknown as TMode,\n    withTimezone: true,\n    ...config\n  })\n}\n\nexport const timestamps = {\n  createdAt: timestamp().notNull().defaultNow(),\n  updatedAt: timestamp()\n    .notNull()\n    .default(sql`now()`),\n  deletedAt: timestamp()\n}\n\nexport const userRoleEnum = pgEnum('UserRole', ['user', 'admin'])\nexport const teamMemberRoleEnum = pgEnum('TeamMemberRole', ['user', 'admin'])\nexport const logEntryTypeEnum = pgEnum('LogEntryType', ['log'])\nexport const logEntryLevelEnum = pgEnum('LogEntryLevel', [\n  'trace',\n  'debug',\n  'info',\n  'warn',\n  'error'\n])\nexport const pricingIntervalEnum = pgEnum('PricingInterval', [\n  'day',\n  'week',\n  'month',\n  'year'\n])\nexport const pricingCurrencyEnum = pgEnum('PricingCurrency', ['usd'])\nexport const authProviderTypeEnum = pgEnum('AuthProviderType', [\n  'github',\n  'password'\n])\n\nexport const { createInsertSchema, createSelectSchema, createUpdateSchema } =\n  createSchemaFactory({\n    zodInstance: z,\n    coerce: {\n      // Coerce dates / strings to timetamps\n      date: true\n    }\n  })\n"
  },
  {
    "path": "apps/api/src/db/schema/consumer.ts",
    "content": "import {\n  type StripeSubscriptionItemIdMap,\n  stripeSubscriptionItemIdMapSchema\n} from '@agentic/platform-types'\nimport { relations } from '@fisch0920/drizzle-orm'\nimport {\n  boolean,\n  index,\n  jsonb,\n  pgTable,\n  text\n} from '@fisch0920/drizzle-orm/pg-core'\nimport { z } from '@hono/zod-openapi'\n\nimport { env } from '@/lib/env'\n\nimport {\n  consumerIdSchema,\n  deploymentIdSchema,\n  projectIdSchema,\n  userIdSchema\n} from '../schemas'\nimport {\n  consumerPrimaryId,\n  createInsertSchema,\n  createSelectSchema,\n  createUpdateSchema,\n  deploymentId,\n  projectId,\n  stripeId,\n  timestamps,\n  userId\n} from './common'\nimport { deployments, deploymentSelectSchema } from './deployment'\nimport { projects, projectSelectSchema } from './project'\nimport { users, userSelectSchema } from './user'\n\n// TODO: Consumers should be valid for any enabled project like in RapidAPI and GCP.\n// This may require a separate model to aggregate User Applications.\n// https://docs.rapidapi.com/docs/keys#section-different-api-keys-per-application\n\n/**\n * A `Consumer` represents a user who has subscribed to a `Project` and is used\n * to track usage and billing.\n *\n * Consumers are linked to a corresponding Stripe Customer and Subscription.\n * The Stripe customer will either be the user's default Stripe Customer if the\n * project uses the default Agentic platform account, or a customer on the project\n * owner's connected Stripe account if the project has Stripe Connect enabled.\n */\nexport const consumers = pgTable(\n  'consumers',\n  {\n    ...consumerPrimaryId,\n    ...timestamps,\n\n    // API key for this consumer\n    // (called \"token\" for backwards compatibility)\n    token: text().notNull(),\n\n    // The slug of the PricingPlan in the target deployment that this consumer\n    // is subscribed to.\n    plan: text(),\n\n    // Whether the consumer has made at least one successful API call after\n    // initializing their subscription.\n    activated: boolean().default(false).notNull(),\n\n    // TODO: Re-add coupon support\n    // coupon: text(),\n\n    // only used during initial creation\n    source: text(),\n\n    userId: userId()\n      .notNull()\n      .references(() => users.id),\n\n    // The project this user is subscribed to\n    projectId: projectId()\n      .notNull()\n      .references(() => projects.id, {\n        onDelete: 'cascade'\n      }),\n\n    // The specific deployment this user is subscribed to, since pricing can\n    // change across deployment versions)\n    deploymentId: deploymentId()\n      .notNull()\n      .references(() => deployments.id, {\n        onDelete: 'cascade'\n      }),\n\n    // Stripe subscription status (synced via webhooks). Should move from\n    // `incomplete` to `active` after the first successful payment.\n    stripeStatus: text().default('incomplete').notNull(),\n\n    // Whether the consumer's subscription is currently active, depending on\n    // `stripeStatus`.\n    isStripeSubscriptionActive: boolean().default(true).notNull(),\n\n    // Main Stripe Subscription id\n    _stripeSubscriptionId: stripeId(),\n\n    // [pricingPlanLineItemSlug: string]: string\n    _stripeSubscriptionItemIdMap: jsonb()\n      .$type<StripeSubscriptionItemIdMap>()\n      .default({})\n      .notNull(),\n\n    // Denormalized from User or possibly separate for stripe connect\n    // TODO: is this necessary?\n    _stripeCustomerId: stripeId().notNull()\n  },\n  (table) => [\n    index('consumer_token_idx').on(table.token),\n    index('consumer_userId_idx').on(table.userId),\n    index('consumer_projectId_idx').on(table.projectId),\n    index('consumer_deploymentId_idx').on(table.deploymentId),\n    index('consumer_isStripeSubscriptionActive_idx').on(\n      table.isStripeSubscriptionActive\n    ),\n    index('consumer_createdAt_idx').on(table.createdAt),\n    index('consumer_updatedAt_idx').on(table.updatedAt),\n    index('consumer_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const consumersRelations = relations(consumers, ({ one }) => ({\n  user: one(users, {\n    fields: [consumers.userId],\n    references: [users.id]\n  }),\n  project: one(projects, {\n    fields: [consumers.projectId],\n    references: [projects.id]\n  }),\n  deployment: one(deployments, {\n    fields: [consumers.deploymentId],\n    references: [deployments.id]\n  })\n}))\n\nexport const consumerSelectBaseSchema = createSelectSchema(consumers, {\n  id: consumerIdSchema,\n  userId: userIdSchema,\n  projectId: projectIdSchema,\n  deploymentId: deploymentIdSchema,\n\n  _stripeSubscriptionItemIdMap: stripeSubscriptionItemIdMapSchema\n})\n  .omit({\n    _stripeSubscriptionId: true,\n    _stripeSubscriptionItemIdMap: true,\n    _stripeCustomerId: true\n  })\n  .extend({\n    user: z\n      .lazy(() => userSelectSchema)\n      .optional()\n      .openapi('User', { type: 'object' }),\n\n    project: z\n      .lazy(() => projectSelectSchema)\n      .optional()\n      .openapi('Project', { type: 'object' }),\n\n    // deployment: z\n    //   .lazy(() => deploymentSelectSchema)\n    //   .optional()\n    //   .openapi('Deployment', { type: 'object' })\n\n    // TODO: Improve the self-referential typing here that `@hono/zod-openapi`\n    // trips up on.\n    deployment: z\n      .any()\n      .refine(\n        (deployment): boolean =>\n          !deployment || deploymentSelectSchema.safeParse(deployment).success,\n        {\n          message: 'Invalid lastDeployment'\n        }\n      )\n      .transform((deployment): any => {\n        if (!deployment) return undefined\n        return deploymentSelectSchema.parse(deployment)\n      })\n      .optional()\n  })\n\n// These are all derived virtual URLs that are not stored in the database\nexport const derivedConsumerFields = {\n  /**\n   * A private admin URL for managing the customer's subscription. This URL\n   * is only accessible by the customer.\n   *\n   * @example https://agentic.so/app/consumers/cons_123\n   */\n  adminUrl: z\n    .string()\n    .url()\n    .describe(\n      \"A private admin URL for managing the customer's subscription. This URL is only accessible by the customer.\"\n    )\n} as const\n\nexport const consumerSelectSchema = consumerSelectBaseSchema\n  .transform((consumer) => ({\n    ...consumer,\n    adminUrl: `${env.AGENTIC_WEB_BASE_URL}/app/consumers/${consumer.id}`\n  }))\n  .pipe(consumerSelectBaseSchema.extend(derivedConsumerFields).strip())\n  .describe(\n    `A Consumer represents a user who has subscribed to a Project and is used\nto track usage and billing.\n\nConsumers are linked to a corresponding Stripe Customer and Subscription.\nThe Stripe customer will either be the user's default Stripe Customer if the\nproject uses the default Agentic platform account, or a customer on the project\nowner's connected Stripe account if the project has Stripe Connect enabled.`\n  )\n  .openapi('Consumer')\n\nexport const consumerAdminSelectSchema = consumerSelectBaseSchema\n  .extend({\n    _stripeCustomerId: z.string().nonempty()\n  })\n  .transform((consumer) => ({\n    ...consumer,\n    adminUrl: `${env.AGENTIC_WEB_BASE_URL}/app/consumers/${consumer.id}`\n  }))\n  .openapi('AdminConsumer')\n\nexport const consumerInsertSchema = createInsertSchema(consumers, {\n  deploymentId: deploymentIdSchema.optional(),\n\n  plan: z.string().nonempty()\n})\n  .pick({\n    plan: true,\n    source: true,\n    deploymentId: true\n  })\n  .strict()\n\nexport const consumerUpdateSchema = createUpdateSchema(consumers, {\n  deploymentId: deploymentIdSchema.optional()\n})\n  .pick({\n    plan: true,\n    deploymentId: true\n  })\n  .strict()\n"
  },
  {
    "path": "apps/api/src/db/schema/deployment.ts",
    "content": "import {\n  agenticProjectConfigSchema,\n  defaultRequestsRateLimit,\n  type OriginAdapter,\n  type PricingPlanList,\n  type RateLimit,\n  resolvedAgenticProjectConfigSchema,\n  type Tool,\n  type ToolConfig\n} from '@agentic/platform-types'\nimport {\n  isValidDeploymentHash,\n  parseDeploymentIdentifier\n} from '@agentic/platform-validators'\nimport { relations } from '@fisch0920/drizzle-orm'\nimport {\n  boolean,\n  index,\n  jsonb,\n  pgTable,\n  text,\n  uniqueIndex\n} from '@fisch0920/drizzle-orm/pg-core'\nimport { z } from '@hono/zod-openapi'\n\nimport { env } from '@/lib/env'\n\nimport {\n  deploymentIdentifierSchema,\n  deploymentIdSchema,\n  projectIdSchema,\n  teamIdSchema,\n  userIdSchema\n} from '../schemas'\nimport {\n  createSelectSchema,\n  createUpdateSchema,\n  deploymentIdentifier,\n  deploymentPrimaryId,\n  pricingIntervalEnum,\n  projectId,\n  projectName,\n  teamId,\n  timestamps,\n  userId\n} from './common'\nimport { projects, projectSelectSchema } from './project'\nimport { teams } from './team'\nimport { users } from './user'\n\n/**\n * A Deployment is a single, immutable instance of a Project. Each deployment\n * contains pricing plans, origin server config (OpenAPI or MCP server), tool\n * definitions, and metadata.\n *\n * Deployments are private to a developer or team until they are published, at\n * which point they are accessible to any customers with access to the parent\n * Project.\n */\nexport const deployments = pgTable(\n  'deployments',\n  {\n    ...deploymentPrimaryId,\n    ...timestamps,\n\n    identifier: deploymentIdentifier().unique().notNull(),\n    hash: text().notNull(),\n    version: text(),\n\n    published: boolean().default(false).notNull(),\n\n    // display name\n    name: projectName().notNull(),\n\n    description: text().default('').notNull(),\n    readme: text(), // URL to uploaded markdown document\n    iconUrl: text(),\n    sourceUrl: text(),\n    homepageUrl: text(),\n\n    userId: userId()\n      .notNull()\n      .references(() => users.id),\n    teamId: teamId().references(() => teams.id),\n    projectId: projectId()\n      .notNull()\n      .references(() => projects.id, {\n        onDelete: 'cascade'\n      }),\n\n    // Tool definitions exposed by the origin server\n    tools: jsonb().$type<Tool[]>().notNull(),\n\n    // Tool configs customize the behavior of tools for different pricing plans\n    toolConfigs: jsonb().$type<ToolConfig[]>().default([]).notNull(),\n\n    // Origin API adapter config (url, openapi/mcp/raw, internal/external hosting, etc)\n    origin: jsonb().$type<OriginAdapter>().notNull(),\n\n    // Array<PricingPlan>\n    pricingPlans: jsonb().$type<PricingPlanList>().notNull(),\n\n    // Which pricing intervals are supported for subscriptions to this project\n    pricingIntervals: pricingIntervalEnum()\n      .array()\n      .default(['month'])\n      .notNull(),\n\n    // Default rate limit across all pricing plans\n    defaultRateLimit: jsonb()\n      .$type<RateLimit>()\n      .notNull()\n      .default(defaultRequestsRateLimit)\n\n    // TODO: metadata config (logo, keywords, examples, etc)\n    // TODO: webhooks\n    // TODO: coupons\n    // TODO: third-party auth provider config\n    // NOTE: will need consumer.authProviders as well as user.authProviders for\n    // this because custom oauth credentials that are deployment-specific. will\n    // prolly also need to hash the individual AuthProviders in\n    // deployment.authProviders to compare across deployments.\n  },\n  (table) => [\n    uniqueIndex('deployment_identifier_idx').on(table.identifier),\n    index('deployment_userId_idx').on(table.userId),\n    index('deployment_teamId_idx').on(table.teamId),\n    index('deployment_projectId_idx').on(table.projectId),\n    index('deployment_published_idx').on(table.published),\n    index('deployment_version_idx').on(table.version),\n    index('deployment_createdAt_idx').on(table.createdAt),\n    index('deployment_updatedAt_idx').on(table.updatedAt),\n    index('deployment_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const deploymentsRelations = relations(deployments, ({ one }) => ({\n  user: one(users, {\n    fields: [deployments.userId],\n    references: [users.id]\n  }),\n  team: one(teams, {\n    fields: [deployments.teamId],\n    references: [teams.id]\n  }),\n  project: one(projects, {\n    fields: [deployments.projectId],\n    references: [projects.id]\n  })\n}))\n\n// TODO: virtual hasFreeTier\n// TODO: virtual url\n// TODO: virtual openApiUrl\n// TODO: virtual saasUrl\n// TODO: virtual authProviders?\n// TODO: virtual openapi spec? (hide openapi.servers)\n\nexport const deploymentSelectBaseSchema = createSelectSchema(deployments, {\n  id: deploymentIdSchema,\n  userId: userIdSchema,\n  teamId: teamIdSchema.optional(),\n  projectId: projectIdSchema,\n  identifier: deploymentIdentifierSchema,\n\n  hash: (schema) =>\n    schema.refine((hash) => isValidDeploymentHash(hash), {\n      message: 'Invalid deployment hash'\n    }),\n\n  name: resolvedAgenticProjectConfigSchema.shape.name,\n  version: resolvedAgenticProjectConfigSchema.shape.version,\n  description: resolvedAgenticProjectConfigSchema.shape.description,\n  readme: resolvedAgenticProjectConfigSchema.shape.readme,\n  iconUrl: resolvedAgenticProjectConfigSchema.shape.iconUrl,\n  sourceUrl: resolvedAgenticProjectConfigSchema.shape.sourceUrl,\n  homepageUrl: resolvedAgenticProjectConfigSchema.shape.homepageUrl,\n  origin: resolvedAgenticProjectConfigSchema.shape.origin,\n  pricingPlans: resolvedAgenticProjectConfigSchema.shape.pricingPlans,\n  pricingIntervals: resolvedAgenticProjectConfigSchema.shape.pricingIntervals,\n  tools: resolvedAgenticProjectConfigSchema.shape.tools,\n  toolConfigs: resolvedAgenticProjectConfigSchema.shape.toolConfigs,\n  defaultRateLimit: resolvedAgenticProjectConfigSchema.shape.defaultRateLimit\n})\n  .omit({\n    origin: true\n  })\n  .extend({\n    // user: z\n    //   .lazy(() => userSelectSchema)\n    //   .optional()\n    //   .openapi('User', { type: 'object' }),\n    // team: z\n    //   .lazy(() => teamSelectSchema)\n    //   .optional()\n    //   .openapi('Team', { type: 'object' }),\n    // project: z\n    //   .lazy(() => projectSelectSchema)\n    //   .optional()\n    //   .openapi('Project', { type: 'object' })\n\n    // TODO: Improve the self-referential typing here that `@hono/zod-openapi`\n    // trips up on.\n    project: z\n      .any()\n      .refine(\n        (project): boolean =>\n          !project || projectSelectSchema.safeParse(project).success,\n        {\n          message: 'Invalid lastDeployment'\n        }\n      )\n      .transform((project): any => {\n        if (!project) return undefined\n        return projectSelectSchema.parse(project)\n      })\n      .optional()\n    // .openapi('Project', { type: 'object' })\n\n    // TODO: Circular references make this schema less than ideal\n    // project: z.object({}).optional().openapi('Project', { type: 'object' })\n  })\n\n// These are all derived virtual URLs that are not stored in the database\nexport const derivedDeploymentFields = {\n  /**\n   * The public base HTTP URL for the deployment supporting HTTP POST requests\n   * for individual tools at `/tool-name` subpaths.\n   *\n   * @example https://gateway.agentic.so/@agentic/search@latest\n   */\n  gatewayBaseUrl: z\n    .string()\n    .url()\n    .describe(\n      'The public base HTTP URL for the deployment supporting HTTP POST requests for individual tools at `/tool-name` subpaths.'\n    ),\n\n  /**\n   * The public MCP URL for the deployment supporting the Streamable HTTP\n   * transport.\n   *\n   * @example https://gateway.agentic.so/@agentic/search@latest/mcp\n   */\n  gatewayMcpUrl: z\n    .string()\n    .url()\n    .describe(\n      'The public MCP URL for the deployment supporting the Streamable HTTP transport.'\n    ),\n\n  /**\n   * The public marketplace URL for the deployment's project.\n   *\n   * Note that only published deployments are visible on the marketplace.\n   *\n   * @example https://agentic.so/marketplace/projects/@agentic/search\n   */\n  marketplaceUrl: z\n    .string()\n    .url()\n    .describe(\"The public marketplace URL for the deployment's project.\"),\n\n  /**\n   * A private admin URL for managing the deployment. This URL is only accessible\n   * by project owners.\n   *\n   * @example https://agentic.so/app/projects/@agentic/search/deployments/123\n   */\n  adminUrl: z\n    .string()\n    .url()\n    .describe(\n      'A private admin URL for managing the deployment. This URL is only accessible by project owners.'\n    )\n} as const\n\nexport const deploymentSelectSchema = deploymentSelectBaseSchema\n  .transform((deployment) => {\n    const { projectIdentifier, deploymentIdentifier } =\n      parseDeploymentIdentifier(deployment.identifier)\n\n    return {\n      ...deployment,\n      gatewayBaseUrl: `${env.AGENTIC_GATEWAY_BASE_URL}/${deploymentIdentifier}`,\n      gatewayMcpUrl: `${env.AGENTIC_GATEWAY_BASE_URL}/${deploymentIdentifier}/mcp`,\n      marketplaceUrl: `${env.AGENTIC_WEB_BASE_URL}/marketplace/projects/${projectIdentifier}`,\n      adminUrl: `${env.AGENTIC_WEB_BASE_URL}/app/projects/${projectIdentifier}/deployments/${deployment.hash}`\n    }\n  })\n  .pipe(deploymentSelectBaseSchema.extend(derivedDeploymentFields).strip())\n  .describe(\n    `A Deployment is a single, immutable instance of a Project. Each deployment contains pricing plans, origin server config (OpenAPI or MCP server), tool definitions, and metadata.\n\nDeployments are private to a developer or team until they are published, at which point they are accessible to any customers with access to the parent Project.`\n  )\n  .openapi('Deployment')\n\nexport const deploymentAdminSelectSchema = deploymentSelectBaseSchema\n  .extend({\n    origin: resolvedAgenticProjectConfigSchema.shape.origin,\n    _secret: z.string().nonempty()\n  })\n  .transform((deployment) => {\n    const { projectIdentifier, deploymentIdentifier } =\n      parseDeploymentIdentifier(deployment.identifier)\n\n    return {\n      ...deployment,\n      gatewayBaseUrl: `${env.AGENTIC_GATEWAY_BASE_URL}/${deploymentIdentifier}`,\n      gatewayMcpUrl: `${env.AGENTIC_GATEWAY_BASE_URL}/${deploymentIdentifier}/mcp`,\n      marketplaceUrl: `${env.AGENTIC_WEB_BASE_URL}/marketplace/projects/${projectIdentifier}`,\n      adminUrl: `${env.AGENTIC_WEB_BASE_URL}/app/projects/${projectIdentifier}/deployments/${deployment.hash}`\n    }\n  })\n  .openapi('AdminDeployment')\n\nexport const deploymentInsertSchema = agenticProjectConfigSchema.strict()\n\n// TODO: Deployments should be immutable, so we should not allow updates aside\n// from publishing. But editing a project's description should be possible from\n// the admin UI, so maybe we allow only updates to some properties? Or we\n// denormalize these fields in `project`?\nexport const deploymentUpdateSchema = createUpdateSchema(deployments)\n  .pick({\n    deletedAt: true,\n    description: true\n  })\n  .strict()\n\nexport const deploymentPublishSchema = createUpdateSchema(deployments, {\n  version: z.string().nonempty()\n})\n  .pick({\n    version: true\n  })\n  .strict()\n"
  },
  {
    "path": "apps/api/src/db/schema/index.ts",
    "content": "export * from './account'\nexport * from './auth-data'\nexport * from './common'\nexport * from './consumer'\nexport * from './deployment'\nexport * from './log-entry'\nexport * from './project'\nexport * from './team'\nexport * from './team-member'\nexport * from './user'\n"
  },
  {
    "path": "apps/api/src/db/schema/log-entry.ts",
    "content": "import { relations } from '@fisch0920/drizzle-orm'\nimport {\n  index,\n  jsonb,\n  pgTable,\n  text,\n  varchar\n} from '@fisch0920/drizzle-orm/pg-core'\n\nimport {\n  consumerIdSchema,\n  deploymentIdSchema,\n  projectIdSchema,\n  userIdSchema\n} from '../schemas'\nimport {\n  consumerId,\n  createSelectSchema,\n  deploymentId,\n  logEntryLevelEnum,\n  logEntryPrimaryId,\n  logEntryTypeEnum,\n  projectId,\n  timestamps,\n  userId\n} from './common'\nimport { consumers } from './consumer'\nimport { deployments } from './deployment'\nimport { projects } from './project'\nimport { users } from './user'\n\n/**\n * A `LogEntry` is an internal audit log entry.\n */\nexport const logEntries = pgTable(\n  'log_entries',\n  {\n    ...logEntryPrimaryId,\n    ...timestamps,\n\n    // core data (required)\n    type: logEntryTypeEnum().notNull().default('log'),\n    level: logEntryLevelEnum().notNull().default('info'),\n    message: text().notNull(),\n\n    // context info (required)\n    environment: text(),\n    service: text(),\n    requestId: varchar({ length: 512 }),\n    traceId: varchar({ length: 512 }),\n\n    // relations (optional)\n    userId: userId(),\n    projectId: projectId(),\n    deploymentId: deploymentId(),\n    consumerId: consumerId(),\n\n    // misc metadata (optional)\n    metadata: jsonb().$type<Record<string, unknown>>().default({}).notNull()\n  },\n  (table) => [\n    index('log_entry_type_idx').on(table.type),\n    // TODO: Don't add these extra indices until we need them. They'll become\n    // very large very fast.\n    // index('log_entry_level_idx').on(table.level),\n    // index('log_entry_environment_idx').on(table.environment),\n    // index('log_entry_service_idx').on(table.service),\n    // index('log_entry_requestId_idx').on(table.requestId),\n    // index('log_entry_traceId_idx').on(table.traceId),\n    index('log_entry_userId_idx').on(table.userId),\n    index('log_entry_projectId_idx').on(table.projectId),\n    index('log_entry_deploymentId_idx').on(table.deploymentId),\n    // index('log_entry_consumerId_idx').on(table.consumerId),\n    index('log_entry_createdAt_idx').on(table.createdAt),\n    index('log_entry_updatedAt_idx').on(table.updatedAt),\n    index('log_entry_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const logEntriesRelations = relations(logEntries, ({ one }) => ({\n  user: one(users, {\n    fields: [logEntries.userId],\n    references: [users.id]\n  }),\n  project: one(projects, {\n    fields: [logEntries.projectId],\n    references: [projects.id]\n  }),\n  deployment: one(deployments, {\n    fields: [logEntries.deploymentId],\n    references: [deployments.id]\n  }),\n  consumer: one(consumers, {\n    fields: [logEntries.consumerId],\n    references: [consumers.id]\n  })\n}))\n\nexport const logEntrySelectSchema = createSelectSchema(logEntries, {\n  userId: userIdSchema.optional(),\n  projectId: projectIdSchema.optional(),\n  deploymentId: deploymentIdSchema.optional(),\n  consumerId: consumerIdSchema.optional()\n})\n  // .extend({\n  //   user: z\n  //     .lazy(() => userSelectSchema)\n  //     .optional()\n  //     .openapi('User', { type: 'object' }),\n\n  //   project: z\n  //     .lazy(() => projectSelectSchema)\n  //     .optional()\n  //     .openapi('Project', { type: 'object' }),\n\n  //   deployment: z\n  //     .lazy(() => deploymentSelectSchema)\n  //     .optional()\n  //     .openapi('Deployment', { type: 'object' }),\n\n  //   consumer: z\n  //     .lazy(() => consumerSelectSchema)\n  //     .optional()\n  //     .openapi('Consumer', { type: 'object' })\n  // })\n  .strip()\n  .openapi('LogEntry')\n"
  },
  {
    "path": "apps/api/src/db/schema/project.ts",
    "content": "import {\n  agenticProjectConfigSchema,\n  pricingIntervalSchema,\n  type StripeMeterIdMap,\n  stripeMeterIdMapSchema,\n  type StripePriceIdMap,\n  stripePriceIdMapSchema,\n  type StripeProductIdMap,\n  stripeProductIdMapSchema\n} from '@agentic/platform-types'\nimport { relations } from '@fisch0920/drizzle-orm'\nimport {\n  boolean,\n  index,\n  integer,\n  jsonb,\n  pgTable,\n  text,\n  uniqueIndex\n} from '@fisch0920/drizzle-orm/pg-core'\nimport { z } from '@hono/zod-openapi'\n\nimport { env } from '@/lib/env'\n\nimport {\n  deploymentIdSchema,\n  projectIdentifierSchema,\n  projectIdSchema,\n  teamIdSchema,\n  userIdSchema\n} from '../schemas'\nimport {\n  createInsertSchema,\n  createSelectSchema,\n  createUpdateSchema,\n  deploymentId,\n  pricingCurrencyEnum,\n  pricingIntervalEnum,\n  projectIdentifier,\n  projectName,\n  projectNamespace,\n  projectPrimaryId,\n  projectSlug,\n  stripeId,\n  teamId,\n  timestamps,\n  userId\n} from './common'\nimport { deployments, deploymentSelectSchema } from './deployment'\nimport { teams, teamSelectSchema } from './team'\nimport { users, userSelectSchema } from './user'\n\n/**\n * A Project represents a single Agentic API product. Is is comprised of a\n * series of immutable Deployments, each of which contains pricing data, origin\n * API config, OpenAPI or MCP specs, tool definitions, and various metadata.\n *\n * You can think of Agentic Projects as similar to Vercel projects. They both\n * hold some common configuration and are comprised of a series of immutable\n * Deployments.\n *\n * Internally, Projects manage all of the Stripe billing resources across\n * Deployments (Stripe Products, Prices, and Meters for usage-based billing).\n */\nexport const projects = pgTable(\n  'projects',\n  {\n    ...projectPrimaryId,\n    ...timestamps,\n\n    // display name\n    name: projectName().notNull(),\n\n    // identifier is `@namespace/slug`\n    identifier: projectIdentifier().unique().notNull(),\n\n    // namespace is either a username or team slug\n    namespace: projectNamespace().notNull(),\n\n    // slug is a unique identifier for the project within its namespace\n    slug: projectSlug().notNull(),\n\n    // Defaulting to `true` for now to hide all projects from the marketplace\n    // by default. Will need to manually set to `true` to allow projects to be\n    // visible on the marketplace.\n    private: boolean().default(true).notNull(),\n\n    // Admin-controlled tags for organizing and featuring on the marketplace\n    tags: text().array(),\n\n    // TODO: allow for multiple aliases like vercel\n    // alias: text(),\n\n    userId: userId()\n      .notNull()\n      .references(() => users.id),\n    teamId: teamId(),\n\n    // Most recently published Deployment if one exists\n    lastPublishedDeploymentId: deploymentId(),\n\n    // Most recent Deployment if one exists\n    lastDeploymentId: deploymentId(),\n\n    // Semver version of the most recently published Deployment (if one exists)\n    // (denormalized for convenience)\n    lastPublishedDeploymentVersion: text(),\n\n    applicationFeePercent: integer().default(20).notNull(),\n\n    // TODO: This is going to need to vary from dev to prod\n    //isStripeConnectEnabled: boolean().default(false).notNull(),\n\n    // Default pricing interval for subscriptions to this project\n    // Note: This is essentially hard-coded and not configurable by users for now.\n    defaultPricingInterval: pricingIntervalEnum().default('month').notNull(),\n\n    // Pricing currency used across all prices and subscriptions to this project\n    pricingCurrency: pricingCurrencyEnum().default('usd').notNull(),\n\n    // All deployments share the same underlying proxy secret, which allows\n    // origin servers to verify that requests are coming from Agentic's API\n    // gateway.\n    _secret: text().notNull(),\n\n    // Auth token used to access the platform API on behalf of this project\n    // _providerToken: text().notNull(),\n\n    // TODO: Full-text search\n    // _text: text().default('').notNull(),\n\n    // Stripe coupons associated with this project, mapping from unique coupon\n    // object hash to stripe coupon id.\n    // `[hash: string]: string`\n    // _stripeCouponsMap: jsonb()\n    //   .$type<Record<string, string>>()\n    //   .default({})\n    //   .notNull(),\n\n    // Stripe billing Products associated with this project across deployments,\n    // mapping from PricingPlanLineItem **slug** to Stripe Product id.\n    // NOTE: This map uses slugs as keys, unlike `_stripePriceIdMap`, because\n    // Stripe Products are agnostic to the PricingPlanLineItem config. This is\n    // important for them to be shared across deployments even if the pricing\n    // details change.\n    _stripeProductIdMap: jsonb()\n      .$type<StripeProductIdMap>()\n      .default({})\n      .notNull(),\n\n    // Stripe billing Prices associated with this project, mapping from unique\n    // PricingPlanLineItem **hash** to Stripe Price id.\n    // NOTE: This map uses hashes as keys, because Stripe Prices are dependent\n    // on the PricingPlanLineItem config. This is important for them to be shared\n    // across deployments even if the pricing details change.\n    _stripePriceIdMap: jsonb().$type<StripePriceIdMap>().default({}).notNull(),\n\n    // Stripe billing LineItems associated with this project, mapping from unique\n    // PricingPlanLineItem **slug** to Stripe Meter id.\n    // NOTE: This map uses slugs as keys, unlike `_stripePriceIdMap`, because\n    // Stripe Products are agnostic to the PricingPlanLineItem config. This is\n    // important for them to be shared across deployments even if the pricing\n    // details change.\n    _stripeMeterIdMap: jsonb().$type<StripeMeterIdMap>().default({}).notNull(),\n\n    // Connected Stripe account (standard or express).\n    // If not defined, then subscriptions for this project route through our\n    // main Stripe account.\n    _stripeAccountId: stripeId()\n  },\n  (table) => [\n    uniqueIndex('project_identifier_idx').on(table.identifier),\n    index('project_namespace_idx').on(table.namespace),\n    index('project_userId_idx').on(table.userId),\n    index('project_teamId_idx').on(table.teamId),\n    // index('project_alias_idx').on(table.alias),\n    index('project_private_idx').on(table.private),\n    index('project_tags_idx').on(table.tags),\n    index('project_lastPublishedDeploymentId_idx').on(\n      table.lastPublishedDeploymentId\n    ),\n    index('project_createdAt_idx').on(table.createdAt),\n    index('project_updatedAt_idx').on(table.updatedAt),\n    index('project_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const projectsRelations = relations(projects, ({ one }) => ({\n  user: one(users, {\n    fields: [projects.userId],\n    references: [users.id]\n  }),\n  team: one(teams, {\n    fields: [projects.teamId],\n    references: [teams.id]\n  }),\n  lastPublishedDeployment: one(deployments, {\n    fields: [projects.lastPublishedDeploymentId],\n    references: [deployments.id],\n    relationName: 'lastPublishedDeployment'\n  }),\n  lastDeployment: one(deployments, {\n    fields: [projects.lastDeploymentId],\n    references: [deployments.id],\n    relationName: 'lastDeployment'\n  })\n  // deployments: many(deployments, {\n  //   relationName: 'deployments'\n  // }),\n  // publishedDeployments: many(deployments, {\n  //   relationName: 'publishedDeployments'\n  // })\n}))\n\nexport const projectSelectBaseSchema = createSelectSchema(projects, {\n  id: projectIdSchema,\n  userId: userIdSchema,\n  teamId: teamIdSchema.optional(),\n  identifier: projectIdentifierSchema,\n  name: agenticProjectConfigSchema.shape.name,\n  slug: agenticProjectConfigSchema.shape.slug,\n  tags: z.array(z.string()).optional(),\n  lastPublishedDeploymentId: deploymentIdSchema.optional(),\n  lastDeploymentId: deploymentIdSchema.optional(),\n\n  applicationFeePercent: (schema) => schema.nonnegative(),\n\n  defaultPricingInterval: pricingIntervalSchema,\n\n  _stripeProductIdMap: stripeProductIdMapSchema,\n  _stripePriceIdMap: stripePriceIdMapSchema,\n  _stripeMeterIdMap: stripeMeterIdMapSchema\n})\n  .omit({\n    applicationFeePercent: true,\n    _secret: true,\n    // _text: true,\n    _stripeProductIdMap: true,\n    _stripePriceIdMap: true,\n    _stripeMeterIdMap: true,\n    _stripeAccountId: true\n  })\n  .extend({\n    user: z\n      .lazy(() => userSelectSchema)\n      .optional()\n      .openapi('User', { type: 'object' }),\n\n    team: z\n      .lazy(() => teamSelectSchema)\n      .optional()\n      .openapi('Team', { type: 'object' }),\n\n    // TODO: Improve the self-referential typing here that `@hono/zod-openapi`\n    // trips up on.\n    lastPublishedDeployment: z\n      .any()\n      .refine(\n        (deployment): boolean =>\n          !deployment || deploymentSelectSchema.safeParse(deployment).success,\n        {\n          message: 'Invalid lastPublishedDeployment'\n        }\n      )\n      .transform((deployment): any => {\n        if (!deployment) return undefined\n\n        return deploymentSelectSchema.parse(deployment)\n      })\n      .optional(),\n\n    lastDeployment: z\n      .any()\n      .refine(\n        (deployment): boolean =>\n          !deployment || deploymentSelectSchema.safeParse(deployment).success,\n        {\n          message: 'Invalid lastDeployment'\n        }\n      )\n      .transform((deployment): any => {\n        if (!deployment) return undefined\n        return deploymentSelectSchema.parse(deployment)\n      })\n      .optional(),\n\n    deployment: z\n      .any()\n      .refine(\n        (deployment): boolean =>\n          !deployment || deploymentSelectSchema.safeParse(deployment).success,\n        {\n          message: 'Invalid lastDeployment'\n        }\n      )\n      .transform((deployment): any => {\n        if (!deployment) return undefined\n        return deploymentSelectSchema.parse(deployment)\n      })\n      .optional()\n  })\n\n// These are all derived virtual URLs that are not stored in the database\nexport const derivedProjectFields = {\n  /**\n   * The public base HTTP URL for the project supporting HTTP POST requests for\n   * individual tools at `/tool-name` subpaths.\n   *\n   * @example https://gateway.agentic.so/@agentic/search\n   */\n  gatewayBaseUrl: z\n    .string()\n    .url()\n    .describe(\n      'The public base HTTP URL for the project supporting HTTP POST requests for individual tools at `/tool-name` subpaths.'\n    ),\n\n  /**\n   * The public MCP URL for the project supporting the Streamable HTTP transport.\n   *\n   * @example https://gateway.agentic.so/@agentic/search/mcp\n   */\n  gatewayMcpUrl: z\n    .string()\n    .url()\n    .describe(\n      'The public MCP URL for the project supporting the Streamable HTTP transport.'\n    ),\n\n  /**\n   * The public marketplace URL for the project.\n   *\n   * @example https://agentic.so/marketplace/projects/@agentic/search\n   */\n  marketplaceUrl: z\n    .string()\n    .url()\n    .describe('The public marketplace URL for the project.'),\n\n  /**\n   * A private admin URL for managing the project. This URL is only accessible\n   * by project owners.\n   *\n   * @example https://agentic.so/app/projects/@agentic/search\n   */\n  adminUrl: z\n    .string()\n    .url()\n    .describe(\n      'A private admin URL for managing the project. This URL is only accessible by project owners.'\n    )\n} as const\n\nexport const projectSelectSchema = projectSelectBaseSchema\n  .transform((project) => ({\n    ...project,\n    gatewayBaseUrl: `${env.AGENTIC_GATEWAY_BASE_URL}/${project.identifier}`,\n    gatewayMcpUrl: `${env.AGENTIC_GATEWAY_BASE_URL}/${project.identifier}/mcp`,\n    marketplaceUrl: `${env.AGENTIC_WEB_BASE_URL}/marketplace/projects/${project.identifier}`,\n    adminUrl: `${env.AGENTIC_WEB_BASE_URL}/app/projects/${project.identifier}`\n  }))\n  .pipe(projectSelectBaseSchema.extend(derivedProjectFields).strip())\n  .describe(\n    `A Project represents a single Agentic API product. It is comprised of a series of immutable Deployments, each of which contains pricing data, origin API config, OpenAPI or MCP specs, tool definitions, and various metadata.\n\nYou can think of Agentic Projects as similar to Vercel projects. They both hold some common configuration and are comprised of a series of immutable Deployments.\n\nInternally, Projects manage all of the Stripe billing resources across Deployments (Stripe Products, Prices, and Meters for usage-based billing).`\n  )\n  .openapi('Project')\n\nexport const projectInsertSchema = createInsertSchema(projects, {\n  identifier: projectIdentifierSchema,\n\n  name: agenticProjectConfigSchema.shape.name,\n  slug: agenticProjectConfigSchema.shape.slug\n})\n  .pick({\n    name: true,\n    slug: true\n  })\n  .strict()\n\nexport const projectUpdateSchema = createUpdateSchema(projects)\n  .pick({\n    name: true\n    // alias: true\n  })\n  .strict()\n\n// TODO: virtual saasUrl\n// TODO: virtual aliasUrl\n"
  },
  {
    "path": "apps/api/src/db/schema/team-member.ts",
    "content": "import { relations } from '@fisch0920/drizzle-orm'\nimport {\n  boolean,\n  index,\n  pgTable,\n  primaryKey\n} from '@fisch0920/drizzle-orm/pg-core'\n\nimport { userIdSchema } from '../schemas'\nimport {\n  createInsertSchema,\n  createSelectSchema,\n  createUpdateSchema,\n  teamId,\n  teamMemberRoleEnum,\n  teamSlug,\n  timestamp,\n  timestamps,\n  userId\n} from './common'\nimport { teams } from './team'\nimport { users } from './user'\n\nexport const teamMembers = pgTable(\n  'team_members',\n  {\n    ...timestamps,\n\n    userId: userId()\n      .notNull()\n      .references(() => users.id, { onDelete: 'cascade' }),\n    teamSlug: teamSlug()\n      .notNull()\n      .references(() => teams.slug, { onDelete: 'cascade' }),\n    teamId: teamId()\n      .notNull()\n      .references(() => teams.id, { onDelete: 'cascade' }),\n    role: teamMemberRoleEnum().default('user').notNull(),\n\n    confirmed: boolean().default(false).notNull(),\n    confirmedAt: timestamp()\n  },\n  (table) => [\n    primaryKey({ columns: [table.userId, table.teamId] }),\n    index('team_member_user_idx').on(table.userId),\n    index('team_member_team_idx').on(table.teamId),\n    index('team_member_slug_idx').on(table.teamSlug),\n    index('team_member_createdAt_idx').on(table.createdAt),\n    index('team_member_updatedAt_idx').on(table.updatedAt),\n    index('team_member_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const teamMembersRelations = relations(teamMembers, ({ one }) => ({\n  user: one(users, {\n    fields: [teamMembers.userId],\n    references: [users.id]\n  }),\n  team: one(teams, {\n    fields: [teamMembers.teamId],\n    references: [teams.id]\n  })\n}))\n\nexport const teamMemberSelectSchema = createSelectSchema(teamMembers)\n  // .extend({\n  //   user: z\n  //     .lazy(() => userSelectSchema)\n  //     .optional()\n  //     .openapi('User', { type: 'object' }),\n\n  //   team: z\n  //     .lazy(() => teamSelectSchema)\n  //     .optional()\n  //     .openapi('Team', { type: 'object' })\n  // })\n  .strip()\n  .openapi('TeamMember')\n\nexport const teamMemberInsertSchema = createInsertSchema(teamMembers, {\n  userId: userIdSchema\n})\n  .pick({\n    userId: true,\n    role: true\n  })\n  .strict()\n\nexport const teamMemberUpdateSchema = createUpdateSchema(teamMembers)\n  .pick({\n    role: true\n  })\n  .strict()\n"
  },
  {
    "path": "apps/api/src/db/schema/team.ts",
    "content": "import { isValidTeamSlug } from '@agentic/platform-validators'\nimport { relations } from '@fisch0920/drizzle-orm'\nimport {\n  index,\n  pgTable,\n  text,\n  uniqueIndex\n} from '@fisch0920/drizzle-orm/pg-core'\n\nimport { userIdSchema } from '../schemas'\nimport {\n  createInsertSchema,\n  createSelectSchema,\n  createUpdateSchema,\n  teamPrimaryId,\n  teamSlug,\n  timestamps,\n  userId\n} from './common'\nimport { teamMembers } from './team-member'\nimport { users } from './user'\n\nexport const teams = pgTable(\n  'teams',\n  {\n    ...teamPrimaryId,\n    ...timestamps,\n\n    slug: teamSlug().unique().notNull(),\n    name: text().notNull(),\n\n    ownerId: userId().notNull()\n  },\n  (table) => [\n    uniqueIndex('team_slug_idx').on(table.slug),\n    index('team_createdAt_idx').on(table.createdAt),\n    index('team_updatedAt_idx').on(table.updatedAt),\n    index('team_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const teamsRelations = relations(teams, ({ one, many }) => ({\n  owner: one(users, {\n    fields: [teams.ownerId],\n    references: [users.id]\n  }),\n  members: many(teamMembers)\n}))\n\nexport const teamSelectSchema = createSelectSchema(teams)\n  // .extend({\n  //   owner: z\n  //     .lazy(() => userSelectSchema)\n  //     .optional()\n  //     .openapi('User', { type: 'object' })\n  // })\n  .strip()\n  .openapi('Team')\n\nexport const teamInsertSchema = createInsertSchema(teams, {\n  slug: (schema) =>\n    schema.refine((slug) => isValidTeamSlug(slug), {\n      message: 'Invalid team slug'\n    })\n})\n  .omit({ id: true, createdAt: true, updatedAt: true, ownerId: true })\n  .strict()\n\nexport const teamUpdateSchema = createUpdateSchema(teams, {\n  ownerId: userIdSchema\n})\n  .pick({\n    name: true,\n    ownerId: true\n  })\n  .strict()\n"
  },
  {
    "path": "apps/api/src/db/schema/user.ts",
    "content": "import { relations } from '@fisch0920/drizzle-orm'\nimport {\n  boolean,\n  index,\n  pgTable,\n  text,\n  uniqueIndex\n} from '@fisch0920/drizzle-orm/pg-core'\n\nimport { accounts } from './account'\nimport {\n  createSelectSchema,\n  createUpdateSchema,\n  stripeId,\n  timestamps,\n  username,\n  // username,\n  userPrimaryId,\n  userRoleEnum\n} from './common'\n\nexport const users = pgTable(\n  'users',\n  {\n    ...userPrimaryId,\n    ...timestamps,\n\n    username: username().unique().notNull(),\n    role: userRoleEnum().default('user').notNull(),\n\n    email: text().notNull().unique(),\n    isEmailVerified: boolean().default(false).notNull(),\n\n    name: text(),\n    bio: text(),\n    image: text(),\n\n    //isStripeConnectEnabledByDefault: boolean().default(true).notNull(),\n\n    stripeCustomerId: stripeId()\n  },\n  (table) => [\n    uniqueIndex('user_email_idx').on(table.email),\n    uniqueIndex('user_username_idx').on(table.username),\n    index('user_createdAt_idx').on(table.createdAt),\n    index('user_updatedAt_idx').on(table.updatedAt)\n    // index('user_deletedAt_idx').on(table.deletedAt)\n  ]\n)\n\nexport const usersRelations = relations(users, ({ many }) => ({\n  accounts: many(accounts)\n}))\n\nexport const userSelectSchema = createSelectSchema(users)\n  .strip()\n  .openapi('User')\n\nexport const userUpdateSchema = createUpdateSchema(users)\n  .pick({\n    name: true,\n    bio: true,\n    image: true\n    //isStripeConnectEnabledByDefault: true\n  })\n  .strict()\n"
  },
  {
    "path": "apps/api/src/db/schemas.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport {\n  isNamespaceAllowed,\n  isValidCuid,\n  isValidDeploymentIdentifier,\n  isValidProjectIdentifier,\n  isValidTeamSlug,\n  isValidUsername\n} from '@agentic/platform-validators'\nimport { z } from '@hono/zod-openapi'\n\nimport type { consumersRelations } from './schema/consumer'\nimport type { deploymentsRelations } from './schema/deployment'\nimport type { projectsRelations } from './schema/project'\nimport { idPrefixMap, type ModelType } from './schema/common'\n\nexport function getIdSchemaForModelType(modelType: ModelType) {\n  const idPrefix = idPrefixMap[modelType]\n  assert(idPrefix, 500, `Invalid model type: ${modelType}`)\n\n  // Convert model type to PascalCase\n  const modelDisplayName =\n    modelType.charAt(0).toUpperCase() + modelType.slice(1)\n  const example = `${idPrefix}_tz4a98xxat96iws9zmbrgj3a`\n\n  return z\n    .string()\n    .refine(\n      (id) => {\n        const parts = id.split('_')\n        if (parts.length !== 2) return false\n        if (parts[0] !== idPrefix) return false\n        if (!isValidCuid(parts[1])) return false\n\n        return true\n      },\n      {\n        message: `Invalid ${modelDisplayName} id`\n      }\n    )\n    .describe(`${modelDisplayName} id (e.g. \"${example}\")`)\n  // TODO: is this necessary?\n  // .openapi(`${modelDisplayName}Id`, { example })\n}\n\nexport const userIdSchema = getIdSchemaForModelType('user')\nexport const teamIdSchema = getIdSchemaForModelType('team')\nexport const consumerIdSchema = getIdSchemaForModelType('consumer')\nexport const projectIdSchema = getIdSchemaForModelType('project')\nexport const deploymentIdSchema = getIdSchemaForModelType('deployment')\nexport const logEntryIdSchema = getIdSchemaForModelType('logEntry')\n\nexport const projectIdentifierSchema = z\n  .string()\n  .refine(\n    (id) =>\n      isValidProjectIdentifier(id, { strict: false }) ||\n      projectIdSchema.safeParse(id).success,\n    {\n      message: 'Invalid project identifier'\n    }\n  )\n  .describe('Public project identifier (e.g. \"@namespace/project-slug\")')\n  .openapi('ProjectIdentifier')\n\nexport const deploymentIdentifierSchema = z\n  .string()\n  .refine(\n    (id) =>\n      isValidDeploymentIdentifier(id, { strict: false }) ||\n      deploymentIdSchema.safeParse(id).success,\n    {\n      message: 'Invalid deployment identifier'\n    }\n  )\n  .describe(\n    'Public deployment identifier (e.g. \"@namespace/project-slug@{hash|version|latest}\")'\n  )\n  .openapi('DeploymentIdentifier')\n\nexport const usernameSchema = z\n  .string()\n  .refine((username) => isValidUsername(username), {\n    message: 'Invalid username'\n  })\n  .refine((username) => isNamespaceAllowed(username), {\n    message:\n      'Username is not allowed (reserved, offensive, or otherwise confusing)'\n  })\n\nexport const teamSlugSchema = z\n  .string()\n  .refine((slug) => isValidTeamSlug(slug), {\n    message: 'Invalid team slug'\n  })\n  .refine((slug) => isNamespaceAllowed(slug), {\n    message:\n      'Team slug is not allowed (reserved, offensive, or otherwise confusing)'\n  })\n\nexport const paginationSchema = z.object({\n  offset: z.coerce.number().int().nonnegative().default(0).optional(),\n  limit: z.coerce.number().int().positive().max(100).default(10).optional(),\n  sort: z.enum(['asc', 'desc']).default('desc').optional(),\n  sortBy: z.enum(['createdAt', 'updatedAt']).default('createdAt').optional()\n})\n\nexport type ProjectRelationFields = keyof ReturnType<\n  (typeof projectsRelations)['config']\n>\nexport const projectRelationsSchema: z.ZodType<ProjectRelationFields> = z.enum([\n  'user',\n  'team',\n  'lastPublishedDeployment',\n  'lastDeployment'\n])\n\nexport type DeploymentRelationFields = keyof ReturnType<\n  (typeof deploymentsRelations)['config']\n>\nexport const deploymentRelationsSchema: z.ZodType<DeploymentRelationFields> =\n  z.enum(['user', 'team', 'project'])\n\nexport type ConsumerRelationFields = keyof ReturnType<\n  (typeof consumersRelations)['config']\n>\nexport const consumerRelationsSchema: z.ZodType<ConsumerRelationFields> =\n  z.enum(['user', 'project', 'deployment'])\n"
  },
  {
    "path": "apps/api/src/db/types.test.ts",
    "content": "import type { Simplify } from 'type-fest'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type {\n  Consumer,\n  LogEntry,\n  RawConsumer,\n  RawConsumerUpdate,\n  RawDeployment,\n  RawLogEntry,\n  RawProject,\n  RawUser,\n  User\n} from './types'\n\ntype UserKeys = Exclude<keyof User & keyof RawUser, 'authProviders'>\ntype LogEntryKeys = keyof RawLogEntry & keyof LogEntry\ntype ConsumerKeys = keyof RawConsumer & keyof Consumer\n\ntype TODOFixedConsumer = Simplify<\n  Omit<\n    Consumer,\n    | 'user'\n    | 'project'\n    | 'deployment'\n    | 'gatewayBaseUrl'\n    | 'gatewayMcpUrl'\n    | 'marketplaceUrl'\n    | 'adminUrl'\n  > & {\n    user?: RawUser | null\n    project?: RawProject | null\n    deployment?: RawDeployment | null\n  }\n>\n\ntest('User types are compatible', () => {\n  expectTypeOf<RawUser>().toExtend<User>()\n\n  expectTypeOf<User[UserKeys]>().toEqualTypeOf<RawUser[UserKeys]>()\n})\n\ntest('LogEntry types are compatible', () => {\n  expectTypeOf<RawLogEntry>().toExtend<LogEntry>()\n\n  expectTypeOf<LogEntry[LogEntryKeys]>().toEqualTypeOf<\n    RawLogEntry[LogEntryKeys]\n  >()\n})\n\ntest('Consumer types are compatible', () => {\n  expectTypeOf<RawConsumer>().toExtend<TODOFixedConsumer>()\n\n  expectTypeOf<TODOFixedConsumer[ConsumerKeys]>().toEqualTypeOf<\n    RawConsumer[ConsumerKeys]\n  >()\n\n  // Ensure that we can pass any Consumer as a RawConsumerUpdate\n  expectTypeOf<Consumer>().toExtend<RawConsumerUpdate>()\n\n  // Ensure that we can pass any RawConsumer as a RawConsumerUpdate\n  expectTypeOf<RawConsumer>().toExtend<RawConsumerUpdate>()\n})\n"
  },
  {
    "path": "apps/api/src/db/types.ts",
    "content": "import type {\n  BuildQueryResult,\n  ExtractTablesWithRelations,\n  InferInsertModel,\n  InferSelectModel\n} from '@fisch0920/drizzle-orm'\nimport type { z } from '@hono/zod-openapi'\nimport type { Simplify } from 'type-fest'\n\nimport type * as schema from './schema'\n\nexport type Tables = ExtractTablesWithRelations<typeof schema>\n\nexport type User = z.infer<typeof schema.userSelectSchema>\nexport type RawUser = InferSelectModel<typeof schema.users>\n\nexport type Team = z.infer<typeof schema.teamSelectSchema>\nexport type TeamWithMembers = BuildQueryResult<\n  Tables,\n  Tables['teams'],\n  { with: { members: true } }\n>\nexport type RawTeam = InferSelectModel<typeof schema.teams>\n\nexport type TeamMember = z.infer<typeof schema.teamMemberSelectSchema>\nexport type TeamMemberWithTeam = BuildQueryResult<\n  Tables,\n  Tables['teamMembers'],\n  { with: { team: true } }\n>\nexport type RawTeamMember = InferSelectModel<typeof schema.teamMembers>\n\nexport type Project = z.infer<typeof schema.projectSelectSchema>\nexport type ProjectWithLastPublishedDeployment = BuildQueryResult<\n  Tables,\n  Tables['projects'],\n  { with: { lastPublishedDeployment: true } }\n>\nexport type RawProject = Simplify<\n  InferSelectModel<typeof schema.projects> & {\n    lastPublishedDeployment?: RawDeployment | null // TODO: remove null (requires drizzle-orm changes)\n    lastDeployment?: RawDeployment | null // TODO: remove null (requires drizzle-orm changes)\n  }\n>\n\nexport type Deployment = z.infer<typeof schema.deploymentSelectSchema>\nexport type DeploymentWithProject = BuildQueryResult<\n  Tables,\n  Tables['deployments'],\n  { with: { project: true } }\n>\nexport type RawDeployment = Simplify<\n  InferSelectModel<typeof schema.deployments> & {\n    project?: RawProject | null // TODO: remove null (requires drizzle-orm changes)\n  }\n>\n\nexport type Consumer = z.infer<typeof schema.consumerSelectSchema>\nexport type ConsumerWithProjectAndDeployment = BuildQueryResult<\n  Tables,\n  Tables['consumers'],\n  { with: { project: true; deployment: true } }\n>\nexport type RawConsumer = Simplify<\n  InferSelectModel<typeof schema.consumers> & {\n    user?: RawUser | undefined | null // TODO: remove null (requires drizzle-orm changes)\n    project?: RawProject | undefined | null // TODO: remove null (requires drizzle-orm changes)\n    deployment?: RawDeployment | undefined | null // TODO: remove null (requires drizzle-orm changes)\n  }\n>\nexport type RawConsumerUpdate = Partial<\n  Omit<\n    InferInsertModel<typeof schema.consumers>,\n    'id' | 'projectId' | 'userId' | 'deploymentId'\n  >\n>\n\nexport type LogEntry = z.infer<typeof schema.logEntrySelectSchema>\nexport type RawLogEntry = InferSelectModel<typeof schema.logEntries>\n\nexport type Account = z.infer<typeof schema.accountSelectSchema>\nexport type RawAccount = InferSelectModel<typeof schema.accounts>\n"
  },
  {
    "path": "apps/api/src/db/utils.ts",
    "content": "import type { PricingPlan, PricingPlanLineItem } from '@agentic/platform-types'\nimport { hashObject } from '@agentic/platform-core'\n\nimport type { RawProject } from './types'\n\n/**\n * Gets the hash used to uniquely map a PricingPlanLineItem to its\n * corresponding Stripe Price in a stable way across deployments within a\n * project.\n *\n * This hash is used as the key for the `Project._stripePriceIdMap`.\n */\nexport async function getPricingPlanLineItemHashForStripePrice({\n  pricingPlan,\n  pricingPlanLineItem,\n  project\n}: {\n  pricingPlan: PricingPlan\n  pricingPlanLineItem: PricingPlanLineItem\n  project: RawProject\n}): Promise<string> {\n  // TODO: use pricingPlan.slug as well here?\n  // TODO: not sure if this is needed or not...\n  // With pricing plan slug:\n  //   - 'price:free:base:<hash>'\n  //   - 'price:basic-monthly:base:<hash>'\n  //   - 'price:basic-monthly:requests:<hash>'\n  // Without pricing plan slug:\n  //   - 'price:base:<hash>'\n  //   - 'price:base:<hash>'\n  //   - 'price:requests:<hash>'\n\n  const hash = await hashObject({\n    ...pricingPlanLineItem,\n    projectId: project.id,\n    stripeAccountId: project._stripeAccountId,\n    currency: project.pricingCurrency\n  })\n\n  return `price:${pricingPlan.slug}:${pricingPlanLineItem.slug}:${hash}`\n}\n\nexport async function getStripePriceIdForPricingPlanLineItem({\n  pricingPlan,\n  pricingPlanLineItem,\n  project\n}: {\n  pricingPlan: PricingPlan\n  pricingPlanLineItem: PricingPlanLineItem\n  project: RawProject\n}): Promise<string | undefined> {\n  const pricingPlanLineItemHash =\n    await getPricingPlanLineItemHashForStripePrice({\n      pricingPlan,\n      pricingPlanLineItem,\n      project\n    })\n\n  return project._stripePriceIdMap[pricingPlanLineItemHash]\n}\n"
  },
  {
    "path": "apps/api/src/lib/__snapshots__/storage.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`Storage > uploadFileUrlToStorage data-uri 1`] = `\"https://storage.agentic.so/@dev/test/ef4238fba78887e0974cd48809a66e284cdd78ce92d6b2d485c25a552fb39631.svg\"`;\n\nexports[`Storage > uploadFileUrlToStorage data-uri 2 1`] = `\"https://storage.agentic.so/@dev/test/efbc1f0409b730d93b01c918be9e024bf7777801cfd252221c39e36c08c1b4fb\"`;\n\nexports[`Storage > uploadFileUrlToStorage url 1`] = `\"https://storage.agentic.so/@dev/test/6da6ef895be2a42606b99e5e3b9c25687c92c81986a9718e07f32e574d41cf7a.svg\"`;\n"
  },
  {
    "path": "apps/api/src/lib/acl-admin.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from './types'\nimport { ensureAuthUser } from './ensure-auth-user'\n\nexport async function aclAdmin(ctx: AuthenticatedHonoContext) {\n  const user = await ensureAuthUser(ctx)\n  assert(user, 401, 'Authentication required')\n  assert(user.role === 'admin', 403, 'Access denied')\n}\n"
  },
  {
    "path": "apps/api/src/lib/acl-public-project.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type { RawProject } from '@/db'\n\nexport function aclPublicProject(\n  project: RawProject | undefined,\n  projectId?: string\n): asserts project {\n  assert(\n    project,\n    404,\n    `Public project not found${projectId ? ` \"${projectId}\"` : ''}`\n  )\n\n  assert(\n    !project.private && project.lastPublishedDeploymentId,\n    404,\n    `Public project not found \"${project.id}\"`\n  )\n\n  assert(!project.deletedAt, 410, `Project has been deleted \"${project.id}\"`)\n}\n"
  },
  {
    "path": "apps/api/src/lib/acl-team-admin.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport { and, db, eq, schema, type TeamMember } from '@/db'\n\nimport type { AuthenticatedHonoContext } from './types'\nimport { ensureAuthUser } from './ensure-auth-user'\n\nexport async function aclTeamAdmin(\n  ctx: AuthenticatedHonoContext,\n  {\n    teamId,\n    teamSlug,\n    teamMember\n  }: {\n    teamId?: string\n    teamSlug?: string\n    teamMember?: TeamMember\n  } & (\n    | {\n        teamId: string\n        teamSlug?: never\n      }\n    | {\n        teamId?: never\n        teamSlug: string\n      }\n  )\n) {\n  const teamLabel = teamId ?? teamSlug\n  assert(teamLabel, 500, 'Either teamSlug or teamId must be provided')\n\n  const user = await ensureAuthUser(ctx)\n\n  if (user.role === 'admin') {\n    // TODO: Allow admins to access all team resources\n    return\n  }\n\n  if (!teamMember) {\n    teamMember = await db.query.teamMembers.findFirst({\n      where: and(\n        teamId\n          ? eq(schema.teamMembers.teamId, teamId)\n          : eq(schema.teamMembers.teamSlug, teamSlug!),\n        eq(schema.teamMembers.userId, user.id)\n      )\n    })\n  }\n\n  assert(teamMember, 403, `User does not have access to team \"${teamLabel}\"`)\n\n  assert(\n    teamMember.role === 'admin',\n    403,\n    `User does not have \"admin\" role for team \"${teamLabel}\"`\n  )\n\n  assert(\n    teamMember.userId === user.id,\n    403,\n    `User does not have access to team \"${teamLabel}\"`\n  )\n\n  assert(\n    teamMember.confirmed,\n    403,\n    `User has not confirmed their invitation to team \"${teamLabel}\"`\n  )\n}\n"
  },
  {
    "path": "apps/api/src/lib/acl-team-member.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport { and, db, eq, type RawTeamMember, schema } from '@/db'\n\nimport type { AuthenticatedHonoContext } from './types'\nimport { ensureAuthUser } from './ensure-auth-user'\n\nexport async function aclTeamMember(\n  ctx: AuthenticatedHonoContext,\n  {\n    teamId,\n    teamSlug,\n    teamMember,\n    userId\n  }: {\n    teamId?: string\n    teamSlug?: string\n    teamMember?: RawTeamMember\n    userId?: string\n  } & (\n    | { teamSlug: string }\n    | { teamId: string }\n    | { teamMember: RawTeamMember }\n  )\n) {\n  const teamLabel = teamId ?? teamSlug\n  assert(teamLabel, 500, 'Either teamSlug or teamId must be provided')\n\n  const user = await ensureAuthUser(ctx)\n\n  if (user.role === 'admin') {\n    // TODO: Allow admins to access all team resources\n    return\n  }\n\n  userId ??= user.id\n\n  if (!teamMember) {\n    teamMember = await db.query.teamMembers.findFirst({\n      where: and(\n        teamId\n          ? eq(schema.teamMembers.teamId, teamId)\n          : eq(schema.teamMembers.teamSlug, teamSlug!),\n        eq(schema.teamMembers.userId, userId)\n      )\n    })\n  }\n\n  assert(teamMember, 403, `User does not have access to team \"${teamLabel}\"`)\n  if (!ctx.get('teamMember')) {\n    ctx.set('teamMember', teamMember)\n  }\n\n  assert(\n    teamMember.userId === userId,\n    403,\n    `User does not have access to team \"${teamLabel}\"`\n  )\n\n  assert(\n    teamMember.confirmed,\n    403,\n    `User has not confirmed their invitation to team \"${teamLabel}\"`\n  )\n}\n"
  },
  {
    "path": "apps/api/src/lib/acl.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from './types'\nimport { ensureAuthUser } from './ensure-auth-user'\n\nexport async function acl<\n  TModel extends Record<string, unknown>,\n  TUserField extends keyof TModel = 'userId',\n  TTeamField extends keyof TModel = 'teamId'\n>(\n  ctx: AuthenticatedHonoContext,\n  model: TModel,\n  {\n    label,\n    userField = 'userId' as TUserField,\n    teamField = 'teamId' as TTeamField\n  }: {\n    label: string\n    userField?: TUserField\n    teamField?: TTeamField\n  }\n) {\n  const user = await ensureAuthUser(ctx)\n  const teamMember = ctx.get('teamMember')\n\n  const userFieldValue = model[userField]\n  const teamFieldValue = model[teamField]\n\n  const isAuthUserOwner = userFieldValue && userFieldValue === user.id\n  const isAuthUserAdmin = user.role === 'admin'\n  const hasTeamAccess =\n    teamMember && teamFieldValue && teamFieldValue === teamMember.teamId\n\n  assert(\n    isAuthUserOwner || isAuthUserAdmin || hasTeamAccess,\n    403,\n    `User does not have access to ${label} \"${model.id ?? userFieldValue}\"`\n  )\n}\n"
  },
  {
    "path": "apps/api/src/lib/auth/auth-storage.ts",
    "content": "export interface AuthStorageAdapter {\n  get(key: string[]): Promise<Record<string, any> | undefined>\n  remove(key: string[]): Promise<void>\n  set(key: string[], value: any, expiry?: Date): Promise<void>\n  scan(prefix: string[]): AsyncIterable<[string[], any]>\n}\n\nconst SEPERATOR = String.fromCodePoint(0x1f)\n\nexport function joinKey(key: string[]) {\n  return key.join(SEPERATOR)\n}\n\nexport function splitKey(key: string) {\n  return key.split(SEPERATOR)\n}\n\nexport namespace AuthStorage {\n  function encode(key: string[]) {\n    return key.map((k) => k.replaceAll(SEPERATOR, ''))\n  }\n  export function get<T>(adapter: AuthStorageAdapter, key: string[]) {\n    return adapter.get(encode(key)) as Promise<T | null>\n  }\n\n  export function set(\n    adapter: AuthStorageAdapter,\n    key: string[],\n    value: any,\n    ttl?: number\n  ) {\n    const expiry = ttl ? new Date(Date.now() + ttl * 1000) : undefined\n    return adapter.set(encode(key), value, expiry)\n  }\n\n  export function remove(adapter: AuthStorageAdapter, key: string[]) {\n    return adapter.remove(encode(key))\n  }\n\n  export function scan<T>(\n    adapter: AuthStorageAdapter,\n    key: string[]\n  ): AsyncIterable<[string[], T]> {\n    return adapter.scan(encode(key))\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/auth/create-auth-token.ts",
    "content": "import { sign } from 'hono/jwt'\n\nimport type { RawUser } from '@/db'\nimport { env } from '@/lib/env'\n\nexport async function createAuthToken(user: RawUser): Promise<string> {\n  return sign(\n    {\n      type: 'user',\n      id: user.id,\n      username: user.username\n    },\n    env.JWT_SECRET\n  )\n}\n"
  },
  {
    "path": "apps/api/src/lib/auth/drizzle-auth-storage.ts",
    "content": "import { and, db, eq, gt, isNull, like, or, schema } from '@/db'\n\nimport { type AuthStorageAdapter, joinKey, splitKey } from './auth-storage'\n\nexport function DrizzleAuthStorage(): AuthStorageAdapter {\n  return {\n    async get(key: string[]) {\n      const id = joinKey(key)\n      const entry = await db.query.authData.findFirst({\n        where: eq(schema.authData.id, id)\n      })\n      if (!entry) return undefined\n\n      if (entry.expiry && Date.now() >= entry.expiry.getTime()) {\n        await db.delete(schema.authData).where(eq(schema.authData.id, id))\n        return undefined\n      }\n\n      return entry.value\n    },\n\n    async set(key: string[], value: Record<string, any>, expiry?: Date) {\n      const id = joinKey(key)\n\n      await db\n        .insert(schema.authData)\n        .values({\n          id,\n          value,\n          expiry\n        })\n        .onConflictDoUpdate({\n          target: schema.authData.id,\n          set: {\n            value,\n            expiry: expiry ?? null\n          }\n        })\n    },\n\n    async remove(key: string[]) {\n      const id = joinKey(key)\n      await db.delete(schema.authData).where(eq(schema.authData.id, id))\n    },\n\n    async *scan(prefix: string[]) {\n      const now = new Date()\n      const idPrefix = joinKey(prefix)\n\n      const entries = await db.query.authData.findMany({\n        where: and(\n          like(schema.authData.id, `${idPrefix}%`),\n          or(isNull(schema.authData.expiry), gt(schema.authData.expiry, now))\n        )\n      })\n\n      for (const entry of entries) {\n        yield [splitKey(entry.id), entry.value]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/auth/upsert-or-link-user-account.ts",
    "content": "import type { SetRequired, Simplify } from 'type-fest'\nimport { assert } from '@agentic/platform-core'\n\nimport { and, db, eq, type RawAccount, type RawUser, schema } from '@/db'\n\nimport { createAvatar } from '../create-avatar'\nimport { getUniqueNamespace } from '../ensure-unique-namespace'\nimport { uploadFileUrlToStorage } from '../storage'\n\n/**\n * After a user completes an authentication flow, we'll have partial account info\n * and partial suer info. This function takes these partial values and maps them\n * to a valid database Account and User.\n *\n * This will result in the Account being upserted, and may result in a new User\n * being created.\n */\nexport async function upsertOrLinkUserAccount({\n  partialAccount,\n  partialUser\n}: {\n  partialAccount: Simplify<\n    SetRequired<\n      Partial<\n        Pick<\n          RawAccount,\n          | 'provider'\n          | 'accountId'\n          | 'accountUsername'\n          | 'accessToken'\n          | 'refreshToken'\n          | 'accessTokenExpiresAt'\n          | 'refreshTokenExpiresAt'\n          | 'scope'\n          | 'password'\n        >\n      >,\n      'provider' | 'accountId'\n    >\n  >\n  partialUser: Simplify<\n    SetRequired<\n      Partial<\n        Pick<\n          RawUser,\n          'email' | 'name' | 'username' | 'image' | 'isEmailVerified'\n        >\n      >,\n      'email'\n    >\n  >\n}): Promise<RawUser> {\n  const { provider, accountId } = partialAccount\n\n  const [existingAccount, existingUser] = await Promise.all([\n    db.query.accounts.findFirst({\n      where: and(\n        eq(schema.accounts.provider, provider),\n        eq(schema.accounts.accountId, accountId)\n      ),\n      with: {\n        user: true\n      }\n    }),\n\n    db.query.users.findFirst({\n      where: eq(schema.users.email, partialUser.email)\n    })\n  ])\n\n  async function resolveUserProfileImage({ prefix }: { prefix: string }) {\n    // Set a default profile image if one isn't provided\n    partialUser.image = await uploadFileUrlToStorage(\n      partialUser.image ?? createAvatar(partialUser.email),\n      {\n        prefix\n      }\n    )\n  }\n\n  if (existingAccount && existingUser) {\n    // Happy path case: the user is just logging in with an existing account\n    // that's already linked to a user.\n    assert(\n      existingAccount.userId === existingUser.id,\n      `Error authenticating with ${provider}: Account id \"${existingAccount.id}\" user id \"${existingAccount.userId}\" does not match expected user id \"${existingUser.id}\"`\n    )\n    assert(provider !== 'password', 500)\n\n    // Update the account with the up-to-date provider data, including any OAuth\n    // tokens.\n    await db\n      .update(schema.accounts)\n      .set(partialAccount)\n      .where(eq(schema.accounts.id, existingAccount.id))\n\n    return existingUser\n  } else if (existingUser && !existingAccount) {\n    // Linking a new account to an existing user\n    await db.insert(schema.accounts).values({\n      ...partialAccount,\n      userId: existingUser.id\n    })\n\n    // TODO: Same caveat as below: if the existing user has a different email than\n    // the one in the account we're linking, we should throw an error unless it's\n    // a \"trusted\" provider.\n    if (provider === 'password' && existingUser.email !== partialUser.email) {\n      await resolveUserProfileImage({ prefix: existingUser.username })\n\n      const [user] = await db\n        .update(schema.users)\n        .set(partialUser)\n        .where(eq(schema.users.id, existingUser.id))\n        .returning()\n      assert(\n        user,\n        500,\n        `Error updating existing user during ${provider} authentication`\n      )\n      return user\n    }\n\n    return existingUser\n  } else if (existingAccount && !existingUser) {\n    assert(\n      existingAccount.user,\n      404,\n      `Error authenticating with ${provider}: Account id \"${existingAccount.id}\" is linked to a user with a different email address than their ${provider} account, but the linked account user id \"${existingAccount.userId}\" is not found.`\n    )\n\n    // Existing account is linked to a user with a different email address than\n    // this provider account. This should be fine since it's pretty common for\n    // users to have multiple email addresses, but we may want to limit the\n    // ability to automatically link accounts like this in the future to only\n    // certain, trusted providers like `better-auth` does.\n    return existingAccount.user\n  } else {\n    const username = await getUniqueNamespace(\n      partialUser.username || partialUser.email.split('@')[0]!.toLowerCase(),\n      { label: 'Username' }\n    )\n\n    await resolveUserProfileImage({ prefix: username })\n\n    // This is a user's first time signing up with the platform, so create both\n    // a new user and linked account.\n    return db.transaction(async (tx) => {\n      // Create a new user\n      const [user] = await tx\n        .insert(schema.users)\n        .values({\n          ...partialUser,\n          username\n        })\n        .returning()\n      assert(\n        user,\n        500,\n        `Error creating new user during ${provider} authentication`\n      )\n\n      // Create a new account linked to the new user\n      await tx.insert(schema.accounts).values({\n        ...partialAccount,\n        userId: user.id\n      })\n\n      return user\n    })\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/billing/create-stripe-checkout-session.ts",
    "content": "import type Stripe from 'stripe'\nimport { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport {\n  getStripePriceIdForPricingPlanLineItem,\n  type RawConsumer,\n  type RawDeployment,\n  type RawProject,\n  type RawUser\n} from '@/db'\nimport { stripe } from '@/lib/external/stripe'\n\nimport { env } from '../env'\n\nexport async function createStripeCheckoutSession(\n  ctx: AuthenticatedHonoContext,\n  {\n    consumer,\n    user,\n    deployment,\n    project,\n    plan\n  }: {\n    consumer: RawConsumer\n    user: RawUser\n    deployment: RawDeployment\n    project: RawProject\n    plan?: string\n  }\n): Promise<{ id: string; url: string }> {\n  const logger = ctx.get('logger')\n  const stripeConnectParams = project._stripeAccountId\n    ? [\n        {\n          stripeAccount: project._stripeAccountId\n        }\n      ]\n    : []\n\n  const stripeCustomerId = consumer._stripeCustomerId || user.stripeCustomerId\n  assert(\n    stripeCustomerId,\n    500,\n    `Missing valid stripe customer. Please contact support for deployment \"${deployment.id}\" and consumer \"${consumer.id}\"`\n  )\n\n  const pricingPlan = plan\n    ? deployment.pricingPlans.find((pricingPlan) => pricingPlan.slug === plan)\n    : undefined\n\n  const action: 'create' | 'update' | 'cancel' = consumer._stripeSubscriptionId\n    ? plan\n      ? 'update'\n      : 'cancel'\n    : 'create'\n\n  // TODO: test cancel => resubscribe flow\n\n  if (consumer._stripeSubscriptionId) {\n    // customer has an existing subscription\n    const existingStripeSubscription = await stripe.subscriptions.retrieve(\n      consumer._stripeSubscriptionId,\n      ...stripeConnectParams\n    )\n    const existingStripeSubscriptionItems =\n      existingStripeSubscription.items.data\n    logger.debug()\n    logger.debug(\n      'existing stripe subscription',\n      JSON.stringify(existingStripeSubscription, null, 2)\n    )\n    logger.debug()\n\n    assert(\n      existingStripeSubscription.metadata?.userId === consumer.userId,\n      500,\n      `Error updating stripe subscription: invalid existing subscription \"${existingStripeSubscription.id}\" metadata.userId for consumer \"${consumer.id}\"`\n    )\n    assert(\n      existingStripeSubscription.metadata?.consumerId === consumer.id,\n      500,\n      `Error updating stripe subscription: invalid existing subscription \"${existingStripeSubscription.id}\" metadata.consumerId for consumer \"${consumer.id}\"`\n    )\n    assert(\n      existingStripeSubscription.metadata?.projectId === project.id,\n      500,\n      `Error updating stripe subscription: invalid existing subscription \"${existingStripeSubscription.id}\" metadata.projectId for consumer \"${consumer.id}\"`\n    )\n\n    if (!plan) {\n      const billingPortalSession = await stripe.billingPortal.sessions.create(\n        {\n          customer: stripeCustomerId,\n          return_url: `${env.AGENTIC_WEB_BASE_URL}/app/consumers`,\n          flow_data: {\n            type: 'subscription_cancel',\n            subscription_cancel: {\n              subscription: consumer._stripeSubscriptionId\n            },\n            after_completion: {\n              type: 'redirect',\n              redirect: {\n                return_url: `${env.AGENTIC_WEB_BASE_URL}/app/consumers/${consumer.id}?checkout=canceled`\n              }\n            }\n          }\n        },\n        ...stripeConnectParams\n      )\n\n      return {\n        id: billingPortalSession.id,\n        url: billingPortalSession.url\n      }\n    }\n\n    assert(\n      pricingPlan,\n      404,\n      `Unable to update stripe subscription for invalid pricing plan \"${plan}\"`\n    )\n\n    const updateParams: Stripe.SubscriptionUpdateParams = {\n      collection_method: 'charge_automatically',\n      description:\n        pricingPlan.description ??\n        `Subscription to ${project.name} ${pricingPlan.name}`,\n      metadata: {\n        plan: plan ?? null,\n        consumerId: consumer.id,\n        userId: consumer.userId,\n        projectId: project.id,\n        deploymentId: deployment.id\n      }\n    }\n\n    const items: Stripe.SubscriptionUpdateParams.Item[] = await Promise.all(\n      pricingPlan.lineItems.map(async (lineItem) => {\n        const priceId = await getStripePriceIdForPricingPlanLineItem({\n          pricingPlan,\n          pricingPlanLineItem: lineItem,\n          project\n        })\n        assert(\n          priceId,\n          500,\n          `Error updating stripe subscription: missing expected Stripe Price for plan \"${pricingPlan.slug}\" line-item \"${lineItem.slug}\"`\n        )\n\n        // An existing Stripe Subscription Item may or may not exist for this\n        // LineItem. It should exist if this is an update to an existing\n        // LineItem. It won't exist if it's a new LineItem.\n        const id = consumer._stripeSubscriptionItemIdMap[lineItem.slug]\n\n        return {\n          price: priceId,\n          id,\n          metadata: {\n            lineItemSlug: lineItem.slug\n          }\n        }\n      })\n    )\n\n    // Sanity check that LineItems we think should exist are all present in\n    // the current subscription's items.\n    for (const item of items) {\n      if (item.id) {\n        const existingItem = existingStripeSubscriptionItems.find(\n          (existingItem) => item.id === existingItem.id\n        )\n\n        assert(\n          existingItem,\n          500,\n          `Error updating stripe subscription: invalid pricing plan \"${plan}\" missing existing Subscription Item for \"${item.id}\"`\n        )\n      }\n    }\n\n    for (const existingItem of existingStripeSubscriptionItems) {\n      const updatedItem = items.find((item) => item.id === existingItem.id)\n\n      if (!updatedItem) {\n        const deletedItem: Stripe.SubscriptionUpdateParams.Item = {\n          id: existingItem.id,\n          deleted: true\n        }\n\n        items.push(deletedItem)\n      }\n    }\n\n    assert(\n      items.length || !plan,\n      500,\n      `Error updating stripe subscription \"${consumer._stripeSubscriptionId}\"`\n    )\n\n    for (const item of items) {\n      if (!item.id) {\n        delete item.id\n      }\n    }\n\n    updateParams.items = items\n\n    if (pricingPlan.trialPeriodDays) {\n      const trialEnd =\n        Math.trunc(Date.now() / 1000) +\n        24 * 60 * 60 * pricingPlan.trialPeriodDays\n\n      // Reuse the existing trial end date if one exists. Otherwise, set a new\n      // one for the updated subscription.\n      updateParams.trial_end = existingStripeSubscription.trial_end ?? trialEnd\n    } else if (existingStripeSubscription.trial_end) {\n      // If the existing subscription has a trial end date, but the updated\n      // subscription doesn't, we should end the trial now.\n      updateParams.trial_end = 'now'\n    }\n\n    logger.info('>>> subscription', action, { items })\n\n    // TODO: Stripe Connect\n    // if (project.isStripeConnectEnabled && project.applicationFeePercent > 0) {\n    //   updateParams.application_fee_percent = project.applicationFeePercent\n    // }\n\n    const subscription = await stripe.subscriptions.update(\n      consumer._stripeSubscriptionId,\n      updateParams,\n      ...stripeConnectParams\n    )\n\n    logger.info('<<< subscription', action, subscription)\n\n    const billingPortalSession = await stripe.billingPortal.sessions.create(\n      {\n        customer: stripeCustomerId,\n        return_url: `${env.AGENTIC_WEB_BASE_URL}/app/consumers`\n      },\n      ...stripeConnectParams\n    )\n\n    return {\n      id: billingPortalSession.id,\n      url: billingPortalSession.url\n    }\n  } else {\n    // Creating a new subscription for this consumer for the first time.\n    assert(\n      pricingPlan,\n      404,\n      `Unable to update stripe subscription for invalid pricing plan \"${plan}\"`\n    )\n\n    const items: Stripe.Checkout.SessionCreateParams.LineItem[] =\n      await Promise.all(\n        pricingPlan.lineItems.map(async (lineItem) => {\n          // An existing Stripe Subscription Item may or may not exist for this\n          // LineItem. It should exist if this is an update to an existing\n          // LineItem. It won't exist if it's a new LineItem.\n          const id = consumer._stripeSubscriptionItemIdMap[lineItem.slug]\n          assert(\n            !id,\n            500,\n            `Error creating stripe subscription: consumer contains a Stripe Subscription Item for LineItem \"${lineItem.slug}\" and pricing plan \"${pricingPlan.slug}\"`\n          )\n\n          const priceId = await getStripePriceIdForPricingPlanLineItem({\n            pricingPlan,\n            pricingPlanLineItem: lineItem,\n            project\n          })\n          assert(\n            priceId,\n            500,\n            `Error creating stripe subscription: missing expected Stripe Price for plan \"${pricingPlan.slug}\" line item \"${lineItem.slug}\"`\n          )\n\n          return {\n            price: priceId,\n            // TODO: Make this customizable\n            quantity: lineItem.usageType === 'licensed' ? 1 : undefined\n            // metadata: {\n            //   lineItemSlug: lineItem.slug\n            // }\n          } satisfies Stripe.Checkout.SessionCreateParams.LineItem\n        })\n      )\n\n    assert(\n      items.length,\n      500,\n      `Error creating stripe subscription: invalid plan \"${plan}\"`\n    )\n\n    const checkoutSessionParams: Stripe.Checkout.SessionCreateParams = {\n      customer: stripeCustomerId,\n      mode: 'subscription',\n      line_items: items,\n      success_url: `${env.AGENTIC_WEB_BASE_URL}/app/consumers/${consumer.id}?checkout=success&plan=${plan}`,\n      cancel_url: `${env.AGENTIC_WEB_BASE_URL}/marketplace/projects/${project.identifier}?checkout=canceled`,\n      submit_type: 'subscribe',\n      saved_payment_method_options: {\n        payment_method_save: 'enabled'\n      },\n      subscription_data: {\n        description:\n          pricingPlan.description ??\n          `Subscription to ${project.name} ${pricingPlan.name}`,\n        trial_period_days: pricingPlan.trialPeriodDays,\n        metadata: {\n          plan: plan ?? null,\n          consumerId: consumer.id,\n          userId: consumer.userId,\n          projectId: project.id,\n          deploymentId: deployment.id\n        }\n        // TODO: Stripe Connect\n        // application_fee_percent: project.applicationFeePercent\n      },\n      // TODO: coupons\n      // coupon: filterConsumerCoupon(ctx, consumer, deployment),\n      // TODO: discounts\n      // collection_method: 'charge_automatically',\n      // TODO: consider custom_fields\n      // TODO: consider custom_text\n      // TODO: consider optional_items\n      metadata: {\n        plan: plan ?? null,\n        consumerId: consumer.id,\n        userId: consumer.userId,\n        projectId: project.id,\n        deploymentId: deployment.id\n      }\n    }\n\n    // TODO: Stripe Connect\n    // if (project.isStripeConnectEnabled && project.applicationFeePercent > 0) {\n    //   createParams.application_fee_percent = project.applicationFeePercent\n    // }\n\n    logger.debug('checkout session line_items', items)\n    const checkoutSession = await stripe.checkout.sessions.create(\n      checkoutSessionParams,\n      ...stripeConnectParams\n    )\n    assert(checkoutSession.url, 500, 'Missing stripe checkout session URL')\n\n    return {\n      id: checkoutSession.id,\n      url: checkoutSession.url\n    }\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/billing/upsert-stripe-connect-customer.ts",
    "content": "import type Stripe from 'stripe'\nimport { assert } from '@agentic/platform-core'\n\nimport { db, eq, type RawConsumer, type RawProject, schema } from '@/db'\nimport { stripe } from '@/lib/external/stripe'\n\n// TODO: Update this for the new / updated Stripe Connect API\n\nexport async function upsertStripeConnectCustomer({\n  stripeCustomer,\n  consumer,\n  project\n}: {\n  stripeCustomer: Stripe.Customer\n  consumer: RawConsumer\n  project: RawProject\n}): Promise<Stripe.Customer | undefined> {\n  if (!project._stripeAccountId) {\n    return stripeCustomer\n  }\n\n  const stripeConnectParams = project._stripeAccountId\n    ? [\n        {\n          stripeAccount: project._stripeAccountId\n        }\n      ]\n    : []\n\n  const stripeConnectCustomer = consumer._stripeCustomerId\n    ? await stripe.customers.retrieve(\n        consumer._stripeCustomerId,\n        ...stripeConnectParams\n      )\n    : await stripe.customers.create(\n        {\n          email: stripeCustomer.email!,\n          metadata: stripeCustomer.metadata\n        },\n        ...stripeConnectParams\n      )\n  assert(\n    stripeConnectCustomer,\n    500,\n    `Failed to create stripe connect customer for user \"${consumer.userId}\"`\n  )\n  assert(\n    !stripeConnectCustomer.deleted,\n    500,\n    `Stripe connect customer \"${stripeConnectCustomer.id}\" has been deleted`\n  )\n\n  if (consumer._stripeCustomerId !== stripeConnectCustomer.id) {\n    consumer._stripeCustomerId = stripeConnectCustomer.id\n\n    await db\n      .update(schema.consumers)\n      .set({ _stripeCustomerId: stripeConnectCustomer.id })\n      .where(eq(schema.consumers.id, consumer.id))\n  }\n\n  // TODO: Ensure stripe connect default \"source\" exists and is cloned from\n  // platform stripe account.\n\n  return stripeConnectCustomer\n}\n"
  },
  {
    "path": "apps/api/src/lib/billing/upsert-stripe-customer.ts",
    "content": "import type Stripe from 'stripe'\nimport { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport { db, eq, type RawUser, schema } from '@/db'\nimport { ensureAuthUser } from '@/lib/ensure-auth-user'\nimport { stripe } from '@/lib/external/stripe'\n\nexport async function upsertStripeCustomer(\n  ctx: AuthenticatedHonoContext\n): Promise<{\n  user: RawUser\n  stripeCustomer: Stripe.Customer\n}> {\n  const user = await ensureAuthUser(ctx)\n\n  if (user.stripeCustomerId) {\n    const stripeCustomer = await stripe.customers.retrieve(\n      user.stripeCustomerId\n    )\n    assert(\n      stripeCustomer,\n      404,\n      `Stripe customer \"${user.stripeCustomerId}\" not found for user \"${user.id}\"`\n    )\n\n    // TODO: handle this edge case\n    assert(\n      !stripeCustomer.deleted,\n      404,\n      `Stripe customer \"${user.stripeCustomerId}\" is deleted for user \"${user.id}\"`\n    )\n\n    return {\n      user,\n      stripeCustomer\n    }\n  }\n\n  // TODO: add more metadata referencing signup LogEntry\n  const metadata = {\n    userId: user.id,\n    email: user.email,\n    username: user.username ?? null\n  }\n\n  const stripeCustomer = await stripe.customers.create({\n    email: user.email,\n    metadata\n  })\n  assert(\n    stripeCustomer,\n    500,\n    `Failed to create stripe customer for user \"${user.id}\"`\n  )\n\n  user.stripeCustomerId = stripeCustomer.id\n  await db\n    .update(schema.users)\n    .set({ stripeCustomerId: stripeCustomer.id })\n    .where(eq(schema.users.id, user.id))\n\n  return {\n    user,\n    stripeCustomer\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/billing/upsert-stripe-pricing-resources.ts",
    "content": "import type Stripe from 'stripe'\nimport { assert } from '@agentic/platform-core'\nimport {\n  getLabelForPricingInterval,\n  type PricingPlan,\n  type PricingPlanLineItem\n} from '@agentic/platform-types'\nimport pAll from 'p-all'\n\nimport {\n  db,\n  eq,\n  getPricingPlanLineItemHashForStripePrice,\n  type RawDeployment,\n  type RawProject,\n  schema\n} from '@/db'\nimport { stripe } from '@/lib/external/stripe'\n\n/**\n * Upserts all the Stripe resources corresponding to a Deployment's pricing\n * plans.\n *\n * This includes Stripe `Product`, `Meter`, and `Price` objects.\n *\n * All Stripe resource IDs are stored in the `_stripeProductIdMap`,\n * `_stripeMeterIdMap`, and `_stripePriceIdMap` fields of the given `project`.\n *\n * The `project` will be updated in the DB with any changes.\n *\n * The `deployment` is readonly and will not be updated, since all Stripe\n * resources persist on its Project so they can be reused if possible across\n * deployments.\n *\n * @note This function assumes that the deployment's pricing config has already\n * been validated.\n */\nexport async function upsertStripePricingResources({\n  deployment,\n  project\n}: {\n  deployment: Readonly<RawDeployment>\n  project: RawProject\n}): Promise<void> {\n  assert(\n    deployment.projectId === project.id,\n    'Deployment and project must match'\n  )\n\n  // Keep track of promises for Stripe resources that are created in parallel\n  // to avoid race conditions.\n  const stripeProductIdPromiseMap = new Map<string, Promise<string>>()\n  const stripeMeterIdPromiseMap = new Map<string, Promise<string>>()\n  const stripePriceIdPromiseMap = new Map<string, Promise<string>>()\n\n  const stripeConnectParams = project._stripeAccountId\n    ? [\n        {\n          stripeAccount: project._stripeAccountId\n        }\n      ]\n    : []\n  let dirty = false\n\n  async function upsertStripeResourcesForPricingPlanLineItem({\n    pricingPlan,\n    pricingPlanLineItem\n  }: {\n    pricingPlan: PricingPlan\n    pricingPlanLineItem: PricingPlanLineItem\n  }) {\n    const { slug: pricingPlanSlug } = pricingPlan\n    const { slug: pricingPlanLineItemSlug } = pricingPlanLineItem\n\n    // Upsert the Stripe Product\n    if (!project._stripeProductIdMap[pricingPlanLineItemSlug]) {\n      if (stripeProductIdPromiseMap.has(pricingPlanLineItemSlug)) {\n        const stripeProductId = await stripeProductIdPromiseMap.get(\n          pricingPlanLineItemSlug\n        )!\n\n        project._stripeProductIdMap[pricingPlanLineItemSlug] = stripeProductId\n        dirty = true\n      } else {\n        const productParams: Stripe.ProductCreateParams = {\n          name: `${project.identifier} ${pricingPlanLineItemSlug}`,\n          type: 'service',\n          metadata: {\n            projectId: project.id,\n            pricingPlanLineItemSlug\n          }\n        }\n\n        if (pricingPlanLineItem.usageType === 'licensed') {\n          productParams.unit_label = pricingPlanLineItem.label\n        } else {\n          productParams.unit_label = pricingPlanLineItem.unitLabel\n        }\n\n        const productP = stripe.products.create(\n          productParams,\n          ...stripeConnectParams\n        )\n        stripeProductIdPromiseMap.set(\n          pricingPlanLineItemSlug,\n          productP.then((p) => p.id)\n        )\n\n        const product = await productP\n\n        project._stripeProductIdMap[pricingPlanLineItemSlug] = product.id\n        dirty = true\n      }\n    }\n\n    assert(project._stripeProductIdMap[pricingPlanLineItemSlug])\n\n    if (pricingPlanLineItem.usageType === 'metered') {\n      // Upsert the Stripe Meter\n      if (!project._stripeMeterIdMap[pricingPlanLineItemSlug]) {\n        if (stripeMeterIdPromiseMap.has(pricingPlanLineItemSlug)) {\n          const stripeMeterId = await stripeMeterIdPromiseMap.get(\n            pricingPlanLineItemSlug\n          )!\n\n          project._stripeMeterIdMap[pricingPlanLineItemSlug] = stripeMeterId\n          dirty = true\n        } else {\n          const meterP = stripe.billing.meters.create(\n            {\n              display_name: `${project.identifier} ${pricingPlanLineItem.label || pricingPlanLineItemSlug}`,\n              event_name: `meter-${project.id}-${pricingPlanLineItemSlug}`,\n              // TODO: This currently isn't taken into account for the slug, so if it\n              // changes across deployments, the meter will not be updated.\n              default_aggregation: {\n                formula:\n                  pricingPlanLineItem.defaultAggregation?.formula ?? 'sum'\n              },\n              customer_mapping: {\n                event_payload_key: 'stripe_customer_id',\n                type: 'by_id'\n              },\n              value_settings: {\n                event_payload_key: 'value'\n              }\n            },\n            ...stripeConnectParams\n          )\n\n          stripeMeterIdPromiseMap.set(\n            pricingPlanLineItemSlug,\n            meterP.then((m) => m.id)\n          )\n\n          const stripeMeter = await meterP\n\n          project._stripeMeterIdMap[pricingPlanLineItemSlug] = stripeMeter.id\n          dirty = true\n        }\n      }\n\n      assert(project._stripeMeterIdMap[pricingPlanLineItemSlug])\n    } else {\n      assert(pricingPlanLineItem.usageType === 'licensed', 400)\n\n      assert(\n        !project._stripeMeterIdMap[pricingPlanLineItemSlug],\n        400,\n        `Invalid pricing plan metric \"${pricingPlanLineItemSlug}\" for pricing plan \"${pricingPlanSlug}\": licensed pricing plan metrics cannot replace a previous metered pricing plan metric. Use a different pricing plan metric slug for the new licensed plan.`\n      )\n    }\n\n    const pricingPlanLineItemHashForStripePrice =\n      await getPricingPlanLineItemHashForStripePrice({\n        pricingPlan,\n        pricingPlanLineItem,\n        project\n      })\n\n    // Upsert the Stripe Price\n    if (!project._stripePriceIdMap[pricingPlanLineItemHashForStripePrice]) {\n      if (stripePriceIdPromiseMap.has(pricingPlanLineItemHashForStripePrice)) {\n        const stripePriceId = await stripePriceIdPromiseMap.get(\n          pricingPlanLineItemHashForStripePrice\n        )!\n\n        project._stripePriceIdMap[pricingPlanLineItemHashForStripePrice] =\n          stripePriceId\n        dirty = true\n      } else {\n        const interval = pricingPlan.interval ?? project.defaultPricingInterval\n\n        // (nickname is hidden from customers)\n        const nickname = [\n          'price',\n          project.id,\n          pricingPlanLineItemSlug,\n          getLabelForPricingInterval(interval)\n        ]\n          .filter(Boolean)\n          .join('-')\n\n        const priceParams: Stripe.PriceCreateParams = {\n          product: project._stripeProductIdMap[pricingPlanLineItemSlug],\n          currency: project.pricingCurrency,\n          nickname,\n          recurring: {\n            interval,\n\n            // TODO: support this\n            interval_count: 1,\n\n            usage_type: pricingPlanLineItem.usageType,\n\n            meter: project._stripeMeterIdMap[pricingPlanLineItemSlug]\n          },\n          metadata: {\n            projectId: project.id,\n            pricingPlanLineItemSlug\n          }\n        }\n\n        if (pricingPlanLineItem.usageType === 'licensed') {\n          priceParams.unit_amount_decimal =\n            pricingPlanLineItem.amount.toFixed(12)\n        } else {\n          priceParams.billing_scheme = pricingPlanLineItem.billingScheme\n\n          if (pricingPlanLineItem.billingScheme === 'tiered') {\n            assert(\n              pricingPlanLineItem.tiers?.length,\n              400,\n              `Invalid pricing plan metric \"${pricingPlanLineItemSlug}\" for pricing plan \"${pricingPlanSlug}\": tiered billing schemes must have at least one tier.`\n            )\n\n            priceParams.tiers_mode = pricingPlanLineItem.tiersMode\n            priceParams.tiers = pricingPlanLineItem.tiers.map((tierData) => {\n              const tier: Stripe.PriceCreateParams.Tier = {\n                up_to: tierData.upTo\n              }\n\n              if (tierData.unitAmount !== undefined) {\n                tier.unit_amount_decimal = tierData.unitAmount.toFixed(12)\n              }\n\n              if (tierData.flatAmount !== undefined) {\n                tier.flat_amount_decimal = tierData.flatAmount.toFixed(12)\n              }\n\n              return tier\n            })\n          } else {\n            assert(\n              pricingPlanLineItem.billingScheme === 'per_unit',\n              400,\n              `Invalid pricing plan metric \"${pricingPlanLineItemSlug}\" for pricing plan \"${pricingPlanSlug}\": invalid billing scheme.`\n            )\n            assert(\n              pricingPlanLineItem.unitAmount !== undefined,\n              400,\n              `Invalid pricing plan metric \"${pricingPlanLineItemSlug}\" for pricing plan \"${pricingPlanSlug}\": unitAmount is required for per_unit billing schemes.`\n            )\n\n            priceParams.unit_amount_decimal =\n              pricingPlanLineItem.unitAmount.toFixed(12)\n\n            if (pricingPlanLineItem.transformQuantity) {\n              priceParams.transform_quantity = {\n                divide_by: pricingPlanLineItem.transformQuantity.divideBy,\n                round: pricingPlanLineItem.transformQuantity.round\n              }\n            }\n          }\n        }\n\n        const stripePriceP = stripe.prices.create(\n          priceParams,\n          ...stripeConnectParams\n        )\n\n        stripePriceIdPromiseMap.set(\n          pricingPlanLineItemHashForStripePrice,\n          stripePriceP.then((p) => p.id)\n        )\n\n        const stripePrice = await stripePriceP\n\n        project._stripePriceIdMap[pricingPlanLineItemHashForStripePrice] =\n          stripePrice.id\n        dirty = true\n      }\n    }\n\n    assert(project._stripePriceIdMap[pricingPlanLineItemHashForStripePrice])\n  }\n\n  const upserts: Array<() => Promise<void>> = []\n  for (const pricingPlan of deployment.pricingPlans) {\n    for (const pricingPlanLineItem of pricingPlan.lineItems) {\n      upserts.push(() =>\n        upsertStripeResourcesForPricingPlanLineItem({\n          pricingPlan,\n          pricingPlanLineItem\n        })\n      )\n    }\n  }\n\n  await pAll(upserts, { concurrency: 8 })\n\n  if (dirty) {\n    await db\n      .update(schema.projects)\n      .set(project)\n      .where(eq(schema.projects.id, project.id))\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/billing/upsert-stripe-subscription.ts",
    "content": "import type Stripe from 'stripe'\nimport { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport {\n  db,\n  eq,\n  getStripePriceIdForPricingPlanLineItem,\n  type RawConsumer,\n  type RawConsumerUpdate,\n  type RawDeployment,\n  type RawProject,\n  type RawUser,\n  schema\n} from '@/db'\nimport { stripe } from '@/lib/external/stripe'\n\nimport { setConsumerStripeSubscriptionStatus } from '../consumers/utils'\n\nexport async function upsertStripeSubscription(\n  ctx: AuthenticatedHonoContext,\n  {\n    consumer,\n    user,\n    deployment,\n    project\n  }: {\n    consumer: RawConsumer\n    user: RawUser\n    deployment: RawDeployment\n    project: RawProject\n  }\n): Promise<{\n  subscription: Stripe.Subscription\n  consumer: RawConsumer\n}> {\n  const logger = ctx.get('logger')\n  const stripeConnectParams = project._stripeAccountId\n    ? [\n        {\n          stripeAccount: project._stripeAccountId\n        }\n      ]\n    : []\n\n  const stripeCustomerId = consumer._stripeCustomerId || user.stripeCustomerId\n  assert(\n    stripeCustomerId,\n    500,\n    `Missing valid stripe customer. Please contact support for deployment \"${deployment.id}\" and consumer \"${consumer.id}\"`\n  )\n\n  const { plan } = consumer\n  const pricingPlan = plan\n    ? deployment.pricingPlans.find((pricingPlan) => pricingPlan.slug === plan)\n    : undefined\n\n  const action: 'create' | 'update' | 'cancel' = consumer._stripeSubscriptionId\n    ? plan\n      ? 'update'\n      : 'cancel'\n    : 'create'\n  let subscription: Stripe.Subscription | undefined\n\n  if (consumer._stripeSubscriptionId) {\n    // customer has an existing subscription\n    const existingStripeSubscription = await stripe.subscriptions.retrieve(\n      consumer._stripeSubscriptionId,\n      ...stripeConnectParams\n    )\n    const existingStripeSubscriptionItems =\n      existingStripeSubscription.items.data\n    logger.debug()\n    logger.debug(\n      'existing stripe subscription',\n      JSON.stringify(existingStripeSubscription, null, 2)\n    )\n    logger.debug()\n\n    assert(\n      existingStripeSubscription.metadata?.userId === consumer.userId,\n      500,\n      `Error updating stripe subscription: invalid existing subscription \"${existingStripeSubscription.id}\" metadata.userId for consumer \"${consumer.id}\"`\n    )\n    assert(\n      existingStripeSubscription.metadata?.consumerId === consumer.id,\n      500,\n      `Error updating stripe subscription: invalid existing subscription \"${existingStripeSubscription.id}\" metadata.consumerId for consumer \"${consumer.id}\"`\n    )\n    assert(\n      existingStripeSubscription.metadata?.projectId === project.id,\n      500,\n      `Error updating stripe subscription: invalid existing subscription \"${existingStripeSubscription.id}\" metadata.projectId for consumer \"${consumer.id}\"`\n    )\n\n    const updateParams: Stripe.SubscriptionUpdateParams = {\n      collection_method: 'charge_automatically',\n      metadata: {\n        plan: plan ?? null,\n        userId: consumer.userId,\n        consumerId: consumer.id,\n        projectId: project.id,\n        deploymentId: deployment.id\n      }\n    }\n\n    if (plan) {\n      assert(\n        pricingPlan,\n        404,\n        `Unable to update stripe subscription for invalid pricing plan \"${plan}\"`\n      )\n\n      const items: Stripe.SubscriptionUpdateParams.Item[] = await Promise.all(\n        pricingPlan.lineItems.map(async (lineItem) => {\n          const priceId = await getStripePriceIdForPricingPlanLineItem({\n            pricingPlan,\n            pricingPlanLineItem: lineItem,\n            project\n          })\n          assert(\n            priceId,\n            500,\n            `Error updating stripe subscription: missing expected Stripe Price for plan \"${pricingPlan.slug}\" line-item \"${lineItem.slug}\"`\n          )\n\n          // An existing Stripe Subscription Item may or may not exist for this\n          // LineItem. It should exist if this is an update to an existing\n          // LineItem. It won't exist if it's a new LineItem.\n          const id = consumer._stripeSubscriptionItemIdMap[lineItem.slug]\n\n          return {\n            price: priceId,\n            id,\n            metadata: {\n              lineItemSlug: lineItem.slug\n            }\n          }\n        })\n      )\n\n      // Sanity check that LineItems we think should exist are all present in\n      // the current subscription's items.\n      for (const item of items) {\n        if (item.id) {\n          const existingItem = existingStripeSubscriptionItems.find(\n            (existingItem) => item.id === existingItem.id\n          )\n\n          assert(\n            existingItem,\n            500,\n            `Error updating stripe subscription: invalid pricing plan \"${plan}\" missing existing Subscription Item for \"${item.id}\"`\n          )\n        }\n      }\n\n      for (const existingItem of existingStripeSubscriptionItems) {\n        const updatedItem = items.find((item) => item.id === existingItem.id)\n\n        if (!updatedItem) {\n          const deletedItem: Stripe.SubscriptionUpdateParams.Item = {\n            id: existingItem.id,\n            deleted: true\n          }\n\n          items.push(deletedItem)\n        }\n      }\n\n      assert(\n        items.length || !plan,\n        500,\n        `Error updating stripe subscription \"${consumer._stripeSubscriptionId}\"`\n      )\n\n      for (const item of items) {\n        if (!item.id) {\n          delete item.id\n        }\n      }\n\n      updateParams.items = items\n\n      if (pricingPlan.trialPeriodDays) {\n        const trialEnd =\n          Math.trunc(Date.now() / 1000) +\n          24 * 60 * 60 * pricingPlan.trialPeriodDays\n\n        // Reuse the existing trial end date if one exists. Otherwise, set a new\n        // one for the updated subscription.\n        updateParams.trial_end =\n          existingStripeSubscription.trial_end ?? trialEnd\n      } else if (existingStripeSubscription.trial_end) {\n        // If the existing subscription has a trial end date, but the updated\n        // subscription doesn't, we should end the trial now.\n        updateParams.trial_end = 'now'\n      }\n\n      logger.debug('subscription', action, { items })\n    } else {\n      updateParams.cancel_at_period_end = true\n    }\n\n    // TODO: Stripe Connect\n    // if (project.isStripeConnectEnabled && project.applicationFeePercent > 0) {\n    //   updateParams.application_fee_percent = project.applicationFeePercent\n    // }\n\n    subscription = await stripe.subscriptions.update(\n      consumer._stripeSubscriptionId,\n      updateParams,\n      ...stripeConnectParams\n    )\n\n    // TODO: this will cancel the subscription without resolving current usage / invoices\n    // await stripe.subscriptions.del(consumer.stripeSubscription)\n  } else {\n    // Creating a new subscription for this consumer for the first time.\n    assert(\n      pricingPlan,\n      404,\n      `Unable to update stripe subscription for invalid pricing plan \"${plan}\"`\n    )\n\n    const items: Stripe.SubscriptionCreateParams.Item[] = await Promise.all(\n      pricingPlan.lineItems.map(async (lineItem) => {\n        const priceId = await getStripePriceIdForPricingPlanLineItem({\n          pricingPlan,\n          pricingPlanLineItem: lineItem,\n          project\n        })\n        assert(\n          priceId,\n          500,\n          `Error creating stripe subscription: missing expected Stripe Price for plan \"${pricingPlan.slug}\" line item \"${lineItem.slug}\"`\n        )\n\n        // An existing Stripe Subscription Item may or may not exist for this\n        // LineItem. It should exist if this is an update to an existing\n        // LineItem. It won't exist if it's a new LineItem.\n        const id = consumer._stripeSubscriptionItemIdMap[lineItem.slug]\n        assert(\n          !id,\n          500,\n          `Error creating stripe subscription: consumer contains a Stripe Subscription Item for LineItem \"${lineItem.slug}\" and pricing plan \"${pricingPlan.slug}\"`\n        )\n\n        return {\n          price: priceId,\n          metadata: {\n            lineItemSlug: lineItem.slug\n          }\n        }\n      })\n    )\n\n    assert(\n      items.length,\n      500,\n      `Error creating stripe subscription: invalid plan \"${plan}\"`\n    )\n\n    const createParams: Stripe.SubscriptionCreateParams = {\n      customer: stripeCustomerId,\n      description: `Agentic subscription to project \"${project.identifier}\"`,\n      // TODO: coupons\n      // coupon: filterConsumerCoupon(ctx, consumer, deployment),\n      items,\n      // collection_method: 'charge_automatically',\n      metadata: {\n        plan: plan ?? null,\n        consumerId: consumer.id,\n        userId: consumer.userId,\n        projectId: project.id,\n        deploymentId: deployment.id\n      }\n    }\n\n    if (pricingPlan.trialPeriodDays) {\n      createParams.trial_period_days = pricingPlan.trialPeriodDays\n    }\n\n    // TODO: Stripe Connect\n    // if (project.isStripeConnectEnabled && project.applicationFeePercent > 0) {\n    //   createParams.application_fee_percent = project.applicationFeePercent\n    // }\n\n    logger.debug('subscription', action, { items })\n    subscription = await stripe.subscriptions.create(\n      createParams,\n      ...stripeConnectParams\n    )\n\n    consumer._stripeSubscriptionId = subscription.id\n  }\n\n  // ----------------------------------------------------\n  // Same codepath for updating, creating, and cancelling\n  // ----------------------------------------------------\n\n  assert(subscription, 500, 'Missing stripe subscription')\n  logger.debug('subscription', subscription)\n\n  const consumerUpdate: RawConsumerUpdate = consumer\n  consumerUpdate.stripeStatus = subscription.status\n  setConsumerStripeSubscriptionStatus(consumerUpdate)\n\n  // if (!plan) {\n  // TODO: we cancel at the end of the billing interval, so we shouldn't\n  // invalidate the stripe subscription just yet. That should happen via\n  // webhook. And we should never set `_stripeSubscriptionId` to `null`.\n  // consumerUpdate._stripeSubscriptionId = null\n  // consumerUpdate.stripeStatus = 'cancelled'\n  // }\n\n  if (pricingPlan) {\n    for (const lineItem of pricingPlan.lineItems) {\n      const stripeSubscriptionItemId =\n        consumer._stripeSubscriptionItemIdMap[lineItem.slug]\n\n      const stripeSubscriptionItem: Stripe.SubscriptionItem | undefined =\n        subscription.items.data.find((item) =>\n          stripeSubscriptionItemId\n            ? item.id === stripeSubscriptionItemId\n            : item.metadata?.lineItemSlug === lineItem.slug\n        )\n\n      assert(\n        stripeSubscriptionItem,\n        500,\n        `Error post-processing stripe subscription for line-item \"${lineItem.slug}\" on plan \"${pricingPlan.slug}\"`\n      )\n\n      consumerUpdate._stripeSubscriptionItemIdMap![lineItem.slug] =\n        stripeSubscriptionItem.id\n      assert(\n        consumerUpdate._stripeSubscriptionItemIdMap![lineItem.slug],\n        500,\n        `Error post-processing stripe subscription for line-item \"${lineItem.slug}\" on plan \"${pricingPlan.slug}\"`\n      )\n    }\n  }\n\n  logger.debug()\n  logger.debug('consumer update', consumerUpdate)\n\n  const [updatedConsumer] = await db\n    .update(schema.consumers)\n    .set(consumerUpdate)\n    .where(eq(schema.consumers.id, consumer.id))\n    .returning()\n  assert(updatedConsumer, 500, 'Error updating consumer')\n\n  // await auditLog.createStripeSubscriptionLogEntry(ctx, {\n  //   consumer,\n  //   user,\n  //   plan: consumer.plan,\n  //   subtype: action\n  // })\n\n  return {\n    subscription,\n    consumer: updatedConsumer\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/cache-control.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nexport type PublicCacheControlLevels =\n  | '1s'\n  | '10s'\n  | '30s'\n  | '1m'\n  | '5m'\n  | '10m'\n  | '30m'\n  | '1h'\n  | '1d'\n\nconst publicCacheControlLevelsMap: Record<PublicCacheControlLevels, string> = {\n  '1s': 'public, max-age=1, s-maxage=1 stale-while-revalidate=0',\n  '10s': 'public, max-age=10, s-maxage=10 stale-while-revalidate=1',\n  '30s': 'public, max-age=30, s-maxage=30 stale-while-revalidate=5',\n  '1m': 'public, max-age=60, s-maxage=60 stale-while-revalidate=10',\n  '5m': 'public, max-age=300, s-maxage=300 stale-while-revalidate=60',\n  '10m': 'public, max-age=600, s-maxage=600 stale-while-revalidate=120',\n  '30m': 'public, max-age=1800, s-maxage=1800 stale-while-revalidate=300',\n  '1h': 'public, max-age=3600, s-maxage=3600, stale-while-revalidate=500',\n  '1d': 'public, max-age=86400, s-maxage=86400, stale-while-revalidate=3600'\n}\n\nexport function setPublicCacheControl(\n  res: Response,\n  level: PublicCacheControlLevels\n) {\n  const cacheControl = publicCacheControlLevelsMap[level]\n  assert(cacheControl, `Invalid cache control level \"${level}\"`)\n\n  res.headers.set('cache-control', cacheControl)\n}\n"
  },
  {
    "path": "apps/api/src/lib/consumers/upsert-consumer-stripe-checkout.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport {\n  and,\n  db,\n  eq,\n  type RawConsumer,\n  type RawDeployment,\n  type RawProject,\n  schema\n} from '@/db'\nimport { acl } from '@/lib/acl'\nimport { upsertStripeConnectCustomer } from '@/lib/billing/upsert-stripe-connect-customer'\nimport { upsertStripeCustomer } from '@/lib/billing/upsert-stripe-customer'\nimport { upsertStripePricingResources } from '@/lib/billing/upsert-stripe-pricing-resources'\nimport { createConsumerApiKey } from '@/lib/create-consumer-api-key'\n\nimport { aclPublicProject } from '../acl-public-project'\nimport { createStripeCheckoutSession } from '../billing/create-stripe-checkout-session'\n\nexport async function upsertConsumerStripeCheckout(\n  c: AuthenticatedHonoContext,\n  {\n    plan,\n    deploymentId,\n    consumerId\n  }: {\n    plan?: string\n    deploymentId?: string\n    consumerId?: string\n  }\n): Promise<{\n  checkoutSession: { id: string; url: string }\n  consumer: RawConsumer\n}> {\n  assert(\n    consumerId || deploymentId,\n    400,\n    'Internal error: upsertConsumerStripeCheckout missing required \"deploymentId\" or \"consumerId\"'\n  )\n  const logger = c.get('logger')\n  const userId = c.get('userId')\n  let deployment: RawDeployment | undefined\n  let project: RawProject | undefined\n  let projectId: string | undefined\n\n  logger.info('upsertConsumerStripeCheckout', {\n    plan,\n    deploymentId,\n    consumerId\n  })\n\n  async function initDeploymentAndProject() {\n    assert(deploymentId, 400, 'Missing required \"deploymentId\"')\n    if (deployment && project) {\n      // Already initialized\n      return\n    }\n\n    deployment = await db.query.deployments.findFirst({\n      where: eq(schema.deployments.id, deploymentId),\n      with: {\n        project: true\n      }\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentId}\"`)\n\n    project = deployment.project!\n    assert(\n      project,\n      404,\n      `Project not found \"${projectId}\" for deployment \"${deploymentId}\"`\n    )\n    aclPublicProject(project)\n\n    // Validate the deployment only after we're sure the project is publicly\n    // accessible.\n    assert(\n      !deployment.deletedAt,\n      410,\n      `Deployment has been deleted by its owner \"${deployment.id}\"`\n    )\n\n    projectId = project.id\n  }\n\n  if (deploymentId) {\n    await initDeploymentAndProject()\n  }\n\n  if (!consumerId) {\n    assert(projectId, 400, 'Missing required \"projectId\"')\n  }\n\n  const [{ user, stripeCustomer }, existingConsumer] = await Promise.all([\n    upsertStripeCustomer(c),\n\n    db.query.consumers.findFirst({\n      where: consumerId\n        ? eq(schema.consumers.id, consumerId)\n        : and(\n            eq(schema.consumers.userId, userId),\n            eq(schema.consumers.projectId, projectId!)\n          )\n    })\n  ])\n\n  if (consumerId) {\n    assert(existingConsumer, 404, `Consumer not found \"${consumerId}\"`)\n    assert(existingConsumer.id === consumerId, 403)\n    await acl(c, existingConsumer, { label: 'Consumer' })\n\n    if (projectId) {\n      assert(\n        existingConsumer.projectId === projectId,\n        400,\n        `Deployment \"${deploymentId}\" does not belong to project \"${existingConsumer.projectId}\" for consumer \"${consumerId}\"`\n      )\n    }\n\n    deploymentId ??= existingConsumer.deploymentId\n    projectId ??= existingConsumer.projectId\n  }\n\n  assert(deploymentId)\n  assert(projectId)\n\n  assert(\n    !existingConsumer ||\n      !existingConsumer.isStripeSubscriptionActive ||\n      existingConsumer.plan !== plan ||\n      existingConsumer.deploymentId !== deploymentId,\n    409,\n\n    plan\n      ? `User \"${user.email}\" already has an active subscription to plan \"${plan}\" for project \"${projectId}\"`\n      : `User \"${user.email}\" already has cancelled their subscription for project \"${projectId}\"`\n  )\n\n  await initDeploymentAndProject()\n  assert(deployment, 500, `Error getting deployment \"${deploymentId}\"`)\n  assert(project, 500, `Error getting project \"${projectId}\"`)\n\n  if (plan) {\n    const pricingPlan = deployment.pricingPlans.find((p) => p.slug === plan)\n    assert(\n      pricingPlan,\n      400,\n      `Pricing plan \"${plan}\" not found for deployment \"${deploymentId}\"`\n    )\n  }\n\n  let consumer = existingConsumer\n\n  if (consumer) {\n    // Don't update the consumer until the checkout session is completed\n    // successfully.\n    // ;[consumer] = await db\n    //   .update(schema.consumers)\n    //   .set({\n    //     plan,\n    //     deploymentId\n    //   })\n    //   .where(eq(schema.consumers.id, consumer.id))\n    //   .returning()\n  } else {\n    // Create a new consumer, but don't set the plan yet until the checkout\n    // session is completed successfully.\n    ;[consumer] = await db\n      .insert(schema.consumers)\n      .values({\n        // plan,\n        userId,\n        projectId,\n        deploymentId,\n        token: await createConsumerApiKey(),\n        _stripeCustomerId: stripeCustomer.id\n      })\n      .returning()\n  }\n\n  assert(\n    consumer,\n    500,\n    'Internal error: upsertConsumerStripeCheckout error creating consumer'\n  )\n\n  // Ensure that all Stripe pricing resources exist for this deployment\n  await upsertStripePricingResources({ deployment, project })\n\n  // Ensure that customer and default source are created on the stripe connect account\n  // TODO: is this necessary?\n  // consumer._stripeAccount = project._stripeAccount\n  // TODO: this function may mutate `consumer`\n  await upsertStripeConnectCustomer({ stripeCustomer, consumer, project })\n\n  logger.info(\n    'CONSUMER STRIPE CHECKOUT',\n    existingConsumer ? 'UPDATE' : 'CREATE',\n    {\n      project,\n      deployment,\n      consumer\n    }\n  )\n\n  const checkoutSession = await createStripeCheckoutSession(c, {\n    consumer,\n    user,\n    project,\n    deployment,\n    plan\n  })\n  logger.info('checkout session', checkoutSession)\n\n  return {\n    checkoutSession,\n    consumer\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/consumers/upsert-consumer.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport { and, db, eq, type RawDeployment, type RawProject, schema } from '@/db'\nimport { acl } from '@/lib/acl'\nimport { upsertStripeConnectCustomer } from '@/lib/billing/upsert-stripe-connect-customer'\nimport { upsertStripeCustomer } from '@/lib/billing/upsert-stripe-customer'\nimport { upsertStripePricingResources } from '@/lib/billing/upsert-stripe-pricing-resources'\nimport { upsertStripeSubscription } from '@/lib/billing/upsert-stripe-subscription'\nimport { createConsumerApiKey } from '@/lib/create-consumer-api-key'\n\nimport { aclPublicProject } from '../acl-public-project'\n\nexport async function upsertConsumer(\n  c: AuthenticatedHonoContext,\n  {\n    plan,\n    deploymentId,\n    consumerId\n  }: {\n    plan?: string\n    deploymentId?: string\n    consumerId?: string\n  }\n) {\n  assert(\n    consumerId || deploymentId,\n    400,\n    'Internal error: upsertConsumer missing required \"deploymentId\" or \"consumerId\"'\n  )\n  const logger = c.get('logger')\n  const userId = c.get('userId')\n  let deployment: RawDeployment | undefined\n  let project: RawProject | undefined\n  let projectId: string | undefined\n\n  async function initDeploymentAndProject() {\n    assert(deploymentId, 400, 'Missing required \"deploymentId\"')\n    if (deployment && project) {\n      // Already initialized\n      return\n    }\n\n    deployment = await db.query.deployments.findFirst({\n      where: eq(schema.deployments.id, deploymentId),\n      with: {\n        project: true\n      }\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentId}\"`)\n    assert(\n      !deployment.deletedAt,\n      410,\n      `Deployment has been deleted by its owner \"${deployment.id}\"`\n    )\n\n    project = deployment.project!\n    assert(\n      project,\n      404,\n      `Project not found \"${projectId}\" for deployment \"${deploymentId}\"`\n    )\n    aclPublicProject(project)\n\n    // Validate the deployment only after we're sure the project is publicly\n    // accessible.\n    assert(\n      !deployment.deletedAt,\n      410,\n      `Deployment has been deleted by its owner \"${deployment.id}\"`\n    )\n\n    projectId = project.id\n  }\n\n  if (deploymentId) {\n    await initDeploymentAndProject()\n  }\n\n  if (!consumerId) {\n    assert(projectId, 400, 'Missing required \"deploymentId\"')\n  }\n\n  const [{ user, stripeCustomer }, existingConsumer] = await Promise.all([\n    upsertStripeCustomer(c),\n\n    db.query.consumers.findFirst({\n      where: consumerId\n        ? eq(schema.consumers.id, consumerId)\n        : and(\n            eq(schema.consumers.userId, userId),\n            eq(schema.consumers.projectId, projectId!)\n          )\n    })\n  ])\n\n  if (consumerId) {\n    assert(existingConsumer, 404, `Consumer not found \"${consumerId}\"`)\n    assert(existingConsumer.id === consumerId, 403)\n    await acl(c, existingConsumer, { label: 'Consumer' })\n\n    if (projectId) {\n      assert(\n        existingConsumer.projectId === projectId,\n        400,\n        `Deployment \"${deploymentId}\" does not belong to project \"${existingConsumer.projectId}\" for consumer \"${consumerId}\"`\n      )\n    }\n\n    deploymentId ??= existingConsumer.deploymentId\n    projectId ??= existingConsumer.projectId\n  } else {\n    assert(\n      !existingConsumer,\n      409,\n      `User \"${user.email}\" already has a subscription for project \"${projectId ?? ''}\"`\n    )\n  }\n\n  assert(deploymentId)\n  assert(projectId)\n\n  assert(\n    !existingConsumer ||\n      !existingConsumer.isStripeSubscriptionActive ||\n      existingConsumer.plan !== plan ||\n      existingConsumer.deploymentId !== deploymentId,\n    409,\n\n    plan\n      ? `User \"${user.email}\" already has an active subscription to plan \"${plan}\" for project \"${projectId}\"`\n      : `User \"${user.email}\" already has cancelled their subscription for project \"${projectId}\"`\n  )\n\n  await initDeploymentAndProject()\n  assert(deployment, 500, `Error getting deployment \"${deploymentId}\"`)\n  assert(project, 500, `Error getting project \"${projectId}\"`)\n\n  if (plan) {\n    const pricingPlan = deployment.pricingPlans.find((p) => p.slug === plan)\n    assert(\n      pricingPlan,\n      400,\n      `Pricing plan \"${plan}\" not found for deployment \"${deploymentId}\"`\n    )\n  }\n\n  let consumer = existingConsumer\n\n  if (consumer) {\n    ;[consumer] = await db\n      .update(schema.consumers)\n      .set({\n        plan,\n        deploymentId\n      })\n      .where(eq(schema.consumers.id, consumer.id))\n      .returning()\n  } else {\n    ;[consumer] = await db\n      .insert(schema.consumers)\n      .values({\n        plan,\n        userId,\n        projectId,\n        deploymentId,\n        token: await createConsumerApiKey(),\n        _stripeCustomerId: stripeCustomer.id\n      })\n      .returning()\n  }\n\n  assert(consumer, 500, 'Error creating consumer')\n\n  // Ensure that all Stripe pricing resources exist for this deployment\n  await upsertStripePricingResources({ deployment, project })\n\n  // Ensure that customer and default source are created on the stripe connect account\n  // TODO: is this necessary?\n  // consumer._stripeAccount = project._stripeAccount\n  await upsertStripeConnectCustomer({ stripeCustomer, consumer, project })\n\n  logger.info('SUBSCRIPTION', existingConsumer ? 'UPDATE' : 'CREATE', {\n    project,\n    deployment,\n    consumer\n  })\n\n  const { subscription, consumer: updatedConsumer } =\n    await upsertStripeSubscription(c, {\n      consumer,\n      user,\n      project,\n      deployment\n    })\n  logger.info('subscription', subscription)\n\n  return updatedConsumer\n}\n"
  },
  {
    "path": "apps/api/src/lib/consumers/utils.ts",
    "content": "import type { RawConsumerUpdate } from '@/db'\n\n// https://docs.stripe.com/api/subscriptions/object#subscription_object-status\nconst stripeValidSubscriptionStatuses = new Set([\n  'active',\n  'trialing',\n  'incomplete',\n  'past_due'\n])\n\nexport function setConsumerStripeSubscriptionStatus(\n  consumer: Pick<\n    RawConsumerUpdate,\n    'plan' | 'stripeStatus' | 'isStripeSubscriptionActive'\n  >\n) {\n  consumer.isStripeSubscriptionActive =\n    consumer.plan === 'free' ||\n    (!!consumer.stripeStatus &&\n      stripeValidSubscriptionStatuses.has(consumer.stripeStatus))\n}\n"
  },
  {
    "path": "apps/api/src/lib/create-avatar.ts",
    "content": "import { identicon } from '@dicebear/collection'\nimport { createAvatar as createAvatarImpl } from '@dicebear/core'\n\nconst defaultAgenticAvatar =\n  'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODIiIGhlaWdodD0iODIiIHZpZXdCb3g9IjAgMCA4MiA4MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iNDEiIGN5PSI0MSIgcj0iNDEiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjIuNDU3OCA2MS41MzA4QzE5LjMyNTMgNjEuNTcyIDE2LjIxNDIgNjEuNTMwNSAxMy4xMjQ1IDYxLjQwNjNDMjIuODUwNiA0Ni4wMjAxIDMyLjU3OCAzMC42MzA2IDQyLjMwNjcgMTUuMjM3NEM0My43MDIxIDEzLjgwMjEgNDUuMjU3NyAxMy42MTU0IDQ2Ljk3MzQgMTQuNjc3NEM0OS4xMDY5IDE2LjQ3MjcgNDkuNzQ5OSAxOC42OTE5IDQ4LjkwMjMgMjEuMzM1MkM0Ny4zOTg4IDIzLjg4NjMgNDUuODY0IDI2LjQxNjcgNDQuMjk3OCAyOC45MjYzQzM3Ljc0MzcgMzkuMjk2NyAzMS4xODk3IDQ5LjY2NzEgMjQuNjM1NiA2MC4wMzc0QzI0LjE2MSA2MC45MDY4IDIzLjQzNTEgNjEuNDA0NiAyMi40NTc4IDYxLjUzMDhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTQ3LjM0NjYgMzAuOTE3NUM0Ny42MjU0IDMxLjA1MDQgNDcuODUzNiAzMS4yNTc3IDQ4LjAzMSAzMS41Mzk3QzU0Ljk3NDcgNDEuNTkwMSA2MS45NjQzIDUxLjYwNzkgNjguOTk5OSA2MS41OTNDNjUuOTMwMyA2MS42NzYgNjIuODYwNyA2MS42NzYgNTkuNzkxIDYxLjU5M0M1OC45MTk4IDYxLjM5NiA1OC4xOTM5IDYwLjk2MDUgNTcuNjEzMyA2MC4yODY0QzUzLjI0NjkgNTMuOTE4IDQ4Ljg0OTkgNDcuNTcxNCA0NC40MjIyIDQxLjI0NjRDNDMuOTU3NyA0MC41NzM2IDQzLjU0MyAzOS44Njg0IDQzLjE3NzcgMzkuMTMwOEM0My4wMjUgMzguMTc3NiA0My4yMzI1IDM3LjMwNjUgNDMuNzk5OSAzNi41MTc1QzQ1LjAxMzQgMzQuNjYzMSA0Ni4xOTU2IDMyLjc5NjUgNDcuMzQ2NiAzMC45MTc1WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01NC41NjQ1IDYxLjQwNjNDNTEuMDE4NSA2MS41MzA1IDQ3LjQ1MSA2MS41NzE5IDQzLjg2MjMgNjEuNTMwN0M0Mi45MTQ5IDYwLjEwNTUgNDEuOTQwMSA1OC42OTUyIDQwLjkzNzggNTcuMjk5NkM0MC4wMTM2IDU4LjY5MjUgMzkuMTIxNyA2MC4xMDI5IDM4LjI2MjMgNjEuNTMwN0MzNC43NTY0IDYxLjU3MTkgMzEuMjcyIDYxLjUzMDUgMjcuODA5IDYxLjQwNjNDMzEuMDc4OSA1Ni4yNDgxIDM0LjM3NjYgNTEuMTA0NCAzNy43MDIzIDQ1Ljk3NTJDMzkuMDUwMyA0NC41NjI5IDQwLjY0NzQgNDQuMjEwMyA0Mi40OTM0IDQ0LjkxNzRDNDIuOTgzNyA0NS4xNTIxIDQzLjQxOTMgNDUuNDYzMiA0My44MDAxIDQ1Ljg1MDdDNDcuNDE1NyA1MS4wMjEgNTEuMDAzOCA1Ni4yMDYzIDU0LjU2NDUgNjEuNDA2M1oiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTMuMTI0NCA2MS40MDYzQzE2LjIxNDIgNjEuNTMwNSAxOS4zMjUzIDYxLjU3MTkgMjIuNDU3OCA2MS41MzA4QzE5LjMyNTUgNjEuNjk2MSAxNi4xNzMgNjEuNjk2MSAxMyA2MS41MzA4QzEzLjAxNTQgNjEuNDU1MiAxMy4wNTY5IDYxLjQxMzggMTMuMTI0NCA2MS40MDYzWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNy44MDg5IDYxLjQwNjNDMzEuMjcxOSA2MS41MzA1IDM0Ljc1NjQgNjEuNTcxOSAzOC4yNjIyIDYxLjUzMDhDMzQuNzU2NiA2MS42OTYxIDMxLjIzMDcgNjEuNjk2MSAyNy42ODQ0IDYxLjUzMDhDMjcuNjk5OSA2MS40NTUyIDI3Ljc0MTMgNjEuNDEzOCAyNy44MDg5IDYxLjQwNjNaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTU0LjU2NDQgNjEuNDA2M0M1NC42MzIgNjEuNDEzOCA1NC42NzM0IDYxLjQ1NTIgNTQuNjg4OCA2MS41MzA4QzUxLjA1OTYgNjEuNjk2MyA0Ny40NTA3IDYxLjY5NjMgNDMuODYyMiA2MS41MzA4QzQ3LjQ1MDkgNjEuNTcxOSA1MS4wMTg0IDYxLjUzMDUgNTQuNTY0NCA2MS40MDYzWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=='\n\nconst defaultDevAgenticAvatar =\n  'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTYiIGhlaWdodD0iOTYiIHZpZXdCb3g9IjAgMCA5NiA5NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iNDgiIGN5PSI0OCIgcj0iNDgiIGZpbGw9IiM4ODg4ODgiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNi4yOTIyIDczLjIwNjdDMjIuNjI0OCA3My4yNTUgMTguOTgyNSA3My4yMDY1IDE1LjM2NTMgNzMuMDYxMUMyNi43NTIgNTUuMDQ4IDM4LjE0MDIgMzcuMDMwOSA0OS41Mjk5IDE5LjAwOTdDNTEuMTYzNSAxNy4zMjkzIDUyLjk4NDcgMTcuMTEwNyA1NC45OTMzIDE4LjM1NDFDNTcuNDkxIDIwLjQ1NTggNTguMjQzOCAyMy4wNTM5IDU3LjI1MTUgMjYuMTQ4NUM1NS40OTEzIDI5LjEzNTIgNTMuNjk0NSAzMi4wOTc1IDUxLjg2MDkgMzUuMDM1N0M0NC4xODc4IDQ3LjE3NjYgMzYuNTE0OSA1OS4zMTc2IDI4Ljg0MTcgNzEuNDU4NUMyOC4yODYxIDcyLjQ3NjMgMjcuNDM2MyA3My4wNTkgMjYuMjkyMiA3My4yMDY3WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01NS40MzAyIDM3LjM2NjhDNTUuNzU2NiAzNy41MjI0IDU2LjAyMzcgMzcuNzY1MSA1Ni4yMzE1IDM4LjA5NTJDNjQuMzYwNiA0OS44NjE1IDcyLjU0MzcgNjEuNTg5NyA4MC43ODA0IDczLjI3OTZDNzcuMTg2NyA3My4zNzY4IDczLjU5MzEgNzMuMzc2OCA2OS45OTkzIDczLjI3OTZDNjguOTc5MyA3My4wNDkgNjguMTI5NSA3Mi41MzkxIDY3LjQ0OTcgNzEuNzQ5OUM2Mi4zMzc5IDY0LjI5NDMgNTcuMTkwMiA1Ni44NjQgNTIuMDA2NSA0OS40NTkxQzUxLjQ2MjcgNDguNjcxNSA1MC45NzcyIDQ3Ljg0NTkgNTAuNTQ5NiA0Ni45ODI0QzUwLjM3MDggNDUuODY2NCA1MC42MTM3IDQ0Ljg0NjYgNTEuMjc4IDQzLjkyMjlDNTIuNjk4NiA0MS43NTE5IDU0LjA4MjcgMzkuNTY2NiA1NS40MzAyIDM3LjM2NjhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTYzLjg4MDMgNzMuMDYxQzU5LjcyODggNzMuMjA2NCA1NS41NTIzIDczLjI1NSA1MS4zNTA5IDczLjIwNjdDNTAuMjQxNyA3MS41MzgxIDQ5LjEwMDUgNjkuODg3IDQ3LjkyNzEgNjguMjUzMkM0Ni44NDUxIDY5Ljg4NCA0NS44MDA5IDcxLjUzNTEgNDQuNzk0OCA3My4yMDY3QzQwLjY5MDQgNzMuMjU1IDM2LjYxMSA3My4yMDY0IDMyLjU1NjcgNzMuMDYxQzM2LjM4NDkgNjcuMDIyMSA0MC4yNDU3IDYxLjAwMDMgNDQuMTM5MiA1NC45OTUzQzQ1LjcxNzMgNTMuMzQxOSA0Ny41ODcxIDUyLjkyOTIgNDkuNzQ4MyA1My43NTdDNTAuMzIyMyA1NC4wMzE3IDUwLjgzMjIgNTQuMzk2IDUxLjI3OCA1NC44NDk3QzU1LjUxMDkgNjAuOTAyNyA1OS43MTE3IDY2Ljk3MzIgNjMuODgwMyA3My4wNjFaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE1LjM2NTIgNzMuMDYxMUMxOC45ODI1IDczLjIwNjUgMjIuNjI0NyA3My4yNTUgMjYuMjkyMSA3My4yMDY3QzIyLjYyNSA3My40MDA0IDE4LjkzNDIgNzMuNDAwNCAxNS4yMTk1IDczLjIwNjdDMTUuMjM3NiA3My4xMTgzIDE1LjI4NjEgNzMuMDY5OCAxNS4zNjUyIDczLjA2MTFaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjU1NjggNzMuMDYxMUMzNi42MTExIDczLjIwNjUgNDAuNjkwNCA3My4yNTUgNDQuNzk0OCA3My4yMDY3QzQwLjY5MDcgNzMuNDAwNCAzNi41NjI5IDczLjQwMDQgMzIuNDExMSA3My4yMDY3QzMyLjQyOTIgNzMuMTE4MyAzMi40Nzc3IDczLjA2OTggMzIuNTU2OCA3My4wNjExWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02My44ODAzIDczLjA2MTFDNjMuOTU5NCA3My4wNjk4IDY0LjAwNzkgNzMuMTE4MyA2NC4wMjYgNzMuMjA2N0M1OS43NzcxIDczLjQwMDUgNTUuNTUyIDczLjQwMDUgNTEuMzUwOSA3My4yMDY3QzU1LjU1MjMgNzMuMjU1IDU5LjcyODkgNzMuMjA2NSA2My44ODAzIDczLjA2MTFaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4='\n\nexport function createAvatar(seed: string): string {\n  if (seed === 'info@agentic.so') {\n    return defaultAgenticAvatar\n  }\n\n  if (seed === 'dev@agentic.so') {\n    return defaultDevAgenticAvatar\n  }\n\n  return createAvatarImpl(identicon, { seed }).toDataUri()\n}\n"
  },
  {
    "path": "apps/api/src/lib/create-consumer-api-key.ts",
    "content": "import { sha256 } from '@agentic/platform-core'\n\nexport async function createConsumerApiKey(): Promise<string> {\n  const hash = await sha256()\n\n  return `sk-${hash}`\n}\n"
  },
  {
    "path": "apps/api/src/lib/deployments/get-deployment-by-id.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport { db, eq, type RawDeployment, schema } from '@/db'\n\n/**\n * Finds the Deployment with the given id.\n *\n * Does not take care of ACLs.\n *\n * Returns `undefined` if not found.\n */\nexport async function getDeploymentById({\n  deploymentId,\n  ...dbQueryOpts\n}: {\n  deploymentId: string\n  with?: {\n    user?: true\n    team?: true\n    project?: true\n  }\n}): Promise<RawDeployment | undefined> {\n  assert(deploymentId, 400, 'Missing required deployment id')\n\n  const deployment = await db.query.deployments.findFirst({\n    ...dbQueryOpts,\n    where: eq(schema.deployments.id, deploymentId)\n  })\n\n  return deployment\n}\n"
  },
  {
    "path": "apps/api/src/lib/deployments/normalize-deployment-version.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport semver from 'semver'\n\nimport type { RawProject } from '@/db'\n\nexport function normalizeDeploymentVersion({\n  deploymentIdentifier,\n  version: rawVersion,\n  project\n}: {\n  deploymentIdentifier: string\n  version: string\n  project: RawProject\n}): string | undefined {\n  const version = semver.clean(rawVersion)\n  assert(version, 400, `Invalid semver version \"${rawVersion}\"`)\n\n  assert(\n    semver.valid(version),\n    400,\n    `Invalid semver version \"${version}\" for deployment \"${deploymentIdentifier}\"`\n  )\n\n  const lastPublishedVersion = project.lastPublishedDeployment?.version\n  assert(\n    !lastPublishedVersion || semver.gt(version, lastPublishedVersion),\n    400,\n    `Semver version \"${version}\" must be greater than the current published version \"${lastPublishedVersion}\" for deployment \"${deploymentIdentifier}\"`\n  )\n\n  return version\n}\n"
  },
  {
    "path": "apps/api/src/lib/deployments/publish-deployment.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport { db, eq, type RawDeployment, schema } from '@/db'\nimport { acl } from '@/lib/acl'\n\nimport { normalizeDeploymentVersion } from './normalize-deployment-version'\n\nexport async function publishDeployment(\n  ctx: AuthenticatedHonoContext,\n  {\n    deployment,\n    version: rawVersion\n  }: {\n    deployment: RawDeployment\n    version: string\n  }\n): Promise<RawDeployment> {\n  const project = await db.query.projects.findFirst({\n    where: eq(schema.projects.id, deployment.projectId),\n    with: {\n      lastPublishedDeployment: true\n    }\n  })\n  assert(project, 404, `Project not found \"${deployment.projectId}\"`)\n  await acl(ctx, project, { label: 'Project' })\n\n  const version = normalizeDeploymentVersion({\n    deploymentIdentifier: deployment.identifier,\n    project,\n    version: rawVersion\n  })\n\n  // TODO: enforce additional semver constraints\n  // - pricing changes require major version update\n  // - deployment shouldn't already be published?\n  // - any others?\n\n  // Update the deployment and project together in a transaction\n  const [[updatedDeployment]] = await db.transaction(async (tx) => {\n    return Promise.all([\n      // Update the deployment\n      tx\n        .update(schema.deployments)\n        .set({\n          published: true,\n          version\n        })\n        .where(eq(schema.deployments.id, deployment.id))\n        .returning(),\n\n      // Update the project\n      tx\n        .update(schema.projects)\n        .set({\n          name: deployment.name,\n          lastPublishedDeploymentId: deployment.id,\n          lastPublishedDeploymentVersion: version\n        })\n        .where(eq(schema.projects.id, project.id))\n\n      // TODO: add publishDeploymentLogEntry\n    ])\n  })\n  assert(\n    updatedDeployment,\n    500,\n    `Failed to update deployment \"${deployment.id}\"`\n  )\n\n  return updatedDeployment\n}\n"
  },
  {
    "path": "apps/api/src/lib/deployments/try-get-deployment-by-identifier.ts",
    "content": "import type { DefaultHonoContext } from '@agentic/platform-hono'\nimport { assert } from '@agentic/platform-core'\nimport { parseDeploymentIdentifier } from '@agentic/platform-validators'\n\nimport {\n  and,\n  db,\n  deploymentIdSchema,\n  eq,\n  type RawDeployment,\n  schema\n} from '@/db'\nimport { setPublicCacheControl } from '@/lib/cache-control'\n\nimport type { AuthenticatedHonoContext } from '../types'\n\n/**\n * Attempts to find the Deployment matching the given deployment ID or\n * identifier.\n *\n * Throws a HTTP 404 error if not found.\n *\n * Does not take care of ACLs.\n */\nexport async function tryGetDeploymentByIdentifier(\n  ctx: AuthenticatedHonoContext | DefaultHonoContext,\n  {\n    deploymentIdentifier,\n    strict = false,\n    ...dbQueryOpts\n  }: {\n    deploymentIdentifier: string\n    strict?: boolean\n    with?: {\n      user?: true\n      team?: true\n      project?: true\n    }\n  }\n): Promise<RawDeployment> {\n  assert(deploymentIdentifier, 400, 'Missing required deployment identifier')\n\n  // First check if the identifier is a deployment ID\n  if (deploymentIdSchema.safeParse(deploymentIdentifier).success) {\n    const deployment = await db.query.deployments.findFirst({\n      ...dbQueryOpts,\n      where: eq(schema.deployments.id, deploymentIdentifier)\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentIdentifier}\"`)\n    setPublicCacheControl(ctx.res, '1h')\n    return deployment\n  }\n\n  const parsedDeploymentIdentifier = parseDeploymentIdentifier(\n    deploymentIdentifier,\n    { strict }\n  )\n\n  const { projectIdentifier, deploymentHash, deploymentVersion } =\n    parsedDeploymentIdentifier\n  deploymentIdentifier = parsedDeploymentIdentifier.deploymentIdentifier\n\n  if (deploymentHash) {\n    const deployment = await db.query.deployments.findFirst({\n      ...dbQueryOpts,\n      where: eq(schema.deployments.identifier, deploymentIdentifier)\n    })\n    assert(deployment, 404, `Deployment not found \"${deploymentIdentifier}\"`)\n    setPublicCacheControl(ctx.res, '1h')\n\n    return deployment\n  } else if (deploymentVersion) {\n    const project = await db.query.projects.findFirst({\n      where: eq(schema.projects.identifier, projectIdentifier)\n    })\n    assert(project, 404, `Project not found \"${projectIdentifier}\"`)\n\n    if (deploymentVersion === 'latest') {\n      const deploymentId =\n        project.lastPublishedDeploymentId || project.lastDeploymentId\n      assert(\n        deploymentId,\n        404,\n        `Project has no published deployments (referenced by \"${deploymentIdentifier}\")`\n      )\n\n      const deployment = await db.query.deployments.findFirst({\n        ...dbQueryOpts,\n        where: eq(schema.deployments.id, deploymentId)\n      })\n      assert(\n        deployment,\n        404,\n        `Deployment not found \"${project.lastPublishedDeploymentId}\" (referenced by \"${deploymentIdentifier}\")`\n      )\n      setPublicCacheControl(ctx.res, '10s')\n\n      return deployment\n    } else if (deploymentVersion === 'dev') {\n      assert(\n        project.lastDeploymentId,\n        404,\n        `Project has no published deployments (referenced by \"${deploymentIdentifier}\")`\n      )\n\n      const deployment = await db.query.deployments.findFirst({\n        ...dbQueryOpts,\n        where: eq(schema.deployments.id, project.lastDeploymentId)\n      })\n      assert(\n        deployment,\n        404,\n        `Deployment not found \"${project.lastDeploymentId}\" (referenced by \"${deploymentIdentifier}\")`\n      )\n      setPublicCacheControl(ctx.res, '10s')\n\n      return deployment\n    } else {\n      const deployment = await db.query.deployments.findFirst({\n        ...dbQueryOpts,\n        where: and(\n          eq(schema.deployments.projectId, project.id),\n          eq(schema.deployments.version, deploymentVersion)\n        )\n      })\n      assert(deployment, 404, `Deployment not found \"${deploymentIdentifier}\"`)\n      setPublicCacheControl(ctx.res, '1h')\n\n      return deployment\n    }\n  }\n\n  assert(false, 400, `Invalid Deployment identifier \"${deploymentIdentifier}\"`)\n}\n"
  },
  {
    "path": "apps/api/src/lib/ensure-auth-user.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport { db, eq, type RawUser, schema } from '@/db'\n\nexport async function ensureAuthUser(\n  ctx: AuthenticatedHonoContext\n): Promise<RawUser> {\n  let user = ctx.get('user')\n  if (user) return user\n\n  const userId = ctx.get('userId')\n  assert(userId, 401, 'Unauthorized')\n\n  user = await db.query.users.findFirst({\n    where: eq(schema.users.id, userId)\n  })\n  assert(user, 401, 'Unauthorized')\n  ctx.set('user', user)\n\n  return user\n}\n"
  },
  {
    "path": "apps/api/src/lib/ensure-unique-namespace.ts",
    "content": "import { assert, sha256 } from '@agentic/platform-core'\n\nimport { db, eq, schema } from '@/db'\n\nexport async function ensureUniqueNamespace(\n  namespace: string,\n  { label = 'Namespace' }: { label?: string } = {}\n) {\n  namespace = namespace.toLocaleLowerCase()\n\n  const [existingTeam, existingUser] = await Promise.all([\n    db.query.teams.findFirst({\n      where: eq(schema.teams.slug, namespace)\n    }),\n\n    db.query.users.findFirst({\n      where: eq(schema.users.username, namespace)\n    })\n  ])\n\n  assert(\n    !existingUser && !existingTeam,\n    409,\n    `${label} \"${namespace}\" is not available`\n  )\n}\n\nexport async function getUniqueNamespace(\n  namespace?: string,\n  { label = 'Namespace' }: { label?: string } = {}\n) {\n  namespace ??= `${label}_${(await sha256()).slice(0, 24)}`\n  namespace = namespace\n    .replaceAll(/[^a-zA-Z0-9_-]/g, '')\n    .toLowerCase()\n    .slice(0, schema.namespaceMaxLength - 1)\n\n  let currentNamespace = namespace\n  let attempts = 0\n\n  do {\n    try {\n      await ensureUniqueNamespace(namespace, { label })\n\n      return currentNamespace\n    } catch (err) {\n      if (++attempts > 10) {\n        throw err\n      }\n\n      const suffix = (await sha256()).slice(0, 8)\n      currentNamespace = `${namespace.slice(0, schema.namespaceMaxLength - 1 - suffix.length)}${suffix}`\n    }\n  } while (true)\n}\n"
  },
  {
    "path": "apps/api/src/lib/env.ts",
    "content": "import type { Simplify } from 'type-fest'\nimport { parseZodSchema } from '@agentic/platform-core'\nimport {\n  envSchema as baseEnvSchema,\n  parseEnv as parseBaseEnv\n} from '@agentic/platform-hono'\nimport { z } from 'zod'\n\nexport const envSchema = baseEnvSchema\n  .extend({\n    DATABASE_URL: z.string().url(),\n\n    AGENTIC_WEB_BASE_URL: z.string().url(),\n    AGENTIC_GATEWAY_BASE_URL: z.string().url(),\n    AGENTIC_STORAGE_BASE_URL: z\n      .string()\n      .url()\n      .optional()\n      .default('https://storage.agentic.so'),\n\n    JWT_SECRET: z.string().nonempty(),\n\n    PORT: z.coerce.number().default(3001),\n\n    STRIPE_SECRET_KEY: z.string().nonempty(),\n    STRIPE_WEBHOOK_SECRET: z.string().nonempty(),\n\n    GITHUB_CLIENT_ID: z.string().nonempty(),\n    GITHUB_CLIENT_SECRET: z.string().nonempty(),\n\n    RESEND_API_KEY: z.string().nonempty(),\n\n    // Used to make admin API calls from the API gateway\n    AGENTIC_ADMIN_API_KEY: z.string().nonempty(),\n\n    // Used to simplify recreating the demo `@agentic/search` project during\n    // development while we're frequently resetting the database\n    AGENTIC_SEARCH_PROXY_SECRET: z.string().nonempty(),\n\n    S3_BUCKET: z.string().nonempty().optional().default('agentic'),\n    S3_REGION: z.string().nonempty().optional().default('auto'),\n    S3_ENDPOINT: z.string().nonempty().url(),\n    S3_ACCESS_KEY_ID: z.string().nonempty(),\n    S3_ACCESS_KEY_SECRET: z.string().nonempty()\n  })\n  .strip()\nexport type RawEnv = z.infer<typeof envSchema>\n\nexport function parseEnv(inputEnv: Record<string, unknown>) {\n  const baseEnv = parseBaseEnv({\n    SERVICE: 'api',\n    ...inputEnv\n  })\n\n  const env = parseZodSchema(\n    envSchema,\n    { ...inputEnv, ...baseEnv },\n    {\n      error: 'Invalid environment variables'\n    }\n  )\n\n  const isStripeLive = env.STRIPE_SECRET_KEY.startsWith('sk_live_')\n  const apiBaseUrl = baseEnv.isProd\n    ? 'https://api.agentic.so'\n    : 'http://localhost:3001'\n\n  return {\n    ...baseEnv,\n    ...env,\n    isStripeLive,\n    apiBaseUrl\n  }\n}\n\nexport type Env = Simplify<ReturnType<typeof parseEnv>>\n\n// eslint-disable-next-line no-process-env\nexport const env = parseEnv(process.env)\n"
  },
  {
    "path": "apps/api/src/lib/exit-hooks.ts",
    "content": "import { promisify } from 'node:util'\n\nimport type { ServerType } from '@hono/node-server'\nimport * as Sentry from '@sentry/node'\nimport { asyncExitHook } from 'exit-hook'\nimport restoreCursor from 'restore-cursor'\n\nimport { db } from '@/db'\n\nexport function initExitHooks({\n  server,\n  timeoutMs = 10_000\n}: {\n  server: ServerType\n  timeoutMs?: number\n}) {\n  // Gracefully restore the cursor if run from a TTY\n  restoreCursor()\n\n  // Gracefully shutdown the HTTP server\n  asyncExitHook(\n    async function shutdownServerExitHook() {\n      try {\n        await promisify(server.close)()\n      } catch {\n        // TODO\n      }\n    },\n    {\n      wait: timeoutMs\n    }\n  )\n\n  // Gracefully shutdown the postgres database connection\n  asyncExitHook(\n    async function shutdownDbExitHook() {\n      try {\n        if ('end' in db.$client) {\n          await db.$client.end({ timeout: timeoutMs })\n        }\n      } catch {\n        // TODO\n      }\n    },\n    {\n      wait: timeoutMs\n    }\n  )\n\n  // Gracefully flush Sentry events\n  asyncExitHook(\n    async function flushSentryExitHook() {\n      await Sentry.flush(timeoutMs)\n    },\n    {\n      wait: timeoutMs\n    }\n  )\n\n  // TODO: On Node.js, log unhandledRejection, uncaughtException, and warning events\n}\n"
  },
  {
    "path": "apps/api/src/lib/external/github.ts",
    "content": "import ky from 'ky'\nimport { Octokit } from 'octokit'\n\nimport { env } from '@/lib/env'\n\nconst USER_AGENT = 'agentic-platform'\n\n/**\n * GitHub (user-level) OAuth token response.\n *\n * @see https://docs.github.com/apps/oauth\n */\nexport interface GitHubUserTokenResponse {\n  /**\n   * The user access token (always starts with `ghu_`).\n   * Example: `ghu_xxx…`\n   */\n  access_token: string\n\n  /**\n   * Seconds until `access_token` expires.\n   * Omitted (`undefined`) if you’ve disabled token expiration.\n   * Constant `28800` (8 hours) when present.\n   */\n  expires_in?: number\n\n  /**\n   * Refresh token for renewing the user access token (starts with `ghr_`).\n   * Omitted (`undefined`) if you’ve disabled token expiration.\n   */\n  refresh_token?: string\n\n  /**\n   * Seconds until `refresh_token` expires.\n   * Omitted (`undefined`) if you’ve disabled token expiration.\n   * Constant `15897600` (6 months) when present.\n   */\n  refresh_token_expires_in?: number\n\n  /**\n   * Scopes granted to the token.\n   * Always an empty string because the token is limited to\n   * the intersection of app-level and user-level permissions.\n   */\n  scope: ''\n\n  /**\n   * Token type – always `'bearer'`.\n   */\n  token_type: 'bearer'\n}\n\nexport function getGitHubClient({\n  accessToken\n}: {\n  accessToken: string\n}): Octokit {\n  return new Octokit({ auth: accessToken })\n}\n\nexport async function exchangeGitHubOAuthCodeForAccessToken({\n  code,\n  clientId = env.GITHUB_CLIENT_ID,\n  clientSecret = env.GITHUB_CLIENT_SECRET,\n  redirectUri\n}: {\n  code: string\n  clientId?: string\n  clientSecret?: string\n  redirectUri?: string\n}): Promise<GitHubUserTokenResponse> {\n  return ky\n    .post('https://github.com/login/oauth/access_token', {\n      json: {\n        code,\n        client_id: clientId,\n        client_secret: clientSecret,\n        redirect_uri: redirectUri\n      },\n      headers: {\n        'user-agent': USER_AGENT\n      }\n    })\n    .json<GitHubUserTokenResponse>()\n}\n"
  },
  {
    "path": "apps/api/src/lib/external/resend.ts",
    "content": "import { ResendEmailClient } from '@agentic/platform-emails'\n\nimport { env } from '@/lib/env'\n\nexport const resend = new ResendEmailClient({\n  apiKey: env.RESEND_API_KEY\n})\n"
  },
  {
    "path": "apps/api/src/lib/external/sentry.ts",
    "content": "import * as Sentry from '@sentry/node'\n\n// This MUST be run before anything else (imported first in the root file).\n// No other imports (like env) should be imported in this file.\nSentry.init({\n  dsn: process.env.SENTRY_DSN, // eslint-disable-line no-process-env\n  environment: process.env.ENVIRONMENT || 'development', // eslint-disable-line no-process-env\n  integrations: [Sentry.extraErrorDataIntegration()],\n  tracesSampleRate: 1.0,\n  sendDefaultPii: true\n})\n"
  },
  {
    "path": "apps/api/src/lib/external/stripe.ts",
    "content": "import Stripe from 'stripe'\n\nimport { env } from '@/lib/env'\n\nconst version = '2025-06-30.basil'\n\nexport const stripe = new Stripe(env.STRIPE_SECRET_KEY, {\n  apiVersion: version,\n  appInfo: {\n    name: 'transitive-bullshit/agentic',\n    version,\n    url: 'https://agentic.so'\n  }\n})\n"
  },
  {
    "path": "apps/api/src/lib/middleware/authenticate.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport { authUserSchema } from '@agentic/platform-types'\nimport { createMiddleware } from 'hono/factory'\nimport { verify } from 'hono/jwt'\n\nimport type { RawUser } from '@/db'\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { env } from '@/lib/env'\nimport { timingSafeCompare } from '@/lib/utils'\n\nexport const authenticate = createMiddleware<AuthenticatedHonoEnv>(\n  async function authenticateMiddleware(ctx, next) {\n    const credentials = ctx.req.raw.headers.get('Authorization')\n    assert(credentials, 401, 'Unauthorized')\n\n    const parts = credentials.split(/\\s+/)\n    assert(\n      parts.length === 1 ||\n        (parts.length === 2 && parts[0]?.toLowerCase() === 'bearer'),\n      401,\n      'Unauthorized'\n    )\n    const token = parts.at(-1)\n    assert(token, 401, 'Unauthorized')\n\n    // TODO: Use a more secure way to authenticate gateway admin requests.\n    if (timingSafeCompare(token, env.AGENTIC_ADMIN_API_KEY)) {\n      ctx.set('userId', 'admin')\n      ctx.set('user', {\n        id: 'admin',\n        name: 'Admin',\n        username: 'admin',\n        role: 'admin',\n        email: 'admin@agentic.so',\n        isEmailVerified: true,\n        image: undefined,\n        stripeCustomerId: undefined,\n        createdAt: new Date().toISOString(),\n        updatedAt: new Date().toISOString(),\n        deletedAt: undefined\n      } as RawUser)\n    } else {\n      const payload = await verify(token, env.JWT_SECRET)\n      assert(payload, 401, 'Unauthorized')\n\n      const parsedAuthUser = authUserSchema.safeParse(payload)\n      assert(parsedAuthUser.success, 401, 'Unauthorized')\n      ctx.set('userId', parsedAuthUser.data.id)\n    }\n\n    await next()\n  }\n)\n"
  },
  {
    "path": "apps/api/src/lib/middleware/index.ts",
    "content": "export * from './authenticate'\nexport * from './me'\nexport * from './team'\nexport {\n  accessLogger,\n  compress,\n  cors,\n  init,\n  responseTime,\n  sentry,\n  unless\n} from '@agentic/platform-hono'\n"
  },
  {
    "path": "apps/api/src/lib/middleware/me.ts",
    "content": "import { createMiddleware } from 'hono/factory'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\n\nimport { ensureAuthUser } from '../ensure-auth-user'\n\nexport const me = createMiddleware<AuthenticatedHonoEnv>(\n  async function meMiddleware(ctx, next) {\n    const regex = /^\\/(me)(\\/|$)/\n\n    if (regex.test(ctx.req.path)) {\n      const user = await ensureAuthUser(ctx)\n\n      if (user) {\n        // TODO: redirect instead?\n        ctx.req.path = ctx.req.path.replace(regex, `/users/${user.id}$2`)\n      }\n    }\n\n    await next()\n  }\n)\n"
  },
  {
    "path": "apps/api/src/lib/middleware/team.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport { createMiddleware } from 'hono/factory'\n\nimport type { AuthenticatedHonoEnv } from '@/lib/types'\nimport { and, db, eq, schema } from '@/db'\nimport { aclTeamMember } from '@/lib/acl-team-member'\n\n// TODO: Instead of accepting `teamId` query param, change the authenticate\n// middleware to accept a different JWT payload and then use that to\n// determine the intended user and/or team.\n\nexport const team = createMiddleware<AuthenticatedHonoEnv>(\n  async function teamMiddleware(ctx, next) {\n    const teamId = ctx.req.query('teamId')\n    const userId = ctx.get('userId')\n\n    if (teamId && userId) {\n      const teamMember = await db.query.teamMembers.findFirst({\n        where: and(\n          eq(schema.teamMembers.teamId, teamId),\n          eq(schema.teamMembers.userId, userId)\n        )\n      })\n      assert(teamMember, 403, 'Unauthorized')\n\n      await aclTeamMember(ctx, { teamMember })\n\n      ctx.set('teamMember', teamMember)\n    }\n\n    await next()\n  }\n)\n"
  },
  {
    "path": "apps/api/src/lib/openapi-utils.ts",
    "content": "import { fromError } from 'zod-validation-error'\n\nimport type { HonoApp } from './types'\n\nexport const openapiErrorResponses = {\n  400: {\n    $ref: '#/components/responses/400'\n  },\n  401: {\n    $ref: '#/components/responses/401'\n  },\n  403: {\n    $ref: '#/components/responses/403'\n  }\n} as const\n\nexport const openapiErrorResponse404 = {\n  404: {\n    $ref: '#/components/responses/404'\n  }\n} as const\n\nexport const openapiErrorResponse409 = {\n  409: {\n    $ref: '#/components/responses/409'\n  }\n} as const\n\nexport const openapiErrorResponse410 = {\n  410: {\n    $ref: '#/components/responses/410'\n  }\n} as const\n\n// No `as const` because zod openapi doesn't support readonly for `security`\nexport const openapiAuthenticatedSecuritySchemas = [\n  {\n    Bearer: []\n  }\n]\n\nconst openapiErrorContent = {\n  'application/json': {\n    schema: {\n      type: 'object' as const,\n      properties: {\n        error: {\n          type: 'string' as const\n        },\n        requestId: {\n          type: 'string' as const\n        }\n      },\n      required: ['error', 'requestId']\n    }\n  }\n}\n\nexport function registerOpenAPIErrorResponses(app: HonoApp) {\n  app.openAPIRegistry.registerComponent('responses', '400', {\n    description: 'Bad Request',\n    content: openapiErrorContent\n  })\n\n  app.openAPIRegistry.registerComponent('responses', '401', {\n    description: 'Unauthorized',\n    content: openapiErrorContent\n  })\n\n  app.openAPIRegistry.registerComponent('responses', '403', {\n    description: 'Forbidden',\n    content: openapiErrorContent\n  })\n\n  app.openAPIRegistry.registerComponent('responses', '404', {\n    description: 'Not Found',\n    content: openapiErrorContent\n  })\n\n  app.openAPIRegistry.registerComponent('responses', '409', {\n    description: 'Conflict',\n    content: openapiErrorContent\n  })\n\n  app.openAPIRegistry.registerComponent('responses', '410', {\n    description: 'Gone',\n    content: openapiErrorContent\n  })\n}\n\nexport function defaultHook(result: any, ctx: any) {\n  if (!result.success) {\n    const requestId = ctx.get('requestId')\n\n    return ctx.json(\n      {\n        error: fromError(result.error).toString(),\n        requestId\n      },\n      400\n    )\n  }\n}\n"
  },
  {
    "path": "apps/api/src/lib/projects/try-get-project-by-identifier.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport { parseProjectIdentifier } from '@agentic/platform-validators'\n\nimport type { AuthenticatedHonoContext } from '@/lib/types'\nimport { db, eq, projectIdSchema, type RawProject, schema } from '@/db'\n\n/**\n * Attempts to find the Project matching the given ID or identifier.\n *\n * Throws a HTTP 404 error if not found.\n *\n * Does not take care of ACLs.\n */\nexport async function tryGetProjectByIdentifier(\n  ctx: AuthenticatedHonoContext,\n  {\n    projectIdentifier,\n    strict = false,\n    ...dbQueryOpts\n  }: {\n    projectIdentifier: string\n    strict?: boolean\n    with?: {\n      user?: true\n      team?: true\n      lastPublishedproject?: true\n      lastproject?: true\n    }\n  }\n): Promise<RawProject> {\n  assert(projectIdentifier, 400, 'Missing required project identifier')\n\n  // First check if the identifier is a project ID\n  if (projectIdSchema.safeParse(projectIdentifier).success) {\n    const project = await db.query.projects.findFirst({\n      ...dbQueryOpts,\n      where: eq(schema.projects.id, projectIdentifier)\n    })\n    assert(project, 404, `Project not found \"${projectIdentifier}\"`)\n    return project\n  }\n\n  const parsedProjectIdentifier = parseProjectIdentifier(projectIdentifier, {\n    strict\n  })\n  projectIdentifier = parsedProjectIdentifier.projectIdentifier\n\n  const project = await db.query.projects.findFirst({\n    ...dbQueryOpts,\n    where: eq(schema.projects.identifier, projectIdentifier)\n  })\n  assert(project, 404, `Project not found \"${projectIdentifier}\"`)\n\n  return project\n}\n"
  },
  {
    "path": "apps/api/src/lib/storage.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\n\nimport {\n  deleteStorageObject,\n  getStorageObject,\n  putStorageObject,\n  uploadFileUrlToStorage\n} from './storage'\n\ndescribe('Storage', () => {\n  test('putObject, getObject, deleteObject', async () => {\n    await putStorageObject('test.txt', 'hello world', {\n      ContentType: 'text/plain'\n    })\n\n    const obj = await getStorageObject('test.txt')\n    expect(obj.ContentType).toEqual('text/plain')\n\n    const body = await obj.Body?.transformToString()\n    expect(body).toEqual('hello world')\n\n    const res = await deleteStorageObject('test.txt')\n    expect(res.$metadata.httpStatusCode).toEqual(204)\n  })\n\n  test('uploadFileUrlToStorage url', async () => {\n    const url = await uploadFileUrlToStorage(\n      'https://agentic.so/agentic-icon-circle-light.svg',\n      {\n        prefix: '@dev/test'\n      }\n    )\n\n    expect(url).toBeTruthy()\n    expect(new URL(url).origin).toEqual('https://storage.agentic.so')\n    expect(url).toMatchSnapshot()\n  })\n\n  test('uploadFileUrlToStorage data-uri', async () => {\n    const url = await uploadFileUrlToStorage(\n      'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22400%22%20height%3D%22400%22%20viewBox%3D%220%200%20124%20124%22%20fill%3D%22none%22%3E%3Crect%20width%3D%22124%22%20height%3D%22124%22%20rx%3D%2224%22%20fill%3D%22%23F97316%22%2F%3E%3Cpath%20d%3D%22M19.375%2036.7818V100.625C19.375%20102.834%2021.1659%20104.625%2023.375%20104.625H87.2181C90.7818%20104.625%2092.5664%20100.316%2090.0466%2097.7966L26.2034%2033.9534C23.6836%2031.4336%2019.375%2033.2182%2019.375%2036.7818Z%22%20fill%3D%22white%22%2F%3E%3Ccircle%20cx%3D%2263.2109%22%20cy%3D%2237.5391%22%20r%3D%2218.1641%22%20fill%3D%22black%22%2F%3E%3Crect%20opacity%3D%220.4%22%20x%3D%2281.1328%22%20y%3D%2280.7198%22%20width%3D%2217.5687%22%20height%3D%2217.3876%22%20rx%3D%224%22%20transform%3D%22rotate(-45%2081.1328%2080.7198)%22%20fill%3D%22%23FDBA74%22%2F%3E%3C%2Fsvg%3E',\n      {\n        prefix: '@dev/test'\n      }\n    )\n\n    expect(url).toBeTruthy()\n    expect(new URL(url).origin).toEqual('https://storage.agentic.so')\n    expect(url).toMatchSnapshot()\n  })\n\n  test('uploadFileUrlToStorage data-uri 2', async () => {\n    const url = await uploadFileUrlToStorage(\n      'data:application/octet-stream;base64,IyBUZXN0IEV2ZXJ5dGhpbmcgT3BlbkFQSQoKVGhpcyBpcyB0ZXN0aW5nICoqcmVhZG1lIHJlbmRlcmluZyoqLgoKIyMgTWlzYwoKLSBbIF0gSXRlbSAxCi0gWyBdIEl0ZW0gMgotIFt4XSBJdGVtIDMKCi0tLQoKLSBfaXRhbGljXwotICoqYm9sZCoqCi0gW2xpbmtdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20pCi0gYGNvZGVgCgojIyBDb2RlCgpgYGB0cwpjb25zdCBhID0gMQoKZXhwb3J0IGZ1bmN0aW9uIGZvbygpIHsKICBjb25zb2xlLmxvZygnaGVsbG8gd29ybGQnKQp9CmBgYAoKIyMgSW1hZ2VzCgohW0ltYWdlXShodHRwczovL3BsYWNlaG9sZC5jby82MDB4NDAwKQo=',\n      {\n        prefix: '@dev/test'\n      }\n    )\n\n    expect(url).toBeTruthy()\n    expect(new URL(url).origin).toEqual('https://storage.agentic.so')\n    expect(url).toMatchSnapshot()\n  })\n})\n"
  },
  {
    "path": "apps/api/src/lib/storage.ts",
    "content": "import { sha256 } from '@agentic/platform-core'\nimport {\n  DeleteObjectCommand,\n  type DeleteObjectCommandInput,\n  GetObjectCommand,\n  type GetObjectCommandInput,\n  PutObjectCommand,\n  type PutObjectCommandInput,\n  S3Client\n} from '@aws-sdk/client-s3'\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner'\nimport { fileTypeFromBuffer } from 'file-type'\nimport ky from 'ky'\nimport { lookup as lookupMimeType } from 'mrmime'\n\nimport { env } from './env'\n\n// This storage client is designed to work with any S3-compatible storage provider.\n// For Cloudflare R2, see https://developers.cloudflare.com/r2/examples/aws/aws-sdk-js-v3/\n\nconst STORAGE_DOMAIN = 'storage.agentic.so'\nconst Bucket = env.S3_BUCKET\n\nexport const storageClient = new S3Client({\n  region: env.S3_REGION,\n  endpoint: env.S3_ENDPOINT,\n  credentials: {\n    accessKeyId: env.S3_ACCESS_KEY_ID,\n    secretAccessKey: env.S3_ACCESS_KEY_SECRET\n  },\n  requestChecksumCalculation: 'WHEN_REQUIRED',\n  responseChecksumValidation: 'WHEN_REQUIRED'\n})\n\n// This ensures that buckets are created automatically if they don't exist on\n// Cloudflare R2. It won't affect other providers.\n// @see https://developers.cloudflare.com/r2/examples/aws/custom-header/\nstorageClient.middlewareStack.add(\n  (next, _) => async (args) => {\n    const r = args.request as RequestInit\n    r.headers = {\n      'cf-create-bucket-if-missing': 'true',\n      ...r.headers\n    }\n\n    return next(args)\n  },\n  { step: 'build', name: 'customHeaders' }\n)\n\nexport async function getStorageObject(\n  key: string,\n  opts?: Omit<GetObjectCommandInput, 'Bucket' | 'Key'>\n) {\n  return storageClient.send(new GetObjectCommand({ Bucket, Key: key, ...opts }))\n}\n\nexport async function putStorageObject(\n  key: string,\n  value: PutObjectCommandInput['Body'],\n  opts?: Omit<PutObjectCommandInput, 'Bucket' | 'Key' | 'Body'>\n) {\n  return storageClient.send(\n    new PutObjectCommand({ Bucket, Key: key, Body: value, ...opts })\n  )\n}\n\nexport async function deleteStorageObject(\n  key: string,\n  opts?: Omit<DeleteObjectCommandInput, 'Bucket' | 'Key'>\n) {\n  return storageClient.send(\n    new DeleteObjectCommand({ Bucket, Key: key, ...opts })\n  )\n}\n\nexport function getStorageObjectInternalUrl(key: string) {\n  return `${env.S3_ENDPOINT}/${Bucket}/${key}`\n}\n\nexport function getStorageObjectPublicUrl(key: string) {\n  return `${env.AGENTIC_STORAGE_BASE_URL}/${key}`\n}\n\n// TODO: Signed uploads don't seem to be working; getting a signature mismatch\n// error, and no idea why. Switched to using non-presigned URL uploads for now,\n// but this will be necessary in the future, for instance, for the web client\n// to upload files.\nexport async function getStorageSignedUploadUrl(\n  key: string,\n  {\n    expiresIn = 5 * 60 * 1000 // 5 minutes\n  }: {\n    expiresIn?: number\n  } = {}\n) {\n  return getSignedUrl(\n    storageClient,\n    new PutObjectCommand({ Bucket, Key: key }),\n    { expiresIn }\n  )\n}\n\nexport async function uploadFileUrlToStorage(\n  inputUrl: string,\n  {\n    prefix\n  }: {\n    prefix: string\n  }\n): Promise<string> {\n  let source: URL\n\n  try {\n    source = new URL(inputUrl)\n  } catch {\n    // Not a URL\n    throw new Error(`Invalid source file URL: ${inputUrl}`)\n  }\n\n  if (source.hostname === STORAGE_DOMAIN) {\n    // The source is already a public URL hosted on Agentic's blob storage.\n    return source.toString()\n  }\n\n  const sourceBuffer = await ky.get(source).arrayBuffer()\n\n  const [hash, inferredFileType] = await Promise.all([\n    sha256(sourceBuffer),\n    fileTypeFromBuffer(sourceBuffer)\n  ])\n\n  const maybeSourceExt = source.pathname.split('.').at(-1)\n  const maybeSourceExt2 = maybeSourceExt\n    ? /^[a-z]+$/i.test(maybeSourceExt)\n      ? maybeSourceExt\n      : undefined\n    : undefined\n  const maybeSourceMime =\n    source.protocol === 'data:'\n      ? source.pathname.split(',')[0]?.split(';')[0]\n      : undefined\n  const sourceExt0 =\n    maybeSourceExt2 ??\n    (maybeSourceMime && maybeSourceMime !== 'application/octet-stream'\n      ? maybeSourceMime.split('/')[1]?.split('+')[0]\n      : undefined)\n  const sourceExt = sourceExt0 === 'markdown' ? 'md' : sourceExt0\n\n  const fileType =\n    inferredFileType ??\n    (sourceExt\n      ? {\n          ext: sourceExt,\n          mime: lookupMimeType(sourceExt)\n        }\n      : undefined)\n\n  const filename = fileType?.ext ? `${hash}.${fileType.ext}` : hash\n  const key = `${prefix}/${filename}`\n\n  const publicObjectUrl = getStorageObjectPublicUrl(key)\n\n  // console.log('uploading to r2', {\n  //   key,\n  //   source,\n  //   sourceExt,\n  //   maybeSourceMime,\n  //   maybeSourceExt,\n  //   maybeSourceExt2,\n  //   inputUrl,\n  //   fileType,\n  //   publicObjectUrl\n  // })\n\n  try {\n    // Check if the object already exists.\n    await ky.head(publicObjectUrl)\n  } catch {\n    const body = Buffer.from(sourceBuffer)\n\n    // Object doesn't exist yet, so upload it.\n    try {\n      await putStorageObject(key, body, {\n        ContentType: fileType?.mime ?? 'application/octet-stream'\n      })\n    } catch (err: any) {\n      const error = await err.response.text()\n      // eslint-disable-next-line no-console\n      console.error('error uploading to r2', err.message, error)\n      throw err\n    }\n  }\n\n  return publicObjectUrl\n}\n"
  },
  {
    "path": "apps/api/src/lib/temp",
    "content": "import ky from 'ky'\n\nimport { env } from './env'\n\nconst USER_AGENT = 'agentic-platform'\n\n/**\n * GitHub (user-level) OAuth token response.\n *\n * @see https://docs.github.com/apps/oauth\n */\nexport interface GitHubUserTokenResponse {\n  /**\n   * The user access token (always starts with `ghu_`).\n   * Example: `ghu_xxx…`\n   */\n  access_token: string\n\n  /**\n   * Seconds until `access_token` expires.\n   * Omitted (`undefined`) if you’ve disabled token expiration.\n   * Constant `28800` (8 hours) when present.\n   */\n  expires_in?: number\n\n  /**\n   * Refresh token for renewing the user access token (starts with `ghr_`).\n   * Omitted (`undefined`) if you’ve disabled token expiration.\n   */\n  refresh_token?: string\n\n  /**\n   * Seconds until `refresh_token` expires.\n   * Omitted (`undefined`) if you’ve disabled token expiration.\n   * Constant `15897600` (6 months) when present.\n   */\n  refresh_token_expires_in?: number\n\n  /**\n   * Scopes granted to the token.\n   * Always an empty string because the token is limited to\n   * the intersection of app-level and user-level permissions.\n   */\n  scope: ''\n\n  /**\n   * Token type – always `'bearer'`.\n   */\n  token_type: 'bearer'\n}\n\nexport interface GitHubUser {\n  login: string\n  id: number\n  user_view_type?: string\n  node_id: string\n  avatar_url: string\n  gravatar_id: string | null\n  url: string\n  html_url: string\n  followers_url: string\n  following_url: string\n  gists_url: string\n  starred_url: string\n  subscriptions_url: string\n  organizations_url: string\n  repos_url: string\n  events_url: string\n  received_events_url: string\n  type: string\n  site_admin: boolean\n  name: string | null\n  company: string | null\n  blog: string | null\n  location: string | null\n  email: string | null\n  notification_email?: string | null\n  hireable: boolean | null\n  bio: string | null\n  twitter_username?: string | null\n  public_repos: number\n  public_gists: number\n  followers: number\n  following: number\n  created_at: string\n  updated_at: string\n  plan?: {\n    collaborators: number\n    name: string\n    space: number\n    private_repos: number\n    [k: string]: unknown\n  }\n  private_gists?: number\n  total_private_repos?: number\n  owned_private_repos?: number\n  disk_usage?: number\n  collaborators?: number\n}\n\nexport interface GitHubUserEmail {\n  email: string\n  primary: boolean\n  verified: boolean\n  visibility?: string | null\n}\n\nexport async function exchangeOAuthCodeForAccessToken({\n  code,\n  clientId = env.GITHUB_CLIENT_ID,\n  clientSecret = env.GITHUB_CLIENT_SECRET,\n  redirectUri\n}: {\n  code: string\n  clientId?: string\n  clientSecret?: string\n  redirectUri?: string\n}): Promise<GitHubUserTokenResponse> {\n  return ky\n    .post('https://github.com/login/oauth/access_token', {\n      json: {\n        code,\n        client_id: clientId,\n        client_secret: clientSecret,\n        redirect_uri: redirectUri\n      },\n      headers: {\n        'user-agent': USER_AGENT\n      }\n    })\n    .json<GitHubUserTokenResponse>()\n}\n\nexport async function getMe({ token }: { token: string }): Promise<GitHubUser> {\n  return ky\n    .get('https://api.github.com/user', {\n      headers: {\n        Authorization: `Bearer ${token}`,\n        'user-agent': USER_AGENT\n      }\n    })\n    .json<GitHubUser>()\n}\n\nexport async function getUserEmails({\n  token\n}: {\n  token: string\n}): Promise<GitHubUserEmail[]> {\n  return ky\n    .get('https://api.github.com/user/emails', {\n      headers: {\n        Authorization: `Bearer ${token}`,\n        'user-agent': USER_AGENT\n      }\n    })\n    .json<GitHubUserEmail[]>()\n}\n\n// TODO: currently unused\n// export type NullToUndefinedDeep<T> = T extends null\n//   ? undefined\n//   : T extends Date\n//     ? T\n//     : T extends readonly (infer U)[]\n//       ? NullToUndefinedDeep<U>[]\n//       : T extends object\n//         ? { [K in keyof T]: NullToUndefinedDeep<T[K]> }\n//         : T\n\n// // TODO: currently unused\n// export type UndefinedToNullDeep<T> = T extends undefined\n//   ? T | null\n//   : T extends Date\n//     ? T | null\n//     : T extends readonly (infer U)[]\n//       ? UndefinedToNullDeep<U>[]\n//       : T extends object\n//         ? { [K in keyof T]: UndefinedToNullDeep<T[K]> }\n//         : T | null\n\n// // TODO: currently unused\n// export type UndefinedValuesToNullableValues<T> = T extends object\n//   ? { [K in keyof T]: T[K] extends undefined ? T[K] | null : T[K] }\n//   : T\n"
  },
  {
    "path": "apps/api/src/lib/types.ts",
    "content": "import type {\n  DefaultHonoBindings,\n  DefaultHonoEnv,\n  DefaultHonoVariables\n} from '@agentic/platform-hono'\nimport type { OpenAPIHono } from '@hono/zod-openapi'\nimport type { Context } from 'hono'\nimport type { Simplify } from 'type-fest'\n\nimport type { RawTeamMember, RawUser } from '@/db'\n\nimport type { Env } from './env'\n\nexport type AuthenticatedHonoVariables = Simplify<\n  DefaultHonoVariables & {\n    userId: string\n    user?: RawUser\n    teamMember?: RawTeamMember\n  }\n>\n\nexport type AuthenticatedHonoBindings = Simplify<DefaultHonoBindings & Env>\n\nexport type AuthenticatedHonoEnv = {\n  Bindings: AuthenticatedHonoBindings\n  Variables: AuthenticatedHonoVariables\n}\n\nexport type AuthenticatedHonoContext = Context<AuthenticatedHonoEnv>\n\nexport type HonoApp = OpenAPIHono<DefaultHonoEnv>\nexport type AuthenticatedHonoApp = OpenAPIHono<AuthenticatedHonoEnv>\n"
  },
  {
    "path": "apps/api/src/lib/utils.ts",
    "content": "import { timingSafeEqual } from 'node:crypto'\n\nexport function timingSafeCompare(a: string, b: string): boolean {\n  if (typeof a !== 'string' || typeof b !== 'string') {\n    return false\n  }\n\n  if (a.length !== b.length) {\n    return false\n  }\n\n  return timingSafeEqual(Buffer.from(a), Buffer.from(b))\n}\n"
  },
  {
    "path": "apps/api/src/oauth-redirect.ts",
    "content": "import type { DefaultHonoEnv } from '@agentic/platform-hono'\nimport type { OpenAPIHono } from '@hono/zod-openapi'\nimport { assert } from '@agentic/platform-core'\n\nexport function registerOAuthRedirect(app: OpenAPIHono<DefaultHonoEnv>) {\n  return app.all('/oauth/callback', async (ctx) => {\n    const logger = ctx.get('logger')\n\n    if (ctx.req.query('state')) {\n      const { state: state64, ...query } = ctx.req.query()\n\n      // google oauth + others\n      const { uri, ...state } = JSON.parse(\n        Buffer.from(state64!, 'base64').toString()\n      ) as any\n\n      assert(\n        uri,\n        404,\n        `Error oauth redirect not found \"${new URLSearchParams(ctx.req.query()).toString()}\"`\n      )\n\n      const searchParams = new URLSearchParams({\n        ...state,\n        ...query\n      })\n      const redirectUri = `${uri}?${searchParams.toString()}`\n\n      logger.info(\n        'OAUTH CALLBACK',\n        ctx.req.method,\n        ctx.req.url,\n        ctx.req.query(),\n        '=>',\n        redirectUri\n      )\n      return ctx.redirect(redirectUri)\n    } else {\n      // github oauth\n      // https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/#redirect-urls\n      const { uri, ...params } = ctx.req.query()\n\n      assert(\n        uri,\n        404,\n        `Error oauth redirect not found \"${new URLSearchParams(ctx.req.query()).toString()}\"`\n      )\n\n      const searchParams = new URLSearchParams(params)\n      const redirectUri = `${uri}?${searchParams.toString()}`\n      logger.info(\n        'OAUTH CALLBACK',\n        ctx.req.method,\n        ctx.req.url,\n        ctx.req.query(),\n        '=>',\n        redirectUri\n      )\n\n      return ctx.redirect(redirectUri)\n    }\n  })\n}\n"
  },
  {
    "path": "apps/api/src/reset.d.ts",
    "content": "import '@fisch0920/config/ts-reset'\n"
  },
  {
    "path": "apps/api/src/server.ts",
    "content": "import '@/lib/external/sentry'\n\nimport { type DefaultHonoEnv, errorHandler } from '@agentic/platform-hono'\nimport { serve } from '@hono/node-server'\nimport { OpenAPIHono } from '@hono/zod-openapi'\nimport * as Sentry from '@sentry/node'\n\nimport { apiV1 } from '@/api-v1'\nimport { env } from '@/lib/env'\nimport * as middleware from '@/lib/middleware'\n\nimport { initExitHooks } from './lib/exit-hooks'\n// import { registerOAuthRedirect } from './oauth-redirect'\n\nexport const app = new OpenAPIHono<DefaultHonoEnv>()\n\napp.onError(errorHandler)\napp.use(middleware.sentry())\napp.use(middleware.compress())\napp.use(\n  middleware.cors({\n    origin: '*',\n    allowHeaders: ['Content-Type', 'Authorization'],\n    allowMethods: ['POST', 'GET', 'OPTIONS'],\n    exposeHeaders: ['Content-Length'],\n    maxAge: 600,\n    credentials: true\n  })\n)\napp.use(middleware.init)\napp.use(middleware.accessLogger)\napp.use(middleware.responseTime)\n\n// TODO: top-level auth routes\n// registerOAuthRedirect(app)\n\n// Mount all v1 API routes\napp.route('/v1', apiV1)\n\napp.doc31('/docs', {\n  openapi: '3.1.0',\n  info: { title: 'Agentic', version: '0.1.0' }\n})\n\nconst server = serve({\n  fetch: (req, bindings) =>\n    app.fetch(req, { ...bindings, ...env, sentry: Sentry }),\n  port: env.PORT\n})\n\ninitExitHooks({ server })\n\n// eslint-disable-next-line no-console\nconsole.log(`Server running on port ${env.PORT}`)\n"
  },
  {
    "path": "apps/api/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/*\": [\"src/*\"]\n    }\n  },\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "apps/api/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup'\n\nexport default defineConfig([\n  {\n    entry: ['src/server.ts'],\n    outDir: 'dist',\n    target: 'node22',\n    platform: 'node',\n    format: ['esm'],\n    splitting: false,\n    sourcemap: true,\n    minify: false,\n    shims: true,\n    dts: true\n  }\n])\n"
  },
  {
    "path": "apps/api/vitest.config.ts",
    "content": "import tsconfigPaths from 'vite-tsconfig-paths'\nimport { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n  plugins: [tsconfigPaths()],\n  test: {\n    environment: 'node',\n    globals: true,\n    watch: false,\n    restoreMocks: true\n  }\n})\n"
  },
  {
    "path": "apps/e2e/bin/deploy-fixtures.ts",
    "content": "import { deployProjects } from '../src/deploy-projects'\nimport { devClient } from '../src/dev-client'\nimport { fixtures } from '../src/dev-fixtures'\n\nasync function main() {\n  console.log('\\n\\nDeploying dev fixtures...\\n\\n')\n\n  const deployments = await deployProjects(fixtures, { client: devClient })\n  console.log(JSON.stringify(deployments, null, 2))\n\n  // eslint-disable-next-line unicorn/no-process-exit\n  process.exit(0)\n}\n\nawait main()\n"
  },
  {
    "path": "apps/e2e/bin/publish-fixtures.ts",
    "content": "import { deployProjects } from '../src/deploy-projects'\nimport { devClient } from '../src/dev-client'\nimport { fixtures } from '../src/dev-fixtures'\nimport { publishDeployments } from '../src/publish-deployments'\n\nasync function main() {\n  console.log('\\n\\nDeploying dev fixtures...\\n\\n')\n\n  const deployments = await deployProjects(fixtures, { client: devClient })\n  console.log(JSON.stringify(deployments, null, 2))\n\n  console.log('\\n\\nPublishing dev fixture deployments...\\n\\n')\n\n  const publishedDeployments = await publishDeployments(deployments, {\n    client: devClient\n  })\n  console.log(JSON.stringify(publishedDeployments, null, 2))\n\n  // eslint-disable-next-line unicorn/no-process-exit\n  process.exit(0)\n}\n\nawait main()\n"
  },
  {
    "path": "apps/e2e/bin/seed-db.ts",
    "content": "import { AgenticApiClient } from '@agentic/platform-api-client'\n\nimport { examples } from '../src/agentic-examples'\nimport { deployProjects } from '../src/deploy-projects'\nimport { fixtures } from '../src/dev-fixtures'\nimport { env, isProd } from '../src/env'\nimport { publishDeployments } from '../src/publish-deployments'\n\nexport const client = new AgenticApiClient({\n  apiBaseUrl: env.AGENTIC_API_BASE_URL\n})\n\nasync function main() {\n  {\n    console.log('\\n\\nCreating \"dev\" user...\\n\\n')\n\n    const devAuthSession = await client.signUpWithPassword({\n      username: 'dev',\n      email: env.AGENTIC_DEV_EMAIL,\n      password: env.AGENTIC_DEV_PASSWORD\n    })\n    console.log(JSON.stringify(devAuthSession, null, 2))\n\n    console.warn(\n      `\\n\\nREMEMBER TO UPDATE \"AGENTIC_DEV_ACCESS_TOKEN\" in e2e/.env${isProd ? '.production' : ''}\\n\\n`\n    )\n\n    console.log('\\n\\nDeploying dev fixtures...\\n\\n')\n\n    const deployments = await deployProjects(fixtures, { client })\n    console.log(JSON.stringify(deployments, null, 2))\n\n    console.log('\\n\\nPublishing dev fixture deployments...\\n\\n')\n\n    const publishedDeployments = await publishDeployments(deployments, {\n      client\n    })\n    console.log(JSON.stringify(publishedDeployments, null, 2))\n  }\n\n  {\n    console.log('\\n\\nCreating \"agentic\" user...\\n\\n')\n\n    const agenticAuthSession = await client.signUpWithPassword({\n      username: 'agentic',\n      email: env.AGENTIC_AGENTIC_EMAIL,\n      password: env.AGENTIC_AGENTIC_PASSWORD\n    })\n    console.log(JSON.stringify(agenticAuthSession, null, 2))\n\n    console.log('\\n\\nDeploying example projects...\\n\\n')\n\n    const deployments = await deployProjects(examples, { client })\n    console.log(JSON.stringify(deployments, null, 2))\n\n    console.log('\\n\\nPublishing example project deployments...\\n\\n')\n\n    const publishedDeployments = await publishDeployments(deployments, {\n      client\n    })\n    console.log(JSON.stringify(publishedDeployments, null, 2))\n  }\n\n  // eslint-disable-next-line unicorn/no-process-exit\n  process.exit(0)\n}\n\nawait main()\n"
  },
  {
    "path": "apps/e2e/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-e2e-tests\",\n  \"private\": true,\n  \"version\": \"8.4.4\",\n  \"description\": \"Internal Agentic platform E2E tests.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"apps/e2e\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"deploy-fixtures\": \"dotenvx run -- tsx bin/deploy-fixtures.ts\",\n    \"deploy-fixtures:prod\": \"dotenvx run -o -f .env.production -- tsx bin/deploy-fixtures.ts\",\n    \"publish-fixtures\": \"dotenvx run -- tsx bin/publish-fixtures.ts\",\n    \"publish-fixtures:prod\": \"dotenvx run -o -f .env.production -- tsx bin/publish-fixtures.ts\",\n    \"seed-db\": \"dotenvx run -- tsx bin/seed-db.ts\",\n    \"seed-db:prod\": \"dotenvx run -o -f .env.production -- tsx bin/seed-db.ts\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"e2e\": \"dotenvx run -- vitest run\",\n    \"e2e-http\": \"dotenvx run -- vitest run src/http-e2e.test.ts\",\n    \"e2e-mcp\": \"dotenvx run -- vitest run src/mcp-e2e.test.ts\",\n    \"e2e:prod\": \"dotenvx run -o -f .env.production -- vitest run\",\n    \"e2e-http:prod\": \"dotenvx run -o -f .env.production -- vitest run src/http-e2e.test.ts\",\n    \"e2e-mcp:prod\": \"dotenvx run -o -f .env.production -- vitest run src/mcp-e2e.test.ts\"\n  },\n  \"dependencies\": {\n    \"dotenv\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"p-map\": \"catalog:\",\n    \"p-times\": \"catalog:\",\n    \"semver\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"@agentic/platform-api-client\": \"workspace:*\",\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-fixtures\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@modelcontextprotocol/sdk\": \"catalog:\",\n    \"@types/semver\": \"catalog:\",\n    \"fast-content-type-parse\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "apps/e2e/src/__snapshots__/http-e2e.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`HTTP => MCP origin basic \"add\" tool > 6.0: POST @dev/test-basic-mcp/add 1`] = `\n[\n  {\n    \"text\": \"42\",\n    \"type\": \"text\",\n  },\n]\n`;\n\nexports[`HTTP => MCP origin basic \"add\" tool > 6.1: GET @dev/test-basic-mcp/add 1`] = `\n[\n  {\n    \"text\": \"42\",\n    \"type\": \"text\",\n  },\n]\n`;\n\nexports[`HTTP => OpenAPI origin basic GET caching > 4.0: GET @dev/test-basic-openapi/getPost 1`] = `\n{\n  \"body\": \"aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam\",\n  \"id\": 13,\n  \"title\": \"dolorum ut in voluptas mollitia et saepe quo animi\",\n  \"userId\": 2,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic GET caching > 4.1: GET @dev/test-basic-openapi/getPost?postId=13 1`] = `\n{\n  \"body\": \"aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam\",\n  \"id\": 13,\n  \"title\": \"dolorum ut in voluptas mollitia et saepe quo animi\",\n  \"userId\": 2,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic GET caching > 4.2: GET @dev/test-basic-openapi/get_post?postId=13 1`] = `\n{\n  \"body\": \"aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam\",\n  \"id\": 13,\n  \"title\": \"dolorum ut in voluptas mollitia et saepe quo animi\",\n  \"userId\": 2,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic POST caching > 5.0: POST @dev/test-basic-openapi/get_post 1`] = `\n{\n  \"body\": \"aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam\",\n  \"id\": 13,\n  \"title\": \"dolorum ut in voluptas mollitia et saepe quo animi\",\n  \"userId\": 2,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic POST caching > 5.1: POST @dev/test-basic-openapi/get_post 1`] = `\n{\n  \"body\": \"aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam\",\n  \"id\": 13,\n  \"title\": \"dolorum ut in voluptas mollitia et saepe quo animi\",\n  \"userId\": 2,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic bypass caching > 3.0: GET @dev/test-basic-openapi/getPost 1`] = `\n{\n  \"body\": \"consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas\",\n  \"id\": 9,\n  \"title\": \"nesciunt iure omnis dolorem tempora et accusantium\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic bypass caching > 3.1: GET @dev/test-basic-openapi/getPost?postId=9 1`] = `\n{\n  \"body\": \"consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas\",\n  \"id\": 9,\n  \"title\": \"nesciunt iure omnis dolorem tempora et accusantium\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic bypass caching > 3.2: GET @dev/test-basic-openapi/get_post?postId=9 1`] = `\n{\n  \"body\": \"consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas\",\n  \"id\": 9,\n  \"title\": \"nesciunt iure omnis dolorem tempora et accusantium\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic bypass caching > 3.3: GET @dev/test-basic-openapi/get_post?postId=9 1`] = `\n{\n  \"body\": \"consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas\",\n  \"id\": 9,\n  \"title\": \"nesciunt iure omnis dolorem tempora et accusantium\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic bypass caching > 3.4: GET @dev/test-basic-openapi/get_post?postId=9 1`] = `\n{\n  \"body\": \"consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas\",\n  \"id\": 9,\n  \"title\": \"nesciunt iure omnis dolorem tempora et accusantium\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost errors > 1.8: POST @dev/test-basic-openapi/getPost 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost errors > 1.9: GET @dev/test-basic-openapi/getPost 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost success > 0.0: POST @dev/test-basic-openapi/getPost 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost success > 0.1: POST @dev/test-basic-openapi@latest/getPost 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost success > 0.2: GET @dev/test-basic-openapi/getPost 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost success > 0.3: GET @dev/test-basic-openapi/getPost?postId=1 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost success > 0.4: GET @dev/test-basic-openapi/get_post?postId=1 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin basic getPost success > 0.5: GET @dev/test-basic-openapi/getPost 1`] = `\n{\n  \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n  \"id\": 1,\n  \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n  \"userId\": 1,\n}\n`;\n\nexports[`HTTP => OpenAPI origin default bypass caching > 2.0: GET @dev/test-everything-openapi/echo 1`] = `\n{\n  \"postId\": \"9\",\n}\n`;\n\nexports[`HTTP => OpenAPI origin everything \"echo\" tool with empty body > 10.0: POST @dev/test-everything-openapi/echo 1`] = `{}`;\n\nexports[`HTTP => OpenAPI origin everything \"pure\" tool > 8.0: POST @dev/test-everything-openapi/pure 1`] = `\n{\n  \"foo\": \"bar\",\n  \"nala\": \"kitten\",\n}\n`;\n\nexports[`HTTP => OpenAPI origin everything \"pure\" tool > 8.1: POST @dev/test-everything-openapi/pure 1`] = `\n{\n  \"foo\": \"bar\",\n  \"nala\": \"kitten\",\n}\n`;\n"
  },
  {
    "path": "apps/e2e/src/__snapshots__/mcp-e2e.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`MCP => OpenAPI origin basic @ dev get_post success  > 2.0: @dev/test-basic-openapi@dev/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"dignissimos aperiam dolorem qui eum\nfacilis quibusdam animi sint suscipit qui sint possimus cum\nquaerat magni maiores excepturi\nipsam ut commodi dolor voluptatum modi aut vitae\",\n    \"id\": 8,\n    \"title\": \"dolorem dolore est ipsam\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic @ latest get_post success  > 1.0: @dev/test-basic-openapi@latest/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut\",\n    \"id\": 3,\n    \"title\": \"ea molestias quasi exercitationem repellat qui ipsa sit aut\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic bypass caching > 6.0: @dev/test-everything-openapi/mcp echo 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"postId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic caching > 7.0: @dev/test-basic-openapi/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n    \"id\": 1,\n    \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic caching > 7.1: @dev/test-basic-openapi/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n    \"id\": 1,\n    \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic caching > 7.2: @dev/test-basic-openapi/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n    \"id\": 1,\n    \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic get_post errors > 4.3: @dev/test-basic-openapi/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"dolore placeat quibusdam ea quo vitae\nmagni quis enim qui quis quo nemo aut saepe\nquidem repellat excepturi ut quia\nsunt ut sequi eos ea sed quas\",\n    \"id\": 7,\n    \"title\": \"magnam facilis autem\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic get_post success > 0.0: @dev/test-basic-openapi/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n    \"id\": 1,\n    \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic normalized caching > 8.0: @dev/test-basic-openapi/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n    \"id\": 1,\n    \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin basic normalized caching > 8.1: @dev/test-basic-openapi/mcp get_post 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"body\": \"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto\",\n    \"id\": 1,\n    \"title\": \"sunt aut facere repellat provident occaecati excepturi optio reprehenderit\",\n    \"userId\": 1,\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin everything \"echo\" tool with empty body > 13.0: @dev/test-everything-openapi/mcp echo 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {},\n}\n`;\n\nexports[`MCP => OpenAPI origin everything \"pure\" tool > 11.0: @dev/test-everything-openapi/mcp echo 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"foo\": \"bar\",\n    \"nala\": \"kitten\",\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin everything \"pure\" tool > 11.1: @dev/test-everything-openapi/mcp echo 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"foo\": \"bar\",\n    \"nala\": \"kitten\",\n  },\n}\n`;\n\nexports[`MCP => OpenAPI origin everything errors > 5.0: @dev/test-everything-openapi/mcp strict_additional_properties 1`] = `\n{\n  \"content\": [],\n  \"isError\": false,\n  \"structuredContent\": {\n    \"foo\": \"bar\",\n  },\n}\n`;\n"
  },
  {
    "path": "apps/e2e/src/agentic-examples.ts",
    "content": "import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst exampleProjectNames = ['search']\n\nconst examplesDir = path.join(\n  fileURLToPath(import.meta.url),\n  '..',\n  '..',\n  '..',\n  '..',\n  'examples',\n  'mcp-servers'\n)\n\nexport const examples = exampleProjectNames.map((name) =>\n  path.join(examplesDir, name)\n)\n"
  },
  {
    "path": "apps/e2e/src/deploy-projects.ts",
    "content": "import type { AgenticApiClient } from '@agentic/platform-api-client'\nimport { loadAgenticConfig } from '@agentic/platform'\nimport pMap from 'p-map'\n\nexport async function deployProjects(\n  projects: string[],\n  {\n    client,\n    concurrency = 1\n  }: {\n    client: AgenticApiClient\n    concurrency?: number\n  }\n) {\n  const deployments = await pMap(\n    projects,\n    async (project) => {\n      const config = await loadAgenticConfig({\n        cwd: project\n      })\n      const deployment = await client.createDeployment(config)\n      console.log(`Deployed ${project} => ${deployment.identifier}`)\n\n      return deployment\n    },\n    {\n      concurrency\n    }\n  )\n\n  return deployments\n}\n"
  },
  {
    "path": "apps/e2e/src/dev-client.ts",
    "content": "import { AgenticApiClient } from '@agentic/platform-api-client'\n\nimport { env } from './env'\n\nexport const devClient = new AgenticApiClient({\n  apiBaseUrl: env.AGENTIC_API_BASE_URL,\n  apiKey: env.AGENTIC_DEV_ACCESS_TOKEN\n})\n"
  },
  {
    "path": "apps/e2e/src/dev-fixtures.ts",
    "content": "import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst fixtureNames = [\n  // TODO: re-add these\n  // 'basic-raw-free-ts',\n  // 'basic-raw-free-json',\n  // 'pricing-freemium',\n  // 'pricing-pay-as-you-go',\n  // 'pricing-3-plans',\n  // 'pricing-monthly-annual',\n  // 'pricing-custom-0',\n  'basic-openapi',\n  'basic-mcp',\n  'everything-openapi'\n]\n\nconst fixturesDir = path.join(\n  fileURLToPath(import.meta.url),\n  '..',\n  '..',\n  '..',\n  '..',\n  'fixtures'\n)\nconst validFixturesDir = path.join(fixturesDir, 'valid')\n\nexport const fixtures = fixtureNames.map((name) =>\n  path.join(validFixturesDir, name)\n)\n"
  },
  {
    "path": "apps/e2e/src/env.ts",
    "content": "import 'dotenv/config'\n\nimport { parseZodSchema } from '@agentic/platform-core'\nimport { z } from 'zod'\n\n// TODO: derive AGENTIC_API_BASE_URL and AGENTIC_GATEWAY_BASE_URL based on\n// environment.\n// TODO: use `@agentic/platform-hono` base env like other services\n\nexport const envSchema = z.object({\n  ENVIRONMENT: z\n    .enum(['development', 'test', 'production'])\n    .default('development'),\n\n  AGENTIC_API_BASE_URL: z.string().url().optional(),\n\n  AGENTIC_DEV_EMAIL: z.string().email(),\n  AGENTIC_DEV_PASSWORD: z.string().nonempty(),\n  AGENTIC_DEV_ACCESS_TOKEN: z.string().nonempty(),\n\n  AGENTIC_AGENTIC_EMAIL: z.string().email(),\n  AGENTIC_AGENTIC_PASSWORD: z.string().nonempty(),\n\n  AGENTIC_GATEWAY_BASE_URL: z\n    .string()\n    .url()\n    .optional()\n    .default('http://localhost:8787')\n})\n\n// eslint-disable-next-line no-process-env\nexport const env = parseZodSchema(envSchema, process.env, {\n  error: 'Invalid environment variables'\n})\n\nexport const isProd = env.ENVIRONMENT === 'production'\n"
  },
  {
    "path": "apps/e2e/src/http-e2e.test.ts",
    "content": "import contentType from 'fast-content-type-parse'\nimport defaultKy from 'ky'\nimport pTimes from 'p-times'\nimport { describe, expect, test } from 'vitest'\n\nimport { env } from './env'\nimport { fixtureSuites } from './http-fixtures'\n\nconst ky = defaultKy.extend({\n  prefixUrl: env.AGENTIC_GATEWAY_BASE_URL,\n\n  // Disable automatic retries for testing.\n  retry: 0,\n\n  // Some tests expect HTTP errors, so handle them manually instead of throwing.\n  throwHttpErrors: false\n})\n\nfor (const [i, fixtureSuite] of fixtureSuites.entries()) {\n  const {\n    title,\n    fixtures,\n    compareResponseBodies = false,\n    repeat,\n    repeatConcurrency = 1,\n    repeatSuccessCriteria = 'all'\n  } = fixtureSuite\n\n  const describeFn = fixtureSuite.only ? describe.only : describe\n  describeFn(title, () => {\n    let fixtureResponseBody: any | undefined\n\n    if (repeat) {\n      expect(repeat).toBeGreaterThan(0)\n    }\n\n    for (const [j, fixture] of fixtures.entries()) {\n      const method = fixture.request?.method ?? 'GET'\n      const timeout = fixture.timeout ?? 30_000\n      const {\n        status = 200,\n        contentType: expectedContentType = 'application/json',\n        headers: expectedHeaders,\n        body: expectedBody,\n        validate\n      } = fixture.response ?? {}\n      const snapshot =\n        fixture.response?.snapshot ??\n        fixtureSuite.snapshot ??\n        (status >= 200 && status < 300)\n      const debugFixture = !!(\n        fixture.debug ??\n        fixtureSuite.debug ??\n        fixture.only ??\n        fixtureSuite.only\n      )\n      const fixtureName = `${i}.${j}: ${method} ${fixture.path}`\n\n      let testFn = (fixture.only ?? fixture.debug) ? test.only : test\n      if (fixtureSuite.sequential) {\n        testFn = testFn.sequential\n      }\n\n      testFn(\n        fixtureName,\n        {\n          timeout\n        },\n        // eslint-disable-next-line no-loop-func\n        async () => {\n          const numIterations = repeat ?? 1\n          let numSuccessCases = 0\n\n          await pTimes(\n            numIterations,\n            async (iteration: number) => {\n              const repeatIterationPrefix = repeat\n                ? `[${iteration}/${numIterations}] `\n                : ''\n\n              const res = await ky(fixture.path, {\n                timeout,\n                ...fixture.request\n              })\n\n              if (\n                res.status !== status &&\n                (res.status >= 500 || status === 200)\n              ) {\n                let body: any\n                try {\n                  body = await res.json()\n                } catch {}\n\n                console.error(\n                  `${repeatIterationPrefix}${fixtureName} => UNEXPECTED ERROR ${res.status} (expected ${status}):`,\n                  JSON.stringify(body, null, 2)\n                )\n              }\n\n              if (repeat) {\n                if (res.status === status) {\n                  ++numSuccessCases\n                } else {\n                  if (debugFixture) {\n                    console.log(\n                      `${repeatIterationPrefix}${fixtureName} => ${res.status} (invalid sample; expected ${status})`,\n                      {\n                        headers: Object.fromEntries(res.headers.entries())\n                      }\n                    )\n                  }\n\n                  return\n                }\n              } else {\n                expect(res.status).toBe(status)\n              }\n\n              const { type } = contentType.safeParse(\n                res.headers.get('content-type') ?? ''\n              )\n              expect(type).toBe(expectedContentType)\n\n              let body: any\n\n              if (type.includes('json')) {\n                try {\n                  body = await res.json()\n                } catch (err) {\n                  console.error('json error', err)\n                  throw err\n                }\n              } else if (type.includes('text')) {\n                body = await res.text()\n              } else {\n                body = await res.arrayBuffer()\n              }\n\n              if (debugFixture) {\n                console.log(\n                  `${repeatIterationPrefix}${fixtureName} => ${res.status}`,\n                  body,\n                  {\n                    headers: Object.fromEntries(res.headers.entries())\n                  }\n                )\n              }\n\n              if (expectedBody) {\n                expect(body).toEqual(expectedBody)\n              }\n\n              if (validate) {\n                await Promise.resolve(validate(body))\n              }\n\n              if (snapshot) {\n                expect(body).toMatchSnapshot()\n              }\n\n              if (expectedHeaders) {\n                for (const [key, value] of Object.entries(expectedHeaders)) {\n                  expect(res.headers.get(key)).toBe(value)\n                }\n              }\n\n              if (compareResponseBodies && status >= 200 && status < 300) {\n                if (!fixtureResponseBody) {\n                  fixtureResponseBody = body\n                } else {\n                  expect(body).toEqual(fixtureResponseBody)\n                }\n              }\n            },\n            { concurrency: repeatConcurrency, stopOnError: true }\n          )\n\n          if (repeat) {\n            if (repeatSuccessCriteria === 'all') {\n              expect(numSuccessCases).toBe(numIterations)\n            } else if (repeatSuccessCriteria === 'some') {\n              expect(numSuccessCases).toBeGreaterThan(0)\n            } else if (typeof repeatSuccessCriteria === 'function') {\n              await Promise.resolve(repeatSuccessCriteria(numSuccessCases))\n            }\n          }\n        }\n      )\n    }\n  })\n}\n"
  },
  {
    "path": "apps/e2e/src/http-fixtures.ts",
    "content": "import { expect } from 'vitest'\n\nexport type E2ETestFixture = {\n  path: string\n\n  /** @default 60_000 milliseconds */\n  timeout?: number\n\n  /** @default false */\n  only?: boolean\n\n  /** @default false */\n  debug?: boolean\n\n  request?: {\n    /** @default 'GET' */\n    method?: 'GET' | 'POST' | 'PUT' | 'DELETE'\n    searchParams?: Record<string, string | number | boolean>\n    headers?: Record<string, string>\n    json?: Record<string, unknown>\n    body?: any\n  }\n\n  response?: {\n    /** @default 200 */\n    status?: number\n    /** @default 'application/json' */\n    contentType?: string\n    headers?: Record<string, string>\n    body?: any\n    validate?: (body: any) => void | Promise<void>\n    /** @default true */\n    snapshot?: boolean\n  }\n}\n\nexport type E2ETestFixtureSuite = {\n  title: string\n  fixtures: E2ETestFixture[]\n\n  /**\n   * Development-only flag that runs exclusively this test suite, ignoring all others.\n   * Uses Vitest's `describe.only()` to focus on a single test suite.\n   *\n   * ⚠️ WARNING: Never commit this as `true` - it will cause CI to skip all other tests.\n   *\n   * @default false\n   */\n  only?: boolean\n\n  /** @default false */\n  sequential?: boolean\n\n  /** @default false */\n  compareResponseBodies?: boolean\n\n  /** @default false */\n  debug?: boolean\n\n  /** @default undefined */\n  snapshot?: boolean\n\n  /** @default undefined */\n  repeat?: number\n\n  /** @default 1 */\n  repeatConcurrency?: number\n\n  /** @default 'all' */\n  repeatSuccessCriteria?:\n    | 'all'\n    | 'some'\n    | ((numRepeatSuccesses: number) => void | Promise<void>)\n}\n\nconst now = Date.now()\n\nexport const fixtureSuites: E2ETestFixtureSuite[] = [\n  {\n    title: 'HTTP => OpenAPI origin basic getPost success',\n    compareResponseBodies: true,\n    fixtures: [\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          method: 'POST',\n          json: {\n            postId: 1\n          }\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi@latest/getPost',\n        request: {\n          method: 'POST',\n          json: {\n            postId: 1\n          }\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          searchParams: {\n            // all of these GET requests implicitly test type coercion since\n            // `postId` as a query param will be a string, but the tool expects\n            // an integer.\n            postId: 1\n          }\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost?postId=1'\n      },\n      {\n        path: '@dev/test-basic-openapi/get_post?postId=1'\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          searchParams: {\n            postId: 1\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin basic getPost errors',\n    fixtures: [\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          method: 'GET'\n        },\n        response: {\n          // Missing `postId` parameter.\n          status: 400\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost?postId=foo',\n        response: {\n          status: 400\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi@00000000/getPost',\n        response: {\n          // deployment hash 00000000 doesn't exist\n          status: 404\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          method: 'PUT',\n          json: {\n            postId: 1\n          }\n        },\n        response: {\n          // PUT is not a valid method (must be POST)\n          status: 405\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi@latest/get_kittens?postId=1',\n        response: {\n          status: 404\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          searchParams: {\n            // invalid `postId` field type\n            postId: 'not-a-number'\n          }\n        },\n        response: {\n          status: 400\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          method: 'POST',\n          json: {\n            // invalid `postId` field type\n            postId: 'not-a-number'\n          }\n        },\n        response: {\n          status: 400\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          method: 'POST',\n          json: {\n            // missing required `postId` field\n          }\n        },\n        response: {\n          status: 400\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          method: 'POST',\n          json: {\n            postId: 1,\n            // additional json body params are allowed by default\n            foo: 'bar'\n          }\n        },\n        response: {\n          status: 200\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          searchParams: {\n            postId: 1,\n            // additional search params should allowed by default\n            foo: 'bar'\n          }\n        },\n        response: {\n          status: 200\n        }\n      },\n      {\n        path: '@dev/test-everything-openapi/strict_additional_properties',\n        request: {\n          method: 'POST',\n          json: {\n            foo: 'bar',\n            // additional json body params should throw an error if the tool\n            // config has `additionalProperties: false`\n            extra: 'nala'\n          }\n        },\n        response: {\n          status: 400\n        }\n      },\n      {\n        path: '@dev/test-everything-openapi/strict_additional_properties',\n        request: {\n          method: 'GET',\n          searchParams: {\n            foo: 'bar',\n            // additional search params should throw an error if the tool\n            // config has `additionalProperties: false`\n            extra: 'nala'\n          }\n        },\n        response: {\n          status: 400\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin default bypass caching',\n    compareResponseBodies: true,\n    fixtures: [\n      {\n        // ensure we bypass the cache for requests for tools which do not have\n        // a custom `pure` or `cacheControl` set in their tool config.\n        path: '@dev/test-everything-openapi/echo',\n        request: {\n          searchParams: {\n            postId: 9\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'BYPASS'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin basic bypass caching',\n    compareResponseBodies: true,\n    fixtures: [\n      {\n        // ensure we bypass the cache for requests with `pragma: no-cache`\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          headers: {\n            pragma: 'no-cache'\n          },\n          searchParams: {\n            postId: 9\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'BYPASS'\n          }\n        }\n      },\n      {\n        // ensure we bypass the cache for requests with `cache-control: no-cache`\n        path: '@dev/test-basic-openapi/getPost?postId=9',\n        request: {\n          headers: {\n            'cache-control': 'no-cache'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'BYPASS'\n          }\n        }\n      },\n      {\n        // ensure we bypass the cache for requests with `cache-control: no-store`\n        path: '@dev/test-basic-openapi/get_post?postId=9',\n        request: {\n          headers: {\n            'cache-control': 'no-store'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'BYPASS'\n          }\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/get_post?postId=9',\n        request: {\n          headers: {\n            'cache-control': 'max-age=0, must-revalidate, no-cache'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'BYPASS'\n          }\n        }\n      },\n      {\n        path: '@dev/test-basic-openapi/get_post?postId=9',\n        request: {\n          headers: {\n            'cache-control': 'private, max-age=3600, must-revalidate'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'BYPASS'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin basic GET caching',\n    compareResponseBodies: true,\n    sequential: true,\n    fixtures: [\n      {\n        // first request to ensure the cache is populated\n        path: '@dev/test-basic-openapi/getPost',\n        request: {\n          headers: {\n            'cache-control':\n              'public, max-age=3600, s-maxage=3600, stale-while-revalidate=3600'\n          },\n          searchParams: {\n            postId: 13\n          }\n        }\n      },\n      {\n        // second request should hit the cache\n        path: '@dev/test-basic-openapi/getPost?postId=13',\n        request: {\n          headers: {\n            'cache-control':\n              'public, max-age=3600, s-maxage=3600, stale-while-revalidate=3600'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'HIT'\n          }\n        }\n      },\n      {\n        // normalized request with different path should also hit the cache\n        path: '@dev/test-basic-openapi/get_post?postId=13',\n        request: {\n          headers: {\n            'cache-control':\n              'public, max-age=3600, s-maxage=3600, stale-while-revalidate=3600'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'HIT'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin basic POST caching',\n    compareResponseBodies: true,\n    sequential: true,\n    fixtures: [\n      {\n        // first request to ensure the cache is populated\n        path: '@dev/test-basic-openapi/get_post',\n        request: {\n          method: 'POST',\n          json: {\n            postId: 13\n          }\n        }\n      },\n      {\n        // second request should hit the cache\n        path: '@dev/test-basic-openapi/get_post',\n        request: {\n          method: 'POST',\n          json: {\n            postId: 13\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'HIT'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => MCP origin basic \"add\" tool',\n    compareResponseBodies: true,\n    fixtures: [\n      {\n        path: '@dev/test-basic-mcp/add',\n        request: {\n          method: 'POST',\n          json: {\n            a: 22,\n            b: 20\n          }\n        },\n        response: {\n          body: [{ type: 'text', text: '42' }]\n        }\n      },\n      {\n        path: '@dev/test-basic-mcp/add',\n        request: {\n          searchParams: {\n            a: 22,\n            b: 20\n          }\n        },\n        response: {\n          body: [{ type: 'text', text: '42' }]\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => MCP origin basic \"echo\" tool',\n    snapshot: false,\n    fixtures: [\n      {\n        path: '@dev/test-basic-mcp/echo',\n        request: {\n          method: 'POST',\n          json: {\n            nala: 'kitten',\n            num: 123,\n            now\n          }\n        },\n        response: {\n          body: [\n            {\n              type: 'text',\n              text: JSON.stringify({ nala: 'kitten', num: 123, now })\n            }\n          ]\n        }\n      },\n      {\n        path: '@dev/test-basic-mcp/echo',\n        request: {\n          searchParams: {\n            nala: 'kitten',\n            num: 123,\n            now\n          }\n        },\n        response: {\n          body: [\n            {\n              type: 'text',\n              text: JSON.stringify({\n                nala: 'kitten',\n                num: '123',\n                now: `${now}`\n              })\n            }\n          ]\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin everything \"pure\" tool',\n    sequential: true,\n    compareResponseBodies: true,\n    fixtures: [\n      {\n        path: '@dev/test-everything-openapi/pure',\n        request: {\n          method: 'POST',\n          json: {\n            nala: 'kitten',\n            foo: 'bar'\n          }\n        },\n        response: {\n          headers: {\n            'cache-control':\n              'public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600'\n          },\n          body: {\n            nala: 'kitten',\n            foo: 'bar'\n          }\n        }\n      },\n      {\n        // second request should hit the cache\n        path: '@dev/test-everything-openapi/pure',\n        request: {\n          method: 'POST',\n          json: {\n            nala: 'kitten',\n            foo: 'bar'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'HIT',\n            'cache-control':\n              'public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600'\n          },\n          body: {\n            nala: 'kitten',\n            foo: 'bar'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin everything \"disabled_tool\" tool',\n    fixtures: [\n      {\n        path: '@dev/test-everything-openapi/disabled_tool',\n        request: {\n          method: 'POST'\n        },\n        response: {\n          // 400 because the request body is missing\n          status: 400\n        }\n      },\n      {\n        path: '@dev/test-everything-openapi/disabled_tool',\n        request: {\n          method: 'POST',\n          json: {}\n        },\n        response: {\n          // 404 because the tool is disabled which means its hidden\n          status: 404\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin everything \"echo\" tool with empty body',\n    compareResponseBodies: true,\n    fixtures: [\n      {\n        path: '@dev/test-everything-openapi/echo',\n        request: {\n          method: 'POST',\n          json: {}\n        },\n        response: {\n          body: {}\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin everything \"unpure_marked_pure\" tool',\n    compareResponseBodies: true,\n    snapshot: false,\n    fixtures: [\n      {\n        path: '@dev/test-everything-openapi/unpure_marked_pure',\n        request: {\n          method: 'POST',\n          json: {\n            nala: 'cat'\n          }\n        },\n        response: {\n          validate: (body) => {\n            expect(body?.nala).toEqual('cat')\n            expect(typeof body.now).toBe('number')\n            expect(body.now).toBeGreaterThan(0)\n          }\n        }\n      },\n      {\n        // compareResponseBodies should result in the same cached response body,\n        // even though the origin would return a different `now` value if it\n        // weren't marked `pure`.\n        path: '@dev/test-everything-openapi/unpure_marked_pure',\n        request: {\n          method: 'POST',\n          json: {\n            nala: 'cat'\n          }\n        },\n        response: {\n          headers: {\n            'cf-cache-status': 'HIT'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'HTTP => OpenAPI origin everything \"echo_headers\" tool',\n    snapshot: false,\n    fixtures: [\n      {\n        path: '@dev/test-everything-openapi/echo_headers',\n        response: {\n          validate: (body) => {\n            expect(body['x-agentic-proxy-secret']).toBeTruthy()\n            expect(body['x-agentic-proxy-secret']?.length).toBe(64)\n            expect(body['x-agentic-deployment-id']).toBeTruthy()\n            expect(\n              body['x-agentic-deployment-id']?.startsWith('depl_')\n            ).toBeTruthy()\n            expect(body['x-agentic-deployment-identifier']).toBeTruthy()\n            expect(body['x-agentic-is-customer-subscription-active']).toEqual(\n              'false'\n            )\n            expect(body['x-agentic-user-id']).toBeUndefined()\n            expect(body['x-agentic-customer-id']).toBeUndefined()\n          }\n        }\n      }\n    ]\n  },\n  {\n    title:\n      'HTTP => OpenAPI origin everything \"custom_rate_limit_tool\" (strict mode)',\n    repeat: 5,\n    repeatSuccessCriteria: (numRepeatSuccesses) => {\n      expect(\n        numRepeatSuccesses,\n        'should have at least three 429 responses out of 5 requests with a strict rate limit of 2 requests per 30s'\n      ).toBeGreaterThanOrEqual(3)\n    },\n    fixtures: [\n      {\n        path: '@dev/test-everything-openapi/custom_rate_limit_tool',\n        response: {\n          status: 429,\n          headers: {\n            'ratelimit-policy': '2;w=30',\n            'ratelimit-limit': '2'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title:\n      'HTTP => OpenAPI origin everything \"custom_rate_limit_approximate_tool\" (approximate mode)',\n    repeat: 16,\n    repeatConcurrency: 8,\n    repeatSuccessCriteria: (numRepeatSuccesses) => {\n      expect(\n        numRepeatSuccesses,\n        'should have at least one 429 response'\n      ).toBeGreaterThan(0)\n    },\n    fixtures: [\n      {\n        path: '@dev/test-everything-openapi/custom_rate_limit_approximate_tool',\n        response: {\n          status: 429,\n          headers: {\n            'ratelimit-policy': '2;w=30',\n            'ratelimit-limit': '2'\n          }\n        }\n      }\n    ]\n  }\n  // TODO\n  // {\n  //   title: 'HTTP => Production MCP origin \"search\" tool',\n  //   // NOTE: this one actually hits a production service and costs a small\n  //   // amount of $ per request.\n  //   fixtures: [\n  //     {\n  //       path: '@agentic/search/search',\n  //       request: {\n  //         method: 'POST',\n  //         json: {\n  //           query: 'latest ai news'\n  //         }\n  //       },\n  //       response: {\n  //         snapshot: false\n  //       }\n  //     }\n  //   ]\n  // }\n]\n"
  },
  {
    "path": "apps/e2e/src/mcp-e2e.test.ts",
    "content": "import { pick } from '@agentic/platform-core'\nimport { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport pTimes from 'p-times'\nimport { afterAll, beforeAll, describe, expect, test } from 'vitest'\n\nimport { env } from './env'\nimport { fixtureSuites } from './mcp-fixtures'\n\nfor (const [i, fixtureSuite] of fixtureSuites.entries()) {\n  const {\n    title,\n    fixtures,\n    compareResponseBodies = false,\n    repeat,\n    repeatConcurrency = 1,\n    repeatSuccessCriteria = 'all'\n  } = fixtureSuite\n\n  const describeFn = fixtureSuite.only ? describe.only : describe\n  describeFn(title, () => {\n    let fixtureResult: any | undefined\n    let client: McpClient\n\n    if (repeat) {\n      expect(repeat).toBeGreaterThan(0)\n    }\n\n    beforeAll(async () => {\n      client = new McpClient({\n        name: fixtureSuite.path,\n        version: '0.0.0'\n      })\n\n      // TODO: add origin requestInit headers\n      const transport = new StreamableHTTPClientTransport(\n        new URL(fixtureSuite.path, env.AGENTIC_GATEWAY_BASE_URL)\n      )\n      await client.connect(transport)\n\n      const { tools } = await client.listTools()\n\n      // Ensure all tools used by the test fixtures in this suite are available.\n      // Ignore test fixtures which are expected to error.\n      for (const [_, fixture] of fixtures.entries()) {\n        const { isError } = fixture.response ?? {}\n        if (!isError) {\n          const toolName = fixture.request.name\n          expect(tools.map((t) => t.name)).toContain(toolName)\n        }\n      }\n    }, 120_000)\n\n    afterAll(async () => {\n      await client.close()\n    })\n\n    for (const [j, fixture] of fixtures.entries()) {\n      const {\n        isError,\n        result: expectedResult,\n        content: expectedContent,\n        structuredContent: expectedStructuredContent,\n        _meta: expectedMeta,\n        _agenticMeta: expectedAgenticMeta,\n        _agenticMetaHeaders: expectedAgenticMetaHeaders,\n        validate\n      } = fixture.response ?? {}\n      const toolName = fixture.request.name\n      const expectedSnapshot =\n        fixture.response?.snapshot ?? fixtureSuite.snapshot ?? false\n      const expectedStableSnapshot =\n        fixture.response?.stableSnapshot ??\n        fixture.response?.snapshot ??\n        fixtureSuite.stableSnapshot ??\n        fixtureSuite.snapshot ??\n        !isError\n      const debugFixture = !!(\n        fixture.debug ??\n        fixtureSuite.debug ??\n        fixture.only ??\n        fixtureSuite.only\n      )\n      const fixtureName = `${i}.${j}: ${fixtureSuite.path} ${toolName}`\n\n      let testFn = (fixture.only ?? fixture.debug) ? test.only : test\n      if (fixtureSuite.sequential) {\n        testFn = testFn.sequential\n      }\n\n      testFn(\n        fixtureName,\n        {\n          timeout: fixture.timeout ?? 60_000\n        },\n        // eslint-disable-next-line no-loop-func\n        async () => {\n          const numIterations = repeat ?? 1\n          let numSuccessCases = 0\n\n          await pTimes(\n            numIterations,\n            async (iteration: number) => {\n              const repeatIterationPrefix = repeat\n                ? `[${iteration}/${numIterations}] `\n                : ''\n\n              const result = await client.callTool({\n                name: toolName,\n                arguments: fixture.request.args,\n                _meta: fixture.request._meta\n              })\n\n              if (repeat) {\n                if (result.isError === isError) {\n                  ++numSuccessCases\n                } else {\n                  if (debugFixture) {\n                    console.log(\n                      `${repeatIterationPrefix}${fixtureName} => (invalid sample; expected ${result.isError ? 'error' : 'no error'})`,\n                      JSON.stringify(result, null, 2)\n                    )\n                  }\n\n                  return\n                }\n              }\n\n              if (debugFixture) {\n                console.log(\n                  `${repeatIterationPrefix}${fixtureName} =>`,\n                  JSON.stringify(result, null, 2)\n                )\n              }\n\n              if (isError) {\n                expect(result.isError).toBeTruthy()\n              } else {\n                expect(result.isError).toBeFalsy()\n              }\n\n              if (expectedResult) {\n                expect(result).toEqual(expectedResult)\n              }\n\n              if (expectedContent) {\n                expect(result.content).toEqual(expectedContent)\n              }\n\n              if (expectedStructuredContent) {\n                expect(result.structuredContent).toEqual(\n                  expectedStructuredContent\n                )\n              }\n\n              if (expectedMeta) {\n                expect(result._meta).toBeDefined()\n                expect(typeof result._meta).toEqual('object')\n                expect(!Array.isArray(result._meta)).toBeTruthy()\n                for (const [key, value] of Object.entries(expectedMeta)) {\n                  expect(result._meta![key]).toEqual(value)\n                }\n              }\n              if (expectedAgenticMeta) {\n                expect(result._meta).toBeDefined()\n                expect(result._meta?.agentic).toBeDefined()\n                expect(typeof result._meta?.agentic).toEqual('object')\n                expect(!Array.isArray(result._meta?.agentic)).toBeTruthy()\n                for (const [key, value] of Object.entries(\n                  expectedAgenticMeta\n                )) {\n                  expect((result._meta!.agentic as any)[key]).toEqual(value)\n                }\n              }\n\n              if (expectedAgenticMetaHeaders) {\n                expect(result._meta).toBeDefined()\n                expect(result._meta?.agentic).toBeDefined()\n                expect(typeof result._meta?.agentic).toEqual('object')\n                expect(!Array.isArray(result._meta?.agentic)).toBeTruthy()\n                expect(typeof (result._meta?.agentic as any)?.headers).toEqual(\n                  'object'\n                )\n                expect(\n                  !Array.isArray((result._meta?.agentic as any)?.headers)\n                ).toBeTruthy()\n                for (const [key, value] of Object.entries(\n                  expectedAgenticMetaHeaders\n                )) {\n                  expect((result._meta!.agentic as any).headers[key]).toEqual(\n                    value\n                  )\n                }\n              }\n\n              if (expectedSnapshot) {\n                expect(result).toMatchSnapshot()\n              }\n\n              const stableResult = pick(\n                result,\n                'content',\n                'structuredContent',\n                'isError'\n              )\n\n              if (expectedStableSnapshot) {\n                expect(stableResult).toMatchSnapshot()\n              }\n\n              if (validate) {\n                await Promise.resolve(validate(result))\n              }\n\n              if (compareResponseBodies && !isError) {\n                if (!fixtureResult) {\n                  fixtureResult = stableResult\n                } else {\n                  expect(stableResult).toEqual(fixtureResult)\n                }\n              }\n            },\n            { concurrency: repeatConcurrency, stopOnError: true }\n          )\n\n          if (repeat) {\n            if (repeatSuccessCriteria === 'all') {\n              expect(numSuccessCases).toBe(numIterations)\n            } else if (repeatSuccessCriteria === 'some') {\n              expect(numSuccessCases).toBeGreaterThan(0)\n            } else if (typeof repeatSuccessCriteria === 'function') {\n              await Promise.resolve(repeatSuccessCriteria(numSuccessCases))\n            }\n          }\n        }\n      )\n    }\n  })\n}\n"
  },
  {
    "path": "apps/e2e/src/mcp-fixtures.ts",
    "content": "import { expect } from 'vitest'\n\nexport type MCPE2ETestFixture = {\n  /** @default 60_000 milliseconds */\n  timeout?: number\n\n  /** @default false */\n  only?: boolean\n\n  /** @default false */\n  debug?: boolean\n\n  request: {\n    name: string\n    args: Record<string, unknown>\n    _meta?: Record<string, unknown>\n  }\n\n  response?: {\n    result?: any\n    /** @default false */\n    isError?: boolean\n    content?: Array<Record<string, unknown>>\n    structuredContent?: any\n    _meta?: Record<string, unknown>\n    _agenticMeta?: Record<string, unknown>\n    _agenticMetaHeaders?: Record<string, unknown>\n    validate?: (result: any) => void | Promise<void>\n    /** @default undefined */\n    snapshot?: boolean\n    /** @default true */\n    stableSnapshot?: boolean\n  }\n}\n\nexport type MCPE2ETestFixtureSuite = {\n  title: string\n  path: string\n  fixtures: MCPE2ETestFixture[]\n\n  /** @default false */\n  only?: boolean\n\n  /** @default false */\n  sequential?: boolean\n\n  /** @default false */\n  compareResponseBodies?: boolean\n\n  /** @default false */\n  debug?: boolean\n\n  /**\n   * Not used by default because the result `_meta.agentic` contains some\n   * metadata which may not be stable across test runs such as `cacheStatus`\n   * and `headers`.\n   *\n   * @default false\n   */\n  snapshot?: boolean\n\n  /** @default undefined */\n  stableSnapshot?: boolean\n\n  /** @default undefined */\n  repeat?: number\n\n  /** @default 1 */\n  repeatConcurrency?: number\n\n  /** @default 'all' */\n  repeatSuccessCriteria?:\n    | 'all'\n    | 'some'\n    | ((numRepeatSuccesses: number) => void | Promise<void>)\n}\n\nconst now = Date.now()\n\nexport const fixtureSuites: MCPE2ETestFixtureSuite[] = [\n  {\n    title: 'MCP => OpenAPI origin basic get_post success',\n    path: '@dev/test-basic-openapi/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 1\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin basic @ latest get_post success ',\n    path: '@dev/test-basic-openapi@latest/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 3\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin basic @ dev get_post success ',\n    path: '@dev/test-basic-openapi@dev/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 8\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => MCP origin basic \"echo\" tool call success',\n    path: '@dev/test-basic-mcp/mcp',\n    stableSnapshot: false,\n    fixtures: [\n      {\n        request: {\n          name: 'echo',\n          args: {\n            nala: 'kitten',\n            num: 123,\n            now\n          }\n        },\n        response: {\n          content: [\n            {\n              type: 'text',\n              text: JSON.stringify({ nala: 'kitten', num: 123, now })\n            }\n          ],\n          _agenticMeta: {\n            cacheStatus: 'DYNAMIC'\n          }\n        }\n      },\n      {\n        request: {\n          name: 'echo',\n          args: {\n            nala: 'kitten',\n            num: 123,\n            now: `${now}`\n          }\n        },\n        response: {\n          content: [\n            {\n              type: 'text',\n              text: JSON.stringify({\n                nala: 'kitten',\n                num: 123,\n                now: `${now}`\n              })\n            }\n          ],\n          _agenticMeta: {\n            cacheStatus: 'DYNAMIC'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin basic get_post errors',\n    path: '@dev/test-basic-openapi/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            // Missing required `postId` parameter\n            nala: 'kitten',\n            num: 123,\n            now\n          }\n        },\n        response: {\n          isError: true,\n          _agenticMeta: {\n            status: 400\n          }\n        }\n      },\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            // invalid `postId` parameter\n            postId: 'not-a-number'\n          }\n        },\n        response: {\n          isError: true,\n          _agenticMeta: {\n            status: 400\n          }\n        }\n      },\n      {\n        request: {\n          name: 'get_kittens',\n          args: {\n            postId: 7\n          }\n        },\n        response: {\n          isError: true,\n          _agenticMeta: {\n            // 'get_kittens' tool doesn't exist\n            status: 404,\n            toolName: 'get_kittens'\n          }\n        }\n      },\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 7,\n            // additional json body params are allowed by default\n            foo: 'bar'\n          }\n        },\n        response: {\n          isError: false\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin everything errors',\n    path: '@dev/test-everything-openapi/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'strict_additional_properties',\n          args: {\n            foo: 'bar'\n          }\n        },\n        response: {\n          isError: false\n        }\n      },\n      {\n        request: {\n          name: 'strict_additional_properties',\n          args: {\n            foo: 'bar',\n            // additional params should throw an error if the tool\n            // config has `additionalProperties: false`\n            extra: 'nala'\n          }\n        },\n        response: {\n          isError: true,\n          _agenticMeta: {\n            status: 400\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin basic bypass caching',\n    path: '@dev/test-everything-openapi/mcp',\n    fixtures: [\n      {\n        // ensure we bypass the cache for requests for tools which do not have\n        // a custom `pure` or `cacheControl` set in their tool config.\n        request: {\n          name: 'echo',\n          args: {\n            postId: 1\n          }\n        },\n        response: {\n          isError: false,\n          _agenticMeta: {\n            cacheStatus: 'BYPASS'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin basic caching',\n    path: '@dev/test-basic-openapi/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 1\n          }\n        },\n        response: {\n          isError: false\n        }\n      },\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 1\n          }\n        },\n        response: {\n          isError: false,\n          _agenticMeta: {\n            // second request should hit the cache\n            cacheStatus: 'HIT'\n          }\n        }\n      },\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 1\n          },\n          // disable caching via a custom metadata cache-control header\n          _meta: {\n            agentic: {\n              headers: {\n                'cache-control': 'no-store'\n              }\n            }\n          }\n        },\n        response: {\n          isError: false,\n          _agenticMeta: {\n            cacheStatus: 'BYPASS'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin basic normalized caching',\n    path: '@dev/test-basic-openapi/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            postId: 1,\n            foo: true,\n            nala: 'kitten'\n          }\n        },\n        response: {\n          isError: false\n        }\n      },\n      {\n        request: {\n          name: 'get_post',\n          args: {\n            foo: true,\n            postId: 1,\n            nala: 'kitten'\n          }\n        },\n        response: {\n          isError: false,\n          _agenticMeta: {\n            // second request should hit the cache even though the args are in a\n            // different order\n            cacheStatus: 'HIT'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => MCP origin basic \"add\" tool call success',\n    path: '@dev/test-basic-mcp/mcp',\n    stableSnapshot: false,\n    fixtures: [\n      {\n        request: {\n          name: 'add',\n          args: {\n            a: 13,\n            b: 49\n          }\n        },\n        response: {\n          isError: false,\n          content: [{ type: 'text', text: '62' }]\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => MCP origin basic \"echo\" tool',\n    path: '@dev/test-basic-mcp/mcp',\n    stableSnapshot: false,\n    fixtures: [\n      {\n        request: {\n          name: 'echo',\n          args: {\n            nala: 'kitten',\n            num: 123,\n            now\n          }\n        },\n        response: {\n          isError: false,\n          content: [\n            {\n              type: 'text',\n              text: JSON.stringify({ nala: 'kitten', num: 123, now })\n            }\n          ]\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin everything \"pure\" tool',\n    path: '@dev/test-everything-openapi/mcp',\n    compareResponseBodies: true,\n    fixtures: [\n      {\n        request: {\n          name: 'echo',\n          args: {\n            nala: 'kitten',\n            foo: 'bar'\n          },\n          _meta: {\n            agentic: {\n              headers: {\n                'cache-control':\n                  'public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600'\n              }\n            }\n          }\n        },\n        response: {\n          isError: false,\n          structuredContent: {\n            nala: 'kitten',\n            foo: 'bar'\n          }\n        }\n      },\n      {\n        // second request should hit the cache\n        request: {\n          name: 'echo',\n          args: {\n            nala: 'kitten',\n            foo: 'bar'\n          },\n          _meta: {\n            agentic: {\n              headers: {\n                'cache-control':\n                  'public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600'\n              }\n            }\n          }\n        },\n        response: {\n          isError: false,\n          structuredContent: {\n            nala: 'kitten',\n            foo: 'bar'\n          },\n          _agenticMeta: {\n            cacheStatus: 'HIT'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin everything \"disabled_tool\" tool',\n    path: '@dev/test-everything-openapi/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'disabled_tool',\n          args: {\n            foo: 'bar'\n          }\n        },\n        response: {\n          isError: true,\n          _agenticMeta: {\n            status: 404,\n            toolName: 'disabled_tool'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin everything \"echo\" tool with empty body',\n    path: '@dev/test-everything-openapi/mcp',\n    fixtures: [\n      {\n        request: {\n          name: 'echo',\n          args: {}\n        },\n        response: {\n          isError: false,\n          structuredContent: {}\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin everything \"unpure_marked_pure\" tool',\n    path: '@dev/test-everything-openapi/mcp',\n    compareResponseBodies: true,\n    stableSnapshot: false,\n    fixtures: [\n      {\n        request: {\n          name: 'unpure_marked_pure',\n          args: {\n            nala: 'cat'\n          }\n        },\n        response: {\n          isError: false,\n          validate: (result) => {\n            const body = result.structuredContent\n            expect(body?.nala).toEqual('cat')\n            expect(typeof body.now).toBe('number')\n            expect(body.now).toBeGreaterThan(0)\n          }\n        }\n      },\n      {\n        // compareResponseBodies should result in the same cached response body,\n        // even though the origin would return a different `now` value if it\n        // weren't marked `pure`.\n        request: {\n          name: 'unpure_marked_pure',\n          args: {\n            nala: 'cat'\n          }\n        },\n        response: {\n          isError: false,\n          _agenticMeta: {\n            cacheStatus: 'HIT'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title: 'MCP => OpenAPI origin everything \"echo_headers\" tool',\n    path: '@dev/test-everything-openapi/mcp',\n    stableSnapshot: false,\n    fixtures: [\n      {\n        request: {\n          name: 'echo_headers',\n          args: {}\n        },\n        response: {\n          validate: (result) => {\n            expect(\n              result.structuredContent['x-agentic-proxy-secret']\n            ).toBeTruthy()\n            expect(\n              result.structuredContent['x-agentic-proxy-secret']?.length\n            ).toBe(64)\n            expect(\n              result.structuredContent['x-agentic-deployment-id']\n            ).toBeTruthy()\n            expect(\n              result.structuredContent['x-agentic-deployment-id']?.startsWith(\n                'depl_'\n              )\n            ).toBeTruthy()\n            expect(\n              result.structuredContent['x-agentic-deployment-identifier']\n            ).toBeTruthy()\n            expect(\n              result.structuredContent[\n                'x-agentic-is-customer-subscription-active'\n              ]\n            ).toEqual('false')\n            expect(\n              result.structuredContent['x-agentic-user-id']\n            ).toBeUndefined()\n            expect(\n              result.structuredContent['x-agentic-customer-id']\n            ).toBeUndefined()\n          }\n        }\n      }\n    ]\n  },\n  {\n    title:\n      'MCP => OpenAPI origin everything \"custom_rate_limit_tool\" (strict mode)',\n    path: '@dev/test-everything-openapi/mcp',\n    repeat: 5,\n    repeatSuccessCriteria: (numRepeatSuccesses) => {\n      expect(\n        numRepeatSuccesses,\n        'should have at least three 429 responses out of 5 requests with a strict rate limit of 2 requests per 30s'\n      ).toBeGreaterThanOrEqual(3)\n    },\n    fixtures: [\n      {\n        request: {\n          name: 'custom_rate_limit_tool',\n          args: {}\n        },\n        response: {\n          isError: true,\n          _agenticMeta: {\n            status: 429\n          },\n          _agenticMetaHeaders: {\n            'ratelimit-policy': '2;w=30',\n            'ratelimit-limit': '2'\n          }\n        }\n      }\n    ]\n  },\n  {\n    title:\n      'MCP => OpenAPI origin everything \"custom_rate_limit_approximate_tool\" (approximate mode)',\n    path: '@dev/test-everything-openapi/mcp',\n    repeat: 16,\n    repeatConcurrency: 8,\n    repeatSuccessCriteria: (numRepeatSuccesses) => {\n      expect(\n        numRepeatSuccesses,\n        'should have at least one 429 response'\n      ).toBeGreaterThan(0)\n    },\n    fixtures: [\n      {\n        request: {\n          name: 'custom_rate_limit_approximate_tool',\n          args: {}\n        },\n        response: {\n          isError: true,\n          _agenticMeta: {\n            status: 429\n          },\n          _agenticMetaHeaders: {\n            'ratelimit-policy': '2;w=30',\n            'ratelimit-limit': '2'\n          }\n        }\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "apps/e2e/src/publish-deployments.ts",
    "content": "import type { AgenticApiClient } from '@agentic/platform-api-client'\nimport type { Deployment } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\nimport pMap from 'p-map'\nimport semver from 'semver'\n\nexport async function publishDeployments(\n  deployments: Deployment[],\n  {\n    client,\n    concurrency = 1\n  }: {\n    client: AgenticApiClient\n    concurrency?: number\n  }\n) {\n  const publishedDeployments = await pMap(\n    deployments,\n    async (deployment) => {\n      const project = await client.getProject({\n        projectId: deployment.projectId,\n        populate: ['lastDeployment']\n      })\n\n      const baseVersion = project.lastPublishedDeploymentVersion || '0.0.0'\n      const version = semver.inc(baseVersion, 'patch')\n      assert(version, `Failed to increment deployment version \"${baseVersion}\"`)\n\n      const publishedDeployment = await client.publishDeployment(\n        { version },\n        {\n          deploymentId: deployment.id\n        }\n      )\n      console.log(`Published ${deployment.identifier} => ${version}`)\n\n      return publishedDeployment\n    },\n    {\n      concurrency\n    }\n  )\n\n  return publishedDeployments\n}\n"
  },
  {
    "path": "apps/e2e/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"bin\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "apps/e2e/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n  test: {\n    environment: 'node',\n    globals: true,\n    watch: false,\n    restoreMocks: true\n  }\n})\n"
  },
  {
    "path": "apps/gateway/.dev.vars.example",
    "content": "ENVIRONMENT=\nSENTRY_DSN=\n\nAGENTIC_API_BASE_URL=\nAGENTIC_API_KEY=\n\nSTRIPE_SECRET_KEY=\n"
  },
  {
    "path": "apps/gateway/package.json",
    "content": "{\n  \"name\": \"gateway\",\n  \"private\": true,\n  \"version\": \"8.4.4\",\n  \"description\": \"Internal Agentic platform API gateway.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"apps/gateway\"\n  },\n  \"type\": \"module\",\n  \"source\": \"./src/worker.ts\",\n  \"scripts\": {\n    \"dev\": \"wrangler dev\",\n    \"deploy\": \"wrangler deploy --env production --outdir dist --upload-source-maps --var SENTRY_RELEASE:$(sentry-cli releases propose-version)\",\n    \"deploy:cf\": \"wrangler deploy --env production --outdir dist --upload-source-maps\",\n    \"cf-clear-cache\": \"del .wrangler\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\",\n    \"sentry:sourcemaps\": \"_SENTRY_RELEASE=$(sentry-cli releases propose-version) && sentry-cli releases new $_SENTRY_RELEASE --org=agentic-platform --project=gateway && sentry-cli sourcemaps upload --org=agentic-platform --project=gateway --release=$_SENTRY_RELEASE --strip-prefix 'dist/..' dist\",\n    \"postdeploy\": \"pnpm sentry:sourcemaps\"\n  },\n  \"dependencies\": {\n    \"@agentic/json-schema\": \"workspace:*\",\n    \"@agentic/platform-api-client\": \"workspace:*\",\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-hono\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@agentic/platform-validators\": \"workspace:*\",\n    \"@hono/zod-validator\": \"catalog:\",\n    \"@modelcontextprotocol/sdk\": \"catalog:\",\n    \"@sentry/cloudflare\": \"catalog:\",\n    \"agents\": \"catalog:\",\n    \"fast-content-type-parse\": \"catalog:\",\n    \"hono\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"plur\": \"catalog:\",\n    \"sort-keys\": \"catalog:\",\n    \"stripe\": \"catalog:\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@cloudflare/workers-types\": \"catalog:\",\n    \"@edge-runtime/vm\": \"catalog:\",\n    \"@sentry/cli\": \"catalog:\",\n    \"wrangler\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/app.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport {\n  applyRateLimitHeaders,\n  cors,\n  errorHandler,\n  init,\n  responseTime,\n  sentry\n} from '@agentic/platform-hono'\nimport { Hono } from 'hono'\n\nimport type {\n  GatewayHonoEnv,\n  ResolvedHttpEdgeRequest,\n  ResolvedOriginToolCallResult\n} from './lib/types'\nimport { createAgenticClient } from './lib/agentic-client'\nimport { createHttpResponseFromMcpToolCallResponse } from './lib/create-http-response-from-mcp-tool-call-response'\nimport { recordToolCallUsage } from './lib/record-tool-call-usage'\nimport { resolveEdgeRequest } from './lib/resolve-edge-request'\nimport { resolveHttpEdgeRequest } from './lib/resolve-http-edge-request'\nimport { resolveMcpEdgeRequest } from './lib/resolve-mcp-edge-request'\nimport { resolveOriginToolCall } from './lib/resolve-origin-tool-call'\nimport { isRequestPubliclyCacheable } from './lib/utils'\nimport { DurableMcpServer } from './worker'\n\nexport const app = new Hono<GatewayHonoEnv>()\n\napp.onError(errorHandler)\napp.use(sentry())\n\n// TODO: Compression is causing a weird bug on dev even for simple responses.\n// I think it's because wrangler is changing the response to be streamed\n// with `transfer-encoding: chunked`, which is not compatible with\n// `hono/compress`.\n// app.use(compress())\n\napp.use(\n  cors({\n    origin: '*',\n    allowHeaders: ['Content-Type', 'Authorization', 'mcp-session-id'],\n    allowMethods: ['GET', 'POST', 'DELETE', 'OPTIONS'],\n    exposeHeaders: ['Content-Length', 'mcp-session-id'],\n    maxAge: 86_400,\n    credentials: true\n  })\n)\napp.use(init)\n\n// Wrangler does this for us. TODO: Does this happen on prod?\n// app.use(accessLogger)\n\napp.use(responseTime)\n\napp.all(async (ctx) => {\n  const waitUntil = ctx.executionCtx.waitUntil.bind(ctx.executionCtx)\n  const isCachingEnabled = isRequestPubliclyCacheable(ctx.req.raw)\n  ctx.set('cache', caches.default)\n  ctx.set(\n    'client',\n    createAgenticClient({\n      env: ctx.env,\n      cache: caches.default,\n      isCachingEnabled,\n      waitUntil\n    })\n  )\n\n  // Resolve the edge request to a specific deployment and mode (MCP or HTTP)\n  const resolvedEdgeRequest = await resolveEdgeRequest(ctx)\n\n  // Handle MCP requests\n  if (resolvedEdgeRequest.edgeRequestMode === 'MCP') {\n    ctx.set('isJsonRpcRequest', true)\n    const executionCtx = ctx.executionCtx as any\n    const mcpInfo = await resolveMcpEdgeRequest(ctx, resolvedEdgeRequest)\n    executionCtx.props = mcpInfo\n\n    return DurableMcpServer.serve('/*', {\n      binding: 'DO_MCP_SERVER'\n    }).fetch(ctx.req.raw, ctx.env, executionCtx)\n  }\n\n  // Handle HTTP requests\n  let resolvedHttpEdgeRequest: ResolvedHttpEdgeRequest | undefined\n  let resolvedOriginToolCallResult: ResolvedOriginToolCallResult | undefined\n  let originResponse: Response | undefined\n  let res: Response | undefined\n\n  try {\n    // Resolve the http edge request to a specific consumer and tool call\n    resolvedHttpEdgeRequest = await resolveHttpEdgeRequest(\n      ctx,\n      resolvedEdgeRequest\n    )\n\n    // Invoke the origin tool call.\n    resolvedOriginToolCallResult = await resolveOriginToolCall({\n      ...resolvedHttpEdgeRequest,\n      args: resolvedHttpEdgeRequest.toolCallArgs,\n      sessionId: ctx.get('sessionId')!,\n      env: ctx.env,\n      waitUntil\n    })\n\n    // Transform the origin tool call response into an http response.\n    if (resolvedOriginToolCallResult.originResponse) {\n      originResponse = resolvedOriginToolCallResult.originResponse\n    } else {\n      originResponse = await createHttpResponseFromMcpToolCallResponse(ctx, {\n        ...resolvedHttpEdgeRequest,\n        toolCallResponse: resolvedOriginToolCallResult.toolCallResponse,\n        toolConfig: resolvedOriginToolCallResult.toolConfig\n      })\n    }\n\n    assert(originResponse, 500, 'Origin response is required')\n\n    // Post-process the origin response.\n    res = updateResponse(originResponse, resolvedOriginToolCallResult)\n    return res\n  } catch (err: any) {\n    // Convert the error into an http response and post-process it.\n    res = errorHandler(err, ctx)\n    res = updateResponse(res, resolvedOriginToolCallResult)\n    return res\n  } finally {\n    // Record the tool call usage.\n    if (resolvedHttpEdgeRequest && res) {\n      recordToolCallUsage({\n        ...resolvedHttpEdgeRequest,\n        httpResponse: res,\n        resolvedOriginToolCallResult,\n        sessionId: ctx.get('sessionId')!,\n        env: ctx.env,\n        waitUntil\n      })\n    }\n  }\n})\n\nfunction updateResponse(\n  response: Response,\n  resolvedOriginToolCallResult?: ResolvedOriginToolCallResult\n) {\n  const res = new Response(response.body, response)\n\n  if (resolvedOriginToolCallResult) {\n    if (resolvedOriginToolCallResult.rateLimitResult) {\n      applyRateLimitHeaders({\n        res,\n        rateLimitResult: resolvedOriginToolCallResult.rateLimitResult\n      })\n    }\n\n    // Record the time it took for the origin to respond.\n    res.headers.set(\n      'x-origin-response-time',\n      `${resolvedOriginToolCallResult.originTimespanMs}ms`\n    )\n  }\n\n  // Reset server to Agentic because Cloudflare likes to override things\n  res.headers.set('server', 'agentic')\n\n  // Remove extra Cloudflare headers\n  res.headers.delete('x-powered-by')\n  res.headers.delete('via')\n  res.headers.delete('nel')\n  res.headers.delete('report-to')\n  res.headers.delete('server-timing')\n  res.headers.delete('reporting-endpoints')\n\n  return res\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/__snapshots__/utils.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`createAgenticMcpMetadata 1`] = `\"{\"agentic\":{\"deploymentId\":\"123\",\"consumerId\":\"456\",\"toolName\":\"test\",\"status\":200,\"cacheStatus\":\"HIT\"}}\"`;\n"
  },
  {
    "path": "apps/gateway/src/lib/agentic-client.ts",
    "content": "import { AgenticApiClient } from '@agentic/platform-api-client'\nimport defaultKy from 'ky'\n\nimport type { RawEnv } from './env'\nimport type { WaitUntil } from './types'\nimport { isCacheControlPubliclyCacheable } from './utils'\n\nexport function createAgenticClient({\n  env,\n  cache,\n  waitUntil,\n  isCachingEnabled = true\n}: {\n  env: RawEnv\n  cache: Cache\n  waitUntil: WaitUntil\n  isCachingEnabled?: boolean\n}) {\n  const client = new AgenticApiClient({\n    apiBaseUrl: env.AGENTIC_API_BASE_URL,\n    apiKey: env.AGENTIC_API_KEY,\n    ky: isCachingEnabled\n      ? defaultKy.extend({\n          hooks: {\n            // NOTE: The order of the `beforeRequest` hook matters, and it only\n            // works alongside the one in AgenticApiClient because that one's body\n            // should never be run. This only works because we're using `apiKey`\n            // authentication, which is a lil hacky since it's actually a long-\n            // lived access token.\n            beforeRequest: [\n              async (request) => {\n                // Check the cache first before making a request to Agentic's\n                // backend API.\n                return cache.match(request)\n              }\n            ],\n\n            afterResponse: [\n              async (request, _options, response) => {\n                if (\n                  !isCacheControlPubliclyCacheable(\n                    response.headers.get('cache-control')\n                  )\n                ) {\n                  return\n                }\n\n                // Asynchronously update the cache with the response from\n                // Agentic's backend API.\n                waitUntil(\n                  cache.put(request, response.clone()).catch((err) => {\n                    // eslint-disable-next-line no-console\n                    console.warn('cache put error', request, err)\n                  })\n                )\n              }\n            ]\n          }\n        })\n      : defaultKy\n  })\n\n  return client\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/cf-validate-json-schema.ts",
    "content": "import { Validator } from '@agentic/json-schema'\nimport { assert, HttpError } from '@agentic/platform-core'\nimport plur from 'plur'\n\n/**\n * Validates `data` against the provided JSON schema.\n *\n * This method uses a fork of `@cfworker/json-schema`. It does not use `ajv`\n * because `ajv` is not supported on CF workers due to its dynamic code\n * generation and evaluation.\n *\n * If you want a stricter version of this method which uses `ajv` and you're\n * not running on CF workers, consider using `validateJsonSchemaObject` from\n * `@agentic/platform-openapi-utils`.\n */\nexport function cfValidateJsonSchema<T = unknown>({\n  schema,\n  data,\n  coerce = false,\n  strictAdditionalProperties = false,\n  errorPrefix,\n  errorStatusCode = 400\n}: {\n  schema: any\n  data: unknown\n  coerce?: boolean\n  strictAdditionalProperties?: boolean\n  errorPrefix?: string\n  errorStatusCode?: number\n}): T {\n  assert(schema, 400, '`schema` is required')\n  const isSchemaObject =\n    typeof schema === 'object' &&\n    !Array.isArray(schema) &&\n    schema.type === 'object'\n  const isDataObject = typeof data === 'object' && !Array.isArray(data)\n  if (isSchemaObject && !isDataObject) {\n    throw new HttpError({\n      statusCode: 400,\n      message: `${errorPrefix ? errorPrefix + ': ' : ''}Data must be an object according to its schema.`\n    })\n  }\n\n  // Special-case check for required fields to give better error messages\n  if (isSchemaObject && Array.isArray(schema.required)) {\n    const missingRequiredFields: string[] = schema.required.filter(\n      (field: string) => (data as Record<string, unknown>)[field] === undefined\n    )\n\n    if (missingRequiredFields.length > 0) {\n      throw new HttpError({\n        statusCode: errorStatusCode,\n        message: `${errorPrefix ? errorPrefix + ': ' : ''}Missing required ${plur('parameter', missingRequiredFields.length)}: ${missingRequiredFields.map((field) => `\"${field}\"`).join(', ')}`\n      })\n    }\n  }\n\n  // Special-case check for additional top-level fields to give better error\n  // messages.\n  if (\n    isSchemaObject &&\n    schema.properties &&\n    (schema.additionalProperties === false ||\n      (schema.additionalProperties === undefined && strictAdditionalProperties))\n  ) {\n    const extraProperties = Object.keys(data as Record<string, unknown>).filter(\n      (key) => !schema.properties[key]\n    )\n\n    if (extraProperties.length > 0) {\n      throw new HttpError({\n        statusCode: errorStatusCode,\n        message: `${errorPrefix ? errorPrefix + ': ' : ''}Unexpected additional ${plur('parameter', extraProperties.length)}: ${extraProperties.map((property) => `\"${property}\"`).join(', ')}`\n      })\n    }\n  }\n\n  const validator = new Validator({\n    schema,\n    coerce,\n    strictAdditionalProperties\n  })\n  const result = validator.validate(data)\n  if (result.valid) {\n    // console.log('validate', {\n    //   schema,\n    //   data,\n    //   result: result.instance\n    // })\n\n    // Return the (possibly) coerced data\n    return result.instance as T\n  }\n\n  const finalErrorMessage = `${\n    errorPrefix ? errorPrefix + ': ' : ''\n  }${result.errors\n    .map(({ keyword, error }) => `keyword \"${keyword}\" error ${error}`)\n    .join(' ')}`\n\n  throw new HttpError({\n    statusCode: errorStatusCode,\n    message: finalErrorMessage\n  })\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/create-http-request-for-openapi-operation.ts",
    "content": "import type {\n  AdminDeployment,\n  OpenAPIToolOperation,\n  ToolConfig\n} from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\n\nimport type { ToolCallArgs } from './types'\n\nexport async function createHttpRequestForOpenAPIOperation({\n  toolCallArgs,\n  operation,\n  deployment,\n  request,\n  toolConfig\n}: {\n  toolCallArgs: ToolCallArgs\n  operation: OpenAPIToolOperation\n  deployment: AdminDeployment\n  request?: Request\n  toolConfig?: ToolConfig\n}): Promise<Request> {\n  assert(toolCallArgs, 500, 'Tool args are required')\n  assert(\n    deployment.origin.type === 'openapi',\n    500,\n    `Internal logic error for origin adapter type \"${deployment.origin.type}\"`\n  )\n\n  const { method } = operation\n  const methodHasBody =\n    method === 'post' || method === 'put' || method === 'patch'\n\n  // TODO: Make this more efficient by changing the `parameterSources` data structure\n  const params = Object.entries(operation.parameterSources)\n  const bodyParams = params.filter(([_key, source]) => source === 'body')\n  const formDataParams = params.filter(\n    ([_key, source]) => source === 'formData'\n  )\n  const headerParams = params.filter(([_key, source]) => source === 'header')\n  const pathParams = params.filter(([_key, source]) => source === 'path')\n  const queryParams = params.filter(([_key, source]) => source === 'query')\n  const cookieParams = params.filter(([_key, source]) => source === 'cookie')\n  assert(\n    !cookieParams.length,\n    500,\n    'Cookie parameters for OpenAPI operations are not yet supported. If you need cookie parameter support, please contact support@agentic.so.'\n  )\n\n  const extraArgs =\n    toolConfig?.inputSchemaAdditionalProperties === false\n      ? []\n      : // TODO: Make this more efficient...\n        Object.keys(toolCallArgs).filter((key) => {\n          if (bodyParams.some(([paramKey]) => paramKey === key)) return false\n          if (formDataParams.some(([paramKey]) => paramKey === key))\n            return false\n          if (headerParams.some(([paramKey]) => paramKey === key)) return false\n          if (queryParams.some(([paramKey]) => paramKey === key)) return false\n          if (pathParams.some(([paramKey]) => paramKey === key)) return false\n          if (cookieParams.some(([paramKey]) => paramKey === key)) return false\n          return true\n        })\n  const extraArgsEntries = extraArgs\n    .map((key) => [key, toolCallArgs[key]])\n    .filter(([, value]) => value !== undefined)\n\n  const headers: Record<string, string> = {}\n  if (request) {\n    // TODO: do we want to expose these? especially authorization?\n    for (const [key, value] of request.headers.entries()) {\n      headers[key] = value\n    }\n  }\n\n  if (headerParams.length > 0) {\n    for (const [key] of headerParams) {\n      headers[key] = (request?.headers.get(key) as string) ?? toolCallArgs[key]\n    }\n  }\n\n  for (const [key] of cookieParams) {\n    headers[key] = String(toolCallArgs[key])\n  }\n\n  let body: string | undefined\n  if (methodHasBody) {\n    if (bodyParams.length > 0 || !formDataParams.length) {\n      const bodyJson = Object.fromEntries(\n        bodyParams\n          .map(([key]) => [key, toolCallArgs[key]])\n          .concat(extraArgsEntries)\n          // Prune undefined values. We know these aren't required fields,\n          // because the incoming request params have already been validated\n          // against the tool's input schema.\n          .filter(([, value]) => value !== undefined)\n      )\n\n      body = JSON.stringify(bodyJson)\n      headers['content-type'] = 'application/json'\n      headers['content-length'] = body.length.toString()\n    } else if (formDataParams.length > 0) {\n      // TODO: Double-check FormData usage.\n      const bodyFormData = new FormData()\n\n      for (const [key] of formDataParams) {\n        const value = toolCallArgs[key]\n        if (value !== undefined) {\n          bodyFormData.append(key, value)\n        }\n      }\n\n      for (const [key, value] of extraArgsEntries) {\n        bodyFormData.append(key, value)\n      }\n\n      body = bodyFormData.toString()\n      headers['content-type'] = 'application/x-www-form-urlencoded'\n      headers['content-length'] = body.length.toString()\n    }\n  }\n\n  let path = operation.path\n  if (pathParams.length > 0) {\n    for (const [key] of pathParams) {\n      const value: string = toolCallArgs[key]\n      assert(value, 400, `Missing required parameter \"${key}\"`)\n\n      const pathParamPlaceholder = `{${key}}`\n      assert(\n        path.includes(pathParamPlaceholder),\n        500,\n        `Misconfigured OpenAPI deployment \"${deployment.id}\": invalid path \"${operation.path}\" missing required path parameter \"${key}\"`\n      )\n\n      path = path.replaceAll(pathParamPlaceholder, value)\n    }\n  }\n  assert(\n    !/\\{\\w+\\}/.test(path),\n    500,\n    `Misconfigured OpenAPI deployment \"${deployment.id}\": invalid path \"${operation.path}\"`\n  )\n\n  const query = new URLSearchParams()\n  for (const [key] of queryParams) {\n    query.set(key, toolCallArgs[key] as string)\n  }\n\n  if (!methodHasBody) {\n    for (const [key, value] of extraArgsEntries) {\n      query.set(key, value)\n    }\n  }\n\n  const queryString = query.toString()\n  const originRequestUrl = `${deployment.origin.url}${path}${\n    queryString ? `?${queryString}` : ''\n  }`\n\n  return new Request(originRequestUrl, {\n    method: method.toUpperCase(),\n    body,\n    headers\n  })\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/create-http-response-from-mcp-tool-call-response.ts",
    "content": "import type { AdminDeployment, Tool, ToolConfig } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\n\nimport type { GatewayHonoContext, McpToolCallResponse } from './types'\nimport { cfValidateJsonSchema } from './cf-validate-json-schema'\n\nexport async function createHttpResponseFromMcpToolCallResponse(\n  _ctx: GatewayHonoContext,\n  {\n    tool,\n    deployment,\n    toolCallResponse,\n    toolConfig\n  }: {\n    tool: Tool\n    deployment: AdminDeployment\n    toolCallResponse: McpToolCallResponse\n    toolConfig?: ToolConfig\n  }\n): Promise<Response> {\n  assert(\n    deployment.origin.type === 'mcp',\n    500,\n    `Internal logic error for origin adapter type \"${deployment.origin.type}\"`\n  )\n  assert(\n    !toolCallResponse.isError,\n    502,\n    // TODO: add content or structuredContent to the error message\n    `MCP tool \"${tool.name}\" returned an error.`\n  )\n\n  if (tool.outputSchema) {\n    // eslint-disable-next-line no-console\n    console.log(`tool call \"${tool.name}\" structured response:`, {\n      outputSchema: tool.outputSchema,\n      toolCallResponse\n    })\n\n    assert(\n      toolCallResponse.structuredContent,\n      502,\n      `Structured content is required for MCP origin requests to tool \"${tool.name}\" because it has an output schema.`\n    )\n\n    // Validate tool response against the tool's output schema.\n    const toolCallResponseContent = cfValidateJsonSchema({\n      schema: tool.outputSchema,\n      data: toolCallResponse.structuredContent as Record<string, unknown>,\n      coerce: false,\n      // TODO: double-check MCP schema on whether additional properties are allowed\n      strictAdditionalProperties:\n        toolConfig?.outputSchemaAdditionalProperties === false,\n      errorPrefix: `Invalid tool response for tool \"${tool.name}\"`,\n      errorStatusCode: 502\n    })\n\n    return new Response(JSON.stringify(toolCallResponseContent), {\n      headers: {\n        'content-type': 'application/json'\n      }\n    })\n  }\n\n  return new Response(JSON.stringify(toolCallResponse.content), {\n    headers: {\n      'content-type': 'application/json'\n    }\n  })\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/durable-mcp-client.ts",
    "content": "import type { AgenticMcpRequestMetadata } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\nimport { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport * as Sentry from '@sentry/cloudflare'\nimport { DurableObject } from 'cloudflare:workers'\n\nimport type { RawEnv } from './env'\n\nexport type DurableMcpClientInfo = {\n  url: string\n  name: string\n  version: string\n  headers?: Record<string, string>\n}\n\n// TODO: not sure if there's a better way to handle re-using client connections\n// across requests. Maybe we use one DurableObject per unique\n// customer<>DurableMcpClientInfo connection?\n// Currently using `sessionId`\n\nexport class DurableMcpClientBase extends DurableObject<RawEnv> {\n  protected client?: McpClient\n  protected clientConnectionP?: Promise<void>\n\n  async init(mcpClientInfo: DurableMcpClientInfo) {\n    const existingMcpClientInfo =\n      await this.ctx.storage.get<DurableMcpClientInfo>('mcp-client-info')\n\n    await this.ctx.storage.put('mcp-client-info', mcpClientInfo)\n    if (existingMcpClientInfo) {\n      if (mcpClientInfo.url !== existingMcpClientInfo.url) {\n        // eslint-disable-next-line no-console\n        console.warn(\n          `DurableMcpClientInfo url changed from \"${existingMcpClientInfo.url}\" to \"${mcpClientInfo.url}\"`\n        )\n      }\n\n      await this.client?.close()\n      this.clientConnectionP = undefined\n      this.client = undefined\n    }\n\n    return this.ensureClientConnection(mcpClientInfo)\n  }\n\n  async isInitialized(): Promise<boolean> {\n    return !!(await this.ctx.storage.get('mcp-client-info'))\n  }\n\n  async ensureClientConnection(mcpClientInfo?: DurableMcpClientInfo) {\n    if (this.clientConnectionP) return this.clientConnectionP\n\n    mcpClientInfo ??=\n      await this.ctx.storage.get<DurableMcpClientInfo>('mcp-client-info')\n    assert(mcpClientInfo, 500, 'DurableMcpClient has not been initialized')\n    const { name, version, url } = mcpClientInfo\n\n    this.client = new McpClient({\n      name,\n      version\n    })\n\n    // console.log('DurableMcpClient.ensureClientConnection', {\n    //   url,\n    //   headers: mcpClientInfo.headers\n    // })\n    const transport = new StreamableHTTPClientTransport(new URL(url), {\n      requestInit: {\n        headers: mcpClientInfo.headers\n      }\n    })\n    this.clientConnectionP = this.client.connect(transport)\n    await this.clientConnectionP\n  }\n\n  async callTool({\n    name,\n    args,\n    metadata\n  }: {\n    name: string\n    args: Record<string, unknown>\n    metadata: AgenticMcpRequestMetadata\n  }): Promise<string> {\n    await this.ensureClientConnection()\n\n    // console.log('DurableMcpClient.callTool', {\n    //   name,\n    //   args,\n    //   metadata\n    // })\n\n    const toolCallResponse = await this.client!.callTool({\n      name,\n      arguments: args,\n      _meta: { agentic: metadata }\n    })\n\n    // TODO: The `McpToolCallResponse` type is seemingly too complex for the CF\n    // serialization type inference to handle, so bypass it by serializing to\n    // a string and parsing it on the other end.\n    return JSON.stringify(toolCallResponse)\n  }\n}\n\nexport const DurableMcpClient = Sentry.instrumentDurableObjectWithSentry(\n  (env: RawEnv) => ({\n    dsn: env.SENTRY_DSN,\n    environment: env.ENVIRONMENT,\n    integrations: [Sentry.extraErrorDataIntegration()]\n  }),\n  DurableMcpClientBase\n)\n"
  },
  {
    "path": "apps/gateway/src/lib/durable-mcp-server.ts",
    "content": "import { assert, getRateLimitHeaders } from '@agentic/platform-core'\nimport { parseDeploymentIdentifier } from '@agentic/platform-validators'\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport {\n  CallToolRequestSchema,\n  ListToolsRequestSchema\n} from '@modelcontextprotocol/sdk/types.js'\nimport * as Sentry from '@sentry/cloudflare'\nimport { McpAgent } from 'agents/mcp'\n\nimport type { RawEnv } from './env'\nimport type {\n  McpToolCallResponse,\n  ResolvedMcpEdgeRequest,\n  ResolvedOriginToolCallResult\n} from './types'\nimport { handleMcpToolCallError } from './handle-mcp-tool-call-error'\nimport { recordToolCallUsage } from './record-tool-call-usage'\nimport { resolveOriginToolCall } from './resolve-origin-tool-call'\nimport { transformHttpResponseToMcpToolCallResponse } from './transform-http-response-to-mcp-tool-call-response'\nimport { createAgenticMcpMetadata } from './utils'\n\nexport class DurableMcpServerBase extends McpAgent<\n  RawEnv,\n  never, // We aren't currently using local state, so set it to `never`.\n  ResolvedMcpEdgeRequest\n> {\n  protected _serverP = Promise.withResolvers<Server>()\n  override server = this._serverP.promise\n\n  // NOTE: This empty constructor is required for the Sentry wrapper to work.\n  public constructor(state: DurableObjectState, env: RawEnv) {\n    super(state, env)\n  }\n\n  override async init() {\n    const { consumer, deployment, pricingPlan } = this.props\n    const { projectIdentifier } = parseDeploymentIdentifier(\n      deployment.identifier\n    )\n\n    const server = new Server(\n      { name: projectIdentifier, version: deployment.version ?? '0.0.0' },\n      {\n        capabilities: {\n          tools: {}\n        }\n      }\n    )\n    this._serverP.resolve(server)\n\n    const tools = deployment.tools\n      .map((tool) => {\n        const toolConfig = deployment.toolConfigs.find(\n          (toolConfig) => toolConfig.name === tool.name\n        )\n\n        if (toolConfig) {\n          const pricingPlanToolOverride = pricingPlan\n            ? toolConfig.pricingPlanOverridesMap?.[pricingPlan.slug]\n            : undefined\n\n          if (pricingPlanToolOverride?.enabled === true) {\n            // Tool is explicitly enabled for the customer's pricing plan\n          } else if (pricingPlanToolOverride?.enabled === false) {\n            // Tool is disabled for the customer's pricing plan\n            return undefined\n          } else if (toolConfig.enabled === false) {\n            // Tool is disabled for all pricing plans\n            return undefined\n          }\n        }\n\n        return tool\n      })\n      .filter(Boolean)\n\n    server.setRequestHandler(ListToolsRequestSchema, async () => ({\n      tools\n    }))\n\n    server.setRequestHandler(CallToolRequestSchema, async (request) => {\n      const { name: toolName, arguments: args, _meta } = request.params\n      const sessionId = this.ctx.id.toString()\n      const tool = tools.find((tool) => tool.name === toolName)\n\n      const cacheControl = (_meta?.agentic as any)?.headers?.['cache-control']\n      let resolvedOriginToolCallResult: ResolvedOriginToolCallResult | undefined\n      let toolCallResponse: McpToolCallResponse | undefined\n\n      try {\n        assert(tool, 404, `Unknown tool \"${toolName}\"`)\n\n        resolvedOriginToolCallResult = await resolveOriginToolCall({\n          ...this.props,\n          tool,\n          args,\n          cacheControl,\n          sessionId,\n          env: this.env,\n          waitUntil: this.ctx.waitUntil.bind(this.ctx)\n        })\n\n        if (resolvedOriginToolCallResult.originResponse) {\n          toolCallResponse = await transformHttpResponseToMcpToolCallResponse({\n            ...resolvedOriginToolCallResult,\n            tool\n          })\n        } else {\n          toolCallResponse = resolvedOriginToolCallResult.toolCallResponse\n          assert(toolCallResponse, 500, 'Missing tool call response')\n        }\n\n        return toolCallResponse\n      } catch (err: unknown) {\n        // Gracefully handle tool call exceptions, whether they were thrown by\n        // the origin server or internally by the gateway.\n        toolCallResponse = handleMcpToolCallError(err, {\n          toolName,\n          env: this.env\n        })\n\n        return toolCallResponse\n      } finally {\n        assert(toolCallResponse, 500, 'Missing tool call response')\n\n        // Augment the MCP tool call response with agentic metadata, which\n        // makes it easier to debug tool calls and adds some much-needed HTTP\n        // header-like functionality to tool call responses.\n        toolCallResponse._meta = createAgenticMcpMetadata(\n          {\n            deploymentId: deployment.id,\n            consumerId: consumer?.id,\n            toolName,\n            cacheStatus: resolvedOriginToolCallResult?.cacheStatus,\n            headers: getRateLimitHeaders(\n              resolvedOriginToolCallResult?.rateLimitResult\n            )\n          },\n          toolCallResponse._meta\n        )\n\n        // Record tool call usage, whether the call was successful or not.\n        recordToolCallUsage({\n          ...this.props,\n          tool,\n          mcpToolCallResponse: toolCallResponse!,\n          resolvedOriginToolCallResult,\n          sessionId,\n          env: this.env,\n          waitUntil: this.ctx.waitUntil.bind(this.ctx)\n        })\n      }\n    })\n  }\n}\n\nexport const DurableMcpServer = Sentry.instrumentDurableObjectWithSentry(\n  (env: RawEnv) => ({\n    dsn: env.SENTRY_DSN,\n    environment: env.ENVIRONMENT,\n    integrations: [Sentry.extraErrorDataIntegration()]\n  }),\n  DurableMcpServerBase\n)\n"
  },
  {
    "path": "apps/gateway/src/lib/env.ts",
    "content": "import type {\n  AnalyticsEngineDataset,\n  DurableObjectNamespace\n} from '@cloudflare/workers-types'\nimport type { Simplify } from 'type-fest'\nimport { parseZodSchema } from '@agentic/platform-core'\nimport {\n  envSchema as baseEnvSchema,\n  parseEnv as parseBaseEnv\n} from '@agentic/platform-hono'\nimport { z } from 'zod'\n\nexport const envSchema = baseEnvSchema\n  .extend({\n    AGENTIC_API_BASE_URL: z.string().url(),\n    AGENTIC_API_KEY: z.string().nonempty(),\n\n    STRIPE_SECRET_KEY: z.string().nonempty(),\n\n    DO_RATE_LIMITER: z.custom<DurableObjectNamespace>((ns) =>\n      isDurableObjectNamespace(ns)\n    ),\n\n    DO_MCP_SERVER: z.custom<DurableObjectNamespace>((ns) =>\n      isDurableObjectNamespace(ns)\n    ),\n\n    DO_MCP_CLIENT: z.custom<DurableObjectNamespace>((ns) =>\n      isDurableObjectNamespace(ns)\n    ),\n\n    AE_USAGE_DATASET: z.custom<AnalyticsEngineDataset>((ae) =>\n      isAnalyticsEngineDataset(ae)\n    )\n  })\n  .strip()\nexport type RawEnv = z.infer<typeof envSchema>\n\nexport function isDurableObjectNamespace(\n  namespace: unknown\n): namespace is DurableObjectNamespace {\n  return (\n    !!namespace &&\n    typeof namespace === 'object' &&\n    'newUniqueId' in namespace &&\n    typeof namespace.newUniqueId === 'function' &&\n    'idFromName' in namespace &&\n    typeof namespace.idFromName === 'function'\n  )\n}\n\nfunction isAnalyticsEngineDataset(ae: unknown): ae is AnalyticsEngineDataset {\n  return !!ae && typeof ae === 'object' && 'writeDataPoint' in ae\n}\n\nexport function parseEnv(inputEnv: Record<string, unknown>) {\n  const baseEnv = parseBaseEnv({\n    SERVICE: 'gateway',\n    ...inputEnv\n  })\n\n  const env = parseZodSchema(\n    envSchema,\n    { ...inputEnv, ...baseEnv },\n    {\n      error: 'Invalid environment variables'\n    }\n  )\n\n  const isStripeLive = env.STRIPE_SECRET_KEY.startsWith('sk_live_')\n\n  return {\n    ...baseEnv,\n    ...env,\n    isStripeLive\n  }\n}\n\nexport type Env = Simplify<ReturnType<typeof parseEnv>>\n"
  },
  {
    "path": "apps/gateway/src/lib/external/stripe.ts",
    "content": "import Stripe from 'stripe'\n\nimport type { RawEnv } from '../env'\n\nexport function createStripe(env: RawEnv): Stripe {\n  return new Stripe(env.STRIPE_SECRET_KEY, {\n    apiVersion: '2025-06-30.basil'\n  })\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/fetch-cache.ts",
    "content": "import type { WaitUntil } from './types'\n\nexport async function fetchCache({\n  cacheKey,\n  fetchResponse,\n  waitUntil\n}: {\n  cacheKey?: Request\n  fetchResponse: () => Promise<Response>\n  waitUntil: WaitUntil\n}): Promise<Response> {\n  const cache = caches.default\n  let response: Response | undefined\n\n  if (cacheKey) {\n    response = await cache.match(cacheKey)\n  }\n\n  if (!response) {\n    response = await fetchResponse()\n    response = new Response(response.body, response)\n\n    if (cacheKey) {\n      if (response.headers.has('Cache-Control')) {\n        // Note that cloudflare's `cache` should respect response headers.\n        waitUntil(\n          cache.put(cacheKey, response.clone()).catch((err) => {\n            // eslint-disable-next-line no-console\n            console.warn('cache put error', cacheKey, err)\n          })\n        )\n      }\n\n      response.headers.set('cf-cache-status', 'MISS')\n    } else {\n      response.headers.set('cf-cache-status', 'BYPASS')\n    }\n  }\n\n  return response\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/get-admin-consumer.ts",
    "content": "import { assert, HttpError } from '@agentic/platform-core'\n\nimport type { AdminConsumer, GatewayHonoContext } from './types'\n\nexport async function getAdminConsumer(\n  ctx: GatewayHonoContext,\n  apiKey: string\n): Promise<AdminConsumer> {\n  const client = ctx.get('client')\n  let consumer: AdminConsumer | undefined\n\n  try {\n    consumer = await client.adminGetConsumerByApiKey({\n      apiKey,\n      populate: ['user']\n    })\n  } catch (err: any) {\n    if (err.response?.status === 404) {\n      // Hide the underlying error message from the client\n      throw new HttpError({\n        statusCode: 404,\n        message: `API key not found \"${apiKey}\"`,\n        cause: err\n      })\n    }\n\n    throw err\n  }\n\n  assert(consumer, 404, `API key not found \"${apiKey}\"`)\n  return consumer\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/get-admin-deployment.ts",
    "content": "import type { AdminDeployment } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\nimport { parseDeploymentIdentifier } from '@agentic/platform-validators'\n\nimport type { GatewayHonoContext } from './types'\n\nexport async function getAdminDeployment(\n  ctx: GatewayHonoContext,\n  identifier: string\n): Promise<AdminDeployment> {\n  const parsedDeploymentIdentifier = parseDeploymentIdentifier(identifier, {\n    strict: true,\n    errorStatusCode: 404\n  })\n\n  const client = ctx.get('client')\n  const deployment = await client.adminGetDeploymentByIdentifier({\n    deploymentIdentifier: parsedDeploymentIdentifier.deploymentIdentifier\n  })\n  assert(deployment, 404, `Deployment not found \"${identifier}\"`)\n\n  return deployment\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/get-request-cache-key.ts",
    "content": "import { hashObject, sha256 } from '@agentic/platform-core'\nimport contentType from 'fast-content-type-parse'\n\nimport { normalizeUrl } from './normalize-url'\nimport { isRequestPubliclyCacheable } from './utils'\n\n// TODO: what is a reasonable upper bound for hashing the POST body size?\nconst MAX_POST_BODY_SIZE_BYTES = 10_000\n\nexport async function getRequestCacheKey(\n  request: Request\n): Promise<Request | undefined> {\n  try {\n    if (!isRequestPubliclyCacheable(request)) {\n      return\n    }\n\n    if (\n      request.method === 'POST' ||\n      request.method === 'PUT' ||\n      request.method === 'PATCH'\n    ) {\n      const contentLength = Number.parseInt(\n        request.headers.get('content-length') ?? '0'\n      )\n\n      if (contentLength < MAX_POST_BODY_SIZE_BYTES) {\n        const { type } = contentType.safeParse(\n          request.headers.get('content-type') || 'application/octet-stream'\n        )\n        let hash = '___AGENTIC_CACHE_KEY_EMPTY_BODY___'\n\n        if (contentLength > 0) {\n          if (type.includes('json')) {\n            const bodyJson: any = await request.clone().json()\n            hash = await hashObject(bodyJson)\n          } else if (type.includes('text/')) {\n            const bodyString = await request.clone().text()\n            hash = await sha256(bodyString)\n          } else {\n            const bodyBuffer = await request.clone().arrayBuffer()\n            hash = await sha256(bodyBuffer)\n          }\n        }\n\n        const cacheUrl = new URL(request.url)\n        cacheUrl.searchParams.set('x-agentic-cache-key', hash)\n        const normalizedUrl = normalizeUrl(cacheUrl.toString())\n\n        // Convert POST and PUT requests to GET with a query param containing\n        // a hash of the request body. This enables us to cache these requests\n        // more easily, since we want to move the the \"cacheability\" logic to a\n        // higher-level, config-based approach. E.g., individual tools can\n        // opt-in to aggressive caching by declaring themselves `pure` or\n        // `immutable` regardless of the HTTP method used to call the tool.\n        const newReq = normalizeRequestHeaders(\n          new Request(normalizedUrl, {\n            headers: request.headers,\n            method: 'GET'\n          })\n        )\n\n        return newReq\n      }\n    } else if (request.method === 'GET' || request.method === 'HEAD') {\n      const url = request.url\n      const normalizedUrl = normalizeUrl(url)\n\n      if (url !== normalizedUrl) {\n        return normalizeRequestHeaders(\n          new Request(normalizedUrl, {\n            method: request.method\n          })\n        )\n      }\n    }\n\n    return normalizeRequestHeaders(new Request(request))\n  } catch (err) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      'warning: failed to compute cache key',\n      request.method,\n      request.url,\n      err\n    )\n  }\n}\n\nconst requestHeaderWhitelist = new Set([\n  'cache-control',\n  'content-type',\n  'mcp-session-id'\n])\n\nfunction normalizeRequestHeaders(request: Request) {\n  const headers = Object.fromEntries(request.headers.entries())\n  const keys = Object.keys(headers)\n\n  for (const key of keys) {\n    if (!requestHeaderWhitelist.has(key)) {\n      request.headers.delete(key)\n    }\n  }\n\n  return request\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/get-tool-args-from-request.ts",
    "content": "import type { AdminDeployment, Tool } from '@agentic/platform-types'\nimport { assert, HttpError } from '@agentic/platform-core'\n\nimport type { GatewayHonoContext } from './types'\nimport { cfValidateJsonSchema } from './cf-validate-json-schema'\n\nexport async function getToolArgsFromRequest(\n  ctx: GatewayHonoContext,\n  {\n    tool,\n    deployment\n  }: {\n    tool: Tool\n    deployment: AdminDeployment\n  }\n): Promise<Record<string, any>> {\n  const logger = ctx.get('logger')\n  const request = ctx.req.raw\n  assert(\n    deployment.origin.type !== 'raw',\n    500,\n    `Internal logic error for origin adapter type \"${deployment.origin.type}\"`\n  )\n\n  if (request.method === 'GET') {\n    // Args will be coerced to match their expected types via\n    // `cfValidateJsonSchemaObject` since all values will be strings.\n    const incomingRequestArgsRaw = Object.fromEntries(\n      new URL(request.url).searchParams.entries()\n    )\n\n    const toolConfig = deployment.toolConfigs.find(\n      (toolConfig) => toolConfig.name === tool.name\n    )\n\n    // Validate incoming request params against the tool's input schema.\n    const incomingRequestArgs = cfValidateJsonSchema<Record<string, any>>({\n      schema: tool.inputSchema,\n      data: incomingRequestArgsRaw,\n      errorPrefix: `Invalid request parameters for tool \"${tool.name}\"`,\n      coerce: true,\n      strictAdditionalProperties:\n        toolConfig?.inputSchemaAdditionalProperties === false\n    })\n\n    return incomingRequestArgs\n  } else if (request.method === 'POST') {\n    let incomingRequestArgsRaw: unknown = {}\n\n    // TODO: verify content-type of request is application/json\n\n    try {\n      incomingRequestArgsRaw = (await request.json()) as Record<string, any>\n    } catch (err) {\n      // Error if the request body is not JSON or is malformed.\n      logger.error('Error parsing incoming request body', request, err)\n      throw new HttpError({\n        message: 'Invalid request body json',\n        statusCode: 400,\n        cause: err\n      })\n    }\n\n    // console.log(\n    //   'incomingRequestArgsRaw',\n    //   typeof incomingRequestArgsRaw,\n    //   request.headers,\n    //   incomingRequestArgsRaw\n    // )\n\n    // TODO: Proper support for empty params with POST requests\n    assert(incomingRequestArgsRaw, 400, 'Invalid empty request body')\n    assert(\n      typeof incomingRequestArgsRaw === 'object',\n      400,\n      `Invalid request body: expected type \"object\", received type \"${typeof incomingRequestArgsRaw}\"`\n    )\n    assert(!Array.isArray(incomingRequestArgsRaw), 400, 'Invalid request body')\n    return incomingRequestArgsRaw\n  } else {\n    assert(false, 405, `HTTP method \"${request.method}\" not allowed`)\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/get-tool.ts",
    "content": "import type { AdminDeployment, Tool } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\n\nexport function getTool({\n  toolName,\n  deployment,\n  method,\n  strict = false\n}: {\n  toolName: string\n  deployment: AdminDeployment\n  method?: string\n  strict?: boolean\n}): Tool {\n  assert(toolName, 404, `Invalid input empty tool name`)\n\n  let tool = deployment.tools.find((tool) => tool.name === toolName)\n\n  if (!tool && !strict) {\n    if (deployment.origin.type === 'openapi') {\n      // Check if the tool name is an operation ID since it's easy to forget\n      // and mistake the two (`getPost` vs `get_post`).\n      // TODO: In the future, we should be consistent about how we handle tool\n      // names. Do we always allow camelCase and snake_case, or do we just allow\n      // alternates for operationIds? We should also make sure alternates are\n      // uniquely defined.\n      const operationToolName = Object.entries(\n        deployment.origin.toolToOperationMap\n      ).find(([_, operation]) => {\n        if (operation.operationId === toolName) {\n          return true\n        }\n\n        return false\n      })?.[0]\n\n      if (operationToolName) {\n        tool = deployment.tools.find((tool) => tool.name === operationToolName)\n\n        assert(\n          tool,\n          404,\n          `Tool not found \"${toolName}\" for deployment \"${deployment.identifier}\": did you mean \"${operationToolName}\"?`\n        )\n      }\n    }\n  }\n\n  assert(\n    tool,\n    404,\n    `Tool not found \"${toolName}\" for deployment \"${deployment.identifier}\"`\n  )\n\n  if (deployment.origin.type === 'openapi') {\n    const operation = deployment.origin.toolToOperationMap[tool.name]\n    assert(\n      operation,\n      404,\n      `OpenAPI operation not found for tool \"${tool.name}\"`\n    )\n    if (method) {\n      assert(\n        method === 'GET' || method === 'POST',\n        405,\n        `Invalid HTTP method \"${method}\" for tool \"${tool.name}\"`\n      )\n    }\n  }\n\n  return tool\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/handle-mcp-tool-call-error.ts",
    "content": "import type { ContentfulStatusCode } from 'hono/utils/http-status'\nimport { HttpError } from '@agentic/platform-core'\nimport { suppressedHttpStatuses } from '@agentic/platform-hono'\nimport * as Sentry from '@sentry/cloudflare'\nimport { HTTPException } from 'hono/http-exception'\nimport { HTTPError } from 'ky'\n\nimport type { RawEnv } from './env'\nimport type { McpToolCallResponse } from './types'\n\n/**\n * Turns a thrown error into an MCP error tool call response, and attempts to\n * capture as much context as possible for potential debugging.\n *\n * @note This function is synchronous and should never throw.\n */\nexport function handleMcpToolCallError(\n  err: any,\n  {\n    toolName,\n    env\n  }: {\n    toolName: string\n    env: RawEnv\n  }\n): McpToolCallResponse {\n  const isProd = env.ENVIRONMENT === 'production'\n  let message = 'Internal Server Error'\n  let status: ContentfulStatusCode = 500\n\n  const res: McpToolCallResponse = {\n    _meta: {\n      agentic: {\n        toolName,\n        headers: {}\n      }\n    },\n    isError: true,\n    content: [\n      {\n        type: 'text',\n        text: message\n      }\n    ]\n  }\n\n  if (err instanceof HttpError) {\n    message = err.message\n    status = err.statusCode as ContentfulStatusCode\n\n    // This is where rate-limit headers will be set, since `RateLimitError`\n    // is a subclass of `HttpError`.\n    if (err.headers) {\n      for (const [key, value] of Object.entries(err.headers)) {\n        ;(res._meta!.agentic as any).headers[key] = value\n      }\n    }\n  } else if (err instanceof HTTPException) {\n    message = err.message\n    status = err.status\n  } else if (err instanceof HTTPError) {\n    message = err.message\n    status = err.response.status as ContentfulStatusCode\n  } else if (!isProd && err.message) {\n    message = err.message\n  }\n\n  if (!Number.isSafeInteger(status)) {\n    status = 500\n  }\n\n  if (!suppressedHttpStatuses.has(status)) {\n    if (status >= 500) {\n      // eslint-disable-next-line no-console\n      console.error(`mcp tool call \"${toolName}\" error`, status, err)\n\n      if (isProd) {\n        try {\n          Sentry.captureException(err)\n        } catch (err_) {\n          // eslint-disable-next-line no-console\n          console.error('Error Sentry.captureException failed', err, err_)\n        }\n      }\n    } else {\n      // eslint-disable-next-line no-console\n      console.warn(`mcp tool call \"${toolName}\" warning`, status, err)\n    }\n  }\n\n  ;(res._meta!.agentic as any).status = status\n  res.content = [\n    {\n      type: 'text',\n      text: message\n    }\n  ]\n\n  return res\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/normalize-url.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { normalizeUrl } from './normalize-url'\n\ntest('main', () => {\n  expect(normalizeUrl('http://sindresorhus.com')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('http://sindresorhus.com ')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('http://sindresorhus.com.')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('http://SindreSorhus.com')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('http://sindresorhus.com')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('HTTP://sindresorhus.com')).toBe(\n    'https://sindresorhus.com'\n  )\n\n  // TODO: why isn't this parsed correctly by Node.js URL?\n  // t.is(normalizeUrl('//sindresorhus.com'), 'https://sindresorhus.com')\n\n  expect(normalizeUrl('http://sindresorhus.com')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('http://sindresorhus.com:80')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('https://sindresorhus.com:443')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('ftp://sindresorhus.com:21')).toBe(\n    'ftp://sindresorhus.com'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/foo/')).toBe(\n    'https://sindresorhus.com/foo'\n  )\n  expect(normalizeUrl('http://sindresorhus.com/?foo=bar baz')).toBe(\n    'https://sindresorhus.com/?foo=bar+baz'\n  )\n  expect(normalizeUrl('https://foo.com/https://bar.com')).toBe(\n    'https://foo.com/https://bar.com'\n  )\n  expect(normalizeUrl('https://foo.com/https://bar.com/foo//bar')).toBe(\n    'https://foo.com/https://bar.com/foo/bar'\n  )\n  expect(normalizeUrl('https://foo.com/http://bar.com')).toBe(\n    'https://foo.com/http://bar.com'\n  )\n  expect(normalizeUrl('https://foo.com/http://bar.com/foo//bar')).toBe(\n    'https://foo.com/http://bar.com/foo/bar'\n  )\n  expect(normalizeUrl('https://foo.com/http://bar.com/foo//bar')).toBe(\n    'https://foo.com/http://bar.com/foo/bar'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/%7Efoo/')).toBe(\n    'https://sindresorhus.com/~foo'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/?')).toBe(\n    'https://sindresorhus.com'\n  )\n  expect(normalizeUrl('https://êxample.com')).toBe('https://xn--xample-hva.com')\n  expect(\n    normalizeUrl('https://sindresorhus.com/?b=bar&a=foo'),\n    'https://sindresorhus.com/?a=foo&b=bar'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/?foo=bar*|<>:\"')).toBe(\n    'https://sindresorhus.com/?foo=bar*%7C%3C%3E%3A%22'\n  )\n  expect(normalizeUrl('https://sindresorhus.com:5000')).toBe(\n    'https://sindresorhus.com:5000'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/foo#bar')).toBe(\n    'https://sindresorhus.com/foo#bar'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/foo/bar/../baz')).toBe(\n    'https://sindresorhus.com/foo/baz'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/foo/bar/./baz')).toBe(\n    'https://sindresorhus.com/foo/bar/baz'\n  )\n  expect(\n    normalizeUrl(\n      'https://i.vimeocdn.com/filter/overlay?src0=https://i.vimeocdn.com/video/598160082_1280x720.jpg&src1=https://f.vimeocdn.com/images_v6/share/play_icon_overlay.png'\n    )\n  ).toBe(\n    'https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F598160082_1280x720.jpg&src1=https%3A%2F%2Ff.vimeocdn.com%2Fimages_v6%2Fshare%2Fplay_icon_overlay.png'\n  )\n})\n\ntest('removeTrailingSlash and removeDirectoryIndex options)', () => {\n  expect(normalizeUrl('https://sindresorhus.com/path/')).toBe(\n    'https://sindresorhus.com/path'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/#/path/')).toBe(\n    'https://sindresorhus.com/#/path/'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/foo/#/bar/')).toBe(\n    'https://sindresorhus.com/foo#/bar/'\n  )\n})\n\ntest('sortQueryParameters', () => {\n  expect(normalizeUrl('https://sindresorhus.com/?a=Z&b=Y&c=X&d=W')).toBe(\n    'https://sindresorhus.com/?a=Z&b=Y&c=X&d=W'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/?b=Y&c=X&a=Z&d=W')).toBe(\n    'https://sindresorhus.com/?a=Z&b=Y&c=X&d=W'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/?a=Z&d=W&b=Y&c=X')).toBe(\n    'https://sindresorhus.com/?a=Z&b=Y&c=X&d=W'\n  )\n  expect(normalizeUrl('https://sindresorhus.com/')).toBe(\n    'https://sindresorhus.com'\n  )\n})\n\ntest('invalid urls', () => {\n  expect(() => {\n    normalizeUrl('http://')\n  }).toThrow('Invalid URL')\n\n  expect(() => {\n    normalizeUrl('/')\n  }).toThrow('Invalid URL')\n\n  expect(() => {\n    normalizeUrl('/relative/path/')\n  }).toThrow('Invalid URL')\n})\n\ntest('remove duplicate pathname slashes', () => {\n  expect(normalizeUrl('https://sindresorhus.com////foo/bar')).toBe(\n    'https://sindresorhus.com/foo/bar'\n  )\n  expect(normalizeUrl('https://sindresorhus.com////foo////bar')).toBe(\n    'https://sindresorhus.com/foo/bar'\n  )\n  expect(normalizeUrl('ftp://sindresorhus.com//foo')).toBe(\n    'ftp://sindresorhus.com/foo'\n  )\n  expect(normalizeUrl('https://sindresorhus.com:5000///foo')).toBe(\n    'https://sindresorhus.com:5000/foo'\n  )\n  expect(normalizeUrl('https://sindresorhus.com///foo')).toBe(\n    'https://sindresorhus.com/foo'\n  )\n  expect(normalizeUrl('https://sindresorhus.com:5000//foo')).toBe(\n    'https://sindresorhus.com:5000/foo'\n  )\n  expect(normalizeUrl('https://sindresorhus.com//foo')).toBe(\n    'https://sindresorhus.com/foo'\n  )\n})\n"
  },
  {
    "path": "apps/gateway/src/lib/normalize-url.ts",
    "content": "/**\n * Stripped down version of [normalize-url](https://github.com/sindresorhus/normalize-url)\n * by sindresorhus\n *\n * - always converts http => https\n * - removed unused options\n * - removed dataURL support\n */\nexport function normalizeUrl(url: string): string {\n  const urlObj = new URL(url)\n\n  if (urlObj.protocol === 'http:') {\n    urlObj.protocol = 'https:'\n  }\n\n  /*\n  // Remove auth\n  // TODO: Cloudflare Workers seems to have a subtle bug where if you set URL.username and\n  // URL.password at all, it will include the @ authentication prefix in the resulting URL.\n  // This does not repro in normal web or Node.js contexts.\n  if (options.stripAuthentication) {\n    urlObj.username = ''\n    urlObj.password = ''\n  }\n  */\n\n  // Remove duplicate slashes if not preceded by a protocol\n  if (urlObj.pathname) {\n    urlObj.pathname = urlObj.pathname.replaceAll(/(?<!https?:)\\/{2,}/g, '/')\n  }\n\n  // Decode URI octets\n  if (urlObj.pathname) {\n    urlObj.pathname = decodeURI(urlObj.pathname)\n  }\n\n  if (urlObj.hostname) {\n    // Remove trailing dot\n    urlObj.hostname = urlObj.hostname.replace(/\\.$/, '')\n  }\n\n  // Sort query parameters\n  urlObj.searchParams.sort()\n\n  // Remove trailing `/`\n  urlObj.pathname = urlObj.pathname.replace(/\\/$/, '')\n\n  url = urlObj.toString()\n\n  // Remove trailing `/` for real this time\n  if (urlObj.pathname === '/' && urlObj.hash === '') {\n    url = url.replace(/\\/$/, '')\n  }\n\n  return url\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/rate-limits/durable-rate-limiter.ts",
    "content": "import type { SetOptional } from 'type-fest'\nimport * as Sentry from '@sentry/cloudflare'\nimport { DurableObject } from 'cloudflare:workers'\n\nimport type { RawEnv } from '../env'\nimport type { RateLimitState } from '../types'\n\nconst initialState: SetOptional<RateLimitState, 'resetTimeMs'> = {\n  current: 0\n}\n\nexport class DurableRateLimiterBase extends DurableObject<RawEnv> {\n  async update({\n    intervalMs,\n    cost = 1\n  }: {\n    intervalMs: number\n    cost?: number\n  }): Promise<RateLimitState> {\n    const existingState = await this.ctx.storage.get<RateLimitState>('value')\n    const currentAlarm = await this.ctx.storage.getAlarm()\n\n    const now = Date.now()\n    const updatedResetTimeMs = now + intervalMs\n\n    // Update the payload\n    const state =\n      existingState && currentAlarm && currentAlarm > now\n        ? existingState\n        : {\n            current: 0,\n            resetTimeMs: updatedResetTimeMs\n          }\n    state.current += cost\n\n    // Update the alarm\n    if (!currentAlarm || currentAlarm <= now) {\n      await this.ctx.storage.setAlarm(state.resetTimeMs)\n    }\n\n    await this.ctx.storage.put('value', state)\n\n    // const updatedState = await this.ctx.storage.get<RateLimitState>('value')\n    // console.log('DurableRateLimiter.update', this.ctx.id.toString(), {\n    //   existingState,\n    //   state,\n    //   updatedState,\n    //   now,\n    //   intervalMs,\n    //   updatedResetTimeMs,\n    //   currentAlarm\n    // })\n\n    return state\n  }\n\n  async reset() {\n    // console.log('reset rate-limit', this.ctx.id)\n    await this.ctx.storage.put('value', initialState)\n  }\n\n  override async alarm() {\n    await this.reset()\n  }\n}\n\nexport const DurableRateLimiter = Sentry.instrumentDurableObjectWithSentry(\n  (env: RawEnv) => ({\n    dsn: env.SENTRY_DSN,\n    environment: env.ENVIRONMENT,\n    integrations: [Sentry.extraErrorDataIntegration()]\n  }),\n  DurableRateLimiterBase\n)\n"
  },
  {
    "path": "apps/gateway/src/lib/rate-limits/enforce-rate-limit.ts",
    "content": "import type { RateLimit } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\n\nimport type { RawEnv } from '../env'\nimport type {\n  RateLimitCache,\n  RateLimitResult,\n  RateLimitState,\n  WaitUntil\n} from '../types'\nimport type { DurableRateLimiterBase } from './durable-rate-limiter'\n\n/**\n * This maps persists across worker executions and is used for caching active\n * rate limits. It's purely a performance optimization and is not used as a\n * source of truth.\n */\nconst globalRateLimitCache: RateLimitCache = new Map()\n\nexport async function enforceRateLimit({\n  rateLimit,\n  id,\n  cost = 1,\n  env,\n  cache = globalRateLimitCache,\n  waitUntil\n}: {\n  /**\n   * The rate limit to enforce.\n   */\n  rateLimit: RateLimit\n\n  /**\n   * The identifier used to uniquely track this rate limit.\n   */\n  id: string\n\n  /**\n   * The cost of the request.\n   *\n   * @default 1\n   */\n  cost?: number\n\n  env: RawEnv\n  cache?: RateLimitCache\n  waitUntil: WaitUntil\n}): Promise<RateLimitResult | undefined> {\n  if (rateLimit.enabled === false) {\n    return\n  }\n\n  assert(id, 400, 'Unauthenticated requests must have a valid IP address')\n\n  const { interval, limit, mode } = rateLimit\n  const intervalMs = interval * 1000\n  const now = Date.now()\n\n  const initialRateLimitState = cache.get(id) ?? {\n    current: 0,\n    resetTimeMs: now + intervalMs\n  }\n  let rateLimitState = initialRateLimitState\n\n  function updateCache(info: RateLimitState) {\n    cache.set(id, info)\n    rateLimitState = info\n  }\n\n  /**\n   * Short-circuit check for active rate limits that are currently exceeded.\n   *\n   * This might not happen too often, but in extreme cases the cache should hit\n   * and we can skip the request to the durable object entirely, which speeds\n   * everything up and is cheaper for us.\n   */\n  if (rateLimitState.current > limit && now <= rateLimitState.resetTimeMs) {\n    return {\n      id,\n      passed: false,\n      current: rateLimitState.current,\n      limit,\n      resetTimeMs: rateLimitState.resetTimeMs,\n      intervalMs,\n      remaining: Math.max(0, limit - rateLimitState.current)\n    }\n  }\n\n  const durableRateLimiterId = env.DO_RATE_LIMITER.idFromName(id)\n  const durableRateLimiter = env.DO_RATE_LIMITER.get(\n    durableRateLimiterId\n  ) as DurableObjectStub<DurableRateLimiterBase>\n\n  const updatedRateLimitStateP = durableRateLimiter.update({ cost, intervalMs })\n\n  if (mode === 'strict') {\n    const updatedRateLimitState = await updatedRateLimitStateP\n    updateCache(updatedRateLimitState)\n  } else {\n    waitUntil(\n      updatedRateLimitStateP\n        .then((updatedRateLimitState: RateLimitState) => {\n          updateCache(updatedRateLimitState)\n        })\n        .catch((err: Error) => {\n          // eslint-disable-next-line no-console\n          console.error(\n            `error updating rate limit for id \"${id}\": ${err.message}`\n          )\n        })\n    )\n\n    rateLimitState.current += cost\n    updateCache(rateLimitState)\n  }\n\n  // console.log('rateLimit', {\n  //   id,\n  //   initial: initialRateLimitState,\n  //   current: rateLimitState,\n  //   mode,\n  //   cost\n  // })\n\n  return {\n    id,\n    passed: rateLimitState.current <= limit,\n    limit,\n    current: rateLimitState.current,\n    remaining: Math.max(0, limit - rateLimitState.current),\n    resetTimeMs: rateLimitState.resetTimeMs,\n    intervalMs\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/record-tool-call-usage.ts",
    "content": "import type {\n  AdminDeployment,\n  PricingPlan,\n  Tool\n} from '@agentic/platform-types'\n\nimport type { RawEnv } from './env'\nimport type {\n  AdminConsumer,\n  EdgeRequestMode,\n  McpToolCallResponse,\n  ResolvedOriginToolCallResult,\n  WaitUntil\n} from './types'\nimport { createAgenticClient } from './agentic-client'\nimport { createStripe } from './external/stripe'\n\n/**\n * Records usage data to Cloudflare Analytics Engine.\n *\n * Also asynchronously activates the `consumer` if it's present and hasn't been\n * activated yet.\n *\n * Also asynchronously reports usage to Stripe if `consumer` is present and\n * `resolvedOriginToolCallResult.reportUsage` is `true`.\n *\n * @note This function should be **synchronous**. Any asynchronous operations\n * should use the `waitUntil` callback to not block the response from returning\n * to the end user promptly.\n *\n * @see https://developers.cloudflare.com/analytics/analytics-engine/limits/\n */\nexport function recordToolCallUsage({\n  edgeRequestMode,\n  deployment,\n  consumer,\n  tool,\n  resolvedOriginToolCallResult,\n  httpResponse,\n  mcpToolCallResponse,\n  ip,\n  sessionId,\n  requestId,\n  env,\n  waitUntil\n}: {\n  edgeRequestMode: EdgeRequestMode\n  deployment: AdminDeployment\n  consumer?: AdminConsumer\n  pricingPlan?: PricingPlan\n  tool?: Tool\n  resolvedOriginToolCallResult?: ResolvedOriginToolCallResult\n  httpResponse?: Response\n  mcpToolCallResponse?: McpToolCallResponse\n  ip?: string\n  sessionId: string\n  requestId?: string\n  env: RawEnv\n  waitUntil: WaitUntil\n} & (\n  | {\n      // For http requests, an http response is required.\n      edgeRequestMode: 'HTTP'\n      httpResponse: Response\n      mcpToolCallResponse?: never\n    }\n  | {\n      // For mcp cool call requests, an mcp tool call response is required.\n      edgeRequestMode: 'MCP'\n      httpResponse?: never\n      mcpToolCallResponse: McpToolCallResponse\n    }\n)): void {\n  const { projectId } = deployment\n  const {\n    rateLimitResult,\n    cacheStatus,\n    originTimespanMs,\n    toolCallArgs,\n    numRequestsCost,\n    reportUsage\n  } = resolvedOriginToolCallResult ?? {\n    numRequestsCost: 0,\n    reportUsage: false\n  }\n  mcpToolCallResponse ??= resolvedOriginToolCallResult?.toolCallResponse\n\n  const requestSize = toolCallArgs ? JSON.stringify(toolCallArgs).length : 0\n  const responseSize =\n    Number.parseInt(httpResponse?.headers.get('content-length') ?? '0') ||\n    (mcpToolCallResponse ? JSON.stringify(mcpToolCallResponse).length : 0)\n\n  // The string dimensions used for grouping and filtering (sometimes called\n  // labels in other metrics systems).\n  // NOTE: The ordering of these fields is important and must remain consistent!\n  // Max of 20 blobs with total size <= 5120 bytes.\n  const blobs = [\n    // Project ID of the request\n    projectId,\n\n    // Deployment ID of the request\n    deployment.id,\n\n    // Name of the tool that was called\n    tool?.name ?? null,\n\n    // Whether this request was made via MCP or HTTP\n    edgeRequestMode,\n\n    // IP address or session ID\n    ip ?? sessionId,\n\n    // Request customer ID\n    consumer?.id ?? null,\n\n    // Request customer subscription plan\n    consumer?.plan ?? null,\n\n    // Request customer subscription status\n    consumer?.stripeStatus ?? null,\n\n    // Whether the request was rate-limited\n    rateLimitResult\n      ? rateLimitResult.passed\n        ? 'rl-passed'\n        : 'rl-exceeded'\n      : mcpToolCallResponse?._meta?.status === 429\n        ? 'rl-exceeded'\n        : null,\n\n    // Whether the request hit the cache\n    cacheStatus ?? null,\n\n    // HTTP response status\n    httpResponse?.status?.toString() ||\n      (mcpToolCallResponse\n        ? mcpToolCallResponse._meta?.status?.toString() ||\n          (mcpToolCallResponse?.isError ? 'error' : '200')\n        : 'error')\n  ]\n\n  // Numberic values to record in this data point.\n  // NOTE: The ordering of these fields is important and must remain consistent!\n  const doubles = [\n    // Origin timespan in milliseconds\n    originTimespanMs ?? 0,\n\n    // Request bandwidth in bytes\n    requestSize,\n\n    // Response bandwidth in bytes\n    responseSize,\n\n    // Total bandwidth in bytes\n    // TODO: Correctly calculate total bandwidth using `content-length`\n    requestSize + responseSize,\n\n    // Number of requests cost\n    numRequestsCost ?? 0\n  ]\n\n  // Cloudflare Analytics Engine only supports writing a single index at a time,\n  // so we associate this usage with the project.\n  // TODO: Should we also index based on customer ID / IP? Or is being able to\n  // filter by these fields in the project's `blobs` enough?\n  env.AE_USAGE_DATASET.writeDataPoint({\n    indexes: [projectId],\n    blobs,\n    doubles\n  })\n\n  if (consumer && !consumer.activated) {\n    const client = createAgenticClient({\n      env,\n      cache: caches.default,\n      waitUntil,\n      isCachingEnabled: false\n    })\n\n    // If there's a consumer and it hasn't been activated yet, make sure it's\n    // activated. This may be called multiple times if the consumer is cached,\n    // but this method is intentionally idempotent, and we don't cache non-\n    // activated consumers for long, so it shouldn't be a problem.\n    waitUntil(client.adminActivateConsumer({ consumerId: consumer.id }))\n  }\n\n  if (consumer && reportUsage) {\n    const stripe = createStripe(env)\n\n    const pricingPlanLineItemSlug = 'requests'\n    const eventName = `meter-${projectId}-${pricingPlanLineItemSlug}`\n    const identifier = requestId\n      ? `${requestId}:${consumer.id}:${tool?.name || 'unknown-tool'}`\n      : undefined\n\n    // Report usage to Stripe asynchronously.\n    waitUntil(\n      stripe.billing.meterEvents.create({\n        event_name: eventName,\n        identifier,\n        payload: {\n          value: numRequestsCost.toString(),\n          stripe_customer_id: consumer._stripeCustomerId\n        }\n      })\n    )\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/reset.d.ts",
    "content": "import '@fisch0920/config/ts-reset'\n"
  },
  {
    "path": "apps/gateway/src/lib/resolve-edge-request.ts",
    "content": "import type { AdminDeployment, PricingPlan } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\nimport { parseToolIdentifier } from '@agentic/platform-validators'\n\nimport type {\n  AdminConsumer,\n  GatewayHonoContext,\n  ResolvedEdgeRequest\n} from './types'\nimport { getAdminConsumer } from './get-admin-consumer'\nimport { getAdminDeployment } from './get-admin-deployment'\n\n/**\n * Resolves an input HTTP request to a specific deployment and edge request\n * mode (MCP or HTTP).\n */\nexport async function resolveEdgeRequest(\n  ctx: GatewayHonoContext\n): Promise<ResolvedEdgeRequest> {\n  const requestUrl = new URL(ctx.req.url)\n  const { pathname } = requestUrl\n  const requestedToolIdentifier = pathname.replace(/^\\//, '').replace(/\\/$/, '')\n  const parsedToolIdentifier = parseToolIdentifier(requestedToolIdentifier)\n\n  const deployment = await getAdminDeployment(\n    ctx,\n    parsedToolIdentifier.deploymentIdentifier\n  )\n\n  const edgeRequestMode =\n    parsedToolIdentifier.toolName === 'mcp' ? 'MCP' : 'HTTP'\n\n  return {\n    edgeRequestMode,\n    parsedToolIdentifier,\n    deployment,\n    requestId: ctx.get('requestId'),\n    ip: ctx.get('ip')\n  }\n}\n\n/**\n * Resolves a consumer and pricing plan for an edge request.\n */\nexport async function resolveConsumerForEdgeRequest(\n  ctx: GatewayHonoContext,\n  {\n    deployment,\n    apiKey\n  }: {\n    deployment: AdminDeployment\n    apiKey?: string\n  }\n): Promise<{\n  consumer?: AdminConsumer\n  pricingPlan?: PricingPlan\n}> {\n  let pricingPlan: PricingPlan | undefined\n  let consumer: AdminConsumer | undefined\n\n  if (apiKey) {\n    consumer = await getAdminConsumer(ctx, apiKey)\n    assert(consumer, 401, `Invalid API key \"${apiKey}\"`)\n    assert(\n      consumer.isStripeSubscriptionActive,\n      402,\n      `API key \"${apiKey}\" does not have an active subscription`\n    )\n    assert(\n      consumer.projectId === deployment.projectId,\n      403,\n      `API key \"${apiKey}\" is not authorized for project \"${deployment.projectId}\"`\n    )\n\n    // TODO: Ensure that consumer.plan is compatible with the target deployment?\n    // TODO: This could definitely cause issues when changing pricing plans.\n\n    pricingPlan = deployment.pricingPlans.find(\n      (pricingPlan) => consumer!.plan === pricingPlan.slug\n    )\n\n    // assert(\n    //   pricingPlan,\n    //   403,\n    //   `Auth token \"${token}\" unable to find matching pricing plan for project \"${deployment.project}\"`\n    // )\n  } else {\n    // For unauthenticated requests, default to a free pricing plan if available.\n    pricingPlan = deployment.pricingPlans.find((plan) => plan.slug === 'free')\n  }\n\n  return {\n    consumer,\n    pricingPlan\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/resolve-http-edge-request.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type {\n  GatewayHonoContext,\n  ResolvedEdgeRequest,\n  ResolvedHttpEdgeRequest\n} from './types'\nimport { getTool } from './get-tool'\nimport { getToolArgsFromRequest } from './get-tool-args-from-request'\nimport { resolveConsumerForEdgeRequest } from './resolve-edge-request'\nimport { isRequestPubliclyCacheable } from './utils'\n\n/**\n * Resolves an input HTTP request to a specific deployment, tool call, consumer,\n * and pricing plan.\n */\nexport async function resolveHttpEdgeRequest(\n  ctx: GatewayHonoContext,\n  resolvedEdgeRequest: ResolvedEdgeRequest\n): Promise<ResolvedHttpEdgeRequest> {\n  assert(\n    resolvedEdgeRequest.edgeRequestMode === 'HTTP',\n    500,\n    `Internal error: Invalid edge request mode \"${resolvedEdgeRequest.edgeRequestMode}\" (expected \"HTTP\")`\n  )\n  const logger = ctx.get('logger')\n  const ip = ctx.get('ip')\n\n  const cacheControl = isRequestPubliclyCacheable(ctx.req.raw)\n    ? ctx.req.header('cache-control')\n    : 'no-store'\n\n  const { deployment, parsedToolIdentifier } = resolvedEdgeRequest\n  const { toolName } = parsedToolIdentifier\n  const { method } = ctx.req\n\n  const tool = getTool({\n    method,\n    deployment,\n    toolName\n  })\n\n  logger.debug('request', {\n    method,\n    deploymentIdentifier: deployment.identifier,\n    toolName,\n    tool\n  })\n\n  const apiKey = (ctx.req.header('authorization') || '')\n    .replace(/^Bearer /i, '')\n    .trim()\n\n  const { consumer, pricingPlan } = await resolveConsumerForEdgeRequest(ctx, {\n    deployment,\n    apiKey\n  })\n\n  if (consumer) {\n    if (!ctx.get('sessionId')) {\n      ctx.set('sessionId', `${consumer.id}:${deployment.id}`)\n    }\n  } else {\n    if (!ctx.get('sessionId')) {\n      assert(ip, 500, 'IP address is required for unauthenticated requests')\n      ctx.set('sessionId', `${ip}:${deployment.projectId}`)\n    }\n  }\n\n  // Parse tool call arguments from the request body.\n  const toolCallArgs = await getToolArgsFromRequest(ctx, { tool, deployment })\n\n  return {\n    ...resolvedEdgeRequest,\n    edgeRequestMode: 'HTTP',\n    consumer,\n    pricingPlan,\n    tool,\n    toolCallArgs,\n    cacheControl\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/resolve-mcp-edge-request.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nimport type {\n  GatewayHonoContext,\n  ResolvedEdgeRequest,\n  ResolvedMcpEdgeRequest\n} from './types'\nimport { resolveConsumerForEdgeRequest } from './resolve-edge-request'\n\nexport async function resolveMcpEdgeRequest(\n  ctx: GatewayHonoContext,\n  resolvedEdgeRequest: ResolvedEdgeRequest\n): Promise<ResolvedMcpEdgeRequest> {\n  assert(\n    resolvedEdgeRequest.edgeRequestMode === 'MCP',\n    500,\n    `Internal error: Invalid edge request mode \"${resolvedEdgeRequest.edgeRequestMode}\" (expected \"MCP\")`\n  )\n\n  const { deployment } = resolvedEdgeRequest\n\n  // TODO: Should MCP edge requests also support Authorization header?\n  const apiKey = ctx.req.query('apiKey')?.trim()\n\n  const { consumer, pricingPlan } = await resolveConsumerForEdgeRequest(ctx, {\n    deployment,\n    apiKey\n  })\n\n  return {\n    ...resolvedEdgeRequest,\n    edgeRequestMode: 'MCP',\n    consumer,\n    pricingPlan\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/resolve-origin-tool-call.ts",
    "content": "import type {\n  AdminDeployment,\n  AgenticMcpRequestMetadata,\n  PricingPlan,\n  Tool\n} from '@agentic/platform-types'\nimport type { DurableObjectStub } from '@cloudflare/workers-types'\nimport { assert, RateLimitError } from '@agentic/platform-core'\nimport { parseDeploymentIdentifier } from '@agentic/platform-validators'\n\nimport type { DurableMcpClientBase } from './durable-mcp-client'\nimport type { RawEnv } from './env'\nimport type {\n  AdminConsumer,\n  CacheStatus,\n  McpToolCallResponse,\n  RateLimitResult,\n  ResolvedOriginToolCallResult,\n  ToolCallArgs,\n  WaitUntil\n} from './types'\nimport { cfValidateJsonSchema } from './cf-validate-json-schema'\nimport { createHttpRequestForOpenAPIOperation } from './create-http-request-for-openapi-operation'\nimport { fetchCache } from './fetch-cache'\nimport { getRequestCacheKey } from './get-request-cache-key'\nimport { enforceRateLimit } from './rate-limits/enforce-rate-limit'\nimport { updateOriginRequest } from './update-origin-request'\nimport {\n  isCacheControlPubliclyCacheable,\n  isResponsePubliclyCacheable\n} from './utils'\n\nexport async function resolveOriginToolCall({\n  tool,\n  args,\n  deployment,\n  consumer,\n  pricingPlan,\n  ip,\n  sessionId,\n  env,\n  cacheControl,\n  waitUntil\n}: {\n  tool: Tool\n  args?: ToolCallArgs\n  deployment: AdminDeployment\n  consumer?: AdminConsumer\n  pricingPlan?: PricingPlan\n  ip?: string\n  sessionId: string\n  env: RawEnv\n  cacheControl?: string\n  waitUntil: WaitUntil\n}): Promise<ResolvedOriginToolCallResult> {\n  // TODO: consider moving all of this per-request logic to a diff method since\n  // it's not specific to tool calls. eg, other MCP requests may still need to\n  // be rate-limited / cached / tracked / etc.\n\n  const { origin } = deployment\n  // TODO: make this configurable via `ToolConfig.cost`\n  const numRequestsCost = 1\n  let rateLimit = deployment.defaultRateLimit\n  let rateLimitResult: RateLimitResult | undefined\n  let cacheStatus: CacheStatus | undefined\n  let reportUsage = true\n\n  // Resolve rate limit and whether to report `requests` usage based on the\n  // customer's pricing plan and deployment config.\n  if (pricingPlan) {\n    if (pricingPlan.rateLimit) {\n      rateLimit = pricingPlan.rateLimit\n    }\n\n    const requestsLineItem = pricingPlan.lineItems.find(\n      (lineItem) => lineItem.slug === 'requests'\n    )\n\n    if (!requestsLineItem) {\n      // No `requests` line-item, so we don't report usage for this tool.\n      reportUsage = false\n    }\n  }\n\n  const toolConfig = deployment.toolConfigs.find(\n    (toolConfig) => toolConfig.name === tool.name\n  )\n\n  if (toolConfig) {\n    if (toolConfig.reportUsage !== undefined) {\n      reportUsage &&= !!toolConfig.reportUsage\n    }\n\n    if (toolConfig.rateLimit !== undefined) {\n      rateLimit = toolConfig.rateLimit\n    }\n\n    if (cacheControl) {\n      if (!isCacheControlPubliclyCacheable(cacheControl)) {\n        // Incoming request explicitly requests to bypass the gateway's cache.\n        cacheStatus = 'BYPASS'\n      } else {\n        // TODO: Should we allow incoming cache-control headers to override the\n        // gateway's cache behavior?\n      }\n    } else {\n      // If the incoming request doesn't specify a desired `cache-control`,\n      // then use a default based on the tool's configured settings.\n      if (toolConfig.cacheControl !== undefined) {\n        cacheControl = toolConfig.cacheControl\n      } else if (toolConfig.pure) {\n        // If the tool is marked as `pure`, then we can cache responses in our\n        // public, shared cache indefinitely.\n        cacheControl =\n          'public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600'\n      } else {\n        // Default to not caching any responses.\n        cacheControl = 'no-store'\n        cacheStatus = 'DYNAMIC'\n      }\n    }\n\n    const pricingPlanToolOverride = pricingPlan\n      ? toolConfig.pricingPlanOverridesMap?.[pricingPlan.slug]\n      : undefined\n    const isToolEnabled = toolConfig.enabled ?? true\n\n    // Check if this tool is configured for pricing-plan-specific overrides\n    // which take precedence over the tool's default behavior.\n    if (pricingPlan && pricingPlanToolOverride) {\n      if (pricingPlanToolOverride.enabled !== undefined) {\n        assert(\n          pricingPlanToolOverride.enabled,\n          isToolEnabled ? 403 : 404,\n          `Tool \"${tool.name}\" is disabled for pricing plan \"${pricingPlan.slug}\"`\n        )\n      } else {\n        assert(isToolEnabled, 404, `Tool \"${tool.name}\" is disabled`)\n      }\n\n      if (pricingPlanToolOverride.reportUsage !== undefined) {\n        reportUsage &&= !!pricingPlanToolOverride.reportUsage\n      }\n\n      if (pricingPlanToolOverride.rateLimit !== undefined) {\n        rateLimit = pricingPlanToolOverride.rateLimit\n      }\n    } else {\n      assert(isToolEnabled, 404, `Tool \"${tool.name}\" is disabled`)\n    }\n  } else {\n    if (cacheControl) {\n      if (!isCacheControlPubliclyCacheable(cacheControl)) {\n        // Incoming request explicitly requests to bypass the gateway's cache.\n        cacheStatus = 'BYPASS'\n      } else {\n        // TODO: Should we allow incoming cache-control headers to override the\n        // gateway's cache behavior?\n      }\n    } else {\n      // Default to not caching any responses.\n      cacheControl = 'no-store'\n      cacheStatus = 'DYNAMIC'\n    }\n  }\n\n  if (rateLimit) {\n    // TODO: Consider decrementing rate limit if the response is cached or\n    // errors? this doesn't seem too important, so will leave as-is for now.\n    rateLimitResult = await enforceRateLimit({\n      rateLimit,\n      id: consumer?.id ?? ip ?? sessionId,\n      cost: numRequestsCost,\n      env,\n      waitUntil\n    })\n\n    if (rateLimitResult && !rateLimitResult.passed) {\n      throw new RateLimitError({ rateLimitResult })\n    }\n  }\n\n  if (origin.type === 'raw') {\n    // TODO\n    assert(false, 500, 'Raw origin adapter not implemented')\n  } else {\n    // Validate incoming request params against the tool's input schema.\n    const toolCallArgs = cfValidateJsonSchema<Record<string, any>>({\n      schema: tool.inputSchema,\n      data: args,\n      errorPrefix: `Invalid request parameters for tool \"${tool.name}\"`,\n      strictAdditionalProperties:\n        toolConfig?.inputSchemaAdditionalProperties === false\n    })\n\n    const originStartTimeMs = Date.now()\n\n    if (origin.type === 'openapi') {\n      const operation = origin.toolToOperationMap[tool.name]\n      assert(operation, 404, `Tool \"${tool.name}\" not found in OpenAPI spec`)\n      assert(toolCallArgs, 500)\n\n      const originRequest = await createHttpRequestForOpenAPIOperation({\n        toolCallArgs,\n        operation,\n        deployment\n      })\n\n      updateOriginRequest(originRequest, { consumer, deployment, cacheControl })\n\n      const cacheKey = await getRequestCacheKey(originRequest)\n\n      // TODO: transform origin 5XX errors to 502 errors...\n      const originResponse = await fetchCache({\n        cacheKey,\n        fetchResponse: async () => {\n          let response = await fetch(originRequest)\n\n          if (cacheControl && isResponsePubliclyCacheable(response)) {\n            response = new Response(response.body, response)\n            response.headers.set('cache-control', cacheControl)\n          }\n\n          return response\n        },\n        waitUntil\n      })\n\n      // Fetch the origin response without caching (useful for debugging)\n      // const originResponse = await fetch(originRequest)\n\n      cacheStatus =\n        (originResponse.headers.get('cf-cache-status') as CacheStatus) ??\n        cacheStatus ??\n        (cacheKey ? 'MISS' : 'BYPASS')\n\n      return {\n        cacheStatus,\n        reportUsage,\n        rateLimit,\n        rateLimitResult,\n        toolCallArgs,\n        originRequest,\n        originResponse,\n        originTimespanMs: Date.now() - originStartTimeMs,\n        numRequestsCost,\n        toolConfig\n      }\n    } else if (origin.type === 'mcp') {\n      const { projectIdentifier } = parseDeploymentIdentifier(\n        deployment.identifier,\n        { errorStatusCode: 500 }\n      )\n\n      const id = env.DO_MCP_CLIENT.idFromName(sessionId)\n      const originMcpClient = env.DO_MCP_CLIENT.get(\n        id\n      ) as DurableObjectStub<DurableMcpClientBase>\n\n      await originMcpClient.init({\n        url: deployment.origin.url,\n        name: origin.serverInfo.name,\n        version: origin.serverInfo.version,\n        headers: origin.headers\n      })\n\n      const originMcpRequestMetadata = {\n        agenticProxySecret: deployment._secret,\n        sessionId,\n        ip,\n        isCustomerSubscriptionActive: !!consumer?.isStripeSubscriptionActive,\n        customerId: consumer?.id,\n        customerSubscriptionPlan: consumer?.plan,\n        customerSubscriptionStatus: consumer?.stripeStatus,\n        userId: consumer?.user.id,\n        userEmail: consumer?.user.email,\n        userUsername: consumer?.user.username,\n        userName: consumer?.user.name,\n        userCreatedAt: consumer?.user.createdAt,\n        userUpdatedAt: consumer?.user.updatedAt,\n        deploymentId: deployment.id,\n        deploymentIdentifier: deployment.identifier,\n        projectId: deployment.projectId,\n        projectIdentifier\n      } as AgenticMcpRequestMetadata\n\n      let cacheKey: Request | undefined\n\n      if (cacheControl && isCacheControlPubliclyCacheable(cacheControl)) {\n        const fakeOriginRequest = new Request(deployment.origin.url, {\n          method: 'POST',\n          headers: {\n            'content-type': 'application/json',\n            'cache-control': cacheControl\n          },\n          body: JSON.stringify({\n            name: tool.name,\n            args: toolCallArgs,\n            metadata: originMcpRequestMetadata\n          })\n        })\n\n        cacheKey = await getRequestCacheKey(fakeOriginRequest)\n        if (cacheKey) {\n          const response = await caches.default.match(cacheKey)\n          if (response) {\n            return {\n              cacheStatus: 'HIT',\n              reportUsage,\n              rateLimit,\n              rateLimitResult,\n              toolCallArgs,\n              toolCallResponse: (await response.json()) as McpToolCallResponse,\n              originTimespanMs: Date.now() - originStartTimeMs,\n              numRequestsCost,\n              toolConfig\n            }\n          }\n        }\n      }\n\n      // TODO: add timeout support to the origin tool call?\n      const toolCallResponseString = await originMcpClient.callTool({\n        name: tool.name,\n        args: toolCallArgs,\n        metadata: originMcpRequestMetadata\n      })\n      const toolCallResponse = JSON.parse(\n        toolCallResponseString\n      ) as McpToolCallResponse\n\n      if (cacheControl && cacheKey) {\n        const fakeHttpResponse = new Response(toolCallResponseString, {\n          headers: {\n            'content-type': 'application/json',\n            'cache-control': cacheControl\n          }\n        })\n        waitUntil(caches.default.put(cacheKey, fakeHttpResponse))\n      }\n\n      return {\n        cacheStatus: cacheStatus ?? (cacheKey ? 'MISS' : 'BYPASS'),\n        reportUsage,\n        rateLimit,\n        rateLimitResult,\n        toolCallArgs,\n        toolCallResponse,\n        originTimespanMs: Date.now() - originStartTimeMs,\n        numRequestsCost,\n        toolConfig\n      }\n    } else {\n      assert(\n        false,\n        500,\n        `Internal error: origin adapter type \"${(origin as any).type}\"`\n      )\n    }\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/temp",
    "content": "// import type { AdminDeployment, PricingPlan } from '@agentic/platform-types'\n// import type { JSONRPCRequest } from '@modelcontextprotocol/sdk/types.js'\n// // import type { JSONRPCRequest } from '@modelcontextprotocol/sdk/types.js'\n// import { assert } from '@agentic/platform-core'\n// import { parseDeploymentIdentifier } from '@agentic/platform-validators'\n// import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n// import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\n// import { DurableObject } from 'cloudflare:workers'\n\n// import type { AdminConsumer } from './types'\n\n// export type DurableMcpServerInfo = {\n//   deployment: AdminDeployment\n//   consumer?: AdminConsumer\n//   pricingPlan?: PricingPlan\n// }\n\n// export class DurableMcpServer extends DurableObject {\n//   protected server?: McpServer\n//   protected serverTransport?: StreamableHTTPServerTransport\n//   protected serverConnectionP?: Promise<void>\n\n//   async init(mcpServerInfo: DurableMcpServerInfo) {\n//     const existingMcpServerInfo =\n//       await this.ctx.storage.get<DurableMcpServerInfo>('mcp-server-info')\n\n//     if (!existingMcpServerInfo) {\n//       await this.ctx.storage.put('mcp-server-info', mcpServerInfo)\n//     } else {\n//       assert(\n//         mcpServerInfo.deployment.id === existingMcpServerInfo.deployment.id,\n//         500,\n//         `DurableMcpServerInfo deployment id mismatch: \"${mcpServerInfo.deployment.id}\" vs \"${existingMcpServerInfo.deployment.id}\"`\n//       )\n//     }\n\n//     return this.ensureServerConnection(mcpServerInfo)\n//   }\n\n//   async isInitialized(): Promise<boolean> {\n//     return !!(await this.ctx.storage.get('mcp-server-info'))\n//   }\n\n//   async ensureServerConnection(mcpServerInfo?: DurableMcpServerInfo) {\n//     if (this.serverConnectionP) return this.serverConnectionP\n\n//     mcpServerInfo ??=\n//       await this.ctx.storage.get<DurableMcpServerInfo>('mcp-server-info')\n//     assert(mcpServerInfo, 500, 'DurableMcpServer has not been initialized')\n//     const { deployment } = mcpServerInfo\n\n//     const { projectIdentifier } = parseDeploymentIdentifier(\n//       deployment.identifier\n//     )\n\n//     this.server = new McpServer({\n//       name: projectIdentifier,\n//       version: deployment.version ?? '0.0.0'\n//     })\n\n//     for (const tool of deployment.tools) {\n//       this.server.registerTool(\n//         tool.name,\n//         {\n//           description: tool.description,\n//           inputSchema: tool.inputSchema as any, // TODO: investigate types\n//           outputSchema: tool.outputSchema as any, // TODO: investigate types\n//           annotations: tool.annotations\n//         },\n//         (_args: Record<string, unknown>) => {\n//           assert(false, 500, `Tool call not implemented: ${tool.name}`)\n\n//           // TODO???\n//           return {\n//             content: [],\n//             _meta: {\n//               toolName: tool.name\n//             }\n//           }\n//         }\n//       )\n//     }\n\n//     const transport = new StreamableHTTPServerTransport({\n//       sessionIdGenerator: () => {\n//         // TODO: improve this\n//         return crypto.randomUUID()\n//       },\n//       onsessioninitialized: (sessionId) => {\n//         // TODO: improve this\n//         // eslint-disable-next-line no-console\n//         console.log(`Session initialized: ${sessionId}`)\n//       }\n//     })\n//     this.serverConnectionP = this.server.connect(transport)\n\n//     return this.serverConnectionP\n//   }\n\n//   // async fetch(request: Request) {\n//   //   await this.ensureServerConnection()\n//   //   const { readable, writable } = new TransformStream()\n//   //   const writer = writable.getWriter()\n//   //   const encoder = new TextEncoder()\n\n//   //   const response = new Response(readable, {\n//   //     headers: {\n//   //       'Content-Type': 'text/event-stream',\n//   //       'Cache-Control': 'no-cache',\n//   //       Connection: 'keep-alive'\n//   //       // 'mcp-session-id': sessionId\n//   //     }\n//   //   })\n\n//   //   await this.serverTransport!.handleRequest(request, response)\n//   // }\n\n//   async onRequest(message: JSONRPCRequest) {\n//     await this.ensureServerConnection()\n\n//     // We need to map every incoming message to the connection that it came in on\n//     // so that we can send relevant responses and notifications back on the same connection\n//     // if (isJSONRPCRequest(message)) {\n//     //   this._requestIdToConnectionId.set(message.id.toString(), connection.id);\n//     // }\n\n//     this.serverTransport!.onmessage?.(message)\n//   }\n// }\n"
  },
  {
    "path": "apps/gateway/src/lib/temp-mcp",
    "content": "// import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n// import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\n// import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport { assert, JsonRpcError } from '@agentic/platform-core'\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport {\n  InitializeRequestSchema,\n  isJSONRPCError,\n  isJSONRPCNotification,\n  isJSONRPCRequest,\n  isJSONRPCResponse,\n  type JSONRPCMessage,\n  JSONRPCMessageSchema\n} from '@modelcontextprotocol/sdk/types.js'\n\nimport type { GatewayHonoContext } from './lib/types'\nimport { createConsumerMcpServer } from './lib/consumer-mcp-server'\nimport { resolveMcpEdgeRequest } from './lib/resolve-mcp-edge-request'\n// import { DurableMcpServer } from './lib/durable-mcp-server'\n\n// TODO: https://github.com/modelcontextprotocol/servers/blob/8fb7bbdab73eddb42aba72e8eab81102efe1d544/src/everything/sse.ts\n// TODO: https://github.com/cloudflare/agents\n\n// const transports: Map<string, StreamableHTTPClientTransport> = new Map<\n//   string,\n//   StreamableHTTPClientTransport\n// >()\n// const server = new McpServer({\n//   name: 'weather',\n//   version: '1.0.0',\n//   capabilities: {\n//     resources: {},\n//     tools: {}\n//   }\n// })\n\n// class McpStreamableHttpTransport implements Transport {\n//   onclose?: () => void\n//   onerror?: (error: Error) => void\n//   onmessage?: (message: JSONRPCMessage) => void\n//   sessionId?: string\n\n//   // TODO: If there is an open connection to send server-initiated messages\n//   // back, we should use that connection\n//   private _getWebSocketForGetRequest: () => WebSocket | null\n\n//   // Get the appropriate websocket connection for a given message id\n//   private _getWebSocketForMessageID: (id: string) => WebSocket | null\n\n//   // Notify the server that a response has been sent for a given message id\n//   // so that it may clean up it's mapping of message ids to connections\n//   // once they are no longer needed\n//   private _notifyResponseIdSent: (id: string) => void\n\n//   private _started = false\n//   constructor(\n//     getWebSocketForMessageID: (id: string) => WebSocket | null,\n//     notifyResponseIdSent: (id: string | number) => void\n//   ) {\n//     this._getWebSocketForMessageID = getWebSocketForMessageID\n//     this._notifyResponseIdSent = notifyResponseIdSent\n//     // TODO\n//     this._getWebSocketForGetRequest = () => null\n//   }\n\n//   async start() {\n//     // The transport does not manage the WebSocket connection since it's terminated\n//     // by the Durable Object in order to allow hibernation. There's nothing to initialize.\n//     if (this._started) {\n//       throw new Error('Transport already started')\n//     }\n//     this._started = true\n//   }\n\n//   async send(message: JSONRPCMessage) {\n//     if (!this._started) {\n//       throw new Error('Transport not started')\n//     }\n\n//     let websocket: WebSocket | null = null\n\n//     if (isJSONRPCResponse(message) || isJSONRPCError(message)) {\n//       websocket = this._getWebSocketForMessageID(message.id.toString())\n//       if (!websocket) {\n//         throw new Error(\n//           `Could not find WebSocket for message id: ${message.id}`\n//         )\n//       }\n//     } else if (isJSONRPCRequest(message)) {\n//       // requests originating from the server must be sent over the\n//       // the connection created by a GET request\n//       websocket = this._getWebSocketForGetRequest()\n//     } else if (isJSONRPCNotification(message)) {\n//       // notifications do not have an id\n//       // but do have a relatedRequestId field\n//       // so that they can be sent to the correct connection\n//       websocket = null\n//     }\n\n//     try {\n//       websocket?.send(JSON.stringify(message))\n//       if (isJSONRPCResponse(message)) {\n//         this._notifyResponseIdSent(message.id.toString())\n//       }\n//     } catch (err) {\n//       this.onerror?.(err as Error)\n//       throw err\n//     }\n//   }\n\n//   async close() {\n//     // Similar to start, the only thing to do is to pass the event on to the server\n//     this.onclose?.()\n//   }\n// }\n\nconst MAXIMUM_MESSAGE_SIZE_BYTES = 4 * 1024 * 1024 // 4MB\n\nexport async function handleMcpRequest(ctx: GatewayHonoContext) {\n  const request = ctx.req.raw\n  ctx.set('isJsonRpcRequest', true)\n\n  if (request.method !== 'POST') {\n    // We don't yet support GET or DELETE requests\n    throw new JsonRpcError({\n      message: 'Method not allowed',\n      statusCode: 405,\n      jsonRpcErrorCode: -32_000,\n      jsonRpcId: null\n    })\n  }\n\n  // validate the Accept header\n  const acceptHeader = request.headers.get('accept')\n\n  // The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.\n  if (\n    !acceptHeader?.includes('application/json') ||\n    !acceptHeader.includes('text/event-stream')\n  ) {\n    throw new JsonRpcError({\n      message:\n        'Not Acceptable: Client must accept both \"application/json\" and \"text/event-stream\"',\n      statusCode: 406,\n      jsonRpcErrorCode: -32_000,\n      jsonRpcId: null\n    })\n  }\n\n  const ct = request.headers.get('content-type')\n  if (!ct?.includes('application/json')) {\n    throw new JsonRpcError({\n      message:\n        'Unsupported Media Type: Content-Type must be \"application/json\"',\n      statusCode: 415,\n      jsonRpcErrorCode: -32_000,\n      jsonRpcId: null\n    })\n  }\n\n  // Check content length against maximum allowed size\n  const contentLength = Number.parseInt(\n    request.headers.get('content-length') ?? '0',\n    10\n  )\n  if (contentLength > MAXIMUM_MESSAGE_SIZE_BYTES) {\n    throw new JsonRpcError({\n      message: `Request body too large. Maximum size is ${MAXIMUM_MESSAGE_SIZE_BYTES} bytes`,\n      statusCode: 413,\n      jsonRpcErrorCode: -32_000,\n      jsonRpcId: null\n    })\n  }\n\n  let sessionId = request.headers.get('mcp-session-id')\n  let rawMessage: unknown\n\n  try {\n    rawMessage = await request.json()\n  } catch {\n    throw new JsonRpcError({\n      message: 'Parse error: Invalid JSON',\n      statusCode: 400,\n      jsonRpcErrorCode: -32_700,\n      jsonRpcId: null\n    })\n  }\n\n  // Make sure the message is an array to simplify logic\n  const rawMessages = Array.isArray(rawMessage) ? rawMessage : [rawMessage]\n\n  // Try to parse each message as JSON RPC. Fail if any message is invalid\n  const messages: JSONRPCMessage[] = rawMessages.map((msg) => {\n    const parsed = JSONRPCMessageSchema.safeParse(msg)\n    if (!parsed.success) {\n      throw new JsonRpcError({\n        message: 'Parse error: Invalid JSON-RPC message',\n        statusCode: 400,\n        jsonRpcErrorCode: -32_700,\n        jsonRpcId: null\n      })\n    }\n    return parsed.data\n  })\n\n  // Before we pass the messages to the agent, there's another error condition\n  // we need to enforce. Check if this is an initialization request\n  // https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle/\n  const isInitializationRequest = messages.some(\n    (msg) => InitializeRequestSchema.safeParse(msg).success\n  )\n\n  if (isInitializationRequest && sessionId) {\n    throw new JsonRpcError({\n      message:\n        'Invalid Request: Initialization requests must not include a sessionId',\n      statusCode: 400,\n      jsonRpcErrorCode: -32_600,\n      jsonRpcId: null\n    })\n  }\n\n  // The initialization request must be the only request in the batch\n  if (isInitializationRequest && messages.length > 1) {\n    throw new JsonRpcError({\n      message: 'Invalid Request: Only one initialization request is allowed',\n      statusCode: 400,\n      jsonRpcErrorCode: -32_600,\n      jsonRpcId: null\n    })\n  }\n\n  // If an Mcp-Session-Id is returned by the server during initialization,\n  // clients using the Streamable HTTP transport MUST include it\n  // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n  if (!isInitializationRequest && !sessionId) {\n    throw new JsonRpcError({\n      message: 'Bad Request: Mcp-Session-Id header is required',\n      statusCode: 400,\n      jsonRpcErrorCode: -32_000,\n      jsonRpcId: null\n    })\n  }\n\n  // If we don't have a sessionId, we are serving an initialization request\n  // and need to generate a new sessionId\n  sessionId = sessionId ?? ctx.env.DO_MCP_SERVER.newUniqueId().toString()\n  assert(\n    !ctx.get('sessionId'),\n    500,\n    'Session ID should be set by MCP handler for MCP edge requests'\n  )\n  ctx.set('sessionId', sessionId)\n\n  // TODO: first version using the McpServer locally instead of a DurableMcpServer\n  // Fetch the durable mcp server for this session\n  // const id = ctx.env.DO_MCP_SERVER.idFromName(`streamable-http:${sessionId}`)\n  // const durableMcpServer = ctx.env.DO_MCP_SERVER.get(id)\n  // const isInitialized = await durableMcpServer.isInitialized()\n\n  // if (!isInitializationRequest && !isInitialized) {\n  //   // A session id that was never initialized was provided\n  //   throw new JsonRpcError({\n  //     message: 'Session not found',\n  //     statusCode: 404,\n  //     jsonRpcErrorCode: -32_001,\n  //     jsonRpcId: null\n  //   })\n  // }\n\n  const { deployment, consumer, pricingPlan } = await resolveMcpEdgeRequest(ctx)\n  const server = createConsumerMcpServer(ctx, {\n    sessionId,\n    deployment,\n    consumer,\n    pricingPlan\n  })\n\n  const transport = new StreamableHTTPServerTransport({\n    sessionIdGenerator: () => {\n      return ctx.env.DO_MCP_SERVER.newUniqueId().toString()\n    },\n    onsessioninitialized: (sessionId) => {\n      // TODO: improve this\n      // eslint-disable-next-line no-console\n      console.log(`Session initialized: ${sessionId}`)\n    }\n  })\n  await server.connect(transport)\n\n  // if (isInitializationRequest) {\n  //   await durableMcpServer.init({\n  //     deployment,\n  //     consumer,\n  //     pricingPlan\n  //   })\n  // }\n\n  // We've validated and initialized the request! Now it's time to actually\n  // handle the JSON RPC messages in the request and respond with an SSE\n  // stream.\n\n  // Create a Transform Stream for SSE\n  const { readable, writable } = new TransformStream()\n  const writer = writable.getWriter()\n  const encoder = new TextEncoder()\n\n  // Keep track of the request ids that we have sent to the server\n  // so that we can close the connection once we have received\n  // all the responses\n  const requestIds = new Set<string | number>()\n\n  // eslint-disable-next-line unicorn/prefer-add-event-listener\n  transport.onmessage = async (message) => {\n    // eslint-disable-next-line no-console\n    console.log('onmessage', message)\n\n    // validate that the message is a valid JSONRPC message\n    const result = JSONRPCMessageSchema.safeParse(message)\n    if (!result.success) {\n      // TODO: add a warning here\n      return\n    }\n\n    // If the message is a response or an error, remove the id from the set of\n    // request ids\n    if (isJSONRPCResponse(result.data) || isJSONRPCError(result.data)) {\n      requestIds.delete(result.data.id)\n    }\n\n    // Send the message as an SSE event\n    const messageText = `event: message\\ndata: ${JSON.stringify(result.data)}\\n\\n`\n    await writer.write(encoder.encode(messageText))\n\n    // If we have received all the responses, close the connection\n    if (!requestIds.size) {\n      ctx.executionCtx.waitUntil(transport.close())\n      await writer.close()\n    }\n  }\n\n  // If there are no requests, we send the messages downstream and\n  // acknowledge the request with a 202 since we don't expect any responses\n  // back through this connection.\n  const hasOnlyNotificationsOrResponses = messages.every(\n    (msg) => isJSONRPCNotification(msg) || isJSONRPCResponse(msg)\n  )\n  if (hasOnlyNotificationsOrResponses) {\n    await Promise.all(messages.map((message) => transport.send(message)))\n\n    return new Response(null, {\n      status: 202\n    })\n  }\n\n  for (const message of messages) {\n    if (isJSONRPCRequest(message)) {\n      // Add each request id that we send off to a set so that we can keep\n      // track of which requests we still need a response for.\n      requestIds.add(message.id)\n    }\n\n    await transport.send(message)\n  }\n\n  // console.log('>>> waiting...')\n  // await new Promise((resolve) => setTimeout(resolve, 2000))\n  // console.log('<<< waiting...')\n\n  // Return the streamable http response.\n  return new Response(readable, {\n    headers: {\n      'Content-Type': 'text/event-stream',\n      'Cache-Control': 'no-cache',\n      Connection: 'keep-alive',\n      'mcp-session-id': sessionId\n    },\n    status: 200\n  })\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/transform-http-response-to-mcp-tool-call-response.ts",
    "content": "import type { Tool, ToolConfig } from '@agentic/platform-types'\nimport { assert, HttpError } from '@agentic/platform-core'\nimport contentType from 'fast-content-type-parse'\n\nimport type { McpToolCallResponse, ToolCallArgs } from './types'\nimport { cfValidateJsonSchema } from './cf-validate-json-schema'\n\nexport async function transformHttpResponseToMcpToolCallResponse({\n  originRequest,\n  originResponse,\n  tool,\n  toolCallArgs,\n  toolConfig\n}: {\n  originRequest: Request\n  originResponse: Response\n  tool: Tool\n  toolCallArgs: ToolCallArgs\n  toolConfig?: ToolConfig\n}) {\n  const { type: mimeType } = contentType.safeParse(\n    originResponse.headers.get('content-type') || 'application/octet-stream'\n  )\n\n  // TODO: move these logs should be higher up\n  // eslint-disable-next-line no-console\n  console.log('httpOriginResponse', {\n    tool: tool.name,\n    toolCallArgs,\n    url: originRequest.url,\n    method: originRequest.method,\n    originResponse: {\n      mimeType,\n      status: originResponse.status\n      // headers: Object.fromEntries(originResponse.headers.entries())\n    }\n  })\n\n  if (originResponse.status >= 400) {\n    let message = originResponse.statusText\n    try {\n      message = await originResponse.text()\n    } catch {}\n\n    // eslint-disable-next-line no-console\n    console.error('httpOriginResponse ERROR', {\n      tool: tool.name,\n      toolCallArgs,\n      url: originRequest.url,\n      method: originRequest.method,\n      originResponse: {\n        mimeType,\n        status: originResponse.status,\n        // headers: Object.fromEntries(originResponse.headers.entries()),\n        message\n      }\n    })\n\n    throw new HttpError({\n      statusCode: originResponse.status,\n      message,\n      cause: originResponse\n    })\n  }\n\n  const result: McpToolCallResponse = {\n    isError: originResponse.status >= 400\n  }\n\n  if (tool.outputSchema) {\n    assert(\n      mimeType.includes('json'),\n      502,\n      `Tool \"${tool.name}\" requires a JSON response, but the origin returned content type \"${mimeType}\"`\n    )\n    const data = (await originResponse.json()) as Record<string, unknown>\n\n    const toolCallResponseContent = cfValidateJsonSchema({\n      data,\n      schema: tool.outputSchema,\n      coerce: false,\n      strictAdditionalProperties:\n        toolConfig?.outputSchemaAdditionalProperties === false,\n      errorPrefix: `Invalid tool response for tool \"${tool.name}\"`,\n      errorStatusCode: 502\n    })\n\n    result.structuredContent = toolCallResponseContent\n  } else {\n    if (mimeType.includes('json')) {\n      result.structuredContent = await originResponse.json()\n    } else if (mimeType.includes('text')) {\n      result.content = [\n        {\n          type: 'text',\n          text: await originResponse.text()\n        }\n      ]\n    } else {\n      const resBody = await originResponse.arrayBuffer()\n      const resBodyBase64 = Buffer.from(resBody).toString('base64')\n      const type = mimeType.includes('image')\n        ? 'image'\n        : mimeType.includes('audio')\n          ? 'audio'\n          : 'resource'\n\n      // TODO: this needs work\n      result.content = [\n        {\n          type,\n          mimeType,\n          ...(type === 'resource'\n            ? {\n                blob: resBodyBase64\n              }\n            : {\n                data: resBodyBase64\n              })\n        }\n      ]\n    }\n  }\n\n  return result\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/types.ts",
    "content": "import type { AgenticApiClient } from '@agentic/platform-api-client'\nimport type { RateLimitResult } from '@agentic/platform-core'\nimport type {\n  DefaultHonoBindings,\n  DefaultHonoVariables\n} from '@agentic/platform-hono'\nimport type {\n  AdminConsumer as AdminConsumerImpl,\n  AdminDeployment,\n  PricingPlan,\n  RateLimit,\n  Tool,\n  ToolConfig,\n  User\n} from '@agentic/platform-types'\nimport type { ParsedToolIdentifier } from '@agentic/platform-validators'\nimport type { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js'\nimport type { Context } from 'hono'\nimport type { Simplify } from 'type-fest'\n\nimport type { Env } from './env'\n\nexport type { RateLimitResult } from '@agentic/platform-core'\n\nexport type McpToolCallResponse = Simplify<\n  Awaited<ReturnType<McpClient['callTool']>>\n>\n\nexport type AdminConsumer = Simplify<\n  AdminConsumerImpl & {\n    user: User\n  }\n>\n\nexport type GatewayHonoVariables = Simplify<\n  DefaultHonoVariables & {\n    client: AgenticApiClient\n    cache: Cache\n    sessionId?: string\n    reportUsage?: boolean\n  }\n>\n\nexport type GatewayHonoBindings = Simplify<DefaultHonoBindings & Env>\n\nexport type GatewayHonoEnv = {\n  Bindings: GatewayHonoBindings\n  Variables: GatewayHonoVariables\n}\n\nexport type GatewayHonoContext = Context<GatewayHonoEnv>\n\n// TODO: better type here\nexport type ToolCallArgs = Record<string, any>\n\nexport type RateLimitState = {\n  current: number\n  resetTimeMs: number\n}\n\nexport type RateLimitCache = Map<string, RateLimitState>\n\nexport type CacheStatus = 'HIT' | 'MISS' | 'BYPASS' | 'DYNAMIC'\nexport type EdgeRequestMode = 'MCP' | 'HTTP'\n\nexport type WaitUntil = (promise: Promise<any>) => void\n\nexport interface ResolvedEdgeRequest extends Record<string, unknown> {\n  edgeRequestMode: EdgeRequestMode\n  parsedToolIdentifier: ParsedToolIdentifier\n  deployment: AdminDeployment\n  requestId: string\n  ip?: string\n}\n\nexport interface ResolvedMcpEdgeRequest extends ResolvedEdgeRequest {\n  edgeRequestMode: 'MCP'\n  consumer?: AdminConsumer\n  pricingPlan?: PricingPlan\n}\n\nexport interface ResolvedHttpEdgeRequest extends ResolvedEdgeRequest {\n  edgeRequestMode: 'HTTP'\n  consumer?: AdminConsumer\n  pricingPlan?: PricingPlan\n  tool: Tool\n  toolCallArgs: ToolCallArgs\n  cacheControl?: string\n}\n\nexport type ResolvedOriginToolCallResult = {\n  toolCallArgs: ToolCallArgs\n  originRequest?: Request\n  originResponse?: Response\n  toolCallResponse?: McpToolCallResponse\n  rateLimit?: RateLimit\n  rateLimitResult?: RateLimitResult\n  cacheStatus: CacheStatus\n  reportUsage: boolean\n  toolConfig?: ToolConfig\n  originTimespanMs: number\n  numRequestsCost: number\n} & (\n  | {\n      originRequest: Request\n      originResponse: Response\n      toolCallResponse?: never\n    }\n  | {\n      originRequest?: never\n      originResponse?: never\n      toolCallResponse: McpToolCallResponse\n    }\n)\n"
  },
  {
    "path": "apps/gateway/src/lib/update-origin-request.ts",
    "content": "import type { AdminDeployment } from '@agentic/platform-types'\n\nimport type { AdminConsumer } from './types'\n\n// TODO: support custom auth providers\n// const authProviders = ['github', 'google', 'spotify', 'linkedin', 'twitter']\n\nexport function updateOriginRequest(\n  originRequest: Request,\n  {\n    deployment,\n    consumer,\n    cacheControl\n  }: {\n    deployment: AdminDeployment\n    consumer?: AdminConsumer\n    cacheControl?: string\n  }\n) {\n  // originRequest.headers.delete('authorization')\n\n  // for (const provider of authProviders) {\n  //   const headerAccessToken = `x-${provider}-access-token`\n  //   const headerRefreshToken = `x-${provider}-refresh-token`\n  //   const headerAccessTokenSecret = `x-${provider}-access-token-secret`\n  //   const headerId = `x-${provider}-id`\n  //   const headerUsername = `x-${provider}-username`\n\n  //   originRequest.headers.delete(headerAccessToken)\n  //   originRequest.headers.delete(headerRefreshToken)\n  //   originRequest.headers.delete(headerAccessTokenSecret)\n  //   originRequest.headers.delete(headerId)\n  //   originRequest.headers.delete(headerUsername)\n  // }\n\n  // Delete all Cloudflare headers since we want origin requests to be agnostic\n  // to Agentic's choice of hosting provider.\n  for (const headerKey of Object.keys(\n    Object.fromEntries(originRequest.headers.entries())\n  )) {\n    if (headerKey.startsWith('cf-')) {\n      originRequest.headers.delete(headerKey)\n    }\n  }\n\n  originRequest.headers.delete('x-agentic-consumer')\n  originRequest.headers.delete('x-agentic-user')\n  originRequest.headers.delete('x-agentic-plan')\n  originRequest.headers.delete('x-agentic-is-subscription-active')\n  originRequest.headers.delete('x-agentic-subscription-status')\n  originRequest.headers.delete('x-agentic-user-email')\n  originRequest.headers.delete('x-agentic-user-username')\n  originRequest.headers.delete('x-agentic-user-name')\n  originRequest.headers.delete('x-agentic-user-created-at')\n  originRequest.headers.delete('x-forwarded-for')\n\n  if (consumer) {\n    originRequest.headers.set('x-agentic-customer-id', consumer.id)\n\n    originRequest.headers.set(\n      'x-agentic-is-customer-subscription-active',\n      consumer.isStripeSubscriptionActive.toString()\n    )\n    originRequest.headers.set(\n      'x-agentic-customer-subscription-status',\n      consumer.stripeStatus\n    )\n\n    originRequest.headers.set('x-agentic-user-id', consumer.user.id)\n    originRequest.headers.set('x-agentic-user-email', consumer.user.email)\n    originRequest.headers.set('x-agentic-user-username', consumer.user.username)\n    originRequest.headers.set(\n      'x-agentic-user-created-at',\n      consumer.user.createdAt\n    )\n    originRequest.headers.set(\n      'x-agentic-user-updated-at',\n      consumer.user.updatedAt\n    )\n\n    if (consumer.plan) {\n      originRequest.headers.set(\n        'x-agentic-customer-subscription-plan',\n        consumer.plan\n      )\n    }\n\n    if (consumer.user.name) {\n      originRequest.headers.set('x-agentic-user-name', consumer.user.name)\n    }\n  } else {\n    originRequest.headers.set(\n      'x-agentic-is-customer-subscription-active',\n      'false'\n    )\n  }\n\n  // TODO: this header is causing some random upstream cloudflare errors\n  // https://support.cloudflare.com/hc/en-us/articles/360029779472-Troubleshooting-Cloudflare-1XXX-errors#error1000\n  // originRequest.headers.set('x-forwarded-for', ip)\n\n  if (cacheControl) {\n    originRequest.headers.set('cache-control', cacheControl)\n  }\n\n  originRequest.headers.set('x-agentic-deployment-id', deployment.id)\n  originRequest.headers.set(\n    'x-agentic-deployment-identifier',\n    deployment.identifier\n  )\n  originRequest.headers.set('x-agentic-proxy-secret', deployment._secret)\n}\n"
  },
  {
    "path": "apps/gateway/src/lib/utils.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport {\n  createAgenticMcpMetadata,\n  isCacheControlPubliclyCacheable,\n  isRequestPubliclyCacheable\n} from './utils'\n\ntest('isRequestPubliclyCacheable true', () => {\n  expect(isRequestPubliclyCacheable(new Request('https://example.com'))).toBe(\n    true\n  )\n  expect(\n    isRequestPubliclyCacheable(\n      new Request('https://example.com', {\n        headers: {\n          'cache-control': 'public, max-age=3600'\n        }\n      })\n    )\n  ).toBe(true)\n})\n\ntest('isRequestPubliclyCacheable false', () => {\n  expect(\n    isRequestPubliclyCacheable(\n      new Request('https://example.com', {\n        headers: {\n          pragma: 'no-cache'\n        }\n      })\n    )\n  ).toBe(false)\n  expect(\n    isRequestPubliclyCacheable(\n      new Request('https://example.com', {\n        headers: {\n          'cache-control': 'no-store'\n        }\n      })\n    )\n  ).toBe(false)\n})\n\ntest('isCacheControlPubliclyCacheable true', () => {\n  expect(isCacheControlPubliclyCacheable('public')).toBe(true)\n  expect(isCacheControlPubliclyCacheable('public, max-age=3600')).toBe(true)\n  expect(isCacheControlPubliclyCacheable('public, s-maxage=3600')).toBe(true)\n  expect(\n    isCacheControlPubliclyCacheable('public, max-age=3600, s-maxage=3600')\n  ).toBe(true)\n  expect(isCacheControlPubliclyCacheable('max-age=3600')).toBe(true)\n  expect(isCacheControlPubliclyCacheable('s-maxage=3600')).toBe(true)\n  expect(\n    isCacheControlPubliclyCacheable(\n      'public, max-age=86400, s-maxage=86400, stale-while-revalidate=3600'\n    )\n  ).toBe(true)\n  expect(isCacheControlPubliclyCacheable('stale-while-revalidate=180')).toBe(\n    true\n  )\n})\n\ntest('isCacheControlPubliclyCacheable false', () => {\n  expect(isCacheControlPubliclyCacheable('no-store')).toBe(false)\n  expect(isCacheControlPubliclyCacheable('no-cache')).toBe(false)\n  expect(isCacheControlPubliclyCacheable('private')).toBe(false)\n  expect(isCacheControlPubliclyCacheable('max-age=0')).toBe(false)\n  expect(isCacheControlPubliclyCacheable('private, max-age=3600')).toBe(false)\n  expect(isCacheControlPubliclyCacheable('private, s-maxage=3600')).toBe(false)\n  expect(\n    isCacheControlPubliclyCacheable('private, max-age=3600, s-maxage=3600')\n  ).toBe(false)\n  expect(\n    isCacheControlPubliclyCacheable('max-age=0, must-revalidate, no-cache')\n  ).toBe(false)\n  expect(\n    isCacheControlPubliclyCacheable('private, max-age=3600, must-revalidate')\n  ).toBe(false)\n})\n\ntest('createAgenticMcpMetadata', () => {\n  expect(\n    // Test the stringified version because we want to test the order of the\n    // keys.\n    JSON.stringify(\n      createAgenticMcpMetadata({\n        deploymentId: '123',\n        consumerId: '456',\n        toolName: 'test',\n        cacheStatus: 'HIT'\n      })\n    )\n  ).toMatchSnapshot()\n})\n"
  },
  {
    "path": "apps/gateway/src/lib/utils.ts",
    "content": "import { pruneEmpty } from '@agentic/platform-core'\nimport sortKeys from 'sort-keys'\n\nexport function isRequestPubliclyCacheable(request: Request): boolean {\n  const pragma = request.headers.get('pragma')\n  if (pragma === 'no-cache') {\n    return false\n  }\n\n  return isCacheControlPubliclyCacheable(request.headers.get('cache-control'))\n}\n\nexport function isResponsePubliclyCacheable(response: Response): boolean {\n  const pragma = response.headers.get('pragma')\n  if (pragma === 'no-cache') {\n    return false\n  }\n\n  return isCacheControlPubliclyCacheable(response.headers.get('cache-control'))\n}\n\nexport function isCacheControlPubliclyCacheable(\n  cacheControl?: string | null\n): boolean {\n  if (!cacheControl) {\n    // TODO: should we default to true or false?\n    return true\n  }\n\n  const directives = new Set(cacheControl.split(',').map((s) => s.trim()))\n  if (\n    directives.has('no-store') ||\n    directives.has('no-cache') ||\n    directives.has('private') ||\n    directives.has('max-age=0')\n  ) {\n    return false\n  }\n\n  return true\n}\n\nconst agenticMcpMetadataFieldOrder: string[] = [\n  'deploymentId',\n  'consumerId',\n  'toolName',\n  'status',\n  'cacheStatus',\n  'headers'\n]\n\nconst agenticMcpMetadataFieldsOrderMap = Object.fromEntries(\n  agenticMcpMetadataFieldOrder.map((f, i) => [f, i])\n)\n\nfunction agenticMcpMetadataFieldComparator(a: string, b: string): number {\n  const aIndex = agenticMcpMetadataFieldsOrderMap[a] ?? Infinity\n  const bIndex = agenticMcpMetadataFieldsOrderMap[b] ?? Infinity\n\n  return aIndex - bIndex\n}\n\n/**\n * Sanitizes agentic MCP metadata by sorting the keys and pruning empty values.\n */\nexport function createAgenticMcpMetadata(\n  metadata: {\n    deploymentId: string\n    consumerId?: string\n    toolName?: string\n    status?: number\n    cacheStatus?: string\n    headers?: Record<string, any>\n  },\n  existingMetadata?: Record<string, any>\n): Record<string, any> {\n  const rawAgenticMcpMetadata = pruneEmpty({\n    status: 200,\n    ...existingMetadata?.agentic,\n    ...metadata,\n    headers: {\n      ...existingMetadata?.agentic?.headers,\n      ...metadata.headers\n    }\n  })\n\n  const agentic = sortKeys(rawAgenticMcpMetadata, {\n    compare: agenticMcpMetadataFieldComparator\n  })\n\n  return {\n    ...existingMetadata,\n    agentic\n  }\n}\n"
  },
  {
    "path": "apps/gateway/src/worker.ts",
    "content": "import * as Sentry from '@sentry/cloudflare'\n\nimport { app } from './app'\nimport { type Env, parseEnv, type RawEnv } from './lib/env'\n\n// Export Durable Objects for cloudflare\nexport { DurableMcpClient } from './lib/durable-mcp-client'\nexport { DurableMcpServer } from './lib/durable-mcp-server'\nexport { DurableRateLimiter } from './lib/rate-limits/durable-rate-limiter'\n\n// Main worker entrypoint\nexport default Sentry.withSentry(\n  (env: RawEnv) => ({\n    dsn: env.SENTRY_DSN,\n    environment: env.ENVIRONMENT,\n    integrations: [Sentry.extraErrorDataIntegration()],\n    tracesSampleRate: 1.0,\n    sendDefaultPii: true\n  }),\n  {\n    async fetch(\n      request: Request,\n      env: Env,\n      ctx: ExecutionContext\n    ): Promise<Response> {\n      let parsedEnv: Env\n\n      // Validate the environment\n      try {\n        parsedEnv = parseEnv(env)\n      } catch (err: any) {\n        // eslint-disable-next-line no-console\n        console.error('api gateway error invalid env:', err.message)\n\n        return new Response(\n          JSON.stringify({ error: 'Invalid api gateway environment' }),\n          {\n            status: 500,\n            headers: {\n              'content-type': 'application/json'\n            }\n          }\n        )\n      }\n\n      // Handle the request with `hono`\n      return app.fetch(request, parsedEnv, ctx)\n    }\n  } satisfies ExportedHandler<Env>\n)\n"
  },
  {
    "path": "apps/gateway/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"compilerOptions\": {\n    \"types\": [\"@cloudflare/workers-types\"]\n  },\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "apps/gateway/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n  test: {\n    environment: 'edge-runtime',\n    globals: true,\n    watch: false,\n    restoreMocks: true\n  }\n})\n"
  },
  {
    "path": "apps/gateway/wrangler.jsonc",
    "content": "/**\n * https://developers.cloudflare.com/workers/wrangler/configuration/\n */\n{\n  \"$schema\": \"node_modules/wrangler/config-schema.json\",\n  \"name\": \"agentic-gateway\",\n  \"main\": \"src/worker.ts\",\n  \"compatibility_date\": \"2025-05-25\",\n  \"compatibility_flags\": [\"nodejs_compat\"],\n  \"placement\": { \"mode\": \"smart\" },\n  \"upload_source_maps\": true,\n  \"observability\": {\n    \"enabled\": true,\n    \"head_sampling_rate\": 1\n  },\n  \"migrations\": [\n    {\n      \"tag\": \"v1\",\n      \"new_sqlite_classes\": [\n        \"DurableRateLimiter\",\n        \"DurableMcpServer\",\n        \"DurableMcpClient\"\n      ]\n    }\n  ],\n  \"vars\": {\n    \"ENVIRONMENT\": \"development\",\n    \"AGENTIC_API_BASE_URL\": \"http://localhost:3001\"\n  },\n  \"durable_objects\": {\n    \"bindings\": [\n      {\n        \"class_name\": \"DurableRateLimiter\",\n        \"name\": \"DO_RATE_LIMITER\"\n      },\n      {\n        \"class_name\": \"DurableMcpServer\",\n        \"name\": \"DO_MCP_SERVER\"\n      },\n      {\n        \"class_name\": \"DurableMcpClient\",\n        \"name\": \"DO_MCP_CLIENT\"\n      }\n    ]\n  },\n  \"analytics_engine_datasets\": [\n    {\n      \"binding\": \"AE_USAGE_DATASET\",\n      \"dataset\": \"agentic_gateway_usage\"\n    }\n  ],\n  \"env\": {\n    \"production\": {\n      \"routes\": [\n        {\n          \"pattern\": \"gateway.agentic.so\",\n          \"custom_domain\": true\n        }\n      ],\n      \"vars\": {\n        \"ENVIRONMENT\": \"production\",\n        \"AGENTIC_API_BASE_URL\": \"https://api.agentic.so\"\n      },\n      // TODO: double-check whether all of this needs to be duplicated for each environment\n      \"durable_objects\": {\n        \"bindings\": [\n          {\n            \"class_name\": \"DurableRateLimiter\",\n            \"name\": \"DO_RATE_LIMITER\"\n          },\n          {\n            \"class_name\": \"DurableMcpServer\",\n            \"name\": \"DO_MCP_SERVER\"\n          },\n          {\n            \"class_name\": \"DurableMcpClient\",\n            \"name\": \"DO_MCP_CLIENT\"\n          }\n        ]\n      },\n      \"analytics_engine_datasets\": [\n        {\n          \"binding\": \"AE_USAGE_DATASET\",\n          \"dataset\": \"agentic_gateway_usage\"\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "apps/web/components.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema.json\",\n  \"style\": \"new-york\",\n  \"rsc\": true,\n  \"tsx\": true,\n  \"tailwind\": {\n    \"config\": \"tailwind.config.ts\",\n    \"css\": \"src/app/globals.css\",\n    \"baseColor\": \"neutral\",\n    \"cssVariables\": true,\n    \"prefix\": \"\"\n  },\n  \"aliases\": {\n    \"components\": \"@/components\",\n    \"utils\": \"@/lib/utils\",\n    \"ui\": \"@/components/ui\",\n    \"lib\": \"@/lib\",\n    \"hooks\": \"@/hooks\"\n  },\n  \"iconLibrary\": \"lucide\"\n}\n"
  },
  {
    "path": "apps/web/next.config.ts",
    "content": "import type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n  // TODO: handle remote profile pictures or upload them properly on backend\n}\n\nexport default nextConfig\n"
  },
  {
    "path": "apps/web/package.json",
    "content": "{\n  \"name\": \"web\",\n  \"private\": true,\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic platform webapp.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"apps/web\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"clean\": \"del .next\",\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"next lint\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"@agentic/platform-api-client\": \"workspace:*\",\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@agentic/platform-validators\": \"workspace:*\",\n    \"@date-fns/utc\": \"catalog:\",\n    \"@fisch0920/markdown-to-html\": \"catalog:\",\n    \"@number-flow/react\": \"catalog:\",\n    \"@pmndrs/assets\": \"catalog:\",\n    \"@radix-ui/react-avatar\": \"^1.1.10\",\n    \"@radix-ui/react-collapsible\": \"catalog:\",\n    \"@radix-ui/react-dropdown-menu\": \"catalog:\",\n    \"@radix-ui/react-label\": \"catalog:\",\n    \"@radix-ui/react-slot\": \"catalog:\",\n    \"@radix-ui/react-tabs\": \"catalog:\",\n    \"@radix-ui/react-tooltip\": \"catalog:\",\n    \"@react-three/cannon\": \"catalog:\",\n    \"@react-three/drei\": \"catalog:\",\n    \"@react-three/fiber\": \"catalog:\",\n    \"@react-three/postprocessing\": \"catalog:\",\n    \"@react-three/rapier\": \"catalog:\",\n    \"@tanstack/react-form\": \"catalog:\",\n    \"@tanstack/react-query\": \"catalog:\",\n    \"@tanstack/react-query-devtools\": \"catalog:\",\n    \"@types/canvas-confetti\": \"catalog:\",\n    \"canvas-confetti\": \"catalog:\",\n    \"class-variance-authority\": \"catalog:\",\n    \"clsx\": \"catalog:\",\n    \"date-fns\": \"catalog:\",\n    \"hast-util-to-jsx-runtime\": \"catalog:\",\n    \"human-number\": \"^2.0.4\",\n    \"ky\": \"catalog:\",\n    \"lucide-react\": \"catalog:\",\n    \"motion\": \"catalog:\",\n    \"next\": \"catalog:\",\n    \"next-themes\": \"catalog:\",\n    \"plur\": \"catalog:\",\n    \"posthog-js\": \"catalog:\",\n    \"pretty-ms\": \"^9.2.0\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"react-infinite-scroll-hook\": \"catalog:\",\n    \"react-lottie-player\": \"catalog:\",\n    \"react-medium-image-zoom\": \"catalog:\",\n    \"react-use\": \"catalog:\",\n    \"server-only\": \"catalog:\",\n    \"shiki\": \"catalog:\",\n    \"sonner\": \"catalog:\",\n    \"stripe\": \"catalog:\",\n    \"suspend-react\": \"catalog:\",\n    \"tailwind-merge\": \"catalog:\",\n    \"three\": \"catalog:\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@tailwindcss/postcss\": \"catalog:\",\n    \"@tailwindcss/typography\": \"catalog:\",\n    \"@types/human-number\": \"^1.0.2\",\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\",\n    \"@types/three\": \"catalog:\",\n    \"autoprefixer\": \"catalog:\",\n    \"postcss\": \"catalog:\",\n    \"tailwindcss\": \"catalog:\",\n    \"tw-animate-css\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "apps/web/postcss.config.mjs",
    "content": "export default {\n  plugins: {\n    '@tailwindcss/postcss': {}\n  }\n}\n"
  },
  {
    "path": "apps/web/public/schema.json",
    "content": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": {\n      \"type\": \"string\",\n      \"maxLength\": 1024,\n      \"minLength\": 1,\n      \"description\": \"Display name for the project. Max length 1024 characters.\"\n    },\n    \"slug\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"description\": \"Unique project slug. Must be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters. If not provided, it will be derived by slugifying `name`.\"\n    },\n    \"version\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"description\": \"Optional semantic version of the project as a semver string. Ex: 1.0.0, 0.0.1, 5.0.1, etc.\"\n    },\n    \"description\": {\n      \"type\": \"string\",\n      \"description\": \"A short description of the project.\"\n    },\n    \"readme\": {\n      \"type\": \"string\",\n      \"description\": \"Optional markdown readme documenting the project (supports GitHub-flavored markdown).\"\n    },\n    \"icon\": {\n      \"type\": \"string\",\n      \"description\": \"Optional logo image to use for the project. Logos should have a square aspect ratio.\"\n    },\n    \"sourceUrl\": {\n      \"type\": \"string\",\n      \"format\": \"uri\",\n      \"description\": \"Optional URL to the source code of the project (eg, GitHub repo).\"\n    },\n    \"homepageUrl\": {\n      \"type\": \"string\",\n      \"format\": \"uri\",\n      \"description\": \"Optional URL to the product's homepage.\"\n    },\n    \"origin\": {\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"location\": {\n              \"type\": \"string\",\n              \"const\": \"external\",\n              \"default\": \"external\"\n            },\n            \"url\": {\n              \"type\": \"string\",\n              \"format\": \"uri\",\n              \"description\": \"Required base URL of the externally hosted origin API server. Must be a valid `https` URL.\\n\\nNOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"const\": \"openapi\"\n            },\n            \"spec\": {\n              \"type\": \"string\",\n              \"description\": \"Local file path, URL, or JSON stringified OpenAPI spec describing the origin API server.\"\n            }\n          },\n          \"required\": [\n            \"url\",\n            \"type\",\n            \"spec\"\n          ],\n          \"additionalProperties\": false\n        },\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"location\": {\n              \"$ref\": \"#/properties/origin/anyOf/0/properties/location\"\n            },\n            \"url\": {\n              \"$ref\": \"#/properties/origin/anyOf/0/properties/url\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"const\": \"mcp\"\n            },\n            \"headers\": {\n              \"type\": \"object\",\n              \"additionalProperties\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"required\": [\n            \"url\",\n            \"type\"\n          ],\n          \"additionalProperties\": false\n        },\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"location\": {\n              \"$ref\": \"#/properties/origin/anyOf/0/properties/location\"\n            },\n            \"url\": {\n              \"$ref\": \"#/properties/origin/anyOf/0/properties/url\"\n            },\n            \"type\": {\n              \"type\": \"string\",\n              \"const\": \"raw\"\n            }\n          },\n          \"required\": [\n            \"url\",\n            \"type\"\n          ],\n          \"additionalProperties\": false\n        }\n      ],\n      \"description\": \"Origin adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by `url` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools are defined: either an OpenAPI spec or an MCP server.\\n\\nNOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\"\n    },\n    \"pricingPlans\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"description\": \"Display name for the pricing plan (eg, \\\"Free\\\", \\\"Starter Monthly\\\", \\\"Pro Annual\\\", etc)\"\n          },\n          \"slug\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"description\": \"PricingPlan slug (eg, \\\"free\\\", \\\"starter-monthly\\\", \\\"pro-annual\\\", etc). Should be lower-cased and kebab-cased. Should be stable across deployments.\"\n          },\n          \"interval\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"day\",\n              \"week\",\n              \"month\",\n              \"year\"\n            ],\n            \"description\": \"The frequency at which a subscription is billed.\"\n          },\n          \"description\": {\n            \"type\": \"string\"\n          },\n          \"features\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"trialPeriodDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0\n          },\n          \"rateLimit\": {\n            \"anyOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\",\n                    \"const\": false\n                  }\n                },\n                \"required\": [\n                  \"enabled\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"interval\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"number\",\n                        \"exclusiveMinimum\": 0\n                      },\n                      {\n                        \"type\": \"string\",\n                        \"minLength\": 1\n                      }\n                    ],\n                    \"description\": \"The interval at which the rate limit is applied. Either a positive integer expressed in seconds or a valid positive [ms](https://github.com/vercel/ms) string (eg, \\\"10s\\\", \\\"1m\\\", \\\"8h\\\", \\\"2d\\\", \\\"1w\\\", \\\"1y\\\", etc).\"\n                  },\n                  \"limit\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"description\": \"Maximum number of operations per interval (unitless).\"\n                  },\n                  \"mode\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"strict\",\n                      \"approximate\"\n                    ],\n                    \"default\": \"approximate\",\n                    \"description\": \"How to enforce the rate limit: \\\"strict\\\" (more precise but slower) or \\\"approximate\\\" (the default; faster and asynchronous but less precise).\"\n                  },\n                  \"enabled\": {\n                    \"type\": \"boolean\",\n                    \"default\": true\n                  }\n                },\n                \"required\": [\n                  \"interval\",\n                  \"limit\"\n                ],\n                \"additionalProperties\": false\n              }\n            ]\n          },\n          \"lineItems\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"slug\": {\n                      \"type\": \"string\"\n                    },\n                    \"label\": {\n                      \"type\": \"string\"\n                    },\n                    \"usageType\": {\n                      \"type\": \"string\",\n                      \"const\": \"licensed\"\n                    },\n                    \"amount\": {\n                      \"type\": \"number\",\n                      \"minimum\": 0\n                    }\n                  },\n                  \"required\": [\n                    \"slug\",\n                    \"usageType\",\n                    \"amount\"\n                  ],\n                  \"additionalProperties\": false\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"slug\": {\n                      \"$ref\": \"#/properties/pricingPlans/items/properties/lineItems/items/anyOf/0/properties/slug\"\n                    },\n                    \"label\": {\n                      \"$ref\": \"#/properties/pricingPlans/items/properties/lineItems/items/anyOf/0/properties/label\"\n                    },\n                    \"usageType\": {\n                      \"type\": \"string\",\n                      \"const\": \"metered\"\n                    },\n                    \"unitLabel\": {\n                      \"type\": \"string\"\n                    },\n                    \"billingScheme\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"per_unit\",\n                        \"tiered\"\n                      ]\n                    },\n                    \"unitAmount\": {\n                      \"type\": \"number\",\n                      \"minimum\": 0\n                    },\n                    \"tiersMode\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"graduated\",\n                        \"volume\"\n                      ]\n                    },\n                    \"tiers\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"unitAmount\": {\n                            \"type\": \"number\"\n                          },\n                          \"flatAmount\": {\n                            \"type\": \"number\"\n                          },\n                          \"upTo\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"number\"\n                              },\n                              {\n                                \"type\": \"string\",\n                                \"const\": \"inf\"\n                              }\n                            ]\n                          }\n                        },\n                        \"required\": [\n                          \"upTo\"\n                        ],\n                        \"additionalProperties\": false\n                      },\n                      \"minItems\": 1\n                    },\n                    \"defaultAggregation\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"formula\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"sum\",\n                            \"count\"\n                          ],\n                          \"default\": \"sum\"\n                        }\n                      },\n                      \"additionalProperties\": false\n                    },\n                    \"transformQuantity\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"divideBy\": {\n                          \"type\": \"number\",\n                          \"exclusiveMinimum\": 0\n                        },\n                        \"round\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"down\",\n                            \"up\"\n                          ]\n                        }\n                      },\n                      \"required\": [\n                        \"divideBy\",\n                        \"round\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"required\": [\n                    \"slug\",\n                    \"usageType\",\n                    \"billingScheme\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              ],\n              \"description\": \"PricingPlanLineItems represent a single line-item in a Stripe Subscription. They map to a Stripe billing `Price` and possibly a corresponding Stripe `Meter` for usage-based line-items.\"\n            },\n            \"minItems\": 1,\n            \"maxItems\": 20\n          }\n        },\n        \"required\": [\n          \"name\",\n          \"slug\",\n          \"lineItems\"\n        ],\n        \"additionalProperties\": false,\n        \"description\": \"Represents the config for a Stripe subscription with one or more PricingPlanLineItems.\"\n      },\n      \"minItems\": 1,\n      \"description\": \"List of PricingPlans configuring which Stripe subscriptions should be available for the project. Defaults to a single free plan which is useful for developing and testing your project.\",\n      \"default\": [\n        {\n          \"name\": \"Free\",\n          \"slug\": \"free\",\n          \"lineItems\": [\n            {\n              \"slug\": \"base\",\n              \"usageType\": \"licensed\",\n              \"amount\": 0\n            }\n          ],\n          \"rateLimit\": {\n            \"enabled\": true,\n            \"interval\": 60,\n            \"limit\": 1000,\n            \"mode\": \"approximate\"\n          }\n        }\n      ]\n    },\n    \"pricingIntervals\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"$ref\": \"#/properties/pricingPlans/items/properties/interval\"\n      },\n      \"minItems\": 1,\n      \"description\": \"Optional list of billing intervals to enable in the pricingPlans.\\n\\nDefaults to a single monthly interval `['month']`.\\n\\nTo add support for annual pricing plans, for example, you can use: `['month', 'year']`.\",\n      \"default\": [\n        \"month\"\n      ]\n    },\n    \"defaultRateLimit\": {\n      \"$ref\": \"#/properties/pricingPlans/items/properties/rateLimit\",\n      \"default\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\"\n      }\n    },\n    \"toolConfigs\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"pattern\": \"^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$\",\n            \"description\": \"Agentic tool name\"\n          },\n          \"enabled\": {\n            \"type\": \"boolean\"\n          },\n          \"pure\": {\n            \"type\": \"boolean\"\n          },\n          \"cacheControl\": {\n            \"type\": \"string\"\n          },\n          \"reportUsage\": {\n            \"type\": \"boolean\"\n          },\n          \"rateLimit\": {\n            \"$ref\": \"#/properties/pricingPlans/items/properties/rateLimit\"\n          },\n          \"inputSchemaAdditionalProperties\": {\n            \"type\": \"boolean\"\n          },\n          \"outputSchemaAdditionalProperties\": {\n            \"type\": \"boolean\"\n          },\n          \"pricingPlanOverridesMap\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"enabled\": {\n                  \"type\": \"boolean\"\n                },\n                \"reportUsage\": {\n                  \"type\": \"boolean\"\n                },\n                \"rateLimit\": {\n                  \"$ref\": \"#/properties/pricingPlans/items/properties/rateLimit\"\n                }\n              },\n              \"additionalProperties\": false\n            },\n            \"propertyNames\": {\n              \"minLength\": 1\n            },\n            \"description\": \"Allows you to override this tool's behavior or disable it entirely for different pricing plans. This is a map of PricingPlan slug to PricingPlanToolOverrides for that plan.\"\n          },\n          \"examples\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"name\": {\n                  \"type\": \"string\",\n                  \"description\": \"The display name of the example. If not given, defaults to `Example 1`, `Example 2`, etc.\"\n                },\n                \"prompt\": {\n                  \"type\": \"string\",\n                  \"description\": \"The input prompt for agents to use when running this example.\"\n                },\n                \"systemPrompt\": {\n                  \"type\": \"string\",\n                  \"description\": \"An optional system prompt for agents to use when running this example. Defaults to `You are a helpful assistant. Be as concise as possible.`\"\n                },\n                \"args\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": {},\n                  \"description\": \"The arguments to pass to the tool for this example.\"\n                },\n                \"featured\": {\n                  \"type\": \"boolean\",\n                  \"description\": \"Whether this example should be featured in the docs for the project.\"\n                },\n                \"description\": {\n                  \"type\": \"string\",\n                  \"description\": \"A description of the example.\"\n                }\n              },\n              \"required\": [\n                \"prompt\",\n                \"args\"\n              ],\n              \"additionalProperties\": false\n            },\n            \"description\": \"Examples of how to use this tool. Used to generate example usage in the tool's docs.\"\n          }\n        },\n        \"required\": [\n          \"name\"\n        ],\n        \"additionalProperties\": false\n      },\n      \"default\": []\n    }\n  },\n  \"required\": [\n    \"name\",\n    \"origin\"\n  ],\n  \"additionalProperties\": false,\n  \"$schema\": \"https://json-schema.org/draft-07/schema\",\n  \"title\": \"Agentic Project Config Schema\",\n  \"description\": \"JSON Schema used by `agentic.config.{ts,js,json}` files to configure Agentic projects.\"\n}\n"
  },
  {
    "path": "apps/web/readme.md",
    "content": "## TODO\n\n- better auth error handling\n- display validation errors in auth forms\n- race condition on login; sometimes doesn't actually login\n"
  },
  {
    "path": "apps/web/src/app/about/page.tsx",
    "content": "import Link from 'next/link'\n\nimport { DotsSection } from '@/components/dots-section'\nimport { Markdown } from '@/components/markdown'\nimport { PageContainer } from '@/components/page-container'\nimport { SupplySideCTA } from '@/components/supply-side-cta'\nimport { githubUrl, twitterUrl } from '@/lib/config'\n\nexport default function AboutPage() {\n  return (\n    <PageContainer>\n      <h1 className='text-center text-balance leading-snug md:leading-none text-4xl font-semibold'>\n        About\n      </h1>\n\n      <section>\n        <Markdown>\n          <h2>Setting the stage</h2>\n\n          <p>Building reliable agents is hard.</p>\n\n          <p>But building them without the right tools is even harder.</p>\n\n          <p>\n            MCP is really promising, but it's still early and the ecosystem's a\n            bit of a mess.\n          </p>\n\n          <p>\n            Add to that the fact that most MCPs are just thin wrappers around\n            REST APIs – which works, but is far from ideal in terms of context\n            efficiency and instruction following.\n          </p>\n\n          <p>\n            The best agents require their tools to be optimized for LLM usage\n            with a fundamentally different UX than REST APIs.\n          </p>\n\n          <p>\n            There's a lot that will change in AI over the next decade, but one\n            thing I believe strongly is that no matter how much the underlying\n            AI systems change,{' '}\n            <span className='font-semibold'>\n              providing access to high quality tools that are specifically\n              designed and optimized for agents will become increasingly\n              important\n            </span>\n            .\n          </p>\n\n          <p>\n            We call this <span className='font-semibold'>Agentic UX</span>, and\n            it's at the heart of Agentic's mission.\n          </p>\n\n          <h2>Mission</h2>\n          <p className='font-semibold italic'>\n            Agentic's mission is to provide the world's best library of tools\n            for AI agents.\n          </p>\n\n          {/* <h2>What is Agentic UX?</h2>\n        <p>\n          Agentic User Experience measures how optimized a resource is for\n          consumption by LLM-based apps and more autonomous AI agents.\n        </p>\n\n        <p>\n          `llms.txt` is a great example of a readonly format optimized for\n          Agentic UX.\n        </p>\n\n        <p>\n          Anthropic's Model Context Protocol (MCP) and Google's Agent to Agent\n          Protocol (A2A) are both examples of protocols purpose-built for\n          Agentic UX. There are dozens of other aspirational protocols with\n          similar aims. [xkcd standards]\n        </p> */}\n\n          <h2>Team</h2>\n          <p>\n            Agentic was founded in 2023 by{' '}\n            <Link\n              href={twitterUrl}\n              target='_blank'\n              rel='noopener'\n              className='link'\n            >\n              Travis Fischer\n            </Link>{' '}\n            (hey hey 👋) . We're backed by{' '}\n            <Link\n              href='https://hf0.com'\n              target='_blank'\n              rel='noopener'\n              className='link'\n            >\n              HF0\n            </Link>\n            ,{' '}\n            <Link\n              href='https://hf0.com'\n              target='_blank'\n              rel='noopener'\n              className='link'\n            >\n              Backend Capital\n            </Link>\n            , and\n            <Link\n              href='https://hf0.com'\n              target='_blank'\n              rel='noopener'\n              className='link'\n            >\n              Transpose Capital\n            </Link>\n            .\n          </p>\n\n          <p>\n            I'm currently running Agentic as a solo founder while traveling\n            around the world, but i'm actively looking to hire a few remote\n            engineers and would consider bringing on a co-founder if they're a\n            really strong fit.\n          </p>\n\n          <p>\n            If you're an expert TypeScript dev who vibes with our mission and\n            loves open source – and if you have an interest in AI engineering,\n            AI agents, API gateways, OpenAPI, MCP, AI codegen, etc, feel free to{' '}\n            <Link\n              href={twitterUrl}\n              target='_blank'\n              rel='noopener'\n              className='link'\n            >\n              DM me on twitter\n            </Link>\n            , and please include a few links to your GitHub + related projects.\n          </p>\n\n          <p className='text-sm italic'>\n            (this page was written with love and an intentional lack of LLM\n            assistance on a very long and sleepy international flight 💕)\n          </p>\n\n          <h2>Tech stack</h2>\n          <ul>\n            <li>TypeScript</li>\n            <li>Node.js</li>\n            <li>Postgres</li>\n            <li>Drizzle ORM</li>\n            <li>Hono</li>\n            <li>Next.js</li>\n            <li>Stripe</li>\n            <li>Cloudflare Workers</li>\n            <li>Vercel</li>\n            <li>Sentry</li>\n            <li>Resend</li>\n            <li>Cursor</li>\n          </ul>\n\n          <p>\n            <Link\n              href={githubUrl}\n              target='_blank'\n              rel='noopener'\n              className='link'\n            >\n              Check out the source on GitHub for more details\n            </Link>\n            .\n          </p>\n        </Markdown>\n      </section>\n\n      {/* CTA section */}\n      <DotsSection className='flex flex-col gap-12'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Don't miss out on the AI wave\n        </h2>\n\n        <SupplySideCTA variant='github-2' />\n      </DotsSection>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/app/app-dashboard.tsx",
    "content": "import { AppConsumersList } from '@/components/app-consumers-list'\nimport { AppProjectsList } from '@/components/app-projects-list'\nimport { PageContainer } from '@/components/page-container'\n\nexport function AppDashboard() {\n  return (\n    <PageContainer>\n      <section>\n        <h1\n          className='text-center text-balance leading-snug md:leading-none\n        text-4xl font-extrabold mb-8'\n        >\n          Dashboard\n        </h1>\n\n        <div className='flex flex-col lg:flex-row gap-8 space-around'>\n          <AppConsumersList />\n\n          <AppProjectsList />\n        </div>\n      </section>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/app/consumers/[consumerId]/app-consumer-index.tsx",
    "content": "'use client'\n\nimport { Loader2Icon } from 'lucide-react'\nimport { useSearchParams } from 'next/navigation'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport { useAuthenticatedAgentic } from '@/components/agentic-provider'\nimport { useConfettiFireworks } from '@/components/confetti'\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { PageContainer } from '@/components/page-container'\nimport { Button } from '@/components/ui/button'\nimport { toastError } from '@/lib/notifications'\nimport { useQuery } from '@/lib/query-client'\n\nexport function AppConsumerIndex({ consumerId }: { consumerId: string }) {\n  const ctx = useAuthenticatedAgentic()\n  const searchParams = useSearchParams()\n  const checkout = searchParams.get('checkout')\n  const plan = searchParams.get('plan')\n  const { fireConfetti } = useConfettiFireworks()\n  const [isLoadingStripeBillingPortal, setIsLoadingStripeBillingPortal] =\n    useState(false)\n\n  const {\n    data: consumer,\n    isLoading,\n    isError\n  } = useQuery({\n    queryKey: ['consumer', consumerId],\n    queryFn: () =>\n      ctx!.api.getConsumer({\n        consumerId,\n        populate: ['project']\n      }),\n    enabled: !!ctx\n  })\n\n  const firstLoadConsumer = useRef(true)\n\n  useEffect(() => {\n    if (!ctx || !consumer || !firstLoadConsumer.current) return\n\n    if (checkout === 'canceled') {\n      firstLoadConsumer.current = false\n      toast('Subscription canceled')\n    } else if (checkout === 'success') {\n      if (plan) {\n        firstLoadConsumer.current = false\n        toast(\n          `Congrats! You are now subscribed to the \"${plan}\" plan for project \"${consumer.project.name}\"`,\n          {\n            duration: 10_000\n          }\n        )\n\n        // Return the confetti cleanup handler, so if this component is\n        // unmounted, the confetti will stop as well.\n        return fireConfetti()\n      } else {\n        firstLoadConsumer.current = false\n        toast(\n          `Your subscription has been cancelled for project \"${consumer.project.name}\"`,\n          {\n            duration: 10_000\n          }\n        )\n      }\n    }\n  }, [checkout, ctx, plan, consumer, fireConfetti])\n\n  const onManageSubscription = useCallback(async () => {\n    if (!ctx || !consumer) {\n      void toastError('Failed to create billing portal session')\n      return\n    }\n\n    let url: string | undefined\n    try {\n      setIsLoadingStripeBillingPortal(true)\n      const res = await ctx!.api.createConsumerBillingPortalSession({\n        consumerId: consumer.id\n      })\n      url = res.url\n    } catch (err) {\n      void toastError(err, { label: 'Error creating billing portal session' })\n    } finally {\n      setIsLoadingStripeBillingPortal(false)\n    }\n\n    if (url) {\n      globalThis.open(url, '_blank')\n    }\n  }, [ctx, consumer])\n\n  return (\n    <PageContainer>\n      <section className='flex flex-col gap-16'>\n        {!ctx || isLoading ? (\n          <LoadingIndicator />\n        ) : isError ? (\n          <p>Error fetching customer subscription \"{consumerId}\"</p>\n        ) : !consumer ? (\n          <p>Customer subscription \"{consumerId}\" not found</p>\n        ) : (\n          <>\n            <h1\n              className='text-center text-balance leading-snug md:leading-none\n        text-4xl font-extrabold'\n            >\n              Subscription to {consumer.project.name}\n            </h1>\n\n            <div className=''>\n              <pre className='max-w-lg'>\n                {JSON.stringify(consumer, null, 2)}\n              </pre>\n            </div>\n\n            <Button\n              onClick={onManageSubscription}\n              disabled={isLoadingStripeBillingPortal}\n            >\n              {isLoadingStripeBillingPortal && (\n                <Loader2Icon className='animate-spin mr-2' />\n              )}\n\n              <span>Manage Subscription</span>\n            </Button>\n          </>\n        )}\n      </section>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/app/consumers/[consumerId]/page.tsx",
    "content": "import { AppConsumerIndex } from './app-consumer-index'\n\nexport default async function AppConsumerIndexPage({\n  params\n}: {\n  params: Promise<{\n    consumerId: string\n  }>\n}) {\n  const { consumerId } = await params\n\n  return <AppConsumerIndex consumerId={consumerId} />\n}\n"
  },
  {
    "path": "apps/web/src/app/app/consumers/app-consumers-index.tsx",
    "content": "'use client'\n\nimport { Loader2Icon } from 'lucide-react'\nimport { useCallback, useState } from 'react'\n\nimport { useAuthenticatedAgentic } from '@/components/agentic-provider'\nimport { AppConsumersList } from '@/components/app-consumers-list'\nimport { PageContainer } from '@/components/page-container'\nimport { Button } from '@/components/ui/button'\nimport { toastError } from '@/lib/notifications'\n\nexport function AppConsumersIndex() {\n  const ctx = useAuthenticatedAgentic()\n  const [isLoadingStripeBillingPortal, setIsLoadingStripeBillingPortal] =\n    useState(false)\n\n  const onManageSubscriptions = useCallback(async () => {\n    let url: string | undefined\n    try {\n      setIsLoadingStripeBillingPortal(true)\n      const res = await ctx!.api.createBillingPortalSession()\n      url = res.url\n    } catch (err) {\n      void toastError(err, { label: 'Error creating billing portal session' })\n    } finally {\n      setIsLoadingStripeBillingPortal(false)\n    }\n\n    if (url) {\n      globalThis.open(url, '_blank')\n    }\n  }, [ctx])\n\n  return (\n    <PageContainer>\n      <h1\n        className='text-center text-balance leading-snug md:leading-none\n        text-4xl font-extrabold'\n      >\n        Subscriptions\n      </h1>\n\n      <Button onClick={onManageSubscriptions}>\n        {isLoadingStripeBillingPortal && (\n          <Loader2Icon className='animate-spin mr-2' />\n        )}\n\n        <span>Manage your subscriptions</span>\n      </Button>\n\n      <AppConsumersList />\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/app/consumers/page.tsx",
    "content": "import { AppConsumersIndex } from './app-consumers-index'\n\nexport default function AppConsumersIndexPage() {\n  return <AppConsumersIndex />\n}\n"
  },
  {
    "path": "apps/web/src/app/app/page.tsx",
    "content": "import { AppDashboard } from './app-dashboard'\n\nexport default function AppIndexPage() {\n  return <AppDashboard />\n}\n"
  },
  {
    "path": "apps/web/src/app/app/projects/[namespace]/[project-slug]/app-project-index.tsx",
    "content": "'use client'\n\nimport { useAuthenticatedAgentic } from '@/components/agentic-provider'\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { PageContainer } from '@/components/page-container'\nimport { useQuery } from '@/lib/query-client'\n\nexport function AppProjectIndex({\n  projectIdentifier\n}: {\n  projectIdentifier: string\n}) {\n  const ctx = useAuthenticatedAgentic()\n  const {\n    data: project,\n    isLoading,\n    isError\n  } = useQuery({\n    queryKey: ['project', projectIdentifier],\n    queryFn: () =>\n      ctx!.api.getProjectByIdentifier({\n        projectIdentifier,\n        populate: ['lastPublishedDeployment']\n      }),\n    enabled: !!ctx\n  })\n\n  // TODO: show deployments\n\n  return (\n    <PageContainer>\n      <section>\n        {!ctx || isLoading ? (\n          <LoadingIndicator />\n        ) : isError ? (\n          <p>Error fetching project</p>\n        ) : !project ? (\n          <p>Project \"{projectIdentifier}\" not found</p>\n        ) : (\n          <>\n            <h1\n              className='text-center text-balance leading-snug md:leading-none\n        text-4xl font-extrabold'\n            >\n              {project.name}\n            </h1>\n\n            <div className='mt-8'>\n              <pre className='max-w-lg'>{JSON.stringify(project, null, 2)}</pre>\n            </div>\n          </>\n        )}\n      </section>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/app/projects/[namespace]/[project-slug]/page.tsx",
    "content": "import { parseProjectIdentifier } from '@agentic/platform-validators'\nimport { notFound } from 'next/navigation'\n\nimport { toastError } from '@/lib/notifications'\n\nimport { AppProjectIndex } from './app-project-index'\n\nexport default async function AppProjectIndexPage({\n  params\n}: {\n  params: Promise<{\n    namespace: string\n    'project-slug': string\n  }>\n}) {\n  const { namespace: rawNamespace, 'project-slug': rawProjectSlug } =\n    await params\n\n  try {\n    const namespace = decodeURIComponent(rawNamespace)\n    const projectSlug = decodeURIComponent(rawProjectSlug)\n\n    const { projectIdentifier } = parseProjectIdentifier(\n      `${namespace}/${projectSlug}`,\n      { strict: true }\n    )\n\n    return <AppProjectIndex projectIdentifier={projectIdentifier} />\n  } catch (err: any) {\n    void toastError(err, { label: 'Invalid project identifier' })\n\n    return notFound()\n  }\n}\n"
  },
  {
    "path": "apps/web/src/app/app/projects/app-projects-index.tsx",
    "content": "import { AppProjectsList } from '@/components/app-projects-list'\nimport { PageContainer } from '@/components/page-container'\n\nexport function AppProjectsIndex() {\n  return (\n    <PageContainer>\n      <section>\n        <div className='flex gap-8 space-around'>\n          <AppProjectsList />\n        </div>\n      </section>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/app/projects/page.tsx",
    "content": "import { AppProjectsIndex } from './app-projects-index'\n\nexport default function AppProjectsIndexPage() {\n  return <AppProjectsIndex />\n}\n"
  },
  {
    "path": "apps/web/src/app/app/temp-testing",
    "content": "          await new Promise((resolve) => setTimeout(resolve, 2000))\n          console.log(projects)\n          const p = [\n            {\n              id: 'proj_pk4ui2lpcepx1aaf21zlf0lj' + pageParam,\n              createdAt: '2025-06-16 01:50:23.948105',\n              updatedAt: '2025-06-16 01:50:23.948105',\n              identifier: '@dev/test-everything-openapi',\n              name: 'test-everything-openapi',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_ub815xwoj8bzj1gqdlfzim91',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_j5lvlamp2fax4n7kx09eypjx' + pageParam,\n              createdAt: '2025-06-16 01:50:20.288698',\n              updatedAt: '2025-06-16 01:50:20.288698',\n              identifier: '@dev/test-basic-mcp',\n              name: 'test-basic-mcp',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_krkn9nedwes1s662kky7a991',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_xrt1zzegoa3sun3kynh7itss' + pageParam,\n              createdAt: '2025-06-16 01:50:17.138037',\n              updatedAt: '2025-06-16 01:50:17.138037',\n              identifier: '@dev/test-basic-openapi',\n              name: 'test-basic-openapi',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_frbnya7wukdto64y93osfp8a',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_pk4ui2lpcepx1aaf21zlf0lj' + 'foo' + pageParam,\n              createdAt: '2025-06-16 01:50:23.948105',\n              updatedAt: '2025-06-16 01:50:23.948105',\n              identifier: '@dev/test-everything-openapi',\n              name: 'test-everything-openapi',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_ub815xwoj8bzj1gqdlfzim91',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_j5lvlamp2fax4n7kx09eypjx' + 'foo' + pageParam,\n              createdAt: '2025-06-16 01:50:20.288698',\n              updatedAt: '2025-06-16 01:50:20.288698',\n              identifier: '@dev/test-basic-mcp',\n              name: 'test-basic-mcp',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_krkn9nedwes1s662kky7a991',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_xrt1zzegoa3sun3kynh7itss' + 'foo' + pageParam,\n              createdAt: '2025-06-16 01:50:17.138037',\n              updatedAt: '2025-06-16 01:50:17.138037',\n              identifier: '@dev/test-basic-openapi',\n              name: 'test-basic-openapi',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_frbnya7wukdto64y93osfp8a',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_pk4ui2lpcepx1aaf21zlf0lj' + 'bar' + pageParam,\n              createdAt: '2025-06-16 01:50:23.948105',\n              updatedAt: '2025-06-16 01:50:23.948105',\n              identifier: '@dev/test-everything-openapi',\n              name: 'test-everything-openapi',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_ub815xwoj8bzj1gqdlfzim91',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_j5lvlamp2fax4n7kx09eypjx' + 'bar' + pageParam,\n              createdAt: '2025-06-16 01:50:20.288698',\n              updatedAt: '2025-06-16 01:50:20.288698',\n              identifier: '@dev/test-basic-mcp',\n              name: 'test-basic-mcp',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_krkn9nedwes1s662kky7a991',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_xrt1zzegoa3sun3kynh7itss' + 'bar' + pageParam,\n              createdAt: '2025-06-16 01:50:17.138037',\n              updatedAt: '2025-06-16 01:50:17.138037',\n              identifier: '@dev/test-basic-openapi',\n              name: 'test-basic-openapi',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_frbnya7wukdto64y93osfp8a',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            },\n            {\n              id: 'proj_pk4ui2lpcepx1aaf21zlf0lj' + 'baz' + pageParam,\n              createdAt: '2025-06-16 01:50:23.948105',\n              updatedAt: '2025-06-16 01:50:23.948105',\n              identifier: '@dev/test-everything-openapi',\n              name: 'test-everything-openapi',\n              userId: 'user_x7awoo6vxk7acinkjx1fc6kf',\n              lastDeploymentId: 'depl_ub815xwoj8bzj1gqdlfzim91',\n              applicationFeePercent: 20,\n              defaultPricingInterval: 'month',\n              pricingCurrency: 'usd'\n            }\n          ]\n          if (pageParam < 200) {\n            projects = p as any\n          }\n"
  },
  {
    "path": "apps/web/src/app/auth/[provider]/success/oauth-success-callback.tsx",
    "content": "'use client'\n\nimport { sanitizeSearchParams } from '@agentic/platform-core'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { useEffect } from 'react'\n\nimport {\n  useNextUrl,\n  useUnauthenticatedAgentic\n} from '@/components/agentic-provider'\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { toastError } from '@/lib/notifications'\n\nexport function OAuthSuccessCallback({\n  provider:\n    // TODO: make generic using this provider instead of hard-coding github\n    _provider\n}: {\n  provider: string\n}) {\n  const searchParams = useSearchParams()\n  const code = searchParams.get('code')\n  const ctx = useUnauthenticatedAgentic()\n  const nextUrl = useNextUrl()\n  const router = useRouter()\n\n  useEffect(() => {\n    ;(async function () {\n      if (!ctx) {\n        return\n      }\n\n      if (!code) {\n        // TODO\n        throw new Error('Missing code or challenge')\n      }\n\n      // TODO: make generic using `provider`\n      try {\n        await ctx.api.exchangeOAuthCodeWithGitHub({ code })\n      } catch (err) {\n        await toastError(err, { label: 'Auth error' })\n\n        return router.replace(\n          `/login?${sanitizeSearchParams({ next: nextUrl }).toString()}`\n        )\n      }\n\n      return router.replace(nextUrl || '/app')\n    })()\n  }, [code, ctx, nextUrl, router])\n\n  return <LoadingIndicator />\n}\n"
  },
  {
    "path": "apps/web/src/app/auth/[provider]/success/page.tsx",
    "content": "import { assert } from '@agentic/platform-core'\nimport { Suspense } from 'react'\n\nimport { OAuthSuccessCallback } from './oauth-success-callback'\n\nexport default async function Page({\n  params\n}: {\n  params: Promise<{ provider: string }>\n}) {\n  const { provider } = await params\n  assert(provider, 'Missing provider')\n\n  return (\n    <Suspense>\n      <OAuthSuccessCallback provider={provider} />\n    </Suspense>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/contact/page.tsx",
    "content": "import Link from 'next/link'\n\nimport { DotsSection } from '@/components/dots-section'\nimport { GitHubStarCounter } from '@/components/github-star-counter'\nimport { HeroButton } from '@/components/hero-button'\nimport { PageContainer } from '@/components/page-container'\nimport { Button } from '@/components/ui/button'\nimport { calendarBookingUrl, emailUrl, twitterUrl } from '@/lib/config'\n\nexport default function AboutPage() {\n  return (\n    <PageContainer className='gap-12'>\n      <h1 className='text-center text-balance leading-snug md:leading-none text-4xl font-semibold'>\n        Contact\n      </h1>\n\n      <section className='flex flex-col gap-4 max-w-2xl text-center'>\n        <p>\n          Agentic is currently a solo effort by{' '}\n          <Link\n            href={twitterUrl}\n            className='link'\n            target='_blank'\n            rel='noopener'\n          >\n            Travis Fischer\n          </Link>\n          . 👋\n        </p>\n\n        <p>\n          As with MCP itself, Agentic is an active work in progress, so please\n          reach out if you have any questions, feedback, or feature requests.\n        </p>\n      </section>\n\n      {/* CTA section */}\n      <DotsSection className='max-w-2xl'>\n        <div className='relative grid grid-cols-1 sm:grid-cols-2 gap-8'>\n          <HeroButton asChild heroVariant='orange'>\n            <Link href={twitterUrl} target='_blank' rel='noopener'>\n              DM me on Twitter / X\n            </Link>\n          </HeroButton>\n\n          <Button asChild variant='outline' className='h-full py-[9px]'>\n            <Link href={emailUrl}>Send me an email</Link>\n          </Button>\n\n          <Button asChild variant='outline' className='h-full py-[9px]'>\n            <Link href={calendarBookingUrl} target='_blank' rel='noopener'>\n              Book a call with me\n            </Link>\n          </Button>\n\n          <GitHubStarCounter className='h-full py-[9px]' />\n        </div>\n      </DotsSection>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/globals.css",
    "content": "@import 'tailwindcss';\n@plugin '@tailwindcss/typography';\n\n@custom-variant dark (&:is(.dark *));\n\n@theme {\n  --font-heading: var(--font-geist);\n  --font-body: var(--font-geist);\n}\n\n:root {\n  --radius: 0.625rem;\n  --background: oklch(1 0 0);\n  --foreground: oklch(0.145 0 0);\n  --card: oklch(1 0 0);\n  --card-foreground: oklch(0.145 0 0);\n  --popover: oklch(1 0 0);\n  --popover-foreground: oklch(0.145 0 0);\n  --primary: oklch(0.205 0 0);\n  --primary-foreground: oklch(0.985 0 0);\n  --secondary: oklch(0.97 0 0);\n  --secondary-foreground: oklch(0.205 0 0);\n  --muted: oklch(0.97 0 0);\n  --muted-foreground: oklch(0.556 0 0);\n  --accent: oklch(0.97 0 0);\n  --accent-foreground: oklch(0.205 0 0);\n  --destructive: oklch(0.577 0.245 27.325);\n  --border: oklch(0.922 0 0);\n  --input: oklch(0.922 0 0);\n  --ring: oklch(0.708 0 0);\n  --chart-1: oklch(0.646 0.222 41.116);\n  --chart-2: oklch(0.6 0.118 184.704);\n  --chart-3: oklch(0.398 0.07 227.392);\n  --chart-4: oklch(0.828 0.189 84.429);\n  --chart-5: oklch(0.769 0.188 70.08);\n  --sidebar: oklch(0.985 0 0);\n  --sidebar-foreground: oklch(0.145 0 0);\n  --sidebar-primary: oklch(0.205 0 0);\n  --sidebar-primary-foreground: oklch(0.985 0 0);\n  --sidebar-accent: oklch(0.97 0 0);\n  --sidebar-accent-foreground: oklch(0.205 0 0);\n  --sidebar-border: oklch(0.922 0 0);\n  --sidebar-ring: oklch(0.708 0 0);\n}\n\n.dark {\n  --background: oklch(0.145 0 0);\n  --foreground: oklch(0.985 0 0);\n  --card: oklch(0.205 0 0);\n  --card-foreground: oklch(0.985 0 0);\n  --popover: oklch(0.205 0 0);\n  --popover-foreground: oklch(0.985 0 0);\n  --primary: oklch(0.922 0 0);\n  --primary-foreground: oklch(0.205 0 0);\n  --secondary: oklch(0.269 0 0);\n  --secondary-foreground: oklch(0.985 0 0);\n  --muted: oklch(0.269 0 0);\n  --muted-foreground: oklch(0.708 0 0);\n  --accent: oklch(0.269 0 0);\n  --accent-foreground: oklch(0.985 0 0);\n  --destructive: oklch(0.704 0.191 22.216);\n  --border: oklch(1 0 0 / 10%);\n  --input: oklch(1 0 0 / 15%);\n  --ring: oklch(0.556 0 0);\n  --chart-1: oklch(0.488 0.243 264.376);\n  --chart-2: oklch(0.696 0.17 162.48);\n  --chart-3: oklch(0.769 0.188 70.08);\n  --chart-4: oklch(0.627 0.265 303.9);\n  --chart-5: oklch(0.645 0.246 16.439);\n  --sidebar: oklch(0.205 0 0);\n  --sidebar-foreground: oklch(0.985 0 0);\n  --sidebar-primary: oklch(0.488 0.243 264.376);\n  --sidebar-primary-foreground: oklch(0.985 0 0);\n  --sidebar-accent: oklch(0.269 0 0);\n  --sidebar-accent-foreground: oklch(0.985 0 0);\n  --sidebar-border: oklch(1 0 0 / 10%);\n  --sidebar-ring: oklch(0.556 0 0);\n}\n\n@theme inline {\n  --radius-sm: calc(var(--radius) - 4px);\n  --radius-md: calc(var(--radius) - 2px);\n  --radius-lg: var(--radius);\n  --radius-xl: calc(var(--radius) + 4px);\n  --color-background: var(--background);\n  --color-foreground: var(--foreground);\n  --color-card: var(--card);\n  --color-card-foreground: var(--card-foreground);\n  --color-popover: var(--popover);\n  --color-popover-foreground: var(--popover-foreground);\n  --color-primary: var(--primary);\n  --color-primary-foreground: var(--primary-foreground);\n  --color-secondary: var(--secondary);\n  --color-secondary-foreground: var(--secondary-foreground);\n  --color-muted: var(--muted);\n  --color-muted-foreground: var(--muted-foreground);\n  --color-accent: var(--accent);\n  --color-accent-foreground: var(--accent-foreground);\n  --color-destructive: var(--destructive);\n  --color-border: var(--border);\n  --color-input: var(--input);\n  --color-ring: var(--ring);\n  --color-chart-1: var(--chart-1);\n  --color-chart-2: var(--chart-2);\n  --color-chart-3: var(--chart-3);\n  --color-chart-4: var(--chart-4);\n  --color-chart-5: var(--chart-5);\n  --color-sidebar: var(--sidebar);\n  --color-sidebar-foreground: var(--sidebar-foreground);\n  --color-sidebar-primary: var(--sidebar-primary);\n  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n  --color-sidebar-accent: var(--sidebar-accent);\n  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n  --color-sidebar-border: var(--sidebar-border);\n  --color-sidebar-ring: var(--sidebar-ring);\n}\n\n@layer base {\n  * {\n    @apply border-border outline-ring/50;\n  }\n  body {\n    @apply bg-background text-foreground;\n  }\n}\n\nbody {\n  font-family: var(--font-body), Arial, Helvetica, sans-serif;\n}\n\n* {\n  box-sizing: border-box;\n}\n\nhtml,\nbody {\n  max-width: 100vw;\n  height: 100%;\n}\n\na {\n  text-decoration: none;\n}\n\na:hover {\n  text-decoration: none;\n}\n\na.link,\na .link {\n  position: relative;\n  transition: unset;\n  opacity: 1;\n  padding-bottom: 0.1rem;\n  border-bottom-width: 0.1rem;\n  border-bottom-color: transparent;\n  background: transparent;\n  background-origin: border-box;\n  background-repeat: no-repeat;\n  background-position: 50% 100%;\n  background-size: 0 0.1rem;\n}\n\na.link:focus,\na.link:hover,\na:focus .link,\na:hover .link {\n  border-bottom-color: transparent;\n\n  background-image: linear-gradient(90.68deg, #b439df 0.26%, #e5337e 102.37%);\n  background-repeat: no-repeat;\n  background-position: 0 100%;\n  background-size: 100% 0.1rem;\n\n  transition-property: background-position, background-size;\n  transition-duration: 300ms;\n}\n\nmain section {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\nmain section:last-of-type {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "apps/web/src/app/layout.tsx",
    "content": "import './globals.css'\n\nimport type { Metadata } from 'next'\nimport { Geist } from 'next/font/google'\nimport { Toaster } from 'sonner'\n\nimport { Bootstrap } from '@/components/bootstrap'\nimport { Footer } from '@/components/footer'\nimport { Header } from '@/components/header'\nimport * as config from '@/lib/config'\n\nimport Providers from './providers'\n\nconst geist = Geist({\n  variable: '--font-geist',\n  subsets: ['latin']\n})\n\nexport const metadata: Metadata = {\n  title: config.title,\n  description: config.description,\n  authors: [{ name: config.author, url: config.twitterUrl }],\n  metadataBase: new URL(config.prodUrl),\n  keywords: config.keywords,\n  openGraph: {\n    title: config.title,\n    description: config.description,\n    siteName: config.title,\n    locale: 'en_US',\n    type: 'website',\n    url: config.prodUrl\n  },\n  twitter: {\n    card: 'summary_large_image',\n    creator: `@${config.authorTwitterUsername}`,\n    title: config.title,\n    description: config.description\n  }\n}\n\nexport default function RootLayout({\n  children\n}: Readonly<{\n  children: React.ReactNode\n}>) {\n  return (\n    <html lang='en' suppressHydrationWarning>\n      <body className={`${geist.variable} antialiased`}>\n        <Providers>\n          <div className='relative w-full min-h-[100vh] flex flex-col items-center'>\n            <Header />\n\n            <main className='relative w-full flex-1 flex flex-col items-center gap-16 pt-8 pb-16 px-2 overflow-hidden'>\n              {children}\n            </main>\n\n            <Toaster richColors duration={5000} />\n            <Footer />\n          </div>\n\n          <Bootstrap />\n        </Providers>\n      </body>\n    </html>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/login/login-form.tsx",
    "content": "'use client'\n\nimport { sanitizeSearchParams } from '@agentic/platform-core'\nimport { isValidEmail, isValidPassword } from '@agentic/platform-validators'\nimport { useForm } from '@tanstack/react-form'\nimport { Loader2Icon } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\nimport { useCallback, useState } from 'react'\nimport { z } from 'zod'\n\nimport {\n  useNextUrl,\n  useUnauthenticatedAgentic\n} from '@/components/agentic-provider'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { GitHubIcon } from '@/icons/github'\nimport { toastError } from '@/lib/notifications'\nimport { cn } from '@/lib/utils'\n\nexport function LoginForm() {\n  const ctx = useUnauthenticatedAgentic()\n  const nextUrl = useNextUrl()\n  const router = useRouter()\n  const [isGitHubLoading, setIsGitHubLoading] = useState(false)\n\n  const onAuthWithGitHub = useCallback(async () => {\n    setIsGitHubLoading(true)\n    try {\n      const redirectUri = `${globalThis.location.origin}/auth/github/success?${sanitizeSearchParams({ next: nextUrl }).toString()}`\n\n      const url = await ctx!.api.initAuthFlowWithGitHub({ redirectUri })\n\n      void router.push(url)\n    } catch (err: any) {\n      setIsGitHubLoading(false)\n      void toastError(err, { label: 'GitHub auth error' })\n    }\n  }, [ctx, nextUrl, router])\n\n  const form = useForm({\n    defaultValues: {\n      email: '',\n      password: ''\n    },\n    validators: {\n      onChange: z.object({\n        email: z\n          .string()\n          .email()\n          .refine((email) => isValidEmail(email)),\n        password: z.string().refine((password) => isValidPassword(password))\n      })\n    },\n    onSubmit: async ({ value }) => {\n      try {\n        const res = await ctx!.api.signInWithPassword({\n          email: value.email,\n          password: value.password\n        })\n\n        console.log('login success', res)\n      } catch (err: any) {\n        void toastError(err, { label: 'Login error' })\n        return\n      }\n\n      return router.push(nextUrl || '/app')\n    }\n  })\n\n  return (\n    <section>\n      <div className='flex flex-col flex-1 items-center justify-center w-full max-w-xs gap-6'>\n        <form\n          className={cn('flex flex-col gap-6 w-full')}\n          onSubmit={(e) => {\n            e.preventDefault()\n            void form.handleSubmit()\n          }}\n        >\n          <div className='flex flex-col items-center gap-2 text-center'>\n            <h1 className='text-2xl font-bold'>Login to your account</h1>\n          </div>\n\n          <div className='grid gap-6'>\n            <form.Field\n              name='email'\n              children={(field) => (\n                <div className='grid gap-3'>\n                  <Label htmlFor={field.name}>Email</Label>\n\n                  <Input\n                    id={field.name}\n                    name={field.name}\n                    type='email'\n                    required\n                    placeholder='Email'\n                    autoComplete='email'\n                    autoFocus={true}\n                    value={field.state.value}\n                    onBlur={field.handleBlur}\n                    onChange={(e: any) => field.handleChange(e.target.value)}\n                  />\n                </div>\n              )}\n            />\n\n            <form.Field\n              name='password'\n              children={(field) => (\n                <div className='grid gap-3'>\n                  <div className='flex items-center'>\n                    <Label htmlFor={field.name}>Password</Label>\n\n                    {/* <a\n                        href='/forgot-password'\n                        className='ml-auto text-xs underline-offset-4 hover:underline'\n                        tabIndex={-1}\n                      >\n                        Forgot your password?\n                      </a> */}\n                  </div>\n\n                  <Input\n                    id={field.name}\n                    name={field.name}\n                    type='password'\n                    required\n                    placeholder='Password'\n                    // autoFocus={error?.type === 'invalid_password'}\n                    autoComplete='current-password'\n                    value={field.state.value}\n                    onBlur={field.handleBlur}\n                    onChange={(e) => field.handleChange(e.target.value)}\n                  />\n                </div>\n              )}\n            />\n\n            <form.Subscribe\n              selector={(state) => [\n                state.canSubmit,\n                state.isSubmitting,\n                state.isTouched\n              ]}\n              children={([canSubmit, isSubmitting, isTouched]) => (\n                <Button\n                  type='submit'\n                  disabled={!(isTouched && canSubmit && ctx)}\n                  className='w-full'\n                >\n                  {isSubmitting && <Loader2Icon className='animate-spin' />}\n\n                  <span>Login</span>\n                </Button>\n              )}\n            />\n          </div>\n        </form>\n\n        <div className='flex items-center gap-2 text-center text-sm w-full'>\n          <div className='border-border border-t inset-0 flex-1' />\n          <div className='text-muted-foreground'>Or continue with</div>\n          <div className='border-border border-t inset-0 flex-1' />\n        </div>\n\n        <form\n          className='w-full'\n          onSubmit={(e) => {\n            e.preventDefault()\n            void onAuthWithGitHub()\n          }}\n        >\n          <Button\n            type='submit'\n            variant='outline'\n            className='w-full'\n            disabled={isGitHubLoading || !ctx}\n          >\n            {isGitHubLoading && <Loader2Icon className='animate-spin' />}\n            <GitHubIcon />\n\n            <span>Login with GitHub</span>\n          </Button>\n        </form>\n\n        <div className='text-center text-xs'>\n          Don&apos;t have an account?{' '}\n          <a\n            href={`/signup?${sanitizeSearchParams({ next: nextUrl }).toString()}`}\n            className='underline underline-offset-4'\n          >\n            Sign up\n          </a>\n        </div>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/login/page.tsx",
    "content": "import { Suspense } from 'react'\n\nimport { PageContainer } from '@/components/page-container'\n\nimport { LoginForm } from './login-form'\n\nexport default function Page() {\n  return (\n    <Suspense>\n      <PageContainer>\n        <LoginForm />\n      </PageContainer>\n    </Suspense>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/logout/page.tsx",
    "content": "'use client'\n\nimport { useEffect } from 'react'\n\nimport { useAuthenticatedAgentic } from '@/components/agentic-provider'\n\nexport default function LogoutPage() {\n  const ctx = useAuthenticatedAgentic()\n\n  useEffect(() => {\n    ;(async () => {\n      if (ctx) {\n        ctx.logout()\n      }\n    })()\n  }, [ctx])\n\n  return null\n}\n"
  },
  {
    "path": "apps/web/src/app/marketplace/marketplace-index.tsx",
    "content": "'use client'\n\nimport useInfiniteScroll from 'react-infinite-scroll-hook'\n\nimport { DotsSection } from '@/components/dots-section'\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { PageContainer } from '@/components/page-container'\nimport { PublicProject } from '@/components/public-project'\nimport { SupplySideCTA } from '@/components/supply-side-cta'\nimport { defaultAgenticApiClient } from '@/lib/default-agentic-api-client'\nimport { useInfiniteQuery, useQuery } from '@/lib/query-client'\n\nexport function MarketplaceIndex({ limit }: { limit: number }) {\n  const {\n    data: featuredProjects,\n    isLoading: isFeaturedProjectsLoading,\n    isError: isFeaturedProjectsError\n  } = useQuery({\n    queryKey: ['featured-public-projects'],\n    queryFn: () =>\n      defaultAgenticApiClient.listPublicProjects({\n        populate: ['lastPublishedDeployment'],\n        limit: 3,\n        tag: 'featured',\n        sortBy: 'createdAt',\n        sort: 'asc'\n      })\n  })\n\n  const {\n    data,\n    isLoading,\n    isError,\n    hasNextPage,\n    fetchNextPage,\n    isFetchingNextPage\n  } = useInfiniteQuery({\n    queryKey: ['public-projects'],\n    queryFn: ({ pageParam = 0 }) =>\n      defaultAgenticApiClient\n        .listPublicProjects({\n          populate: ['lastPublishedDeployment'],\n          offset: pageParam,\n          limit,\n          notTag: 'featured'\n        })\n        .then(async (projects) => {\n          return {\n            projects,\n            offset: pageParam,\n            limit,\n            nextOffset:\n              projects.length >= limit ? pageParam + projects.length : undefined\n          }\n        }),\n    getNextPageParam: (lastGroup) => lastGroup?.nextOffset,\n    initialPageParam: 0\n  })\n\n  const [sentryRef] = useInfiniteScroll({\n    loading: isLoading || isFetchingNextPage,\n    hasNextPage,\n    onLoadMore: fetchNextPage,\n    disabled: isError,\n    rootMargin: '0px 0px 200px 0px'\n  })\n\n  const projects = data ? data.pages.flatMap((p) => p.projects) : []\n\n  return (\n    <PageContainer>\n      <section className='flex flex-col gap-8'>\n        <h1\n          className='text-center text-balance leading-snug md:leading-none\n        text-4xl font-extrabold'\n        >\n          Marketplace\n        </h1>\n\n        <div className='flex flex-col gap-16'>\n          <div className=''>\n            <h2 className='text-xl font-semibold mb-4'>Featured</h2>\n\n            {isFeaturedProjectsError ? (\n              <p>Error fetching featured projects</p>\n            ) : isFeaturedProjectsLoading ? (\n              <LoadingIndicator />\n            ) : !featuredProjects?.length ? (\n              <p>\n                No projects found. This is likely an issue on Agentic's side.\n                Please refresh or contact support.\n              </p>\n            ) : (\n              <div className='grid grid-cols grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-3'>\n                {featuredProjects.map((project) => (\n                  <PublicProject key={project.id} project={project} />\n                ))}\n              </div>\n            )}\n          </div>\n\n          <div className=''>\n            <h2 className='text-xl font-semibold mb-4'>General</h2>\n\n            {isError ? (\n              <p>Error fetching projects</p>\n            ) : isLoading ? (\n              <LoadingIndicator />\n            ) : !projects.length ? (\n              <p>\n                No projects found. This is likely an issue on Agentic's side.\n                Please refresh or contact support.\n              </p>\n            ) : (\n              <div className='grid grid-cols grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-3'>\n                {projects.map((project) => (\n                  <PublicProject key={project.id} project={project} />\n                ))}\n\n                {hasNextPage && (\n                  <div ref={sentryRef} className=''>\n                    {isLoading || (isFetchingNextPage && <LoadingIndicator />)}\n                  </div>\n                )}\n              </div>\n            )}\n          </div>\n        </div>\n      </section>\n\n      {/* CTA section */}\n      <DotsSection className='flex flex-col gap-12 mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Your API → Paid MCP, Instantly\n        </h2>\n\n        <h5 className='text-center max-w-2xl bg-background/50 rounded-xl'>\n          Run one command to turn any MCP server or OpenAPI service into a paid\n          MCP product. With built-in support for every major LLM SDK and MCP\n          client.\n        </h5>\n\n        <SupplySideCTA variant='docs' />\n      </DotsSection>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/marketplace/page.tsx",
    "content": "import {\n  dehydrate,\n  HydrationBoundary,\n  QueryClient\n} from '@tanstack/react-query'\n\nimport { defaultAgenticApiClient } from '@/lib/default-agentic-api-client'\n\nimport { MarketplaceIndex } from './marketplace-index'\n\nexport default async function MarketplaceIndexPage() {\n  const queryClient = new QueryClient()\n  const limit = 10\n\n  await Promise.all([\n    queryClient.prefetchQuery({\n      queryKey: ['featured-public-projects'],\n      queryFn: () =>\n        defaultAgenticApiClient.listPublicProjects({\n          populate: ['lastPublishedDeployment'],\n          limit: 3,\n          tag: 'featured',\n          sortBy: 'createdAt',\n          sort: 'asc'\n        })\n    }),\n\n    queryClient.prefetchInfiniteQuery({\n      queryKey: ['public-projects'],\n      queryFn: ({ pageParam = 0 }) =>\n        defaultAgenticApiClient\n          .listPublicProjects({\n            populate: ['lastPublishedDeployment'],\n            offset: pageParam,\n            limit,\n            notTag: 'featured'\n          })\n          .then(async (projects) => {\n            return {\n              projects,\n              offset: pageParam,\n              limit,\n              nextOffset:\n                projects.length >= limit\n                  ? pageParam + projects.length\n                  : undefined\n            }\n          }),\n      initialPageParam: 0\n    })\n  ])\n\n  return (\n    <HydrationBoundary state={dehydrate(queryClient)}>\n      <MarketplaceIndex limit={limit} />\n    </HydrationBoundary>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/marketplace/projects/[namespace]/[project-slug]/marketplace-nav.tsx",
    "content": "import {\n  Breadcrumb,\n  BreadcrumbItem,\n  BreadcrumbLink,\n  BreadcrumbList,\n  BreadcrumbPage,\n  BreadcrumbSeparator\n} from '@/components/ui/breadcrumb'\n\nexport function MarketplacePublicProjectDetailNav({\n  projectIdentifier\n}: {\n  projectIdentifier: string\n}) {\n  return (\n    <Breadcrumb>\n      <BreadcrumbList>\n        <BreadcrumbItem>\n          <BreadcrumbLink href='/marketplace'>Marketplace</BreadcrumbLink>\n        </BreadcrumbItem>\n\n        <BreadcrumbSeparator />\n\n        <BreadcrumbItem>\n          <BreadcrumbPage>{projectIdentifier}</BreadcrumbPage>\n        </BreadcrumbItem>\n      </BreadcrumbList>\n    </Breadcrumb>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/marketplace/projects/[namespace]/[project-slug]/marketplace-public-project-detail.tsx",
    "content": "'use client'\n\nimport type { Project } from '@agentic/platform-types'\nimport { assert, omit, sanitizeSearchParams } from '@agentic/platform-core'\nimport ky from 'ky'\nimport { ChevronsUpDownIcon, ExternalLinkIcon } from 'lucide-react'\nimport Link from 'next/link'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport plur from 'plur'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useAsync } from 'react-use'\n\nimport { useAgentic } from '@/components/agentic-provider'\nimport { CodeBlock } from '@/components/code-block'\nimport { ExampleUsage } from '@/components/example-usage'\nimport { HeroButton } from '@/components/hero-button'\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { SSRMarkdown } from '@/components/markdown/ssr-markdown'\nimport { PageContainer } from '@/components/page-container'\nimport { ProjectPricingPlans } from '@/components/project-pricing-plans'\nimport { Button } from '@/components/ui/button'\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger\n} from '@/components/ui/collapsible'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'\nimport { GitHubIcon } from '@/icons/github'\nimport { defaultAgenticApiClient } from '@/lib/default-agentic-api-client'\nimport { toast, toastError } from '@/lib/notifications'\nimport { useQuery } from '@/lib/query-client'\n\nimport {\n  type MarketplacePublicProjectDetailTab,\n  marketplacePublicProjectDetailTabsSet,\n  MAX_TOOLS_TO_SHOW\n} from './utils'\n\nexport function MarketplacePublicProjectDetail({\n  projectIdentifier\n}: {\n  projectIdentifier: string\n}) {\n  const ctx = useAgentic()\n  const searchParams = useSearchParams()\n  const checkout = searchParams.get('checkout')\n  const plan = searchParams.get('plan')\n  const [isLoadingStripeCheckoutForPlan, setIsLoadingStripeCheckoutForPlan] =\n    useState<string | null>(null)\n  const router = useRouter()\n\n  // Load the public project\n  const {\n    data: project,\n    isLoading,\n    isError\n  } = useQuery({\n    queryKey: ['public-project', projectIdentifier],\n    queryFn: () =>\n      defaultAgenticApiClient.getPublicProjectByIdentifier({\n        projectIdentifier,\n        populate: ['lastPublishedDeployment']\n      })\n  })\n\n  // If the user is authenticated, check if they have an active subscription to\n  // this project\n  const {\n    data: consumer,\n    isLoading: isConsumerLoading\n    // isError: isConsumerError\n  } = useQuery({\n    queryKey: [\n      'project',\n      projectIdentifier,\n      'user',\n      ctx?.api.authSession?.user.id\n    ],\n    queryFn: () =>\n      ctx!.api.getConsumerByProjectIdentifier({\n        projectIdentifier\n      }),\n    enabled: !!ctx?.isAuthenticated\n  })\n\n  const onSubscribe = useCallback(\n    async (pricingPlanSlug: string) => {\n      assert(ctx, 500, 'Agentic context is required')\n      assert(project, 500, 'Project is required')\n      const { lastPublishedDeploymentId } = project\n      assert(\n        lastPublishedDeploymentId,\n        500,\n        `Public project \"${projectIdentifier}\" expected to have a last published deployment, but none found.`\n      )\n\n      if (!ctx.isAuthenticated) {\n        return router.push(\n          `/signup?${sanitizeSearchParams({\n            next: `/marketplace/projects/${projectIdentifier}?tab=pricing&checkout=true&plan=${pricingPlanSlug}`\n          }).toString()}`\n        )\n      }\n\n      let checkoutSession: { url: string; id: string } | undefined\n\n      try {\n        setIsLoadingStripeCheckoutForPlan(pricingPlanSlug)\n        const res = await ctx!.api.createConsumerCheckoutSession({\n          deploymentId: lastPublishedDeploymentId!,\n          plan: pricingPlanSlug\n        })\n\n        console.log('checkout', res)\n        checkoutSession = res.checkoutSession\n      } catch (err) {\n        return toastError(err, { label: 'Error creating checkout session' })\n      } finally {\n        setIsLoadingStripeCheckoutForPlan(null)\n      }\n\n      return router.push(checkoutSession.url)\n    },\n    [ctx, projectIdentifier, project, router]\n  )\n\n  const hasInitializedCheckoutFromSearchParams = useRef(false)\n\n  useEffect(() => {\n    if (!ctx) return\n\n    if (checkout === 'canceled') {\n      toast('Checkout canceled')\n    } else if (\n      checkout === 'true' &&\n      plan &&\n      project &&\n      !isConsumerLoading &&\n      !hasInitializedCheckoutFromSearchParams.current\n    ) {\n      hasInitializedCheckoutFromSearchParams.current = true\n\n      if (consumer?.plan !== plan) {\n        // Start checkout flow if search params have `?checkout=true&plan={plan}`\n        // This is to allow unauthenticated users to subscribe to a plan by first\n        // visiting `/login` or `/signup` and then being redirected to this page\n        // with the target checkout search params already pre-filled.\n        // Another use case for this functionality is providing a single link to\n        // subscribe to a specific project and pricing plan – with the checkout\n        // details pre-filled.\n        void onSubscribe(checkout)\n      }\n    }\n  }, [\n    checkout,\n    plan,\n    ctx,\n    project,\n    isConsumerLoading,\n    consumer,\n    onSubscribe,\n    hasInitializedCheckoutFromSearchParams\n  ])\n\n  const deployment = useMemo(() => project?.lastPublishedDeployment, [project])\n  const featuredToolName = useMemo(() => {\n    const toolConfigs = deployment?.toolConfigs?.filter(\n      (toolConfig) => toolConfig?.enabled !== false\n    )\n\n    return (\n      toolConfigs?.find((toolConfig) =>\n        toolConfig.examples?.find((example) => example.featured)\n      )?.name ??\n      toolConfigs?.find((toolConfig) => toolConfig.examples?.length)?.name ??\n      toolConfigs?.[0]?.name ??\n      deployment?.tools[0]?.name\n    )\n  }, [deployment])\n\n  const tab = useMemo<MarketplacePublicProjectDetailTab>(() => {\n    const tab = searchParams.get('tab')?.toLowerCase()\n    if (!tab || !marketplacePublicProjectDetailTabsSet.has(tab)) {\n      return 'overview'\n    }\n\n    if (tab === 'readme' && !deployment?.readme?.trim()) {\n      return 'overview'\n    }\n\n    return tab as MarketplacePublicProjectDetailTab\n  }, [searchParams, deployment])\n\n  const { value: readme, loading: isReadmeLoading } = useAsync(async () => {\n    if (deployment?.readme?.trim()) {\n      return ky.get(deployment.readme).text()\n    }\n\n    return undefined\n  }, [deployment])\n\n  const tools = useMemo(() => {\n    if (!deployment) return []\n    const toolConfigsMap = new Map(\n      deployment.toolConfigs.map((toolConfig) => [toolConfig.name, toolConfig])\n    )\n\n    return deployment.tools\n      .map((tool) => {\n        const toolConfig = toolConfigsMap.get(tool.name)\n        if (toolConfig?.enabled === false) return null\n\n        // TODO: add to tool if disabled on current pricing plan\n        return tool\n      })\n      .filter(Boolean)\n  }, [deployment])\n\n  return (\n    <PageContainer compact>\n      <section>\n        {isLoading ? (\n          <LoadingIndicator />\n        ) : isError ? (\n          <p>Error fetching project</p>\n        ) : !project ? (\n          <p>Project \"{projectIdentifier}\" not found</p>\n        ) : (\n          <div className='flex flex-col gap-4 w-full'>\n            <ProjectHeader project={project} tab={tab} />\n\n            <Tabs\n              value={tab}\n              onValueChange={(value) => {\n                if (value === 'overview') {\n                  router.push(`/marketplace/projects/${projectIdentifier}`)\n                } else {\n                  router.push(\n                    `/marketplace/projects/${projectIdentifier}?tab=${value}`\n                  )\n                }\n              }}\n            >\n              <TabsList>\n                <TabsTrigger value='overview' className='cursor-pointer'>\n                  Overview\n                </TabsTrigger>\n\n                {deployment?.readme?.trim() && (\n                  <TabsTrigger value='readme' className='cursor-pointer'>\n                    Readme\n                  </TabsTrigger>\n                )}\n\n                <TabsTrigger\n                  value='tools'\n                  className='cursor-pointer'\n                  disabled={!deployment}\n                >\n                  Tools\n                </TabsTrigger>\n\n                <TabsTrigger\n                  value='pricing'\n                  className='cursor-pointer'\n                  disabled={!deployment}\n                >\n                  Pricing\n                </TabsTrigger>\n\n                <TabsTrigger value='debug' className='cursor-pointer'>\n                  Debug\n                </TabsTrigger>\n              </TabsList>\n\n              <div className='bg-card p-4 border rounded-lg shadow-sm color-card-foreground'>\n                {tab === 'overview' && (\n                  <TabsContent value='overview' className='flex flex-col gap-4'>\n                    <h2 className='text-balance leading-snug md:leading-none text-xl font-semibold'>\n                      Overview\n                    </h2>\n\n                    <div className='grid grid-cols grid-cols-1 lg:grid-cols-2 gap-8 md:gap-4'>\n                      <div className='flex flex-col gap-8'>\n                        {deployment ? (\n                          <>\n                            <p>\n                              {deployment.description ||\n                                'No description available'}\n                            </p>\n\n                            <div className='flex flex-col gap-4'>\n                              <h3 className='text-balance leading-snug md:leading-none text-lg font-semibold'>\n                                Tools\n                              </h3>\n\n                              <ul className='flex flex-col gap-4'>\n                                {deployment.tools\n                                  .slice(0, MAX_TOOLS_TO_SHOW)\n                                  .map((tool) => (\n                                    <li\n                                      key={tool.name}\n                                      className='p-4 border rounded-sm w-full flex flex-col gap-4'\n                                    >\n                                      <h3 className='text-balance leading-snug md:leading-none text-md font-semibold'>\n                                        {tool.name}\n                                      </h3>\n\n                                      <p className='text-sm text-gray-500'>\n                                        {tool.description}\n                                      </p>\n                                    </li>\n                                  ))}\n\n                                {tools.length > MAX_TOOLS_TO_SHOW && (\n                                  <li>\n                                    <Button\n                                      asChild\n                                      className='w-full flex flex-col gap-4'\n                                      variant='outline'\n                                    >\n                                      <Link\n                                        href={`/marketplace/projects/${projectIdentifier}?tab=tools`}\n                                      >\n                                        View{' '}\n                                        {deployment.tools.length -\n                                          MAX_TOOLS_TO_SHOW}{' '}\n                                        more{' '}\n                                        {plur(\n                                          'tool',\n                                          deployment.tools.length -\n                                            MAX_TOOLS_TO_SHOW\n                                        )}\n                                      </Link>\n                                    </Button>\n                                  </li>\n                                )}\n                              </ul>\n                            </div>\n                          </>\n                        ) : (\n                          <p>\n                            This project doesn't have any published deployments.\n                          </p>\n                        )}\n                      </div>\n\n                      <div className='flex flex-col gap-4'>\n                        <ExampleUsage\n                          projectIdentifier={projectIdentifier}\n                          project={project}\n                          tool={featuredToolName}\n                        />\n                      </div>\n                    </div>\n                  </TabsContent>\n                )}\n\n                {tab === 'readme' && (\n                  <TabsContent value='readme' className='flex flex-col gap-4'>\n                    {isReadmeLoading ? (\n                      <LoadingIndicator />\n                    ) : readme ? (\n                      <SSRMarkdown markdown={readme} className='' />\n                    ) : (\n                      <p>Readme not found</p>\n                    )}\n                  </TabsContent>\n                )}\n\n                {tab === 'tools' && (\n                  <TabsContent value='tools' className='flex flex-col gap-4'>\n                    <h2 className='text-balance leading-snug md:leading-none text-xl font-semibold'>\n                      Tools\n                    </h2>\n\n                    {deployment && (\n                      <ul className='flex flex-col gap-4'>\n                        {tools.map((tool) => (\n                          <li\n                            key={tool.name}\n                            className='p-4 border rounded-sm w-full flex flex-col gap-4'\n                          >\n                            <h3 className='text-balance leading-snug md:leading-none text-md font-semibold'>\n                              {tool.name}\n                            </h3>\n\n                            <p className='text-sm text-gray-500'>\n                              {tool.description}\n                            </p>\n\n                            <Collapsible className='w-full flex flex-col align-start gap-2'>\n                              <CollapsibleTrigger asChild>\n                                <Button\n                                  variant='outline'\n                                  className='self-start'\n                                >\n                                  Input schema\n                                  <ChevronsUpDownIcon />\n                                </Button>\n                              </CollapsibleTrigger>\n\n                              <CollapsibleContent>\n                                <CodeBlock\n                                  lang='json'\n                                  code={JSON.stringify(\n                                    tool.inputSchema,\n                                    null,\n                                    2\n                                  )}\n                                  className='border rounded-sm'\n                                />\n                              </CollapsibleContent>\n                            </Collapsible>\n\n                            {tool.outputSchema && (\n                              <Collapsible className='w-full flex flex-col align-start gap-2'>\n                                <CollapsibleTrigger asChild>\n                                  <Button\n                                    variant='outline'\n                                    className='self-start'\n                                  >\n                                    Output schema\n                                    <ChevronsUpDownIcon />\n                                  </Button>\n                                </CollapsibleTrigger>\n\n                                <CollapsibleContent>\n                                  <CodeBlock\n                                    lang='json'\n                                    code={JSON.stringify(\n                                      tool.outputSchema,\n                                      null,\n                                      2\n                                    )}\n                                    className='border rounded-sm'\n                                  />\n                                </CollapsibleContent>\n                              </Collapsible>\n                            )}\n                          </li>\n                        ))}\n                      </ul>\n                    )}\n                  </TabsContent>\n                )}\n\n                {tab === 'pricing' && (\n                  <TabsContent value='pricing' className='flex flex-col gap-4'>\n                    <h2 className='text-balance leading-snug md:leading-none text-xl font-semibold'>\n                      Pricing\n                    </h2>\n\n                    <ProjectPricingPlans\n                      project={project}\n                      consumer={consumer}\n                      isLoadingStripeCheckoutForPlan={\n                        isLoadingStripeCheckoutForPlan\n                      }\n                      onSubscribe={onSubscribe}\n                    />\n                  </TabsContent>\n                )}\n\n                {tab === 'debug' && (\n                  <TabsContent value='debug' className='flex flex-col gap-4'>\n                    <h2 className='text-balance leading-snug md:leading-none text-xl font-semibold'>\n                      Debug\n                    </h2>\n\n                    <Collapsible\n                      defaultOpen\n                      className='w-full flex flex-col align-start gap-2'\n                    >\n                      <CollapsibleTrigger asChild>\n                        <Button variant='outline' className='self-start'>\n                          Project\n                          <ChevronsUpDownIcon />\n                        </Button>\n                      </CollapsibleTrigger>\n\n                      <CollapsibleContent>\n                        <CodeBlock\n                          lang='json'\n                          code={JSON.stringify(\n                            omit(\n                              project,\n                              'lastPublishedDeployment',\n                              'lastDeployment'\n                            ),\n                            null,\n                            2\n                          )}\n                          className='border rounded-sm max-w-full overflow-x-auto'\n                        />\n                      </CollapsibleContent>\n                    </Collapsible>\n\n                    {deployment && (\n                      <Collapsible className='w-full flex flex-col align-start gap-2'>\n                        <CollapsibleTrigger asChild>\n                          <Button variant='outline' className='self-start'>\n                            Last Published Deployment\n                            <ChevronsUpDownIcon />\n                          </Button>\n                        </CollapsibleTrigger>\n\n                        <CollapsibleContent>\n                          <CodeBlock\n                            lang='json'\n                            code={JSON.stringify(\n                              omit(deployment, 'project'),\n                              null,\n                              2\n                            )}\n                            className='border rounded-sm max-w-full overflow-x-auto'\n                          />\n                        </CollapsibleContent>\n                      </Collapsible>\n                    )}\n\n                    {consumer && (\n                      <Collapsible className='w-full flex flex-col align-start gap-2'>\n                        <CollapsibleTrigger asChild>\n                          <Button variant='outline' className='self-start'>\n                            Consumer\n                            <ChevronsUpDownIcon />\n                          </Button>\n                        </CollapsibleTrigger>\n\n                        <CollapsibleContent>\n                          <CodeBlock\n                            lang='json'\n                            code={JSON.stringify(\n                              omit(consumer, 'project', 'deployment'),\n                              null,\n                              2\n                            )}\n                            className='border rounded-sm max-w-full overflow-x-auto'\n                          />\n                        </CollapsibleContent>\n                      </Collapsible>\n                    )}\n                  </TabsContent>\n                )}\n              </div>\n            </Tabs>\n          </div>\n        )}\n      </section>\n    </PageContainer>\n  )\n}\n\nfunction ProjectHeader({\n  project,\n  tab\n}: {\n  project: Project\n  tab?: MarketplacePublicProjectDetailTab\n}) {\n  const ctx = useAgentic()\n\n  const pricingTabHref = `/marketplace/projects/${project.identifier}?tab=pricing`\n\n  return (\n    <>\n      {/* <MarketplacePublicProjectDetailNav\n        projectIdentifier={project.identifier}\n      /> */}\n\n      <div className='flex flex-col gap-2'>\n        <div className='w-full flex flex-row gap-2.5 items-center'>\n          <img\n            src={\n              project.lastPublishedDeployment?.iconUrl ||\n              project.user?.image ||\n              '/agentic-icon-circle-light.svg'\n            }\n            alt={project.name}\n            className='aspect-square w-10 h-10'\n          />\n\n          <h1 className='flex-1 font-semibold text-balance text-3xl leading-tight'>\n            {project.name}\n          </h1>\n\n          <HeroButton\n            heroVariant='orange'\n            className='justify-self-end'\n            disabled={tab === 'pricing' && !!ctx?.isAuthenticated}\n            asChild={tab !== 'pricing'}\n          >\n            <Link\n              href={\n                ctx?.isAuthenticated\n                  ? pricingTabHref\n                  : `/signup?${sanitizeSearchParams({ next: pricingTabHref })}`\n              }\n            >\n              Subscribe to {project.identifier}\n            </Link>\n          </HeroButton>\n        </div>\n\n        <div className='flex flex-row items-center'>\n          <div className='text-sm text-muted-foreground flex flex-row gap-0.5 items-center hover:no-underline! no-underline!'>\n            <span>{project.identifier}</span>\n\n            {/* TODO: <CopyIcon className='w-4 h-4' /> */}\n          </div>\n\n          {project.lastPublishedDeployment?.homepageUrl && (\n            <Button asChild variant='link'>\n              <Link\n                href={project.lastPublishedDeployment.homepageUrl}\n                className='text-sm flex flex-row gap-1.5! items-center text-muted-foreground! py-1! px-2!'\n                target='_blank'\n                rel='noopener noreferrer'\n              >\n                <ExternalLinkIcon className='w-4 h-4' />\n\n                <span>Homepage</span>\n              </Link>\n            </Button>\n          )}\n\n          {project.lastPublishedDeployment?.sourceUrl && (\n            <Button asChild variant='link'>\n              <Link\n                href={project.lastPublishedDeployment.sourceUrl}\n                className='text-sm flex flex-row gap-1.5! items-center text-muted-foreground! py-1! px-2!'\n                target='_blank'\n                rel='noopener noreferrer'\n              >\n                <GitHubIcon className='w-4 h-4' />\n\n                <span>GitHub</span>\n              </Link>\n            </Button>\n          )}\n        </div>\n      </div>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/marketplace/projects/[namespace]/[project-slug]/page.tsx",
    "content": "import { parseProjectIdentifier } from '@agentic/platform-validators'\nimport {\n  dehydrate,\n  HydrationBoundary,\n  QueryClient\n} from '@tanstack/react-query'\nimport { notFound } from 'next/navigation'\n\nimport { defaultAgenticApiClient } from '@/lib/default-agentic-api-client'\nimport { toastError } from '@/lib/notifications'\n\nimport { MarketplacePublicProjectDetail } from './marketplace-public-project-detail'\n\nexport default async function MarketplacePublicProjectDetailPage({\n  params\n}: {\n  params: Promise<{\n    namespace: string\n    'project-slug': string\n  }>\n}) {\n  const { namespace: rawNamespace, 'project-slug': rawProjectSlug } =\n    await params\n\n  let projectIdentifier: string\n  try {\n    const namespace = decodeURIComponent(rawNamespace)\n    const projectSlug = decodeURIComponent(rawProjectSlug)\n\n    const parsedProjectIdentifier = parseProjectIdentifier(\n      `${namespace}/${projectSlug}`,\n      { strict: true }\n    )\n    projectIdentifier = parsedProjectIdentifier.projectIdentifier\n  } catch (err: any) {\n    void toastError(err, { label: 'Invalid project identifier' })\n\n    return notFound()\n  }\n\n  const queryClient = new QueryClient()\n\n  await queryClient.prefetchQuery({\n    queryKey: ['public-project', projectIdentifier],\n    queryFn: () =>\n      defaultAgenticApiClient.getPublicProjectByIdentifier({\n        projectIdentifier,\n        populate: ['lastPublishedDeployment']\n      })\n  })\n\n  return (\n    <HydrationBoundary state={dehydrate(queryClient)}>\n      <MarketplacePublicProjectDetail projectIdentifier={projectIdentifier} />\n    </HydrationBoundary>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/marketplace/projects/[namespace]/[project-slug]/utils.ts",
    "content": "export const MAX_TOOLS_TO_SHOW = 5\nexport const marketplacePublicProjectDetailTabs = [\n  'overview',\n  'readme',\n  'tools',\n  'pricing',\n  'debug'\n] as const\nexport const marketplacePublicProjectDetailTabsSet = new Set(\n  marketplacePublicProjectDetailTabs\n)\nexport type MarketplacePublicProjectDetailTab =\n  (typeof marketplacePublicProjectDetailTabs)[number]\n"
  },
  {
    "path": "apps/web/src/app/not-found.tsx",
    "content": "import { ArrowLeft } from 'lucide-react'\nimport Image from 'next/image'\nimport Link from 'next/link'\n\nimport { Button } from '@/components/ui/button'\n// https://images.unsplash.com/photo-1545972154-9bb223aac798?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&fm=jpg&fit=crop&w=2048&q=80&exp=8&con=-15&sat=-75\nimport NotFoundImage from '@/public/not-found.jpg'\n\nexport default function NotFound() {\n  return (\n    <>\n      <section className='relative max-w-2xl isolate min-h-full flex-auto'>\n        <Image\n          alt='404 not found'\n          src={NotFoundImage.src}\n          width={NotFoundImage.width}\n          height={NotFoundImage.height}\n          blurDataURL={NotFoundImage.blurDataURL}\n          placeholder='blur'\n          priority\n          className='absolute inset-0 -z-10 size-full object-cover object-top rounded-xl'\n        />\n\n        <div className='mx-auto max-w-7xl px-6 py-32 text-center sm:py-40 lg:px-8'>\n          <p className='text-base/8 font-semibold text-white'>404</p>\n\n          <h1 className='mt-4 text-balance text-5xl font-semibold tracking-tight text-white sm:text-7xl'>\n            Page not found\n          </h1>\n\n          <p className='mt-6 text-pretty text-lg font-medium text-white/70 sm:text-xl/8'>\n            Sorry, we couldn’t find the page you’re looking for.\n          </p>\n        </div>\n      </section>\n\n      <Button asChild>\n        <Link href='/'>\n          <ArrowLeft\n            aria-hidden='true'\n            className='inline-block w-[1.2em] h-[1.2em] mr-1'\n          />\n          Back to home\n        </Link>\n      </Button>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/page.tsx",
    "content": "import Link from 'next/link'\n\nimport { DemandSideCTA } from '@/components/demand-side-cta'\nimport { DotsSection } from '@/components/dots-section'\nimport { ExampleUsageSection } from '@/components/example-usage-section'\nimport { GitHubStarCounter } from '@/components/github-star-counter'\nimport { HeroSimulation2 } from '@/components/hero-simulation-2'\nimport { MCPMarketplaceFeatures } from '@/components/mcp-marketplace-features'\nimport { PageContainer } from '@/components/page-container'\nimport { SupplySideCTA } from '@/components/supply-side-cta'\nimport { githubUrl, twitterUrl } from '@/lib/config'\n\nexport default async function TheBestDamnLandingPageEver() {\n  return (\n    <PageContainer>\n      {/* Hero section */}\n      <section className='flex flex-col gap-10 mb-16'>\n        <h1 className='text-center text-balance leading-snug md:leading-none text-4xl font-semibold'>\n          The App Store for LLM Tools\n        </h1>\n\n        <h5 className='text-center text-lg max-w-2xl'>\n          Agentic is a curated marketplace of LLM tools that work with every\n          major LLM SDK and MCP client.\n        </h5>\n\n        <DemandSideCTA />\n      </section>\n\n      {/* Example usage section */}\n      <ExampleUsageSection />\n\n      {/* Features section */}\n      <section className='flex flex-col items-center gap-8 text-center mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Agentic tools are{' '}\n          <span className='font-semibold'>optimized for LLMs</span>\n        </h2>\n\n        <MCPMarketplaceFeatures />\n      </section>\n\n      {/* MCP section */}\n      <section className='flex flex-col items-center gap-8 text-center mb-16 max-w-2xl'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Agentic makes <span className='font-semibold'>MCP fun!</span>\n        </h2>\n\n        <div className='h-96 w-full rounded-lg overflow-hidden shadow-sm'>\n          <HeroSimulation2 />\n        </div>\n\n        <p className='italic font-semibold'>\n          Agentic's mission is to provide the world's best library of tools for\n          AI agents.\n        </p>\n\n        <p>\n          <Link\n            href='https://docs.agentic.so/publishing/quickstart'\n            className='link'\n          >\n            And of course, <span className='font-semibold'>MCP</span> is an\n            integral part of that mission. We're working on a bunch of features\n            designed to simplify advanced MCP use cases like bundling multiple\n            tools, shared auth profiles, Vercel-like preview deployments, and a\n            lot more...\n          </Link>\n        </p>\n      </section>\n\n      {/* CTA section */}\n      <DotsSection className='flex flex-col gap-12 mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Publish your own MCP products with Agentic\n        </h2>\n\n        <h5 className='text-center max-w-2xl'>\n          Run one command to turn any MCP server or OpenAPI service into a paid\n          MCP product. With built-in support for every major LLM SDK and MCP\n          client.\n        </h5>\n\n        <SupplySideCTA variant='docs' />\n      </DotsSection>\n\n      {/* Open source section */}\n      <section className='flex flex-col items-center gap-8 max-w-2xl text-center mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Agentic is 100% Open Source\n        </h2>\n\n        <p className=''>\n          Agentic is a fully OSS{' '}\n          <span className='font-semibold'>TypeScript</span> project with a small\n          but vibrant developer community.{' '}\n          <Link\n            href={githubUrl}\n            target='_blank'\n            rel='noopener'\n            className='link'\n          >\n            Check out the source on GitHub\n          </Link>{' '}\n          or{' '}\n          <Link\n            href={twitterUrl}\n            target='_blank'\n            rel='noopener'\n            className='link'\n          >\n            ping me on Twitter with questions / feedback\n          </Link>\n          .\n        </p>\n\n        <GitHubStarCounter />\n      </section>\n\n      {/* Social proof section (TODO) */}\n      {/* <section className='gap-8 mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          TODO: social proof\n        </h2>\n\n        <p className='text-center text-lg max-w-2xl'>TODO</p>\n      </section> */}\n\n      {/* Demand-side CTA section */}\n      <DotsSection className='flex flex-col gap-12 mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Level up your AI Agents with the best tools\n        </h2>\n\n        <DemandSideCTA />\n      </DotsSection>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/pricing/page.tsx",
    "content": "import Link from 'next/link'\n\nimport { DotsSection } from '@/components/dots-section'\nimport { GitHubStarCounter } from '@/components/github-star-counter'\nimport { HeroButton } from '@/components/hero-button'\nimport { PageContainer } from '@/components/page-container'\nimport { Button } from '@/components/ui/button'\nimport { calendarBookingUrl, emailUrl, twitterUrl } from '@/lib/config'\n\nexport default function AboutPage() {\n  return (\n    <PageContainer className='gap-12'>\n      <h1 className='text-center text-balance leading-snug md:leading-none text-4xl font-semibold'>\n        Pricing\n      </h1>\n\n      <div className='grid grid-cols-1 rounded-[2rem] shadow-[inset_0_0_2px_1px_#ffffff4d] ring-1 ring-black/5 max-lg:mx-auto max-lg:w-full max-lg:max-w-md max-w-lg'>\n        <div className='grid grid-cols-1 rounded-[2rem] p-2 shadow-md shadow-black/5'>\n          <div className='rounded-3xl bg-background p-8 pb-9 shadow-2xl ring-1 ring-black/5 flex flex-col gap-4'>\n            <p>\n              Pricing for devs publishing products on Agentic is a work in\n              progress. We're looking for early adopters to work with us to\n              figure out the best pricing structure.\n            </p>\n\n            <p>\n              If you're interested in publishing a product on Agentic, please\n              get in touch.\n            </p>\n          </div>\n        </div>\n      </div>\n\n      {/* CTA section */}\n      <DotsSection className='max-w-2xl'>\n        <div className='relative grid grid-cols-1 sm:grid-cols-2 gap-8'>\n          <HeroButton asChild heroVariant='orange'>\n            <Link href={twitterUrl} target='_blank' rel='noopener'>\n              DM me on Twitter / X\n            </Link>\n          </HeroButton>\n\n          <Button asChild variant='outline' className='h-full py-[9px]'>\n            <Link href={emailUrl}>Send me an email</Link>\n          </Button>\n\n          <Button asChild variant='outline' className='h-full py-[9px]'>\n            <Link href={calendarBookingUrl} target='_blank' rel='noopener'>\n              Book a call with me\n            </Link>\n          </Button>\n\n          <GitHubStarCounter className='h-full py-[9px]' />\n        </div>\n      </DotsSection>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/privacy/page.tsx",
    "content": "import Link from 'next/link'\n\nimport { Markdown } from '@/components/markdown'\nimport { PageContainer } from '@/components/page-container'\n\nconst lastUpdatedDate = 'June 30, 2025'\n\nexport default function AboutPage() {\n  return (\n    <PageContainer>\n      <h1 className='text-center text-balance leading-snug md:leading-none text-4xl font-semibold'>\n        Privacy Policy\n      </h1>\n\n      <section>\n        <Markdown>\n          <p>\n            <em>Last updated: {lastUpdatedDate}</em>\n          </p>\n\n          <h2>1. Overview</h2>\n          <p>\n            Agentic Systems, Inc. (<strong>\"Agentic\"</strong>,{' '}\n            <strong>\"we\"</strong>,<strong>\"us\"</strong>, or{' '}\n            <strong>\"our\"</strong>) provides a modern AI platform comprised of:\n          </p>\n\n          <ul>\n            <li>\n              <strong>Marketplace</strong> – a curated directory of LLM-powered\n              tool products that can be called via the Model Context Protocol\n              (\"MCP\") or standard HTTP&nbsp;APIs.\n            </li>\n\n            <li>\n              <strong>Gateway</strong> – a fully-managed MCP gateway that allows\n              developers to deploy, monetize, and optionally publish their own\n              MCP or OpenAPI products.\n            </li>\n\n            <li>\n              <strong>Open-Source Project</strong> – the Agentic\n              source-available codebase released under the GNU&nbsp;AGPL-3.0\n              license.\n            </li>\n          </ul>\n\n          <p>\n            This Privacy Policy explains how we collect, use, disclose, and\n            safeguard information in connection with the Agentic website,\n            console, Marketplace, Gateway, and any related services\n            (collectively, the <strong>\"Service\"</strong>).\n          </p>\n\n          <h2>2. Information We Collect</h2>\n          <p>\n            We collect the following categories of information when you use the\n            Service:\n          </p>\n\n          <ul>\n            <li>\n              <strong>Account Information</strong>: name, email, billing\n              address, and authentication credentials that you provide when you\n              create an Agentic account.\n            </li>\n\n            <li>\n              <strong>Payment Information</strong>: payment method details\n              (e.g.&nbsp;card type and last four digits) processed by Stripe on\n              our behalf. Stripe's privacy practices are described in its own\n              policy.\n            </li>\n\n            <li>\n              <strong>Usage Data</strong>: log files, API request metadata, IP\n              address, browser type, referring pages, and other diagnostic\n              information automatically collected when you interact with the\n              Service.\n            </li>\n\n            <li>\n              <strong>Developer Content</strong>: API specifications,\n              configuration, and other content that you upload to the Gateway or\n              Marketplace.\n            </li>\n\n            <li>\n              <strong>Cookies &amp; Similar Technologies</strong>: small data\n              files placed on your device to enable site functionality,\n              analytics, and preference storage. You can disable cookies in your\n              browser settings, but parts of the Service may not function\n              properly.\n            </li>\n          </ul>\n\n          <h2>3. How We Use Information</h2>\n          <p>We use the information we collect to:</p>\n\n          <ul>\n            <li>Provide, maintain, and improve the Service;</li>\n\n            <li>\n              Facilitate Marketplace and Gateway transactions, including billing\n              through Stripe;\n            </li>\n\n            <li>Authenticate users and secure the Service;</li>\n\n            <li>\n              Monitor usage and detect, prevent, or address technical issues or\n              fraudulent activity;\n            </li>\n\n            <li>\n              Respond to inquiries, provide customer support, and send\n              administrative messages;\n            </li>\n\n            <li>\n              Send product updates, promotional communications, or other\n              information that may be of interest to you (you may opt out at any\n              time);\n            </li>\n\n            <li>Carry out research, analytics, and product development;</li>\n\n            <li>\n              Comply with legal obligations and enforce our Terms of Service.\n            </li>\n          </ul>\n\n          <h2>4. Sharing &amp; Disclosure</h2>\n          <p>We may share information as follows:</p>\n\n          <ul>\n            <li>\n              <strong>Service Providers</strong>: with vendors who perform\n              services on our behalf, such as hosting, analytics, and payment\n              processing.\n            </li>\n\n            <li>\n              <strong>API Providers &amp; Consumers</strong>: Marketplace\n              product owners may receive usage metrics related to their own\n              products; conversely, when you list a product we may display your\n              developer profile to potential consumers.\n            </li>\n\n            <li>\n              <strong>Business Transfers</strong>: as part of a merger,\n              acquisition, financing, or sale of assets.\n            </li>\n\n            <li>\n              <strong>Affiliates</strong>: with our corporate affiliates who are\n              bound to honor this policy.\n            </li>\n\n            <li>\n              <strong>Legal Requirements</strong>: when required to comply with\n              law or protect the rights, property, or safety of Agentic, our\n              users, or the public.\n            </li>\n\n            <li>\n              <strong>With Your Consent</strong>: in any other situation where\n              you direct us to share the information.\n            </li>\n          </ul>\n\n          <h2>5. Payments via Stripe</h2>\n          <p>\n            All Marketplace purchases and Gateway subscription fees are\n            processed by Stripe. Agentic does not store full payment-card\n            numbers or CVC codes. Stripe acts as a separate controller of your\n            payment information – please review the{' '}\n            <a\n              href='https://stripe.com/privacy'\n              target='_blank'\n              rel='noopener noreferrer'\n            >\n              Stripe&nbsp;Privacy&nbsp;Policy\n            </a>{' '}\n            for details.\n          </p>\n\n          <h2>6. Data Retention</h2>\n          <p>\n            We retain information for as long as necessary to fulfill the\n            purposes described in this Policy, comply with our legal\n            obligations, resolve disputes, and enforce our agreements. Log data\n            is typically retained for no more than 18&nbsp;months unless we are\n            legally required to keep it longer.\n          </p>\n\n          <h2>7. International Transfers</h2>\n          <p>\n            We are a U.S.-based company and may process information in the\n            United States and other countries where we or our service providers\n            operate. We rely on appropriate safeguards, such as Standard\n            Contractual Clauses, for the transfer of personal data from the\n            EU/EEA, UK, and Switzerland.\n          </p>\n\n          <h2>8. Security</h2>\n          <p>\n            We employ technical and organizational measures designed to protect\n            information against loss, misuse, and unauthorized access or\n            disclosure. However, no system can be guaranteed to be 100% secure.\n          </p>\n\n          <h2>9. Your Rights</h2>\n          <p>\n            Depending on your jurisdiction, you may have rights to access,\n            rectify, delete, restrict, or object to our processing of your\n            personal information, as well as the right to data portability and\n            to withdraw consent. To exercise these rights, please contact us as\n            set forth below. We respond to all requests consistent with\n            applicable law.\n          </p>\n\n          <h2>10. Children's Privacy</h2>\n          <p>\n            The Service is not directed to children under 13, and we do not\n            knowingly collect personal information from children. If you believe\n            a child has provided us with personal information, please contact us\n            and we will take steps to delete such information.\n          </p>\n\n          <h2>11. Third-Party Links</h2>\n          <p>\n            The Service may contain links to third-party websites. We are not\n            responsible for the privacy practices of those sites. We encourage\n            you to review the privacy policies of every site you visit.\n          </p>\n\n          <h2>12. Changes to This Policy</h2>\n          <p>\n            We may update this Privacy Policy from time to time. We will post\n            the revised version on this page and indicate the date of the latest\n            revision at the top. If changes are material, we will provide\n            additional notice (e.g., email or in-app alert) at least 7&nbsp;days\n            before they take effect.\n          </p>\n\n          <h2>13. Contact Us</h2>\n          <p>\n            If you have any questions or concerns about this Privacy Policy or\n            our privacy practices, please{' '}\n            <Link href='/contact'>contact us</Link> or email us at{' '}\n            <a href='mailto:support@agentic.so'>support@agentic.so</a>.\n          </p>\n        </Markdown>\n      </section>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/providers.tsx",
    "content": "'use client'\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools'\n\nimport { AgenticProvider } from '@/components/agentic-provider'\nimport { PostHogProvider } from '@/components/posthog-provider'\nimport { ThemeProvider } from '@/components/theme-provider'\nimport { TooltipProvider } from '@/components/ui/tooltip'\nimport { isServer } from '@/lib/config'\n\nfunction createQueryClient() {\n  return new QueryClient({\n    defaultOptions: {\n      queries: {\n        staleTime: 60 * 1000\n      }\n    }\n  })\n}\n\nlet browserQueryClient: QueryClient | undefined\n\nfunction getQueryClient(): QueryClient {\n  if (isServer) {\n    // Server: always make a new query client\n    return createQueryClient()\n  } else {\n    // Browser: make a new query client if we don't already have one\n    // This is very important, so we don't re-make a new client if React\n    // suspends during the initial render. This may not be needed if we\n    // have a suspense boundary BELOW the creation of the query client\n    if (!browserQueryClient) {\n      browserQueryClient = createQueryClient()\n    }\n\n    return browserQueryClient\n  }\n}\n\nexport default function Providers({ children }: { children: React.ReactNode }) {\n  const queryClient = getQueryClient()\n\n  return (\n    <PostHogProvider>\n      <AgenticProvider>\n        <ThemeProvider\n          attribute='class'\n          defaultTheme='dark'\n          disableTransitionOnChange\n        >\n          <QueryClientProvider client={queryClient}>\n            <TooltipProvider>{children}</TooltipProvider>\n\n            <ReactQueryDevtools />\n          </QueryClientProvider>\n        </ThemeProvider>\n      </AgenticProvider>\n    </PostHogProvider>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/publishing/page.tsx",
    "content": "import Image from 'next/image'\nimport Link from 'next/link'\nimport Zoom from 'react-medium-image-zoom'\n\nimport { DotsSection } from '@/components/dots-section'\nimport { ExampleUsageSection } from '@/components/example-usage-section'\nimport { GitHubStarCounter } from '@/components/github-star-counter'\nimport { MCPGatewayFeatures } from '@/components/mcp-gateway-features'\nimport { PageContainer } from '@/components/page-container'\nimport { SupplySideCTA } from '@/components/supply-side-cta'\nimport { githubUrl, twitterUrl } from '@/lib/config'\nimport mcpGatewayDemo from '@/public/agentic-mcp-gateway-mvp-diagram-light.png'\n\nexport default function PublishingMCPsPage() {\n  return (\n    <PageContainer>\n      {/* Hero section */}\n      <section className='flex flex-col gap-8 mb-16'>\n        <h1 className='text-center text-balance leading-snug md:leading-none text-4xl font-semibold'>\n          Your API → Paid MCP, Instantly\n        </h1>\n\n        <h5 className='text-center text-lg max-w-2xl'>\n          Run one command to turn any MCP server or OpenAPI service into a paid\n          MCP product. With built-in support for every major LLM SDK and MCP\n          client.\n        </h5>\n\n        <SupplySideCTA />\n      </section>\n\n      {/* How it works section */}\n      <section className='flex flex-col gap-8 mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          How It Works\n        </h2>\n\n        <div className='w-full max-w-3xl flex flex-col items-center border rounded-lg shadow-sm overflow-hidden p-4 bg-white'>\n          <Zoom>\n            <Image\n              src={mcpGatewayDemo.src}\n              alt='MCP Gateway Demo'\n              width={mcpGatewayDemo.width}\n              height={mcpGatewayDemo.height}\n              blurDataURL={mcpGatewayDemo.blurDataURL}\n              placeholder='blur'\n              className='w-full rounded-lg overflow-hidden'\n            />\n          </Zoom>\n        </div>\n\n        <p className='text-sm max-w-2xl text-center'>\n          <Link href='https://docs.agentic.so/publishing' className='link'>\n            Deploy any MCP server or OpenAPI service to Agentic's MCP Gateway,\n            which handles auth, billing, rate-limiting, caching, etc. And\n            instantly turn your API into a paid MCP product that supports every\n            major LLM SDK and MCP client.\n          </Link>\n        </p>\n      </section>\n\n      {/* Example usage section */}\n      <ExampleUsageSection />\n\n      {/* Features section */}\n      <section className='flex flex-col gap-8 md:gap-12 mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Production-Ready MCP Gateway\n        </h2>\n\n        <MCPGatewayFeatures />\n      </section>\n\n      {/* Open source section */}\n      <section className='flex flex-col items-center gap-8 max-w-2xl text-center mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Agentic is 100% Open Source\n        </h2>\n\n        <p className=''>\n          Agentic is a fully OSS{' '}\n          <span className='font-semibold'>TypeScript</span> project with a small\n          but vibrant developer community.{' '}\n          <Link\n            href={githubUrl}\n            target='_blank'\n            rel='noopener'\n            className='link'\n          >\n            Check out the source on GitHub\n          </Link>{' '}\n          or{' '}\n          <Link\n            href={twitterUrl}\n            target='_blank'\n            rel='noopener'\n            className='link'\n          >\n            ping me on Twitter with questions / feedback\n          </Link>\n          .\n        </p>\n\n        <GitHubStarCounter />\n      </section>\n\n      {/* CTA section */}\n      <DotsSection className='flex flex-col gap-12 mb-16'>\n        <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n          Deploy Your MCP Today\n        </h2>\n\n        <SupplySideCTA variant='github-2' />\n      </DotsSection>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/signup/page.tsx",
    "content": "import { Suspense } from 'react'\n\nimport { PageContainer } from '@/components/page-container'\n\nimport { SignupForm } from './signup-form'\n\nexport default function Page() {\n  return (\n    <Suspense>\n      <PageContainer>\n        <SignupForm />\n      </PageContainer>\n    </Suspense>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/signup/signup-form.tsx",
    "content": "'use client'\n\nimport { sanitizeSearchParams } from '@agentic/platform-core'\nimport {\n  isValidEmail,\n  isValidPassword,\n  isValidUsername\n} from '@agentic/platform-validators'\nimport { useForm } from '@tanstack/react-form'\nimport { Loader2Icon } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\nimport { useCallback, useState } from 'react'\nimport { z } from 'zod'\n\nimport {\n  useNextUrl,\n  useUnauthenticatedAgentic\n} from '@/components/agentic-provider'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { GitHubIcon } from '@/icons/github'\nimport { toastError } from '@/lib/notifications'\nimport { cn } from '@/lib/utils'\n\nexport function SignupForm() {\n  const ctx = useUnauthenticatedAgentic()\n  const nextUrl = useNextUrl()\n  const router = useRouter()\n  const [isGitHubLoading, setIsGitHubLoading] = useState(false)\n\n  const onAuthWithGitHub = useCallback(async () => {\n    setIsGitHubLoading(true)\n    try {\n      const redirectUri = `${globalThis.location.origin}/auth/github/success?${sanitizeSearchParams({ next: nextUrl }).toString()}`\n      const url = await ctx!.api.initAuthFlowWithGitHub({ redirectUri })\n\n      return router.push(url)\n    } catch (err: any) {\n      setIsGitHubLoading(false)\n      void toastError(err, { label: 'GitHub auth error' })\n    }\n  }, [ctx, nextUrl, router])\n\n  const form = useForm({\n    defaultValues: {\n      email: '',\n      username: '',\n      password: '',\n      repeat: ''\n    },\n    validators: {\n      onChange: z.object({\n        email: z\n          .string()\n          .email()\n          .refine((email) => isValidEmail(email)),\n        username: z.string().refine((username) => isValidUsername(username)),\n        password: z.string().refine((password) => isValidPassword(password)),\n        repeat: z.string().refine((password) => isValidPassword(password))\n      })\n    },\n    onSubmit: async ({ value }) => {\n      try {\n        if (value.password !== value.repeat) {\n          void toastError('Passwords do not match', { label: 'signup error' })\n          return\n        }\n\n        const res = await ctx!.api.signUpWithPassword({\n          email: value.email,\n          username: value.username,\n          password: value.password\n        })\n\n        console.log('signup success', res)\n      } catch (err: any) {\n        void toastError(err, { label: 'signup error' })\n        return\n      }\n\n      return router.push(nextUrl || '/app')\n    }\n  })\n\n  return (\n    <section className='flex-1'>\n      <div className='flex flex-col flex-1 items-center justify-center w-full max-w-xs gap-6'>\n        <form\n          className={cn('flex flex-col gap-6 w-full')}\n          onSubmit={(e) => {\n            e.preventDefault()\n            void form.handleSubmit()\n          }}\n        >\n          <div className='flex flex-col items-center gap-2 text-center'>\n            <h1 className='text-2xl font-bold'>Create an account</h1>\n          </div>\n\n          <div className='grid gap-6'>\n            <form.Field\n              name='email'\n              children={(field) => (\n                <div className='grid gap-3'>\n                  <Label htmlFor={field.name}>Email</Label>\n\n                  <Input\n                    id={field.name}\n                    name={field.name}\n                    type='email'\n                    required\n                    placeholder='Email'\n                    autoComplete='email'\n                    autoFocus={true}\n                    value={field.state.value}\n                    onBlur={field.handleBlur}\n                    onChange={(e: any) => field.handleChange(e.target.value)}\n                  />\n                </div>\n              )}\n            />\n\n            <form.Field\n              name='username'\n              children={(field) => (\n                <div className='grid gap-3'>\n                  <Label htmlFor={field.name}>Username</Label>\n\n                  <Input\n                    id={field.name}\n                    name={field.name}\n                    type='text'\n                    required\n                    placeholder='Username'\n                    autoComplete='username'\n                    value={field.state.value}\n                    onBlur={field.handleBlur}\n                    onChange={(e: any) => field.handleChange(e.target.value)}\n                  />\n                </div>\n              )}\n            />\n\n            <form.Field\n              name='password'\n              children={(field) => (\n                <div className='grid gap-3'>\n                  <Label htmlFor={field.name}>Password</Label>\n\n                  <Input\n                    id={field.name}\n                    name={field.name}\n                    type='password'\n                    required\n                    placeholder='Password'\n                    // autoFocus={error?.type === 'invalid_password'}\n                    autoComplete='new-password'\n                    value={field.state.value}\n                    onBlur={field.handleBlur}\n                    onChange={(e) => field.handleChange(e.target.value)}\n                  />\n                </div>\n              )}\n            />\n\n            <form.Field\n              name='repeat'\n              children={(field) => (\n                <div className='grid gap-3'>\n                  <Label htmlFor={field.name}>Repeat password</Label>\n\n                  <Input\n                    id={field.name}\n                    name={field.name}\n                    type='password'\n                    required\n                    placeholder='Password'\n                    autoComplete='new-password'\n                    value={field.state.value}\n                    onBlur={field.handleBlur}\n                    onChange={(e) => field.handleChange(e.target.value)}\n                  />\n                </div>\n              )}\n            />\n\n            <form.Subscribe\n              selector={(state) => [\n                state.canSubmit,\n                state.isSubmitting,\n                state.isTouched\n              ]}\n              children={([canSubmit, isSubmitting, isTouched]) => (\n                <Button\n                  type='submit'\n                  disabled={!(isTouched && canSubmit && ctx)}\n                  className='w-full'\n                >\n                  {isSubmitting && <Loader2Icon className='animate-spin' />}\n                  <span>Sign up</span>\n                </Button>\n              )}\n            />\n          </div>\n        </form>\n\n        <div className='flex items-center gap-2 text-center text-sm w-full'>\n          <div className='border-border border-t inset-0 flex-1' />\n          <div className='text-muted-foreground'>Or continue with</div>\n          <div className='border-border border-t inset-0 flex-1' />\n        </div>\n\n        <form\n          className='w-full'\n          onSubmit={(e) => {\n            e.preventDefault()\n            void onAuthWithGitHub()\n          }}\n        >\n          <Button\n            type='submit'\n            variant='outline'\n            className='w-full'\n            disabled={isGitHubLoading || !ctx}\n          >\n            {isGitHubLoading && <Loader2Icon className='animate-spin' />}\n            <GitHubIcon />\n\n            <span>Sign up with GitHub</span>\n          </Button>\n        </form>\n\n        <div className='text-center text-xs'>\n          Already have an account?{' '}\n          <a\n            href={`/login?${sanitizeSearchParams({ next: nextUrl }).toString()}`}\n            className='underline underline-offset-4'\n          >\n            Login\n          </a>\n        </div>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/app/terms/page.tsx",
    "content": "import Link from 'next/link'\n\nimport { Markdown } from '@/components/markdown'\nimport { PageContainer } from '@/components/page-container'\n\nconst lastUpdatedDate = 'June 30, 2025'\n\nexport default function AboutPage() {\n  return (\n    <PageContainer>\n      <h1 className='text-center text-balance leading-snug md:leading-none text-4xl font-semibold'>\n        Terms of Service\n      </h1>\n\n      <section>\n        <Markdown>\n          <p>\n            <em>Last updated: {lastUpdatedDate}</em>\n          </p>\n\n          <h2>1. Introduction</h2>\n          <p>\n            These Terms of Service (<strong>\"Terms\"</strong>) govern your access\n            to and use of Agentic Systems, Inc.'s websites, software, and\n            related services (collectively, the <strong>\"Service\"</strong>).\n            Agentic (<strong>\"Agentic,\" \"we,\" \"us,\"</strong> or{' '}\n            <strong>\"our\"</strong>) provides three distinct but connected\n            offerings:\n          </p>\n\n          <p>\n            <strong>(a) Agentic Marketplace</strong> – A curated app store of\n            LLM tool products exposed via both Model Context Protocol (MCP) and\n            standard HTTP&nbsp;APIs.\n          </p>\n\n          <p>\n            <strong>(b) Agentic Gateway</strong> – A fully managed MCP gateway\n            that enables developers to deploy and monetize their own MCP or\n            OpenAPI products, whether privately or publicly.\n          </p>\n\n          <p>\n            <strong>(c) Agentic Open-Source Project</strong> – The\n            source-available software released under the GNU&nbsp;AGPL-3.0\n            license.\n          </p>\n\n          <p>\n            By creating an account, clicking \"I&nbsp;agree,\" or otherwise using\n            any part of the Service, you acknowledge that you have read,\n            understood, and agree to be legally bound by these Terms. If you do\n            not agree, you must not access or use the Service.\n          </p>\n\n          <h2>2. Eligibility &amp; Account Registration</h2>\n          <p>\n            You must be at least 18&nbsp;years old and legally capable of\n            entering into contracts to use the Service. When you register an\n            Agentic account you agree to (i) provide accurate, current, and\n            complete information; (ii) maintain the security of your\n            credentials; and (iii) promptly update your information as\n            necessary. You are responsible for all activity occurring under your\n            account.\n          </p>\n\n          <h2>3. Plans, Subscriptions &amp; Fees</h2>\n          <p>\n            Pricing for Marketplace purchases and Gateway subscriptions is\n            described on the applicable order page or pricing dashboard. All\n            charges are processed by Stripe and are due within the payment\n            period stated at checkout. Except as required by law, payments are\n            non-refundable. We may modify our pricing with at least&nbsp;30\n            days' notice, which will take effect in your next billing cycle.\n            Developers publishing products to the Agentic Marketplace must also\n            agree to the{' '}\n            <a\n              href='https://stripe.com/legal/connect-account'\n              target='_blank'\n              rel='noopener noreferrer'\n            >\n              Stripe Connect Account Agreement\n            </a>\n            .\n          </p>\n\n          <h2>4. Marketplace-Specific Terms</h2>\n          <p>\n            (a) <strong>API Consumers.</strong> When you purchase access to a\n            product in the Marketplace you receive a non-exclusive,\n            non-transferable, revocable license to call that API subject to any\n            usage limits and other terms displayed on the product page.\n          </p>\n\n          <p>\n            (b) <strong>API Providers.</strong> If you list a product in the\n            Marketplace you (i) represent that you have all rights necessary to\n            offer the product; (ii) grant each purchaser the license described\n            above; and (iii) authorize Agentic to collect payments on your\n            behalf and remit amounts owed to you, less any platform fees.\n          </p>\n\n          <h2>5. Gateway-Specific Terms</h2>\n          <p>\n            You may deploy private or public APIs through the Gateway. You are\n            solely responsible for the security, legality, and performance of\n            the APIs you deploy. If you enable billing, you appoint Agentic as\n            your limited payments collection agent for the purpose of accepting\n            payments from end users via Stripe.\n          </p>\n\n          <h2>6. Open-Source Project</h2>\n          <p>\n            The Agentic open-source codebase is licensed under the{' '}\n            <Link\n              href='https://github.com/transitive-bullshit/agentic/blob/main/license'\n              className='link'\n              target='_blank'\n              rel='noopener noreferrer'\n            >\n              GNU&nbsp;AGPL-3.0 license\n            </Link>\n            . Your use of the open-source project is governed solely by that\n            license. Nothing in these Terms will be interpreted to limit your\n            rights granted under the AGPL-3.0, nor to grant additional rights\n            beyond it.\n          </p>\n\n          <h2>7. User Content</h2>\n          <p>\n            \"<strong>User Content</strong>\" means any code, text, data, or other\n            materials you upload to the Service, including APIs, metadata, and\n            documentation. You retain all ownership rights in your User Content.\n            You hereby grant Agentic a worldwide, non-exclusive, royalty-free\n            license to host, cache, reproduce, display, perform, modify (solely\n            for technical purposes, e.g.&nbsp;formatting), and distribute your\n            User Content as necessary to operate and improve the Service. You\n            are solely responsible for your User Content and represent that you\n            have all rights necessary to grant this license and that your User\n            Content does not violate any law or third-party rights.\n          </p>\n\n          <h2>8. Acceptable Use Policy</h2>\n          <p>\n            You agree not to (i) violate applicable laws; (ii) infringe the\n            intellectual-property or privacy rights of others; (iii) transmit\n            malicious code; (iv) attempt to gain unauthorized access to the\n            Service; (v) interfere with the integrity or performance of the\n            Service; or (vi) send spam or engage in fraudulent or deceptive\n            practices. We may suspend or terminate accounts that violate this\n            policy.\n          </p>\n\n          <h2>9. Privacy &amp; Security</h2>\n          <p>\n            Our collection and use of personal information is described in our\n            <Link href='/privacy'>Privacy&nbsp;Policy</Link>. We implement\n            appropriate technical and organizational measures to safeguard your\n            data; however, no security measure is perfect and we cannot\n            guarantee absolute security.\n          </p>\n\n          <h2>10. Intellectual Property</h2>\n          <p>\n            The Service, including all associated software, content, and\n            trademarks, is owned by Agentic or its licensors and is protected by\n            intellectual-property laws. Except for the rights expressly granted\n            to you in these Terms, we reserve all rights, title, and interest in\n            the Service.\n          </p>\n\n          <h2>11. Suspension &amp; Termination</h2>\n          <p>\n            We may suspend or terminate your access to the Service at any time\n            if we believe you have violated these Terms or if necessary to\n            protect the Service or its users. Upon termination, your right to\n            use the Service will cease immediately, but Sections&nbsp;6–16 will\n            survive.\n          </p>\n\n          <h2>12. Disclaimers</h2>\n          <p>\n            THE SERVICE IS PROVIDED <strong>\"AS&nbsp;IS\"</strong> AND\n            <strong>\"AS&nbsp;AVAILABLE\"</strong> WITHOUT WARRANTY OF ANY KIND.\n            TO THE MAXIMUM EXTENT PERMITTED BY LAW, AGENTIC DISCLAIMS ALL\n            WARRANTIES, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE,\n            INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND\n            NON-INFRINGEMENT. WE DO NOT WARRANT THAT THE SERVICE WILL BE\n            UNINTERRUPTED, ERROR-FREE, OR SECURE.\n          </p>\n\n          <h2>13. Limitation of Liability</h2>\n          <p>\n            TO THE FULLEST EXTENT PERMITTED BY LAW, IN NO EVENT WILL AGENTIC BE\n            LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR\n            EXEMPLARY DAMAGES (INCLUDING LOSS OF PROFITS, GOODWILL, OR DATA)\n            ARISING OUT OF OR IN CONNECTION WITH THE SERVICE, EVEN IF ADVISED OF\n            THE POSSIBILITY OF SUCH DAMAGES. AGENTIC'S TOTAL LIABILITY UNDER\n            THESE TERMS WILL NOT EXCEED THE GREATER OF (A)&nbsp;FEES YOU PAID TO\n            AGENTIC IN THE&nbsp;12 MONTHS PRECEDING THE EVENT GIVING RISE TO THE\n            CLAIM OR (B)&nbsp;USD&nbsp;100.\n          </p>\n\n          <h2>14. Indemnification</h2>\n          <p>\n            You will indemnify and hold harmless Agentic and its officers,\n            directors, employees, and agents from and against any third-party\n            claims, damages, and expenses (including reasonable attorneys' fees)\n            arising out of or related to your (i) breach of these Terms, (ii)\n            User Content, or (iii) violation of any law or third-party rights.\n          </p>\n\n          <h2>15. Governing Law &amp; Venue</h2>\n          <p>\n            These Terms are governed by the laws of the State of Delaware,\n            excluding its conflict-of-laws rules. The state and federal courts\n            located in Wilmington, Delaware will have exclusive jurisdiction to\n            adjudicate any dispute arising out of or relating to these Terms or\n            the Service, and you consent to personal jurisdiction and venue in\n            those courts.\n          </p>\n\n          <h2>16. Changes to These Terms</h2>\n          <p>\n            We may update these Terms by posting a revised version on our\n            website and providing notice via email or in-app notification at\n            least&nbsp;7 days before the effective date. Continued use of the\n            Service after the effective date constitutes acceptance of the\n            revised Terms.\n          </p>\n\n          <h2>17. Contact</h2>\n          <p>\n            Questions or notices required under these Terms should be sent to\n            <a href='mailto:support@agentic.so'>support@agentic.so</a>. You may\n            also\n            <Link href='/contact'>contact&nbsp;us</Link> through our website.\n          </p>\n        </Markdown>\n      </section>\n    </PageContainer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/active-link.tsx",
    "content": "'use client'\n\nimport cs from 'clsx'\nimport Link, { type LinkProps } from 'next/link'\nimport { usePathname } from 'next/navigation'\nimport * as React from 'react'\n\ntype ActiveLinkProps = LinkProps & {\n  children?: React.ReactNode\n  className?: string\n  activeClassName?: string\n  style?: React.CSSProperties\n\n  // optional comparison function to normalize URLs before comparing\n  compare?: (a?: any, b?: any) => boolean\n}\n\n/**\n * Link that will be disabled if the target `href` is the same as the current\n * route's pathname.\n */\nexport const ActiveLink = React.forwardRef(function ActiveLink(\n  {\n    children,\n    href,\n    style,\n    className,\n    activeClassName,\n    onClick,\n    prefetch,\n    compare = (a, b) => a === b,\n    ...props\n  }: ActiveLinkProps,\n  ref\n) {\n  const pathname = usePathname()\n  const [disabled, setDisabled] = React.useState(false)\n\n  React.useEffect(() => {\n    const currentUrl = new URL(location.href)\n    const url = new URL(href as string, currentUrl)\n    const linkPathname = url.pathname\n    const linkOrigin = url.origin\n\n    setDisabled(\n      compare(linkPathname, pathname) && compare(linkOrigin, currentUrl.origin)\n    )\n  }, [pathname, href, compare])\n\n  const styleOverride = React.useMemo<React.CSSProperties>(\n    () =>\n      disabled\n        ? {\n            ...style,\n            pointerEvents: 'none'\n          }\n        : (style ?? {}),\n    [disabled, style]\n  )\n\n  const onClickOverride = React.useCallback(\n    (event: any): void => {\n      if (disabled) {\n        event.preventDefault()\n        return\n      }\n\n      if (onClick) {\n        onClick(event)\n        return\n      }\n    },\n    [disabled, onClick]\n  )\n\n  return (\n    <Link\n      {...props}\n      className={cs('cursor-pointer', className, disabled && activeClassName)}\n      href={href}\n      prefetch={disabled ? false : prefetch}\n      style={styleOverride}\n      onClick={onClickOverride}\n      ref={ref as any}\n    >\n      {children}\n    </Link>\n  )\n})\n"
  },
  {
    "path": "apps/web/src/components/agentic-provider.tsx",
    "content": "'use client'\n\nimport {\n  AgenticApiClient,\n  type AuthSession\n} from '@agentic/platform-api-client'\nimport { sanitizeSearchParams } from '@agentic/platform-core'\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation'\nimport {\n  createContext,\n  type ReactNode,\n  useCallback,\n  useContext,\n  useEffect,\n  useState\n} from 'react'\nimport { useLocalStorage } from 'react-use'\n\nimport * as config from '@/lib/config'\n\nexport type AgenticContextType = {\n  api: AgenticApiClient\n  isAuthenticated: boolean\n  logout: () => void\n}\n\nconst AgenticContext = createContext<AgenticContextType | undefined>(undefined)\n\nexport function AgenticProvider({ children }: { children: ReactNode }) {\n  const [authSession, setAuthSession] = useLocalStorage<AuthSession | null>(\n    'agentic-auth-session'\n  )\n\n  const logout = useCallback(() => {\n    setAuthSession(null)\n  }, [setAuthSession])\n\n  const onUpdateAuth = useCallback(\n    (updatedAuthSession?: AuthSession | null) => {\n      // console.log('onUpdateAuth', {\n      //   authSession: structuredClone(authSession),\n      //   updatedAuthSession: structuredClone(updatedAuthSession),\n      //   isCurrentlyAuthenticated: agenticContext.isAuthenticated\n      // })\n\n      if (\n        !!authSession !== !!updatedAuthSession ||\n        authSession?.token !== updatedAuthSession?.token ||\n        agenticContext.isAuthenticated !== !!updatedAuthSession\n      ) {\n        setAuthSession(updatedAuthSession)\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [authSession, setAuthSession]\n  )\n\n  const [agenticContext, setAgenticContext] = useState<AgenticContextType>({\n    api: new AgenticApiClient({\n      apiBaseUrl: config.apiBaseUrl,\n      onUpdateAuth\n    }),\n    isAuthenticated: !!authSession,\n    logout\n  })\n\n  useEffect(() => {\n    // console.log('updating session from localStorage', authSession?.token)\n    if (authSession) {\n      // console.log('setting auth session to truthy', {\n      //   authSession: structuredClone(authSession),\n      //   isAuthenticated: agenticContext.isAuthenticated,\n      //   setAgenticContext: !agenticContext.isAuthenticated\n      // })\n\n      agenticContext.api.authSession = authSession\n      if (!agenticContext.isAuthenticated) {\n        setAgenticContext({\n          ...agenticContext,\n          isAuthenticated: true\n        })\n      }\n    } else {\n      // console.log('setting auth session to falsy', {\n      //   authSession: structuredClone(authSession),\n      //   isAuthenticated: agenticContext.isAuthenticated,\n      //   setAgenticContext: !!agenticContext.isAuthenticated\n      // })\n\n      agenticContext.api.authSession = undefined\n\n      if (agenticContext.isAuthenticated) {\n        setAgenticContext({\n          ...agenticContext,\n          isAuthenticated: false\n        })\n      }\n    }\n  }, [agenticContext, authSession])\n\n  return (\n    <AgenticContext.Provider value={agenticContext}>\n      {children}\n    </AgenticContext.Provider>\n  )\n}\n\nexport function useAgentic(): AgenticContextType | undefined {\n  const ctx = useContext(AgenticContext)\n  const [isMounted, setIsMounted] = useState(false)\n\n  useEffect(() => {\n    if (!isMounted) {\n      setIsMounted(true)\n      return\n    }\n  }, [isMounted, setIsMounted])\n\n  if (!ctx) {\n    throw new Error('useAgentic must be used within an AgenticProvider')\n  }\n\n  return isMounted ? ctx : undefined\n}\n\nexport function useUnauthenticatedAgentic(): AgenticContextType | undefined {\n  const ctx = useAgentic()\n  const nextUrl = useNextUrl() || '/app'\n  const router = useRouter()\n\n  if (ctx && ctx.isAuthenticated) {\n    console.log('REQUIRES NO AUTHENTICATION: redirecting to', nextUrl)\n    void router.replace(nextUrl)\n    return\n  }\n\n  return ctx\n}\n\nexport function useAuthenticatedAgentic(): AgenticContextType | undefined {\n  const ctx = useAgentic()\n  const pathname = usePathname()\n  const router = useRouter()\n\n  if (ctx && !ctx.isAuthenticated) {\n    if (pathname === '/logout') {\n      console.log('LOGOUT SUCCESS: redirecting to /')\n      void router.replace('/')\n      return\n    }\n\n    console.log('REQUIRES AUTHENTICATION: redirecting to /login', {\n      next: pathname\n    })\n\n    void router.replace(\n      `/login?${sanitizeSearchParams({ next: pathname }).toString()}`\n    )\n    return\n  }\n\n  return ctx\n}\n\nexport function useNextUrl(): string | undefined {\n  const searchParams = useSearchParams()\n  const [isMounted, setIsMounted] = useState(false)\n\n  useEffect(() => {\n    if (!isMounted) {\n      setIsMounted(true)\n      return\n    }\n  }, [isMounted, setIsMounted])\n\n  return isMounted ? (searchParams.get('next') ?? undefined) : undefined\n}\n"
  },
  {
    "path": "apps/web/src/components/app-consumers-list.tsx",
    "content": "'use client'\n\nimport Link from 'next/link'\nimport useInfiniteScroll from 'react-infinite-scroll-hook'\n\nimport { useAuthenticatedAgentic } from '@/components/agentic-provider'\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { useInfiniteQuery } from '@/lib/query-client'\n\nexport function AppConsumersList() {\n  const ctx = useAuthenticatedAgentic()\n  const limit = 10\n  const {\n    data,\n    isLoading,\n    isError,\n    hasNextPage,\n    fetchNextPage,\n    isFetchingNextPage\n  } = useInfiniteQuery({\n    queryKey: ['consumers', ctx?.api.authSession?.user?.id],\n    queryFn: ({ pageParam = 0 }) =>\n      ctx!.api\n        .listConsumers({\n          populate: ['project'],\n          offset: pageParam,\n          limit\n        })\n        .then(async (consumers) => {\n          return {\n            consumers,\n            offset: pageParam,\n            limit,\n            nextOffset:\n              consumers.length >= limit\n                ? pageParam + consumers.length\n                : undefined\n          }\n        }),\n    getNextPageParam: (lastGroup) => lastGroup?.nextOffset,\n    enabled: !!ctx,\n    initialPageParam: 0\n  })\n\n  const [sentryRef] = useInfiniteScroll({\n    loading: isLoading || isFetchingNextPage,\n    hasNextPage,\n    onLoadMore: fetchNextPage,\n    disabled: !ctx || isError,\n    rootMargin: '0px 0px 200px 0px'\n  })\n\n  const consumers = data ? data.pages.flatMap((p) => p.consumers) : []\n  const numConsumers = consumers.length\n\n  return (\n    <>\n      {!ctx || isLoading ? (\n        <LoadingIndicator />\n      ) : (\n        <div className='mt-8'>\n          <h2 className='text-xl font-semibold mb-4'>Your Subscriptions</h2>\n\n          {isError ? (\n            <p>Error fetching customer subscriptions</p>\n          ) : !consumers.length ? (\n            <p>\n              No subscriptions found.{' '}\n              <Link href='/marketplace' className='link'>\n                Subscribe to your first project to get started.\n              </Link>\n            </p>\n          ) : (\n            <div\n              className={`grid grid-cols grid-cols-1 gap-4 sm:grid-cols-${Math.min(\n                2,\n                numConsumers\n              )} xl:grid-cols-${Math.min(3, numConsumers)}`}\n            >\n              {consumers.map((consumer) => (\n                <Link\n                  key={consumer.id}\n                  className='bg-card color-card-foreground p-4 border rounded-lg hover:border-gray-400 transition-colors overflow-hidden'\n                  href={`/app/consumers/${consumer.id}`}\n                >\n                  <h3 className='font-medium'>{consumer.project.name}</h3>\n\n                  <p className='text-sm text-gray-500'>\n                    {consumer.project.identifier}\n                  </p>\n\n                  <pre className='max-w-lg'>\n                    {JSON.stringify(consumer, null, 2)}\n                  </pre>\n                </Link>\n              ))}\n\n              {hasNextPage && (\n                <div ref={sentryRef} className=''>\n                  {isLoading || (isFetchingNextPage && <LoadingIndicator />)}\n                </div>\n              )}\n            </div>\n          )}\n        </div>\n      )}\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/app-projects-list.tsx",
    "content": "'use client'\n\nimport Link from 'next/link'\nimport useInfiniteScroll from 'react-infinite-scroll-hook'\n\nimport { useAuthenticatedAgentic } from '@/components/agentic-provider'\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { useInfiniteQuery } from '@/lib/query-client'\n\nexport function AppProjectsList() {\n  const ctx = useAuthenticatedAgentic()\n  const limit = 10\n  const {\n    data,\n    isLoading,\n    isError,\n    hasNextPage,\n    fetchNextPage,\n    isFetchingNextPage\n  } = useInfiniteQuery({\n    queryKey: ['projects', ctx?.api.authSession?.user?.id],\n    queryFn: ({ pageParam = 0 }) =>\n      ctx!.api\n        .listProjects({\n          populate: ['lastPublishedDeployment'],\n          offset: pageParam,\n          limit\n        })\n        .then(async (projects) => {\n          return {\n            projects,\n            offset: pageParam,\n            limit,\n            nextOffset:\n              projects.length >= limit ? pageParam + projects.length : undefined\n          }\n        }),\n    getNextPageParam: (lastGroup) => lastGroup?.nextOffset,\n    enabled: !!ctx,\n    initialPageParam: 0\n  })\n\n  const [sentryRef] = useInfiniteScroll({\n    loading: isLoading || isFetchingNextPage,\n    hasNextPage,\n    onLoadMore: fetchNextPage,\n    disabled: !ctx || isError,\n    rootMargin: '0px 0px 200px 0px'\n  })\n\n  const projects = data ? data.pages.flatMap((p) => p.projects) : []\n\n  return (\n    <>\n      {!ctx || isLoading ? (\n        <LoadingIndicator />\n      ) : (\n        <div className='mt-8'>\n          <h2 className='text-xl font-semibold mb-4'>Your Projects</h2>\n\n          {isError ? (\n            <p>Error fetching projects</p>\n          ) : !projects.length ? (\n            <p>\n              No projects found.{' '}\n              <Link\n                href='https://docs.agentic.so/publishing/quickstart'\n                className='link'\n              >\n                Create your first project to get started.\n              </Link>\n            </p>\n          ) : (\n            <div className='grid grid-cols grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-3'>\n              {projects.map((project) => (\n                <Link\n                  key={project.id}\n                  className='p-4 border rounded-lg hover:border-gray-400 transition-colors overflow-hidden'\n                  href={`/app/projects/${project.identifier}`}\n                >\n                  <h3 className='font-medium'>{project.name}</h3>\n\n                  <p className='text-sm text-gray-500'>{project.identifier}</p>\n\n                  {project.lastPublishedDeployment && (\n                    <p className='text-sm text-gray-500 mt-1'>\n                      Last published:{' '}\n                      {project.lastPublishedDeployment.version ||\n                        project.lastPublishedDeployment.hash}\n                    </p>\n                  )}\n                </Link>\n              ))}\n\n              {hasNextPage && (\n                <div ref={sentryRef} className=''>\n                  {isLoading || (isFetchingNextPage && <LoadingIndicator />)}\n                </div>\n              )}\n            </div>\n          )}\n        </div>\n      )}\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/bootstrap.tsx",
    "content": "'use client'\n\nimport { useFirstMountState } from 'react-use'\n\nimport { bootstrap } from '@/lib/bootstrap'\n\nexport function Bootstrap() {\n  const isFirstMount = useFirstMountState()\n\n  if (isFirstMount) {\n    bootstrap()\n  }\n\n  // Return `null` so we can use this as a react component\n  return null\n}\n"
  },
  {
    "path": "apps/web/src/components/code-block/highlight.ts",
    "content": "import { toJsxRuntime } from 'hast-util-to-jsx-runtime'\nimport { Fragment, type JSX } from 'react'\nimport { jsx, jsxs } from 'react/jsx-runtime'\nimport { type BundledLanguage, codeToHast } from 'shiki/bundle/web'\n\nimport { cn } from '@/lib/utils'\n\n// TODO: consider adding [twoslash](https://shiki.style/packages/twoslash)\n\nexport async function highlight({\n  code,\n  lang = 'ts',\n  theme = 'github-dark',\n  className\n}: {\n  code: string\n  lang?: BundledLanguage\n  theme?: string\n  className?: string\n}): Promise<JSX.Element> {\n  className = cn(\n    'w-full text-wrap p-2 md:p-4 text-sm rounded-sm overflow-x-auto',\n    className\n  )\n\n  const hast = await codeToHast(code, {\n    lang,\n    theme,\n    // TODO: use a custom `pre` element down below instead of this\n    transformers: [\n      {\n        pre(node) {\n          if (className) {\n            this.addClassToHast(node, className)\n          }\n        }\n      }\n    ]\n  })\n\n  return toJsxRuntime(hast, {\n    Fragment,\n    jsx,\n    jsxs\n  })\n}\n"
  },
  {
    "path": "apps/web/src/components/code-block/index.tsx",
    "content": "'use client'\n\nimport { CheckIcon, CopyIcon } from 'lucide-react'\nimport { type JSX, useCallback, useEffect, useRef, useState } from 'react'\nimport { type BundledLanguage } from 'shiki/bundle/web'\n\nimport { LoadingIndicator } from '@/components/loading-indicator'\nimport { Button } from '@/components/ui/button'\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger\n} from '@/components/ui/tooltip'\nimport { toastError } from '@/lib/notifications'\nimport { cn } from '@/lib/utils'\n\nimport { highlight } from './highlight'\n\nexport function CodeBlock({\n  initial,\n  code,\n  lang,\n  theme,\n  className\n}: {\n  initial?: JSX.Element\n  code: string\n  lang?: BundledLanguage\n  theme?: string\n  className?: string\n}) {\n  const [nodes, setNodes] = useState(initial)\n  const [isCopied, setIsCopied] = useState(false)\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n  useEffect(() => {\n    void highlight({\n      code,\n      lang,\n      theme\n    }).then(setNodes)\n  }, [code, lang, theme])\n\n  const onCopy = useCallback(() => {\n    ;(async () => {\n      try {\n        await navigator.clipboard.writeText(code)\n        setIsCopied(true)\n\n        if (timeoutRef.current) {\n          clearTimeout(timeoutRef.current)\n          timeoutRef.current = null\n        }\n\n        timeoutRef.current = setTimeout(() => {\n          timeoutRef.current = null\n          setIsCopied(false)\n        }, 2000)\n      } catch {\n        setIsCopied(true)\n\n        if (timeoutRef.current) {\n          clearTimeout(timeoutRef.current)\n          timeoutRef.current = null\n        }\n        void toastError('Error copying code to clipboard')\n      }\n    })()\n  }, [code, timeoutRef])\n\n  const numNewLines = code.split('\\n').length\n\n  return (\n    <div\n      className={cn('relative group rounded-sm w-full shadow-sm', className)}\n    >\n      {nodes ? (\n        <>\n          {nodes}\n\n          <Tooltip>\n            <TooltipTrigger asChild>\n              <Button\n                variant='outline'\n                className={cn(\n                  'absolute right-2 px-2.5! opacity-0 group-hover:opacity-100 group-hover:duration-0 transition-opacity duration-150',\n                  numNewLines <= 1 ? 'top-[50%] translate-y-[-50%]' : 'top-2'\n                )}\n                onClick={onCopy}\n              >\n                {isCopied ? <CheckIcon /> : <CopyIcon />}\n              </Button>\n            </TooltipTrigger>\n\n            <TooltipContent side='bottom'>\n              {isCopied ? <span>Copied</span> : <span>Copy to clipboard</span>}\n            </TooltipContent>\n          </Tooltip>\n        </>\n      ) : (\n        <LoadingIndicator />\n      )}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/confetti.tsx",
    "content": "'use client'\n\nimport type { Simplify } from 'type-fest'\nimport confetti, { type Options as ConfettiBaseOptions } from 'canvas-confetti'\nimport { useCallback } from 'react'\n\nimport { randomInRange } from '@/lib/utils'\n\nexport type ConfettiOptions = Simplify<\n  ConfettiBaseOptions & {\n    duration?: number\n    intervalMs?: number\n  }\n>\n\n// TODO: make shoot in from the sides\nexport function useConfettiFireworks() {\n  const fireConfetti = useCallback((options: ConfettiOptions = {}) => {\n    const duration = options.duration ?? 4 * 1000\n    const intervalMs = options.intervalMs ?? 250\n    const animationEnd = Date.now() + duration\n    const defaults: ConfettiOptions = {\n      startVelocity: 30,\n      spread: 360,\n      ticks: 60,\n      zIndex: 100,\n      ...options\n    }\n\n    const interval = globalThis.window.setInterval(() => {\n      const timeLeft = animationEnd - Date.now()\n\n      if (timeLeft <= 0) {\n        return globalThis.clearInterval(interval)\n      }\n\n      const particleCount = 50 * (timeLeft / duration)\n      void confetti({\n        particleCount,\n        origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },\n        ...defaults\n      })\n\n      void confetti({\n        particleCount,\n        origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },\n        ...defaults\n      })\n    }, intervalMs)\n\n    return () => {\n      globalThis.clearInterval(interval)\n    }\n  }, [])\n\n  return {\n    fireConfetti\n  }\n}\n"
  },
  {
    "path": "apps/web/src/components/dark-mode-toggle.tsx",
    "content": "'use client'\n\nimport { Moon, Sun } from 'lucide-react'\nimport { useTheme } from 'next-themes'\nimport * as React from 'react'\n\nimport { Button } from '@/components/ui/button'\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger\n} from '@/components/ui/tooltip'\nimport { cn } from '@/lib/utils'\n\nexport function DarkModeToggle({ className }: { className?: string }) {\n  const { setTheme, resolvedTheme } = useTheme()\n\n  return (\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Button\n          variant='outline'\n          size='icon'\n          className={cn('cursor-pointer', className)}\n          onClick={() => setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')}\n        >\n          <Sun className='h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0' />\n          <Moon className='absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100' />\n          <span className='sr-only'>Toggle theme</span>\n        </Button>\n      </TooltipTrigger>\n\n      <TooltipContent>\n        <span>Toggle dark mode</span>\n      </TooltipContent>\n    </Tooltip>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/demand-side-cta.tsx",
    "content": "import Link from 'next/link'\n\nimport { HeroButton } from '@/components/hero-button'\nimport { Button } from '@/components/ui/button'\n\nexport function DemandSideCTA() {\n  return (\n    <div className='flex justify-center items-center gap-4 sm:gap-8'>\n      <HeroButton asChild className='h-full'>\n        <Link href='/marketplace' className='font-mono'>\n          gotoTools();\n        </Link>\n      </HeroButton>\n\n      <Button variant='outline' asChild className='h-full py-[9px]'>\n        <Link href='https://docs.agentic.so' className='font-mono'>\n          readTheDocs();\n        </Link>\n      </Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/dots-section.tsx",
    "content": "import { cn } from '@/lib/utils'\n\nexport function DotsSection({\n  children,\n  className\n}: {\n  children: React.ReactNode\n  className?: string\n}) {\n  return (\n    <section className={cn('relative', className)}>\n      <div className='absolute pointer-events-none top-[-50%] bottom-[-50%] left-[-50%] right-[-50%] bg-[url(/dots-light.png)] dark:bg-[url(/dots-dark.png)] bg-size-[1024px,256px] bg-no-repeat bg-center -z-10' />\n\n      {children}\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/example-agentic-configs.tsx",
    "content": "'use client'\n\nimport type { BundledLanguage } from 'shiki/bundle/web'\nimport { useLocalStorage } from 'react-use'\n\nimport { CodeBlock } from '@/components/code-block'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'\n\nimport { LoadingIndicator } from './loading-indicator'\n\nconst formatLabels = {\n  typescript: 'TypeScript',\n  json: 'JSON'\n} as const\nconst formats = Object.keys(formatLabels) as (keyof typeof formatLabels)[]\ntype Format = (typeof formats)[number]\n\nconst originAdaptorLabels = {\n  mcp: 'MCP',\n  openapi: 'OpenAPI'\n} as const\nconst originAdaptors = Object.keys(\n  originAdaptorLabels\n) as (keyof typeof originAdaptorLabels)[]\ntype OriginAdaptor = (typeof originAdaptors)[number]\n\ntype ExampleAgenticConfig = {\n  format: Format\n  originAdaptor: OriginAdaptor\n}\n\nconst defaultExampleAgenticConfig: ExampleAgenticConfig = {\n  format: 'typescript',\n  originAdaptor: 'mcp'\n}\n\ntype CodeSnippet = {\n  code: string\n  lang: BundledLanguage\n}\n\nexport function ExampleAgenticConfigs() {\n  const [config, setConfig] = useLocalStorage<ExampleAgenticConfig>(\n    'example-agentic-config',\n    defaultExampleAgenticConfig\n  )\n\n  if (!config) {\n    return <LoadingIndicator className='w-full max-w-3xl' />\n  }\n\n  return (\n    <div className='w-full max-w-3xl flex flex-col items-center border rounded-lg shadow-sm p-2 md:p-4 bg-background'>\n      <ExampleAgenticConfigsContent config={config} setConfig={setConfig} />\n    </div>\n  )\n}\n\nfunction ExampleAgenticConfigsContent({\n  config,\n  setConfig\n}: {\n  config: ExampleAgenticConfig\n  setConfig: (config: ExampleAgenticConfig) => void\n}) {\n  const codeSnippet = getCodeSnippetForExampleAgenticConfig(config)\n\n  return (\n    <Tabs\n      defaultValue={config!.format}\n      onValueChange={(value) =>\n        setConfig({\n          ...defaultExampleAgenticConfig,\n          ...config,\n          format: value as Format\n        })\n      }\n      className='w-full max-w-3xl'\n    >\n      <TabsList>\n        {formats.map((format) => (\n          <TabsTrigger key={format} value={format} className='cursor-pointer'>\n            {formatLabels[format]}\n          </TabsTrigger>\n        ))}\n      </TabsList>\n\n      <TabsContent value={config.format} className='w-full'>\n        <Tabs\n          defaultValue={config.originAdaptor}\n          onValueChange={(value) =>\n            setConfig({\n              ...defaultExampleAgenticConfig,\n              ...config,\n              originAdaptor: value as OriginAdaptor\n            })\n          }\n          className='w-full'\n        >\n          <TabsList className='w-full h-auto flex-wrap'>\n            {originAdaptors.map((originAdaptor) => (\n              <TabsTrigger\n                key={originAdaptor}\n                value={originAdaptor}\n                className='cursor-pointer text-xs!'\n              >\n                {originAdaptorLabels[originAdaptor]}\n              </TabsTrigger>\n            ))}\n          </TabsList>\n\n          {originAdaptors.map((originAdaptor) => (\n            <TabsContent\n              key={originAdaptor}\n              value={originAdaptor}\n              className='w-full flex flex-col gap-2'\n            >\n              <div className='text-sm text-gray-500'>\n                {config.format === 'typescript'\n                  ? 'agentic.config.ts'\n                  : 'agentic.config.json'}\n              </div>\n\n              <CodeBlock code={codeSnippet.code} lang={codeSnippet.lang} />\n            </TabsContent>\n          ))}\n        </Tabs>\n      </TabsContent>\n    </Tabs>\n  )\n}\n\nfunction getCodeSnippetForExampleAgenticConfig(\n  config: ExampleAgenticConfig\n): CodeSnippet {\n  if (config.format === 'typescript') {\n    if (config.originAdaptor === 'mcp') {\n      return {\n        code: `\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'mcp-example',\n  origin: {\n    type: 'mcp',\n    // Your origin MCP server URL supporting the streamable HTTP transport\n    url: '<YOUR_REMOTE_MCP_SERVER_URL>'\n  }\n})`.trim(),\n        lang: 'typescript'\n      }\n    } else {\n      return {\n        code: `\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'openapi-example',\n  origin: {\n    type: 'openapi',\n    // Your origin OpenAPI server base URL\n    url: '<YOUR_OPENAPI_SERVER_BASE_URL>',\n    // Your origin OpenAPI spec path or URL\n    spec: '<YOUR_OPENAPI_SPEC_PATH_OR_URL>'\n  }\n})`.trim(),\n        lang: 'typescript'\n      }\n    }\n  } else if (config.format === 'json') {\n    if (config.originAdaptor === 'mcp') {\n      return {\n        code: `\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"mcp-example\",\n  \"origin\": {\n    \"type\": \"mcp\",\n    \"url\": \"<YOUR_REMOTE_MCP_SERVER_URL>\"\n  }\n}`.trim(),\n        lang: 'json'\n      }\n    } else {\n      return {\n        code: `\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"openapi-example\",\n  \"origin\": {\n    \"type\": \"openapi\",\n    \"url\": \"<YOUR_OPENAPI_SERVER_BASE_URL>\",\n    \"spec\": \"<YOUR_OPENAPI_SPEC_PATH_OR_URL>\"\n  }\n}`.trim(),\n        lang: 'json'\n      }\n    }\n  }\n\n  return {\n    code: '',\n    lang: 'json'\n  }\n}\n"
  },
  {
    "path": "apps/web/src/components/example-usage-section.tsx",
    "content": "import Link from 'next/link'\n\nimport { highlight } from '@/components/code-block/highlight'\nimport { ExampleUsage } from '@/components/example-usage'\nimport {\n  defaultConfig,\n  getCodeForDeveloperConfig\n} from '@/lib/developer-config'\nimport { globalAgenticApiClient } from '@/lib/global-api'\n\nexport async function ExampleUsageSection() {\n  const projectIdentifier = '@agentic/search'\n  const tool = 'search'\n\n  // TODO: use prefetching here\n  const initialProject =\n    await globalAgenticApiClient.getPublicProjectByIdentifier({\n      projectIdentifier,\n      populate: ['lastPublishedDeployment']\n    })\n\n  // TODO: this should be loaded in `ExampleUsage`\n  const initialCodeSnippet = getCodeForDeveloperConfig({\n    config: defaultConfig,\n    project: initialProject,\n    deployment: initialProject.lastPublishedDeployment!,\n    identifier: projectIdentifier,\n    tool\n  })\n  const initialCodeBlock = await highlight(initialCodeSnippet)\n\n  return (\n    <section className='flex flex-col gap-8 mb-16'>\n      <h2 className='text-center text-balance leading-snug md:leading-none text-3xl font-heading'>\n        Agentic tools that{' '}\n        <span className='font-semibold'>work everywhere</span>\n      </h2>\n\n      <ExampleUsage\n        projectIdentifier={projectIdentifier}\n        project={initialProject}\n        tool={tool}\n        initialCodeBlock={initialCodeBlock}\n      />\n\n      <div className='flex flex-col gap-4 text-sm max-w-2xl text-center'>\n        <p>\n          This example uses the{' '}\n          <Link\n            href={`/marketplace/projects/${projectIdentifier}`}\n            className='link'\n          >\n            {projectIdentifier}\n          </Link>{' '}\n          tool to provide an LLM access to the web.\n        </p>\n\n        <p>\n          All Agentic tools are exposed as both{' '}\n          <span className='font-semibold'>MCP servers</span> as well as simple{' '}\n          <span className='font-semibold'>HTTP APIs</span>. MCP is important for\n          interop and future-proofing, whereas simple HTTP POST requests make\n          tool use easy to debug and simplifies usage with LLM tool calling.\n        </p>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/example-usage.tsx",
    "content": "'use client'\n\nimport type { Project } from '@agentic/platform-types'\nimport Link from 'next/link'\nimport { type JSX, useEffect, useMemo, useState } from 'react'\nimport { useLocalStorage } from 'react-use'\n\nimport { useAgentic } from '@/components/agentic-provider'\nimport { CodeBlock } from '@/components/code-block'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'\nimport {\n  type CodeSnippet,\n  defaultConfig,\n  type DeveloperConfig,\n  getCodeForDeveloperConfig,\n  type HTTPTarget,\n  httpTargetLabels,\n  httpTargets,\n  type MCPClientTarget,\n  mcpClientTargetLabels,\n  mcpClientTargets,\n  type PyFrameworkTarget,\n  pyFrameworkTargetLabels,\n  pyFrameworkTargets,\n  type Target,\n  targetLabels,\n  targets,\n  type TsFrameworkTarget,\n  tsFrameworkTargetLabels,\n  tsFrameworkTargets\n} from '@/lib/developer-config'\nimport { useQuery } from '@/lib/query-client'\n\nimport { LoadingIndicator } from './loading-indicator'\nimport { Button } from './ui/button'\n\nexport function ExampleUsage({\n  projectIdentifier,\n  project: initialProject,\n  tool,\n  apiKey,\n  initialCodeBlock\n}: {\n  projectIdentifier: string\n  project?: Project\n  tool?: string\n  apiKey?: string\n  initialCodeBlock?: JSX.Element\n}) {\n  const ctx = useAgentic()\n  const [isMounted, setIsMounted] = useState(false)\n\n  useEffect(() => {\n    setIsMounted(true)\n  }, [])\n\n  const [rawConfig, setConfig] = useLocalStorage<DeveloperConfig>(\n    'developer-config',\n    defaultConfig\n  )\n\n  const config = useMemo(\n    () => (isMounted && rawConfig ? rawConfig : defaultConfig),\n    [rawConfig, isMounted]\n  )\n\n  // TODO: make this configurable\n  // TODO: allow to take the project and/or consumer in as props\n  // TODO: need a way of fetching a project and target deployment; same as in `AgenticToolClient.fromIdentifier` (currently only supports latest)\n\n  // Load the public project\n  const {\n    data: project,\n    isLoading,\n    isError\n  } = useQuery({\n    queryKey: ['public-project', projectIdentifier],\n    queryFn: () =>\n      ctx!.api.getPublicProjectByIdentifier({\n        projectIdentifier,\n        populate: ['lastPublishedDeployment']\n      }),\n    enabled: !!ctx,\n    initialData: initialProject\n  })\n\n  // If the user is authenticated, check if they have an active subscription to\n  // this project\n  // TODO: use consumer for apiKey\n  // const {\n  //   data: consumer,\n  //   isLoading: isConsumerLoading\n  //   // isError: isConsumerError\n  // } = useQuery({\n  //   queryKey: [\n  //     'project',\n  //     projectIdentifier,\n  //     'user',\n  //     ctx?.api.authSession?.user.id\n  //   ],\n  //   queryFn: () =>\n  //     ctx!.api.getConsumerByProjectIdentifier({\n  //       projectIdentifier\n  //     }),\n  //   enabled: !!ctx?.isAuthenticated\n  // })\n\n  return (\n    <div className='w-full max-w-3xl flex flex-col items-center border rounded-lg shadow-sm p-2 md:p-4 bg-background'>\n      <ExampleUsageContent\n        projectIdentifier={projectIdentifier}\n        tool={tool}\n        apiKey={apiKey}\n        initialCodeBlock={initialCodeBlock}\n        isLoading={isLoading}\n        isError={isError}\n        project={project}\n        config={config}\n        setConfig={setConfig}\n      />\n    </div>\n  )\n}\n\nfunction ExampleUsageContent({\n  projectIdentifier,\n  tool,\n  apiKey,\n  initialCodeBlock,\n  isLoading,\n  isError,\n  project,\n  config,\n  setConfig\n}: {\n  projectIdentifier: string\n  tool?: string\n  apiKey?: string\n  initialCodeBlock?: JSX.Element\n  isLoading: boolean\n  isError: boolean\n  project?: Project\n  config?: DeveloperConfig\n  setConfig: (config: DeveloperConfig) => void\n}) {\n  if (isLoading || !config) {\n    return <LoadingIndicator />\n  }\n\n  // TODO: allow to target a specific deployment\n  const deployment = project?.lastPublishedDeployment\n\n  if (isError || !project || !deployment) {\n    return (\n      <div>\n        Error loading project. Please refresh the page or contact{' '}\n        <a href='mailto:support@agentic.so'>support@agentic.so</a>.\n      </div>\n    )\n  }\n\n  const codeSnippet = getCodeForDeveloperConfig({\n    config,\n    project,\n    deployment,\n    identifier: projectIdentifier,\n    tool,\n    apiKey\n  })\n\n  return (\n    <Tabs\n      value={config.target}\n      onValueChange={(value) =>\n        setConfig({\n          ...defaultConfig,\n          ...config,\n          target: value as Target\n        })\n      }\n      className='w-full'\n    >\n      <TabsList>\n        {targets.map((target) => (\n          <TabsTrigger\n            key={target}\n            value={target}\n            className='cursor-pointer'\n            disabled={target === 'http' && !tool}\n          >\n            {targetLabels[target]}\n          </TabsTrigger>\n        ))}\n      </TabsList>\n\n      <TabsContent value='mcp' className='w-full'>\n        <Tabs\n          value={config.mcpClientTarget}\n          onValueChange={(value) =>\n            setConfig({\n              ...defaultConfig,\n              ...config,\n              mcpClientTarget: value as MCPClientTarget\n            })\n          }\n          className='w-full'\n        >\n          <TabsList className='h-auto flex-wrap'>\n            {mcpClientTargets.map((mcpClientTarget) => (\n              <TabsTrigger\n                key={mcpClientTarget}\n                value={mcpClientTarget}\n                className='cursor-pointer text-xs!'\n              >\n                {mcpClientTargetLabels[mcpClientTarget]}\n              </TabsTrigger>\n            ))}\n          </TabsList>\n\n          {mcpClientTargets.map((mcpClientTarget) => (\n            <TabsContent\n              key={mcpClientTarget}\n              value={mcpClientTarget}\n              className='w-full flex flex-col gap-4'\n            >\n              <CodeSnippetBlock\n                codeSnippet={codeSnippet}\n                initialCodeBlock={initialCodeBlock}\n              />\n            </TabsContent>\n          ))}\n        </Tabs>\n      </TabsContent>\n\n      <TabsContent value='typescript' className='w-full'>\n        <Tabs\n          value={config.tsFrameworkTarget}\n          onValueChange={(value) =>\n            setConfig({\n              ...defaultConfig,\n              ...config,\n              tsFrameworkTarget: value as TsFrameworkTarget\n            })\n          }\n          className='w-full'\n        >\n          <TabsList className='w-full h-auto flex-wrap'>\n            {tsFrameworkTargets.map((framework) => (\n              <TabsTrigger\n                key={framework}\n                value={framework}\n                className='cursor-pointer text-xs!'\n              >\n                {tsFrameworkTargetLabels[framework]}\n              </TabsTrigger>\n            ))}\n          </TabsList>\n\n          {tsFrameworkTargets.map((framework) => (\n            <TabsContent\n              key={framework}\n              value={framework}\n              className='w-full flex flex-col gap-4'\n            >\n              <CodeSnippetBlock\n                codeSnippet={codeSnippet}\n                initialCodeBlock={initialCodeBlock}\n              />\n            </TabsContent>\n          ))}\n        </Tabs>\n      </TabsContent>\n\n      <TabsContent value='python' className='w-full'>\n        <Tabs\n          value={config.pyFrameworkTarget}\n          onValueChange={(value) =>\n            setConfig({\n              ...defaultConfig,\n              ...config,\n              pyFrameworkTarget: value as PyFrameworkTarget\n            })\n          }\n          className='w-full'\n        >\n          <TabsList className='h-auto flex-wrap'>\n            {pyFrameworkTargets.map((framework) => (\n              <TabsTrigger\n                key={framework}\n                value={framework}\n                className='cursor-pointer text-xs!'\n              >\n                {pyFrameworkTargetLabels[framework]}\n              </TabsTrigger>\n            ))}\n          </TabsList>\n\n          {pyFrameworkTargets.map((framework) => (\n            <TabsContent\n              key={framework}\n              value={framework}\n              className='w-full flex flex-col gap-4'\n            >\n              <CodeSnippetBlock\n                codeSnippet={codeSnippet}\n                initialCodeBlock={initialCodeBlock}\n              />\n            </TabsContent>\n          ))}\n        </Tabs>\n      </TabsContent>\n\n      <TabsContent value='http' className='w-full'>\n        <Tabs\n          value={config.httpTarget}\n          onValueChange={(value) =>\n            setConfig({\n              ...defaultConfig,\n              ...config,\n              httpTarget: value as HTTPTarget\n            })\n          }\n          className='w-full'\n        >\n          <TabsList className='h-auto flex-wrap'>\n            {httpTargets.map((httpTarget) => (\n              <TabsTrigger\n                key={httpTarget}\n                value={httpTarget}\n                className='cursor-pointer text-xs!'\n              >\n                {httpTargetLabels[httpTarget]}\n              </TabsTrigger>\n            ))}\n          </TabsList>\n\n          {httpTargets.map((httpTarget) => (\n            <TabsContent\n              key={httpTarget}\n              value={httpTarget}\n              className='w-full flex flex-col gap-4'\n            >\n              <CodeSnippetBlock\n                codeSnippet={codeSnippet}\n                initialCodeBlock={initialCodeBlock}\n              />\n            </TabsContent>\n          ))}\n        </Tabs>\n      </TabsContent>\n    </Tabs>\n  )\n}\n\nfunction CodeSnippetBlock({\n  codeSnippet,\n  initialCodeBlock\n}: {\n  codeSnippet: CodeSnippet\n  initialCodeBlock?: JSX.Element\n}) {\n  return (\n    <>\n      <CodeBlock\n        code={codeSnippet.code}\n        lang={codeSnippet.lang}\n        initial={initialCodeBlock}\n      />\n\n      {codeSnippet.action && (\n        <Button\n          asChild\n          className='group flex flex-row gap-1.5 items-center'\n          variant='outline'\n        >\n          <Link\n            href={codeSnippet.action.href}\n            target='_blank'\n            rel='noopener noreferrer'\n          >\n            {codeSnippet.action.logoImageUrl ? (\n              <>\n                <img\n                  src={codeSnippet.action.logoImageUrl}\n                  alt={codeSnippet.action.label}\n                  className=''\n                />\n              </>\n            ) : (\n              <>\n                <img\n                  src={codeSnippet.action.logoImageUrlDark}\n                  alt={codeSnippet.action.label}\n                  className='w-4 h-4 hidden group-dark:block'\n                />\n                <img\n                  src={codeSnippet.action.logoImageUrlLight}\n                  alt={codeSnippet.action.label}\n                  className='w-4 h-4 block group-dark:hidden'\n                />\n              </>\n            )}\n\n            <span>{codeSnippet.action.label}</span>\n          </Link>\n        </Button>\n      )}\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/feature.tsx",
    "content": "'use client'\n\nimport type { ComponentType, ReactNode } from 'react'\nimport {\n  motion,\n  type MotionValue,\n  useMotionTemplate,\n  useMotionValue\n} from 'motion/react'\nimport Link from 'next/link'\n\nimport { GridPattern } from './grid-pattern'\n\nexport type FeatureData = {\n  name: string\n  description: ReactNode\n  icon: ComponentType<{ className?: string }>\n  pattern: Omit<GridPattern, 'width' | 'height' | 'x'>\n  href?: string\n}\n\nexport function Feature({\n  name,\n  description,\n  icon,\n  pattern,\n  href\n}: FeatureData) {\n  const mouseX = useMotionValue(0)\n  const mouseY = useMotionValue(0)\n\n  function onMouseMove({\n    currentTarget,\n    clientX,\n    clientY\n  }: React.MouseEvent<HTMLElement>) {\n    const { left, top } = currentTarget.getBoundingClientRect()\n    mouseX.set(clientX - left)\n    mouseY.set(clientY - top)\n  }\n\n  const content = (\n    <>\n      <FeaturePattern {...pattern} mouseX={mouseX} mouseY={mouseY} />\n\n      <div className='ring-gray-900/7.5 group-hover:ring-gray-900/10 absolute inset-0 rounded-2xl ring-1 ring-inset dark:ring-white/10 dark:group-hover:ring-white/20' />\n\n      <div className='relative rounded-2xl p-4 flex flex-col gap-6 pt-12 text-start'>\n        <FeatureIcon icon={icon} />\n\n        <h3 className='text-gray-900 text-lg font-semibold leading-0 dark:text-white'>\n          {/* <span className='absolute inset-0 rounded-2xl' /> */}\n          {name}\n        </h3>\n\n        <p className='text-gray-600 dark:text-gray-400 text-[0.875rem] leading-[1.5rem]'>\n          {description}\n        </p>\n      </div>\n    </>\n  )\n\n  const className =\n    'dark:bg-white/2.5 bg-gray-50 hover:shadow-gray-900/5 group relative flex rounded-2xl transition-shadow hover:shadow-md dark:hover:shadow-black/5'\n\n  if (href) {\n    return (\n      <Link\n        href={href}\n        key={name}\n        onMouseMove={onMouseMove}\n        className={className}\n      >\n        {content}\n      </Link>\n    )\n  } else {\n    return (\n      <div key={name} onMouseMove={onMouseMove} className={className}>\n        {content}\n      </div>\n    )\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction FeatureIcon({ icon: Icon }: { icon: FeatureData['icon'] }) {\n  return (\n    <div className='dark:bg-white/7.5 bg-gray-900/5 ring-gray-900/25 group-hover:ring-gray-900/25 dark:group-hover:bg-sky-300/10 dark:group-hover:ring-sky-400 flex size-7 items-center justify-center rounded-full ring-1 backdrop-blur-[2px] transition duration-300 group-hover:bg-white/50 dark:ring-white/15'>\n      <Icon className='fill-gray-700/10 stroke-gray-700 group-hover:stroke-gray-900 dark:stroke-gray-400 dark:group-hover:stroke-sky-400 dark:group-hover:fill-sky-300/10 size-5 transition-colors duration-300 dark:fill-white/10' />\n    </div>\n  )\n}\n\nfunction FeaturePattern({\n  mouseX,\n  mouseY,\n  ...gridProps\n}: FeatureData['pattern'] & {\n  mouseX: MotionValue<number>\n  mouseY: MotionValue<number>\n}) {\n  const maskImage = useMotionTemplate`radial-gradient(180px at ${mouseX}px ${mouseY}px, white, transparent)`\n  const style = { maskImage, WebkitMaskImage: maskImage }\n\n  return (\n    <div className='pointer-events-none'>\n      <div className='absolute inset-0 rounded-2xl transition duration-300 [mask-image:linear-gradient(white,transparent)] group-hover:opacity-50'>\n        <GridPattern\n          width={72}\n          height={56}\n          x='50%'\n          className='dark:fill-white/1 dark:stroke-white/2.5 absolute inset-x-0 inset-y-[-30%] h-[160%] w-full skew-y-[-18deg] fill-black/[0.02] stroke-black/5'\n          {...gridProps}\n        />\n      </div>\n\n      <motion.div\n        className='from-sky-100 to-sky-300 dark:from-sky-500 dark:to-sky-300 absolute inset-0 rounded-2xl bg-gradient-to-r opacity-0 transition duration-300 group-hover:opacity-50 dark:group-hover:opacity-15'\n        style={style}\n      />\n\n      <motion.div\n        className='absolute inset-0 rounded-2xl opacity-0 mix-blend-overlay transition duration-300 group-hover:opacity-100'\n        style={style}\n      >\n        <GridPattern\n          width={72}\n          height={56}\n          x='50%'\n          className='dark:fill-white/2.5 absolute inset-x-0 inset-y-[-30%] h-[160%] w-full skew-y-[-18deg] fill-black/50 stroke-black/70 dark:stroke-white/10'\n          {...gridProps}\n        />\n      </motion.div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/footer/dynamic.tsx",
    "content": "'use client'\n\nimport { ActiveLink } from '@/components/active-link'\nimport { useAgentic } from '@/components/agentic-provider'\n\nexport function DynamicFooter() {\n  const ctx = useAgentic()\n\n  return (\n    <>\n      {ctx?.isAuthenticated ? (\n        <>\n          <div>\n            <ActiveLink href='/app' className='link'>\n              Dashboard\n            </ActiveLink>\n          </div>\n\n          <div>\n            <ActiveLink href='/logout' className='link'>\n              Logout\n            </ActiveLink>\n          </div>\n        </>\n      ) : (\n        <>\n          <div>\n            <ActiveLink href='/login' className='link whitespace-nowrap'>\n              Log in\n            </ActiveLink>\n          </div>\n\n          <div>\n            <ActiveLink href='/signup' className='link whitespace-nowrap'>\n              Sign up\n            </ActiveLink>\n          </div>\n        </>\n      )}\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/footer/index.tsx",
    "content": "import Link from 'next/link'\n\nimport { ActiveLink } from '@/components/active-link'\nimport { GitHubIcon } from '@/icons/github'\nimport { TwitterIcon } from '@/icons/twitter'\nimport { copyright, githubUrl, twitterUrl } from '@/lib/config'\n\nimport { DynamicFooter } from './dynamic'\n\nexport function Footer() {\n  return (\n    <footer className='w-full pt-12 pb-4 border-t flex flex-col items-center'>\n      <div className='container px-4 sm:px-6 max-w-1200px'>\n        <div className='flex flex-col sm:grid sm:grid-cols-2 md:grid-cols-4 gap-8'>\n          <div className='flex flex-col sm:items-center'>\n            <div className='space-y-4'>\n              <h3 className='text-lg font-semibold'>Platform</h3>\n\n              <nav className='flex flex-col space-y-2'>\n                <div>\n                  <ActiveLink href='/' className='link'>\n                    Home\n                  </ActiveLink>\n                </div>\n\n                <div>\n                  <ActiveLink href='/marketplace' className='link'>\n                    MCP Marketplace\n                  </ActiveLink>\n                </div>\n\n                <div>\n                  <ActiveLink href='/publishing' className='link'>\n                    MCP Publishing\n                  </ActiveLink>\n                </div>\n\n                <div>\n                  <ActiveLink href='/pricing' className='link'>\n                    Pricing\n                  </ActiveLink>\n                </div>\n\n                <DynamicFooter />\n              </nav>\n            </div>\n          </div>\n\n          <div className='flex flex-col sm:items-center'>\n            <div className='space-y-4'>\n              <h3 className='text-lg font-semibold'>Resources</h3>\n\n              <nav className='flex flex-col space-y-2'>\n                <div>\n                  <Link href='https://docs.agentic.so' className='link'>\n                    Docs\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/publishing'\n                    className='link'\n                  >\n                    Publishing Docs\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/publishing/guides/existing-openapi-service'\n                    className='link'\n                  >\n                    OpenAPI to MCP\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/publishing'\n                    className='link'\n                  >\n                    Agentic MCP Gateway\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/marketplace/ts-sdks/openai-chat'\n                    className='link'\n                  >\n                    Agentic + OpenAI\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/marketplace/ts-sdks/ai-sdk'\n                    className='link'\n                  >\n                    Agentic + Vercel AI SDK\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/marketplace/ts-sdks/langchain'\n                    className='link'\n                  >\n                    Agentic + LangChain\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/marketplace/ts-sdks/llamaindex'\n                    className='link'\n                  >\n                    Agentic + LlamaIndex\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/marketplace/ts-sdks/genkit'\n                    className='link'\n                  >\n                    Agentic + Firebase GenKit\n                  </Link>\n                </div>\n\n                <div>\n                  <Link\n                    href='https://docs.agentic.so/marketplace/ts-sdks/mastra'\n                    className='link'\n                  >\n                    Agentic + Mastra\n                  </Link>\n                </div>\n              </nav>\n            </div>\n          </div>\n\n          <div className='flex flex-col sm:items-center'>\n            <div className='space-y-4'>\n              <h3 className='text-lg font-semibold'>Company</h3>\n\n              <nav className='flex flex-col space-y-2'>\n                <div>\n                  <ActiveLink href='/about' className='link'>\n                    About\n                  </ActiveLink>\n                </div>\n\n                <div>\n                  <ActiveLink href='/contact' className='link'>\n                    Contact\n                  </ActiveLink>\n                </div>\n\n                <div>\n                  <ActiveLink href='/privacy' className='link'>\n                    Privacy Policy\n                  </ActiveLink>\n                </div>\n\n                <div>\n                  <ActiveLink href='/terms' className='link'>\n                    Terms of Service\n                  </ActiveLink>\n                </div>\n              </nav>\n            </div>\n          </div>\n\n          <div className='flex flex-col sm:items-center gap-4'>\n            <div className='space-y-4'>\n              <h3 className='text-lg font-semibold'>Social</h3>\n\n              <nav className='flex flex-col gap-4'>\n                <Link\n                  href={twitterUrl}\n                  className='flex items-center space-x-2'\n                  target='_blank'\n                  rel='noopener noreferrer'\n                >\n                  <TwitterIcon className='h-4 w-4' />\n\n                  <span>Twitter</span>\n                </Link>\n\n                <Link\n                  href={githubUrl}\n                  className='flex items-center space-x-2'\n                  target='_blank'\n                  rel='noopener noreferrer'\n                >\n                  <GitHubIcon className='h-4 w-4' />\n\n                  <span>GitHub</span>\n                </Link>\n              </nav>\n            </div>\n          </div>\n        </div>\n\n        <div className='mt-8 pt-8 border-t border-border text-center text-sm text-muted-foreground'>\n          <span>{copyright}</span>\n        </div>\n      </div>\n    </footer>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/github-star-counter.tsx",
    "content": "'use client'\n\nimport NumberFlow from '@number-flow/react'\nimport Link from 'next/link'\nimport { type ReactNode, useEffect, useState } from 'react'\n\nimport { GitHubIcon } from '@/icons/github'\nimport { githubUrl } from '@/lib/config'\nimport { cn } from '@/lib/utils'\n\nimport { Button } from './ui/button'\n\n// TODO: fetch this dynamically\nconst numGitHubStars = 17_600\n\nexport function GitHubStarCounter({\n  className,\n  children\n}: {\n  className?: string\n  children?: ReactNode\n}) {\n  const [numStars, setNumStars] = useState(0)\n\n  useEffect(() => {\n    setNumStars(numGitHubStars)\n  }, [])\n\n  return (\n    <Button\n      variant='outline'\n      className={cn('flex items-center gap-2', className)}\n      asChild\n    >\n      <Link href={githubUrl} target='_blank' rel='noopener'>\n        <GitHubIcon />\n\n        <NumberFlow\n          value={numStars}\n          format={{\n            notation: 'compact',\n            roundingPriority: 'morePrecision'\n          }}\n          suffix={children ? undefined : ' stars'}\n          willChange\n        />\n\n        {children}\n      </Link>\n    </Button>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/grid-pattern.tsx",
    "content": "import { type SVGProps, useId } from 'react'\n\nexport type GridPattern = Omit<\n  SVGProps<SVGSVGElement>,\n  'width' | 'height' | 'x' | 'y'\n> & {\n  width: number\n  height: number\n  x: string | number\n  y: string | number\n  squares: Array<[x: number, y: number]>\n}\n\nexport function GridPattern({\n  width,\n  height,\n  x,\n  y,\n  squares,\n  ...props\n}: GridPattern) {\n  const patternId = useId()\n\n  return (\n    <svg aria-hidden='true' {...props}>\n      <defs>\n        <pattern\n          id={patternId}\n          width={width}\n          height={height}\n          patternUnits='userSpaceOnUse'\n          x={x}\n          y={y}\n        >\n          <path d={`M.5 ${height}V.5H${width}`} fill='none' />\n        </pattern>\n      </defs>\n\n      <rect\n        width='100%'\n        height='100%'\n        strokeWidth={0}\n        fill={`url(#${patternId})`}\n      />\n\n      {squares && (\n        <svg x={x} y={y} className='overflow-visible'>\n          <title>square</title>\n\n          {squares.map(([x, y]) => (\n            <rect\n              strokeWidth='0'\n              key={`${x}-${y}`}\n              width={width + 1}\n              height={height + 1}\n              x={x * width}\n              y={y * height}\n            />\n          ))}\n        </svg>\n      )}\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/header/authenticated-header.tsx",
    "content": "'use client'\n\nimport { useState } from 'react'\n\nimport { ActiveLink } from '@/components/active-link'\nimport { useAgentic } from '@/components/agentic-provider'\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger\n} from '@/components/ui/dropdown-menu'\n\nexport function AuthenticatedHeader() {\n  const ctx = useAgentic()\n  const [isDropdownMenuOpen, setIsDropdownMenuOpen] = useState(false)\n\n  if (!ctx?.isAuthenticated) {\n    return null\n  }\n\n  return (\n    <DropdownMenu\n      open={isDropdownMenuOpen}\n      onOpenChange={setIsDropdownMenuOpen}\n    >\n      <DropdownMenuTrigger asChild>\n        <Avatar className='cursor-pointer'>\n          <AvatarImage src={ctx.api.authSession!.user.image} />\n          <AvatarFallback>\n            {ctx.api.authSession!.user.username?.slice(0, 2).toUpperCase()}\n          </AvatarFallback>\n        </Avatar>\n      </DropdownMenuTrigger>\n\n      <DropdownMenuContent>\n        <DropdownMenuItem asChild>\n          <ActiveLink href='/app' onClick={() => setIsDropdownMenuOpen(false)}>\n            Dashboard\n          </ActiveLink>\n        </DropdownMenuItem>\n\n        <DropdownMenuItem asChild>\n          <ActiveLink\n            href='/app/projects'\n            onClick={() => setIsDropdownMenuOpen(false)}\n          >\n            My Projects\n          </ActiveLink>\n        </DropdownMenuItem>\n\n        <DropdownMenuItem asChild>\n          <ActiveLink\n            href='/app/consumers'\n            onClick={() => setIsDropdownMenuOpen(false)}\n          >\n            My Subscriptions\n          </ActiveLink>\n        </DropdownMenuItem>\n\n        <DropdownMenuSeparator />\n\n        <DropdownMenuItem asChild>\n          <ActiveLink\n            href='/logout'\n            onClick={() => setIsDropdownMenuOpen(false)}\n          >\n            Logout\n          </ActiveLink>\n        </DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/header/index.tsx",
    "content": "import Link from 'next/link'\n\nimport { ActiveLink } from '@/components/active-link'\nimport { DarkModeToggle } from '@/components/dark-mode-toggle'\nimport { Button } from '@/components/ui/button'\nimport { GitHubIcon } from '@/icons/github'\nimport { githubUrl } from '@/lib/config'\nimport { cn } from '@/lib/utils'\n\nimport { AuthenticatedHeader } from './authenticated-header'\nimport styles from './styles.module.css'\nimport { UnauthenticatedHeader } from './unauthenticated-header'\n\nexport function Header() {\n  return (\n    <header className={cn(styles.header, 'shadow-sm')}>\n      <div className={styles.headerContent}>\n        <ActiveLink className='select-none' href='/'>\n          <img\n            src='/agentic-logo-light.svg'\n            alt='AGENTIC'\n            className='w-[144px] dark:hidden'\n          />\n          <img\n            src='/agentic-logo-dark.svg'\n            alt='AGENTIC'\n            className='w-[144px] hidden dark:block'\n          />\n        </ActiveLink>\n\n        <div className='flex justify-end items-center h-full gap-4'>\n          <ActiveLink\n            href='/marketplace'\n            className='link hidden sm:block whitespace-nowrap'\n          >\n            MCP Marketplace\n          </ActiveLink>\n\n          <ActiveLink href='/publishing' className='link whitespace-nowrap'>\n            MCP Publishing\n          </ActiveLink>\n\n          <ActiveLink\n            href='https://docs.agentic.so'\n            className='link whitespace-nowrap'\n          >\n            Docs\n          </ActiveLink>\n\n          <div className='flex items-center h-full gap-2'>\n            <UnauthenticatedHeader />\n\n            <DarkModeToggle />\n\n            <Button variant='outline' size='icon' asChild>\n              <Link href={githubUrl} target='_blank' rel='noopener noreferrer'>\n                <GitHubIcon className='w-4 h-4' />\n              </Link>\n            </Button>\n\n            <AuthenticatedHeader />\n          </div>\n        </div>\n      </div>\n    </header>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/header/styles.module.css",
    "content": ".header {\n  position: sticky;\n  top: 0;\n  left: 0;\n  z-index: 49;\n\n  width: 100%;\n  max-width: 100vw;\n  overflow: hidden;\n  height: 55px;\n  min-height: 55px;\n\n  background: hsla(0, 0%, 100%, 0.8);\n  backdrop-filter: saturate(180%) blur(16px);\n\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: 12px 12px 0;\n  line-height: 1;\n}\n\n:global(.dark) .header {\n  background: transparent;\n  box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.1);\n  backdrop-filter: saturate(180%) blur(20px);\n}\n\n.headerContent {\n  align-self: center;\n  width: 100%;\n  max-width: 1200px;\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  gap: 1em;\n  min-height: 32px;\n}\n\n.navHeader {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  gap: var(--gap-w-1);\n\n  max-width: var(--max-width);\n  height: 100%;\n  margin: 0 auto;\n}\n"
  },
  {
    "path": "apps/web/src/components/header/unauthenticated-header.tsx",
    "content": "'use client'\n\nimport { ActiveLink } from '@/components/active-link'\nimport { useAgentic } from '@/components/agentic-provider'\nimport { Button } from '@/components/ui/button'\n\nexport function UnauthenticatedHeader() {\n  const ctx = useAgentic()\n\n  if (ctx?.isAuthenticated) {\n    return null\n  }\n\n  return (\n    <>\n      <Button asChild variant='outline'>\n        <ActiveLink href='/login' className='whitespace-nowrap px-4! py-2!'>\n          Log in\n        </ActiveLink>\n      </Button>\n\n      <Button asChild variant='default'>\n        <ActiveLink href='/signup' className='whitespace-nowrap px-4! py-2!'>\n          Sign up\n        </ActiveLink>\n      </Button>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/hero-button/index.tsx",
    "content": "import type * as React from 'react'\nimport type { Simplify } from 'type-fest'\n\nimport { Button, type ButtonProps } from '@/components/ui/button'\nimport { cn } from '@/lib/utils'\n\nimport styles from './styles.module.css'\n\nexport type HeroButtonVariant = 'orange' | 'blue' | 'purple'\n\nexport type HeroButtonProps = Simplify<\n  {\n    heroVariant?: HeroButtonVariant\n    className?: string\n    buttonClassName?: string\n  } & ButtonProps\n>\n\nexport function HeroButton({\n  heroVariant = 'purple',\n  className,\n  buttonClassName,\n  ...buttonProps\n}: HeroButtonProps) {\n  return (\n    <div className={cn(styles.heroButtonWrapper, className)}>\n      {heroVariant === 'blue' && (\n        <span className={cn(styles.heroButtonBg, styles.heroButtonBg1)} />\n      )}\n\n      {heroVariant === 'purple' && (\n        <span className={cn(styles.heroButtonBg, styles.heroButtonBg2)} />\n      )}\n\n      {heroVariant === 'orange' && (\n        <span className={cn(styles.heroButtonBg, styles.heroButtonBg3)} />\n      )}\n\n      <Button\n        className={cn(styles.heroButton, buttonClassName)}\n        type='button'\n        {...(buttonProps as any)}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/hero-button/styles.module.css",
    "content": ".heroButtonWrapper {\n  position: relative;\n  max-width: 100%;\n  z-index: 99;\n}\n\n.heroButtonBg1 {\n  --start-color: #00dfd8;\n  --end-color: #007cf0;\n  /* animation: heroBgAnimation1 8s infinite; */\n}\n\n.heroButtonBg2 {\n  --start-color: #ff0080;\n  --end-color: #7928ca;\n  /* animation: heroBgAnimation2 8s infinite; */\n}\n\n.heroButtonBg3 {\n  --start-color: #ff4d4d;\n  --end-color: #f9cb28;\n  /* animation: heroBgAnimation3 8s infinite; */\n}\n\n.heroButtonBg {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-image: linear-gradient(\n    165deg,\n    var(--start-color),\n    var(--end-color)\n  );\n  border-radius: 5px;\n  z-index: -2;\n}\n\n.heroButtonBg::before {\n  position: absolute;\n  content: '';\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: -1;\n  border: 12px solid transparent;\n  filter: blur(24px);\n  /* animation: pulse 2s ease-in-out infinite alternate; */\n  background-image: linear-gradient(\n    165deg,\n    var(--start-color),\n    var(--end-color)\n  );\n}\n\n.heroButton {\n  cursor: pointer;\n\n  background-color: var(--background);\n  background-clip: padding-box;\n  border: 1px solid transparent;\n  box-shadow: 0 4px 4px 0 #00000010;\n  color: var(--foreground);\n  transition-property: color, background-color, box-shadow;\n  transition-duration: 0.15s;\n  transition-timing-function: ease;\n  padding: 20px 24px;\n  border-radius: 5px;\n  max-width: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  user-select: none;\n  outline: none;\n  white-space: nowrap;\n\n  --lighten-color: hsla(0, 0%, 100%, 0.8);\n  background-image: linear-gradient(\n    to right,\n    var(--lighten-color),\n    var(--lighten-color)\n  );\n}\n\n:global(.dark) .heroButton {\n  --lighten-color: rgba(0, 0, 0, 0.75);\n}\n\n.heroButton:hover {\n  --lighten-color: transparent;\n  background-color: transparent;\n  color: var(--background);\n}\n\n.heroButton:focus:not(:active):not(:hover) {\n  border-color: var(--foreground);\n}\n\n.heroButton:active {\n  --lighten-color: hsla(0, 0%, 100%, 0.5);\n}\n\n.heroButtonWrapper:has(.heroButton:disabled) {\n  opacity: 0.3;\n  cursor: not-allowed;\n}\n\n.heroButtonWrapper:has(.heroButton:disabled) * {\n  pointer-events: none;\n}\n\n/* @keyframes heroBgAnimation1 {\n  0%,\n  16.667%,\n  to {\n    opacity: 1;\n  }\n  33%,\n  83.333% {\n    opacity: 0;\n  }\n}\n\n@keyframes heroBgAnimation2 {\n  0%,\n  16.667%,\n  66.667%,\n  to {\n    opacity: 0;\n  }\n  33.333%,\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes heroBgAnimation3 {\n  0%,\n  50%,\n  to {\n    opacity: 0;\n  }\n  66.667%,\n  83.333% {\n    opacity: 1;\n  }\n} */\n\n/* @keyframes pulse {\n  from {\n    filter: blur(8px);\n  }\n\n  to {\n    filter: blur(32px);\n  }\n} */\n"
  },
  {
    "path": "apps/web/src/components/hero-simulation-2.tsx",
    "content": "'use client'\n\nimport { Physics, useSphere } from '@react-three/cannon'\nimport { Environment, useTexture } from '@react-three/drei'\nimport { Canvas, useFrame, useThree } from '@react-three/fiber'\nimport {\n  Bloom,\n  EffectComposer,\n  // N8AO,\n  SMAA,\n  SSAO\n} from '@react-three/postprocessing'\nimport { useEffect, useState } from 'react'\nimport * as THREE from 'three'\n\nconst rfs = THREE.MathUtils.randFloatSpread\nconst sphereGeometry = new THREE.SphereGeometry(1, 32, 32)\nconst baubleMaterial = new THREE.MeshStandardMaterial({\n  color: 'white',\n  roughness: 0,\n  envMapIntensity: 1\n})\n\nexport function HeroSimulation2({ className }: { className?: string }) {\n  const [hovered, setHovered] = useState(false)\n\n  // Change cursor on hovered state\n  useEffect(() => {\n    if (hovered) {\n      document.body.style.cursor = 'none'\n    } else {\n      document.body.style.cursor = 'auto'\n    }\n    // document.body.style.cursor = hovered\n    //   ? 'none'\n    //   : `url('data:image/svg+xml;base64,${btoa(\n    //       '<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"#E8B059\"/></svg>'\n    //     )}'), auto`\n  }, [hovered])\n\n  return (\n    <Canvas\n      shadows\n      gl={{ antialias: false }}\n      dpr={[1, 1.5]}\n      camera={{ position: [0, 0, 20], fov: 35, near: 1, far: 40 }}\n      className={className}\n      onPointerOver={() => setHovered(true)}\n      onPointerOut={() => setHovered(false)}\n    >\n      <ambientLight intensity={0.5} />\n\n      <color attach='background' args={['#dfdfdf']} />\n\n      <spotLight\n        intensity={1}\n        angle={0.2}\n        penumbra={1}\n        position={[30, 30, 30]}\n        castShadow\n        shadow-mapSize={[512, 512]}\n      />\n\n      <Physics gravity={[0, 2, 0]} iterations={10}>\n        <Pointer />\n        <Clump />\n      </Physics>\n\n      <Environment files='/adamsbridge.hdr' />\n\n      <EffectComposer enableNormalPass={true} multisampling={0}>\n        <SSAO />\n        {/* <N8AO\n          halfRes\n          color='black'\n          aoRadius={2}\n          intensity={1}\n          aoSamples={6}\n          denoiseSamples={4}\n        /> */}\n\n        <Bloom mipmapBlur levels={7} intensity={0.3} />\n\n        <SMAA />\n      </EffectComposer>\n    </Canvas>\n  )\n}\n\nfunction Clump({\n  mat = new THREE.Matrix4(),\n  vec = new THREE.Vector3(),\n  numBalls = 64\n}) {\n  const texture = useTexture('/mcp.png')\n  const [ref, api] = useSphere(() => ({\n    args: [1],\n    mass: 1,\n    angularDamping: 0.1,\n    linearDamping: 0.65,\n    position: [rfs(20), rfs(20), rfs(20)]\n  }))\n\n  useFrame((_state, _delta) => {\n    for (let i = 0; i < numBalls; i++) {\n      // Get current whereabouts of the instanced sphere\n      ;(ref.current as any).getMatrixAt(i, mat)\n      // ref.current.children[i]!.getM(i, mat)\n\n      // Normalize the position and multiply by a negative force.\n      // This is enough to drive it towards the center-point.\n      api\n        .at(i)\n        ?.applyForce(\n          vec\n            .setFromMatrixPosition(mat)\n            .normalize()\n            .multiplyScalar(-40)\n            .toArray(),\n          [0, 0, 0]\n        )\n    }\n  })\n\n  return (\n    <instancedMesh\n      ref={ref}\n      castShadow\n      receiveShadow\n      args={[sphereGeometry, baubleMaterial, numBalls]}\n      material-map={texture}\n    />\n  )\n}\n\nfunction Pointer() {\n  const viewport = useThree((state) => state.viewport)\n  const [ref, api] = useSphere(() => ({\n    type: 'Kinematic',\n    args: [3],\n    position: [0, 0, 0]\n  }))\n\n  useFrame((state) =>\n    api.position.set(\n      (state.pointer.x * viewport.width) / 2,\n      (state.pointer.y * viewport.height) / 2,\n      0\n    )\n  )\n\n  return (\n    <mesh ref={ref} scale={0.2}>\n      <sphereGeometry />\n      <meshBasicMaterial color={[4, 4, 4]} toneMapped={false} />\n      <pointLight intensity={8} distance={10} />\n    </mesh>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/hero-simulation.tsx",
    "content": "'use client'\n\nimport {\n  MarchingCube,\n  MarchingCubes,\n  MeshTransmissionMaterial,\n  RenderTexture,\n  Text\n} from '@react-three/drei'\nimport { Canvas, useFrame } from '@react-three/fiber'\nimport { BallCollider, Physics, RigidBody } from '@react-three/rapier'\nimport { useRef } from 'react'\nimport { suspend } from 'suspend-react'\nimport * as THREE from 'three'\n\nconst inter = import('@pmndrs/assets/fonts/inter_regular.woff')\n\n// https://codesandbox.io/p/sandbox/metaballs-forked-g7xjjq?file=%2Fsrc%2FApp.js\n\nfunction MetaBall({\n  float = false,\n  strength = 0.5,\n  color,\n  vec = new THREE.Vector3(),\n  ...props\n}: {\n  float?: boolean\n  strength?: number\n  color?: string\n  vec?: THREE.Vector3\n} & Parameters<typeof RigidBody>[0]) {\n  const api = useRef<any>(null)\n\n  useFrame((_state, delta) => {\n    if (float) {\n      delta = Math.min(delta, 0.1)\n      api.current?.applyImpulse(\n        vec\n          //.set(-state.pointer.x, -state.pointer.y, 0)\n          .copy(api.current.translation())\n          .normalize()\n          .multiplyScalar(delta * -0.2)\n      )\n    }\n  })\n\n  return (\n    <RigidBody\n      ref={api}\n      colliders={false}\n      restitution={0.6}\n      linearDamping={4}\n      angularDamping={4}\n      {...props}\n    >\n      <MarchingCube\n        strength={strength}\n        subtract={6}\n        color={new THREE.Color(color)}\n      />\n\n      <BallCollider args={[0.1]} />\n    </RigidBody>\n  )\n}\n\nfunction Pointer({ vec = new THREE.Vector3() }) {\n  const ref = useRef<any>(null)\n\n  useFrame(({ pointer, viewport }) => {\n    const { width, height } = viewport.getCurrentViewport()\n    vec.set((pointer.x * width) / 2, (pointer.y * height) / 2, 0)\n    ref.current?.setNextKinematicTranslation(vec)\n  })\n\n  return (\n    <RigidBody type='kinematicPosition' colliders={false} ref={ref}>\n      <BallCollider args={[0.3]} />\n    </RigidBody>\n  )\n}\n\nexport function HeroSimulation({ className }: { className?: string }) {\n  return (\n    <Canvas\n      dpr={[1, 1.5]}\n      orthographic\n      camera={{ position: [0, 0, 5], zoom: 300 }}\n      className={className}\n    >\n      <color attach='background' args={['blue']} />\n\n      <ambientLight intensity={1} />\n\n      <Physics gravity={[0, -5, 0]}>\n        <MarchingCubes\n          resolution={40}\n          maxPolyCount={10_000}\n          enableUvs={false}\n          enableColors\n        >\n          <MeshTransmissionMaterial\n            thickness={0.4}\n            anisotropicBlur={0.1}\n            chromaticAberration={0.1}\n            vertexColors\n            roughness={0}\n          >\n            <RenderTexture attach='buffer'>\n              <color attach='background' args={[new THREE.Color(2, 2, 2)]} />\n\n              <Text\n                scale={0.25}\n                fontSize={1}\n                position={[0, 0, -5]}\n                letterSpacing={-0.025}\n                outlineWidth={0.03}\n                font={(suspend(inter) as any).default}\n                color='black'\n              >\n                MCP\n              </Text>\n            </RenderTexture>\n          </MeshTransmissionMaterial>\n\n          {Array.from({ length: 10 }, (_, index) => (\n            <MetaBall\n              float\n              strength={1}\n              key={'1' + index}\n              color='white'\n              position={[Math.random() * 0.5, Math.random() * 0.5, 0]}\n            />\n          ))}\n\n          <Pointer />\n        </MarchingCubes>\n      </Physics>\n\n      {/* <Environment\n        files=\"https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/1k/industrial_workshop_foundry_1k.hdr\"\n        environmentIntensity={0.5}\n      /> */}\n    </Canvas>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/loading-indicator/index.tsx",
    "content": "'use client'\n\n// import { AnimatePresence, motion } from 'motion/react'\nimport dynamic from 'next/dynamic'\nimport { useTheme } from 'next-themes'\n\nimport { cn } from '@/lib/utils'\n\nimport loadingDark from './loading-dark.json'\nimport loadingLight from './loading-light.json'\nimport styles from './styles.module.css'\n\nconst Lottie = dynamic(() => import('react-lottie-player'), {\n  ssr: false\n})\n\nexport function LoadingIndicator({ className }: { className?: string }) {\n  const { resolvedTheme } = useTheme()\n\n  return (\n    <Lottie\n      play\n      loop\n      animationData={resolvedTheme === 'dark' ? loadingDark : loadingLight}\n      className={cn(styles.loadingAnimation, className)}\n    />\n\n    // <AnimatePresence>\n    //   {isLoading ? (\n    //     <motion.div\n    //       className={cn(styles.loading, fill && styles.fill, className)}\n    //       transition={{ duration: 10 }}\n    //       exit={{ opacity: 0, ...exit }}\n    //       {...rest}\n    //     >\n    //       <Lottie\n    //         play\n    //         loop\n    //         animationData={\n    //           resolvedTheme === 'dark' ? loadingDark : loadingLight\n    //         }\n    //         className={styles.loadingAnimation}\n    //       />\n    //     </motion.div>\n    //   ) : null}\n    // </AnimatePresence>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/loading-indicator/loading-dark.json",
    "content": "{\n  \"assets\": [\n    {\n      \"id\": \"comp_1\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 0,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 3\",\n          \"ks\": {\n            \"o\": {\n              \"k\": [\n                {\n                  \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                  \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                  \"n\": [\"0p833_0p833_0p167_0p167\"],\n                  \"t\": 10.4,\n                  \"s\": [100],\n                  \"e\": [0]\n                },\n                { \"t\": 25.6 }\n              ]\n            },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [100, 100, 100] }\n          },\n          \"ao\": 0,\n          \"hasMask\": true,\n          \"masksProperties\": [\n            {\n              \"inv\": true,\n              \"mode\": \"a\",\n              \"pt\": {\n                \"k\": [\n                  {\n                    \"i\": { \"x\": 0.833, \"y\": 0.833 },\n                    \"o\": { \"x\": 0.167, \"y\": 0.167 },\n                    \"n\": \"0p833_0p833_0p167_0p167\",\n                    \"t\": 12,\n                    \"s\": [\n                      {\n                        \"i\": [\n                          [134.688, 0],\n                          [0, -134.688],\n                          [-134.688, 0],\n                          [0, 134.688]\n                        ],\n                        \"o\": [\n                          [-134.688, 0],\n                          [0, 134.688],\n                          [134.688, 0],\n                          [0, -134.688]\n                        ],\n                        \"v\": [\n                          [0, -244.875],\n                          [-243.875, -1],\n                          [0, 242.875],\n                          [243.875, -1]\n                        ],\n                        \"c\": true\n                      }\n                    ],\n                    \"e\": [\n                      {\n                        \"i\": [\n                          [176.731, 0],\n                          [0, -176.731],\n                          [-176.731, 0],\n                          [0, 176.731]\n                        ],\n                        \"o\": [\n                          [-176.731, 0],\n                          [0, 176.731],\n                          [176.731, 0],\n                          [0, -176.731]\n                        ],\n                        \"v\": [\n                          [0, -321],\n                          [-320, -1],\n                          [0, 319],\n                          [320, -1]\n                        ],\n                        \"c\": true\n                      }\n                    ]\n                  },\n                  { \"t\": 22.4 }\n                ]\n              },\n              \"o\": { \"k\": 100 },\n              \"x\": { \"k\": 0 },\n              \"nm\": \"Mask 1\"\n            }\n          ],\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [-24.109, -23.866],\n                        [-58.097, 2.286],\n                        [-4.307, 101.702],\n                        [108.95, -0.605],\n                        [0, 0],\n                        [36.992, -44.122],\n                        [100.991, -5.514],\n                        [22.177, 25.867],\n                        [6.132, 116.1],\n                        [-41.842, 62.08],\n                        [-30.638, 10.829],\n                        [-51.58, -26.549],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [24.109, 23.866],\n                        [74.937, -2.949],\n                        [5.422, -128.032],\n                        [-88.536, 0.492],\n                        [0, 0],\n                        [-17.89, 21.338],\n                        [-138.946, 7.586],\n                        [-22.174, -25.864],\n                        [-2.384, -45.141],\n                        [41.572, -61.679],\n                        [77.499, -27.393],\n                        [92.496, 47.608],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [116, 52],\n                        [197.891, 144.134],\n                        [328.097, 197.714],\n                        [497.578, 23.032],\n                        [311.536, -190.492],\n                        [139.357, -79.71],\n                        [-73.007, 190.878],\n                        [-281.054, 311.414],\n                        [-531.052, 222.093],\n                        [-620.132, 10.9],\n                        [-568.112, -177.098],\n                        [-425.186, -291.697],\n                        [-199.496, -289.608],\n                        [-46, -153]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 1\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ind\": 1,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [-44, -50],\n                        [-152, 2],\n                        [-63.813, 80.106],\n                        [89, 81],\n                        [84, 0],\n                        [52, -59],\n                        [38, -40],\n                        [81, 0],\n                        [-1.027, 116.034],\n                        [-81, 0],\n                        [-31, -36],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [44, 50],\n                        [105.034, -1.382],\n                        [94, -118],\n                        [-79.495, -72.35],\n                        [-84, 0],\n                        [-52, 59],\n                        [-36.789, 38.725],\n                        [-61.033, 0],\n                        [1, -113],\n                        [81, 0],\n                        [31, 36],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41, 152],\n                        [302, 310],\n                        [554, 190],\n                        [536, -217],\n                        [307, -309],\n                        [84, -198],\n                        [-176, 130],\n                        [-327, 196],\n                        [-500, -3],\n                        [-330, -192],\n                        [-183, -127],\n                        [-120, -57]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 8.8,\n                        \"s\": [30],\n                        \"e\": [0]\n                      },\n                      { \"t\": 22.4 }\n                    ],\n                    \"ix\": 1\n                  },\n                  \"e\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 8.8,\n                        \"s\": [30],\n                        \"e\": [60]\n                      },\n                      { \"t\": 22.4 }\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": { \"k\": -110, \"ix\": 3 },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 11 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 100,\n          \"st\": 0,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 1,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 2\",\n          \"ks\": {\n            \"o\": { \"k\": 100 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [100, 100, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [-24.109, -23.866],\n                        [-58.097, 2.286],\n                        [-4.307, 101.702],\n                        [108.95, -0.605],\n                        [0, 0],\n                        [36.992, -44.122],\n                        [100.991, -5.514],\n                        [22.177, 25.867],\n                        [6.132, 116.1],\n                        [-41.842, 62.08],\n                        [-30.638, 10.829],\n                        [-51.58, -26.549],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [24.109, 23.866],\n                        [74.937, -2.949],\n                        [5.422, -128.032],\n                        [-88.536, 0.492],\n                        [0, 0],\n                        [-17.89, 21.338],\n                        [-138.946, 7.586],\n                        [-22.174, -25.864],\n                        [-2.384, -45.141],\n                        [41.572, -61.679],\n                        [77.499, -27.393],\n                        [92.496, 47.608],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [116, 52],\n                        [197.891, 144.134],\n                        [328.097, 197.714],\n                        [497.578, 23.032],\n                        [311.536, -190.492],\n                        [139.357, -79.71],\n                        [-73.007, 190.878],\n                        [-281.054, 311.414],\n                        [-531.052, 222.093],\n                        [-620.132, 10.9],\n                        [-568.112, -177.098],\n                        [-425.186, -291.697],\n                        [-199.496, -289.608],\n                        [-46, -153]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 1\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ind\": 1,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [-44, -50],\n                        [-152, 2],\n                        [-63.813, 80.106],\n                        [89, 81],\n                        [84, 0],\n                        [52, -59],\n                        [38, -40],\n                        [81, 0],\n                        [-1.027, 116.034],\n                        [-81, 0],\n                        [-31, -36],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [44, 50],\n                        [105.034, -1.382],\n                        [94, -118],\n                        [-79.495, -72.35],\n                        [-84, 0],\n                        [-52, 59],\n                        [-36.789, 38.725],\n                        [-61.033, 0],\n                        [1, -113],\n                        [81, 0],\n                        [31, 36],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41, 152],\n                        [302, 310],\n                        [554, 190],\n                        [536, -217],\n                        [307, -309],\n                        [84, -198],\n                        [-176, 130],\n                        [-327, 196],\n                        [-500, -3],\n                        [-330, -192],\n                        [-183, -127],\n                        [-120, -57]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 26, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 0,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 40,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      { \"t\": 80 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 11 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 100,\n          \"st\": 0,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 2,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 1\",\n          \"ks\": {\n            \"o\": { \"k\": 100 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [102, 102, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41.593, 144.622],\n                        [169.506, 119.927],\n                        [189.109, 279.448],\n                        [324.733, 198.952],\n                        [451.572, 261.435],\n                        [464.308, 109.882],\n                        [591.263, 63.386],\n                        [489.394, -41.116],\n                        [545.422, -183.975],\n                        [401.99, -165.308],\n                        [315.929, -299.146],\n                        [228.713, -166.646],\n                        [75.238, -178.354],\n                        [75.296, -7.911],\n                        [-76.402, 13.881],\n                        [-74.277, 186.236],\n                        [-211.124, 169.355],\n                        [-300.932, 303.028],\n                        [-390.031, 173.297],\n                        [-533.818, 195.069],\n                        [-486.799, 51.51],\n                        [-603.444, -31.631],\n                        [-472.297, -92.031],\n                        [-477.325, -249.524],\n                        [-333.828, -192.011],\n                        [-212.105, -287.275],\n                        [-181.109, -134.238],\n                        [-48.486, -147.583]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 22, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 0,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 40,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      { \"t\": 80 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 10 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 100,\n          \"st\": 0,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 3,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 5\",\n          \"ks\": {\n            \"o\": { \"k\": 18 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [100, 100, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [-24.109, -23.866],\n                        [-58.097, 2.286],\n                        [-4.307, 101.702],\n                        [108.95, -0.605],\n                        [0, 0],\n                        [36.992, -44.122],\n                        [100.991, -5.514],\n                        [22.177, 25.867],\n                        [6.132, 116.1],\n                        [-41.842, 62.08],\n                        [-30.638, 10.829],\n                        [-51.58, -26.549],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [24.109, 23.866],\n                        [74.937, -2.949],\n                        [5.422, -128.032],\n                        [-88.536, 0.492],\n                        [0, 0],\n                        [-17.89, 21.338],\n                        [-138.946, 7.586],\n                        [-22.174, -25.864],\n                        [-2.384, -45.141],\n                        [41.572, -61.679],\n                        [77.499, -27.393],\n                        [92.496, 47.608],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [116, 52],\n                        [197.891, 144.134],\n                        [328.097, 197.714],\n                        [497.578, 23.032],\n                        [311.536, -190.492],\n                        [139.357, -79.71],\n                        [-73.007, 190.878],\n                        [-281.054, 311.414],\n                        [-531.052, 222.093],\n                        [-620.132, 10.9],\n                        [-568.112, -177.098],\n                        [-425.186, -291.697],\n                        [-199.496, -289.608],\n                        [-46, -153]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 1\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ind\": 1,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [-44, -50],\n                        [-152, 2],\n                        [-63.813, 80.106],\n                        [89, 81],\n                        [84, 0],\n                        [52, -59],\n                        [38, -40],\n                        [81, 0],\n                        [-1.027, 116.034],\n                        [-81, 0],\n                        [-31, -36],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [44, 50],\n                        [105.034, -1.382],\n                        [94, -118],\n                        [-79.495, -72.35],\n                        [-84, 0],\n                        [-52, 59],\n                        [-36.789, 38.725],\n                        [-61.033, 0],\n                        [1, -113],\n                        [81, 0],\n                        [31, 36],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41, 152],\n                        [302, 310],\n                        [554, 190],\n                        [536, -217],\n                        [307, -309],\n                        [84, -198],\n                        [-176, 130],\n                        [-327, 196],\n                        [-500, -3],\n                        [-330, -192],\n                        [-183, -127],\n                        [-120, -57]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 26, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": -33.6,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 6.4,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 46.4,\n                        \"s\": [720],\n                        \"e\": [1080]\n                      },\n                      { \"t\": 86.4 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 11 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": -33.6,\n          \"op\": 90.4,\n          \"st\": -33.6,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 4,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 4\",\n          \"ks\": {\n            \"o\": { \"k\": 18 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [102, 102, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41.593, 144.622],\n                        [169.506, 119.927],\n                        [189.109, 279.448],\n                        [324.733, 198.952],\n                        [451.572, 261.435],\n                        [464.308, 109.882],\n                        [591.263, 63.386],\n                        [489.394, -41.116],\n                        [545.422, -183.975],\n                        [401.99, -165.308],\n                        [315.929, -299.146],\n                        [228.713, -166.646],\n                        [75.238, -178.354],\n                        [75.296, -7.911],\n                        [-76.402, 13.881],\n                        [-74.277, 186.236],\n                        [-211.124, 169.355],\n                        [-300.932, 303.028],\n                        [-390.031, 173.297],\n                        [-533.818, 195.069],\n                        [-486.799, 51.51],\n                        [-603.444, -31.631],\n                        [-472.297, -92.031],\n                        [-477.325, -249.524],\n                        [-333.828, -192.011],\n                        [-212.105, -287.275],\n                        [-181.109, -134.238],\n                        [-48.486, -147.583]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 22, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": -33.6,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 6.4,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 46.4,\n                        \"s\": [720],\n                        \"e\": [1080]\n                      },\n                      { \"t\": 86.4 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 10 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": -33.6,\n          \"op\": 90.4,\n          \"st\": -33.6,\n          \"bm\": 0,\n          \"sr\": 1\n        }\n      ]\n    }\n  ],\n  \"layers\": [\n    {\n      \"ddd\": 0,\n      \"ind\": 0,\n      \"ty\": 0,\n      \"nm\": \"logo\",\n      \"td\": 1,\n      \"refId\": \"comp_1\",\n      \"ks\": {\n        \"o\": { \"k\": 100 },\n        \"r\": { \"k\": 0 },\n        \"p\": { \"k\": [80, 80, 0] },\n        \"a\": { \"k\": [700, 400, 0] },\n        \"s\": { \"k\": [10.286, 10.286, 100] }\n      },\n      \"ao\": 0,\n      \"w\": 1400,\n      \"h\": 800,\n      \"ip\": 0,\n      \"op\": 100,\n      \"st\": 0,\n      \"bm\": 0,\n      \"sr\": 1\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 1,\n      \"ty\": 1,\n      \"nm\": \"Dark Gray Solid 1\",\n      \"tt\": 3,\n      \"ks\": {\n        \"o\": { \"k\": 100 },\n        \"r\": { \"k\": 0 },\n        \"p\": { \"k\": [80, 80, 0] },\n        \"a\": { \"k\": [700, 400, 0] },\n        \"s\": { \"k\": [100, 100, 100] }\n      },\n      \"ao\": 0,\n      \"sw\": 1400,\n      \"sh\": 800,\n      \"sc\": \"#eeeeee\",\n      \"ip\": 0,\n      \"op\": 100,\n      \"st\": 0,\n      \"bm\": 0,\n      \"sr\": 1\n    }\n  ],\n  \"v\": \"4.5.3\",\n  \"ddd\": 0,\n  \"ip\": 0,\n  \"op\": 40,\n  \"fr\": 20,\n  \"w\": 160,\n  \"h\": 160\n}\n"
  },
  {
    "path": "apps/web/src/components/loading-indicator/loading-light.json",
    "content": "{\n  \"assets\": [\n    {\n      \"id\": \"comp_1\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 0,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 3\",\n          \"ks\": {\n            \"o\": {\n              \"k\": [\n                {\n                  \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                  \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                  \"n\": [\"0p833_0p833_0p167_0p167\"],\n                  \"t\": 10.4,\n                  \"s\": [100],\n                  \"e\": [0]\n                },\n                { \"t\": 25.6 }\n              ]\n            },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [100, 100, 100] }\n          },\n          \"ao\": 0,\n          \"hasMask\": true,\n          \"masksProperties\": [\n            {\n              \"inv\": true,\n              \"mode\": \"a\",\n              \"pt\": {\n                \"k\": [\n                  {\n                    \"i\": { \"x\": 0.833, \"y\": 0.833 },\n                    \"o\": { \"x\": 0.167, \"y\": 0.167 },\n                    \"n\": \"0p833_0p833_0p167_0p167\",\n                    \"t\": 12,\n                    \"s\": [\n                      {\n                        \"i\": [\n                          [134.688, 0],\n                          [0, -134.688],\n                          [-134.688, 0],\n                          [0, 134.688]\n                        ],\n                        \"o\": [\n                          [-134.688, 0],\n                          [0, 134.688],\n                          [134.688, 0],\n                          [0, -134.688]\n                        ],\n                        \"v\": [\n                          [0, -244.875],\n                          [-243.875, -1],\n                          [0, 242.875],\n                          [243.875, -1]\n                        ],\n                        \"c\": true\n                      }\n                    ],\n                    \"e\": [\n                      {\n                        \"i\": [\n                          [176.731, 0],\n                          [0, -176.731],\n                          [-176.731, 0],\n                          [0, 176.731]\n                        ],\n                        \"o\": [\n                          [-176.731, 0],\n                          [0, 176.731],\n                          [176.731, 0],\n                          [0, -176.731]\n                        ],\n                        \"v\": [\n                          [0, -321],\n                          [-320, -1],\n                          [0, 319],\n                          [320, -1]\n                        ],\n                        \"c\": true\n                      }\n                    ]\n                  },\n                  { \"t\": 22.4 }\n                ]\n              },\n              \"o\": { \"k\": 100 },\n              \"x\": { \"k\": 0 },\n              \"nm\": \"Mask 1\"\n            }\n          ],\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [-24.109, -23.866],\n                        [-58.097, 2.286],\n                        [-4.307, 101.702],\n                        [108.95, -0.605],\n                        [0, 0],\n                        [36.992, -44.122],\n                        [100.991, -5.514],\n                        [22.177, 25.867],\n                        [6.132, 116.1],\n                        [-41.842, 62.08],\n                        [-30.638, 10.829],\n                        [-51.58, -26.549],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [24.109, 23.866],\n                        [74.937, -2.949],\n                        [5.422, -128.032],\n                        [-88.536, 0.492],\n                        [0, 0],\n                        [-17.89, 21.338],\n                        [-138.946, 7.586],\n                        [-22.174, -25.864],\n                        [-2.384, -45.141],\n                        [41.572, -61.679],\n                        [77.499, -27.393],\n                        [92.496, 47.608],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [116, 52],\n                        [197.891, 144.134],\n                        [328.097, 197.714],\n                        [497.578, 23.032],\n                        [311.536, -190.492],\n                        [139.357, -79.71],\n                        [-73.007, 190.878],\n                        [-281.054, 311.414],\n                        [-531.052, 222.093],\n                        [-620.132, 10.9],\n                        [-568.112, -177.098],\n                        [-425.186, -291.697],\n                        [-199.496, -289.608],\n                        [-46, -153]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 1\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ind\": 1,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [-44, -50],\n                        [-152, 2],\n                        [-63.813, 80.106],\n                        [89, 81],\n                        [84, 0],\n                        [52, -59],\n                        [38, -40],\n                        [81, 0],\n                        [-1.027, 116.034],\n                        [-81, 0],\n                        [-31, -36],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [44, 50],\n                        [105.034, -1.382],\n                        [94, -118],\n                        [-79.495, -72.35],\n                        [-84, 0],\n                        [-52, 59],\n                        [-36.789, 38.725],\n                        [-61.033, 0],\n                        [1, -113],\n                        [81, 0],\n                        [31, 36],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41, 152],\n                        [302, 310],\n                        [554, 190],\n                        [536, -217],\n                        [307, -309],\n                        [84, -198],\n                        [-176, 130],\n                        [-327, 196],\n                        [-500, -3],\n                        [-330, -192],\n                        [-183, -127],\n                        [-120, -57]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 8.8,\n                        \"s\": [30],\n                        \"e\": [0]\n                      },\n                      { \"t\": 22.4 }\n                    ],\n                    \"ix\": 1\n                  },\n                  \"e\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 8.8,\n                        \"s\": [30],\n                        \"e\": [60]\n                      },\n                      { \"t\": 22.4 }\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": { \"k\": -110, \"ix\": 3 },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 11 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 100,\n          \"st\": 0,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 1,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 2\",\n          \"ks\": {\n            \"o\": { \"k\": 100 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [100, 100, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [-24.109, -23.866],\n                        [-58.097, 2.286],\n                        [-4.307, 101.702],\n                        [108.95, -0.605],\n                        [0, 0],\n                        [36.992, -44.122],\n                        [100.991, -5.514],\n                        [22.177, 25.867],\n                        [6.132, 116.1],\n                        [-41.842, 62.08],\n                        [-30.638, 10.829],\n                        [-51.58, -26.549],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [24.109, 23.866],\n                        [74.937, -2.949],\n                        [5.422, -128.032],\n                        [-88.536, 0.492],\n                        [0, 0],\n                        [-17.89, 21.338],\n                        [-138.946, 7.586],\n                        [-22.174, -25.864],\n                        [-2.384, -45.141],\n                        [41.572, -61.679],\n                        [77.499, -27.393],\n                        [92.496, 47.608],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [116, 52],\n                        [197.891, 144.134],\n                        [328.097, 197.714],\n                        [497.578, 23.032],\n                        [311.536, -190.492],\n                        [139.357, -79.71],\n                        [-73.007, 190.878],\n                        [-281.054, 311.414],\n                        [-531.052, 222.093],\n                        [-620.132, 10.9],\n                        [-568.112, -177.098],\n                        [-425.186, -291.697],\n                        [-199.496, -289.608],\n                        [-46, -153]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 1\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ind\": 1,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [-44, -50],\n                        [-152, 2],\n                        [-63.813, 80.106],\n                        [89, 81],\n                        [84, 0],\n                        [52, -59],\n                        [38, -40],\n                        [81, 0],\n                        [-1.027, 116.034],\n                        [-81, 0],\n                        [-31, -36],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [44, 50],\n                        [105.034, -1.382],\n                        [94, -118],\n                        [-79.495, -72.35],\n                        [-84, 0],\n                        [-52, 59],\n                        [-36.789, 38.725],\n                        [-61.033, 0],\n                        [1, -113],\n                        [81, 0],\n                        [31, 36],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41, 152],\n                        [302, 310],\n                        [554, 190],\n                        [536, -217],\n                        [307, -309],\n                        [84, -198],\n                        [-176, 130],\n                        [-327, 196],\n                        [-500, -3],\n                        [-330, -192],\n                        [-183, -127],\n                        [-120, -57]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 26, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 0,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 40,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      { \"t\": 80 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 11 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 100,\n          \"st\": 0,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 2,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 1\",\n          \"ks\": {\n            \"o\": { \"k\": 100 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [102, 102, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41.593, 144.622],\n                        [169.506, 119.927],\n                        [189.109, 279.448],\n                        [324.733, 198.952],\n                        [451.572, 261.435],\n                        [464.308, 109.882],\n                        [591.263, 63.386],\n                        [489.394, -41.116],\n                        [545.422, -183.975],\n                        [401.99, -165.308],\n                        [315.929, -299.146],\n                        [228.713, -166.646],\n                        [75.238, -178.354],\n                        [75.296, -7.911],\n                        [-76.402, 13.881],\n                        [-74.277, 186.236],\n                        [-211.124, 169.355],\n                        [-300.932, 303.028],\n                        [-390.031, 173.297],\n                        [-533.818, 195.069],\n                        [-486.799, 51.51],\n                        [-603.444, -31.631],\n                        [-472.297, -92.031],\n                        [-477.325, -249.524],\n                        [-333.828, -192.011],\n                        [-212.105, -287.275],\n                        [-181.109, -134.238],\n                        [-48.486, -147.583]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 22, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 0,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 40,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      { \"t\": 80 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 10 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 100,\n          \"st\": 0,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 3,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 5\",\n          \"ks\": {\n            \"o\": { \"k\": 18 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [100, 100, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [-24.109, -23.866],\n                        [-58.097, 2.286],\n                        [-4.307, 101.702],\n                        [108.95, -0.605],\n                        [0, 0],\n                        [36.992, -44.122],\n                        [100.991, -5.514],\n                        [22.177, 25.867],\n                        [6.132, 116.1],\n                        [-41.842, 62.08],\n                        [-30.638, 10.829],\n                        [-51.58, -26.549],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [24.109, 23.866],\n                        [74.937, -2.949],\n                        [5.422, -128.032],\n                        [-88.536, 0.492],\n                        [0, 0],\n                        [-17.89, 21.338],\n                        [-138.946, 7.586],\n                        [-22.174, -25.864],\n                        [-2.384, -45.141],\n                        [41.572, -61.679],\n                        [77.499, -27.393],\n                        [92.496, 47.608],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [116, 52],\n                        [197.891, 144.134],\n                        [328.097, 197.714],\n                        [497.578, 23.032],\n                        [311.536, -190.492],\n                        [139.357, -79.71],\n                        [-73.007, 190.878],\n                        [-281.054, 311.414],\n                        [-531.052, 222.093],\n                        [-620.132, 10.9],\n                        [-568.112, -177.098],\n                        [-425.186, -291.697],\n                        [-199.496, -289.608],\n                        [-46, -153]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 1\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ind\": 1,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [-44, -50],\n                        [-152, 2],\n                        [-63.813, 80.106],\n                        [89, 81],\n                        [84, 0],\n                        [52, -59],\n                        [38, -40],\n                        [81, 0],\n                        [-1.027, 116.034],\n                        [-81, 0],\n                        [-31, -36],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [44, 50],\n                        [105.034, -1.382],\n                        [94, -118],\n                        [-79.495, -72.35],\n                        [-84, 0],\n                        [-52, 59],\n                        [-36.789, 38.725],\n                        [-61.033, 0],\n                        [1, -113],\n                        [81, 0],\n                        [31, 36],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41, 152],\n                        [302, 310],\n                        [554, 190],\n                        [536, -217],\n                        [307, -309],\n                        [84, -198],\n                        [-176, 130],\n                        [-327, 196],\n                        [-500, -3],\n                        [-330, -192],\n                        [-183, -127],\n                        [-120, -57]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 26, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": -33.6,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 6.4,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 46.4,\n                        \"s\": [720],\n                        \"e\": [1080]\n                      },\n                      { \"t\": 86.4 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 11 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": -33.6,\n          \"op\": 90.4,\n          \"st\": -33.6,\n          \"bm\": 0,\n          \"sr\": 1\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 4,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer 4\",\n          \"ks\": {\n            \"o\": { \"k\": 18 },\n            \"r\": { \"k\": 0 },\n            \"p\": { \"k\": [700, 400, 0] },\n            \"a\": { \"k\": [0, 0, 0] },\n            \"s\": { \"k\": [102, 102, 100] }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ind\": 0,\n                  \"ty\": \"sh\",\n                  \"ks\": {\n                    \"k\": {\n                      \"i\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"o\": [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [0, 0]\n                      ],\n                      \"v\": [\n                        [41.593, 144.622],\n                        [169.506, 119.927],\n                        [189.109, 279.448],\n                        [324.733, 198.952],\n                        [451.572, 261.435],\n                        [464.308, 109.882],\n                        [591.263, 63.386],\n                        [489.394, -41.116],\n                        [545.422, -183.975],\n                        [401.99, -165.308],\n                        [315.929, -299.146],\n                        [228.713, -166.646],\n                        [75.238, -178.354],\n                        [75.296, -7.911],\n                        [-76.402, 13.881],\n                        [-74.277, 186.236],\n                        [-211.124, 169.355],\n                        [-300.932, 303.028],\n                        [-390.031, 173.297],\n                        [-533.818, 195.069],\n                        [-486.799, 51.51],\n                        [-603.444, -31.631],\n                        [-472.297, -92.031],\n                        [-477.325, -249.524],\n                        [-333.828, -192.011],\n                        [-212.105, -287.275],\n                        [-181.109, -134.238],\n                        [-48.486, -147.583]\n                      ],\n                      \"c\": false\n                    }\n                  },\n                  \"nm\": \"Path 2\",\n                  \"mn\": \"ADBE Vector Shape - Group\"\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": { \"k\": 0, \"ix\": 1 },\n                  \"e\": { \"k\": 22, \"ix\": 2 },\n                  \"o\": {\n                    \"k\": [\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": -33.6,\n                        \"s\": [0],\n                        \"e\": [360]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 6.4,\n                        \"s\": [360],\n                        \"e\": [720]\n                      },\n                      {\n                        \"i\": { \"x\": [0.833], \"y\": [0.833] },\n                        \"o\": { \"x\": [0.167], \"y\": [0.167] },\n                        \"n\": [\"0p833_0p833_0p167_0p167\"],\n                        \"t\": 46.4,\n                        \"s\": [720],\n                        \"e\": [1080]\n                      },\n                      { \"t\": 86.4 }\n                    ],\n                    \"ix\": 3\n                  },\n                  \"m\": 1,\n                  \"ix\": 3,\n                  \"nm\": \"Trim Paths 1\",\n                  \"mn\": \"ADBE Vector Filter - Trim\"\n                },\n                {\n                  \"ty\": \"st\",\n                  \"fillEnabled\": true,\n                  \"c\": { \"k\": [1, 1, 1, 1] },\n                  \"o\": { \"k\": 100 },\n                  \"w\": { \"k\": 10 },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"nm\": \"Stroke 1\",\n                  \"mn\": \"ADBE Vector Graphic - Stroke\"\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": { \"k\": [0, 0], \"ix\": 2 },\n                  \"a\": { \"k\": [0, 0], \"ix\": 1 },\n                  \"s\": { \"k\": [100, 100], \"ix\": 3 },\n                  \"r\": { \"k\": 0, \"ix\": 6 },\n                  \"o\": { \"k\": 100, \"ix\": 7 },\n                  \"sk\": { \"k\": 0, \"ix\": 4 },\n                  \"sa\": { \"k\": 0, \"ix\": 5 },\n                  \"nm\": \"Transform\"\n                }\n              ],\n              \"nm\": \"Shape 1\",\n              \"np\": 4,\n              \"mn\": \"ADBE Vector Group\"\n            }\n          ],\n          \"ip\": -33.6,\n          \"op\": 90.4,\n          \"st\": -33.6,\n          \"bm\": 0,\n          \"sr\": 1\n        }\n      ]\n    }\n  ],\n  \"layers\": [\n    {\n      \"ddd\": 0,\n      \"ind\": 0,\n      \"ty\": 0,\n      \"nm\": \"logo\",\n      \"td\": 1,\n      \"refId\": \"comp_1\",\n      \"ks\": {\n        \"o\": { \"k\": 100 },\n        \"r\": { \"k\": 0 },\n        \"p\": { \"k\": [80, 80, 0] },\n        \"a\": { \"k\": [700, 400, 0] },\n        \"s\": { \"k\": [10.286, 10.286, 100] }\n      },\n      \"ao\": 0,\n      \"w\": 1400,\n      \"h\": 800,\n      \"ip\": 0,\n      \"op\": 100,\n      \"st\": 0,\n      \"bm\": 0,\n      \"sr\": 1\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 1,\n      \"ty\": 1,\n      \"nm\": \"Dark Gray Solid 1\",\n      \"tt\": 3,\n      \"ks\": {\n        \"o\": { \"k\": 100 },\n        \"r\": { \"k\": 0 },\n        \"p\": { \"k\": [80, 80, 0] },\n        \"a\": { \"k\": [700, 400, 0] },\n        \"s\": { \"k\": [100, 100, 100] }\n      },\n      \"ao\": 0,\n      \"sw\": 1400,\n      \"sh\": 800,\n      \"sc\": \"#232323\",\n      \"ip\": 0,\n      \"op\": 100,\n      \"st\": 0,\n      \"bm\": 0,\n      \"sr\": 1\n    }\n  ],\n  \"v\": \"4.5.3\",\n  \"ddd\": 0,\n  \"ip\": 0,\n  \"op\": 40,\n  \"fr\": 20,\n  \"w\": 160,\n  \"h\": 160\n}\n"
  },
  {
    "path": "apps/web/src/components/loading-indicator/styles.module.css",
    "content": ".loading {\n  position: relative;\n  pointer-events: none;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  margin: 0 auto;\n}\n\n.fill {\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.loadingAnimation {\n  pointer-events: none;\n  width: 200px;\n  height: 200px;\n  max-width: 50vw;\n  max-height: 50vh;\n}\n"
  },
  {
    "path": "apps/web/src/components/markdown/index.tsx",
    "content": "import { cn } from '@/lib/utils'\n\nimport styles from './styles.module.css'\n\nexport function Markdown({\n  children,\n  className\n}: {\n  className?: string\n  children: React.ReactNode\n}) {\n  return (\n    <div className={cn('prose dark:prose-invert', styles.markdown, className)}>\n      {children}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/markdown/ssr-markdown.tsx",
    "content": "'use client'\n\nimport { markdownToHtml } from '@fisch0920/markdown-to-html'\nimport { useAsync } from 'react-use'\n\nimport { cn } from '@/lib/utils'\n\nimport { LoadingIndicator } from '../loading-indicator'\nimport styles from './styles.module.css'\n\n// TODO: figure out how to make this server-only to not bloat the client-side bundle\nexport function SSRMarkdown({\n  className,\n  markdown\n}: {\n  className?: string\n  markdown: string\n}) {\n  const { value: html, loading } = useAsync(\n    async () => markdownToHtml(markdown),\n    [markdown]\n  )\n\n  if (loading) {\n    return (\n      <div className={cn('flex justify-center items-center h-full', className)}>\n        <LoadingIndicator />\n      </div>\n    )\n  }\n\n  return (\n    <div\n      className={cn('prose dark:prose-invert', styles.markdown, className)}\n      dangerouslySetInnerHTML={{ __html: html! }}\n    />\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/markdown/styles.module.css",
    "content": ".markdown {\n  width: 100%;\n  max-width: 100%;\n  line-height: 1.6;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.markdown > * {\n  margin-bottom: 1em;\n  width: 100%;\n  max-width: 830px;\n}\n\n.markdown > :last-child {\n  margin-bottom: 0;\n}\n\n.markdown > *:first-child {\n  margin-top: 0 !important;\n}\n\n.markdown img {\n  display: inline-block;\n  max-width: 100%;\n  margin: 0;\n}\n\n.markdown a:not(:has(img)) {\n  display: inline-block;\n  text-decoration: none;\n  font-weight: inherit;\n  line-height: 1.3;\n  position: relative;\n  transition: unset;\n  opacity: 1;\n  color: unset;\n  padding-bottom: 0.1rem;\n  border-color: var(--border);\n  border-bottom-width: 0.135rem;\n  background: transparent;\n  background-origin: border-box;\n  background-repeat: no-repeat;\n  background-position: 50% 100%;\n  background-size: 0 0.135rem;\n}\n\n.markdown a:hover:not(:has(img)),\n.markdown a:focus:not(:has(img)) {\n  color: var(--tw-prose-links);\n  text-decoration: none;\n  border-bottom-color: transparent;\n\n  background-image: linear-gradient(90.68deg, #b439df 0.26%, #e5337e 102.37%);\n  background-repeat: no-repeat;\n  background-position: 0 100%;\n  background-size: 100% 0.135rem;\n\n  transition-property: background-position, background-size;\n  transition-duration: 300ms;\n}\n\n.markdown :where(ul):not(:where([class~='not-prose'], [class~='not-prose'] *)) {\n  margin-top: 1em;\n}\n\n.markdown p + ul,\n.markdown p + ol,\n.markdown h1 + ul,\n.markdown h2 + ul,\n.markdown h3 + ul,\n.markdown h4 + ul,\n.markdown h5 + ul,\n.markdown h6 + ul,\n.markdown h1 + ol,\n.markdown h2 + ol,\n.markdown h3 + ol,\n.markdown h4 + ol,\n.markdown h5 + ol,\n.markdown h6 + ol {\n  margin-top: 0;\n}\n\n.markdown p {\n  margin-top: 0;\n  margin-bottom: 1em;\n}\n\n.markdown li a {\n  margin: 0;\n}\n\n.markdown li:first-child {\n  margin-top: 0;\n}\n\n.markdown li:last-child {\n  margin-bottom: 0;\n}\n\n.markdown h1,\n.markdown h2,\n.markdown h3,\n.markdown h4,\n.markdown h5,\n.markdown h6 {\n  margin-top: 1.5em;\n  margin-bottom: 0.5em;\n  font-weight: 600;\n  line-height: 1.25;\n}\n\n.markdown h1 {\n  font-size: 2em;\n}\n\n.markdown h2 {\n  font-size: 1.5em;\n}\n\n.markdown h3 {\n  font-size: 1.25em;\n}\n\n.markdown h4 {\n  font-size: 1em;\n}\n\n.markdown h5 {\n  font-size: 1em;\n  font-weight: 700;\n}\n\n.markdown h6 {\n  font-size: 1em;\n  font-weight: 500;\n}\n\n@media (max-width: 800px) {\n  .markdown img {\n    display: block;\n    text-align: center;\n    margin: 0 auto;\n  }\n}\n"
  },
  {
    "path": "apps/web/src/components/mcp-gateway-features.tsx",
    "content": "'use client'\n\nimport {\n  ChartNoAxesCombinedIcon,\n  CheckCheckIcon,\n  CreditCardIcon,\n  DatabaseZapIcon,\n  HistoryIcon,\n  KeyRoundIcon,\n  ShieldCheckIcon,\n  TextSelectIcon,\n  UserIcon\n} from 'lucide-react'\n\nimport { Feature, type FeatureData } from './feature'\n\nconst docsPublishingUrl = 'https://docs.agentic.so/publishing'\n\nconst mcpGatewayFeatures: FeatureData[] = [\n  {\n    name: 'Auth',\n    description: (\n      <>\n        Ship to production fast with Agentic's free, hosted authentication.\n        Email & password, OAuth, GitHub, Google, Twitter, etc – if your origin\n        API requires OAuth credentials, Agentic likely already supports it, and\n        if not, we'd be happy to add it.\n      </>\n    ),\n    icon: UserIcon,\n    href: `${docsPublishingUrl}/config/auth`,\n    pattern: {\n      y: 16,\n      squares: [\n        [0, 1],\n        [1, 3]\n      ]\n    }\n  },\n  {\n    name: 'Stripe Billing',\n    description: (\n      <>\n        Charge for your MCP products with a flexible, declarative pricing model\n        built on top of Stripe. Agentic supports almost any combination of fixed\n        and <span className='font-semibold'>usage-based billing</span> models,\n        both at the MCP level, at the tool-call level, and at the custom metric\n        level (e.g., tokens, image transformations, etc).\n      </>\n    ),\n    icon: CreditCardIcon,\n    href: `${docsPublishingUrl}/config/pricing`,\n    pattern: {\n      y: -6,\n      squares: [\n        [-1, 2],\n        [1, 3]\n      ]\n    }\n  },\n  {\n    name: 'Support both MCP and HTTP',\n    description: (\n      <>\n        All Agentic tools are exposed as both{' '}\n        <span className='font-semibold'>MCP servers</span> as well as simple{' '}\n        <span className='font-semibold'>HTTP APIs</span>. MCP is important for\n        interop and future-proofing, whereas simple HTTP POST requests make\n        tools easy to debug and simplifies usage with LLM tool calling.\n      </>\n    ),\n    icon: CheckCheckIcon,\n    pattern: {\n      y: 32,\n      squares: [\n        [0, 2],\n        [1, 4]\n      ]\n    }\n  },\n  {\n    name: 'API Keys',\n    description: (\n      <>\n        When a customer subscribes to your product, they're given a unique API\n        key. MCP URLs are appended with this API key to correlate usage with\n        their subscription. Customer HTTP tool calls use the same API key as a\n        standard HTTP <em>Authorization</em> header.\n      </>\n    ),\n    icon: KeyRoundIcon,\n    pattern: {\n      y: 22,\n      squares: [[0, 1]]\n    }\n  },\n  {\n    name: 'Rate-Limiting',\n    description: (\n      <>\n        Agentic durable rate-limiting is built on top of Cloudflare's global\n        infrastructure. Customize the default rate-limits, change them based on\n        a customer's pricing plan, or create custom tool-specific overrides.\n        REST assured that your origin API will be safe behind Agentic's MCP\n        gateway.\n      </>\n    ),\n    icon: ShieldCheckIcon,\n    href: `${docsPublishingUrl}/config/rate-limits`,\n    pattern: {\n      y: 2,\n      squares: [\n        [-2, 3],\n        [1, 4]\n      ]\n    }\n  },\n  {\n    name: 'Caching',\n    description: (\n      <>\n        Opt-in to caching with familiar <em>cache-control</em> and{' '}\n        <em>stale-while-revalidate</em> options. MCP tool calls include caching\n        information in their <em>_meta</em> fields, providing parity with\n        standard HTTP headers. Agentic uses Cloudflare's global edge cache for\n        caching, which guarantees unmatched global performance.\n      </>\n    ),\n    icon: DatabaseZapIcon,\n    href: `${docsPublishingUrl}/config/caching`,\n    pattern: {\n      y: 8,\n      squares: [\n        [0, 2],\n        [-1, 1]\n      ]\n    }\n  },\n  {\n    name: 'Analytics',\n    description: (\n      <>\n        Agentic tracks all tool calls for usage-based billing and analytics at a\n        fine-grained level, so you can drill in and deeply understand how your\n        customers are using your product.\n      </>\n    ),\n    icon: ChartNoAxesCombinedIcon,\n    pattern: {\n      y: -2,\n      squares: [[-2, 2]]\n    }\n  },\n  {\n    name: 'Versioning & Instant Rollbacks',\n    description: (\n      <>\n        Agentic uses immutable deployments, so every time you make a change to\n        your product, a unique preview deployment is created. This enables\n        instant rollbacks if there are problems with a deployment. Publishing\n        uses <span className='font-semibold'>semver</span> (semantic\n        versioning), so your customers can choose how to handle breaking\n        changes.\n      </>\n    ),\n    icon: HistoryIcon,\n    pattern: {\n      y: 26,\n      squares: [\n        [2, 4],\n        [-2, 3]\n      ]\n    }\n  },\n  {\n    name: \"That's just the start\",\n    description: (\n      <>Check out our docs for more details on Agentic's MCP gateway.</>\n    ),\n    href: `${docsPublishingUrl}/quickstart`,\n    icon: TextSelectIcon,\n    pattern: {\n      y: 13,\n      squares: [\n        [0, 2],\n        [-1, 4]\n      ]\n    }\n  }\n]\n\nexport function MCPGatewayFeatures() {\n  return (\n    <div className='xl:max-w-none'>\n      <div className='not-prose grid grid-cols-1 gap-8 sm:grid-cols-2 xl:grid-cols-3'>\n        {mcpGatewayFeatures.map((feature) => (\n          <Feature key={feature.name} {...feature} />\n        ))}\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/mcp-marketplace-features.tsx",
    "content": "'use client'\n\nimport {\n  CreditCardIcon,\n  FileJsonIcon,\n  HistoryIcon,\n  ShieldCheckIcon,\n  StarIcon,\n  ZapIcon\n} from 'lucide-react'\n\nimport { Feature, type FeatureData } from './feature'\n\nconst mcpMarketplaceFeatures: FeatureData[] = [\n  {\n    name: 'Highly Curated',\n    description: (\n      <>\n        <span className='font-semibold'>\n          All Agentic tools have been hand-crafted specifically for LLM tool\n          use.\n        </span>{' '}\n        We call this Agentic UX, and it's at the heart of why Agentic tools work\n        better for LLM &amp; MCP use cases than legacy APIs.\n      </>\n    ),\n    icon: StarIcon,\n    pattern: {\n      y: 16,\n      squares: [\n        [0, 1],\n        [1, 3]\n      ]\n    }\n  },\n  {\n    name: 'Production-Ready MCP Support',\n    description: (\n      <>\n        Forget random GitHub repos and gluing local MCP servers together.\n        Agentic tools are all battle-tested in production and come with real\n        SLAs.\n      </>\n    ),\n    icon: ShieldCheckIcon,\n    pattern: {\n      y: 22,\n      squares: [[0, 1]]\n    }\n  },\n  {\n    name: 'World-Class TypeScript DX',\n    description: (\n      <>\n        Agentic is written in TypeScript and strives for a Vercel-like DX.\n        <span className='font-semibold'>One-line tool integrations</span> for\n        all of the popular TS LLM SDKs (\n        <span className='font-semibold'>Vercel AI SDK</span>,{' '}\n        <span className='font-semibold'>OpenAI</span>,{' '}\n        <span className='font-semibold'>LangChain</span>, etc).\n      </>\n    ),\n    icon: FileJsonIcon,\n    pattern: {\n      y: 8,\n      squares: [\n        [0, 2],\n        [-1, 1]\n      ]\n    }\n  },\n  {\n    name: 'Stripe Billing',\n    description: (\n      <>\n        Agentic uses Stripe for billing, and most tools are{' '}\n        <span className='font-semibold'>usage-based</span>, so you'll only pay\n        for what you (and your agents) actually use.\n      </>\n    ),\n    icon: CreditCardIcon,\n    pattern: {\n      y: -6,\n      squares: [\n        [-1, 2],\n        [1, 3]\n      ]\n    }\n  },\n  {\n    name: 'Blazing Fast MCP Gateway',\n    description: (\n      <>\n        Agentic's MCP gateway is powered by{' '}\n        <span className='font-semibold'>Cloudflare's global edge network</span>.\n        Tools come with customizable caching and rate-limits, so you can REST\n        assured that your agents will always have a fast and reliable\n        experience.\n      </>\n    ),\n    icon: ZapIcon,\n    pattern: {\n      y: 32,\n      squares: [\n        [0, 2],\n        [1, 4]\n      ]\n    }\n  },\n  {\n    name: 'Semantic Versioning',\n    description: (\n      <>\n        All Agentic tools are versioned using{' '}\n        <span className='font-semibold'>semver</span>, so you can choose how to\n        handle breaking changes.\n      </>\n    ),\n    icon: HistoryIcon,\n    pattern: {\n      y: 26,\n      squares: [\n        [2, 4],\n        [-2, 3]\n      ]\n    }\n  }\n]\n\nexport function MCPMarketplaceFeatures() {\n  return (\n    <div className='xl:max-w-none'>\n      <div className='not-prose grid grid-cols-1 gap-8 sm:grid-cols-2 xl:grid-cols-3'>\n        {mcpMarketplaceFeatures.map((feature) => (\n          <Feature key={feature.name} {...feature} />\n        ))}\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/page-container.tsx",
    "content": "import { cn } from '@/lib/utils'\n\nexport function PageContainer({\n  background = true,\n  compact = false,\n  className,\n  children\n}: {\n  background?: boolean\n  compact?: boolean\n  className?: string\n  children: React.ReactNode\n}) {\n  return (\n    <>\n      {background && (\n        <div className='absolute top-0 left-0 w-[100vw] h-[100vh] bg-top-right bg-no-repeat bg-size-[100vw_50vh] md:bg-auto -z-10 dark:bg-size-[100%_100%] dark:bg-center dark:w-[calc(max(100vw,1500px))] dark:h-[calc(max(100vh,1200px))] dark:left-[calc(min((100vw-1500px)/2,0px))] bg-[url(/bg.png)] dark:bg-[url(/bg-dark.jpg)]' />\n      )}\n\n      <div\n        className={cn(\n          'relative w-full flex-1 flex flex-col items-center max-w-[1200px] gap-16 z-10',\n          compact ? 'pt-4' : 'pt-8',\n          className\n        )}\n      >\n        {children}\n      </div>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/posthog-provider.tsx",
    "content": "'use client'\n\nimport { usePathname, useSearchParams } from 'next/navigation'\nimport { posthog } from 'posthog-js'\nimport { PostHogProvider as PHProvider, usePostHog } from 'posthog-js/react'\nimport { Suspense, useEffect, useState } from 'react'\n\nimport { posthogHost, posthogKey } from '@/lib/config'\n\nexport function PostHogProvider({ children }: { children: React.ReactNode }) {\n  useEffect(() => {\n    if (posthogKey) {\n      posthog.init(posthogKey, {\n        api_host: posthogHost,\n        person_profiles: 'identified_only', // or 'always' to create profiles for anonymous users as well\n        capture_pageview: false // Disable automatic pageview capture, as we capture manually\n      })\n    }\n  }, [])\n\n  if (!posthogKey) {\n    return children\n  }\n\n  return (\n    <PHProvider client={posthog}>\n      <SuspendedPostHogPageView />\n\n      {children}\n    </PHProvider>\n  )\n}\n\nfunction PostHogPageView() {\n  const pathname = usePathname()\n  const searchParams = useSearchParams()\n  const posthog = usePostHog()\n  const [prevPathname, setPrevPathname] = useState<string | null>(null)\n\n  // Track pageviews\n  useEffect(() => {\n    if (pathname && posthog) {\n      let url = globalThis.window.origin + pathname\n      if (searchParams.toString()) {\n        url = url + '?' + searchParams.toString()\n      }\n\n      if (prevPathname && prevPathname !== pathname) {\n        posthog.capture('$pageleave', { $pathname: prevPathname })\n      }\n\n      posthog.capture('$pageview', { $current_url: url })\n      setPrevPathname(pathname)\n    }\n  }, [pathname, prevPathname, searchParams, posthog])\n\n  return null\n}\n\n// Wrap PostHogPageView in Suspense to avoid the useSearchParams usage above\n// from de-opting the whole app into client-side rendering\n// See: https://nextjs.org/docs/messages/deopted-into-client-rendering\nfunction SuspendedPostHogPageView() {\n  return (\n    <Suspense fallback={null}>\n      <PostHogPageView />\n    </Suspense>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/project-pricing-plans/index.tsx",
    "content": "import {\n  type Consumer,\n  getPricingPlansByInterval,\n  type PricingInterval,\n  type Project\n} from '@agentic/platform-types'\nimport { useLocalStorage } from 'react-use'\n\nimport { ProjectPricingPlan } from './project-pricing-plan'\n\nexport function ProjectPricingPlans({\n  project,\n  consumer,\n  isLoadingStripeCheckoutForPlan,\n  onSubscribe\n}: {\n  project: Project\n  consumer?: Consumer\n  isLoadingStripeCheckoutForPlan: string | null\n  onSubscribe: (planSlug: string) => void\n  className?: string\n}) {\n  const { defaultPricingInterval } = project\n  // TODO\n  const [pricingInterval, _setPricingInterval] =\n    useLocalStorage<PricingInterval>(\n      `pricing-interval-${project.identifier}`,\n      defaultPricingInterval\n    )\n\n  const deployment = project.lastPublishedDeployment\n  if (!deployment || !pricingInterval) {\n    return null\n  }\n\n  // const numPricingIntervals = deployment.pricingIntervals.length\n  // const hasSinglePricingInterval = numPricingIntervals === 1\n  const { pricingPlans } = deployment\n\n  const pricingPlansByInterval = Object.fromEntries(\n    deployment.pricingIntervals.map((pricingInterval) => [\n      pricingInterval,\n      getPricingPlansByInterval({ pricingInterval, pricingPlans })\n    ])\n  )\n\n  const currentPricingIntervalPlans =\n    pricingPlansByInterval[pricingInterval] ?? []\n\n  // TODO: add support for different pricing intervals and switching between them\n  const numPricingPlans = currentPricingIntervalPlans.length || 1\n\n  return (\n    <div className='flex flex-col gap-4'>\n      {/* {!hasSinglePricingInterval && ()} */}\n\n      <div\n        className={`grid grid-cols grid-cols-1 gap-4 sm:grid-cols-${Math.min(\n          2,\n          numPricingPlans\n        )} xl:grid-cols-${Math.min(3, numPricingPlans)}`}\n      >\n        {deployment.pricingPlans.map((plan) => (\n          <ProjectPricingPlan\n            key={plan.slug}\n            plan={plan}\n            project={project}\n            consumer={consumer}\n            isLoadingStripeCheckoutForPlan={isLoadingStripeCheckoutForPlan}\n            onSubscribe={onSubscribe}\n          />\n        ))}\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/project-pricing-plans/project-pricing-plan.tsx",
    "content": "import type {\n  Consumer,\n  // PricingInterval,\n  PricingPlan,\n  Project\n} from '@agentic/platform-types'\nimport humanNumber from 'human-number'\nimport {\n  CornerDownRightIcon,\n  Loader2Icon,\n  PlusIcon,\n  ShieldCheckIcon,\n  ShieldMinusIcon\n} from 'lucide-react'\nimport Link from 'next/link'\nimport plur from 'plur'\n\nimport { Button } from '@/components/ui/button'\nimport {\n  getRateLimitIntervalLabel,\n  pricingAmountToFixedString\n} from '@/lib/utils'\n\n// const intervalToLabelMap: Record<PricingInterval, string> = {\n//   day: 'daily',\n//   week: 'weekly',\n//   month: 'monthly',\n//   year: 'yearly'\n// }\n\nexport function ProjectPricingPlan({\n  project,\n  plan,\n  consumer,\n  isLoadingStripeCheckoutForPlan,\n  onSubscribe\n}: {\n  project: Project\n  plan: PricingPlan\n  consumer?: Consumer\n  isLoadingStripeCheckoutForPlan: string | null\n  onSubscribe: (planSlug: string) => void\n  className?: string\n}) {\n  const { defaultPricingInterval } = project\n  const { lineItems } = plan\n  const interval = plan.interval ?? defaultPricingInterval\n  // const intervalLabel = intervalToLabelMap[interval]\n  const baseLineItem = lineItems.find((lineItem) => lineItem.slug === 'base')\n  const requestsLineItem = lineItems.find(\n    (lineItem) => lineItem.slug === 'requests'\n  )\n  const isFreePlan = plan.slug === 'free'\n\n  const deployment = project.lastPublishedDeployment\n  const requestsRateLimit = plan.rateLimit ?? deployment?.defaultRateLimit\n\n  // TODO: support custom line-items\n  // const customLineItems = lineItems.find(\n  //   (lineItem) => lineItem.slug !== 'base' && lineItem.slug !== 'requests'\n  // )\n\n  // TODO: support defaultAggregation\n  // TODO: support trialPeriodDays\n  // TODO: highlight if any tools are disabled on this pricing plan\n\n  return (\n    <div className='justify-self-center w-full grid grid-cols-1 rounded-[2rem] shadow-[inset_0_0_2px_1px_#ffffff4d] ring-1 ring-black/5 max-lg:mx-auto max-lg:w-full max-lg:max-w-md max-w-lg'>\n      <div className='grid grid-cols-1 rounded-[2rem] p-2 shadow-md shadow-black/5'>\n        <div className='rounded-3xl bg-card p-4 shadow-2xl ring-1 ring-black/5 flex flex-col gap-4 color-card-foreground justify-between'>\n          <div className='flex flex-col gap-4'>\n            <h3 className='text-center text-balance leading-snug md:leading-none text-xl font-semibold'>\n              {plan.name} <span className='sr-only'>Plan</span>\n            </h3>\n\n            {plan.description && <p>{plan.description}</p>}\n\n            <div className='flex flex-row items-center gap-2'>\n              <div className='text-4xl font-semibold leading-none py-2'>\n                $\n                {baseLineItem\n                  ? pricingAmountToFixedString(baseLineItem.amount)\n                  : 0}\n              </div>\n\n              <div className='text-sm'>/ {interval}</div>\n            </div>\n\n            {requestsLineItem && !isFreePlan && (\n              <div className='flex flex-col gap-2'>\n                <h4 className='text-sm/6 font-medium'>Requests:</h4>\n\n                {requestsLineItem.billingScheme === 'per_unit' ? (\n                  <div className='ml-4 flex flex-row items-center gap-2'>\n                    <div className='text-xl font-semibold leading-none py-2'>\n                      ${pricingAmountToFixedString(requestsLineItem.unitAmount)}\n                    </div>\n\n                    <div className='text-sm'>\n                      / per{' '}\n                      {requestsLineItem.transformQuantity\n                        ? `${requestsLineItem.transformQuantity.divideBy} ${plur('request', requestsLineItem.transformQuantity.divideBy)}`\n                        : 'request'}\n                    </div>\n                  </div>\n                ) : requestsLineItem.billingScheme === 'tiered' ? (\n                  <div className='ml-4 flex flex-col gap-2'>\n                    {requestsLineItem.tiers?.map((tier, index) => {\n                      const isFirst = index === 0\n                      const hasUnitAmount = tier.unitAmount !== undefined\n                      const isFree = hasUnitAmount\n                        ? // TODO: are these two mutually exclusive? check in stripe\n                          tier.unitAmount === 0\n                        : tier.flatAmount === 0\n\n                      const isTierInfinite = tier.upTo === 'inf'\n                      const numLabel =\n                        tier.upTo === 'inf'\n                          ? 'infinite requests'\n                          : `${humanNumber(tier.upTo)} ${plur('request', tier.upTo)}`\n                      const price = `$${pricingAmountToFixedString(\n                        hasUnitAmount ? tier.unitAmount! : tier.flatAmount!\n                      )}${hasUnitAmount ? ' per request' : ''}`\n\n                      const numDesc = isFree\n                        ? isFirst\n                          ? isTierInfinite\n                            ? `FREE for all requests per ${interval}`\n                            : `FREE for the first ${numLabel} per ${interval}`\n                          : isTierInfinite\n                            ? `FREE for all requests after that per ${interval}`\n                            : `FREE for requests up to ${numLabel} per ${interval}`\n                        : isFirst\n                          ? isTierInfinite\n                            ? `${price} per ${interval}`\n                            : `${price} for the first ${numLabel} per ${interval}`\n                          : isTierInfinite\n                            ? `${price} after that per ${interval}`\n                            : `${price} up to ${numLabel} per ${interval}`\n\n                      return (\n                        <div\n                          key={index}\n                          className='flex flex-row items-center gap-2 text-sm text-secondary-foreground/80'\n                        >\n                          <CornerDownRightIcon className='size-4' />\n\n                          <span>{numDesc}</span>\n                        </div>\n                      )\n                    })}\n                  </div>\n                ) : (\n                  <div>Unsupported pricing config. Please contact support.</div>\n                )}\n              </div>\n            )}\n\n            {isFreePlan && (\n              <p className='text-pretty text-sm text-secondary-foreground/80'>\n                Try before you buy. 100% free!\n              </p>\n            )}\n\n            {requestsRateLimit?.enabled && (\n              <div className='flex flex-row items-center gap-2 text-sm text-secondary-foreground/80'>\n                {isFreePlan ? (\n                  <ShieldMinusIcon aria-hidden className='size-4' />\n                ) : (\n                  <ShieldCheckIcon aria-hidden className='size-4' />\n                )}\n\n                <span>\n                  {isFreePlan ? 'Limited' : 'Rate-limited'} to{' '}\n                  {requestsRateLimit.limit} requests per{' '}\n                  {getRateLimitIntervalLabel(requestsRateLimit.interval)}\n                </span>\n              </div>\n            )}\n\n            {plan.features && (\n              <div className='flex flex-col gap-2'>\n                <h4 className='text-sm/6 font-medium'>Features:</h4>\n\n                <ul className='ml-4 flex flex-col gap-2 list-disc'>\n                  {plan.features.map((feature, index) => (\n                    <li\n                      key={index}\n                      className='flex flex-row items-center gap-2 text-sm text-secondary-foreground/80'\n                    >\n                      <PlusIcon aria-hidden className='size-4' />\n\n                      <span>{feature}</span>\n                    </li>\n                  ))}\n                </ul>\n              </div>\n            )}\n\n            {requestsLineItem?.billingScheme === 'tiered' && (\n              <p className='text-pretty text-xs/5 text-muted-foreground'>\n                {requestsLineItem.tiersMode === 'graduated' ? (\n                  <>\n                    Requests pricing tiers use{' '}\n                    <Link\n                      href='https://docs.stripe.com/products-prices/pricing-models#graduated-pricing'\n                      className='link'\n                      target='_blank'\n                      rel='noreferrer'\n                    >\n                      graduated pricing\n                    </Link>\n                    .\n                  </>\n                ) : (\n                  <>\n                    Requests pricing tiers use{' '}\n                    <Link\n                      href='https://docs.stripe.com/products-prices/pricing-models#volume-based-pricing'\n                      className='link'\n                      target='_blank'\n                      rel='noreferrer'\n                    >\n                      volume-based pricing\n                    </Link>\n                    .\n                  </>\n                )}\n              </p>\n            )}\n          </div>\n\n          <Button\n            onClick={() => onSubscribe(plan.slug)}\n            // TODO: handle free plans correctly\n            disabled={\n              consumer?.plan === plan.slug || !!isLoadingStripeCheckoutForPlan\n            }\n          >\n            {isLoadingStripeCheckoutForPlan === plan.slug && (\n              <Loader2Icon className='animate-spin mr-2' />\n            )}\n\n            {consumer?.plan === plan.slug ? (\n              <span>Currently subscribed to \"{plan.name}\"</span>\n            ) : (\n              <span>Subscribe to \"{plan.name}\"</span>\n            )}\n          </Button>\n        </div>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/public-project.tsx",
    "content": "import type { Project } from '@agentic/platform-types'\nimport { UTCDate } from '@date-fns/utc'\nimport { formatDistanceToNow } from 'date-fns'\nimport Link from 'next/link'\n\nexport function PublicProject({ project }: { project: Project }) {\n  const deployment = project.lastPublishedDeployment!\n  if (!deployment) return null\n\n  return (\n    <Link\n      key={project.id}\n      className='p-3 border rounded-lg hover:border-gray-400\n      divide-y divide-gray-200 overflow-hidden bg-white shadow-sm max-w-md flex flex-col gap-3\n      '\n      href={`/marketplace/projects/${project.identifier}`}\n    >\n      <div className='pb-3 flex gap-2.5 items-center'>\n        <img\n          src={\n            deployment.iconUrl ||\n            project.user?.image ||\n            '/agentic-icon-circle-light.svg'\n          }\n          alt={project.name}\n          className='aspect-square w-8 h-8'\n        />\n\n        <div className='flex flex-col gap-1'>\n          <h3 className='font-semibold text-lg text-gray-900 leading-tight'>\n            {project.name}\n          </h3>\n\n          <p className='text-sm text-gray-500'>{project.identifier}</p>\n        </div>\n      </div>\n\n      <div className='flex-1 flex flex-col gap-3 justify-between'>\n        <p className='text-sm text-gray-700 line-clamp-4'>\n          {deployment.description}\n        </p>\n\n        {project.lastPublishedDeployment && (\n          <div className='text-xs text-gray-500 flex gap-3 items-center justify-between'>\n            <div>{deployment.version}</div>\n\n            <div>\n              Last published{' '}\n              {formatDistanceToNow(new UTCDate(deployment.createdAt), {\n                addSuffix: true\n              })}\n            </div>\n          </div>\n        )}\n      </div>\n    </Link>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/supply-side-cta.tsx",
    "content": "'use client'\n\nimport { sanitizeSearchParams } from '@agentic/platform-core'\nimport Link from 'next/link'\n\nimport { HeroButton, type HeroButtonVariant } from '@/components/hero-button'\nimport { Button } from '@/components/ui/button'\nimport { GitHubIcon } from '@/icons/github'\nimport { calendarBookingUrl, githubUrl } from '@/lib/config'\n\nimport { useAgentic } from './agentic-provider'\nimport { GitHubStarCounter } from './github-star-counter'\n\nconst docsPublishingQuickStartUrl =\n  'https://docs.agentic.so/publishing/quickstart'\n\nexport function SupplySideCTA({\n  variant = 'github',\n  heroVariant = 'orange'\n}: {\n  variant?: 'book-call' | 'docs' | 'github' | 'github-2'\n  heroVariant?: HeroButtonVariant\n}) {\n  const ctx = useAgentic()\n\n  return (\n    <div className='flex justify-center items-center gap-4 sm:gap-8'>\n      <HeroButton asChild heroVariant={heroVariant}>\n        <Link\n          href={\n            ctx?.isAuthenticated\n              ? docsPublishingQuickStartUrl\n              : `/signup?${sanitizeSearchParams({\n                  next: docsPublishingQuickStartUrl\n                })}`\n          }\n        >\n          Quick Start\n        </Link>\n      </HeroButton>\n\n      {variant === 'github' ? (\n        <GitHubStarCounter className='h-full py-[9px]' />\n      ) : variant === 'github-2' ? (\n        <Button variant='outline' asChild className='h-full py-[9px]'>\n          <Link href={githubUrl} target='_blank' rel='noopener'>\n            <GitHubIcon />\n            Star us on GitHub\n          </Link>\n        </Button>\n      ) : variant === 'docs' ? (\n        <Button variant='outline' asChild className='h-full py-[9px]'>\n          <Link href='https://docs.agentic.so/publishing'>Publishing Docs</Link>\n        </Button>\n      ) : (\n        <Button variant='outline' asChild className='h-full py-[9px]'>\n          <Link href={calendarBookingUrl} target='_blank' rel='noopener'>\n            Book a call with the founder 👋\n          </Link>\n        </Button>\n      )}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/components/theme-provider.tsx",
    "content": "'use client'\n\nimport type React from 'react'\nimport { ThemeProvider as NextThemesProvider } from 'next-themes'\n\nexport function ThemeProvider({\n  children,\n  ...props\n}: React.ComponentProps<typeof NextThemesProvider>) {\n  return <NextThemesProvider {...props}>{children}</NextThemesProvider>\n}\n"
  },
  {
    "path": "apps/web/src/components/ui/avatar.tsx",
    "content": "'use client'\n\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({\n  className,\n  ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n  return (\n    <AvatarPrimitive.Root\n      data-slot='avatar'\n      className={cn(\n        'relative flex size-8 shrink-0 overflow-hidden rounded-full',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction AvatarImage({\n  className,\n  ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n  return (\n    <AvatarPrimitive.Image\n      data-slot='avatar-image'\n      className={cn('aspect-square size-full', className)}\n      {...props}\n    />\n  )\n}\n\nfunction AvatarFallback({\n  className,\n  ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n  return (\n    <AvatarPrimitive.Fallback\n      data-slot='avatar-fallback'\n      className={cn(\n        'bg-muted flex size-full items-center justify-center rounded-full',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Avatar, AvatarFallback, AvatarImage }\n"
  },
  {
    "path": "apps/web/src/components/ui/breadcrumb.tsx",
    "content": "import { Slot } from '@radix-ui/react-slot'\nimport { ChevronRight, MoreHorizontal } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<'nav'>) {\n  return <nav aria-label='breadcrumb' data-slot='breadcrumb' {...props} />\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<'ol'>) {\n  return (\n    <ol\n      data-slot='breadcrumb-list'\n      className={cn(\n        'text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<'li'>) {\n  return (\n    <li\n      data-slot='breadcrumb-item'\n      className={cn('inline-flex items-center gap-1.5', className)}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbLink({\n  asChild,\n  className,\n  ...props\n}: React.ComponentProps<'a'> & {\n  asChild?: boolean\n}) {\n  const Comp = asChild ? Slot : 'a'\n\n  return (\n    <Comp\n      data-slot='breadcrumb-link'\n      className={cn('hover:text-foreground transition-colors', className)}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<'span'>) {\n  return (\n    <span\n      data-slot='breadcrumb-page'\n      role='link'\n      aria-disabled='true'\n      aria-current='page'\n      className={cn('text-foreground font-normal', className)}\n      {...props}\n    />\n  )\n}\n\nfunction BreadcrumbSeparator({\n  children,\n  className,\n  ...props\n}: React.ComponentProps<'li'>) {\n  return (\n    <li\n      data-slot='breadcrumb-separator'\n      role='presentation'\n      aria-hidden='true'\n      className={cn('[&>svg]:size-3.5', className)}\n      {...props}\n    >\n      {children ?? <ChevronRight />}\n    </li>\n  )\n}\n\nfunction BreadcrumbEllipsis({\n  className,\n  ...props\n}: React.ComponentProps<'span'>) {\n  return (\n    <span\n      data-slot='breadcrumb-ellipsis'\n      role='presentation'\n      aria-hidden='true'\n      className={cn('flex size-9 items-center justify-center', className)}\n      {...props}\n    >\n      <MoreHorizontal className='size-4' />\n      <span className='sr-only'>More</span>\n    </span>\n  )\n}\n\nexport {\n  Breadcrumb,\n  BreadcrumbEllipsis,\n  BreadcrumbItem,\n  BreadcrumbLink,\n  BreadcrumbList,\n  BreadcrumbPage,\n  BreadcrumbSeparator\n}\n"
  },
  {
    "path": "apps/web/src/components/ui/button.tsx",
    "content": "import { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nconst buttonVariants = cva(\n  \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n  {\n    variants: {\n      variant: {\n        default:\n          'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n        destructive:\n          'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n        outline:\n          'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-background dark:border-input dark:hover:bg-accent',\n        secondary:\n          'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n        ghost:\n          'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n        link: 'text-primary underline-offset-4 hover:underline'\n      },\n      size: {\n        default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n        sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n        lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n        icon: 'size-9'\n      }\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default'\n    }\n  }\n)\n\nexport type ButtonProps = React.ComponentProps<'button'> &\n  VariantProps<typeof buttonVariants> & {\n    asChild?: boolean\n  }\n\nfunction Button({\n  className,\n  variant,\n  size,\n  asChild = false,\n  ...props\n}: ButtonProps) {\n  const Comp = asChild ? Slot : 'button'\n\n  return (\n    <Comp\n      data-slot='button'\n      className={cn(buttonVariants({ variant, size, className }))}\n      {...props}\n    />\n  )\n}\n\nexport { Button, buttonVariants }\n"
  },
  {
    "path": "apps/web/src/components/ui/collapsible.tsx",
    "content": "'use client'\n\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\nfunction Collapsible({\n  ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n  return <CollapsiblePrimitive.Root data-slot='collapsible' {...props} />\n}\n\nfunction CollapsibleTrigger({\n  ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n  return (\n    <CollapsiblePrimitive.CollapsibleTrigger\n      data-slot='collapsible-trigger'\n      {...props}\n    />\n  )\n}\n\nfunction CollapsibleContent({\n  ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n  return (\n    <CollapsiblePrimitive.CollapsibleContent\n      data-slot='collapsible-content'\n      {...props}\n    />\n  )\n}\n\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger }\n"
  },
  {
    "path": "apps/web/src/components/ui/dropdown-menu.tsx",
    "content": "import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction DropdownMenu({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n  return <DropdownMenuPrimitive.Root data-slot='dropdown-menu' {...props} />\n}\n\nfunction DropdownMenuPortal({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n  return (\n    <DropdownMenuPrimitive.Portal data-slot='dropdown-menu-portal' {...props} />\n  )\n}\n\nfunction DropdownMenuTrigger({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n  return (\n    <DropdownMenuPrimitive.Trigger\n      data-slot='dropdown-menu-trigger'\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuContent({\n  className,\n  sideOffset = 4,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n  return (\n    <DropdownMenuPrimitive.Portal>\n      <DropdownMenuPrimitive.Content\n        data-slot='dropdown-menu-content'\n        sideOffset={sideOffset}\n        className={cn(\n          'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\n          className\n        )}\n        {...props}\n      />\n    </DropdownMenuPrimitive.Portal>\n  )\n}\n\nfunction DropdownMenuGroup({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n  return (\n    <DropdownMenuPrimitive.Group data-slot='dropdown-menu-group' {...props} />\n  )\n}\n\nfunction DropdownMenuItem({\n  className,\n  inset,\n  variant = 'default',\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n  inset?: boolean\n  variant?: 'default' | 'destructive'\n}) {\n  return (\n    <DropdownMenuPrimitive.Item\n      data-slot='dropdown-menu-item'\n      data-inset={inset}\n      data-variant={variant}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuCheckboxItem({\n  className,\n  children,\n  checked,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n  return (\n    <DropdownMenuPrimitive.CheckboxItem\n      data-slot='dropdown-menu-checkbox-item'\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      checked={checked}\n      {...props}\n    >\n      <span className='pointer-events-none absolute left-2 flex size-3.5 items-center justify-center'>\n        <DropdownMenuPrimitive.ItemIndicator>\n          <CheckIcon className='size-4' />\n        </DropdownMenuPrimitive.ItemIndicator>\n      </span>\n      {children}\n    </DropdownMenuPrimitive.CheckboxItem>\n  )\n}\n\nfunction DropdownMenuRadioGroup({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n  return (\n    <DropdownMenuPrimitive.RadioGroup\n      data-slot='dropdown-menu-radio-group'\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuRadioItem({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n  return (\n    <DropdownMenuPrimitive.RadioItem\n      data-slot='dropdown-menu-radio-item'\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    >\n      <span className='pointer-events-none absolute left-2 flex size-3.5 items-center justify-center'>\n        <DropdownMenuPrimitive.ItemIndicator>\n          <CircleIcon className='size-2 fill-current' />\n        </DropdownMenuPrimitive.ItemIndicator>\n      </span>\n      {children}\n    </DropdownMenuPrimitive.RadioItem>\n  )\n}\n\nfunction DropdownMenuLabel({\n  className,\n  inset,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n  inset?: boolean\n}) {\n  return (\n    <DropdownMenuPrimitive.Label\n      data-slot='dropdown-menu-label'\n      data-inset={inset}\n      className={cn(\n        'px-2 py-1.5 text-sm font-medium data-[inset]:pl-8',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuSeparator({\n  className,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n  return (\n    <DropdownMenuPrimitive.Separator\n      data-slot='dropdown-menu-separator'\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuShortcut({\n  className,\n  ...props\n}: React.ComponentProps<'span'>) {\n  return (\n    <span\n      data-slot='dropdown-menu-shortcut'\n      className={cn(\n        'text-muted-foreground ml-auto text-xs tracking-widest',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuSub({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n  return <DropdownMenuPrimitive.Sub data-slot='dropdown-menu-sub' {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n  className,\n  inset,\n  children,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n  inset?: boolean\n}) {\n  return (\n    <DropdownMenuPrimitive.SubTrigger\n      data-slot='dropdown-menu-sub-trigger'\n      data-inset={inset}\n      className={cn(\n        'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8',\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <ChevronRightIcon className='ml-auto size-4' />\n    </DropdownMenuPrimitive.SubTrigger>\n  )\n}\n\nfunction DropdownMenuSubContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n  return (\n    <DropdownMenuPrimitive.SubContent\n      data-slot='dropdown-menu-sub-content'\n      className={cn(\n        'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  DropdownMenu,\n  DropdownMenuCheckboxItem,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuPortal,\n  DropdownMenuRadioGroup,\n  DropdownMenuRadioItem,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuTrigger\n}\n"
  },
  {
    "path": "apps/web/src/components/ui/input.tsx",
    "content": "import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n  return (\n    <input\n      type={type}\n      data-slot='input'\n      className={cn(\n        'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n        'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n        'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Input }\n"
  },
  {
    "path": "apps/web/src/components/ui/label.tsx",
    "content": "'use client'\n\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Label({\n  className,\n  ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n  return (\n    <LabelPrimitive.Root\n      data-slot='label'\n      className={cn(\n        'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Label }\n"
  },
  {
    "path": "apps/web/src/components/ui/tabs.tsx",
    "content": "'use client'\n\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Tabs({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n  return (\n    <TabsPrimitive.Root\n      data-slot='tabs'\n      className={cn('flex flex-col gap-2', className)}\n      {...props}\n    />\n  )\n}\n\nfunction TabsList({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n  return (\n    <TabsPrimitive.List\n      data-slot='tabs-list'\n      className={cn(\n        'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]',\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TabsTrigger({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n  return (\n    <TabsPrimitive.Trigger\n      data-slot='tabs-trigger'\n      className={cn(\n        \"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TabsContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n  return (\n    <TabsPrimitive.Content\n      data-slot='tabs-content'\n      className={cn('flex-1 outline-none', className)}\n      {...props}\n    />\n  )\n}\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger }\n"
  },
  {
    "path": "apps/web/src/components/ui/tooltip.tsx",
    "content": "import * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nfunction TooltipProvider({\n  delayDuration = 0,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n  return (\n    <TooltipPrimitive.Provider\n      data-slot='tooltip-provider'\n      delayDuration={delayDuration}\n      {...props}\n    />\n  )\n}\n\nfunction Tooltip({\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n  return (\n    <TooltipProvider>\n      <TooltipPrimitive.Root data-slot='tooltip' {...props} />\n    </TooltipProvider>\n  )\n}\n\nfunction TooltipTrigger({\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n  return <TooltipPrimitive.Trigger data-slot='tooltip-trigger' {...props} />\n}\n\nfunction TooltipContent({\n  className,\n  sideOffset = 0,\n  children,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n  return (\n    <TooltipPrimitive.Portal>\n      <TooltipPrimitive.Content\n        data-slot='tooltip-content'\n        sideOffset={sideOffset}\n        className={cn(\n          'bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n          className\n        )}\n        {...props}\n      >\n        {children}\n        <TooltipPrimitive.Arrow className='bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]' />\n      </TooltipPrimitive.Content>\n    </TooltipPrimitive.Portal>\n  )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n"
  },
  {
    "path": "apps/web/src/icons/github.tsx",
    "content": "export function GitHubIcon({ className }: { className?: string }) {\n  return (\n    <svg\n      xmlns='http://www.w3.org/2000/svg'\n      viewBox='0 0 24 24'\n      fill='currentColor'\n      className={className}\n    >\n      <path d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12' />\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/icons/twitter.tsx",
    "content": "export function TwitterIcon({ className }: { className?: string }) {\n  return (\n    <svg\n      role='img'\n      viewBox='0 0 24 24'\n      fill='currentcolor'\n      className={className}\n    >\n      <title>X</title>\n      <path d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z' />\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/icons/typescript.tsx",
    "content": "import { cn } from '@/lib/utils'\n\nexport function TypeScriptIcon({ className }: { className?: string }) {\n  return (\n    <svg viewBox='0 0 400 400' className={cn('w-4 h-4', className)}>\n      <path fill='#007acc' d='M0 200V0h400v400H0' />\n      <path\n        fill='#fff'\n        d='M87.7 200.7V217h52v148h36.9V217h52v-16c0-9 0-16.3-.4-16.5 0-.3-31.7-.4-70.2-.4l-70 .3v16.4l-.3-.1zM321.4 184c10.2 2.4 18 7 25 14.3 3.7 4 9.2 11 9.6 12.8 0 .6-17.3 12.3-27.8 18.8-.4.3-2-1.4-3.6-4-5.2-7.4-10.5-10.6-18.8-11.2-12-.8-20 5.5-20 16 0 3.2.6 5 1.8 7.6 2.7 5.5 7.7 8.8 23.2 15.6 28.6 12.3 41 20.4 48.5 32 8.5 13 10.4 33.4 4.7 48.7-6.4 16.7-22 28-44.3 31.7-7 1.2-23 1-30.5-.3-16-3-31.3-11-40.7-21.3-3.7-4-10.8-14.7-10.4-15.4l3.8-2.4 15-8.7 11.3-6.6 2.6 3.5c3.3 5.2 10.7 12.2 15 14.6 13 6.7 30.4 5.8 39-2 3.7-3.4 5.3-7 5.3-12 0-4.6-.7-6.7-3-10.2-3.2-4.4-9.6-8-27.6-16-20.7-8.8-29.5-14.4-37.7-23-4.7-5.2-9-13.3-11-20-1.5-5.8-2-20-.6-25.7 4.3-20 19.4-34 41-38 7-1.4 23.5-.8 30.4 1l-.2.2z'\n      />\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/web/src/lib/auth-copy.ts",
    "content": "// TODO: probably remove this in favor of a more generalized i18n system later on\n\nexport const authCopy = {\n  /**\n   * Error message when email is already taken.\n   */\n  error_email_taken: 'There is already an account with this email.',\n\n  /**\n   * Error message when the confirmation code is incorrect.\n   */\n  error_invalid_code: 'Code is incorrect.',\n\n  /**\n   * Error message when the email is invalid.\n   */\n  error_invalid_email: 'Email is not valid.',\n\n  /**\n   * Error message when the password is incorrect.\n   */\n  error_invalid_password: 'Password is incorrect.',\n\n  /**\n   * Error message when the passwords do not match.\n   */\n  error_password_mismatch: 'Passwords do not match.',\n\n  /**\n   * Error message when the user enters a password that fails validation.\n   */\n  error_validation_error: 'Password does not meet requirements.',\n\n  /**\n   * Title of the register page.\n   */\n  register_title: 'Welcome to Agentic',\n\n  /**\n   * Description of the register page.\n   */\n  register_description: 'Sign in with your email',\n\n  /**\n   * Title of the login page.\n   */\n  login_title: 'Welcome to Agentic',\n\n  /**\n   * Description of the login page.\n   */\n  login_description: 'Sign in with your email',\n\n  /**\n   * Copy for the register button.\n   */\n  register: 'Sign Up',\n\n  /**\n   * Copy for the register link.\n   */\n  register_prompt: \"Don't have an account?\",\n\n  /**\n   * Copy for the login link.\n   */\n  login_prompt: 'Already have an account?',\n\n  /**\n   * Copy for the login button.\n   */\n  login: 'Login',\n\n  /**\n   * Copy for the forgot password link.\n   */\n  change_prompt: 'Forgot password?',\n\n  /**\n   * Copy for the resend code button.\n   */\n  code_resend: 'Resend code',\n\n  /**\n   * Copy for the \"Back to\" link.\n   */\n  code_return: 'Back to',\n\n  /**\n   * Copy for the logo.\n   * @internal\n   */\n  logo: 'A',\n\n  /**\n   * Copy for the email input.\n   */\n  input_email: 'Email',\n\n  /**\n   * Copy for the password input.\n   */\n  input_password: 'Password',\n\n  /**\n   * Copy for the code input.\n   */\n  input_code: 'Code',\n\n  /**\n   * Copy for the repeat password input.\n   */\n  input_repeat: 'Repeat password',\n\n  /**\n   * Copy for the continue button.\n   */\n  button_continue: 'Continue'\n}\n"
  },
  {
    "path": "apps/web/src/lib/bootstrap.ts",
    "content": "import * as config from './config'\n\nconst detail = `\n- ${config.githubUrl}\n- ${config.twitterUrl}\n`\n\nconst banner = `\n █████╗  ██████╗ ███████╗███╗   ██╗████████╗██╗ ██████╗\n██╔══██╗██╔════╝ ██╔════╝████╗  ██║╚══██╔══╝██║██╔════╝\n███████║██║  ███╗█████╗  ██╔██╗ ██║   ██║   ██║██║\n██╔══██║██║   ██║██╔══╝  ██║╚██╗██║   ██║   ██║██║\n██║  ██║╚██████╔╝███████╗██║ ╚████║   ██║   ██║╚██████╗\n╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚═╝  ╚═══╝   ╚═╝   ╚═╝ ╚═════╝\n\n${detail}\n`\n\nexport function bootstrap() {\n  if (config.isServer) return\n\n  if (config.isSafari) {\n    console.log(detail)\n  } else {\n    console.log(banner)\n  }\n}\n"
  },
  {
    "path": "apps/web/src/lib/config.ts",
    "content": "/* eslint-disable no-process-env */\nexport const isServer = globalThis.window === undefined\nexport const isSafari =\n  !isServer && /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n\nexport const title = 'Agentic'\nexport const description =\n  \"Agentic is the App Store for LLM tools. Publish any MCP server or OpenAPI service to Agentic's MCP gateway and instantly turn it into a paid MCP product.\"\nexport const domain =\n  process.env.NEXT_PUBLIC_VERCEL_PROJECT_PRODUCTION_URL ?? 'agentic.so'\n\nexport const author = 'Travis Fischer'\nexport const authorTwitterUsername = 'transitive_bs'\nexport const copyright = `© ${new Date().getFullYear()} Agentic. All rights reserved.`\n\n// external urls\nexport const twitterUrl = `https://x.com/${authorTwitterUsername}`\nexport const githubUrl = 'https://github.com/transitive-bullshit/agentic'\n// TODO: make an agentic-specific calendar for this\nexport const calendarBookingUrl = 'https://cal.com/travis-fischer/15min'\nexport const discordUrl = 'https://discord.agentic.so'\nexport const emailUrl = 'mailto:travis@agentic.so'\n\nexport const keywords = [\n  'agentic',\n  'agentic tools',\n  'MCP',\n  'Model Context Protocol',\n  'MCP gateway',\n  'API gateway',\n  'MCP marketplace',\n  'MCP API gateway',\n  'MCP monetization',\n  'production MCPs',\n  'deploy MCPs',\n  'publish MCPs',\n  'ai',\n  'AI tools',\n  'AI agents',\n  'LLM tools',\n  'LLM function calling',\n  'LLM tool calling',\n  'MCP servers',\n  'MCP server provider',\n  'MCP server deployment',\n  'OpenAPI to MCP',\n  'OpenAPI to MCP server',\n  'vercel ai sdk',\n  'ai sdk tools',\n  'langchain tools',\n  'llamaindex tools',\n  'openai tools',\n  'anthropic tools',\n  'gemini tools'\n]\n\nexport const env =\n  process.env.NEXT_PUBLIC_VERCEL_ENV ?? process.env.NODE_ENV ?? 'development'\nexport const isVercel = !!(\n  process.env.NEXT_PUBLIC_VERCEL_ENV || process.env.VERCEL\n)\nexport const isDev = env === 'development' && !isVercel\nexport const isProd = env === 'production'\nexport const isTest = env === 'test'\n\nexport const port = process.env.PORT || '3000'\nexport const prodUrl = `https://${domain}`\nexport const baseUrl = isDev ? `http://localhost:${port}` : prodUrl\nexport const vercelUrl =\n  process.env.VERCEL_URL ?? process.env.NEXT_PUBLIC_VERCEL_URL\n// export const webBaseUrl = isDev || !vercelUrl ? baseUrl : `https://${vercelUrl}`\nexport const apiBaseUrl = process.env.NEXT_PUBLIC_AGENTIC_API_BASE_URL!\nexport const gatewayBaseUrl = process.env.NEXT_PUBLIC_AGENTIC_GATEWAY_BASE_URL!\n\nexport const posthogKey = process.env.NEXT_PUBLIC_POSTHOG_KEY!\nexport const posthogHost =\n  process.env.NEXT_PUBLIC_POSTHOG_HOST || 'https://us.i.posthog.com'\n\nexport const socialImageUrl = `${baseUrl}/agentic-social-image-light.jpg`\n"
  },
  {
    "path": "apps/web/src/lib/default-agentic-api-client.ts",
    "content": "import { AgenticApiClient } from '@agentic/platform-api-client'\n\nimport { apiBaseUrl } from './config'\n\nexport const defaultAgenticApiClient = new AgenticApiClient({\n  apiBaseUrl\n})\n"
  },
  {
    "path": "apps/web/src/lib/developer-config.ts",
    "content": "import type { Deployment, Project } from '@agentic/platform-types'\nimport type { BundledLanguage } from 'shiki/bundle/web'\nimport type { Simplify } from 'type-fest'\nimport { assert, pruneUndefined } from '@agentic/platform-core'\n\nimport { gatewayBaseUrl } from './config'\n\nexport const targetLabels = {\n  mcp: 'MCP',\n  typescript: 'TypeScript',\n  python: 'Python',\n  http: 'HTTP'\n} as const\nexport const targets = Object.keys(\n  targetLabels\n) as (keyof typeof targetLabels)[]\nexport type Target = (typeof targets)[number]\n\nexport const httpTargetLabels = {\n  curl: 'cURL',\n  httpie: 'HTTPie'\n} as const\nexport const httpTargets = Object.keys(\n  httpTargetLabels\n) as (keyof typeof httpTargetLabels)[]\nexport type HTTPTarget = (typeof httpTargets)[number]\n\nexport const mcpClientTargetLabels = {\n  url: 'MCP Server URL',\n  'mcp-json': 'mcp.json',\n  cursor: 'Cursor',\n  'claude-code': 'Claude Code',\n  'claude-desktop': 'Claude Desktop',\n  // chatgpt: 'ChatGPT', // TODO\n  raycast: 'Raycast',\n  trae: 'Trae',\n  windsurf: 'Windsurf',\n  vscode: 'VSCode',\n  cline: 'Cline',\n  warp: 'Warp'\n} as const\nexport const mcpClientTargets = Object.keys(\n  mcpClientTargetLabels\n) as (keyof typeof mcpClientTargetLabels)[]\nexport type MCPClientTarget = (typeof mcpClientTargets)[number]\n\nexport const tsFrameworkTargetLabels = {\n  ai: 'Vercel AI SDK',\n  'openai-chat': 'OpenAI Chat',\n  'openai-responses': 'OpenAI Responses',\n  langchain: 'LangChain',\n  llamaindex: 'LlamaIndex',\n  mastra: 'Mastra',\n  'firebase-genkit': 'Firebase GenKit'\n\n  // TODO: add https://github.com/googleapis/js-genai\n\n  // TODO: get xsai adapter working with JSON schemas (currently only standard schemas)\n  // xsai: 'xsAI'\n} as const\nexport const tsFrameworkTargets = Object.keys(\n  tsFrameworkTargetLabels\n) as (keyof typeof tsFrameworkTargetLabels)[]\nexport type TsFrameworkTarget = (typeof tsFrameworkTargets)[number]\n\nexport const pyFrameworkTargetLabels = {\n  openai: 'OpenAI',\n  langchain: 'LangChain',\n  llamaindex: 'LlamaIndex'\n} as const\nexport const pyFrameworkTargets = Object.keys(\n  pyFrameworkTargetLabels\n) as (keyof typeof pyFrameworkTargetLabels)[]\nexport type PyFrameworkTarget = (typeof pyFrameworkTargets)[number]\n\nexport type DeveloperConfig = {\n  target: Target\n  mcpClientTarget: MCPClientTarget\n  tsFrameworkTarget: TsFrameworkTarget\n  pyFrameworkTarget: PyFrameworkTarget\n  httpTarget: HTTPTarget\n}\n\nexport const defaultConfig: DeveloperConfig = {\n  target: 'typescript',\n  mcpClientTarget: 'url',\n  tsFrameworkTarget: 'ai',\n  pyFrameworkTarget: 'openai',\n  httpTarget: 'curl'\n}\n\nexport type CodeSnippet = {\n  code: string\n  lang: BundledLanguage\n  action?: {\n    href: string\n    label: string\n    logoImageUrl?: string\n    logoImageUrlDark?: string\n    logoImageUrlLight?: string\n  }\n}\n\nexport type GetCodeForDeveloperConfigOpts = {\n  config: DeveloperConfig\n  project: Project\n  deployment: Deployment\n  identifier: string\n  tool?: string\n  apiKey?: string\n}\n\ntype GetCodeForDeveloperConfigInnerOpts = Simplify<\n  GetCodeForDeveloperConfigOpts & {\n    systemPrompt: string\n    prompt: string\n    args: Record<string, any>\n  }\n>\n\nexport function getCodeForDeveloperConfig(\n  opts: GetCodeForDeveloperConfigOpts\n): CodeSnippet {\n  const { config, tool } = opts\n\n  const toolConfig = tool\n    ? opts.deployment.toolConfigs.find((toolConfig) => toolConfig.name === tool)\n    : undefined\n  const toolConfigExample =\n    toolConfig?.examples?.find((example) => example.featured) ??\n    toolConfig?.examples?.[0]\n\n  const innerOpts: GetCodeForDeveloperConfigInnerOpts = {\n    ...opts,\n\n    // TODO: incorporate the system message into all of the example TS and\n    // Python code snippets\n    systemPrompt:\n      toolConfigExample?.systemPrompt ??\n      'You are a helpful assistant. Be as concise as possible.',\n\n    // TODO: generate this default on the backend based on the tool's name,\n    // description, inputSchema, and outputSchema\n    prompt: toolConfigExample?.prompt ?? 'What is the latest news about AI?',\n\n    // TODO: generate this default on the backend based on the tool's input\n    // schema\n    // TODO: if no `args` are provided, hide the `HTTP` tab?\n    args: toolConfigExample?.args ?? {\n      query: 'example search query'\n    }\n  }\n\n  switch (config.target) {\n    case 'mcp':\n      return getCodeForMCPClientConfig(innerOpts)\n\n    case 'typescript':\n      return getCodeForTSFrameworkConfig(innerOpts)\n\n    case 'python':\n      return getCodeForPythonFrameworkConfig(innerOpts)\n\n    case 'http':\n      return getCodeForHTTPConfig(innerOpts)\n  }\n}\n\nexport function getCodeForMCPClientConfig({\n  config,\n  identifier,\n  project,\n  apiKey\n}: GetCodeForDeveloperConfigInnerOpts): CodeSnippet {\n  const mcpUrl = `${gatewayBaseUrl}/${identifier}/mcp${\n    apiKey ? `?apiKey=${apiKey}` : ''\n  }`\n\n  const mcpConfig = {\n    mcpServers: {\n      [identifier]: {\n        url: mcpUrl\n      }\n    }\n  }\n  const mcpConfigCode = JSON.stringify(mcpConfig, null, 2)\n\n  const mcpRemoteConfig = {\n    mcpServers: {\n      [identifier]: {\n        command: 'npx',\n        args: ['mcp-remote', '-y', mcpUrl]\n      }\n    }\n  }\n  const mcpRemoteConfigCode = JSON.stringify(mcpRemoteConfig, null, 2)\n\n  switch (config.mcpClientTarget) {\n    case 'url':\n      return {\n        code: mcpUrl,\n        lang: 'bash'\n      }\n\n    case 'mcp-json':\n      return {\n        code: mcpConfigCode,\n        lang: 'json'\n      }\n\n    case 'claude-code':\n      return {\n        code: `claude mcp add --transport http \"${identifier}\" \"${mcpUrl}\"`,\n        lang: 'bash'\n      }\n\n    case 'cursor': {\n      const config = Buffer.from(JSON.stringify({ url: mcpUrl })).toString(\n        'base64'\n      )\n      const href = `cursor://anysphere.cursor-deeplink/mcp/install?name=${identifier}&config=${config}`\n\n      return {\n        code: mcpConfigCode,\n        lang: 'json',\n        action: {\n          href,\n          label: `Add the ${identifier} MCP server to Cursor`,\n          logoImageUrlLight: '/assets/mcp-clients/cursor-icon-light.svg',\n          logoImageUrlDark: '/assets/mcp-clients/cursor-icon-dark.webp'\n        }\n      }\n    }\n\n    case 'windsurf':\n      return {\n        code: mcpRemoteConfigCode,\n        lang: 'json'\n      }\n\n    case 'claude-desktop':\n      return {\n        code: mcpRemoteConfigCode,\n        lang: 'json'\n      }\n\n    case 'raycast': {\n      // https://manual.raycast.com/model-context-protocol\n      const customMcpConfig = pruneUndefined({\n        name: identifier,\n        type: 'http',\n        url: mcpUrl,\n        description: project.lastPublishedDeployment?.description\n      })\n      const customMcpConfigCode = JSON.stringify(customMcpConfig)\n      const href = `raycast://mcp/install?${encodeURIComponent(customMcpConfigCode)}`\n\n      return {\n        code: mcpConfigCode,\n        lang: 'json',\n        action: {\n          href,\n          label: `Add the ${identifier} MCP server to Raycast`,\n          logoImageUrlLight: '/assets/mcp-clients/raycast-icon-light.svg',\n          logoImageUrlDark: '/assets/mcp-clients/raycast-icon-dark.svg'\n        }\n      }\n    }\n\n    case 'vscode':\n      return {\n        code: `\n\"mcp\": {\n  \"servers\": {\n    \"${identifier}\": {\n      \"type\": \"http\",\n      \"url\": \"${mcpUrl}\"\n    }\n  }\n}`.trim(),\n        lang: 'json'\n      }\n\n    default:\n      return {\n        code: mcpConfigCode,\n        lang: 'json'\n      }\n  }\n}\n\nexport function getCodeForTSFrameworkConfig({\n  config,\n  identifier,\n  prompt,\n  systemPrompt,\n  apiKey\n}: GetCodeForDeveloperConfigInnerOpts): CodeSnippet {\n  switch (config.tsFrameworkTarget) {\n    case 'ai':\n      return {\n        code: `\nimport { createAISDKTools } from '@agentic/ai-sdk'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\n\nconst searchTool = await AgenticToolClient.fromIdentifier('${identifier}'${\n          apiKey\n            ? `, {\n  apiKey: '${apiKey}'\n}`\n            : ''\n        })\n\nconst result = await generateText({\n  model: openai('gpt-4o-mini'),\n  tools: createAISDKTools(searchTool),\n  toolChoice: 'required',\n  system: '${systemPrompt}',\n  prompt: '${prompt}'\n})\n\nconsole.log(result.toolResults[0])\n      `.trim(),\n        lang: 'ts'\n      }\n\n    case 'openai-chat':\n      return {\n        code: `\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport OpenAI from 'openai'\n\nconst openai = new OpenAI()\nconst searchTool = await AgenticToolClient.fromIdentifier('${identifier}'${\n          apiKey\n            ? `, {\n  apiKey: '${apiKey}'\n}`\n            : ''\n        })\n\n// This example uses OpenAI's Chat Completions API\nconst res = await openai.chat.completions.create({\n  model: 'gpt-4o-mini',\n  tools: searchTool.functions.toolSpecs,\n  tool_choice: 'required',\n  messages: [\n    {\n      role: 'user',\n      content: '${prompt}'\n    }\n  ]\n})\n\nconst message = res.choices[0]!.message!\nconst toolCall = message.tool_calls![0]!.function!\nconst toolResult = await searchTool.callTool(toolCall.name, toolCall.arguments)\n\nconsole.log(toolResult)\n`.trim(),\n        lang: 'ts'\n      }\n\n    case 'openai-responses':\n      return {\n        code: `\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport OpenAI from 'openai'\n\nconst openai = new OpenAI()\nconst searchTool = await AgenticToolClient.fromIdentifier('${identifier}'${\n          apiKey\n            ? `, {\n  apiKey: '${apiKey}'\n}`\n            : ''\n        })\n\n// This example uses OpenAI's newer Responses API\nconst res = await openai.responses.create({\n  model: 'gpt-4o-mini',\n  tools: searchTool.functions.responsesToolSpecs,\n  tool_choice: 'required',\n  input: [\n    {\n      role: 'user',\n      content: '${prompt}'\n    }\n  ]\n})\n\nconst toolCall = res.output[0]\nassert(toolCall?.type === 'function_call')\nconst toolResult = await searchTool.callTool(toolCall.name, toolCall.arguments)\n\nconsole.log(toolResult)\n`.trim(),\n        lang: 'ts'\n      }\n\n    case 'langchain':\n      return {\n        code: `\nimport { createLangChainTools } from '@agentic/langchain'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { ChatPromptTemplate } from '@langchain/core/prompts'\nimport { ChatOpenAI } from '@langchain/openai'\nimport { AgentExecutor, createToolCallingAgent } from 'langchain/agents'\n\nconst searchTool = await AgenticToolClient.fromIdentifier('${identifier}'${\n          apiKey\n            ? `, {\n  apiKey: '${apiKey}'\n}`\n            : ''\n        })\n\nconst tools = createLangChainTools(searchTool)\nconst agent = createToolCallingAgent({\n  llm: new ChatOpenAI({ model: 'gpt-4o-mini' }),\n  tools,\n  prompt: ChatPromptTemplate.fromMessages([\n    ['placeholder', '{chat_history}'],\n    ['human', '{input}'],\n    ['placeholder', '{agent_scratchpad}']\n  ])\n})\n\nconst agentExecutor = new AgentExecutor({ agent, tools })\n\nconst result = await agentExecutor.invoke({\n  input: '${prompt}'\n})\n\nconsole.log(result.output)\n        `.trim(),\n        lang: 'ts'\n      }\n\n    case 'llamaindex':\n      return {\n        code: `\nimport { createLlamaIndexTools } from '@agentic/llamaindex'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@llamaindex/openai'\nimport { agent } from '@llamaindex/workflow'\n\nconst searchTool = await AgenticToolClient.fromIdentifier('${identifier}'${\n          apiKey\n            ? `, {\n  apiKey: '${apiKey}'\n}`\n            : ''\n        })\n\nconst exampleAgent = agent({\n  llm: openai({ model: 'gpt-4o-mini', temperature: 0 }),\n  tools: createLlamaIndexTools(searchTool)\n})\n\nconst response = await exampleAgent.run(\n  '${prompt}'\n)\n\nconsole.log(response.data.result)\n        `.trim(),\n        lang: 'ts'\n      }\n\n    case 'mastra':\n      return {\n        code: `\nimport { createMastraTools } from '@agentic/mastra'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@ai-sdk/openai'\nimport { Agent } from '@mastra/core/agent'\n\nconst searchTool = await AgenticToolClient.fromIdentifier('${identifier}'${\n          apiKey\n            ? `, {\n  apiKey: '${apiKey}'\n}`\n            : ''\n        })\n\nconst exampleAgent = new Agent({\n  name: 'Example Agent',\n  model: openai('gpt-4o-mini'),\n  tools: createMastraTools(searchTool),\n  instructions: '${systemPrompt}'\n})\n\nconst res = await exampleAgent.generate(\n  '${prompt}'\n)\n\nconsole.log(res.text)`.trim(),\n        lang: 'ts'\n      }\n\n    case 'firebase-genkit':\n      return {\n        code: `\nimport { createGenkitTools } from '@agentic/genkit'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { genkit } from 'genkit'\nimport { gpt4oMini, openAI } from 'genkitx-openai'\n\nconst searchTool = await AgenticToolClient.fromIdentifier('${identifier}'${\n          apiKey\n            ? `, {\n  apiKey: '${apiKey}'\n}`\n            : ''\n        })\n\nconst ai = genkit({\n  plugins: [openAI()]\n})\n\nconst result = await ai.generate({\n  model: gpt4oMini,\n  tools: createGenkitTools(ai, searchTool),\n  prompt: '${prompt}'\n})\n\nconsole.log(result)`.trim(),\n        lang: 'ts'\n      }\n  }\n}\n\nexport function getCodeForPythonFrameworkConfig({\n  config,\n  identifier,\n  prompt,\n  apiKey\n}: GetCodeForDeveloperConfigInnerOpts): CodeSnippet {\n  const mcpUrl = `${gatewayBaseUrl}/${identifier}/mcp${\n    apiKey ? `?apiKey=${apiKey}` : ''\n  }`\n\n  switch (config.pyFrameworkTarget) {\n    case 'openai':\n      return {\n        code: `\nfrom openai import OpenAI\n\nclient = OpenAI()\n\nresponse = client.responses.create(\n    model=\"gpt-4.1\",\n    tools=[\n        {\n            \"type\": \"mcp\",\n            \"server_label\": \"${identifier}\",\n            \"server_url\": \"${mcpUrl}\",\n            \"require_approval\": \"never\",\n        },\n    ],\n    input=\"${prompt}\",\n)\n\nprint(response.output_text)\n        `.trim(),\n        lang: 'py'\n      }\n\n    case 'langchain':\n      return {\n        code: `\nfrom langchain_mcp_adapters.client import MultiServerMCPClient\nfrom langgraph.prebuilt import create_react_agent\n\nclient = MultiServerMCPClient(\n    {\n        \"search\": {\n            \"url\": \"${mcpUrl}\",\n            \"transport\": \"streamable_http\",\n        }\n    }\n)\ntools = await client.get_tools()\nagent = create_react_agent(\n    \"anthropic:claude-3-7-sonnet-latest\",\n    tools\n)\nresponse = await agent.ainvoke(\n    {\"messages\": [{\"role\": \"user\", \"content\": \"${prompt}\"}]}\n)`.trim(),\n        lang: 'py'\n      }\n\n    case 'llamaindex':\n      return {\n        code: `\nfrom llama_index.llms.openai import OpenAI\nfrom llama_index.core.agent.workflow import ReActAgent\nfrom llama_index.core.workflow import Context\n\nfrom llama_index.tools.mcp import (\n    get_tools_from_mcp_url,\n    aget_tools_from_mcp_url,\n)\n\ntools = await aget_tools_from_mcp_url(\"${mcpUrl}\")\n\nllm = OpenAI(model=\"gpt-4o-mini\")\nagent = ReActAgent(tools=tools, llm=llm)\nctx = Context(agent)\nresponse = await agent.run(\"${prompt}\", ctx=ctx)\n\nprint(str(response))\n        `.trim(),\n        lang: 'py'\n      }\n  }\n}\n\nexport function getCodeForHTTPConfig({\n  config,\n  identifier,\n  deployment,\n  tool,\n  args,\n  apiKey\n}: GetCodeForDeveloperConfigInnerOpts): CodeSnippet {\n  tool ??= deployment.tools[0]?.name\n  assert(tool, 'tool is required')\n  // TODO: need a way of getting example tool args\n\n  const url = `${gatewayBaseUrl}/${identifier}/${tool}`\n\n  switch (config.httpTarget) {\n    case 'curl': {\n      const formattedArgs = JSON.stringify(args).replace(\"'\", \"\\\\'\")\n\n      // TODO: better formatting for the curl command\n      return {\n        code: `curl -X POST -H \"Content-Type: application/json\"${\n          apiKey ? ` -H \"Authorization: Bearer ${apiKey}\"` : ''\n        } -d '${formattedArgs}' ${url}`,\n        lang: 'bash'\n      }\n    }\n\n    case 'httpie': {\n      const formattedArgs = Object.entries(args)\n        .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n        .join(' ')\n\n      return {\n        code: `http ${url}${apiKey ? ` Authorization:\"Bearer ${apiKey}\"` : ''}${\n          formattedArgs ? ` ${formattedArgs}` : ''\n        }`,\n        lang: 'bash'\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "apps/web/src/lib/global-api.ts",
    "content": "import 'server-only'\n\nimport { AgenticApiClient } from '@agentic/platform-api-client'\n\nimport { apiBaseUrl } from '@/lib/config'\n\nexport const globalAgenticApiClient = new AgenticApiClient({\n  apiBaseUrl\n})\n"
  },
  {
    "path": "apps/web/src/lib/notifications.ts",
    "content": "import { HTTPError } from 'ky'\nimport { toast as toastImpl } from 'sonner'\n\nexport async function toastError(\n  error: any,\n  ctx?: {\n    label?: string\n  }\n) {\n  let message: string | undefined\n  let details: Error | undefined\n\n  if (typeof error === 'string') {\n    message = error\n  } else if (error instanceof Error) {\n    details = error\n    message = error.message\n\n    if (error instanceof HTTPError) {\n      if (error.response) {\n        try {\n          message = error.response.statusText\n\n          const body = await error.response.json()\n          if (typeof body.error === 'string') {\n            message = body.error\n          }\n        } catch {\n          // TODO\n        }\n      }\n    }\n  }\n\n  console.error(...[ctx?.label, message, details].filter(Boolean))\n  toastImpl.error(message, {\n    duration: 10_000\n  })\n}\n\nexport { toast } from 'sonner'\n"
  },
  {
    "path": "apps/web/src/lib/query-client.ts",
    "content": "import {\n  type DefaultError,\n  type InfiniteData,\n  type QueryKey,\n  useInfiniteQuery as useInfiniteQueryBase,\n  useQuery as useQueryBase\n} from '@tanstack/react-query'\nimport { HTTPError } from 'ky'\n\nconst retryStatusCodes = new Set([408, 413, 429, 500, 502, 503, 504])\n\n// Inspired by https://github.com/sindresorhus/ky#retry\nfunction retry(failureCount: number, error: any): boolean {\n  if (error instanceof HTTPError) {\n    const { status } = error.response\n    if (!retryStatusCodes.has(status)) {\n      return false\n    }\n  }\n\n  return failureCount < 3\n}\n\nexport function useQuery<\n  TQueryFnData = unknown,\n  TError = DefaultError,\n  TData = TQueryFnData,\n  TQueryKey extends QueryKey = QueryKey\n>(\n  opts: Parameters<\n    typeof useQueryBase<TQueryFnData, TError, TData, TQueryKey>\n  >[0]\n): ReturnType<typeof useQueryBase<TQueryFnData, TError, TData, TQueryKey>> {\n  return useQueryBase<TQueryFnData, TError, TData, TQueryKey>({\n    retry,\n    ...opts\n  })\n}\n\nexport function useInfiniteQuery<\n  TQueryFnData,\n  TError = DefaultError,\n  TData = InfiniteData<TQueryFnData>,\n  TQueryKey extends QueryKey = QueryKey,\n  TPageParam = unknown\n>(\n  opts: Parameters<\n    typeof useInfiniteQueryBase<\n      TQueryFnData,\n      TError,\n      TData,\n      TQueryKey,\n      TPageParam\n    >\n  >[0]\n): ReturnType<\n  typeof useInfiniteQueryBase<\n    TQueryFnData,\n    TError,\n    TData,\n    TQueryKey,\n    TPageParam\n  >\n> {\n  return useInfiniteQueryBase<\n    TQueryFnData,\n    TError,\n    TData,\n    TQueryKey,\n    TPageParam\n  >({\n    retry,\n    ...opts\n  })\n}\n"
  },
  {
    "path": "apps/web/src/lib/utils.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { pricingAmountToFixedString } from './utils'\n\ntest('pricingAmountToFixedString', () => {\n  expect(pricingAmountToFixedString(0.008)).toBe('0.00008')\n  expect(pricingAmountToFixedString(200)).toBe('2.00')\n  expect(pricingAmountToFixedString(52_399)).toBe('523.99')\n  expect(pricingAmountToFixedString(0.0)).toBe('0')\n  expect(pricingAmountToFixedString(0)).toBe('0')\n  expect(pricingAmountToFixedString(0.000_000_000_000_1)).toBe('0')\n  expect(pricingAmountToFixedString(0.01)).toBe('0.0001')\n  expect(pricingAmountToFixedString(10)).toBe('0.10')\n  expect(pricingAmountToFixedString(390)).toBe('3.90')\n  expect(pricingAmountToFixedString(1)).toBe('0.01')\n})\n"
  },
  {
    "path": "apps/web/src/lib/utils.ts",
    "content": "import { type ClassValue, clsx } from 'clsx'\nimport prettyMs from 'pretty-ms'\nimport { twMerge } from 'tailwind-merge'\n\nexport { default as humanNumber } from 'human-number'\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n\nexport function randomInRange(min: number, max: number) {\n  return Math.random() * (max - min) + min\n}\n\nexport function pricingAmountToFixedString(amount: number): string {\n  const output = (amount / 100)\n    // Cap the precision to 10 because of floating point issues\n    // (could remove this constraint in the future by not dividing by 100\n    // and handling the precision manually if needed)\n    .toFixed(10)\n    .replace(/0+$/, '')\n    .replace(/\\.0*$/, '.00')\n    // (not a $ sign, but a substitution $1)\n    .replace(/(\\.\\d)$/, '$10')\n\n  if (output === '0.00') {\n    return '0'\n  }\n\n  return output\n}\n\nexport function getRateLimitIntervalLabel(rateLimitInterval: number): string {\n  const label = prettyMs(rateLimitInterval * 1000, {\n    verbose: true\n  })\n\n  if (label === '1 second') {\n    return 'second'\n  }\n\n  if (label === '1 minute') {\n    return 'minute'\n  }\n\n  if (label === '1 hour') {\n    return 'hour'\n  }\n\n  if (label === '1 day') {\n    return 'day'\n  }\n\n  if (label === '1 week') {\n    return 'week'\n  }\n\n  if (label === '1 month') {\n    return 'month'\n  }\n\n  if (label === '1 year') {\n    return 'year'\n  }\n\n  return label\n}\n"
  },
  {
    "path": "apps/web/src/reset.d.ts",
    "content": "import '@fisch0920/config/ts-reset'\n"
  },
  {
    "path": "apps/web/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-react\",\n  \"compilerOptions\": {\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"rootDir\": \".\",\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/public/*\": [\"public/*\"],\n      \"@/*\": [\"src/*\"]\n    }\n  },\n  \"include\": [\n    \"src\",\n    \"*.config.ts\",\n    \"next-env.d.ts\",\n    \".next/types/**/*.ts\",\n    \"postcss.config.mjs\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "contributing.md",
    "content": "# Contributing\n\n## Project Overview\n\nThis is a monorepo for Agentic - a platform that provides API gateway services for MCP (Model Context Protocol) and OpenAPI integrations.\n\n### Development Prequisites\n\n- `node >= 22`\n- `pnpm >= 10.12.4`\n- `apps/api` requires a postgres database (can be a local one) with connection URL stored in `DATABASE_URL`\n  - You'll need to initialize the database running `pnpm drizzle-kit push` from the `apps/api` directory\n\n### Core Architecture\n\nThe platform consists of:\n\n- **API Service** (`apps/api/`) - Platform backend API with authentication, billing, and resource management\n- **Gateway Service** (`apps/gateway/`) - Cloudflare Worker that proxies requests to origin MCP/OpenAPI services\n- **Website** (`apps/web/`) - Next.js site for both the marketing site and authenticated webapp\n- **E2E Tests** (`apps/e2e/`) - End-to-end test suite for HTTP and MCP gateway requests\n- **Shared Packages** (`packages/`) - Common utilities, types, validators, and config\n- **StdLib Packages** (`stdlib/`) - TS AI SDK adapters\n\nThe gateway accepts HTTP requests at `https://gateway.agentic.so/deploymentIdentifier/tool-name` or `https://gateway.agentic.so/deploymentIdentifier/mcp` for MCP.\n\n### Development Commands\n\n**Main development workflow:**\n\n- `pnpm dev` - Start all services in development mode\n- `pnpm build` - Build all packages and apps (except for the website)\n- `pnpm test` - Run all tests (build, format, lint, typecheck, unit, but not e2e tests)\n- `pnpm clean` - Clean all build artifacts\n- `pnpm run docs` - Run the local mintlify docs server\n- `pnpm release` - Bump all public packages and publish them to npm\n\n**Individual test commands:**\n\n- `pnpm test:format` - Check code formatting with Prettier\n- `pnpm test:lint` - Run ESLint across all packages\n- `pnpm test:typecheck` - Run TypeScript type checking\n- `pnpm test:unit` - Run unit tests with Vitest\n\n**Code quality:**\n\n- `pnpm fix` - Auto-fix formatting and linting issues\n- `pnpm knip` - Check for unused dependencies\n\n**E2E testing:**\n\n- (from the `apps/e2e` directory)\n- `pnpm e2e` - Run all E2E tests\n- `pnpm e2e-http` - Run HTTP edge E2E tests\n- `pnpm e2e-mcp` - Run MCP edge E2E tests\n\n### Key Database Models\n\nThe system uses Drizzle ORM with PostgreSQL. Core entities:\n\n- **User** - Platform users\n- **Team** - Organizations with members and billing\n- **Project** - Namespace API products comprised of immutable Deployments\n- **Deployment** - Immutable instances of MCP/OpenAPI services, including gateway and pricing config\n- **Consumer** - Customer subscription tracking usage and billing\n\n### Environment Variables\n\nEvery app has a `.env.example` file, which documents required environment variables.\n\nTo run the backend API and other apps, you'll need to set up:\n\n- Stripe\n- GitHub app with OAuth credentials\n- Resend\n- Sentry\n"
  },
  {
    "path": "docs/contact.mdx",
    "content": "---\ntitle: Contact\n---\n\nAgentic is currently a solo effort by [Travis Fischer](https://x.com/transitive_bs). 👋\n\nAs with MCP itself, Agentic is an active work in progress, so please reach out if you have any questions, feedback, or feature requests.\n\n<Columns cols={2}>\n  <Card\n    title='DM me on Twitter / X'\n    href='https://x.com/transitive_bs'\n    icon='x-twitter'\n  />\n  <Card\n    title='Send me an email'\n    href='mailto:travis@agentic.so'\n    icon='envelope'\n  />\n  <Card\n    title='Schedule a call with me'\n    href='https://cal.com/travis-fischer/15min'\n    icon='calendar-days'\n  />\n</Columns>\n"
  },
  {
    "path": "docs/docs.json",
    "content": "{\n  \"$schema\": \"https://mintlify.com/docs.json\",\n  \"name\": \"Agentic\",\n  \"theme\": \"maple\",\n  \"logo\": {\n    \"dark\": \"/media/agentic-logo-dark.svg\",\n    \"light\": \"/media/agentic-logo-light.svg\"\n  },\n  \"favicon\": \"/media/favicon.svg\",\n  \"background\": {\n    \"image\": \"/media/bg.png\"\n  },\n  \"appearance\": {\n    \"mode\": \"light\",\n    \"strict\": true\n  },\n  \"colors\": {\n    \"primary\": \"#0D969D\",\n    \"light\": \"#13D3DC\",\n    \"dark\": \"#0D969D\"\n  },\n  \"navbar\": {\n    \"links\": [\n      {\n        \"label\": \"Contact\",\n        \"href\": \"https://agentic.so/contact\",\n        \"icon\": \"envelope\"\n      }\n    ],\n    \"primary\": {\n      \"type\": \"button\",\n      \"label\": \"Dashboard\",\n      \"href\": \"https://agentic.so/app\"\n    }\n  },\n  \"banner\": {\n    \"content\": \"The new Agentic MCP Marketplace is now in public beta! 🎉\",\n    \"dismissible\": true\n  },\n  \"navigation\": {\n    \"tabs\": [\n      {\n        \"tab\": \"MCP Marketplace\",\n        \"groups\": [\n          {\n            \"group\": \"Getting Started\",\n            \"pages\": [\"index\", \"marketplace/index\"]\n          },\n          {\n            \"group\": \"TypeScript AI SDKs\",\n            \"pages\": [\n              \"marketplace/ts-sdks/ai-sdk\",\n              \"marketplace/ts-sdks/openai-chat\",\n              \"marketplace/ts-sdks/openai-responses\",\n              \"marketplace/ts-sdks/langchain\",\n              \"marketplace/ts-sdks/llamaindex\",\n              \"marketplace/ts-sdks/genkit\",\n              \"marketplace/ts-sdks/mastra\"\n            ]\n          },\n          {\n            \"group\": \"MCP Clients\",\n            \"pages\": [\n              \"marketplace/mcp-clients/claude-code\",\n              \"marketplace/mcp-clients/claude-desktop\",\n              \"marketplace/mcp-clients/cline\",\n              \"marketplace/mcp-clients/cursor\",\n              \"marketplace/mcp-clients/raycast\",\n              \"marketplace/mcp-clients/trae\",\n              \"marketplace/mcp-clients/vscode\",\n              \"marketplace/mcp-clients/warp\",\n              \"marketplace/mcp-clients/windsurf\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tab\": \"Publishing MCPs\",\n        \"groups\": [\n          {\n            \"group\": \"Getting Started\",\n            \"pages\": [\"publishing/index\", \"publishing/quickstart\"]\n          },\n          {\n            \"group\": \"Quick Start Guides\",\n            \"pages\": [\n              \"publishing/guides/existing-mcp-server\",\n              \"publishing/guides/existing-openapi-service\",\n              \"publishing/guides/ts-xmcp\",\n              \"publishing/guides/ts-fastmcp\",\n              \"publishing/guides/ts-modelfetch\",\n              \"publishing/guides/ts-mcp-hono\",\n              \"publishing/guides/ts-openapi-hono\",\n              \"publishing/guides/py-fastmcp\"\n            ]\n          },\n          {\n            \"group\": \"Origin Servers\",\n            \"pages\": [\n              \"publishing/origin/index\",\n              \"publishing/origin/metadata\",\n              \"publishing/origin/security\"\n            ]\n          },\n\n          {\n            \"group\": \"Project Config\",\n            \"pages\": [\n              \"publishing/config/index\",\n              \"publishing/config/auth\",\n              \"publishing/config/pricing\",\n              \"publishing/config/rate-limits\",\n              \"publishing/config/caching\",\n              \"publishing/config/tool-config\",\n              \"publishing/config/examples\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"global\": {\n      \"anchors\": [\n        {\n          \"anchor\": \"Agentic\",\n          \"href\": \"https://agentic.so\",\n          \"icon\": \"house\"\n        },\n        {\n          \"anchor\": \"MCP Marketplace\",\n          \"href\": \"https://agentic.so/marketplace\",\n          \"icon\": \"store\"\n        },\n        {\n          \"anchor\": \"Contact\",\n          \"href\": \"https://agentic.so/contact\",\n          \"icon\": \"envelope\"\n        },\n        {\n          \"anchor\": \"GitHub\",\n          \"href\": \"https://github.com/transitive-bullshit/agentic\",\n          \"icon\": \"github\"\n        }\n      ]\n    }\n  },\n  \"footer\": {\n    \"socials\": {\n      \"x\": \"https://x.com/transitive_bs\",\n      \"github\": \"https://github.com/transitive-bullshit/agentic\"\n    }\n  },\n  \"seo\": {\n    \"metatags\": {\n      \"keywords\": \"agentic, agentic tools, MCP, Model Context Protocol, MCP gateway, API gateway, MCP marketplace, MCP API gateway, MCP monetization, production MCPs, deploy MCPs, publish MCPs, ai, AI tools, AI agents, LLM tools, LLM function calling, LLM tool calling, MCP servers, MCP server provider, MCP server deployment, OpenAPI to MCP, OpenAPI to MCP server, vercel ai sdk, ai sdk tools, langchain tools, llamaindex tools, openai tools, anthropic tools, gemini tools\",\n      \"author\": \"Travis Fischer\",\n      \"og:image\": \"https://agentic.so/agentic-social-image-light.jpg\",\n      \"twitter:image\": \"https://agentic.so/agentic-social-image-light.jpg\",\n      \"twitter:card\": \"summary_large_image\",\n      \"twitter:creator\": \"@transitive_bs\",\n      \"description\": \"Agentic is the App Store for LLM tools. Publish any MCP server or OpenAPI service to Agentic's MCP gateway and instantly turn it into a paid MCP product.\"\n    }\n  }\n}\n"
  },
  {
    "path": "docs/index.mdx",
    "content": "---\ntitle: Agentic Docs\ndescription: Agentic is the App Store for LLM Tools.\n---\n\n## Choose your adventure\n\n<Columns cols={2}>\n  <Card title='MCP Marketplace Docs' href='/marketplace' icon='store'>\n    For developers interested in using Agentic tools in their apps.\n  </Card>\n  <Card title='Publishing MCP Docs' href='/publishing' icon='upload'>\n    For developers interested in publishing their own MCP server or OpenAPI\n    service to Agentic.\n  </Card>\n</Columns>\n"
  },
  {
    "path": "docs/inject.js",
    "content": "const isServer = globalThis.window === undefined\nconst isSafari =\n  !isServer && /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n\nif (!isServer) {\n  // Workaround for nav links not being able to point to relative paths\n  for (const a of document.querySelectorAll('a[href=\"https://agentic.so\"]')) {\n    a.removeAttribute('target')\n  }\n\n  for (const a of document.querySelectorAll(\n    'a[href=\"https://agentic.so/contact\"]'\n  )) {\n    a.removeAttribute('target')\n  }\n\n  for (const a of document.querySelectorAll(\n    'a[href=\"https://agentic.so/marketplace\"]'\n  )) {\n    a.removeAttribute('target')\n  }\n\n  for (const a of document.querySelectorAll(\n    'a[href=\"https://agentic.so/app\"]'\n  )) {\n    a.removeAttribute('target')\n  }\n\n  // document\n  //   .getElementById('https://agentic.so/contact')\n  //   .querySelector('.lucide-arrow-up-right')\n  //   .classList.add('hidden')\n}\n\nconst detail = `\n- https://github.com/transitive-bullshit/agentic\n- https://x.com/transitive_bs\n`\n\nconst banner = `\n █████╗  ██████╗ ███████╗███╗   ██╗████████╗██╗ ██████╗\n██╔══██╗██╔════╝ ██╔════╝████╗  ██║╚══██╔══╝██║██╔════╝\n███████║██║  ███╗█████╗  ██╔██╗ ██║   ██║   ██║██║\n██╔══██║██║   ██║██╔══╝  ██║╚██╗██║   ██║   ██║██║\n██║  ██║╚██████╔╝███████╗██║ ╚████║   ██║   ██║╚██████╗\n╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚═╝  ╚═══╝   ╚═╝   ╚═╝ ╚═════╝\n\n${detail}\n`\n\nfunction bootstrap() {\n  if (isSafari) {\n    console.log(detail)\n  } else {\n    console.log(banner)\n  }\n}\n\nbootstrap()\n"
  },
  {
    "path": "docs/marketplace/index.mdx",
    "content": "---\ntitle: Quick Start\ndescription: A quick start on how to use tools from Agentic's marketplace.\n---\n\n## TypeScript AI SDKs\n\n<Columns cols={2}>\n  <Card\n    title='Vercel AI SDK'\n    href='/marketplace/ts-sdks/ai-sdk'\n    icon={\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        viewBox=\"0 0 24 25\"\n        fill=\"none\"\n      >\n        <path fill=\"#000\" d=\"m12 2.11 12 20.783H0L12 2.11Z\" />\n      </svg>\n    }\n  >\n    How to use Agentic tools with the Vercel AI SDK.\n  </Card>\n\n<Card\n  title='LangChain'\n  href='/marketplace/ts-sdks/langchain'\n  icon={\n    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 25' fill='none'>\n      <path\n        fill='#000'\n        d='M6.099 6.418C2.736 6.418 0 9.147 0 12.501c0 3.353 2.736 6.082 6.099 6.082H17.9c3.363 0 6.099-2.729 6.099-6.082 0-3.354-2.736-6.083-6.099-6.083H6.1Zm-.122 1.933c.493.013 1.02.25 1.273.623.368.46.478 1.067.895 1.493.56.612 1.199 1.151 1.716 1.803.49.595.838 1.293 1.143 1.997.125.234.126.52.31.72.091.12.535.448.439.564.055.12.47.286.326.403-.194.04-.413.047-.562-.107-.054.126-.182.06-.281.043a3.745 3.745 0 0 0-.025.073c-.33.022-.576-.312-.732-.565-.311-.168-.665-.27-.982-.446-.019.29.045.649-.231.836-.014.556.843.065.922.48-.061.007-.129-.01-.178.037-.223.218-.48-.164-.738-.007-.347.174-.38.316-.81.352-.023-.036-.014-.059.006-.08.12-.14.13-.305.336-.365-.212-.033-.39.083-.569.176-.232.095-.23-.215-.588.016-.04-.032-.02-.061.002-.086.091-.111.21-.127.345-.121-.663-.369-.975.45-1.281.043-.092.024-.127.107-.185.165-.05-.055-.012-.121-.01-.186-.06-.027-.135-.04-.117-.136-.117-.04-.2.03-.286.095-.08-.06.053-.15.077-.212.07-.122.23-.025.311-.113.23-.13.552.081.816.046.203.025.454-.183.352-.39-.217-.277-.179-.64-.184-.97-.026-.193-.49-.438-.625-.646-.166-.188-.295-.405-.424-.618-.467-.901-.32-2.059-.908-2.895-.266.147-.612.077-.841-.12-.124.113-.13.26-.14.417-.296-.296-.259-.856-.022-1.186.097-.13.213-.237.343-.331.029-.021.039-.042.038-.075.117-.527.576-.739 1.07-.727Zm12.407.46c.558 0 1.081.216 1.474.609.394.392.61.914.61 1.47a2.06 2.06 0 0 1-.61 1.47l-.902.9a2.08 2.08 0 0 1-.86.517l-.016.004-.005.017a2.051 2.051 0 0 1-.474.73l-.902.9a2.074 2.074 0 0 1-1.475.608 2.077 2.077 0 0 1-1.474-3.549l.902-.899c.24-.24.534-.416.858-.514l.017-.005.006-.016a2.07 2.07 0 0 1 .475-.734l.902-.9a2.074 2.074 0 0 1 1.474-.608Zm0 .897a1.18 1.18 0 0 0-.838.346l-.902.9a1.181 1.181 0 0 0-.343.925l.006.057c.032.265.149.505.337.692.13.13.273.211.447.268a.902.902 0 0 1-.053.5.884.884 0 0 1-.194.289l-.055.055a1.964 1.964 0 0 1-.78-.479 2.06 2.06 0 0 1-.576-1.097l-.01-.057-.046.036c-.03.025-.06.052-.087.08l-.903.9a1.182 1.182 0 0 0 .84 2.018c.304 0 .607-.115.838-.346l.902-.9a1.182 1.182 0 0 0-.436-1.947.972.972 0 0 1 .276-.853 2.064 2.064 0 0 1 1.372 1.592l.01.057.046-.037c.03-.025.06-.052.088-.08l.902-.9a1.183 1.183 0 0 0-.84-2.019Zm-9.973 5.157c-.079.307-.105.832-.506.847-.033.178.123.245.265.188.141-.065.209.05.256.165.218.032.54-.072.552-.33-.325-.186-.426-.541-.566-.87Z'\n      />\n    </svg>\n  }\n>\n  How to use Agentic tools with LangChain's TS SDK.\n</Card>\n\n<Card\n  title='OpenAI Chat Completions'\n  href='/marketplace/ts-sdks/openai-chat'\n  icon={\n    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 25 25' fill='none'>\n      <path\n        fill='#000'\n        d='M9.762 9.697v-2.28c0-.192.071-.336.238-.432l4.543-2.64c.618-.36 1.356-.528 2.117-.528 2.854 0 4.662 2.232 4.662 4.608 0 .168 0 .36-.024.552l-4.71-2.784a.791.791 0 0 0-.856 0l-5.97 3.504Zm10.608 8.88v-5.448a.804.804 0 0 0-.428-.744l-5.97-3.504 1.95-1.128a.43.43 0 0 1 .476 0l4.543 2.64c1.308.768 2.188 2.4 2.188 3.984 0 1.824-1.07 3.504-2.759 4.2Zm-12.012-4.8-1.95-1.152c-.166-.096-.238-.24-.238-.432v-5.28c0-2.568 1.95-4.512 4.59-4.512 1 0 1.927.336 2.713.936L8.787 6.073a.804.804 0 0 0-.428.744v6.96Zm4.199 2.448L9.762 14.64v-3.36l2.795-1.584 2.794 1.584v3.36l-2.794 1.584Zm1.795 7.296c-.999 0-1.926-.336-2.711-.936l4.685-2.736a.804.804 0 0 0 .429-.744v-6.96l1.974 1.152c.166.096.238.24.238.432v5.28c0 2.568-1.974 4.512-4.615 4.512Zm-5.637-5.352-4.543-2.64c-1.308-.768-2.188-2.4-2.188-3.984 0-1.848 1.094-3.504 2.782-4.2v5.472c0 .336.143.576.429.744l5.946 3.48-1.95 1.128a.43.43 0 0 1-.476 0Zm-.261 3.936c-2.688 0-4.662-2.04-4.662-4.56 0-.192.023-.384.047-.576l4.686 2.736a.79.79 0 0 0 .856 0l5.97-3.48v2.28c0 .192-.071.336-.238.432l-4.543 2.64c-.618.36-1.356.528-2.117.528Zm5.898 2.856c2.879 0 5.28-2.064 5.828-4.8 2.664-.696 4.377-3.216 4.377-5.784 0-1.68-.714-3.312-1.998-4.488.119-.504.19-1.008.19-1.512 0-3.432-2.76-6-5.947-6-.642 0-1.26.096-1.879.312A5.935 5.935 0 0 0 10.761.96c-2.878 0-5.28 2.064-5.828 4.8C2.27 6.457.557 8.977.557 11.545c0 1.68.713 3.312 1.998 4.488a6.583 6.583 0 0 0-.19 1.512c0 3.432 2.759 6 5.946 6 .642 0 1.26-.096 1.879-.312a5.934 5.934 0 0 0 4.162 1.728Z'\n      />\n    </svg>\n  }\n>\n  How to use Agentic tools with the OpenAI Chat Completions API.\n</Card>\n\n<Card\n  title='OpenAI Responses'\n  href='/marketplace/ts-sdks/openai-responses'\n  icon={\n    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 25 25' fill='none'>\n      <path\n        fill='#000'\n        d='M9.762 9.697v-2.28c0-.192.071-.336.238-.432l4.543-2.64c.618-.36 1.356-.528 2.117-.528 2.854 0 4.662 2.232 4.662 4.608 0 .168 0 .36-.024.552l-4.71-2.784a.791.791 0 0 0-.856 0l-5.97 3.504Zm10.608 8.88v-5.448a.804.804 0 0 0-.428-.744l-5.97-3.504 1.95-1.128a.43.43 0 0 1 .476 0l4.543 2.64c1.308.768 2.188 2.4 2.188 3.984 0 1.824-1.07 3.504-2.759 4.2Zm-12.012-4.8-1.95-1.152c-.166-.096-.238-.24-.238-.432v-5.28c0-2.568 1.95-4.512 4.59-4.512 1 0 1.927.336 2.713.936L8.787 6.073a.804.804 0 0 0-.428.744v6.96Zm4.199 2.448L9.762 14.64v-3.36l2.795-1.584 2.794 1.584v3.36l-2.794 1.584Zm1.795 7.296c-.999 0-1.926-.336-2.711-.936l4.685-2.736a.804.804 0 0 0 .429-.744v-6.96l1.974 1.152c.166.096.238.24.238.432v5.28c0 2.568-1.974 4.512-4.615 4.512Zm-5.637-5.352-4.543-2.64c-1.308-.768-2.188-2.4-2.188-3.984 0-1.848 1.094-3.504 2.782-4.2v5.472c0 .336.143.576.429.744l5.946 3.48-1.95 1.128a.43.43 0 0 1-.476 0Zm-.261 3.936c-2.688 0-4.662-2.04-4.662-4.56 0-.192.023-.384.047-.576l4.686 2.736a.79.79 0 0 0 .856 0l5.97-3.48v2.28c0 .192-.071.336-.238.432l-4.543 2.64c-.618.36-1.356.528-2.117.528Zm5.898 2.856c2.879 0 5.28-2.064 5.828-4.8 2.664-.696 4.377-3.216 4.377-5.784 0-1.68-.714-3.312-1.998-4.488.119-.504.19-1.008.19-1.512 0-3.432-2.76-6-5.947-6-.642 0-1.26.096-1.879.312A5.935 5.935 0 0 0 10.761.96c-2.878 0-5.28 2.064-5.828 4.8C2.27 6.457.557 8.977.557 11.545c0 1.68.713 3.312 1.998 4.488a6.583 6.583 0 0 0-.19 1.512c0 3.432 2.759 6 5.946 6 .642 0 1.26-.096 1.879-.312a5.934 5.934 0 0 0 4.162 1.728Z'\n      />\n    </svg>\n  }\n>\n  How to use Agentic tools with the OpenAI Responses API.\n</Card>\n\n<Card\n  title='Llamaindex'\n  href='/marketplace/ts-sdks/llamaindex'\n  icon={\n    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 25' fill='none'>\n      <g clipPath='url(#a)'>\n        <mask\n          id='b'\n          width={24}\n          height={25}\n          x={0}\n          y={0}\n          maskUnits='userSpaceOnUse'\n          style={{\n            maskType: 'luminance'\n          }}\n        >\n          <path fill='#fff' d='M24 .5H0v24h24V.5Z' />\n        </mask>\n        <g mask='url(#b)'>\n          <path\n            fill='#000'\n            d='M0 5.3C0 2.649 2.133.5 4.764.5h14.293c2.63 0 4.764 2.149 4.764 4.8v14.4c0 2.651-2.133 4.8-4.764 4.8H4.764C2.133 24.5 0 22.351 0 19.7V5.3Z'\n          />\n          <path\n            fill='url(#c)'\n            d='M14.969 16.285c-1.533.682-3.195.402-3.833.177 0 .154-.007.633-.035 1.316-.028.682-.244 1.113-.349 1.244.012.426.021 1.358-.035 1.67a1.43 1.43 0 0 1-.348.676h-.941c.083-.426.406-.7.557-.782.084-.882-.08-1.647-.174-1.92-.093.332-.32 1.102-.488 1.529a4.754 4.754 0 0 1-.522.96h-.697c-.035-.427.197-.57.348-.57.07-.13.237-.54.349-1.137.111-.597-.047-1.718-.14-2.204v-1.528c-1.115-.605-1.533-1.209-1.812-1.884-.223-.54-.163-1.363-.105-1.707-.07-.13-.273-.461-.348-.924a3.869 3.869 0 0 1 0-1.351c-.07-.071-.21-.434-.21-1.315 0-.882.256-1.34.384-1.458v-.39c-.488-.036-.976-.25-1.254-.534-.28-.284-.07-.711.104-.853.174-.142.349-.036.593-.107.244-.071.453-.142.557-.355.084-.171-.081-.877-.174-1.21.418.058.685.428.767.605V3.63c.522.249 1.463.853 1.777 2.168.25 1.053.43 3.26.488 4.23 1.336.013 3.032-.192 4.565.143 1.394.305 2.022.924 2.753.924.732 0 1.15-.426 1.673-.07.523.355.802 1.35.732 2.097-.056.597-.511.793-.732.817-.279.939 0 1.837.174 2.169v1.35c.082.12.244.484.244.996s-.162.853-.244.96c.14.796-.058 1.611-.174 1.92h-.94c.11-.285.301-.356.383-.356.167-.882.046-1.695-.035-1.99-.53-.314-.872-.866-.976-1.103.012.202-.021.761-.244 1.387-.223.625-.558.995-.697 1.102v.746h-.941c0-.455.256-.545.383-.533.163-.296.558-.747.558-1.635 0-.75-.523-1.102-.906-1.778-.182-.32-.093-.723-.035-.888Z'\n          />\n        </g>\n      </g>\n      <defs>\n        <linearGradient\n          id='c'\n          x1={6.295}\n          x2={21.492}\n          y1={5.122}\n          y2={17.753}\n          gradientUnits='userSpaceOnUse'\n        >\n          <stop offset={0.062} stopColor='#F6DCD9' />\n          <stop offset={0.326} stopColor='#FFA5EA' />\n          <stop offset={0.589} stopColor='#45DFF8' />\n          <stop offset={1} stopColor='#BC8DEB' />\n        </linearGradient>\n        <clipPath id='a'>\n          <path fill='#fff' d='M0 .5h24v24H0z' />\n        </clipPath>\n      </defs>\n    </svg>\n  }\n>\n  How to use Agentic tools with Llamaindex's TS SDK.\n</Card>\n\n<Card\n  title='Firebase Genkit'\n  href='/marketplace/ts-sdks/genkit'\n  icon={\n    <svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 25'>\n      <g clipPath='url(#a)'>\n        <path\n          fill='#000'\n          d='M19.454 8.869c-.538-.748-1.778-2.285-3.68-4.569A446.88 446.88 0 0 0 13.4 1.479l-.207-.245-.113-.133-.022-.032-.01-.005L12.57.5l-.609.488a13.343 13.343 0 0 0-3.68 4.64 11.378 11.378 0 0 0-1.044 3.176 12.34 12.34 0 0 0-.12.738 11.047 11.047 0 0 0-.633-.033l-.059-.003a7.46 7.46 0 0 0-2.28.274l-.317.089-.163.286a9.63 9.63 0 0 0-1.252 4.416 9.53 9.53 0 0 0 1.583 5.625 9.573 9.573 0 0 0 4.42 3.611l.236.095.071.025.003-.001a9.59 9.59 0 0 0 3.283.574 9.496 9.496 0 0 0 3.69-.742l.008.004.313-.145a9.63 9.63 0 0 0 3.927-3.335 9.578 9.578 0 0 0 1.641-5.042c.075-2.161-.643-4.304-2.133-6.371Zm-7.083 6.695c.328 1.244.264 2.44-.19 3.558-1.136-1.12-1.968-2.352-2.476-3.665-.543-1.404-.87-2.74-.974-3.975.48.157.922.366 1.315.622 1.132.737 1.914 1.901 2.325 3.46Zm.207 6.022c.482.368.99.712 1.513 1.028a7.904 7.904 0 0 1-2.742.251 9.185 9.185 0 0 0 1.228-1.279h.001Zm1.347-6.431c-.516-1.957-1.527-3.437-3.002-4.398a7.405 7.405 0 0 0-2.194-.95 8.732 8.732 0 0 1 .09-.713 11.556 11.556 0 0 1 .91-2.765l.003-.008c.177-.358.376-.719.61-1.105l.092-.152-.003-.001a11.672 11.672 0 0 1 1.942-2.311l.288.341c.672.796 1.304 1.548 1.878 2.237 1.291 1.549 2.966 3.583 3.612 4.48 1.277 1.771 1.893 3.579 1.83 5.375a7.973 7.973 0 0 1-3.995 6.641 15.502 15.502 0 0 1-2.539-1.599c.79-1.575.952-3.28.48-5.072h-.002Zm-2.575 5.397a7.857 7.857 0 0 1-2.09 1.856 5.514 5.514 0 0 1-.243-.093l-.065-.026a7.974 7.974 0 0 1-3.635-3.01 7.938 7.938 0 0 1-1.298-4.653 7.892 7.892 0 0 1 .882-3.379c.316-.07.638-.114.96-.131l.084-.002c.162-.003.324-.003.478 0 .227.011.454.035.677.07.073 1.513.445 3.145 1.105 4.852.637 1.644 1.694 3.162 3.144 4.515l.001.001Z'\n        />\n      </g>\n      <defs>\n        <clipPath id='a'>\n          <path fill='#fff' d='M0 .5h24v24H0z' />\n        </clipPath>\n      </defs>\n    </svg>\n  }\n>\n  How to use Agentic tools with the Firebase Genkit SDK.\n</Card>\n\n  <Card\n    title='Mastra'\n    href='/marketplace/ts-sdks/mastra'\n    icon={\n<svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    viewBox=\"0 0 26 26\"\n    fill=\"none\"\n  >\n    <g clipPath=\"url(#a)\">\n      <path\n        stroke=\"#000\"\n        strokeWidth={1.16}\n        d=\"M12.987 24.466c6.357 0 11.51-5.134 11.51-11.468 0-6.333-5.153-11.467-11.51-11.467-6.356 0-11.508 5.134-11.508 11.467 0 6.334 5.152 11.468 11.508 11.468Z\"\n      />\n      <path\n        stroke=\"#000\"\n        strokeWidth={1.16}\n        d=\"M7.527 18.438c4.495 4.478 10.582 5.673 13.597 2.67 3.014-3.004 1.814-9.07-2.68-13.548C13.949 3.082 7.862 1.887 4.848 4.89c-3.015 3.004-1.815 9.07 2.68 13.547ZM8.29 13.043h9.457M10.615 15.436l4.806-4.788M15.419 15.436l-4.806-4.788\"\n      />\n      <path\n        fill=\"#000\"\n        fillRule=\"evenodd\"\n        d=\"M5.112 7.952C3.115 9.287 1.952 11.082 1.952 13c0 1.918 1.163 3.712 3.16 5.047 1.995 1.333 4.777 2.172 7.874 2.172 3.098 0 5.88-.84 7.875-2.172 1.997-1.335 3.16-3.129 3.16-5.047 0-1.918-1.163-3.712-3.16-5.047-1.995-1.332-4.777-2.172-7.875-2.172-3.097 0-5.88.84-7.874 2.172Zm-.527-.783c2.17-1.451 5.142-2.333 8.401-2.333 3.26 0 6.232.882 8.402 2.333 2.168 1.448 3.581 3.5 3.581 5.83s-1.413 4.382-3.58 5.83c-2.171 1.451-5.143 2.333-8.402 2.333-3.26 0-6.232-.882-8.402-2.332-2.168-1.45-3.581-3.501-3.581-5.83 0-2.33 1.413-4.383 3.58-5.831Z\"\n        clipRule=\"evenodd\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 .5h26v25H0z\" />\n      </clipPath>\n    </defs>\n  </svg>\n    }\n  >\n    How to use Agentic tools with the Mastra SDK.\n  </Card>\n</Columns>\n\n## MCP Clients\n\n<Columns cols={2}>\n  <Card\n    title='Cursor'\n    href='/marketplace/mcp-clients/cursor'\n    icon='https://agentic.so/assets/mcp-clients/cursor-icon-light.svg'\n  >\n    How to use Agentic tools with Cursor.\n  </Card>\n\n<Card\n  title='Claude Code'\n  href='/marketplace/mcp-clients/claude-code'\n  icon='https://agentic.so/assets/mcp-clients/anthropic-icon-light.svg'\n>\n  How to use Agentic tools with Claude Code.\n</Card>\n\n<Card\n  title='Claude Desktop'\n  href='/marketplace/mcp-clients/claude-desktop'\n  icon='https://agentic.so/assets/mcp-clients/anthropic-icon-light.svg'\n>\n  How to use Agentic tools with Claude Desktop.\n</Card>\n\n<Card\n  title='Cline'\n  href='/marketplace/mcp-clients/cline'\n  icon='https://agentic.so/assets/mcp-clients/cline-icon-light.png'\n>\n  How to use Agentic tools with Cline.\n</Card>\n\n<Card\n  title='Raycast'\n  href='/marketplace/mcp-clients/raycast'\n  icon='https://agentic.so/assets/mcp-clients/raycast-icon-light.svg'\n>\n  How to use Agentic tools with Raycast.\n</Card>\n\n<Card\n  title='Trae'\n  href='/marketplace/mcp-clients/trae'\n  icon='https://agentic.so/assets/mcp-clients/trae-icon-light.svg'\n>\n  How to use Agentic tools with Trae.\n</Card>\n\n<Card\n  title='VS Code'\n  href='/marketplace/mcp-clients/vscode'\n  icon='https://agentic.so/assets/mcp-clients/vscode-icon-light.svg'\n>\n  How to use Agentic tools with VS Code.\n</Card>\n\n<Card\n  title='Warp'\n  href='/marketplace/mcp-clients/warp'\n  icon='https://agentic.so/assets/mcp-clients/warp-icon-light.png'\n>\n  How to use Agentic tools with Warp.\n</Card>\n\n<Card\n  title='Windsurf'\n  href='/marketplace/mcp-clients/windsurf'\n  icon='https://agentic.so/assets/mcp-clients/windsurf-icon-light.svg'\n>\n  How to use Agentic tools with Windsurf.\n</Card>\n\n</Columns>\n\n## Python AI SDKs\n\n_Python docs are coming soon..._\n\n## Want to publish your own MCP tools?\n\nAgentic makes it extremely easy to publish and monetize your own MCP tools. Regardless of whether you're starting from scratch or already have an existing API, you'll be up and running with a production-ready MCP product in minutes.\n\nVisit the [publishing docs](/publishing) to get started.\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/claude-code.mdx",
    "content": "---\ntitle: Claude Code\ndescription: How to use Agentic tools with Claude Code as an MCP client.\n---\n\nSee [Claude Code MCP docs](https://docs.anthropic.com/en/docs/claude-code/mcp) for more info.\n\n## Example\n\n```sh\nclaude mcp add --transport http \"@agentic/search\" \"https://gateway.agentic.so/@agentic/search/mcp\"\n```\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/claude-desktop.mdx",
    "content": "---\ntitle: Claude Desktop\ndescription: How to use Agentic tools with Claude Desktop as an MCP client.\n---\n\nClaude Desktop requires you to use [mcp-remote](https://github.com/geelen/mcp-remote) because it currently only supports local `stdio` MCP servers.\n\n## Example\n\n```json\n{\n  \"mcpServers\": {\n    \"@agentic/search\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"mcp-remote\",\n        \"https://gateway.agentic.so/@agentic/search/mcp\"\n      ]\n    }\n  }\n}\n```\n\n## DXT\n\nAgentic tools don't currently support Anthropic's [Desktop Extensions (DXT)](https://www.anthropic.com/engineering/desktop-extensions) format.\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/cline.mdx",
    "content": "---\ntitle: Cline\ndescription: How to use Agentic tools with Cline as an MCP client.\n---\n\n## Example\n\n```json\n{\n  \"mcpServers\": {\n    \"@agentic/search\": {\n      \"url\": \"https://gateway.agentic.so/@agentic/search/mcp\",\n      \"disabled\": false\n    }\n  }\n}\n```\n\nSee the [Cline MCP docs](https://docs.cline.bot/mcp/connecting-to-a-remote-server) for more details.\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/cursor.mdx",
    "content": "---\ntitle: Cursor\ndescription: How to use Agentic tools with Cursor as an MCP client.\n---\n\nGo to: `Settings` -> `Cursor Settings` -> `MCP` -> `Add new global MCP server`\n\nPasting the following configuration into your Cursor `~/.cursor/mcp.json` file is the recommended approach. You may also install in a specific project by creating `.cursor/mcp.json` in your project folder. See [Cursor MCP docs](https://docs.cursor.com/context/model-context-protocol) for more info.\n\n## Example\n\n```json\n{\n  \"mcpServers\": {\n    \"@agentic/search\": {\n      \"url\": \"https://gateway.agentic.so/@agentic/search/mcp\"\n    }\n  }\n}\n```\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/raycast.mdx",
    "content": "---\ntitle: Raycast\ndescription: How to use Agentic tools with Raycast as an MCP client.\n---\n\n## Example\n\n```json\n{\n  \"mcpServers\": {\n    \"@agentic/search\": {\n      \"url\": \"https://gateway.agentic.so/@agentic/search/mcp\"\n    }\n  }\n}\n```\n\n## Raycast Deep Link\n\n<Frame>\n  <img\n    src='https://agentic.so/assets/mcp-clients/raycast-screenshot.jpg'\n    alt='Raycast Deep Link'\n    className='w-full rounded-lg overflow-hidden'\n  />\n</Frame>\n\nSee the [Raycast MCP docs](https://manual.raycast.com/model-context-protocol) for more details.\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/trae.mdx",
    "content": "---\ntitle: Trae\ndescription: How to use Agentic tools with Trae as an MCP client.\n---\n\nUse the Add manually feature and fill in the JSON configuration information for that MCP server.\n\nFor more details, visit the [Trae documentation](https://docs.trae.ai/ide/model-context-protocol?_lang=en).\n\n## Example\n\n```json\n{\n  \"mcpServers\": {\n    \"@agentic/search\": {\n      \"url\": \"https://gateway.agentic.so/@agentic/search/mcp\"\n    }\n  }\n}\n```\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/vscode.mdx",
    "content": "---\ntitle: VS Code\ndescription: How to use Agentic tools with VS Code as an MCP client.\n---\n\nAdd the given JSON to your VS Code MCP config file. See [VS Code MCP docs](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) for more info.\n\n## Example\n\n```json\n\"mcp\": {\n  \"servers\": {\n    \"@agentic/search\": {\n      \"type\": \"http\",\n      \"url\": \"https://gateway.agentic.so/@agentic/search/mcp\"\n    }\n  }\n}\n```\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/warp.mdx",
    "content": "---\ntitle: Warp\ndescription: How to use Agentic tools with Warp as an MCP client.\n---\n\n## Example\n\n```json\n{\n  \"mcpServers\": {\n    \"@agentic/search\": {\n      \"url\": \"https://gateway.agentic.so/@agentic/search/mcp\"\n    }\n  }\n}\n```\n\nSee the [Warp MCP docs](https://docs.warp.dev/knowledge-and-collaboration/mcp#adding-an-mcp-server) for more details.\n"
  },
  {
    "path": "docs/marketplace/mcp-clients/windsurf.mdx",
    "content": "---\ntitle: Windsurf\ndescription: How to use Agentic tools with Windsurf as an MCP client.\n---\n\nWindsurf requires you to use [mcp-remote](https://github.com/geelen/mcp-remote) because [they do not support the Streamable HTTP Transport](https://docs.windsurf.com/windsurf/cascade/mcp).\n\n## Example\n\n```json\n{\n  \"mcpServers\": {\n    \"@agentic/search\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"mcp-remote\",\n        \"https://gateway.agentic.so/@agentic/search/mcp\"\n      ]\n    }\n  }\n}\n```\n"
  },
  {
    "path": "docs/marketplace/ts-sdks/ai-sdk.mdx",
    "content": "---\ntitle: Vercel AI SDK\ndescription: How to use Agentic tools with the Vercel AI SDK.\n---\n\n<Info>\n  Agentic tools currently support the Vercel AI SDK v4. Support for the v5 beta\n  is coming soon.\n</Info>\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install ai @agentic/ai-sdk @agentic/platform-tool-client\n```\n\n```bash pnpm\npnpm add ai @agentic/ai-sdk @agentic/platform-tool-client\n```\n\n```bash bun\nbun add ai @agentic/ai-sdk @agentic/platform-tool-client\n```\n\n```bash yarn\nyarn add ai @agentic/ai-sdk @agentic/platform-tool-client\n```\n\n</CodeGroup>\n\n## Usage\n\nThis example uses the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { createAISDKTools } from '@agentic/ai-sdk'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n  const openai = createOpenAI({ compatibility: 'strict' })\n\n  const result = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(searchTool),\n    toolChoice: 'required',\n    temperature: 0,\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What is the weather in San Francisco?'\n  })\n\n  console.log(JSON.stringify(result.toolResults[0], null, 2))\n}\n\nawait main()\n```\n\n<Expandable title=\"Additional dependencies\">\nThis example also uses the [@ai-sdk/openai](https://ai-sdk.dev/providers/ai-sdk-providers/openai) provider, which adds OpenAI support to the Vercel AI SDK.\n\n_Note that OpenAI is not necessary to use Agentic; this is just an example._\n\n<CodeGroup>\n```bash npm\nnpm install @ai-sdk/openai dotenv\n```\n\n```bash pnpm\npnpm add @ai-sdk/openai dotenv\n```\n\n```bash bun\nbun add @ai-sdk/openai dotenv\n```\n\n```bash yarn\nyarn add @ai-sdk/openai dotenv\n```\n\n</CodeGroup>\n</Expandable>\n\n## Running this example\n\nYou can view the full source for this example here: https://github.com/transitive-bullshit/agentic/tree/main/examples/ts-sdks/ai-sdk\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n<Info>\n  The\n  [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search)\n  tool comes with a generous free tier, but once that runs out, you'll need to\n  sign up for a paid plan and add an `AGENTIC_API_KEY` to your `.env` file.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\npnpm build\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/ts-sdks/ai-sdk/bin/weather.ts\n```\n\n## Additional resources\n\n- [`@agentic/ai-sdk` source](https://github.com/transitive-bullshit/agentic/blob/main/stdlib/ai-sdk/src/ai-sdk.ts)\n- [Vercel AI SDK docs](https://ai-sdk.dev)\n"
  },
  {
    "path": "docs/marketplace/ts-sdks/genkit.mdx",
    "content": "---\ntitle: Firebase Genkit\ndescription: How to use Agentic tools with the Firebase Genkit SDK.\n---\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install genkit @agentic/genkit @agentic/platform-tool-client\n```\n\n```bash pnpm\npnpm add genkit @agentic/genkit @agentic/platform-tool-client\n```\n\n```bash bun\nbun add genkit @agentic/genkit @agentic/platform-tool-client\n```\n\n```bash yarn\nyarn add genkit @agentic/genkit @agentic/platform-tool-client\n```\n\n</CodeGroup>\n\n## Usage\n\nThis example uses the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { createGenkitTools } from '@agentic/genkit'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { genkit } from 'genkit'\nimport { gpt4oMini, openAI } from 'genkitx-openai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const ai = genkit({\n    plugins: [openAI()]\n  })\n\n  const result = await ai.generate({\n    model: gpt4oMini,\n    tools: createGenkitTools(ai, searchTool),\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What is the weather in San Francisco?'\n  })\n\n  console.log(result)\n}\n\nawait main()\n```\n\n<Expandable title=\"Additional dependencies\">\nThis example also uses the [genkitx-openai](https://github.com/TheFireCo/genkit-plugins/tree/main/plugins/openai) package, which adds OpenAI support to Genkit.\n\n_Note that OpenAI is not necessary to use Agentic; this is just an example._\n\n<CodeGroup>\n```bash npm\nnpm install genkitx-openai dotenv\n```\n\n```bash pnpm\npnpm add genkitx-openai dotenv\n```\n\n```bash bun\nbun add genkitx-openai dotenv\n```\n\n```bash yarn\nyarn add genkitx-openai dotenv\n```\n\n</CodeGroup>\n</Expandable>\n\n## Running this example\n\nYou can view the full source for this example here: https://github.com/transitive-bullshit/agentic/tree/main/examples/ts-sdks/genkit\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n<Info>\n  The\n  [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search)\n  tool comes with a generous free tier, but once that runs out, you'll need to\n  sign up for a paid plan and add an `AGENTIC_API_KEY` to your `.env` file.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\npnpm build\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/ts-sdks/genkit/bin/weather.ts\n```\n\n## Additional resources\n\n- [`@agentic/genkit` source](https://github.com/transitive-bullshit/agentic/blob/main/stdlib/genkit/src/genkit.ts)\n- [Firebase Genkit docs](https://firebase.google.com/docs/genkit)\n"
  },
  {
    "path": "docs/marketplace/ts-sdks/langchain.mdx",
    "content": "---\ntitle: LangChain\ndescription: How to use Agentic tools with the LangChain TS SDK.\n---\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install langchain @langchain/core @langchain/agents @agentic/langchain @agentic/platform-tool-client\n```\n\n```bash pnpm\npnpm add langchain @langchain/core @langchain/agents @agentic/langchain @agentic/platform-tool-client\n```\n\n```bash bun\nbun add langchain @langchain/core @langchain/agents @agentic/langchain @agentic/platform-tool-client\n```\n\n```bash yarn\nyarn add langchain @langchain/core @langchain/agents @agentic/langchain @agentic/platform-tool-client\n```\n\n</CodeGroup>\n\n## Usage\n\nThis example uses the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { createLangChainTools } from '@agentic/langchain'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { ChatPromptTemplate } from '@langchain/core/prompts'\nimport { ChatOpenAI } from '@langchain/openai'\nimport { AgentExecutor, createToolCallingAgent } from 'langchain/agents'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const tools = createLangChainTools(searchTool)\n  const agent = createToolCallingAgent({\n    llm: new ChatOpenAI({ model: 'gpt-4o-mini', temperature: 0 }),\n    tools,\n    prompt: ChatPromptTemplate.fromMessages([\n      ['system', 'You are a helpful assistant. Be as concise as possible.'],\n      ['placeholder', '{chat_history}'],\n      ['human', '{input}'],\n      ['placeholder', '{agent_scratchpad}']\n    ])\n  })\n\n  const agentExecutor = new AgentExecutor({\n    agent,\n    tools\n    // verbose: true\n  })\n\n  const result = await agentExecutor.invoke({\n    input: 'What is the weather in San Francisco?'\n  })\n\n  console.log(result.output)\n}\n\nawait main()\n```\n\n<Expandable title=\"Additional dependencies\">\nThis example also uses the [@langchain/openai](https://js.langchain.com/docs/integrations/platforms/openai) package, which adds OpenAI support to LangChain.\n\n_Note that OpenAI is not necessary to use Agentic; this is just an example._\n\n<CodeGroup>\n```bash npm\nnpm install @langchain/openai dotenv\n```\n\n```bash pnpm\npnpm add @langchain/openai dotenv\n```\n\n```bash bun\nbun add @langchain/openai dotenv\n```\n\n```bash yarn\nyarn add @langchain/openai dotenv\n```\n\n</CodeGroup>\n</Expandable>\n\n## Running this example\n\nYou can view the full source for this example here: https://github.com/transitive-bullshit/agentic/tree/main/examples/ts-sdks/langchain\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n<Info>\n  The\n  [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search)\n  tool comes with a generous free tier, but once that runs out, you'll need to\n  sign up for a paid plan and add an `AGENTIC_API_KEY` to your `.env` file.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\npnpm build\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/ts-sdks/langchain/bin/weather.ts\n```\n\n## Additional resources\n\n- [`@agentic/langchain` source](https://github.com/transitive-bullshit/agentic/blob/main/stdlib/langchain/src/langchain.ts)\n- [LangChain TS docs](https://js.langchain.com)\n"
  },
  {
    "path": "docs/marketplace/ts-sdks/llamaindex.mdx",
    "content": "---\ntitle: LlamaIndex\ndescription: How to use Agentic tools with the LlamaIndex TS SDK.\n---\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install llamaindex @llamaindex/workflow @agentic/llamaindex @agentic/platform-tool-client\n```\n\n```bash pnpm\npnpm add llamaindex @llamaindex/workflow @agentic/llamaindex @agentic/platform-tool-client\n```\n\n```bash bun\nbun add llamaindex @llamaindex/workflow @agentic/llamaindex @agentic/platform-tool-client\n```\n\n```bash yarn\nyarn add llamaindex @llamaindex/workflow @agentic/llamaindex @agentic/platform-tool-client\n```\n\n</CodeGroup>\n\n## Usage\n\nThis example uses the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { createLlamaIndexTools } from '@agentic/llamaindex'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@llamaindex/openai'\nimport { agent } from '@llamaindex/workflow'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const tools = createLlamaIndexTools(searchTool)\n  const weatherAgent = agent({\n    llm: openai({ model: 'gpt-4o-mini', temperature: 0 }),\n    systemPrompt: 'You are a helpful assistant. Be as concise as possible.',\n    tools\n  })\n\n  const response = await weatherAgent.run(\n    'What is the weather in San Francisco?'\n  )\n\n  console.log(response.data.result)\n}\n\nawait main()\n```\n\n<Expandable title=\"Additional dependencies\">\nThis example also uses the [@llamaindex/openai](https://ts.llamaindex.ai/docs/llamaindex/modules/models/llms/openai) provider, which adds OpenAI support to LlamaIndex.\n\n_Note that OpenAI is not necessary to use Agentic; this is just an example._\n\n<CodeGroup>\n```bash npm\nnpm install @llamaindex/openai dotenv\n```\n\n```bash pnpm\npnpm add @llamaindex/openai dotenv\n```\n\n```bash bun\nbun add @llamaindex/openai dotenv\n```\n\n```bash yarn\nyarn add @llamaindex/openai dotenv\n```\n\n</CodeGroup>\n</Expandable>\n\n## Running this example\n\nYou can view the full source for this example here: https://github.com/transitive-bullshit/agentic/tree/main/examples/ts-sdks/llamaindex\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n<Info>\n  The\n  [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search)\n  tool comes with a generous free tier, but once that runs out, you'll need to\n  sign up for a paid plan and add an `AGENTIC_API_KEY` to your `.env` file.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\npnpm build\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/ts-sdks/llamaindex/bin/weather.ts\n```\n\n## Additional resources\n\n- [`@agentic/llamaindex` source](https://github.com/transitive-bullshit/agentic/blob/main/stdlib/llamaindex/src/llamaindex.ts)\n- [LlamaIndex TS docs](https://ts.llamaindex.ai)\n"
  },
  {
    "path": "docs/marketplace/ts-sdks/mastra.mdx",
    "content": "---\ntitle: Mastra\ndescription: How to use Agentic tools with the Mastra AI Agent framework.\n---\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @mastra/core @agentic/mastra @agentic/platform-tool-client\n```\n\n```bash pnpm\npnpm add @mastra/core @agentic/mastra @agentic/platform-tool-client\n```\n\n```bash bun\nbun add @mastra/core @agentic/mastra @agentic/platform-tool-client\n```\n\n```bash yarn\nyarn add @mastra/core @agentic/mastra @agentic/platform-tool-client\n```\n\n</CodeGroup>\n\n## Usage\n\nThis example uses the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { createMastraTools } from '@agentic/mastra'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@ai-sdk/openai'\nimport { Agent } from '@mastra/core/agent'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const weatherAgent = new Agent({\n    name: 'Weather Agent',\n    instructions: 'You are a helpful assistant. Be as concise as possible.',\n    model: openai('gpt-4o-mini'),\n    tools: createMastraTools(searchTool)\n  })\n\n  const res = await weatherAgent.generate(\n    'What is the weather in San Francisco?'\n  )\n  console.log(res.text)\n}\n\nawait main()\n```\n\n<Expandable title=\"Additional dependencies\">\nThis example also uses the [@ai-sdk/openai](https://ai-sdk.dev/providers/ai-sdk-providers/openai) provider, which adds OpenAI support to Mastra.\n\n_Note that OpenAI is not necessary to use Agentic; this is just an example._\n\n<CodeGroup>\n```bash npm\nnpm install @ai-sdk/openai dotenv\n```\n\n```bash pnpm\npnpm add @ai-sdk/openai dotenv\n```\n\n```bash bun\nbun add @ai-sdk/openai dotenv\n```\n\n```bash yarn\nyarn add @ai-sdk/openai dotenv\n```\n\n</CodeGroup>\n</Expandable>\n\n## Running this example\n\nYou can view the full source for this example here:\nhttps://github.com/transitive-bullshit/agentic/tree/main/examples/ts-sdks/mastra\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n<Info>\n  The\n  [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search)\n  tool comes with a generous free tier, but once that runs out, you'll need to\n  sign up for a paid plan and add an `AGENTIC_API_KEY` to your `.env` file.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\npnpm build\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/ts-sdks/mastra/bin/weather.ts\n```\n\n## Additional resources\n\n- [`@agentic/mastra` source](https://github.com/transitive-bullshit/agentic/blob/main/stdlib/mastra/src/mastra.ts)\n- [Mastra docs](https://mastra.ai)\n"
  },
  {
    "path": "docs/marketplace/ts-sdks/openai-chat.mdx",
    "content": "---\ntitle: OpenAI Chat Completions\ndescription: How to use Agentic tools with the OpenAI Chat Completions API.\n---\n\n<Tip>\n  There's no need for an adapter with the OpenAI SDK since all agentic tools are\n  compatible with OpenAI by default.\n</Tip>\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install openai @agentic/platform-tool-client\n```\n\n```bash pnpm\npnpm add openai @agentic/platform-tool-client\n```\n\n```bash bun\nbun add openai @agentic/platform-tool-client\n```\n\n```bash yarn\nyarn add openai @agentic/platform-tool-client\n```\n\n</CodeGroup>\n\n## Usage\n\nThis example uses the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport OpenAI from 'openai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n  const openai = new OpenAI()\n\n  const messages: OpenAI.ChatCompletionMessageParam[] = [\n    {\n      role: 'system',\n      content: 'You are a helpful assistant. Be as concise as possible.'\n    },\n    { role: 'user', content: 'What is the weather in San Francisco?' }\n  ]\n\n  {\n    // First call to OpenAI to invoke the tool\n    const res = await openai.chat.completions.create({\n      messages,\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.toolSpecs,\n      tool_choice: 'required'\n    })\n\n    const message = res.choices[0]!.message!\n    const toolCall = message.tool_calls![0]!.function!\n    const toolResult = await searchTool.callTool(\n      toolCall.name,\n      toolCall.arguments\n    )\n\n    messages.push(message)\n    messages.push({\n      role: 'tool',\n      tool_call_id: message.tool_calls![0]!.id,\n      content: JSON.stringify(toolResult)\n    })\n  }\n\n  {\n    // Second call to OpenAI to generate a text response\n    const res = await openai.chat.completions.create({\n      messages,\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.toolSpecs\n    })\n    const message = res.choices?.[0]?.message\n    console.log(message?.content)\n  }\n}\n\nawait main()\n```\n\n## Running this example\n\nYou can view the full source for this example here: https://github.com/transitive-bullshit/agentic/tree/main/examples/ts-sdks/openai\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n<Info>\n  The\n  [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search)\n  tool comes with a generous free tier, but once that runs out, you'll need to\n  sign up for a paid plan and add an `AGENTIC_API_KEY` to your `.env` file.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\npnpm build\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/ts-sdks/openai/bin/weather.ts\n```\n\n## Additional resources\n\n- [OpenAI Chat Completions API docs](https://platform.openai.com/docs/api-reference/chat/create)\n- [OpenAI Responses vs Chat Completions](https://platform.openai.com/docs/guides/responses-vs-chat-completions)\n- [Using OpenAI's Responses API with Agentic](/marketplace/ts-sdks/openai-responses)\n"
  },
  {
    "path": "docs/marketplace/ts-sdks/openai-responses.mdx",
    "content": "---\ntitle: OpenAI Responses\ndescription: How to use Agentic tools with the OpenAI Responses API.\n---\n\n<Tip>\n  There's no need for an adapter with the OpenAI SDK since all agentic tools are\n  compatible with OpenAI by default.\n</Tip>\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install openai @agentic/platform-tool-client\n```\n\n```bash pnpm\npnpm add openai @agentic/platform-tool-client\n```\n\n```bash bun\nbun add openai @agentic/platform-tool-client\n```\n\n```bash yarn\nyarn add openai @agentic/platform-tool-client\n```\n\n</CodeGroup>\n\n## Usage\n\nThis example uses the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { assert } from '@agentic/core'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport OpenAI from 'openai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n  const openai = new OpenAI()\n\n  const messages: OpenAI.Responses.ResponseInput = [\n    {\n      role: 'system',\n      content: 'You are a helpful assistant. Be as concise as possible.'\n    },\n    { role: 'user', content: 'What is the weather in San Francisco?' }\n  ]\n\n  {\n    // First call to OpenAI to invoke the tool\n    const res = await openai.responses.create({\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.responsesToolSpecs,\n      tool_choice: 'required',\n      input: messages\n    })\n\n    const toolCall = res.output[0]\n    assert(toolCall?.type === 'function_call')\n    const toolResult = await searchTool.callTool(\n      toolCall.name,\n      toolCall.arguments\n    )\n\n    messages.push(toolCall)\n    messages.push({\n      type: 'function_call_output',\n      call_id: toolCall.call_id,\n      output: JSON.stringify(toolResult)\n    })\n  }\n\n  {\n    // Second call to OpenAI to generate a text response\n    const res = await openai.responses.create({\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.responsesToolSpecs,\n      input: messages\n    })\n\n    console.log(res.output_text)\n  }\n}\n\nawait main()\n```\n\n## Running this example\n\nYou can view the full source for this example here: https://github.com/transitive-bullshit/agentic/tree/main/examples/ts-sdks/openai\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n<Info>\n  The\n  [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search)\n  tool comes with a generous free tier, but once that runs out, you'll need to\n  sign up for a paid plan and add an `AGENTIC_API_KEY` to your `.env` file.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\npnpm build\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/ts-sdks/openai/bin/weather-responses.ts\n```\n\n## Additional resources\n\n- [OpenAI Chat Completions API docs](https://platform.openai.com/docs/api-reference/chat/create)\n- [OpenAI Responses vs Chat Completions](https://platform.openai.com/docs/guides/responses-vs-chat-completions)\n- [Using OpenAI's Chat Completion API with Agentic](/marketplace/ts-sdks/openai-chat)\n"
  },
  {
    "path": "docs/package.json",
    "content": "{\n  \"name\": \"docs\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"docs\": \"mint dev\",\n    \"test\": \"run-s test:*\",\n    \"test:broken-links\": \"mint broken-links\"\n  },\n  \"devDependencies\": {\n    \"mint\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "docs/publishing/config/auth.mdx",
    "content": "---\ntitle: Auth\ndescription: Configure auth for your project.\n---\n\nShip to production fast with Agentic's free, hosted authentication. Email & password, OAuth, GitHub, Google, Twitter, etc – if your origin API requires OAuth credentials, Agentic likely already supports it, and if not, [please let us know](/contact).\n\nCurrently, Agentic supports the following auth providers:\n\n- Email & password\n- GitHub\n\n## How it works\n\nYour project's users will sign into Agentic, subscribe to your project using Stripe, and then be given an API key to use with their tool calls.\n\nAgentic's MCP gateway will then track all usage of your project based on API keys.\n\nSee [Origin Metadata](/publishing/origin/metadata) for details on how Agentic's MCP gateway passes customer auth and subscription information to your origin server.\n\n## Alpha Features\n\n### MCP OAuth\n\nAgentic's MCP Gateway is designed to interop with MCP's built-in OAuth support, but this functionality is currently in alpha and not enabled publicly by default. If you're interested in using your origin server's MCP authentication support, [please reach out](/contact).\n\n### Custom OAuth Providers\n\nAgentic's MCP Gateway is designed to support any third-party OAuth provider (Google, Twitter / X, Slack, Airtable, Shopify, etc), but this functionality is currently in alpha and not enabled publicly by default.\n\nIf you're interested in using a different OAuth provider or want your customers to use your own OAuth client credentials or custom scopes, [please reach out](/contact).\n"
  },
  {
    "path": "docs/publishing/config/caching.mdx",
    "content": "---\ntitle: Caching\ndescription: Configure caching for your project's tools.\n---\n\nOpt-in to caching with familiar _cache-control_ and _stale-while-revalidate_ options. MCP tool calls include caching information in their _\\_meta_ fields, providing parity with standard HTTP headers.\n\nAgentic uses Cloudflare's global edge cache for caching, which guarantees unmatched global performance.\n\n## Enabling Caching\n\nYou can enable caching for individual tools by setting [pure](/publishing/config/tool-config#param-pure) or [cacheControl](/publishing/config/tool-config#param-cache-control) on the tool's config. See [below](#examples) for examples.\n\n## Cache Keys\n\nCache keys for tool calls are generated by normalizing the tool call's input, regardless of whether the tool call was made via `HTTP POST`, `HTTP GET`, or `MCP`.\n\nTool call args are hashed using a stable, deterministic JSON serialization algorithm, so tool calls with \"identical\" JSON inputs will have identical cache keys.\n\n## Disabling Caching\n\nIndividual tool calls can disable caching by setting the standard `Cache-Control` header to `no-store` or `no-cache`.\n\n<Note>\n  Note that by default, caching is disabled for all tools. You must explicitly\n  enable caching for each tool in your Agentic project config.\n</Note>\n\n## Examples\n\n<Tabs>\n<Tab title=\"Pure Tool\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\n// In this example, `my-tool` is marked as pure which means its responses\n// will be cached aggressively for identical requests using `cache-control`\n// `public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600`\nexport default defineConfig({\n  // ...\n  toolConfigs: [\n    {\n      name: 'my-tool',\n      pure: true\n    }\n  ]\n})\n```\n\n</Tab>\n\n<Tab title=\"Custom Cache-Control\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\n// In this example, `my-tool` is using a custom `Cache-Control` header to\n// cache responses for 60 seconds.\nexport default defineConfig({\n  // ...\n  toolConfigs: [\n    {\n      name: 'my-tool',\n      cacheControl: 'public, max-age=60, s-maxage=60 stale-while-revalidate=10'\n    }\n  ]\n})\n```\n\n</Tab>\n\n<Tab title=\"Disabling Caching\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\n// In this example, `my-tool` results will never be cached.\n// Note that this is the default behavior for all tools unless caching is\n// explicitly enabled for a tool.\nexport default defineConfig({\n  // ...\n  toolConfigs: [\n    {\n      name: 'my-tool',\n      cacheControl: 'no-cache'\n    }\n  ]\n})\n```\n\n</Tab>\n\n</Tabs>\n"
  },
  {
    "path": "docs/publishing/config/examples.mdx",
    "content": "---\ntitle: Examples\ndescription: Example starter configs for the Agentic MCP Gateway.\n---\n\n## Minimal Examples\n\n### Basic MCP Example\n\n<Tabs>\n<Tab title=\"TypeScript Config\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Basic MCP Example',\n  description:\n    \"This example shows how to configure Agentic's MCP gateway with an origin MCP server using the Streamable HTTP transport.\",\n  origin: {\n    type: 'mcp',\n    url: 'https://agentic-basic-mcp-test.onrender.com/mcp'\n  }\n})\n```\n\n</Tab>\n\n<Tab title=\"JSON Config\">\n\n```json agentic.config.json\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"Basic MCP Example\",\n  \"description\": \"This example shows how to configure Agentic's MCP gateway with an origin MCP server using the Streamable HTTP transport.\",\n  \"origin\": {\n    \"type\": \"mcp\",\n    \"url\": \"https://agentic-basic-mcp-test.onrender.com/mcp\"\n  }\n}\n```\n\n</Tab>\n</Tabs>\n\n### Basic OpenAPI Example\n\n<Tabs>\n<Tab title=\"TypeScript Config\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Basic OpenAPI Example',\n  description:\n    \"This example shows how to configure Agentic's MCP gateway with an origin OpenAPI server.\",\n  origin: {\n    type: 'openapi',\n    url: 'https://jsonplaceholder.typicode.com',\n    spec: './jsonplaceholder.json'\n  }\n})\n```\n\n</Tab>\n\n<Tab title=\"JSON Config\">\n\n```json agentic.config.json\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"Basic OpenAPI Example\",\n  \"description\": \"This example shows how to configure Agentic's MCP gateway with an origin OpenAPI server.\",\n  \"origin\": {\n    \"type\": \"openapi\",\n    \"url\": \"https://jsonplaceholder.typicode.com\",\n    \"spec\": \"./jsonplaceholder.json\"\n  }\n}\n```\n\n</Tab>\n</Tabs>\n\n## Pricing Examples\n\n<Tip>\n  Pricing can feel a little complicated to set up. Feel free to [reach out to\n  us](/contact) once you're ready to start charging for your product, and I'd be\n  happy to help you set everything up.\n</Tip>\n\n### Free Monthly Pricing Example\n\nThis example shows the free monthly pricing plan which is used by default for projects that don't specify any pricing plans.\n\n<Tabs>\n<Tab title=\"TypeScript Config\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Free Monthly Pricing Example',\n  description:\n    \"This example shows the free monthly pricing plan which is used by default for projects that don't specify any pricing plans.\",\n  origin: {\n    type: 'mcp',\n    url: 'https://agentic-basic-mcp-test.onrender.com/mcp'\n  },\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ],\n      rateLimit: {\n        enabled: true,\n        interval: 60,\n        limit: 1000\n      }\n    }\n  ]\n})\n```\n\n</Tab>\n\n<Tab title=\"JSON Config\">\n\n```json agentic.config.json\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"Free Monthly Pricing Example\",\n  \"description\": \"This example shows the free monthly pricing plan which is used by default for projects that don't specify any pricing plans.\",\n  \"origin\": {\n    \"type\": \"mcp\",\n    \"url\": \"https://agentic-basic-mcp-test.onrender.com/mcp\"\n  },\n  \"pricingPlans\": [\n    {\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n      \"lineItems\": [\n        {\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n          \"amount\": 0\n        }\n      ],\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000\n      }\n    }\n  ]\n}\n```\n\n</Tab>\n</Tabs>\n\n### Usage-Based Tiered Pricing Example\n\nThis example shows a pricing setup with 2 pricing plans: a free tier with a limit of 10 requests per day, and a usage-based, tiered pricing plan where you charge a different rate per request based on the total volume of requests per month.\n\n<Tabs>\n<Tab title=\"TypeScript Config\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Free Monthly Pricing Example',\n  description:\n    'This example shows a pricing configuration with 2 pricing plans: a free tier with a limit of 10 requests per day, and a usage-based tiered pricing plan with a free tier and a standard tier.',\n  origin: {\n    type: 'mcp',\n    url: 'https://agentic-basic-mcp-test.onrender.com/mcp'\n  },\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 0\n        }\n      ],\n      // Limit free-tier requests to 10 per day\n      rateLimit: {\n        interval: '1d',\n        limit: 10\n      }\n    },\n    {\n      name: 'Standard',\n      slug: 'standard',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          // $10.00 USD base price per month\n          amount: 1000 // in cents\n        },\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'tiered',\n          tiersMode: 'volume',\n          tiers: [\n            {\n              // Free for the first 1000 requests per month\n              upTo: 1000,\n              unitAmount: 0 // in cents\n            },\n            {\n              // After 10k requests, it costs $0.001 USD per request up to\n              // 50k requests per month\n              upTo: 50_000,\n              unitAmount: 0.1 // in cents\n            },\n            {\n              // After 50k requests, it costs $0.0008 USD per request up to\n              // 500k requests per month\n              upTo: 500_000,\n              unitAmount: 0.08\n            },\n            {\n              // After 500k requests, it costs $0.0006 USD per request up to\n              // 2.5M requests per month\n              upTo: 2_500_000,\n              unitAmount: 0.06\n            },\n            {\n              // After 2.5M requests, it costs $0.0005 USD per request, with\n              // no upper bound set\n              upTo: 'inf',\n              unitAmount: 0.05\n            }\n          ]\n        }\n      ],\n      // Rate limit set to 100 requests per second\n      rateLimit: {\n        interval: '1s',\n        limit: 100\n      }\n    }\n  ]\n})\n```\n\n</Tab>\n\n<Tab title=\"JSON Config\">\n\n```json agentic.config.json\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"Usage-Based Tiered Pricing Example\",\n  \"description\": \"This example shows a pricing configuration with 2 pricing plans: a free tier with a limit of 10 requests per day, and a usage-based tiered pricing plan with a free tier and a standard tier.\",\n  \"origin\": {\n    \"type\": \"mcp\",\n    \"url\": \"https://agentic-basic-mcp-test.onrender.com/mcp\"\n  },\n  \"pricingPlans\": [\n    {\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n      \"lineItems\": [\n        {\n          \"slug\": \"requests\",\n          \"usageType\": \"metered\",\n          \"billingScheme\": \"per_unit\",\n          \"unitAmount\": 0\n        }\n      ],\n      // Limit free-tier requests to 10 per day\n      \"rateLimit\": {\n        \"interval\": \"1d\",\n        \"limit\": 10\n      }\n    },\n    {\n      \"name\": \"Standard\",\n      \"slug\": \"standard\",\n      \"lineItems\": [\n        {\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n          // $10.00 USD base price per month\n          \"amount\": 1000 // in cents\n        },\n        {\n          \"slug\": \"requests\",\n          \"usageType\": \"metered\",\n          \"billingScheme\": \"tiered\",\n          \"tiersMode\": \"volume\",\n          \"tiers\": [\n            {\n              // Free for the first 1000 requests per month\n              \"upTo\": 1000,\n              \"unitAmount\": 0 // in cents\n            },\n            {\n              // After 10k requests, it costs $0.001 USD per request up to\n              // 50k requests per month\n              \"upTo\": 50000,\n              \"unitAmount\": 0.1 // in cents\n            },\n            {\n              // After 50k requests, it costs $0.0008 USD per request up to\n              // 500k requests per month\n              \"upTo\": 500000,\n              \"unitAmount\": 0.08\n            },\n            {\n              // After requests, it costs $0.0006 USD per request up to\n              // 2.5M requests per month\n              \"upTo\": 2500000,\n              \"unitAmount\": 0.06\n            },\n            {\n              // After 2.5M requests, it costs $0.0005 USD per request, with\n              // no upper bound set\n              \"upTo\": \"inf\",\n              \"unitAmount\": 0.05\n            }\n          ]\n        }\n      ],\n      // Rate limit set to 100 requests per second\n      \"rateLimit\": {\n        \"interval\": \"1s\",\n        \"limit\": 100\n      }\n    }\n  ]\n}\n```\n\n</Tab>\n</Tabs>\n\n## Config Help\n\n<Tip>\n  Configuring your project can feel a little overwhelming. Feel free to [reach\n  out to us](/contact) if you're considering using Agentic's MCP Gateway, and\n  I'd be happy to help walk you through setting your product up for success.\n</Tip>\n"
  },
  {
    "path": "docs/publishing/config/index.mdx",
    "content": "---\ntitle: Config Overview\ndescription: Configuring your Agentic project.\n---\n\nEvery Agentic project needs a config file (`agentic.config.ts`, `agentic.config.js`, or `agentic.config.json`) to define the project's metadata, pricing, rate-limits, and any tool-specific behavior overrides.\n\n<Tip>\n  Configuring your project can feel a little overwhelming. Feel free to [reach\n  out to us](/contact) if you're considering using Agentic's MCP Gateway, and\n  I'd be happy to help walk you through setting your product up for success.\n</Tip>\n\n## Fields\n\n<ResponseField name='name' type='string' required>\nDisplay name for your project.\n\nMax length 1024 characters.\n\n</ResponseField>\n\n<ResponseField name='slug' type='string' required>\nUnique project slug.\n\nMust be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters.\n\nThe project's fully qualified identifier will be `@namespace/slug`, where\nthe `namespace` is determined by the author's `username` or team slug.\n\nIf not provided, it will be derived by slugifying `name`.\n\n</ResponseField>\n\n<ResponseField name='description' type='string' required>\n  Short description of the project.\n\nShould be no longer than a few lines.\n\n</ResponseField>\n\n<ResponseField name='version' type='string'>\nOptional semantic version of the project as a [semver](https://semver.org) string.\n\nExamples: `1.0.0`, `0.0.1`, `5.0.1`, etc.\n\n</ResponseField>\n\n<ResponseField name='readme' type='string'>\n  Optional markdown readme documenting the project (supports GitHub-flavored markdown).\n\nA string which may be either: a URL to a remote markdown file (eg, `https://example.com/readme.md`), a local file path (eg, `./readme.md`), or a data-uri string (eg, `data:text/markdown;base64,SGVsbG8gV29ybGQ=`).\n\n</ResponseField>\n\n<ResponseField name='iconUrl' type='string'>\nOptional logo image to use for the project. Logos should have a square aspect ratio.\n\nA string which may be either: a URL to a remote image (eg, `https://example.com/logo.png`), a local file path (eg, `./logo.png`), or a data-uri string (eg, `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...`).\n\n</ResponseField>\n\n<ResponseField name='sourceUrl' type='string'>\n  Optional URL to the source code of the project (eg, GitHub repo).\n</ResponseField>\n\n<ResponseField name='homepageUrl' type='string'>\n  Optional URL to the product's homepage.\n</ResponseField>\n\n<ResponseField name='origin' type='object' required>\n  Origin API adapter used to configure the origin API server downstream from\n  Agentic's MCP gateway.\n\n<Expandable title=\"properties\" defaultOpen>\n<Tabs>\n  <Tab title=\"MCP origin server\">\n    <ResponseField name=\"type\" type=\"string\" required>\n      The type of origin server. `mcp` in this case.\n    </ResponseField>\n\n    <ResponseField name=\"url\" type=\"string\" required>\n\nRequired base URL of the externally hosted origin MCP server.\n\nThis URL must be accessible from Agentic's MCP gateway and support the Streamable HTTP transport.\n\nMust be a valid `https` URL.\n\n</ResponseField>\n\n  </Tab>\n\n  <Tab title=\"OpenAPI origin server\">\n    <ResponseField name=\"type\" type=\"string\" required>\n      The type of origin server. `openapi` in this case.\n    </ResponseField>\n\n    <ResponseField name=\"url\" type=\"string\" required>\n\nRequired base URL of the externally hosted origin API server.\n\nMust be a valid `https` URL.\n\n</ResponseField>\n\n    <ResponseField name=\"spec\" type=\"string\" required>\n\nLocal file path or URL to an OpenAPI 3.x spec describing the origin API server.\n\nMay also be an embedded string containing a JSON stringified OpenAPI 3.x spec.\n\nNote that older OpenAPI versions are not supported.\n\n</ResponseField>\n  </Tab>\n</Tabs>\n</Expandable>\n</ResponseField>\n\n<ResponseField name='pricingPlans' type='array'>\n  List of PricingPlans configuring which Stripe subscriptions should be available for the project.\n\nDefaults to a single free plan which is useful for developing and testing your project.\n\nSee [PricingPlan](/publishing/config/pricing#pricing-plan) for details.\n\n</ResponseField>\n\n<ResponseField name='pricingIntervals' type='array'>\nOptional list of billing intervals to enable in pricing plans.\n\nDefaults to a single monthly interval `['month']`.\n\nTo add support for annual pricing plans, for example, you can use:\n`['month', 'year']`.\n\nNote that for every pricing interval, you must define a corresponding set\nof PricingPlans in the `pricingPlans` array. If you only have one pricing\ninterval (like the default `month` interval), `pricingPlans` don't need to\nspecify their `interval` property. Otherwise, all PricingPlans must\nspecify their `interval` property to differentiate between different\npricing intervals.\n\n</ResponseField>\n\n<ResponseField name='defaultRateLimit' type='object'>\nOptional default rate limits to enforce across all pricing plans.\n\nIf not set, a default platform rate-limit of 1000 requests per minute per customer will be used.\n\nTo disable the default rate-limit, set `defaultRateLimit.enabled` to\n`false`.\n\nNote that pricing-plan-specific rate-limits override this default (via\n`pricingPlans`), and tool-specific rate-limits may override both default\nand pricing-plan-specific rate-limits (via `toolConfigs`).\n\nSee [Rate Limits](/publishing/config/rate-limits) for more details.\n\n</ResponseField>\n\n<ResponseField name='toolConfigs' type='array'>\nOptional list of tool configs to override the default behavior of specific tools.\n\nSee [Tool Config](/publishing/config/tool-config) for details.\n\n</ResponseField>\n\n## Examples\n\n<Card\n  title='Config Examples'\n  href='/publishing/config/examples'\n  icon='file-lines'\n>\n  Example starter configs for the Agentic MCP Gateway.\n</Card>\n\n## Help\n\n<Tip>\n  Configuring your project can feel a little overwhelming. Feel free to [reach\n  out to us](/contact) if you're considering using Agentic's MCP Gateway, and\n  I'd be happy to help walk you through setting your product up for success.\n</Tip>\n"
  },
  {
    "path": "docs/publishing/config/pricing.mdx",
    "content": "---\ntitle: Pricing\ndescription: Configure pricing for your product.\n---\n\nCharge for your Agentic product with a flexible, declarative pricing model built on top of [Stripe](https://stripe.com)'s subscription billing.\n\nAgentic supports almost any combination of **fixed** and **usage-based billing** billing models, both at the MCP level, at the tool-call level, and at the custom metric level (e.g., tokens, image transformations, etc).\n\n<Tip>\n  Pricing can feel a little complicated to set up. Feel free to [reach out to\n  us](/contact) once you're ready to start charging for your product, and I'd be\n  happy to help you set everything up.\n</Tip>\n\n## Pricing Plan\n\n<ResponseField name=\"name\" type=\"string\" required>\nDisplay name for the pricing plan.\n\nExamples: \"Free\", \"Starter Monthly\", \"Pro Annual\", etc.\n\n</ResponseField>\n\n<ResponseField name='slug' type='string' required>\nA unique slug for the pricing plan which acts as a stable identifier across deployments.\n\nShould be lower-kebab-cased.\nShould be stable across deployments.\n\nFor all plans aside from `free`, the `slug` should include the `interval`\nas a suffix so pricing plans can be uniquely differentiated from each\nother across billing intervals.\n\nExamples: `free`, `starter-monthly`, `pro-annual`, etc.\n\n</ResponseField>\n\n<ResponseField name='interval' type='string' default='month'>\nThe frequency at which this subscription is billed.\n\nOne of `day`, `week`, `month`, or `year`.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-recurring-interval)\n\n</ResponseField>\n\n<ResponseField name='description' type='string'>\n  Optional description of the pricing plan (UI-only).\n</ResponseField>\n\n<ResponseField name='features' type='array'>\n  Optional list of features of the pricing plan (UI-only; array of strings).\n</ResponseField>\n\n<ResponseField name='trialPeriodDays' type='number'>\n  Optional number of days for a free trial period when a customer signs up for a\n  new subscription.\n\n[Stripe docs](https://docs.stripe.com/api/subscriptions/create?api-version=2025-06-30#create_subscription-trial_period_days)\n\n</ResponseField>\n\n<ResponseField name='rateLimit' type='object'>\nOptional rate limit to enforce for customers on this pricing plan.\n\nYou can use this to limit the number of API requests that can be made by\na customer during a given interval.\n\nIf not set, the pricing plan will inherit the default platform rate-limit\nset by `defaultRateLimit` in the Agentic project config.\n\nYou can disable rate-limiting for this pricing plan by setting\n`rateLimit.enabled` to `false`.\n\nSee [Rate Limits](/publishing/config/rate-limits) for more details.\n\n</ResponseField>\n\n<ResponseField name='lineItems' type='array' required>\nList of LineItems which are included in the PricingPlan.\n\nNote: Agentic currently supports a max of 20 LineItems per pricing plan.\n\nSee [PricingPlanLineItem](#pricing-plan-line-item) for details.\n\n</ResponseField>\n\n## Pricing Plan Line Item\n\nEach Pricing Plan Line Item corresponds to one [Stripe Product](https://docs.stripe.com/api/products/object?api-version=2025-06-30), one [Stripe Price](https://docs.stripe.com/api/prices/object?api-version=2025-06-30), and possibly one [Stripe Meter](https://docs.stripe.com/api/billing/meter/object?api-version=2025-06-30) if the line-item is `metered`.\n\n<ResponseField name='slug' type='string' required>\nSlugs act as the primary key for LineItems. They should be lower-cased and\nkebab-cased (\"base\", \"requests\", \"image-transformations\").\n\nThe `base` slug is reserved for a plan's default `licensed` line-item.\n\nThe `requests` slug is reserved for charging using `metered` billing based\non the number of request made during a given billing interval.\n\nAll other PricingPlanLineItem `slugs` are considered custom LineItems.\n\nShould be stable across deployments, so if a slug refers to one type of\nproduct / line-item / metric in one deployment, it should refer to the same\nproduct / line-item / metric in future deployments, even if they are\nconfigured differently. If you are switching between a licensed and metered\nline-item across deployments, they must use different slugs.\n\n</ResponseField>\n\n<ResponseField name='label' type='string'>\nOptional label for the line-item which will be displayed on customer bills.\n\nIf unset, the line-item's `slug` will be used as the label.\n\n[Stripe Docs](https://docs.stripe.com/api/products/object?api-version=2025-02-24.acacia#product_object-unit_label)\n\n</ResponseField>\n\n<ResponseField name='usageType' type='string' required>\n  The type of usage to charge for. Either `licensed` or `metered`.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-recurring-usage_type)\n\n</ResponseField>\n\n<Tabs>\n<Tab title=\"Licensed Line Item\">\nLicensed line-items are used to charge for **fixed-price services**.\n\n<ResponseField name='usageType' type='string' required>\n  The type of usage to charge for. `licensed` in this case.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-recurring-usage_type)\n\n</ResponseField>\n\n<ResponseField name='amount' type='number' required>\nThe fixed amount to charge per billing interval.\n\nSpecified in the smallest currency unit (e.g. cents for USD).\n\nSo 100 = \\$1.00 USD, 1000 = \\$10.00 USD, etc.\n\n[Stripe docs](https://docs.stripe.com/api/prices/create?api-version=2025-06-30#create_price-unit_amount)\n\n</ResponseField>\n</Tab>\n\n<Tab title=\"Metered Line Item\">\nMetered line-items are used to charge for **usage-based services**.\n\n<ResponseField name='usageType' type='string' required>\n  The type of usage to charge for. `metered` in this case.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-recurring-usage_type)\n\n</ResponseField>\n\n<ResponseField name='unitLabel' type='string'>\nOptional label for the line-item which will be displayed on customer bills.\n\nIf unset, the line-item's `slug` will be used as the unit label.\n\n[Stripe Docs](https://docs.stripe.com/api/products/object?api-version=2025-02-24.acacia#product_object-unit_label)\n\n</ResponseField>\n\n<ResponseField name='billingScheme' type='string' required>\nDescribes how to compute the price per period. Either `per_unit` or `tiered`.\n\n`per_unit` indicates that the fixed amount (specified in `unitAmount`) will be charged per unit of total usage.\n\n`tiered` indicates that the unit pricing will be computed using a tiering strategy as defined using `tiers` and `tiersMode`.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-billing_scheme)\n\n</ResponseField>\n\n<ResponseField name='unitAmount' type='number' required>\nThe fixed amount to charge per unit of usage.\n\nOnly applicable for `per_unit` billing schemes.\n\nSpecified in the smallest currency unit (e.g. cents for USD).\n\nSo 100 = \\$1.00 USD, 1000 = \\$10.00 USD, etc.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-unit_amount)\n\n</ResponseField>\n\n<ResponseField name='tiersMode' type='string'>\nDefines if the tiering price should be `graduated` or `volume` based.\n\nIn `volume`-based tiering, the maximum quantity within a period\ndetermines the per unit price.\n\nIn `graduated`-based tiering, the per-unit price changes successively\nas the quantity grows.\n\nThis field requires `billingScheme` to be set to `tiered`.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-tiers_mode)\n\n</ResponseField>\n\n<ResponseField name='tiers' type='array'>\nPricing tiers for `tiered` billing schemes.\n\nThis field requires `billingScheme` to be set to `tiered`.\n\nOne of `unitAmount` or `flatAmount` must be provided, but not both.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-tiers)\n\n<Expandable title=\"properties\">\n<ResponseField name='upTo' type='number' required>\n  The maximum quantity of usage for this tier.\n\nShould be a number or `inf` for the maximum tier.\n\n</ResponseField>\n\n<ResponseField name='unitAmount' type='number'>\nThe fixed amount to charge per unit of usage for this pricing tier.\n\nSpecified in the smallest currency unit (e.g. cents for USD).\n\nSo 100 = \\$1.00 USD, 1000 = \\$10.00 USD, etc.\n\n</ResponseField>\n\n<ResponseField name='flatAmount' type='number'>\nThe fixed amount to charge per billing interval for this pricing tier.\n\nSpecified in the smallest currency unit (e.g. cents for USD).\n\nSo 100 = \\$1.00 USD, 1000 = \\$10.00 USD, etc.\n\n</ResponseField>\n\n</Expandable>\n\n</ResponseField>\n\n<ResponseField name='defaultAggregation' type='object' default=\"{ formula: 'sum' }\">\nSpecifies how events are aggregated for the Stripe Meter.\n\n[Stripe docs](https://docs.stripe.com/api/billing/meter/create?api-version=2025-02-24.acacia#create_billing_meter-default_aggregation)\n\n<Expandable title=\"properties\">\n<ResponseField name='formula' type='string' default='sum' required>\nSpecifies how events are aggregated for a Stripe Meter.\n\nAllowed values:\n\n- `sum` - Sum each event's value during the period.\n- `count` - Count the number of events during the period.\n\nIf not set, `sum` will be used.\n\n  </ResponseField>\n\n</Expandable>\n\n</ResponseField>\n\n<ResponseField name='transformQuantity' type='object'>\nOptional transformation to apply to the reported usage or set quantity before computing the amount billed.\n\nCannot be combined with `tiers`.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-transform_quantity)\n\n<Expandable title=\"properties\">\n<ResponseField name='divideBy' type='number' required>\nDivide usage by this number.\n\nMust be a positive number.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-transform_quantity-divide_by)\n\n</ResponseField>\n\n<ResponseField name='round' type='string' required>\nAfter division, either round the result `up` or `down`.\n\n[Stripe docs](https://docs.stripe.com/api/prices/object?api-version=2025-02-24.acacia#price_object-transform_quantity-round)\n\n</ResponseField>\n\n</Expandable>\n\n</ResponseField>\n\n</Tab>\n\n</Tabs>\n\n## Example Pricing Plans\n\n<Tabs>\n<Tab title=\"Default Free Plan\">\n\nThis example shows a free monthly pricing plan which is used by default for projects that don't specify any pricing plans.\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  // ...\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ]\n    }\n  ]\n})\n```\n\n</Tab>\n\n<Tab title=\"Freemium + $4.99 Basic Plan\">\n\nThis example has 2 pricing plans, the default free plan and a fixed-price $4.99 / month basic plan with a 7-day trial.\n\n```ts agentic.config.ts\nimport { defaultFreePricingPlan, defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  // ...\n  pricingPlans: [\n    defaultFreePricingPlan,\n    {\n      name: 'Basic',\n      slug: 'basic',\n      trialPeriodDays: 7,\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 499 // $4.99 USD\n        }\n      ]\n    }\n  ]\n})\n```\n\n</Tab>\n\n<Tab title=\"Pay-As-You-Go\">\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  // ...\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ],\n      // Free but limited to 20 requests per day\n      rateLimit: {\n        limit: 20,\n        interval: '1d'\n      }\n    },\n    {\n      name: 'Pay-As-You-Go',\n      slug: 'pay-as-you-go',\n      lineItems: [\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'tiered',\n          tiersMode: 'volume',\n          // $0.00467 USD per request up to 999 requests per month\n          // then $0.00053 USD for unlimited further requests that month\n          tiers: [\n            {\n              upTo: 999,\n              unitAmount: 0.467\n            },\n            {\n              upTo: 'inf',\n              unitAmount: 0.053\n            }\n          ]\n        }\n      ],\n      // Limit to 1000 requests per day\n      rateLimit: {\n        limit: 1000,\n        interval: '1d'\n      }\n    }\n  ]\n})\n```\n\n</Tab>\n\n</Tabs>\n\n## Declarative Pricing\n\n<Info>\n  Agentic takes care of creating and managing all Stripe resources for you based\n  on your project's simple declarative JSON-based pricing config.\n\nEvery time you make a chance to your project's pricing and create a new deployment, Agentic will lazily upsert any related Stripe resources (products, prices, meters, subscriptions, customers, etc).\n\nIf a particular Stripe resource hasn't changed between deployments, Agentic will continue using the existing Stripe resources, which is important for customers who may have signed up for subscriptions before you made a change to your pricing.\n\n</Info>\n\n## Pricing Help\n\n<Tip>\n  Pricing can feel a little complicated to set up. Feel free to [reach out to\n  us](/contact) once you're ready to start charging for your product, and I'd be\n  happy to help you set everything up.\n</Tip>\n"
  },
  {
    "path": "docs/publishing/config/rate-limits.mdx",
    "content": "---\ntitle: Rate Limits\ndescription: Configure rate-limits for your project.\n---\n\nAgentic's durable rate-limiting is built on top of Cloudflare's global infrastructure. Customize the default rate-limits, change them based on a customer's pricing plan, or create custom tool-specific overrides.\n\n## Rate Limit\n\n<ResponseField name='enabled' type='boolean' required>\n  Whether or not this rate limit is enabled.\n</ResponseField>\n\n<ResponseField name=\"interval\" type=\"string\" required>\n  The interval at which the rate limit is applied.\n\nEither a positive integer expressed in seconds or a valid positive [ms](https://github.com/vercel/ms) string (eg, `10s`, `1m`, `8h`, `2d`, `1w`, `1y`, etc).\n\n</ResponseField>\n\n<ResponseField name='limit' type='number' required>\n  The maximum number of API requests per interval (unitless).\n</ResponseField>\n\n<ResponseField name=\"mode\" type=\"string\" default=\"approximate\">\n  How to enforce the rate limit: `strict` (more precise but slower) or `approximate` (the default; faster and asynchronous but less precise).\n\nThe default rate-limiting mode is `approximate`, which means that requests\nare allowed to proceed immediately, with the limit being enforced\nasynchronously in the background. This is faster than `strict` mode, but it is less consistent if precise adherence to rate-limits is required.\n\nWith `strict` mode, customer requests are blocked until the current limit has\nbeen confirmed. The downside with this approach is that it introduces\nmore latency to every request by default. The advantage is that it is\nmore precise and consistent.\n\n</ResponseField>\n\n## Example Rate Limits\n\n<Tabs>\n<Tab title=\"Default\">\n\nThe default platform rate limit for `requests` is a limit of 1000 requests per minute per customer.\n\n```ts\n{\n  enabled: true,\n  interval: '1m',\n  limit: 1000\n}\n```\n\n</Tab>\n\n<Tab title=\"Strict daily\">\n\nThis example rate limit restricts customers to 100 requests per day. It uses `strict` mode which adds a little extra latency but guarantees that customers will never exceed the limit.\n\n```ts\n{\n  enabled: true,\n  interval: '1d',\n  limit: 100,\n  mode: 'strict'\n}\n```\n\n</Tab>\n\n<Tab title=\"Disabled\">\n\nThis is an example of a disabled rate limit.\n\n```ts\n{\n  enabled: false\n}\n```\n\n</Tab>\n\n</Tabs>\n"
  },
  {
    "path": "docs/publishing/config/tool-config.mdx",
    "content": "---\ntitle: Tool Config\ndescription: Configure tool-specific settings for your project.\n---\n\n`toolConfigs` is an optional array of tool configs which may be used to override the default gateway behavior for specific tools.\n\nWith `toolConfigs`, tools can be disabled, set custom rate-limits, customize reporting usage for metered billing, and they can also override behavior for different pricing plans.\n\nFor example, you may want to disable certain tools on a `free` pricing plan or remove the rate-limit for a specific tool on a `pro` pricing plan while keeping the defualt rate-limit in place for other tools.\n\nNote that tool-specific configs override the defaults defined in pricing plans.\n\nIf a tool is defined on the origin server but not specified in `toolConfigs`, it will use the default behavior of the Agentic MCP gateway.\n\n## Tool Config\n\n<ResponseField name='name' type='string' required>\n  The name of the tool, which acts as a unique, stable identifier for the tool\n  across deployments.\n\nMake sure the tool `name` matches the origin server's tool names, either via its MCP server or OpenAPI operationIds.\n\n</ResponseField>\n\n<ResponseField name='enabled' type='boolean' default='true'>\nWhether this tool should be enabled for all customers (default).\n\nIf you want to hide a tool from customers but still have it present on your origin server, set this to `false` for the given tool.\n\n</ResponseField>\n\n<ResponseField name='pure' type='boolean' default='false'>\nWhether this tool's output is deterministic and idempotent given the same input.\n\nIf `true`, tool outputs will be cached aggressively for identical requests, though origin server response headers can still override this behavior on a per-request basis.\n\nIf `false`, tool outputs will be cached according to the origin server's response headers on a per-request basis.\n\n</ResponseField>\n\n<ResponseField name='cacheControl' type='string'>\nA custom `Cache-Control` header to use for caching this tool's responses.\n\nIf set, this field overrides `pure`.\n\nIf not set and `pure` is `true`, the gateway will default to: `public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600` (cache publicly for up to 1 year).\n\nIf not set and `pure` is `false`, the gateway will default to `no-store` which will disable caching. This is the default gateway behavior for tools (no caching).\n\nNote that origin server response headers may also choose to disable caching on a per-request basis.\n\n</ResponseField>\n\n<ResponseField name='reportUsage' type='boolean' default='true'>\nWhether calls to this tool should be reported as usage for the default `requests` line-item's metered billing.\n\nNote: This is only relevant if the customer's active pricing plan includes a `requests` line-item.\n\n</ResponseField>\n\n<ResponseField name='rateLimit' type='object'>\nCustomize the default `requests`-based rate-limiting for this tool.\n\nTo disable rate-limiting for this tool, set `rateLimit.enabled` to `false`.\n\nIf not set, the default rate-limiting for the active pricing plan will be used.\n\nSee [Rate Limits](/publishing/config/rate-limits) for details.\n\n</ResponseField>\n\n<ResponseField name='inputSchemaAdditionalProperties' type='boolean'>\nWhether to allow additional properties in the tool's input schema.\n\nThe default MCP spec allows additional properties. Set this to `false` if you want your tool to be more strict.\n\nNote: This is only relevant if the tool has defined an `inputSchema`.\n\n</ResponseField>\n\n<ResponseField name='outputSchemaAdditionalProperties' type='boolean'>\nWhether to allow additional properties in the tool's output schema.\n\nThe default MCP spec allows additional properties. Set this to `false` if you want your tool to be more strict.\n\nNote: This is only relevant if the tool has defined an `outputSchema`.\n\n</ResponseField>\n\n<ResponseField name='pricingPlanOverrides' type='object'>\nAllows you to override this tool's behavior or disable it entirely for different pricing plans.\n\nThis is a map from PricingPlan `slug` to PricingPlanToolOverride.\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\n// In this example, `my-tool` is disabled for the `free` pricing plan.\nexport default defineConfig({\n  // ...\n  toolConfigs: [\n    {\n      name: 'my-tool',\n      pricingPlanOverridesMap: {\n        free: {\n          enabled: false\n        }\n      }\n    }\n  ]\n})\n```\n\n<Expandable title=\"PricingPlanToolOverride\">\n  <ResponseField name='enabled' type='boolean'>\n    Whether this tool should be enabled for the given pricing plan.\n\n    If `undefined`, will use the tool's default enabled state.\n\n  </ResponseField>\n\n  <ResponseField name='reportUsage' type='boolean'>\n    Whether to report default `requests` usage for metered billing for customers on a given pricing plan.\n\n    Note: This is only relevant if the pricing plan includes a `requests` line-item.\n\n    If `undefined`, will use the tool's default reportUsage state.\n\n  </ResponseField>\n\n  <ResponseField name='rateLimit' type='object'>\nCustomize or disable rate limits for this tool for customers on a given pricing plan.\n\nTo disable rate-limiting for this tool on a given pricing plan, set `rateLimit.enabled` to `false`.\n\nSee [Rate Limits](/publishing/config/rate-limits) for details.\n\n  </ResponseField>\n\n</Expandable>\n\n</ResponseField>\n\n## Config Help\n\n<Tip>\n  Configuring your project can feel a little overwhelming with the amount of\n  options available. Feel free to [reach out to us](/contact) if you're\n  considering using Agentic's MCP Gateway, and I'd be happy to help walk you\n  through setting your product up for success.\n</Tip>\n"
  },
  {
    "path": "docs/publishing/guides/existing-mcp-server.mdx",
    "content": "---\ntitle: Existing MCP Server\ndescription: This guide will show you how to publish an existing MCP server to Agentic.\n---\n\n<Info>\n  **Prerequisite**: Please install [Node.js](https://nodejs.org) before\n  proceeding.\n</Info>\n\n## 1. Install the Agentic CLI\n\n<CodeGroup>\n\n```bash npm\nnpm i -g @agentic/cli\n```\n\n```bash pnpm\npnpm i -g @agentic/cli\n```\n\n```bash bun\nbun install -g @agentic/cli\n```\n\n```bash yarn\nyarn global add @agentic/cli\n```\n\n</CodeGroup>\n\n## 2. Log in or create an account\n\n<Tabs>\n<Tab title=\"GitHub\">\n\nThe `agentic` CLI defaults to using GitHub for authentication.\n\n```bash\nagentic login\n```\n\n</Tab>\n\n<Tab title=\"Username & password\">\n```bash\nagentic login -e <email> -p <password>\n# or\nagentic signup -e <email> -p <password> -u <username>\n```\n</Tab>\n\n</Tabs>\n\n## 3. Add an Agentic config to your project\n\n<Info>\n  Make sure your remote MCP server is deployed to a publicly accessible `https`\n  URL and that the URL supports the Streamable HTTP transport.\n</Info>\n\nYour agentic config either be an `agentic.config.ts` file or an `agentic.config.json` file. The advantage of using a `ts` file is that you get full autocomplete and type safety.\n\n<Tabs>\n<Tab title=\"TypeScript\">\n\nFirst, install the `@agentic/platform` package as a dev dependency.\n\n<CodeGroup>\n\n```bash npm\nnpm i -save-dev @agentic/platform\n```\n\n```bash pnpm\npnpm add -D @agentic/platform\n```\n\n```bash bun\nbun add -d @agentic/platform\n```\n\n</CodeGroup>\n\nThis package exports a `defineConfig` function which makes your config fully-typed and adds nice autocomplete.\n\nNow, create an `agentic.config.ts` file in the root of your project's source.\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: '<Your Project Name>',\n  description: '<A brief description of your project>',\n  origin: {\n    type: 'mcp',\n    url: '<Your Remote MCP Server URL>'\n  }\n})\n```\n\n</Tab>\n\n<Tab title=\"JSON\">\n\nCreate an `agentic.config.json` file in the root of your project's source.\n\n```json agentic.config.json\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"<Your Project Name>\",\n  \"description\": \"<Your Project Description>\",\n  \"origin\": {\n    \"type\": \"mcp\",\n    \"url\": \"<Your Remote MCP Server URL>\"\n  }\n}\n```\n\n</Tab>\n\n</Tabs>\n\n## 4. Deploy your project\n\nFrom the directory where your `agentic.config.ts` or `agentic.config.json` file is located, run:\n\n```bash\nagentic deploy\n```\n\nEvery time you make a change to your project, you can run `agentic deploy` which will create a new immutable preview deployment. These deployments will not affect any published products you may have until you publish them by running `agentic publish`.\n\n<Info>\n  You'll soon be able to configure a GitHub repository to automatically deploy\n  your project on changes. Please [let me know](/contact) if you'd like me to\n  prioritize this feature.\n</Info>\n\n<Note>\n  The returned deployment will not have any information about your origin\n  server, because the origin is considered hidden once deployed to Agentic's MCP\n  gateway.\n</Note>\n\n<Expandable title=\"example output\">\n\n```json\n{\n  \"id\": \"depl_kf4c3o8efh2y84dp5iwsha95\",\n  \"createdAt\": \"2025-06-28 05:38:34.960754+00\",\n  \"updatedAt\": \"2025-06-28 05:38:34.960754+00\",\n  \"identifier\": \"@dev/search@42ad78bf\",\n  \"hash\": \"42ad78bf\",\n  \"published\": false,\n  \"description\": \"Official Google Search tool. Useful for finding up-to-date news and information about any topic.\",\n  \"readme\": \"\",\n  \"userId\": \"user_bhlpuiioipxilpuq7xaoh1ae\",\n  \"projectId\": \"proj_rxs9jorlwolc3seq8enqgrgc\",\n  \"tools\": [\n    {\n      \"name\": \"search\",\n      \"description\": \"Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.\",\n      \"inputSchema\": {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"num\": {\n            \"type\": \"integer\",\n            \"default\": 5,\n            \"description\": \"Number of results to return\"\n          },\n          \"type\": {\n            \"enum\": [\n              \"search\",\n              \"images\",\n              \"videos\",\n              \"places\",\n              \"news\",\n              \"shopping\"\n            ],\n            \"type\": \"string\",\n            \"default\": \"search\",\n            \"description\": \"Type of Google search to perform\"\n          },\n          \"query\": {\n            \"type\": \"string\",\n            \"description\": \"Search query\"\n          }\n        },\n        \"required\": [\"query\"],\n        \"additionalProperties\": false\n      },\n      \"outputSchema\": {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"news\": {},\n          \"images\": {},\n          \"places\": {},\n          \"videos\": {},\n          \"results\": {},\n          \"shopping\": {},\n          \"answerBox\": {},\n          \"knowledgeGraph\": {}\n        },\n        \"additionalProperties\": false\n      }\n    }\n  ],\n  \"toolConfigs\": [\n    {\n      \"name\": \"search\",\n      \"cacheControl\": \"public, max-age=60, s-maxage=60 stale-while-revalidate=10\"\n    }\n  ],\n  \"pricingPlans\": [\n    {\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n      \"rateLimit\": {\n        \"interval\": 86400,\n        \"limit\": 10,\n        \"mode\": \"approximate\",\n        \"enabled\": true\n      },\n      \"lineItems\": [\n        {\n          \"slug\": \"requests\",\n          \"usageType\": \"metered\",\n          \"billingScheme\": \"per_unit\",\n          \"unitAmount\": 0\n        }\n      ]\n    },\n    {\n      \"name\": \"Standard\",\n      \"slug\": \"standard\",\n      \"interval\": \"month\",\n      \"rateLimit\": {\n        \"interval\": 1,\n        \"limit\": 100,\n        \"mode\": \"approximate\",\n        \"enabled\": true\n      },\n      \"lineItems\": [\n        {\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n          \"amount\": 1000\n        },\n        {\n          \"slug\": \"requests\",\n          \"usageType\": \"metered\",\n          \"billingScheme\": \"tiered\",\n          \"tiersMode\": \"volume\",\n          \"tiers\": [\n            {\n              \"unitAmount\": 0,\n              \"upTo\": 1000\n            },\n            {\n              \"unitAmount\": 0.01,\n              \"upTo\": 50000\n            },\n            {\n              \"unitAmount\": 0.008,\n              \"upTo\": 500000\n            },\n            {\n              \"unitAmount\": 0.006,\n              \"upTo\": 2500000\n            },\n            {\n              \"unitAmount\": 0.005,\n              \"upTo\": \"inf\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"pricingIntervals\": [\"month\"],\n  \"defaultRateLimit\": {\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n    \"enabled\": true\n  },\n  \"gatewayBaseUrl\": \"https://gateway.agentic.so/@dev/search@42ad78bf\",\n  \"gatewayMcpUrl\": \"https://gateway.agentic.so/@dev/search@42ad78bf/mcp\",\n  \"marketplaceUrl\": \"https://agentic.so/marketplace/projects/@dev/search\",\n  \"adminUrl\": \"https://agentic.so/app/projects/@dev/search/deployments/42ad78bf\"\n}\n```\n\n</Expandable>\n\n## 5. Test your deployment\n\nThe easiest way to test your deployment is to visit it in your Agentic admin dashboard. This will be the `adminUrl` in the returned deployment and should look like: `https://agentic.so/app/projects/<your-project-identifier>/deployments/<hash>`.\n\nThis page shows you all the tools available for your deployment and includes a GUI showing how to call them with various MCP clients, TS LLM SDKs, Python LLM SDKs, and simple HTTP.\n\n<Frame caption='Example of calling an Agentic tool'>\n  <img\n    src='/media/example-usage.png'\n    alt='Example of calling an Agentic tool'\n  />\n</Frame>\n\n<Expandable title=\"Example of calling a tool via HTTP\">\n\nThis example uses the [@agentic/search](https://agentic.so/marketplace/projects/@agentic/search) project's `search` tool. You'll need to replace the project identifier, tool name, and tool arguments with your own, but otherwise, calling your deployment's tools should be pretty straightforward.\n\n<Tabs>\n<Tab title=\"cURL\">\n\n```bash\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"query\": \"example google search\" }' https://gateway.agentic.com/mcp/search/search\n```\n\n</Tab>\n\n<Tab title=\"HTTPie\">\n\n```bash\nhttp https://gateway.agentic.com/mcp/search/search query='example google search'\n```\n\n</Tab>\n</Tabs>\n</Expandable>\n\n## 6. Publish your deployment\n\nPublishing your deployment will make it publicly available to all Agentic users. This will also enable other users to subscribe to your product using Stripe subscriptions.\n\n```bash\nagentic publish\n```\n\nThe CLI will prompt you to confirm a `semver` version.\n\nNow, your project will be available at `https://agentic.so/marketplace/projects/<your-project-identifier>`.\n\n**Upon publishing, your project will be a live, publicly available product**.\n\nYou can share your product's public URL with customers, and they'll be able to subscribe to your product via Stripe. You can visit your [dashboard](https://agentic.so/app) to track customer usage and revenue.\n\n<Tip>Congrats, you now have a live MCP product! 🎉</Tip>\n\n## 7. (Optional) Submit your product to the public Agentic Marketplace\n\n<Info>\n**Your published product will be live and publicly accessible, but it will not be discoverable on the Agentic Marketplace's main page or search by default.**\n\nI made this decision during the current beta in order to keep the Agentic Marketplace as high quality and curated as possible.\n\nIf you'd like to submit your product to Agentic's public MCP Marketplace, please\n[get in touch](/contact).\n\n</Info>\n"
  },
  {
    "path": "docs/publishing/guides/existing-openapi-service.mdx",
    "content": "---\ntitle: Existing OpenAPI Service\ndescription: This guide will show you how to publish an existing OpenAPI service to Agentic.\n---\n\n<Info>\n  **Prerequisite**: Please install [Node.js](https://nodejs.org) before\n  proceeding.\n</Info>\n\n## 1. Install the Agentic CLI\n\n<CodeGroup>\n\n```bash npm\nnpm i -g @agentic/cli\n```\n\n```bash pnpm\npnpm i -g @agentic/cli\n```\n\n```bash bun\nbun install -g @agentic/cli\n```\n\n```bash yarn\nyarn global add @agentic/cli\n```\n\n</CodeGroup>\n\n## 2. Log in or create an account\n\n<Tabs>\n<Tab title=\"GitHub\">\n\nThe `agentic` CLI defaults to using GitHub for authentication.\n\n```bash\nagentic login\n```\n\n</Tab>\n\n<Tab title=\"Username & password\">\n```bash\nagentic login -e <email> -p <password>\n# or\nagentic signup -e <email> -p <password> -u <username>\n```\n</Tab>\n\n</Tabs>\n\n## 3. Add an Agentic config to your project\n\n<Info>\n  Make sure your remote OpenAPI service is deployed to a publicly accessible\n  `https` URL, and that your OpenAPI spec is a valid 3.0 or 3.1 spec.\n</Info>\n\nYour agentic config either be an `agentic.config.ts` file or an `agentic.config.json` file. The advantage of using a `ts` file is that you get full autocomplete and type safety.\n\n<Tabs>\n<Tab title=\"TypeScript\">\n\nFirst, install the `@agentic/platform` package as a dev dependency.\n\n<CodeGroup>\n\n```bash npm\nnpm i -save-dev @agentic/platform\n```\n\n```bash pnpm\npnpm add -D @agentic/platform\n```\n\n```bash bun\nbun add -d @agentic/platform\n```\n\n</CodeGroup>\n\nThis package exports a `defineConfig` function which makes your config fully-typed and adds nice autocomplete.\n\nNow, create an `agentic.config.ts` file in the root of your project's source.\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: '<Your Project Name>',\n  description: '<A brief description of your project>',\n  origin: {\n    type: 'openapi',\n    url: '<Your Remote OpenAPI Server Base URL>',\n    spec: '<Local Path or Remote URL to your OpenAPI Spec>'\n  }\n})\n```\n\n</Tab>\n\n<Tab title=\"JSON\">\n\nCreate an `agentic.config.json` file in the root of your project's source.\n\n```json agentic.config.json\n{\n  \"$schema\": \"https://agentic.so/schema.json\",\n  \"name\": \"<Your Project Name>\",\n  \"description\": \"<Your Project Description>\",\n  \"origin\": {\n    \"type\": \"openapi\",\n    \"url\": \"<Your Remote OpenAPI Server Base URL>\",\n    \"spec\": \"<Local Path or Remote URL to your OpenAPI Spec>\"\n  }\n}\n```\n\n</Tab>\n\n</Tabs>\n\n## 4. Deploy your project\n\nFrom the directory where your `agentic.config.ts` or `agentic.config.json` file is located, run:\n\n```bash\nagentic deploy\n```\n\nEvery time you make a change to your project, you can run `agentic deploy` which will create a new immutable preview deployment. These deployments will not affect any published products you may have until you publish them by running `agentic publish`.\n\n<Info>\n  You'll soon be able to configure a GitHub repository to automatically deploy\n  your project on changes. Please [let me know](/contact) if you'd like me to\n  prioritize this feature.\n</Info>\n\n<Note>\n  The returned deployment will not have any information about your origin\n  server, because the origin is considered hidden once deployed to Agentic's MCP\n  gateway.\n</Note>\n\n<Expandable title=\"example output\">\n\n<Note>\n  The returned deployment will not have any information about your origin\n  server, because the origin is considered hidden once deployed to Agentic's MCP\n  gateway.\n</Note>\n\n```json\n{\n  \"id\": \"depl_kf4c3o8efh2y84dp5iwsha95\",\n  \"createdAt\": \"2025-06-28 05:38:34.960754+00\",\n  \"updatedAt\": \"2025-06-28 05:38:34.960754+00\",\n  \"identifier\": \"@dev/search@42ad78bf\",\n  \"hash\": \"42ad78bf\",\n  \"published\": false,\n  \"description\": \"Official Google Search tool. Useful for finding up-to-date news and information about any topic.\",\n  \"readme\": \"\",\n  \"userId\": \"user_bhlpuiioipxilpuq7xaoh1ae\",\n  \"projectId\": \"proj_rxs9jorlwolc3seq8enqgrgc\",\n  \"tools\": [\n    {\n      \"name\": \"search\",\n      \"description\": \"Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.\",\n      \"inputSchema\": {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"num\": {\n            \"type\": \"integer\",\n            \"default\": 5,\n            \"description\": \"Number of results to return\"\n          },\n          \"type\": {\n            \"enum\": [\n              \"search\",\n              \"images\",\n              \"videos\",\n              \"places\",\n              \"news\",\n              \"shopping\"\n            ],\n            \"type\": \"string\",\n            \"default\": \"search\",\n            \"description\": \"Type of Google search to perform\"\n          },\n          \"query\": {\n            \"type\": \"string\",\n            \"description\": \"Search query\"\n          }\n        },\n        \"required\": [\"query\"],\n        \"additionalProperties\": false\n      },\n      \"outputSchema\": {\n        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"news\": {},\n          \"images\": {},\n          \"places\": {},\n          \"videos\": {},\n          \"results\": {},\n          \"shopping\": {},\n          \"answerBox\": {},\n          \"knowledgeGraph\": {}\n        },\n        \"additionalProperties\": false\n      }\n    }\n  ],\n  \"toolConfigs\": [\n    {\n      \"name\": \"search\",\n      \"cacheControl\": \"public, max-age=60, s-maxage=60 stale-while-revalidate=10\"\n    }\n  ],\n  \"pricingPlans\": [\n    {\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n      \"rateLimit\": {\n        \"interval\": 86400,\n        \"limit\": 10,\n        \"mode\": \"approximate\",\n        \"enabled\": true\n      },\n      \"lineItems\": [\n        {\n          \"slug\": \"requests\",\n          \"usageType\": \"metered\",\n          \"billingScheme\": \"per_unit\",\n          \"unitAmount\": 0\n        }\n      ]\n    },\n    {\n      \"name\": \"Standard\",\n      \"slug\": \"standard\",\n      \"interval\": \"month\",\n      \"rateLimit\": {\n        \"interval\": 1,\n        \"limit\": 100,\n        \"mode\": \"approximate\",\n        \"enabled\": true\n      },\n      \"lineItems\": [\n        {\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n          \"amount\": 1000\n        },\n        {\n          \"slug\": \"requests\",\n          \"usageType\": \"metered\",\n          \"billingScheme\": \"tiered\",\n          \"tiersMode\": \"volume\",\n          \"tiers\": [\n            {\n              \"unitAmount\": 0,\n              \"upTo\": 1000\n            },\n            {\n              \"unitAmount\": 0.01,\n              \"upTo\": 50000\n            },\n            {\n              \"unitAmount\": 0.008,\n              \"upTo\": 500000\n            },\n            {\n              \"unitAmount\": 0.006,\n              \"upTo\": 2500000\n            },\n            {\n              \"unitAmount\": 0.005,\n              \"upTo\": \"inf\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"pricingIntervals\": [\"month\"],\n  \"defaultRateLimit\": {\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n    \"enabled\": true\n  },\n  \"gatewayBaseUrl\": \"https://gateway.agentic.so/@dev/search@42ad78bf\",\n  \"gatewayMcpUrl\": \"https://gateway.agentic.so/@dev/search@42ad78bf/mcp\",\n  \"marketplaceUrl\": \"https://agentic.so/marketplace/projects/@dev/search\",\n  \"adminUrl\": \"https://agentic.so/app/projects/@dev/search/deployments/42ad78bf\"\n}\n```\n\n</Expandable>\n\n## 5. Test your deployment\n\nThe easiest way to test your deployment is to visit it in your Agentic admin dashboard. This will be the `adminUrl` in the returned deployment and should look like: `https://agentic.so/app/projects/<your-project-identifier>/deployments/<hash>`.\n\nThis page shows you all the tools available for your deployment and includes a GUI showing how to call them with various MCP clients, TS LLM SDKs, Python LLM SDKs, and simple HTTP.\n\n<Frame caption='Example of calling an Agentic tool'>\n  <img\n    src='/media/example-usage.png'\n    alt='Example of calling an Agentic tool'\n  />\n</Frame>\n\n<Expandable title=\"Example of calling a tool via HTTP\">\n\nThis example uses the [@agentic/search](https://agentic.so/marketplace/projects/@agentic/search) project's `search` tool. You'll need to replace the project identifier, tool name, and tool arguments with your own, but otherwise, calling your deployment's tools should be pretty straightforward.\n\n<Tabs>\n<Tab title=\"cURL\">\n\n```bash\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"query\": \"example google search\" }' https://gateway.agentic.com/mcp/search/search\n```\n\n</Tab>\n\n<Tab title=\"HTTPie\">\n\n```bash\nhttp https://gateway.agentic.com/mcp/search/search query='example google search'\n```\n\n</Tab>\n</Tabs>\n</Expandable>\n\n## 6. Publish your deployment\n\nPublishing your deployment will make it publicly available to all Agentic users. This will also enable other users to subscribe to your product using Stripe subscriptions.\n\n```bash\nagentic publish\n```\n\nThe CLI will prompt you to confirm a `semver` version.\n\nNow, your project will be available at `https://agentic.so/marketplace/projects/<your-project-identifier>`.\n\n**Upon publishing, your project will be a live, publicly available product**.\n\nYou can share your product's public URL with customers, and they'll be able to subscribe to your product via Stripe. You can visit your [dashboard](https://agentic.so/app) to track customer usage and revenue.\n\n<Tip>Congrats, you now have a live MCP product! 🎉</Tip>\n\n## 7. (Optional) Submit your product to the public Agentic Marketplace\n\n<Info>\n**Your published product will be live and publicly accessible, but it will not be discoverable on the Agentic Marketplace's main page or search by default.**\n\nI made this decision during the current beta in order to keep the Agentic Marketplace as high quality and curated as possible.\n\nIf you'd like to submit your product to Agentic's public MCP Marketplace, please\n[get in touch](/contact).\n\n</Info>\n"
  },
  {
    "path": "docs/publishing/guides/py-fastmcp.mdx",
    "content": "---\ntitle: Python FastMCP\ndescription: This guide will show you how to publish an MCP server to Agentic using the Python fastmcp package.\n---\n\n[Python's FastMCP](https://gofastmcp.com) is a popular [open source](https://github.com/jlowin/fastmcp) MCP server framework for Python.\n\n## 1. Install the `fastmcp` package\n\n<Info>\n  **Prerequisite**: Please install [Python](https://www.python.org) before\n  proceeding.\n</Info>\n\n<CodeGroup>\n\n```bash uv\nuv add fastmcp\n```\n\n```bash pip\npip install fastmcp\n```\n\n</CodeGroup>\n\n## 2. Create a FastMCP server\n\n```py server.py\nfrom fastmcp import FastMCP\n\nmcp = FastMCP(\"Demo 🚀\")\n\n@mcp.tool\ndef add(a: int, b: int) -> int:\n    \"\"\"Add two numbers\"\"\"\n    return a + b\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"http\", host=\"127.0.0.1\", port=8000, path=\"/mcp\")\n```\n\n<Note>\n  Make sure to run your server with the `transport=\"http\"` option to use the\n  Streamable HTTP transport.\n</Note>\n\n## 3. Deploy your MCP server remotely\n\nDeploy your server publicly or use a tool like [ngrok](https://ngrok.com) to expose it to the internet.\n\n<Warning>\n  Tools like `ngrok` expose your unauthenticated server to the internet. Only\n  run this command in a safe environment if you understand the risks.\n</Warning>\n\nWe recommend deploying your server to a cloud provider like [render](https://render.com/docs/deploy-fastapi), [platform.sh](https://docs.platform.sh/languages/python.html), [porter](https://docs.porter.run/guides/fastapi/deploy-fastapi), or [fly.io](https://fly.io/docs/python/frameworks/fastapi/). Or one of the big boys [AWS](https://aws.amazon.com), [GCP](https://cloud.google.com), or [Azure](https://azure.microsoft.com).\n\n## 4. Deploy your origin MCP server to Agentic\n\nNow that you have a publicly available MCP server, you can follow the [existing MCP server guide](/publishing/guides/existing-mcp-server) to deploy it to Agentic.\n"
  },
  {
    "path": "docs/publishing/guides/ts-fastmcp.mdx",
    "content": "---\ntitle: TypeScript FastMCP\ndescription: This guide will show you how to publish an MCP server to Agentic using the TypeScript FastMCP package.\n---\n\n[FastMCP](https://github.com/punkpeye/fastmcp) is a popular open source TypeScript framework for building MCP servers.\n\n## 1. Install dependencies\n\n<Info>\n  **Prerequisite**: Please install [Node.js](https://nodejs.org) before\n  proceeding.\n</Info>\n\n<CodeGroup>\n\n```bash npm\nnpm add fastmcp zod\n```\n\n```bash pnpm\npnpm add fastmcp zod\n```\n\n```bash bun\nbun add fastmcp zod\n```\n\n```bash yarn\nyarn add fastmcp zod\n```\n\n</CodeGroup>\n\n## 2. Create a FastMCP server\n\n```ts server.ts\nimport { FastMCP } from 'fastmcp'\nimport { z } from 'zod' // Or any validation library that supports Standard Schema\n\nconst server = new FastMCP({\n  name: 'Example',\n  version: '0.0.1'\n})\n\nserver.addTool({\n  name: 'add',\n  description: 'Add two numbers',\n  parameters: z.object({\n    a: z.number(),\n    b: z.number()\n  }),\n  execute: async (args) => {\n    return String(args.a + args.b)\n  }\n})\n\nserver.start({\n  transportType: 'httpStream',\n  httpStream: {\n    port: 8080\n  }\n})\n```\n\n<Note>\n  Make sure to run your server with the `transportType: 'httpStream'` option to\n  use the Streamable HTTP transport.\n</Note>\n\n## 3. Deploy your MCP server remotely\n\nDeploy your server publicly or use a tool like [ngrok](https://ngrok.com) to expose it to the internet.\n\n<Warning>\n  Tools like `ngrok` expose your unauthenticated server to the internet. Only\n  run this command in a safe environment if you understand the risks.\n</Warning>\n\nWe recommend deploying your server to a cloud provider like [Cloudflare Workers](https://workers.cloudflare.com), [Vercel](https://vercel.com/guides/hosting-backend-apis) (for instance, using the [Hono](https://vercel.com/templates/hono/hono-on-vercel) API template), [Render](https://render.com/docs/deploy-fastapi), [Porter](https://docs.porter.run/guides/nodejs/deploy-nodejs), or [Fly.io](https://fly.io/docs/python/frameworks/fastapi/). Or one of the big boys [AWS](https://aws.amazon.com), [GCP](https://cloud.google.com), or [Azure](https://azure.microsoft.com).\n\n## 4. Deploy your origin MCP server to Agentic\n\nNow that you have a publicly available MCP server, you can follow the [existing MCP server guide](/publishing/guides/existing-mcp-server) to deploy it to Agentic.\n"
  },
  {
    "path": "docs/publishing/guides/ts-mcp-hono.mdx",
    "content": "---\ntitle: TypeScript Hono MCP\ndescription: This guide will show you how to publish an MCP server to Agentic using TypeScript and Hono's MCP support.\n---\n\n[Hono](https://hono.dev) is a popular open source TypeScript framework for building HTTP servers, and [`@hono/mcp`](https://github.com/honojs/middleware/tree/main/packages/mcp) is an excellent solution for exposing MCP servers.\n\n## 1. Install dependencies\n\n<Info>\n  **Prerequisite**: Please install [Node.js](https://nodejs.org) before\n  proceeding.\n</Info>\n\n<CodeGroup>\n\n```bash npm\nnpm add hono @hono/node-server @hono/mcp @modelcontextprotocol/sdk zod\n```\n\n```bash pnpm\npnpm add hono @hono/node-server @hono/mcp @modelcontextprotocol/sdk zod\n```\n\n```bash bun\nbun add hono @hono/node-server @hono/mcp @modelcontextprotocol/sdk zod\n```\n\n```bash yarn\nyarn add hono @hono/node-server @hono/mcp @modelcontextprotocol/sdk zod\n```\n\n</CodeGroup>\n\n## 2. Create a Hono MCP Node.js server\n\n```ts server.ts\nimport { StreamableHTTPTransport } from '@hono/mcp'\nimport { serve } from '@hono/node-server'\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { Hono } from 'hono'\nimport { logger } from 'hono/logger'\nimport { z } from 'zod'\n\nconst app = new Hono()\napp.use(logger())\n\nconst mcpServer = new McpServer({\n  name: 'Example',\n  version: '0.0.1'\n})\n\nmcpServer.registerTool(\n  'add',\n  {\n    description: 'Add two numbers',\n    inputSchema: z.object({\n      a: z.number(),\n      b: z.number()\n    })\n  },\n  async (args) => {\n    return {\n      content: [\n        {\n          type: 'text',\n          content: String(args.a + args.b)\n        }\n      ]\n    }\n  }\n)\n\napp.all('/mcp', async (c) => {\n  const transport = new StreamableHTTPTransport()\n  await mcpServer.connect(transport)\n  return transport.handleRequest(c)\n})\n\nserve({ fetch: app.fetch, port: 8787 })\n```\n\n<Tip>\n  Hono is really flexible, so if you'd rather deploy your server to Cloudflare\n  Workers instead of using Node.js (or any other platform), just follow [Hono's\n  docs](https://hono.dev/docs/getting-started/basic).\n</Tip>\n\n## 3. Deploy your MCP server remotely\n\nDeploy your server publicly or use a tool like [ngrok](https://ngrok.com) to expose it to the internet.\n\n<Warning>\n  Tools like `ngrok` expose your unauthenticated server to the internet. Only\n  run this command in a safe environment if you understand the risks.\n</Warning>\n\nWe recommend deploying your server to a cloud provider like [Cloudflare Workers](https://workers.cloudflare.com), [Vercel](https://vercel.com/guides/hosting-backend-apis) (for instance, using the [Hono](https://vercel.com/templates/hono/hono-on-vercel) API template), [Render](https://render.com/docs/deploy-fastapi), [Porter](https://docs.porter.run/guides/nodejs/deploy-nodejs), or [Fly.io](https://fly.io/docs/python/frameworks/fastapi/). Or one of the big boys [AWS](https://aws.amazon.com), [GCP](https://cloud.google.com), or [Azure](https://azure.microsoft.com).\n\n## 4. Deploy your origin MCP server to Agentic\n\nNow that you have a publicly available MCP server, you can follow the [existing MCP server guide](/publishing/guides/existing-mcp-server) to deploy it to Agentic.\n"
  },
  {
    "path": "docs/publishing/guides/ts-modelfetch.mdx",
    "content": "---\ntitle: TypeScript ModelFetch\ndescription: This guide will show you how to publish an MCP server to Agentic using ModelFetch.\n---\n\n[ModelFetch](https://www.modelfetch.com) is a delightful TypeScript/JavaScript SDK for building and deploying MCP servers anywhere TypeScript/JavaScript runs - Write your MCP server once and run it anywhere without vendor lock-in.\n\n## 1. Create a ModelFetch MCP server\n\n<Info>\n  **Prerequisite**: Please install [Node.js](https://nodejs.org) before\n  proceeding.\n</Info>\n\n```bash\nnpx -y create-modelfetch@latest\n```\n\nFollow the interactive prompts to:\n\n1. **Choose a runtime** - Node.js, Next.js, Bun, Deno, Vercel, Cloudflare, Netlify, Fastly, Supabase, Gcore, AWS Lambda, or Azure Functions\n2. **Select a language** - TypeScript or JavaScript\n3. **Pick a package manager** - npm, pnpm, bun, or yarn\n\nThen navigate to your project:\n\n```bash\ncd my-mcp-server\n```\n\n## 2. Implement your MCP server\n\nEdit the server file to add your MCP tools, resources, and prompts:\n\n```ts server.ts\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\n\nconst server = new McpServer({\n  title: 'My MCP Server',\n  name: 'my-mcp-server',\n  version: '1.0.0'\n})\n\nserver.registerTool(\n  'add',\n  {\n    title: 'Add Numbers',\n    description: 'Add two numbers together',\n    inputSchema: {\n      a: z.number(),\n      b: z.number()\n    }\n  },\n  ({ a, b }) => ({\n    content: [\n      {\n        type: 'text',\n        text: `${a} + ${b} = ${a + b}`\n      }\n    ]\n  })\n)\n\nexport default server\n```\n\n<Note>\n  [ModelFetch](https://www.modelfetch.com) uses the [official MCP TypeScript\n  SDK](https://github.com/modelcontextprotocol/typescript-sdk) and provides\n  runtime-specific handlers for different platforms.\n</Note>\n\n## 3. Deploy your MCP server remotely\n\nModelFetch supports multiple deployment targets. Deploy your server to any platforms that support these runtimes:\n\n- Node.js\n- Next.js\n- Bun\n- Deno\n- Vercel\n- Cloudflare\n- Netlify\n- Fastly\n- Supabase\n- Gcore\n- AWS Lambda\n- Azure Functions\n- etc.\n\nSee the [ModelFetch documentation](https://www.modelfetch.com/docs) for more details.\n\n<Warning>\n  For development, you can use [ngrok](https://ngrok.com) to temporarily expose\n  your local server. Only use this in a safe environment as it exposes your\n  server to the internet.\n</Warning>\n\n## 4. Deploy your origin MCP server to Agentic\n\nNow that you have a publicly available MCP server, you can follow the [existing MCP server guide](/publishing/guides/existing-mcp-server) to deploy it to Agentic.\n"
  },
  {
    "path": "docs/publishing/guides/ts-openapi-hono.mdx",
    "content": "---\ntitle: TypeScript Hono OpenAPI\ndescription: This guide will show you how to publish an OpenAPI service to Agentic using TypeScript and Hono's OpenAPI support.\n---\n\n[Hono](https://hono.dev) is a popular open source TypeScript framework for building HTTP servers, and [`@hono/zod-openapi`](https://hono.dev/examples/zod-openapi) is an excellent solution for creating an auto-generated OpenAPI spec from your Hono routes.\n\n## 1. Install dependencies\n\n<Info>\n  **Prerequisite**: Please install [Node.js](https://nodejs.org) before\n  proceeding.\n</Info>\n\n<CodeGroup>\n\n```bash npm\nnpm add hono @hono/node-server @hono/zod-openapi zod\n```\n\n```bash pnpm\npnpm add hono @hono/node-server @hono/zod-openapi zod\n```\n\n```bash bun\nbun add hono @hono/node-server @hono/zod-openapi zod\n```\n\n```bash yarn\nyarn add hono @hono/node-server @hono/zod-openapi zod\n```\n\n</CodeGroup>\n\n## 2. Create a Hono OpenAPI Node.js server\n\n```ts server.ts\nimport { serve } from '@hono/node-server'\nimport { createRoute, OpenAPIHono, z } from '@hono/zod-openapi'\nimport { logger } from 'hono/logger'\n\nconst app = new OpenAPIHono()\napp.use(logger())\n\nconst echoRoute = createRoute({\n  description: 'Echoes the request body',\n  // The OpenAPI `operationId` will be used as the tool name in Agentic\n  operationId: 'echo',\n  method: 'post',\n  path: '/echo',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nreturn app.openapi(echoRoute, async (c) => {\n  return c.json(c.req.valid('json'))\n})\n\napp.doc31('/docs', {\n  openapi: '3.1.0',\n  info: {\n    title: 'Example',\n    description: 'Example description',\n    version: '0.0.1'\n  }\n})\n\nserve({ fetch: app.fetch, port: 8787 })\n```\n\nNote that the auto-generated OpenAPI spec will be available at `/docs` in this example.\n\n<Tip>\n  Hono is really flexible, so if you'd rather deploy your server to Cloudflare\n  Workers instead of using Node.js (or any other platform), just follow [Hono's\n  docs](https://hono.dev/docs/getting-started/basic).\n</Tip>\n\n## 3. Deploy your OpenAPI server remotely\n\nDeploy your server publicly or use a tool like [ngrok](https://ngrok.com) to expose it to the internet.\n\n<Warning>\n  Tools like `ngrok` expose your unauthenticated server to the internet. Only\n  run this command in a safe environment if you understand the risks.\n</Warning>\n\nWe recommend deploying your server to a cloud provider like [Cloudflare Workers](https://workers.cloudflare.com), [Vercel](https://vercel.com/guides/hosting-backend-apis) (for instance, using the [Hono](https://vercel.com/templates/hono/hono-on-vercel) API template), [Render](https://render.com/docs/deploy-fastapi), [Porter](https://docs.porter.run/guides/nodejs/deploy-nodejs), or [Fly.io](https://fly.io/docs/python/frameworks/fastapi/). Or one of the big boys [AWS](https://aws.amazon.com), [GCP](https://cloud.google.com), or [Azure](https://azure.microsoft.com).\n\n## 4. Deploy your origin OpenAPI service to Agentic\n\nNow that you have a publicly available MCP server, you can follow the [existing OpenAPI server guide](/publishing/guides/existing-openapi-service) to deploy it to Agentic.\n"
  },
  {
    "path": "docs/publishing/guides/ts-xmcp.mdx",
    "content": "---\ntitle: TypeScript xmcp\ndescription: This guide will show you how to publish an MCP server to Agentic using the TypeScript xmcp package with Vercel hosting.\n---\n\n[xmcp](https://github.com/basementstudio/xmcp) is an excellent OSS TS framework for deploying MCP servers, with a familiar DX to Next.js and deployed to [Vercel](https://vercel.com).\n\n## 1. Create an xmcp server\n\n<Info>\n  **Prerequisite**: Please install [Node.js](https://nodejs.org) before\n  proceeding.\n</Info>\n\n```bash\nnpx create-xmcp-app@latest\n```\n\nFollow [xmcp's quickstart guide](https://xmcp.dev/docs#getting-started) for more details.\n\n<Note>\n  Make sure that the MCP server has the Streamable HTTP transport enabled (it's\n  enabled by default).\n</Note>\n\nYou should be able to run your MCP server locally with `xmcp dev` and see the\nMCP server running at `http://localhost:3002/mcp`.\n\n## 2. Deploy your MCP server remotely\n\nDeploy your MCP server publicly (we recommend Vercel for xmcp):\n\n```bash\nxmcp build --vercel\n```\n\n```bash\nvercel deploy --prod --prebuilt\n```\n\n## 4. Deploy your origin MCP server to Agentic\n\nNow that you have a publicly available MCP server, you can follow the [existing MCP server guide](/publishing/guides/existing-mcp-server) to deploy it to Agentic.\n"
  },
  {
    "path": "docs/publishing/index.mdx",
    "content": "---\ntitle: Publishing MCPs\ndescription: Your API → Paid MCP, Instantly.\n---\n\nRun one command to turn any MCP server or OpenAPI service into a paid MCP product. With built-in support for every major LLM SDK and MCP client.\n\nVisit the [Quick Start](/publishing/quickstart) to get started or read on for a quick overview.\n\n## How it works\n\n<Frame>\n  <img\n    src='https://agentic.so/agentic-mcp-gateway-mvp-diagram-light.png'\n    alt='MCP Gateway Demo'\n    className='w-full rounded-lg overflow-hidden'\n  />\n</Frame>\n\n<Steps>\n  <Step title='Create your MCP server or OpenAPI service'>\n    Your origin server represents your product's unique value prop.\n\n    It can be any remote MCP server or OpenAPI service. You can host your origin server anywhere, using any language or framework.\n\n  </Step>\n  <Step title=\"Publish your origin server to Agentic's MCP Gateway\">\n    Agentic's MCP Gateway acts as a public proxy between your origin\n    server and your customers.\n\n    It handles everything you'll need to start charging for your tools as a production-ready AI product. That includes auth, billing, rate-limiting, caching, usage tracking, versioning, etc. It also makes your tools instantly compatible with every major LLM SDK and MCP client.\n\n  </Step>\n  <Step title='Share your MCP product with the world! 🎉'>\n    Your MCP product is now live and ready to sell. You can share its public URL\n    with customers, and they'll be able to subscribe to your product via Stripe.\n    We use [Stripe Connect](https://stripe.com/connect) to handle sending\n    payments to your bank.\n  </Step>\n</Steps>\n\nThat's all there is to it!\n\nVisit the [Quick Start](/publishing/quickstart) to get started in minutes.\n"
  },
  {
    "path": "docs/publishing/origin/index.mdx",
    "content": "---\ntitle: Origin Servers\ndescription: Configuring your origin MCP server or OpenAPI service with Agentic's MCP Gateway.\n---\n\n## Remote origin servers\n\n**Agentic currently only supports remote origin servers**. If you're\ninterested in hosting your origin server with Agentic's infrastructure, please\n[reach out to us](/contact) and we'll be happy to help you get set up.\n\n<Tip>\n  Remote origin servers are important because they allow for maximum flexibility\n  with how you author and host your MCP server or OpenAPI service.\n\nBy cleanly separating between Agentic's MCP gateway and your remote origin server, Agentic supports origin servers written in any language or framework and deployed to any cloud.\n\n</Tip>\n\n### Remote Origin MCP Server\n\nAgentic supports remote MCP servers hosted externally on any public network.\n\nYour MCP server must support the Streamable HTTP transport and use a secure `https` URL.\n\nSee [Configuring your origin MCP server](/publishing/config#mcp-origin-server) for more details.\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Example remote MCP server',\n  origin: {\n    type: 'mcp',\n    url: 'https://example.com/mcp'\n  }\n})\n```\n\n### Remote Origin OpenAPI Service\n\nAgentic supports remote OpenAPI services hosted externally on any public network.\n\nYour OpenAPI service must use OpenAPI 3.x and use a secure `https` URL.\n\nSee [Configuring your origin OpenAPI service](/publishing/config#open-api-origin-server) for more details.\n\n```ts agentic.config.ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Example remote OpenAPI service',\n  origin: {\n    type: 'openapi',\n    url: 'https://example.com/openapi',\n    spec: 'https://example.com/openapi.json'\n  }\n})\n```\n\n## Deploying your origin server to Agentic\n\n<Note>\n  **Agentic currently only supports remote origin servers**. If you're\n  interested in hosting your origin server with Agentic's infrastructure, please\n  [reach out to us](/contact) and we'll be happy to help you get set up.\n</Note>\n"
  },
  {
    "path": "docs/publishing/origin/metadata.mdx",
    "content": "---\ntitle: Origin Metadata\ndescription: Agentic's MCP Gateway passes extra metadata to your origin server.\n---\n\n## Metadata\n\n<Tabs>\n  <Tab title='MCP Origin Server'>\nAgentic's MCP Gateway will always include the following metadata in all tool calls within the `_meta.agentic` field.\n\n```ts\nexport type AgenticMcpRequestMetadata = {\n  agenticProxySecret: string\n  sessionId: string\n  isCustomerSubscriptionActive: boolean\n\n  customerId?: string\n  customerSubscriptionStatus?: string\n  customerSubscriptionPlan?: string\n\n  userId?: string\n  userEmail?: string\n  userUsername?: string\n  userName?: string\n  userCreatedAt?: string\n  userUpdatedAt?: string\n\n  deploymentId: string\n  deploymentIdentifier: string\n  projectId: string\n  projectIdentifier: string\n\n  ip?: string\n} & (\n  | {\n      // If the customer has an active subscription, these fields are guaranteed\n      // to be present in the metadata.\n      isCustomerSubscriptionActive: true\n\n      customerId: string\n      customerSubscriptionStatus: string\n\n      userId: string\n      userEmail: string\n      userUsername: string\n      userCreatedAt: string\n      userUpdatedAt: string\n    }\n  | {\n      // If the customer does not have an active subscription, then the customer\n      // fields may or may not be present.\n      isCustomerSubscriptionActive: false\n    }\n)\n```\n\n</Tab>\n\n<Tab title='OpenAPI Origin Server'>\nAgentic's MCP Gateway will always include the following headers for all tool calls to your origin server.\n\n<ResponseField name='x-agentic-proxy-secret' type='string' required>\n  The secret key of your Agentic project. This is used to guarantee that HTTP\n  requests are actually coming from Agentic's MCP Gateway, and not from\n  third-party actors.\n\nYou can find this secret key in your Agentic project's dashboard settings.\n\n</ResponseField>\n\n<ResponseField name='x-agentic-customer-id' type='string'>\n  The ID of the customer in Agentic's database.\n</ResponseField>\n\n<ResponseField\n  name='x-agentic-is-customer-subscription-active'\n  type='string'\n  required\n  default='false'\n>\n  Whether the customer has an active subscription. Will be either `true` or\n  `false`.\n</ResponseField>\n\n<ResponseField\n  name='x-agentic-customer-subscription-status'\n  type='string'\n  required\n  default='incomplete'\n>\n  The [Stripe status](https://docs.stripe.com/api/subscriptions/object#subscription_object-status) of the customer's subscription.\n\nPossible values are `incomplete`, `incomplete_expired`, `trialing`, `active`, `past_due`, `canceled`, `unpaid`, or `paused`.\n\n</ResponseField>\n\n<ResponseField\n  name='x-agentic-customer-subscription-plan'\n  type='string'\n  required\n  default='free'\n>\n  The slug of the customer's subscription pricing plan.\n</ResponseField>\n\n<ResponseField name='x-agentic-user-id' type='string'>\n  The ID of the user in Agentic's database.\n</ResponseField>\n\n<ResponseField name='x-agentic-user-email' type='string'>\n  The email of the user in Agentic's database.\n</ResponseField>\n\n<ResponseField name='x-agentic-user-username' type='string'>\n  The username of the user in Agentic's database.\n</ResponseField>\n\n<ResponseField name='x-agentic-user-name' type='string'>\n  The name of the user in Agentic's database.\n</ResponseField>\n\n<ResponseField name='x-agentic-user-created-at' type='string'>\n  The date and time the user was created in Agentic's database.\n</ResponseField>\n\n<ResponseField name='x-agentic-user-updated-at' type='string'>\n  The date and time the user was last updated in Agentic's database.\n</ResponseField>\n\n<ResponseField name='x-agentic-project-id' type='string' required>\n  The ID of the project in Agentic's database. (`proj_...`)\n</ResponseField>\n\n<ResponseField name='x-agentic-project-identifier' type='string' required>\n  The public identifier of the target project in Agentic's database.\n  (`@username/project-name`)\n</ResponseField>\n\n<ResponseField name='x-agentic-deployment-id' type='string' required>\n  The ID of the target deployment in Agentic's database. (`depl_...`)\n</ResponseField>\n\n<ResponseField name='x-agentic-deployment-identifier' type='string' required>\n  The public identifier of the target deployment in Agentic's database.\n  (`@username/project-name@<deployment-hash>`)\n</ResponseField>\n</Tab>\n</Tabs>\n\n## Unauthenticated requests\n\nIf a customer doesn't provide an API key for their MCP or HTTP call, Agentic's MCP Gateway will default them to your project's `free` pricing plan with `isCustomerSubscriptionActive` set to `false`.\n\nThis means they'll be subject to your project's `free` pricing plan's [rate limits](/publishing/config/rate-limits), which is important to protect your origin server from abuse.\n"
  },
  {
    "path": "docs/publishing/origin/security.mdx",
    "content": "---\ntitle: Origin Security\ndescription: Agentic offers multiple ways to secure your origin server from unauthorized requests.\n---\n\n## Securing your origin server\n\nAgentic's MCP Gateway will always pass a **proxy secret** when making tool calls to your origin server (either as [`_meta.agentic.agenticProxySecret` for MCP origin servers](/publishing/origin/metadata#mcp-origin-server) or as an [`x-agentic-proxy-secret` header for OpenAPI origin servers](/publishing/origin/metadata#open-api-origin-server)).\n\nYou can find this secret key in your Agentic project's dashboard settings.\n\nYou'll want to set this secret key in your origin server's environment variables and use it to protect against unauthorized requests.\n\nNote that this is only necessary if your origin server is deployed externally to a public network.\n\n### Securing an MCP origin server\n\nThis is example pseudocode for how you might protect your origin MCP server to ensure only calls from Agentic's MCP Gateway are allowed.\n\n```ts\nif (\n  (_meta?.agentic as any)?.agenticProxySecret !==\n  process.env.AGENTIC_PROXY_SECRET\n) {\n  return {\n    content: [\n      {\n        type: 'text',\n        text: 'Unauthorized'\n      }\n    ],\n    isError: true\n  }\n}\n```\n\n### Securing an OpenAPI origin server\n\nThis is example pseudocode for how you might protect your origin OpenAPI service to ensure only calls from Agentic's MCP Gateway are allowed.\n\n```ts\nif (\n  request.headers.get('x-agentic-proxy-secret') !==\n  process.env.AGENTIC_PROXY_SECRET\n) {\n  return {\n    status: 401,\n    body: {\n      error: 'Unauthorized'\n    }\n  }\n}\n```\n\n## Restricting IP addresses\n\nYou can also protecting your origin server by restricting HTTP calls to specific IP addresses used by Agentic's MCP gateway.\n\nThis is currently a private beta feature. If you're interested in using it, please [get in touch](/contact).\n\n## Signed HTTP requests\n\nYou can also protecting your origin OpenAPI server by requiring all HTTP requests to be signed with your project's proxy secret.\n\nThis is currently a private beta feature. If you're interested in using it, please [get in touch](/contact).\n\n## Signed MCP requests\n\n[MCP currently doesn't support signed requests](https://github.com/modelcontextprotocol/modelcontextprotocol/discussions/461).\n\nIf you're interested in this feature, please [get in touch](/contact).\n"
  },
  {
    "path": "docs/publishing/quickstart.mdx",
    "content": "---\ntitle: Quick Start\ndescription: Deploy your first MCP product to Agentic in minutes.\n---\n\n## Do you have an existing API?\n\n<Columns cols={2}>\n  <Card\n    title='Existing MCP Server'\n    href='/publishing/guides/existing-mcp-server'\n    icon='server'\n  >\n    Quick start based on an existing MCP server.\n  </Card>\n\n  <Card\n    title='Existing OpenAPI Service'\n    href='/publishing/guides/existing-openapi-service'\n    icon='cloud'\n  >\n    Quick start based on an existing OpenAPI service.\n  </Card>\n</Columns>\n\n## Create a new project from scratch\n\n<Tabs>\n<Tab title=\"TypeScript\">\n<Columns cols={2}>\n  <Card\n    title='TS xmcp'\n    href='/publishing/guides/ts-xmcp'\n    icon={(\n<svg viewBox=\"0 0 512 512\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M86 145.542H102.4V162.25H86V145.542ZM102.4 429.583V379.458H118.8V362.75H135.2V346.042H168V329.333H184.4V312.625H200.8V346.042H233.6V362.75H250V379.458H266.4V396.167H250V412.875H233.6V429.583H217.2V412.875H200.8V396.167H168V412.875H151.6V446.292H168V463H135.2V446.292H118.8V429.583H102.4ZM102.4 145.542V112.125H118.8V95.4167H135.2V78.7083H200.8V95.4167H233.6V112.125H250V145.542H266.4V162.25H282.8V178.958H299.2V195.667H282.8V212.375H364.8V229.083H348.4V245.792H315.6V279.208H332V295.917H348.4V312.625H364.8V346.042H381.2V362.75H397.6V379.458H364.8V396.167H348.4V412.875H332V396.167H315.6V362.75H299.2V329.333H282.8V312.625H266.4V279.208H233.6V262.5H118.8V245.792H135.2V229.083H151.6V212.375H217.2V195.667H200.8V162.25H184.4V128.833H168V112.125H151.6V128.833H118.8V145.542H102.4ZM200.8 312.625V295.917H217.2V312.625H200.8ZM217.2 295.917V279.208H233.6V295.917H217.2ZM266.4 379.458V362.75H282.8V379.458H266.4ZM266.4 145.542V128.833H282.8V145.542H266.4ZM282.8 128.833V112.125H299.2V78.7083H332V95.4167H364.8V78.7083H397.6V128.833H381.2V145.542H348.4V162.25H332V145.542H315.6V178.958H299.2V128.833H282.8ZM397.6 362.75V346.042H414V362.75H397.6ZM397.6 78.7083V62H414V78.7083H397.6Z\" fill=\"#0D969D\"></path>\n</svg>\n    )}\n  >\n    Create a new MCP server and deploy it to Agentic using xmcp and Vercel.\n  </Card>\n\n<Card title='TS ModelFetch' href='/publishing/guides/ts-modelfetch' icon='cube'>\n  Create a new MCP server and deploy it to Agentic using ModelFetch SDK.\n</Card>\n\n<Card\n  title='TS FastMCP Server'\n  href='/publishing/guides/ts-fastmcp'\n  icon='bolt'\n>\n  Create a new MCP server and deploy it to Agentic using the TS `fastmcp`\n  package.\n</Card>\n\n<Card\n  title='TS MCP Hono'\n  href='/publishing/guides/ts-mcp-hono'\n  icon='fire-flame-curved'\n>\n  Create a new MCP server and deploy it to Agentic using `hono` and `@hono/mcp`.\n</Card>\n\n  <Card\n    title='TS OpenAPI Hono'\n    href='/publishing/guides/ts-openapi-hono'\n    icon='webhook'\n  >\n    Create a new OpenAPI server and deploy it to Agentic (as an MCP product!) using `hono` and `@hono/zod-openapi`.\n  </Card>\n</Columns>\n</Tab>\n\n<Tab title='Python'>\n  <Columns cols={2}>\n    <Card\n      title='Python FastMCP Server'\n      href='/publishing/guides/py-fastmcp'\n      icon='python'\n    />\n  </Columns>\n</Tab>\n\n</Tabs>\n"
  },
  {
    "path": "eslint.config.js",
    "content": "import { config } from '@fisch0920/config/eslint'\nimport drizzle from 'eslint-plugin-drizzle'\n\nexport default [\n  ...config,\n  {\n    ignores: [\n      '**/out/**',\n      '**/dist/**',\n      '**/.wrangler/**',\n      '**/.xmcp/**',\n      'packages/types/src/openapi.d.ts',\n      'apps/gateway/src/worker.d.ts',\n      'packages/json-schema/test/json-schema-test-suite.ts',\n      'apps/web/src/*.gen.ts',\n      'legacy/**',\n      'stdlib/stdlib/**'\n    ]\n  },\n  {\n    files: ['**/*.ts', '**/*.tsx'],\n    rules: {\n      'no-console': 'error',\n      'unicorn/no-array-reduce': 'off'\n    }\n  },\n  {\n    files: [\n      'packages/cli/src/**/*.ts',\n      'fixtures/**/*.ts',\n      '**/*.test.ts',\n      'examples/**/*.ts'\n    ],\n    rules: {\n      'no-console': 'off',\n      'no-process-env': 'off',\n      'unicorn/no-process-exit': 'off'\n    }\n  },\n  {\n    files: ['apps/e2e/**/*.ts', 'apps/web/src/**/*.{tsx,ts}', 'stdlib/**/*.ts'],\n    rules: {\n      'no-console': 'off'\n    }\n  },\n  {\n    files: ['apps/api/src/**/*.ts'],\n    plugins: {\n      drizzle\n    },\n    rules: {\n      ...drizzle.configs.recommended.rules\n    }\n  }\n]\n"
  },
  {
    "path": "examples/mcp-servers/context7/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Context7',\n  slug: 'context7',\n  description:\n    'Up-to-date code docs for any prompt. LLMs rely on outdated or generic information about the libraries you use, wheres Context7 pulls up-to-date, version-specific documentation and code examples directly from the source.',\n  origin: {\n    type: 'mcp',\n    url: 'https://mcp.context7.com/mcp'\n  },\n  icon: 'https://avatars.githubusercontent.com/u/74989412?s=48&v=4',\n  readme:\n    'https://raw.githubusercontent.com/upstash/context7/refs/heads/master/README.md',\n  sourceUrl: 'https://github.com/upstash/context7',\n  homepageUrl: 'https://context7.com',\n  toolConfigs: [\n    {\n      name: 'resolve-library-id',\n      cacheControl:\n        'public, max-age=3600, s-maxage=3600 stale-while-revalidate=180',\n      examples: [\n        {\n          name: 'Next.js example',\n          featured: true,\n          prompt:\n            'Create a Next.js middleware that checks for a valid JWT in cookies and redirects unauthenticated users to `/login`. use context7',\n          args: {\n            libraryName: 'Next.js'\n          }\n        }\n      ]\n    },\n    {\n      name: 'get-library-docs',\n      cacheControl:\n        'public, max-age=3600, s-maxage=3600 stale-while-revalidate=180'\n    }\n  ]\n})\n"
  },
  {
    "path": "examples/mcp-servers/context7/package.json",
    "content": "{\n  \"name\": \"@agentic/examples-mcps-context7\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"UNLICENSED\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"examples/mcp-servers/context7\"\n  },\n  \"type\": \"module\",\n  \"source\": \"./src/worker.ts\",\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\"\n  }\n}\n"
  },
  {
    "path": "examples/mcp-servers/context7/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"agentic.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "examples/mcp-servers/github/agentic.config.ts",
    "content": "import 'dotenv/config'\n\nimport { defineConfig } from '@agentic/platform'\n\nif (!process.env.GITHUB_TOKEN) {\n  throw new Error('GITHUB_TOKEN is not set')\n}\n\nexport default defineConfig({\n  name: 'GitHub',\n  slug: 'github',\n  description:\n    'The GitHub MCP Server is a Model Context Protocol (MCP) server that provides seamless integration with GitHub APIs, enabling advanced automation and interaction capabilities for developers and tools.',\n  origin: {\n    type: 'mcp',\n    url: 'https://api.githubcopilot.com/mcp/',\n    headers: {\n      Authorization: `Bearer ${process.env.GITHUB_TOKEN}`\n    }\n  },\n  icon: './github-mark.svg',\n  readme:\n    'https://raw.githubusercontent.com/github/github-mcp-server/refs/heads/main/README.md',\n  sourceUrl: 'https://github.com/github/github-mcp-server',\n  homepageUrl: 'https://github.com',\n  toolConfigs: [\n    {\n      name: 'get_me',\n      examples: [\n        {\n          featured: true,\n          prompt: 'Get my github user information',\n          args: {\n            reason: 'github hack night!'\n          }\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "examples/mcp-servers/github/package.json",
    "content": "{\n  \"name\": \"@agentic/examples-mcps-github\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"UNLICENSED\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"examples/mcp-servers/github\"\n  },\n  \"type\": \"module\",\n  \"source\": \"./src/worker.ts\",\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"dotenv\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/mcp-servers/github/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"agentic.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "examples/mcp-servers/search/.dev.vars.example",
    "content": "SERPER_API_KEY=\n\nAGENTIC_PROXY_SECRET=\n"
  },
  {
    "path": "examples/mcp-servers/search/agentic.config.ts",
    "content": "import 'dotenv/config'\n\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Agentic Google Search',\n  slug: 'search',\n  description:\n    'Google Search API built specifically for LLMs. Agents should use this tool for searching the web in order to find up-to-date news and information about any topic.',\n  origin: {\n    type: 'mcp',\n    url: process.env.MCP_ORIGIN_URL!\n  },\n  icon: './google.svg',\n  sourceUrl:\n    'https://github.com/transitive-bullshit/agentic/tree/main/examples/mcp-servers/search',\n  homepageUrl: 'https://agentic.so',\n  toolConfigs: [\n    {\n      name: 'search',\n      cacheControl: 'public, max-age=60, s-maxage=60 stale-while-revalidate=10'\n    }\n  ],\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 0\n        }\n      ],\n      // Limit free-tier requests to 10 per day\n      rateLimit: {\n        interval: '1d',\n        limit: 10\n      }\n    },\n    {\n      name: 'Standard',\n      slug: 'standard',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 1000\n        },\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'tiered',\n          tiersMode: 'volume',\n          tiers: [\n            {\n              upTo: 1000,\n              unitAmount: 0\n            },\n            {\n              upTo: 50_000,\n              unitAmount: 0.1\n            },\n            {\n              upTo: 500_000,\n              unitAmount: 0.08\n            },\n            {\n              upTo: 2_500_000,\n              unitAmount: 0.06\n            },\n            {\n              upTo: 'inf',\n              unitAmount: 0.05\n            }\n          ]\n        }\n      ],\n      rateLimit: {\n        interval: '1s',\n        limit: 100\n      }\n    }\n  ]\n})\n"
  },
  {
    "path": "examples/mcp-servers/search/package.json",
    "content": "{\n  \"name\": \"@agentic/examples-mcps-search\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"UNLICENSED\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"examples/mcp-servers/search\"\n  },\n  \"type\": \"module\",\n  \"source\": \"./src/worker.ts\",\n  \"scripts\": {\n    \"dev\": \"wrangler dev\",\n    \"deploy\": \"wrangler deploy\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"@agentic/serper\": \"workspace:*\",\n    \"@hono/mcp\": \"catalog:\",\n    \"@modelcontextprotocol/sdk\": \"catalog:\",\n    \"dotenv\": \"catalog:\",\n    \"hono\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@cloudflare/workers-types\": \"catalog:\",\n    \"wrangler\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/mcp-servers/search/src/env.ts",
    "content": "import { z } from 'zod'\n\nexport const envSchema = z.object({\n  SERPER_API_KEY: z.string().nonempty(),\n  AGENTIC_PROXY_SECRET: z.string().nonempty()\n})\n\nexport type Env = z.infer<typeof envSchema>\n\nexport function parseEnv(inputEnv: Record<string, unknown>): Env {\n  return envSchema.parse(inputEnv)\n}\n"
  },
  {
    "path": "examples/mcp-servers/search/src/worker.ts",
    "content": "import { SerperClient } from '@agentic/serper'\nimport { StreamableHTTPTransport } from '@hono/mcp'\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { Hono } from 'hono'\nimport { z } from 'zod'\n\nimport { type Env, parseEnv } from './env'\n\nlet serper: SerperClient\n\nconst app = new Hono()\n\nconst mcpServer = new McpServer({\n  name: 'search',\n  version: '1.0.0'\n})\n\napp.all('/mcp', async (c) => {\n  const transport = new StreamableHTTPTransport()\n  await mcpServer.connect(transport)\n  return transport.handleRequest(c)\n})\n\nexport default {\n  async fetch(\n    request: Request,\n    env: Env,\n    ctx: ExecutionContext\n  ): Promise<Response> {\n    const parsedEnv = parseEnv(env)\n\n    if (!serper) {\n      serper = new SerperClient({ apiKey: parsedEnv.SERPER_API_KEY })\n\n      mcpServer.registerTool(\n        'search',\n        {\n          description:\n            'Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.',\n          inputSchema: z.object({\n            query: z.string().describe('Search query'),\n            num: z\n              .number()\n              .int()\n              .default(5)\n              .optional()\n              .describe('Number of results to return'),\n            type: z\n              .enum([\n                'search',\n                'images',\n                'videos',\n                'places',\n                'news',\n                'shopping'\n              ])\n              .default('search')\n              .optional()\n              .describe('Type of Google search to perform')\n          }).shape,\n          outputSchema: z\n            .object({\n              results: z.any(),\n              answerBox: z.any().optional(),\n              knowledgeGraph: z.any().optional(),\n              images: z.any().optional(),\n              videos: z.any().optional(),\n              places: z.any().optional(),\n              news: z.any().optional(),\n              shopping: z.any().optional()\n            })\n            .passthrough().shape\n        },\n        async (args, { _meta }) => {\n          // Make sure the request is coming from Agentic\n          if (\n            (_meta?.agentic as any)?.agenticProxySecret !==\n            parsedEnv.AGENTIC_PROXY_SECRET\n          ) {\n            return {\n              content: [\n                {\n                  type: 'text',\n                  text: 'Unauthorized request: must come from Agentic MCP Gateway'\n                }\n              ],\n              isError: true\n            }\n          }\n\n          const result: any = await serper!.search({\n            q: args.query,\n            num: args.num ?? 5,\n            type: args.type ?? 'search'\n          })\n\n          // Simplify search results to optimize for LLM usage\n          result.results = result.organic\n          delete result.organic\n          delete result.topStories\n          delete result.peopleAlsoAsk\n          delete result.searchParameters\n          delete result.credits\n          delete result.relatedSearches\n\n          return {\n            content: [],\n            structuredContent: result\n          }\n        }\n      )\n    }\n\n    return app.fetch(request, parsedEnv, ctx)\n  }\n} satisfies ExportedHandler<Env>\n"
  },
  {
    "path": "examples/mcp-servers/search/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"compilerOptions\": {\n    \"types\": [\"@cloudflare/workers-types\"]\n  },\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "examples/mcp-servers/search/wrangler.jsonc",
    "content": "/**\n * https://developers.cloudflare.com/workers/wrangler/configuration/\n */\n{\n  \"$schema\": \"node_modules/wrangler/config-schema.json\",\n  \"name\": \"agentic-mcp-search\",\n  \"main\": \"src/worker.ts\",\n  \"compatibility_date\": \"2025-05-25\",\n  \"compatibility_flags\": [\"nodejs_compat\"],\n  \"placement\": { \"mode\": \"smart\" },\n  \"upload_source_maps\": true,\n  \"observability\": {\n    \"enabled\": true,\n    \"head_sampling_rate\": 1\n  }\n}\n"
  },
  {
    "path": "examples/mcp-servers/xmcp/.gitignore",
    "content": ".vercel\n"
  },
  {
    "path": "examples/mcp-servers/xmcp/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'XMCP Example',\n  slug: 'xmcp',\n  description: 'TODO',\n  origin: {\n    type: 'mcp',\n    url: 'https://xmcp.vercel.app/mcp'\n  },\n  homepageUrl: 'https://xmcp.dev',\n  icon: './xmcp.svg'\n})\n"
  },
  {
    "path": "examples/mcp-servers/xmcp/package.json",
    "content": "{\n  \"name\": \"@agentic/examples-mcps-xmcp\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"UNLICENSED\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"examples/mcp-servers/xmcp\"\n  },\n  \"scripts\": {\n    \"dev\": \"xmcp dev\",\n    \"build\": \"xmcp build --vercel\",\n    \"deploy\": \"vercel deploy --prod --prebuilt\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"xmcp\": \"^0.1.6\"\n  },\n  \"devDependencies\": {\n    \"swc-loader\": \"^0.2.6\"\n  }\n}\n"
  },
  {
    "path": "examples/mcp-servers/xmcp/src/tools/greet.ts",
    "content": "import { type InferSchema } from 'xmcp'\nimport { z } from 'zod'\n\n// Define the schema for tool parameters\nexport const schema = {\n  name: z.string().describe('The name of the user to greet')\n}\n\n// Define tool metadata\nexport const metadata = {\n  name: 'greet',\n  description: 'Greet the user',\n  annotations: {\n    title: 'Greet the user',\n    readOnlyHint: true,\n    destructiveHint: false,\n    idempotentHint: true\n  }\n}\n\n// Tool implementation\nexport default async function greet({ name }: InferSchema<typeof schema>) {\n  const result = `Hello, ${name}!`\n\n  return {\n    content: [{ type: 'text', text: result }]\n  }\n}\n"
  },
  {
    "path": "examples/mcp-servers/xmcp/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\", \"xmcp-env.d.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "examples/mcp-servers/xmcp/vercel.json",
    "content": "{\n  \"$schema\": \"https://openapi.vercel.sh/vercel.json\",\n  \"buildCommand\": \"xmcp build --vercel\"\n}\n"
  },
  {
    "path": "examples/mcp-servers/xmcp/xmcp-env.d.ts",
    "content": "/// <reference types=\"xmcp\" />\n\n// Do not edit this file"
  },
  {
    "path": "examples/mcp-servers/xmcp/xmcp.config.ts",
    "content": "import type { XmcpConfig } from 'xmcp'\n\nconst config: XmcpConfig = {\n  http: {\n    port: 3002\n  }\n}\n\nexport default config\n"
  },
  {
    "path": "examples/ts-sdks/ai-sdk/bin/mcp-filesystem.ts",
    "content": "import 'dotenv/config'\n\nimport { createAISDKTools } from '@agentic/ai-sdk'\nimport { createMcpTools } from '@agentic/mcp'\nimport { openai } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\nimport { gracefulExit } from 'exit-hook'\n\nasync function main() {\n  // Create an MCP tools provider, which will start a local MCP server process\n  // and use the stdio transport to communicate with it.\n  const mcpTools = await createMcpTools({\n    name: 'agentic-mcp-filesystem',\n    serverProcess: {\n      command: 'npx',\n      args: [\n        '-y',\n        '@modelcontextprotocol/server-filesystem',\n        // Allow the MCP server to access the current working directory.\n        process.cwd()\n        // Feel free to add additional directories the tool should have access to.\n      ]\n    }\n  })\n\n  const result = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(mcpTools),\n    toolChoice: 'required',\n    temperature: 0,\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What files are in the current directory?'\n  })\n\n  console.log(result.toolResults[0]?.result || JSON.stringify(result, null, 2))\n}\n\ntry {\n  await main()\n  gracefulExit(0)\n} catch (err) {\n  console.error(err)\n  gracefulExit(1)\n}\n"
  },
  {
    "path": "examples/ts-sdks/ai-sdk/bin/weather-experimental-active-tools.ts",
    "content": "import 'dotenv/config'\n\nimport { createAISDKTools } from '@agentic/ai-sdk'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n  const openai = createOpenAI({ compatibility: 'strict' })\n\n  const result = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(searchTool),\n    experimental_activeTools: Array.from(searchTool.functions).map(\n      (fn) => fn.spec.name\n    ),\n    toolChoice: 'required',\n    temperature: 0,\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What is the weather in San Francisco?'\n  })\n\n  console.log(JSON.stringify(result.toolResults[0], null, 2))\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/ai-sdk/bin/weather.ts",
    "content": "import 'dotenv/config'\n\nimport { createAISDKTools } from '@agentic/ai-sdk'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const result = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(searchTool),\n    toolChoice: 'required',\n    temperature: 0,\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What is the weather in San Francisco?'\n  })\n\n  console.log(JSON.stringify(result.toolResults[0], null, 2))\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/ai-sdk/package.json",
    "content": "{\n  \"name\": \"agentic-ts-examples-ai-sdk\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/ai-sdk\": \"workspace:*\",\n    \"@agentic/mcp\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\",\n    \"@ai-sdk/openai\": \"catalog:\",\n    \"ai\": \"catalog:\",\n    \"exit-hook\": \"catalog:\",\n    \"openai\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/ts-sdks/ai-sdk/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "examples/ts-sdks/genkit/bin/weather.ts",
    "content": "import 'dotenv/config'\n\nimport { createGenkitTools } from '@agentic/genkit'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { genkit } from 'genkit'\nimport { gpt4oMini, openAI } from 'genkitx-openai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const ai = genkit({\n    plugins: [openAI()]\n  })\n\n  const result = await ai.generate({\n    model: gpt4oMini,\n    tools: createGenkitTools(ai, searchTool),\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What is the weather in San Francisco?'\n  })\n\n  console.log(result)\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/genkit/package.json",
    "content": "{\n  \"name\": \"agentic-examples-genkit\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/genkit\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\",\n    \"genkit\": \"catalog:\",\n    \"genkitx-openai\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/ts-sdks/genkit/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "examples/ts-sdks/langchain/bin/weather.ts",
    "content": "import 'dotenv/config'\n\nimport { createLangChainTools } from '@agentic/langchain'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { ChatPromptTemplate } from '@langchain/core/prompts'\nimport { ChatOpenAI } from '@langchain/openai'\nimport { AgentExecutor, createToolCallingAgent } from 'langchain/agents'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const tools = createLangChainTools(searchTool)\n  const agent = createToolCallingAgent({\n    llm: new ChatOpenAI({ model: 'gpt-4o-mini', temperature: 0 }),\n    tools,\n    prompt: ChatPromptTemplate.fromMessages([\n      ['system', 'You are a helpful assistant. Be as concise as possible.'],\n      ['placeholder', '{chat_history}'],\n      ['human', '{input}'],\n      ['placeholder', '{agent_scratchpad}']\n    ])\n  })\n\n  const agentExecutor = new AgentExecutor({\n    agent,\n    tools\n    // verbose: true\n  })\n\n  const result = await agentExecutor.invoke({\n    input: 'What is the weather in San Francisco?'\n  })\n\n  console.log(result.output)\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/langchain/package.json",
    "content": "{\n  \"name\": \"agentic-examples-langchain\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/langchain\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\",\n    \"@langchain/core\": \"catalog:\",\n    \"@langchain/openai\": \"catalog:\",\n    \"langchain\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/ts-sdks/langchain/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "examples/ts-sdks/llamaindex/bin/weather.ts",
    "content": "import 'dotenv/config'\n\nimport { createLlamaIndexTools } from '@agentic/llamaindex'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@llamaindex/openai'\nimport { agent } from '@llamaindex/workflow'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const tools = createLlamaIndexTools(searchTool)\n  const weatherAgent = agent({\n    llm: openai({ model: 'gpt-4o-mini', temperature: 0 }),\n    systemPrompt: 'You are a helpful assistant. Be as concise as possible.',\n    tools\n  })\n\n  const response = await weatherAgent.run(\n    'What is the weather in San Francisco?'\n  )\n\n  console.log(response.data.result)\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/llamaindex/package.json",
    "content": "{\n  \"name\": \"agentic-examples-llamaindex\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/llamaindex\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\",\n    \"@llamaindex/openai\": \"catalog:\",\n    \"@llamaindex/workflow\": \"catalog:\",\n    \"llamaindex\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/ts-sdks/llamaindex/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "examples/ts-sdks/mastra/bin/weather.ts",
    "content": "import 'dotenv/config'\n\nimport { createMastraTools } from '@agentic/mastra'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { openai } from '@ai-sdk/openai'\nimport { Agent } from '@mastra/core/agent'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n\n  const weatherAgent = new Agent({\n    name: 'Weather Agent',\n    model: openai('gpt-4o-mini'),\n    tools: createMastraTools(searchTool),\n    instructions: 'You are a helpful assistant. Be as concise as possible.'\n  })\n\n  const res = await weatherAgent.generate(\n    'What is the weather in San Francisco?'\n  )\n  console.log(res.text)\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/mastra/package.json",
    "content": "{\n  \"name\": \"agentic-examples-mastra\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/mastra\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\",\n    \"@ai-sdk/openai\": \"catalog:\",\n    \"@mastra/core\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/ts-sdks/mastra/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "examples/ts-sdks/openai/bin/weather-responses.ts",
    "content": "import 'dotenv/config'\n\nimport { assert } from '@agentic/core'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport OpenAI from 'openai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n  const openai = new OpenAI()\n\n  const messages: OpenAI.Responses.ResponseInput = [\n    {\n      role: 'system',\n      content: 'You are a helpful assistant. Be as concise as possible.'\n    },\n    { role: 'user', content: 'What is the weather in San Francisco?' }\n  ]\n\n  {\n    // First call to OpenAI to invoke the tool\n    const res = await openai.responses.create({\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.responsesToolSpecs,\n      tool_choice: 'required',\n      input: messages\n    })\n\n    const toolCall = res.output[0]\n    assert(toolCall?.type === 'function_call')\n    const toolResult = await searchTool.callTool(\n      toolCall.name,\n      toolCall.arguments\n    )\n\n    messages.push(toolCall)\n    messages.push({\n      type: 'function_call_output',\n      call_id: toolCall.call_id,\n      output: JSON.stringify(toolResult)\n    })\n  }\n\n  {\n    // Second call to OpenAI to generate a text response\n    const res = await openai.responses.create({\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.responsesToolSpecs,\n      input: messages\n    })\n\n    console.log(res.output_text)\n  }\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/openai/bin/weather.ts",
    "content": "import 'dotenv/config'\n\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport OpenAI from 'openai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n  const openai = new OpenAI()\n\n  const messages: OpenAI.ChatCompletionMessageParam[] = [\n    {\n      role: 'system',\n      content: 'You are a helpful assistant. Be as concise as possible.'\n    },\n    { role: 'user', content: 'What is the weather in San Francisco?' }\n  ]\n\n  {\n    // First call to OpenAI to invoke the tool\n    const res = await openai.chat.completions.create({\n      messages,\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.toolSpecs,\n      tool_choice: 'required'\n    })\n\n    const message = res.choices[0]!.message!\n    const toolCall = message.tool_calls![0]!.function!\n    const toolResult = await searchTool.callTool(\n      toolCall.name,\n      toolCall.arguments\n    )\n\n    messages.push(message)\n    messages.push({\n      role: 'tool',\n      tool_call_id: message.tool_calls![0]!.id,\n      content: JSON.stringify(toolResult)\n    })\n  }\n\n  {\n    // Second call to OpenAI to generate a text response\n    const res = await openai.chat.completions.create({\n      messages,\n      model: 'gpt-4o-mini',\n      temperature: 0,\n      tools: searchTool.functions.toolSpecs\n    })\n    const message = res.choices?.[0]?.message\n    console.log(message?.content)\n  }\n}\n\nawait main()\n"
  },
  {
    "path": "examples/ts-sdks/openai/package.json",
    "content": "{\n  \"name\": \"agentic-examples-openai\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\",\n    \"openai\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "examples/ts-sdks/openai/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "fixtures/invalid/invalid-metadata-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Invalid Metadata 0',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  icon: false as any\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-metadata-1/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Metadata 1',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  readme: './not-found.md'\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-name-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  slug: 'test-invalid-name-0',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n} as any) // invalid; missing name\n"
  },
  {
    "path": "fixtures/invalid/invalid-name-1/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'a'.repeat(1025), // invalid; too long\n  slug: 'test-invalid-name-2',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-name-2/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: '', // invalid; must not be empty\n  slug: 'test-invalid-name-1',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-origin-url-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-invalid-origin-url-0',\n  origin: {\n    type: 'raw',\n    url: 'http://jsonplaceholder.typicode.com' // invalid http url (missing https)\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-origin-url-1/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-invalid-origin-url-1',\n  origin: {\n    type: 'raw',\n    url: 'https://' // invalid https url\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-origin-url-2/agentic.config.json",
    "content": "{\n  \"name\": \"test-invalid-origin-url-2\"\n}\n"
  },
  {
    "path": "fixtures/invalid/invalid-origin-url-3/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-invalid-origin-url-3',\n  origin: {\n    type: 'raw',\n    url: '' // invalid https url\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-slug-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Invalid Slug 0',\n  slug: 'Test Invalid Slug 0',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-slug-1/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Invalid Slug 1',\n  slug: 'Test-Invalid-Slug-1',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-slug-2/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Invalid Slug 2',\n  slug: 'test_invalid_slug_2',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/invalid-slug-3/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: ' ',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n} as any) // invalid; missing slug\n"
  },
  {
    "path": "fixtures/invalid/invalid-slug-4/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Invalid Name 4',\n  slug: '@foo/bar', // invalid; slug contains invalid characters\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n})\n"
  },
  {
    "path": "fixtures/invalid/pricing-base-inconsistent/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-base-inconsistent',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ]\n    },\n    {\n      name: 'Starter',\n      slug: 'starter',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 0.467\n        } as any\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/invalid/pricing-custom-inconsistent/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-custom-inconsistent',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'custom-test',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ]\n    },\n    {\n      name: 'Starter',\n      slug: 'starter',\n      lineItems: [\n        {\n          slug: 'custom-test',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 100\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/invalid/pricing-duplicate-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-duplicate-0',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingIntervals: ['month', 'year'],\n  pricingPlans: [\n    {\n      name: 'Basic',\n      slug: 'basic',\n      interval: 'month',\n      lineItems: [\n        {\n          slug: 'custom-test',\n          usageType: 'licensed',\n          amount: 100\n        }\n      ]\n    },\n    {\n      name: 'Basic',\n      slug: 'basic', // invalid duplicate slug\n      interval: 'year',\n      lineItems: [\n        {\n          slug: 'custom-test',\n          usageType: 'licensed',\n          amount: 70\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/invalid/pricing-duplicate-1/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-duplicate-1',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [\n    {\n      name: 'Basic',\n      slug: 'basic',\n      lineItems: [\n        {\n          slug: 'custom-test',\n          usageType: 'licensed',\n          amount: 100\n        },\n        {\n          slug: 'custom-test',\n          usageType: 'licensed',\n          amount: 200\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/invalid/pricing-empty-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-empty-0',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingIntervals: [] as any, // this is invalid\n  pricingPlans: [\n    {\n      name: 'Basic',\n      slug: 'basic',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 499 // $4.99 USD\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/invalid/pricing-empty-1/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-empty-1',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [\n    {\n      name: 'Basic',\n      slug: 'basic',\n      lineItems: [] as any // this is invalid\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/invalid/pricing-empty-2/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-empty-2',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [] as any // this is invalid\n})\n"
  },
  {
    "path": "fixtures/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-fixtures\",\n  \"private\": true,\n  \"version\": \"0.0.1\",\n  \"description\": \"Internal test fixtures for the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/fixtures\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"exports\": {\n    \"./valid/**\": \"./valid/*\",\n    \"./invalid/**\": \"./invalid/*\"\n  },\n  \"files\": [\n    \"valid\",\n    \"invalid\"\n  ],\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@modelcontextprotocol/sdk\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "fixtures/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"*.config.ts\", \"valid/**/*.config.ts\", \"invalid/**/*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "fixtures/valid/basic-mcp/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Basic MCP',\n  origin: {\n    type: 'mcp',\n    url: 'https://agentic-basic-mcp-test.onrender.com/mcp'\n  }\n})\n"
  },
  {
    "path": "fixtures/valid/basic-mcp/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-fixtures-basic-mcp\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/fixtures/valid/basic-mcp\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"start\": \"tsx src/index.ts\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"@modelcontextprotocol/sdk\": \"catalog:\",\n    \"fastmcp\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "fixtures/valid/basic-mcp/src/env.ts",
    "content": "import { z } from 'zod'\n\nexport const envSchema = z.object({\n  PORT: z.string().default('8080').transform(Number)\n})\n\nexport type Env = z.infer<typeof envSchema>\n\nexport const env = envSchema.parse(process.env)\n"
  },
  {
    "path": "fixtures/valid/basic-mcp/src/index.ts",
    "content": "import { FastMCP } from 'fastmcp'\nimport { z } from 'zod'\n\nimport { env } from './env'\n\nconst server = new FastMCP({\n  name: 'Agentic basic test MCP server',\n  version: '0.0.1'\n})\n\nserver.addTool({\n  name: 'add',\n  description: 'Add two numbers.',\n  parameters: z.object({\n    a: z.number(),\n    b: z.number()\n  }),\n  execute: async (args) => {\n    return String(args.a + args.b)\n  }\n})\n\nserver.addTool({\n  name: 'echo',\n  description: 'Echoes back the input parameters.',\n  parameters: z.record(z.string(), z.any()),\n  execute: async (args) => {\n    return JSON.stringify(args)\n  }\n})\n\nawait server.start({\n  transportType: 'httpStream',\n  httpStream: {\n    port: env.PORT\n  }\n})\n"
  },
  {
    "path": "fixtures/valid/basic-mcp/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"*.config.ts\", \"src\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "fixtures/valid/basic-openapi/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Basic OpenAPI',\n  slug: 'test-basic-openapi',\n  origin: {\n    type: 'openapi',\n    url: 'https://jsonplaceholder.typicode.com',\n    spec: './jsonplaceholder.json'\n  },\n  toolConfigs: [\n    {\n      name: 'get_posts',\n      pure: true\n    },\n    {\n      name: 'get_post',\n      pure: true\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/valid/basic-openapi/jsonplaceholder.json",
    "content": "{\n  \"openapi\": \"3.1.0\",\n  \"info\": {\n    \"title\": \"JSONPlaceholder\",\n    \"version\": \"1.0.0\"\n  },\n  \"paths\": {\n    \"/posts\": {\n      \"get\": {\n        \"summary\": \"Get posts\",\n        \"operationId\": \"getPosts\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/Post\"\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"summary\": \"Create post\",\n        \"operationId\": \"createPost\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"required\": [\"userId\", \"title\", \"body\"],\n                \"properties\": {\n                  \"userId\": {\n                    \"type\": \"integer\"\n                  },\n                  \"title\": {\n                    \"type\": \"string\"\n                  },\n                  \"body\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Post\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/posts/{postId}\": {\n      \"get\": {\n        \"summary\": \"Get post\",\n        \"operationId\": \"getPost\",\n        \"parameters\": [\n          {\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"name\": \"postId\",\n            \"in\": \"path\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Post\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"Post\": {\n        \"type\": \"object\",\n        \"required\": [\"id\", \"userId\", \"title\", \"body\"],\n        \"properties\": {\n          \"id\": {\n            \"type\": \"integer\"\n          },\n          \"userId\": {\n            \"type\": \"integer\"\n          },\n          \"title\": {\n            \"type\": \"string\"\n          },\n          \"body\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"Comment\": {\n        \"type\": \"object\",\n        \"required\": [\"id\", \"postId\", \"name\", \"email\", \"body\"],\n        \"properties\": {\n          \"id\": {\n            \"type\": \"integer\"\n          },\n          \"postId\": {\n            \"type\": \"integer\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"email\": {\n            \"type\": \"string\"\n          },\n          \"body\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"Todo\": {\n        \"type\": \"object\",\n        \"required\": [\"id\", \"userId\", \"title\", \"completed\"],\n        \"properties\": {\n          \"id\": {\n            \"type\": \"integer\"\n          },\n          \"userId\": {\n            \"type\": \"integer\"\n          },\n          \"title\": {\n            \"type\": \"string\"\n          },\n          \"completed\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"User\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"number\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"username\": {\n            \"type\": \"string\"\n          },\n          \"email\": {\n            \"type\": \"string\"\n          },\n          \"address\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"street\": {\n                \"type\": \"string\"\n              },\n              \"suite\": {\n                \"type\": \"string\"\n              },\n              \"city\": {\n                \"type\": \"string\"\n              },\n              \"zipcode\": {\n                \"type\": \"string\"\n              },\n              \"geo\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"lat\": {\n                    \"type\": \"string\"\n                  },\n                  \"lng\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"lat\", \"lng\"]\n              }\n            },\n            \"required\": [\"street\", \"suite\", \"city\", \"zipcode\", \"geo\"]\n          },\n          \"phone\": {\n            \"type\": \"string\"\n          },\n          \"website\": {\n            \"type\": \"string\"\n          },\n          \"company\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"name\": {\n                \"type\": \"string\"\n              },\n              \"catchPhrase\": {\n                \"type\": \"string\"\n              },\n              \"bs\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"name\", \"catchPhrase\", \"bs\"]\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n          \"username\",\n          \"email\",\n          \"address\",\n          \"phone\",\n          \"website\",\n          \"company\"\n        ]\n      }\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://jsonplaceholder.typicode.com\"\n    }\n  ]\n}\n"
  },
  {
    "path": "fixtures/valid/basic-raw-free-json/agentic.config.json",
    "content": "{\n  \"name\": \"test-basic-raw-free-json\",\n  \"origin\": {\n    \"type\": \"raw\",\n    \"url\": \"https://jsonplaceholder.typicode.com\"\n  }\n}\n"
  },
  {
    "path": "fixtures/valid/basic-raw-free-ts/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-basic-raw-free-ts',\n  origin: {\n    type: 'raw',\n    url: 'https://jsonplaceholder.typicode.com'\n  }\n})\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Everything OpenAPI',\n  slug: 'test-everything-openapi',\n  origin: {\n    type: 'openapi',\n    url: 'https://agentic-platform-fixtures-everything.onrender.com',\n    spec: 'https://agentic-platform-fixtures-everything.onrender.com/docs'\n  },\n  icon: 'https://storage.agentic.so/agentic-dev-icon-circle-dark.svg',\n  readme: './readme.md',\n  toolConfigs: [\n    {\n      name: 'get_user',\n      enabled: true,\n      pure: true,\n      // cacheControl: 'no-cache',\n      reportUsage: true,\n      rateLimit: { enabled: false },\n      pricingPlanOverridesMap: {\n        free: {\n          enabled: true,\n          reportUsage: true\n        }\n      }\n    },\n    {\n      name: 'echo',\n      examples: [\n        {\n          name: 'Example 1',\n          prompt: 'Use the echo tool to say hello.',\n          featured: true,\n          args: {\n            message: 'Hello, world!'\n          }\n        }\n      ]\n    },\n    {\n      name: 'disabled_tool',\n      enabled: false\n    },\n    {\n      name: 'disabled_for_free_plan_tool',\n      pricingPlanOverridesMap: {\n        free: {\n          enabled: false\n        }\n      }\n    },\n    {\n      name: 'pure',\n      pure: true\n    },\n    {\n      name: 'unpure_marked_pure',\n      pure: true\n    },\n    {\n      name: 'custom_cache_control_tool',\n      cacheControl:\n        'public, max-age=7200, s-maxage=7200, stale-while-revalidate=3600'\n    },\n    {\n      name: 'no_cache_cache_control_tool',\n      cacheControl: 'no-cache'\n    },\n    {\n      name: 'no_store_cache_control_tool',\n      cacheControl: 'no-store'\n    },\n    {\n      name: 'custom_rate_limit_tool',\n      rateLimit: {\n        interval: '30s',\n        limit: 2,\n        mode: 'strict'\n      }\n    },\n    {\n      name: 'custom_rate_limit_approximate_tool',\n      rateLimit: {\n        interval: '30s',\n        limit: 2,\n        mode: 'approximate'\n      }\n    },\n    {\n      name: 'disabled_rate_limit_tool',\n      rateLimit: { enabled: false }\n    },\n    {\n      name: 'strict_additional_properties',\n      inputSchemaAdditionalProperties: false,\n      outputSchemaAdditionalProperties: false\n    }\n  ],\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        },\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 0\n        }\n      ]\n    },\n    {\n      name: 'Starter',\n      slug: 'starter',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 999 // $9.99 USD\n        },\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'tiered',\n          tiersMode: 'volume',\n          // free for first 1000 requests per month\n          // then $0.00053 USD for unlimited further requests that month\n          tiers: [\n            {\n              upTo: 1000,\n              unitAmount: 0\n            },\n            {\n              upTo: 'inf',\n              unitAmount: 0.053\n            }\n          ]\n        }\n      ]\n    },\n    {\n      name: 'Pro',\n      slug: 'pro',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 2999 // $29.99 USD\n        },\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'tiered',\n          tiersMode: 'volume',\n          // free for first 10000 requests per month\n          // then $0.00049 USD for unlimited further requests that month\n          tiers: [\n            {\n              upTo: 10_000,\n              unitAmount: 0\n            },\n            {\n              upTo: 'inf',\n              unitAmount: 0.049\n            }\n          ]\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-fixtures-everything-openapi\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/fixtures/valid/everything-openapi\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"start\": \"tsx src/server.ts\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"@hono/node-server\": \"catalog:\",\n    \"@hono/zod-openapi\": \"catalog:\",\n    \"hono\": \"catalog:\",\n    \"restore-cursor\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/readme.md",
    "content": "# Test Everything OpenAPI\n\nThis is testing **readme rendering**.\n\n## Misc\n\n- [ ] Item 1\n- [ ] Item 2\n- [x] Item 3\n\n---\n\n- _italic_\n- **bold**\n- [link](https://www.google.com)\n- `code`\n\n## Code\n\n```ts\nconst a = 1\n\nexport function foo() {\n  console.log('hello world')\n}\n```\n\n## Images\n\n![Image](https://placehold.co/600x400)\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/exit-hooks.ts",
    "content": "import type { ServerType } from '@hono/node-server'\nimport restoreCursor from 'restore-cursor'\n\nexport function initExitHooks({ server }: { server: ServerType }) {\n  // Gracefully restore the cursor if run from a TTY\n  restoreCursor()\n\n  process.on('SIGINT', () => {\n    server.close()\n    process.exit(0)\n  })\n\n  process.on('SIGTERM', () => {\n    server.close((err) => {\n      if (err) {\n        console.error(err)\n        process.exit(1)\n      }\n      process.exit(0)\n    })\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/lib/db.ts",
    "content": "export const db = new Map<string, any>()\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/custom-cache-control-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Custom cache control tool',\n  operationId: 'customCacheControlTool',\n  method: 'post',\n  path: '/custom-cache-control-tool',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerCustomCacheControlTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/custom-rate-limit-approximate-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Custom rate limit tool (approximate mode)',\n  operationId: 'customRateLimitApproximateTool',\n  method: 'post',\n  path: '/custom-rate-limit-approximate-tool',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerCustomRateLimitApproximateTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/custom-rate-limit-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Custom rate limit tool (strict mode)',\n  operationId: 'customRateLimitTool',\n  method: 'post',\n  path: '/custom-rate-limit-tool',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerCustomRateLimitTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/disabled-for-free-plan-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Disabled for free plan tool',\n  operationId: 'disabledForFreePlanTool',\n  method: 'get',\n  path: '/disabled-for-free-plan-tool',\n  responses: {\n    200: {\n      description: 'OK',\n      content: {\n        'application/json': {\n          schema: z.object({\n            status: z.string()\n          })\n        }\n      }\n    }\n  }\n})\n\nexport function registerDisabledForFreePlanTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json({ status: 'ok' })\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/disabled-rate-limit-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Disabled rate limit tool',\n  operationId: 'disabledRateLimitTool',\n  method: 'post',\n  path: '/disabled-rate-limit-tool',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerDisabledRateLimitTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/disabled-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Disabled tool',\n  operationId: 'disabledTool',\n  method: 'get',\n  path: '/disabled-tool',\n  responses: {\n    200: {\n      description: 'OK',\n      content: {\n        'application/json': {\n          schema: z.object({\n            status: z.string()\n          })\n        }\n      }\n    }\n  }\n})\n\nexport function registerDisabledTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json({ status: 'ok' })\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/echo-headers.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Echoes the request headers',\n  operationId: 'echoHeaders',\n  method: 'get',\n  path: '/echo-headers',\n  responses: {\n    200: {\n      description: 'Echoed request headers',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerEchoHeaders(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    const headers = c.req.header()\n    return c.json(headers) as any\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/echo.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Echoes the request body',\n  operationId: 'echo',\n  method: 'post',\n  path: '/echo',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerEcho(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/get-user.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Gets a user',\n  tags: ['users'],\n  operationId: 'getUser',\n  method: 'get',\n  path: '/users/{userId}',\n  request: {\n    params: z.object({\n      userId: z.string().openapi({\n        param: {\n          description: 'User ID',\n          name: 'userId',\n          in: 'path'\n        }\n      })\n    })\n  },\n  responses: {\n    200: {\n      description: 'A user object',\n      content: {\n        'application/json': {\n          schema: z\n            .object({\n              id: z.string(),\n              name: z.string(),\n              email: z.string()\n            })\n            .openapi('User')\n        }\n      }\n    }\n  }\n})\n\nexport function registerGetUser(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    const { userId } = c.req.valid('param')\n\n    return c.json({\n      id: userId,\n      name: 'John Doe',\n      email: 'john.doe@example.com'\n    })\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/health-check.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Check if the server is healthy',\n  operationId: 'healthCheck',\n  method: 'get',\n  path: '/health', // Hint: at GET /v1/health\n  responses: {\n    200: {\n      description: 'OK',\n      content: {\n        'application/json': {\n          schema: z.object({\n            status: z.string()\n          })\n        }\n      }\n    }\n  }\n})\n\nexport function registerHealthCheck(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json({ status: 'ok' })\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/no-cache-cache-control-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'No cache cache control tool',\n  operationId: 'noCacheCacheControlTool',\n  method: 'post',\n  path: '/no-cache-cache-control-tool',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerNoCacheCacheControlTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/no-store-cache-control-tool.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'No store cache control tool',\n  operationId: 'noStoreCacheControlTool',\n  method: 'post',\n  path: '/no-store-cache-control-tool',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerNoStoreCacheControlTool(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/pure.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Pure tool',\n  operationId: 'pure',\n  method: 'post',\n  path: '/pure',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerPure(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/strict-additional-properties.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Echoes the request body only allowing a single \"foo\" field.',\n  operationId: 'strictAdditionalProperties',\n  method: 'post',\n  path: '/strict-additional-properties',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({\n            foo: z.string()\n          })\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body',\n      content: {\n        'application/json': {\n          schema: z.object({\n            foo: z.string()\n          })\n        }\n      }\n    }\n  }\n})\n\nexport function registerStrictAdditionalProperties(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    return c.json(c.req.valid('json'))\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/routes/unpure-marked-pure.ts",
    "content": "import { createRoute, type OpenAPIHono, z } from '@hono/zod-openapi'\n\nconst route = createRoute({\n  description: 'Unpure tool marked pure',\n  operationId: 'unpure_marked_pure',\n  method: 'post',\n  path: '/unpure-marked-pure',\n  request: {\n    body: {\n      content: {\n        'application/json': {\n          schema: z.object({}).passthrough()\n        }\n      }\n    }\n  },\n  responses: {\n    200: {\n      description: 'Echoed request body with current timestamp to not be pure',\n      content: {\n        'application/json': {\n          schema: z\n            .object({\n              now: z.number()\n            })\n            .passthrough()\n        }\n      }\n    }\n  }\n})\n\nexport function registerUnpureMarkedPure(app: OpenAPIHono) {\n  return app.openapi(route, async (c) => {\n    const now = Date.now()\n    return c.json({\n      now,\n      ...c.req.valid('json')\n    }) as any\n  })\n}\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/src/server.ts",
    "content": "import { serve } from '@hono/node-server'\nimport { OpenAPIHono } from '@hono/zod-openapi'\nimport { logger as honoLogger } from 'hono/logger'\n\nimport { initExitHooks } from './exit-hooks'\nimport { registerCustomCacheControlTool } from './routes/custom-cache-control-tool'\nimport { registerCustomRateLimitApproximateTool } from './routes/custom-rate-limit-approximate-tool'\nimport { registerCustomRateLimitTool } from './routes/custom-rate-limit-tool'\nimport { registerDisabledForFreePlanTool } from './routes/disabled-for-free-plan-tool'\nimport { registerDisabledRateLimitTool } from './routes/disabled-rate-limit-tool'\nimport { registerDisabledTool } from './routes/disabled-tool'\nimport { registerEcho } from './routes/echo'\nimport { registerEchoHeaders } from './routes/echo-headers'\nimport { registerGetUser } from './routes/get-user'\nimport { registerHealthCheck } from './routes/health-check'\nimport { registerNoCacheCacheControlTool } from './routes/no-cache-cache-control-tool'\nimport { registerNoStoreCacheControlTool } from './routes/no-store-cache-control-tool'\nimport { registerPure } from './routes/pure'\nimport { registerStrictAdditionalProperties } from './routes/strict-additional-properties'\nimport { registerUnpureMarkedPure } from './routes/unpure-marked-pure'\n\nexport const app = new OpenAPIHono()\n\napp.use(honoLogger())\n\nregisterHealthCheck(app)\nregisterGetUser(app)\nregisterDisabledTool(app)\nregisterDisabledForFreePlanTool(app)\nregisterEcho(app)\nregisterEchoHeaders(app)\nregisterPure(app)\nregisterUnpureMarkedPure(app)\nregisterCustomCacheControlTool(app)\nregisterCustomRateLimitApproximateTool(app)\nregisterNoStoreCacheControlTool(app)\nregisterNoCacheCacheControlTool(app)\nregisterCustomRateLimitTool(app)\nregisterDisabledRateLimitTool(app)\nregisterStrictAdditionalProperties(app)\n\napp.doc31('/docs', {\n  openapi: '3.1.0',\n  info: {\n    title: 'OpenAPI server everything',\n    description:\n      \"OpenAPI kitchen sink server meant for testing Agentic's origin OpenAPI adapter and ToolConfig features.\",\n    version: '0.1.0'\n  }\n})\n\nconst port = process.env.PORT ? Number.parseInt(process.env.PORT) : 3081\nexport const server = serve({\n  fetch: app.fetch,\n  port\n})\n\ninitExitHooks({ server })\n\nconsole.log(`Server running on port ${port}`)\n"
  },
  {
    "path": "fixtures/valid/everything-openapi/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"*.config.ts\", \"src\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "fixtures/valid/metadata-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Metadata 0',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  icon: './agentic-dev-icon-circle-dark.svg',\n  readme: './readme.md'\n})\n"
  },
  {
    "path": "fixtures/valid/metadata-0/readme.md",
    "content": "# Test Metadata\n\nThis is testing **readme rendering**.\n\n## Misc\n\n- [ ] Item 1\n- [ ] Item 2\n- [x] Item 3\n\n---\n\n- _italic_\n- **bold**\n- [link](https://www.google.com)\n- `code`\n\n## Code\n\n```ts\nconst a = 1\n\nexport function foo() {\n  console.log('hello world')\n}\n```\n\n## Images\n\n![Image](https://placehold.co/600x400)\n"
  },
  {
    "path": "fixtures/valid/metadata-1/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'Test Metadata 1',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  icon: 'https://agentic.so/agentic-icon-circle-light.svg',\n  readme:\n    'https://raw.githubusercontent.com/transitive-bullshit/agentic/refs/heads/main/readme.md'\n})\n"
  },
  {
    "path": "fixtures/valid/metadata-2/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nconst icon =\n  'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDkiIGhlaWdodD0iNDkiIHZpZXdCb3g9IjAgMCA0OSA0OSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxwYXRoIGQ9Ik0wLjAxOTUzMTIgNDguMzU5NEg0OC4wMTk1VjAuMzU5Mzc1SDAuMDE5NTMxMlY0OC4zNTk0WiIgZmlsbD0idXJsKCNwYXR0ZXJuMF8yNzc5XzIwKSIvPgo8ZGVmcz4KPHBhdHRlcm4gaWQ9InBhdHRlcm4wXzI3NzlfMjAiIHBhdHRlcm5Db250ZW50VW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KPHVzZSB4bGluazpocmVmPSIjaW1hZ2UwXzI3NzlfMjAiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMDYyNSkiLz4KPC9wYXR0ZXJuPgo8aW1hZ2UgaWQ9ImltYWdlMF8yNzc5XzIwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFLQUFBQUNnQ0FZQUFBQ0x6MmN0QUFCV1BrbEVRVlI0bk8yOWQ3d2RWM1gzL1YxN1pzNDV0NmwzMlhMQnhoVU1Cb3pwdlJNSGNBeCtTU0E0aEJKQ0NnbWhCQktNZ2ZCQUlFQW9lU2pCRUFpUWdDRVFnazJDalFOdXVPS0tqVzFrU2JhNlpFbFg5OTVUWnZaNi85aGw5cmtTWUZsSDkwcFBzdnc1dmtkblp2YnNtZm5OYjVXOTl0ckMvOG9EbHUzbmYrSEY1ai8rNDdIbWlVLzZQUER6MmU3UC93dVM3L3JvMzg5Mkh3NFowYXN1LzAzNXh0ZC8xOTUvLzhQNHkzZStDN2gydHZ0MHFFdHVIL2J3MmU3RElTUFp0VmMwVzBCMThRK2VQN2xtN1duWkdTODZUODc0alg4QXl0bnUyNkVxdWNteTJlN0RJU04yOGZ6N3JZSG04cVhJMnA4dm12akloLzZlblR0UGF6ejFhVzhIN3AzdC9oMktrcHQxOTgxMkh3NFpLUmN0V1ZzQnRJWm9QSDBWNXI1N0dmL1NwMytuKytQTEhwYS80NTEvQmx3eXkxMDg1Q1MzVm1lN0Q0ZU01R3ZYYnFpR1d0amRrNWo1SzhrUFYrWXUyY0Q0VGJlZTBqNzNiZDlxUGUwRjc1V3pYdkpSb0RmYmZUMVVKSmNsaTJlN0Q0ZU0yR05QMktRampXNjE4LzZHYWErRXhZc3hoOEdjNGMzc3ZtUE5uUGJYUC8zQm90ZCtkT05KVDMwTHNHYTIrM3NvU0c3V3JaL3RQaHd5MGozOUNmZkovTkhkZHZPdUJleWFoR3crTkJjZ1k4TFljWnN4Qzl0TS91Zm5YNnBYWDNsQy9vN3ozZ1JjUE50OVB0Z2xyMXBEczkySFEwZkc1bXhnd2RJTkZlc1hNTDRiZEQ0MFdqQTBEMG9ZbWIrVjdNUkp4dGY5N0dIbCs5LzhyZGFUWC9KdWVmbExQd3BVczl6emcxWnlPZUt3MmU3RElTUEZ4ZisxMjdiR05wWndrazVPSU4wdVpFT1F0MkJvTGxob2xWdVJWWlBzM3JwbXJQMnR2LzlRdzVRbjVzOS8wZHVCemJQZC80TlJjdGsxT2R0OU9IVGsyRlBhZXZoUE5pbGdPMjJ5OWhTMFdtQUtLSUNXUXFVMGR4bXlCUk9NajFSMHZ2dngzK1A2cXg0bTUvN3RId0RYemZJVkhIU1NWL24veGdIM1NWYXUzQWhnZTEyeWRoc0tCV05BQ3NpSFlBaXdobnhjR0N0Mk0zR0UwdGx3eldPeXYzN0RkeHF2Zk5OZkFGK1ozUXM0dUNTWHUrNmM3VDRjVW1KWEhMRkZnYXF5Rk8wT0RKV1E1eUFDV1E2TkliQ0FoWHhTR0czdnhxeXdURzI3YlVYbi9YLzZ4ZWF6WC80d2U5NTd6Z09tWnZsU0Rncko3Vy8reG16MzRaQVM4K20vMzFvTloxaXRvTmVCc2dlbUNTWnpBRlNCQmc2RUdESTFqRXlOWStaWFREWW04cW1MUHYrMmh1aXh4UXRmL0tmODcrZ0plWDdOLzVvbCt5Sm04N2FkZG5nWXErUFE3a0szQjdrRnlZQU1qSURCZ1ZBRkVBekM4TlE0WnFoazR2Q0t6bjk4N2t4dXZ2R294clBQZUIzL3d4TWFjcm51K3RudXd5RWwxZkVuN0tTVmQ2eWxxVlVQNlhXaFVoQ2NHaVp6QU15b1FhaUNTRVpyY2hjbTZ6THhFT2pjZDgycDlwdGJ2MTI4ODBOL0NueDlGaTlwVmlXdlRqeHh0dnR3U0VrNUlydWxtZlZra3FaYWkvUktxS3dEblRqR1F6d0xaZ0lOLzVzeGlCaWFrN3VRcXMza0t1aHNXYjNDL3VVZmZMSDEvTjgrT2p2cXlML0ZLKzcvU1pMbjkvMlBOMFAyU2FvVGoyMUxscGNxb0dVRlplVUFtSHNXSkFBdTk5K1ZDRXB4dnpjbWRpRGRLY3dpcGIxejg5RFVOejd4ZjFwUGZzbEsrNkVQdngyWW1NWExtM0hKdTJlZE9kdDlPS1JFN3JwcjBoU3RyZ1cwVXVpVlVGV2dHckhtZ0dpY1BTZ0NsTFdLRmdOaUtDWjJJTjBKWks3U0h1b3grWk4vL2FQR1g3ZU9LRjc2MjI4RTFzM2VGYzZzNU5rdHQ4MTJIdzRwcVpZdGJ0Tm90bFZCcllLdHdLcjdtTEJYeW55WnN3Y2pBQU1UR3ZKSnczQjdOeWEzVEs1U2V2LzF4VFBrcmpzUGF6M2hxYThHZmpvN1Z6aXprdWYvZmVsczkrR1FrdkpWdjF1U0YyWEVtTFdnTm1GQThYdEtna1B2bUtoQTdyZjcvVElWaHRxN0VWTXhlUXkwMTExeEtoZXMrM3ArM29kZUExdzZzMWMzODVLWHA1d3kyMzA0dE1SV2dsb2hEQ0JaZFNDMDZrR29OY3VsS3RsbU5VTUdXMUVkRTVyYzBKcmFqVlE5NTV6Y3UrNFkremQvK2JYOGZSOTdBL0RObWIvSW1aUGNqb3pNZGg4T0taRWRPNXRVM1NZTmFvYXovcS82NUY2VitnQU5hbGRybXpBY3AvaTRvV0RFMEpvYVI4b3VrNnVndC9idXBmYVBmdi84eG5zL1BBZjR3a3hlNDB4S3pzNmRzOTJIUTByczZOQ0lsSk90eUlCNHNDa09iRmFtTVozZkZsUXk0a1pOY3I4aDdpT0lDTTMyTHFUc01uVWtkRlp2bk5OOTY1OStzbkhlK3d2Z3N3ZjYybVpEY2pyL095UzVMNUxkZGZkODdYVmJrb01nbnRYQzFyMU1ieENwbVRFNEpYaVE1dFNNaUZQZFlzVEZDcnNkNUNob3I5NHkzSDM3Vy82K2VlNTdDdUJUQi93Q1oxaHk2WFJtdXcrSGxyUzdLM1gzcm1GWjRnYlprS3dPUEJ1cFBkN0FlcEE0SnNFbzlCUnBjT0FzQ3FKTzFsR3dsa1pib2RlREk1WE9YZHRiM2I5K3g5ODFQdlNSSHYrUE1XSE84UEJzOStHUUV0dlovUkR0ZE1teXdJQVpaTWFOZUJUSmpocitKOU5VTVE2UTFyZ2Zzc3c1TUZuaC9qYlYyWXNvamZadXRPcWh4eWlkMjNjMGVkdGIvcTc0NUQ5TUF2ODhZeGQ4Z0NYWHNiSFo3c09oSThNallpNzZ6c1BMd3VIT2FPNVNzVm9HaHIwNkJwZUFiM0gySU9BODNnQkdqMElEcUttZGw0d2FvSVc2MEE3UWFJK2pWUStPaGU0dFcwWjUwNTkrTFB2U1ArMEEvbU5HcnZrQVMyNFhMWmp0UGh3eWtrMTBWdkdMV3g4dFE1QXBicml0MllBaHI0WmJBa3VCY1dDTCtKSGRvSVpKYkVWcXRhdytnUUdGM0J1RzJuQWd0QmF4RmMzT0JHUWxlaEowYjdoM29aeno2azgxMy9ENnM0RXJaK2pTRDVqa3hUWFh6SFlmRGhsUlV6eWwybmpQRWJJRU1qWFFhRUt6Z01JTnI2SEFBb0dWUUJOWWk1c2huRk96STRBSm95YmlXTEJTS0FWS0E1cUJMUndERmkzQUlsUTB1bE5vWHFFblFPK25xMWZKNXo3M3VjYmZmZVFzNEpBZXlzbzU4YVRaN3NNaEllV1J4K1RtdkxmOWx1MTBLWnBnVE81bXhCVzVTOGtQZ0NxQkZuQTBqdVhXVUlkbVlpd3d4QXVwblJkakhEQlZvVEkrdWJVQldrRmpCS05Lc3plRmpscjBPT2plZHVlSjhzbFBmb292bm44MnNIRTI3c2tnSk8rZDl1alo3c01oSWVhUy8zNk92ZXkvbnN0Y0tBUk0xb1JtQzFxNU13aURaMnR4SU15QW8vMThrVFU0WU9XaE5lOG1SMjhabDdvbDNqR3htYmNMclFlaEJWdGliRVdqNnFJTExlMVYwUDJ2QzUvU1BQZmM5L0tPdjNvdGgyZ3FWeTY5LzUyeSt1dWtYTEpvMkh6dGkzOVMzVDlSNUVzaGw4eE54V3cxb2Vtem9JT1JGMjVuaFFQVmtUaHNyaE9mc0tEOXRtQU0xeGpIaklYM2tLMXg2bGx5TitzdWI0R3R5TldpOU5DVnl0UTRkRC96ZjE4OXRIVHBuY0FIWnU2T0RFN3k3SE9mbWUwK0hQU1NHZk9tM245KzcxbTZHUElHWkZuaDJLK1JPZnN2cGwxSlhhak5aMkdSQVlmamdMY09yNDZUMUMxRFAzY0pMcVJUR3JDNVo4RWNiQU9LQ214SjNxdXdUVXUxU3Vuc2hNN25QdnYyNGgvUHZ4cjQ0WXpkbEFGSmJoLzMrTm51dzBFdHhjOXVlbVBuYi83bXI4b2NHdk9oeUFTazRaRFluSlpnb09xODJpcDR1T3BCS0xBQ3g0cjNVWU12SGFJTDM5WC91K2xCV1BsZ2Q1NkRGcEEzRVZ0UlZCM3NYTVVlQ2QxZnJKK2J2Lzk5NzVFdi9mT0xnSzB6ZG5NR0lEa0hZVXIrWkRNYnpucmRBamhnQTlVNk5sZGFWMXdwL0JMYnliUWFLeHZmdXVETjdTOS81UTNkM1RzYjJSR1FqM2p2MStRdVpOS0FxSHI3TWwrb2dRVE95elVDSzYwRDVLWmtYL1ZxT2ZiQ2U4YTV1dlpMNDJ4TXpkeDVzd2JrRmFhcXlDbHBMTEpVMjZENzR4ODlvZlc1ei80UjhLNERkTXNPaU9UeXVZTnZaR2Y0K0dOL0w5dXljU1h3OWdOMWp1NlRudmJFN0N0ZmZaMDk3ZlFMcE9yK09MdngrbTd2OTErM0tOK3c0YUd5K3U2bnlQZStjOWJrbFZjL3BFMkpXUW5aUERmNXpaZ2NpZ1lNNTA0RlkrTHNOemNSeVgrMzlJL3pWdXFZOERDZ3EzQy9WOFVoYmN0b0VyakdUKzgwTlF1U2VYc3dkNk1tV1VGZVZtaExLSmM3VlZ6Kzh6Kzkzbno3Mzc4TEhES3hOZGx4MDgyejNZYytLY2RHemRqYi8rSUhZaXZiZnVuTG5zVmVSL2ozVHpyUGVvR012djN0WCs5OTZoTm50cGZNNjVqNWkrL0pzbXdpTTdLVTdadVhWcHUzNTkxU3FlWkJ0Z0NLdVU0anR0UmdodWZBL1Btd1pBem1ESUZwT0dCb0JpTUdqaElYQXd4ZzZrczJ3SUYwWE9GT1lNcVBnT0RETDRUazF2Q3BvRnZDN2dvNlBhaTZVSGFoNmtCdkVqcVRWSlIwS2t0N05aUWJvUFhxVjM4VmVQbWc3OW1Ca2x3Kzl0SFo3a09mbU45OTVVbjV6MjUvdkYyMDRGWno2ODBqd081Qm55Tjc2TU1lWXkvOHpqUExCVkQwZGpUTnhoM0gyUzZVYldmdk13ck5NY2hHSVd0QmJneTU1RWhqR0laR29kVnc3S1RVcWZpS1U1dnBrQnJVZGlIVVFCekZCYXRYNCt6Q2tKb1ZiNEkvenVJWXRRWDBnbTBaMkxBQVUyQktTNTRwK1JLbDNBYmxCVjgvcy9HRkx6MEgrUDZnNzl1QmtOejh4aG16M1ljK01WZGU4Unl6WVdQVEhuN1ljUHRGWnc1eEFBQllmT2M3THlnM3JwM0xFc2liTUxweUlUUVhvSjB1ZERzSXBVc3NFSEdJekRLWHNaSVgwQ2hnVHVHZGdtRDcrVXlXbHRTcDk4RW1CQ0s0RkFjNEJSYXB1N0lOaVVjOG5ld0ZwN1piQWwyQm5vbVRtbHhhVjQ1b1NWWmE4aEVsWHd6bGZic2ErVGN2ZURXSENnRHROeStZN1Q1RTZYN2dnd3ZuZk9ydlg4cm9LTVpXbzlMSXg0QXRnenlIeVVibjgvM3Z2a0NiUUFOa0JBZWFKWXVRb1JFL0xGYTY2WmEyU25MNTFJVmNXcmprQS9Gc1pMd04yQkFZOVlpekNmcUVQY1Y2cGx5bWJoTG03b1E1TmFSS1V6c3BHVEFrMEVsWVVMeE5TSWFoSkROQ1BxYVVBdFhGUDNodTQ5T2ZmVHh3eFNEdjNZR1FQSHZweTJhN0QxR2FYLzdDS3h1MzNmNFlEanNNSmllSHpJWU5BODhWTTNldmY1cTk0NFpIeWh4Z0NQSU02SlN3ZXdLazZTaXhLSnc2VlorVklqZ25vWWxQbHlKSnV4ZG43NDBCSTlxZkJ4aXcxSmVJNFBmcDRjQzhYR0cxZXRENjdZSlAyU0xKa01HZHYrTkhURVJjR2xpZUlUMURwcFpzQk14Y3FPNWJQOFlsbDd5QVF3R0FYSEp3Rkhhdm52RFlVMGMrODlrM3NYQ3hWMjgyU2VRY25PZ2xGNytVM1pQR0xuWE9aSUdCckFrOUM1MHVrRG1WNitkcWtQbjArUVplTGVNbklQa0dMVzc3UFAvWEp1R1hCRk5SVmFkYXRnZk1BZWJqZUQ0ZEk0WUV1T0pWc1lISjFCWU1mdzNHQ3FaUXNsSG83WURxbHA4K3Mvem5mLzBnQnpDVU5RakpPMi8veTludUE3YlhYamJubGEvNFNOYnRIczZqRjhHV25XaTM2TmtGQzd1RFBJL1owVDFGcjc3c0diSUF0QW1GQlVNQlJSUG1aSTdGc3BDcGdrK2JGd2Vza09sY1VhZlpLdzV3ODlVQnlaZGwyMk9vTFlDV3NDMUJvU2dzVk5paDBNVUJMVXp6VEdPRjRQclJFcmRmbU9UdUFTaVZrT1ZDTnFMME1xaHUrdW5KalI5ZThrZ084cW1kZWVPSHM4dUFVODk5MXZEWU84LzljT1BHbTUvTTAwK0V3eFIyV0d4SGR0SHA3QnJrdWVTNzN6dURUZmNzMG9lNjU1cFg0cHlLdVFVc05TN1dJbmltU20wNHFSMkl2bEVMWUZoaGlYYyt5bVM3Sm13MkhaQ3A0MUlxRENuTVU5aW9OUXVHZmVOM3JaazRtZ0NKR2FEaWttMkd3SXlBM2JSdFdGZmYvV2dPZGdEcTZydG43ZVI2eXZGbXpodi80UDNOQ3k5K09ZOC9GbFlheHlCVmhyVGJPMXBmT245ZzlZTTdiejUzbmw1eitRdGxEbWdMOGtuSUVKalRoQVc1TXdiVjFBZUkwaGRrVGxVdTFNQmFMTTcySzFQR0l2MHlqYzJZQmpMeExBamNqNDhOQmlEYXhBbnl4elhVbVFMZDBMeUpYcmRZRjZjMlExRHVBbnZyTGFjTzZ2NGRLTW50cmJmTTJzbWJhKzkrVi9QYkYvMHhweDBEUjdkY2tSOXJZTEtEWFhiNHh1cUVrd1pXcUNlNzZEK2ZxYmRkK1JoZENWSkJYb0ZwWkRDL0FhM0NwVURoUXh4R0VvWkp3S2ZUUGd1QkJmU3paY3ArNlRodlVObXBxTjlvZ1dGZ0VYQ3YxQWtMS1hXRzBFNEl5MHhCeW9DQ0lGYWNmOUx5SjdyNzd1UDR6UG56Z0IzN2QvY09uT1M4OVoyemN1THMwb3YrdVBYT2QvODFKNitDazhaY2RZR3VPTnRtNTA3S3h6MzlubXoxbW9IbGlwVnJOcDlGMlJiR0JObWw1Q293V3NCb3c2VTdhVWFjUkQ0ZGVPbG9zZUpVN1J4Z0NiWHExWVR4OWlveXJTRnErODU2eGx1Z2NML0NMby93NEEwSGdLdHhiMDlMblczYXB0OVQ5blV5VGRQOXM5cXcvdkJzNTQ0VkhOUUEzTGxqNXMrNmMrc3poai80ZCs5bXhVSjR4RUtuTzlwK1c2K0NqbEllZGZUQVVzMzF5Qk1lbzMvNHFtZkxDdEJTeVN2SUdnSnpHODRHSkNTVWVzK3lyN0lCL2YrdWdCRmNka3NMRnpmVXNPUGVUcDdTWi9wN2JMd0dkUU1Id3ZGa3Uyci92aGJQZ2o2R21Kb0lRWE0zZ1NHd3UzYU5OWDV5MVFvTzRyVDlQUHZKVlRONnd1NXpucmwwN00vLytIMW1hbW9lVHo4YUdoVzB4UTlKR2JoL0Fqczh1bE9QUEhKZ3BWdmxPLy94SXQxMTd6eGRCWXk3RUo4WnpXRzA1Y1p5Q2ZaZk9ySmhuQ3BNd3lvVkRpVExjZFh3eTZDTDJmdG9SblJFRWtiYkE0LytSOFV4NFJ6Y0RMc0o2aUU1alkzWDV4bkNCYjg3aVJyMlpxTmtMcVNwdG1yWm45KythSC92MzRHVTNQNzg5aGs5WVhQRHZYOVEzSHo3WTNuR0NTNTgwY1k5U092VjMrWnhxbVVyYjJLNE5aaTNkdEVSeSszMTUvMG1DMEZWeUhwS1h1QlViOUh5aFNROUFBUFRoVVNDRURwUi80SVluTm9kSldHK1JGTFBONDNsQlFraG1wVGRnZzROWTc5Tm5FYzhrYlFYWTQ5Sis1bXdSMzJhWUxBWTM4Nk9DV2dPemQzM216WnprdE9jdWFXNjlLbFBPcTd4bHJlZHc1RUw0WWlXUzB2cVNtMTc5U3hzMmtIdmVVLzlZZkd0Znh1SUE5STk5VW5QbExYWG5hVEhBSlBxMkcvSXdGRGhKdjZFeWdaQXpPRkw3U3JSMm5SYmpITTYwa0IwL0xzWDVvc3h2T25icG9FM0JSYkFtRHFhRHRuVmdaV2pBK1RadEFodGhmQ1IzKzZMcEV1blFwZXRHTjIzT3phemt1dXlGVE4yc3V5blAzMXh0bVhqS3A1M3ZMdWh3WWdHOXphdjIwRWxyVjNkcHozOWU0TTRuNXh3YWk1dmUvTlpOQ3prZ25TVjNJQVpMdHlNTmxPNDhkU2dmcVBIbWpRU1ZPTjhnY1hUZ0tMSlR0TkhQL1pxRTZZcU9kMG5PYkhWYU1PeGt3VEVKT3JZSDF2Z2dOcldHdFBCRHN6OHY2Y21EK3JGQUhPbVptYXBMdnZDNXcwMTMvR09aNW5GVFZqUVREdzRkVDVBWmVDMmUraysrYm5mYmY3YnQzOHlpSE4yUjVlY3J0ZGQrblJaQ3RwUmNndFpTMXc2VlZZNDlSdFVieWIxeXhCdE9hOTZoNEZsRHNReG15VUdyS2VmTlFIakhraE8yeWNKejZTcUZoZHdIcVgyWFRVNXlDWmd6SEdUbUlJbm5Xd0tlYTZLSHRSTFllWDZLME1IZ3hPemVmTkRzenZ2ZkNSSHpuTVB2WmZjOU16QTdWdW9iSE5YKy9kZS9YOEhkVTc1M2c5ZXlOUzJrZkF3YzhDME1wZlJiQXBpcGFvUWVnbXFMTTd0OEd3VW5ZN1E4aThCSHZoaHZMM1poOU8rVE05NlNYOVhkZWN6NnUwNnJTdnhoNWNpbUExNVlxY216UWJuV0thNkIvVjB6VnltQmpyYytrc2x1L2cvVDhoc2R6N3o1dmZiTnJtQmJUMjRkUjJkbDUzOTJlYS9mUFhIZ3poZjkvZi9lSkg4NlB2UDFVVmdTekJoUmEyV1Q2blBmQ1l6Zm9FWjYwY2sxR2VhV0hHYmx1STgwNUxFMDUwK3RwYjhwZy9naFU1M0NWa3ZKRUN5UU5NNkc2OUhQMlAyTWFGMUlhekFnSDZmWUZHNDhjYnNvSjUzbXpORGl4WGFlVXVYMFp1RW9hWmpGbkFQdUMxd3pTL29Ibm4wdFoxWG5mT1JRWjNQWEhQdGsvVytHeDh1aDRGdHU5bU5waVhRekIzd1RFWk1hNHBwOHltSXhEa2NDK2hYelgzNFNobHMrclprLyttZ1RHc0dwa3lZN2xiNEVZOXhXOWNndEVxZHJxKzF3K0hIbGZ0TXhIQkpjK2UxT1lnbForNjhHVG1SN055NlRLaWdrZGMzcnNyaHhuV1VKdDgrOVZmdmVJdFpmKzk5QXp2aFZaYzlEenNsMmdTWjhobFdROGJsK21VTlovOEY4TzB4OGlIT0UxMFMyR1p2SjlEK3I2STFTS2JIL1BZNExGSFJlL1dHMWQyZmtBMlpwdjByeEdFNXFMT3lRcnYrM0tyQVVJWnMzalQrNjI3VmJFb3VtemZOeUlteW5WdkdwTWhjQmpHNFNkZTNicUZhczBuYjczdjN1ZG02dFQ4YzFMbjBoTWNzdHpmKzVFa3kzeVUxRy9VUmx6eHpnZWNzcHg3NU1QMzJXVmhzY0RGdTREK0daQkthaTErbmdUQjFvZmZ3aHZmQ2N0RmcwL29jZ2QweWRRRE1jZUdxQU5wd3p1REFHZS8yK2ppbEJ2Q1Z3UEF3T3I1ajRGTWFCaW01anUrWW9WT0owQ3g4R1FzRGQyekgvdnhlMnE5Nitidmt6anMrUHNnelZjTkxIOHUyTzQvaGNLRG5BVmlJWTE4VGlnbUZpbFlKc0lJVHNnQ1hHOWpIZk5QQkJuc01iYVNzQkh1M0IwWFp3d0daN2cwcmRiSEtRbDNFSUxaSnZ4b1c5MUd4TlVIaStpNUltUzFZZkhBellMWmc4Y3ljYWRmMmlxYWYzSFBIL2RqYjc2WHpzalBPTSsycDl3ejhYTGZlK0VSNms1bTJRSGM1SjlzVTRyd1FFOWd2dUlsQ1NseU1xc3R1RnZybjZhWVNWRzc0Unh3Tm0yWVRCbkNsSUlzZWJ3SzI5Q1ZJNDRFNXpnc2ZUN1pwMGxaZzNVejlUMW9QQy9kQThrYWJZNDY5ZjE5djMweEt6akhIenN5WjdyeHRpcXdKYXllb2ZyYWV6cG0vOFc3ZzNFR2ZwdmZTM3h2aGI5NzFHT1k1a2pEVzJYOVMrRUkvNHRmMU5YM0drL3RUNE5qUGxlVWpib2lHdmQ4L01SdmpzWkNBMHU4WDdiYVU3YWJ0QXo3YzRwRWFBQ2JpZm05NG5WcjVZMjBZdXFOZUpNY1hQTklLRjlaVW9BMnlmTUhPM3VtbnpZeU45U0FsNzUxKzJzeWNxTHQ3SytPS3ZlVmVPczkrMm50b2Q4NDlJQ2VxN0NxMi9PSUVocW1YYU10dzRaNHM4WDZqbTVpdzRCeHExUnR0dW1scU5qRFlOUHc2a2VpUjFrQ2F0ajBjTUQzRks3VUZ4ZHVDNE9OOGlZMG9DUmpEUG9FeFJiQis2RkI2a00xZHNGa3JlMURYaXNtbG1wazRaYjVtelFTN0p1Zys1NWtmSzEvd3ZIY2RzQlBkZVBQRG1kaTRtRVdnSFdMOVJ6Zm1teVhoRisrQWhEaGNDMWZkTktObW94QlVUaVVBcEc5VHNNV2tCbHhmSm5NUzNwR0VIVVA1RHNYM0tRbXY5QjJiVUcwYWlvbW5keXJZaWtiQ05SYk1uTGtiNWRwcloyYW82MEZLbmw4N013dDI1N2YvUEdzLzcza1hUN3ovZys5aWo2YzZPTWx1L013cHROc3V4dHoyenpVVEJ6emp2ZkFzeFA2a1pxbDV1UGtkNmNEK0x4UEZneWRSeDZIeWFXRElsUDNTTEpnQVlJdnpkUGQ0LzZleG5abDJiTi9IZ3EzUVVoMGVnOG92SFFPYTVjczI4cU1menN4SXc0T1VYSDcwd3hrNTBlUnJYL3Q5aEV2ekcyL1llU0RQSTdmZmRKU09nWnVrb3c0WEJtTEl4WmlFVmZ6REhsYVlHNEs5aVJyZFk4UWpnRFBZYnRUL2pxQk43TDBBbkQ0UE5qU2w5YllJYU45b09pdXVMeUUxNlV0b3AzSXFXWTJndmgvYWc2d0MrNUJqRDJyN0R5QzNENWtaSjhSY2Q4TWRlL3U5OThwWFN2R2YzMi8wSHZISUh2dFpadGFzMnpES2xrMnJwQW5XUDBBMzJCRkdQSUxxVGV3L0E4d1I1MjBtcGw3OEl0TkFtRG9nU1JMMUhxUSszUk5XaUdYWWROcnZhUnd3Z2t2cUJJUG9xWWNERXh1eEVqKzBxUzRHS0xqUVV3Tk0zdGpud0g3bkdVOCt6aTVmc1owQlY2VDRaWkozWHZYS21UalBMNVhHWlplZmxmM0xWMTl2NTR5OUgvaXYvV21yT3ZYMEJkbmsvU3ZJcUFzYUJBQkc1NFAraHorTWN6d01qazFrR3BEQ3FFUUFtZUJVZUdDMVZGMEhObVBhdHNCd1NGMkNJNEFyL0o0eWEycjNLZFQwT00zdFZuWEp2RldkVXFJVzZJQVpHU1hmdE9IK2ZiaDlqTC9ubmEzaGozLzBrMnphdVFaNDliNGMrMkFsSC83UWgyYmlQSHVWOHVuUFBIdjRyWC8rV2RhdEg2MU9lL2dON0NjQWpTMlcyZmEyQmN6RkIySnJvcXZIZmNQZUhteStSRWZOdmNuTWN0bkx4MEM5VUtIMjR5SUYzQjYvSjJvVC9NdzcvNDlzMmpIVHd6c3BHRk1kWVhIc1p3WHdnZWdLcEFzeVhQVHNZY3YzQ1lDTk5UOXI1ZXZ1WE1wbnYvYU05ajkrK1p2TXdHSTRlWG5xeklSaDlwQWpWNTNhZXMzdmZpRHIydEZxMVJKc09iWGZkV0RNelRjdmtxbzloRi9kb043Z3Axb0creStvdUJZd0YvZDgwMG5ucVVmYkJ6N1BZR25BdWU4VGdLdlQxb3p6NTR2aEUrcjVKbW05NkwyaDJSZ1AzdVNOc2w3WEt0RERCYUNEZUNlRVZ0RzFTNWZzMHpCYzY5S0xyVm0vWmNKYTBLOS83WStyQ3k2NG1IcTYyQUdSdkR6N3JBUFovbDdGZG5WazVIV3ZmSi9ldFhxVlBPR0pWSGZjakJiRmZxY04yZlgzelJYUkloS1lBV1BTQndwOXM4aEdjYlBMMHZLNDA5a3NxTVBna1ladFdjcVM2b0VDb0g1YmF1aFJPeHlWQjQrbzY2RFZmdFV2QnFqcXVjbVYxbjFPRXljUXQ3aE5OM1JCSXJqVmd1UU55K2pZUG5uQWV2a3QydHU4eFdaTEZ5RS91dlRaNWw4dmVDbndUL3ZTeHI1S2J2NTE1c3V6TmUvZjhvZjY5WDk5cmpsOEJiU2E2T1E0VWpUMmU4elN6R21PYVdjeTJtS3ArOUEzbWhFU0RzWThDL1h0N01FUmF6d0h1NCs2Ymt4UXhSRUxucVZrZWp0UVp3ZFF0NVAySmJRZjhScGVFSFY5Sy8zTElvWjZiVGwvZkErbzNLVDB0QjBCc0pYUW5vb3JrendRNlQ3cE9ibTk3dGFoa2N5UW9aU2YrOHhyekxmLy9WdjR3Y0FESVRtLzhSc0hxdTI5eTdxMXA4ci9kOFlmMndxSzVTdWgxNk9xTEpJMzlqOWd1bkRPWExwbFgrVzArR1JEdFN0d0Q3ZUZHK3lQd2VGRWZWTC9FMUUzR3BGTEhkV09BRXhVTmREbk1RZG1SUHJMZVFUYkUzeTJjOTlyNHJhSFNWb3Ezc05OR0RCNDhXcDg3ZWk2MzRHd05RT2RhcmV5WFR2bTdjdnQ2NTMrcElWMEpwZlFnSHpGQWlZdnUvU0oyWVVYbnNFQlhKMHpsd3N2UEZCdDd5SDJTVTh6emYvejNyZjE3cmg3NWRDQ1lWZzJIOTI2M1kxaHlnQnFzVTJPRDBzWUMwMGpLTlBMYkJpYytzM0Nqc0daU05ScVdGQW1naTRBa0lUOVRBMjA2U0FNNElQYTRRZ2hHSlc2Tm5RcE5aaURYUmNXdmxGeHBVcGllOFlsVTlqS29TeVdFNUVheG41R0hOdnZ6eTNtaUgyNWZYTGROWTlnemJybFBQUndpcm5EY0FmWWYvckNLNHAzbmZjTjRJQXNMSjFuUngxOUlOcmRxOGpsLy8zUzZ2dGZPMHNhVU15YkIwdGJzTFhqTUZDVjV0YzI4R3VrYWcwTjllVjNoOWhhYXR1RFN6b1kxaHFwVnYxRFQ0ejVNTElReXJNWjY4TXZnUUdUZHZ0WWtGcVZCbkNHbUY0NFJaallGTUNzZ2Rsc3pYeHgyYTV3emdUNUpnZXBnQ3ltbDBrcGlHZEJXbEJ1aDlhMVAzbmE1UHMrOUtuK0MvdmxrbjNndkdmSnJrcXlwZk9RWWNVTVEzbkZqNTZTcjF2N1JPRGlCOUxHdmtxdTY5WWVpSGIza1BJeGoxOVluUHZtUCttMWxaYUFMSjhEWXhtWXlwczdkbVIvejJIR2Q0NXE4RDVKL2tiMlV6ZTVwMlZkY1VCTjJDVVd4QXcyRjM3V0dVNEZCNUQxQlorcEFUZzlWZ2hFV3lCTUpncmVyL0dnajBXTkFsMzc4ZURBb3RiRUpJTzZKTEJmUnk0czRXVjZZRnlaWHFQcWZLRW1sTU9nMzcvd3VjMFh2T2hwd0srdHdWY2VkY3hqN0FVWHZMZ3hEMlRSR0xSM2tDMkVjdDN1bHYzSlZjL2pRQUhRemxCcGp2ek91ODZ4MTE1NnVoUlFOQXBZTmdLRklFUEczZC83N2x1NnYrY3drektxR1dpZ21tQnVoV1RQTUx6VjhodGlxcnNtak9iUkY5YjhDRXV0cGlwWUVtQ2w3Q29rLzZBZmVJRmhJMk5hOTN2bXp4MUdOdUw0dExjZFF4OGxmTS85ZGZneXdvMEtxaElwZTJSV3lVUXhEYWptUVhmajVwSFdCOTcvd2ZJOTczOFo4RXZyOEZXSHJaclBYLy9sdTNYTitzV04weGJCeUREczJvaVo0OTVSZThWbFR6UG4vOU44WEFHNWdVck9hMTQ3NkRiM0VGbXovbWg1NXgrK3ByTHVlZWJMV2pDbjVXN3dhSTQwZ0h2dlhXWCs1RzNEd0lOeVJzdzltMFcvOC9VUjlRU0JyYldZQTQ5bnUxQnJ1VThwQmVlRSttRUg5Z3ZPUzB3MlNOUnduMnFYUHV5UlU5ZVBtUXJuazJTMEpIUHRHZitSakJnOUQ4d1lxbTVsdnU2R0NMSCtSbWFjZVZCNDI3S3laRk1UR0t1WURPeW9xL1BFMVZjL3lwejM3Z3ZrSlM4NTErelljUkhUNG5yMm9jYytobzkvN0x6ZWhkOTU3dEFxS0ZhdGNPZWNtc1MwZ0hsZ2I3djV4T3lPbno4SytNRytQcGRmSjduYzhmTkJ0N21IbU10Ky9FcTk1K2FIYXU1V09tQmh3MldKcXNLY0ptWUVkTk85RDYzbUxGaUpXOEpsbjBVMlhWL1k3dFFJaVNubENFbDg5b3NQK0lZQ2o2RWttdnBxUHZVUWhXTy9RcVlWelVxOWFWSVBwOThHRENBZXdSVVptc0k5OGxpK1RldFVyT245UzhNNXNHZHhwQkJJcjR6clh5UFlpODd1TUZiZDZ1cVZRZzY5dWRBUklidnlSNmZrTjEzN05UM2hwT3ZzNmFkZnA4dVdiNVhkdTRibDFsdVBMNy93bVNlVzk2MWYyRndDdzBjdWdqbUxZR0lTMmk2Y0pRdkEzalhlMHF1dWZEb0hBb0I2MVlGZDlWMmU4c3lqdWZRN3Z4UG1VdWNMZ2VHQ21HczNPa1MycEFGcjF5M1Byci95TkI0a0FLdWpqMjNKRC81allScjdEZG91QWticFgwekdlRUNFUWY3dzhBdXBDLytrbnhoNm9aLzUwbXlYWE56NGNzdi9aaVZoVzZrZGtYaE8vKzh3QWhqbko2dGZxQkRmWDcrakViZHpKVkNFRkxPUTU1aGg4b0xXMUc3eXNrZkhRSGV1VWpXZ096N1o1SVpySGk5WFgvUDRjQzRWTUVNd2NoZ01MUjVHRnExMDV4Ky9IOXB0OTE0TiswdTQ2dktuNkplL09zcUExMjNKN1J2Zk9NajI5anpCNTg4L1M5ZmMraEROM1pLM1psUmNPZHdDeHo3TkZ2bUsrY2lhVGRoYmJuZ3VEekxtcEs5NnhrSXp0WDFGc09tQ09TYXBYWmFwWDJBd3VMaCtVd3dVUzcxSVlFYkNkc24zNlhHN0ZJaGhKdHVRQjR1Vi9yeEJUUTRJS2ZjeE5CTTY3SUdwdHA2VUhteUp1T3FTOFNyWTJ4bHFYTFozMFlDaFlXUnFsR0pxa3FJN1NWbDJLRnVXc2dBN2hwc3Iwbk9INVUyaE1WYVF6WnNEODVkQVl4akdkOENPYmRodUYrc1haTkk1VU4xNjh5bkZaWmMvQXJqc3dUeWZYeVo1ZHRubGcyeXZUNnBIUG1hUlhQTHRzNjNpRmh5YUI1SVpwenFHTGI0RUFHYnBBdkw1bStoZGRzbXo4cmVjKzNEZ3BuMDlsMTUzN1ZFNnZuVWhZNkJWSGI1ejQ3ZkJpVEQxR0MzVWpvbnhlbE53TmxXMC9meStKbkVFZ0FUWnRjMW1jQ3AzaU5ydVZId2cyVXdET3JVdG1NWWd3MitLQTFYUG96T0Vhb0l6SStvWU1BKzVqWm16RS9NQ0drMW9Ec05vRDdvZDhtNmJ2T3lDN2JrYm8zajA1VzdONCtZUXRJYWNTVFM1R3liSFlXSVgxbFlSNjh3RHUyYkxDTmRmOTJRR0RVQ3V2MjZRN2ZXSmxPV3orZmxQSG1HYklFTmdoa0Z5NDFtaWRGWnltY0c4UlRTT2JORzlkZjFTdmZIR2M0QTM3ZXU1ZEd6NUtiTHIvaUc3MEpGSDlCdndOcElZZHpOREFmRHBuM0JRSGh3TXJkVmY2cVJNVjc4aDNqZU1xMlNRN2xocFVrOEc2c1ZudEQ0K3RSZkNYNE1yUWw1Nm14QmJPMENwTFpyNU5rTXMweXFZeXJGaG93R3RZWGRkMW4rQzRSbVNNMEpYYlFXZFNlaE9RbnNjZXAzWVRWR3ZoZ0Y3KzIxUGtMLzljSUhqNW9GSXJxOCtNR2xmV29uSjMvMFhaMm5Ib25QQWpQbHJ6cjE5bFZmdVpsVUtRM01vRGx0T3ZuNDE1ZmN1ZUhYK2dVOS9sMzJJTytuaHh4WHkzcmM5UXh0dWdFREtjSTg5K0V6bVZGYU1wMEhNOHd2Mm04RXhYNWFHU2dMaXZFelBrSEVOMVdvM0x1L2dOOFlWTTVOOTY4Ym9teU1TRGxPL1gwbWRvWk1NdDBVMUhiMXBTVjZTc04zVzF4Y21MNFYyc1I2czNyT3VTdWgxb2RkeEFPeTBVVnYxRlhpZ0FReUR2ZVhHUitYMzNYc004TE1IK214K25lUnkzNzJEYXF0UHpOYWRqNVpiTDM5YU5RVGFjZ3dvVUk4cWFBbXQwcW1ac29CRksya2R2WWxkdDI0YzB3Ly8xWWVMVi8vSlM0RUg1S0xidFJ1ZVcxMy9nK2V3bUhqVDNLQ0ZRT0VYR3d6aEUrTlJGMVB6SVQ3RUFqL21hK3JZWDNBVWdpT1RxbDdCclMweXJOTkE1bytKeWFZZWVOTlh6VXluY2VvMGNJWVlZTWljNlpzN1BFMkNQUmxWdis5bkJGNWdTZXZVY0dWOXlZZ1M2SUx0UXJjTjNTNzBTcXhxLytreW5CcGV2MjZwWEhycDZRd1VnSmRlT3FpMitrU3E4dW02ZGNOY093cU0xSXp2N0tzS3FoN2tKVFJMNSsyTnpLZFllUVRENHo5ajR2YWJUdEV2Zk9JcjVxMGZmQjN3SzIyRWJQT1c0KzM1Zi9jZWxkMDV3NEwybENMejVwSHhjNEN6Z2pnaENXcjFhc1V4WXdCZldJcXJMOU5GYStCRk84Ny91NEVIbjlRUFB5SE1PdjArQVZocUMwYlBPemxma0hRU2UzQmtnbjBvNmIvOVh4c0MyWjdsRkFmQXNOYUlXZ2U4cXNMTldpcmRLSXJ0Z1hTZGQxTDJvSFMyWDF3eUpVU3BSc0N1NzJIWDMvZFk0UHhmOVV6MlJYSzdmbkQxZ0lMb2I1OHpsSC80cjU2dEFFMlFwdE1LYm41dVVBT2x1L2htQ2QzTUZTcGF2SXFoOWk1c2VSK1R0OTd3cU95djMvRGR4dU9mOG1sOTdGUC9SU1ozM0VWcWU4eFpOTWRPZEo5WGZ2cnYvc3B1dWZVa2N4aFVQWTJsa3pOalhBWDhvdUVaclI0MzlZbUN0YUdZaVZlL1VzZitVbEFFVmdsZ0FzZmt3N2o5WTdhTDF0dERhQ1U0R3VIZmZvUW1PaGRoNStscVBjWWV2YU5VWjdZbXhsbTZUV3VnZ1dlN1lCdDYxbFByV005VVlMcnVHV2pQM1ZaVEFpV3F0dGJXVXVPWmhuTWs3Yzl1UFZYTy85SmNCclFHWGE1dmVkc2cydWtUdWVIbWsxbDkwNm0yQmRwSTRyYkJDZERLdlcyOUhoUWx0REszQ0YvZWhLWEhNTkxySVBsV0p1KzljOW5Vdi96aVhlYUs3LzlCdHZ5b20rU29vOWZvbkxHMjJiaHBydDU5NThuVlhYZWNSRyt5TUVzRlcwRnUxSTJlR1VFS0g1YkkvVHEvRXFaa0d2cW5aL3ArNVI1OG1RZG1Yd2FOOUFNa3d6RmZKdXhSdmlQT1pxTm1xNGdmN2NOUjNEK0FORzVRNTQySE1XT0JPQjg0N0JPcUpLaTM2Y0x2VldBOHZ6MEFUeXBmbzg2elg3RC9LZ2M4VEFXaUtJTEc5cEwrQzI3cGg5VjNQN1J4M2ZYSEFnT1p6NXRuMTEwL2lIYjZSRmZmK1FTMmI1cXI4M0hGc3FGKzBBYkFyOFhiN2JvM3NaRzV0S1IyQnEwUldIazh3L2xxaXNaRzJ0c3FldmV0VzlKYnUrNlpYUEdqV0VNUzQrektiQUVZbEVLZ3lJUThFOGQ4alpaYmhMRGhRWmpsM2pBTXFqallkNTRCYzgrR0tlQ2dYLzBHZGh1V3VtUUc0ZUlTaHlVaHBkckxGVDhDb2drd1V6Yno5NmJ5djJYcUV5YTBCbW5hY0FDZmdGT3pIb2lTcWwvZmpsVDFSMHZQaVA2amxUdmVXTDlZZ0Vhbk93eG54a3JFdzZBN3RzN2x4aHNmeHFBQXlJMDNEcUtkUHBIMWR6MU9yV08vT0lFbjNIUXpqUUdsQzAzajlHWnAzYXJnclZGWWRpekYwQnlLdVp1b2RveFRUdllvdTk3VUNWbzBjK1pkM2hDeXpJL3pOZk42ZGZObTAxZEQ5WTVJSG8zRDJza3dIa3haOGx2Nk1Ra0FyYmh4NUJodVNXa3hHUDcwMjJ0eG0vL05TRElNcC8xRGZWR3Q0dGhxeExyRnJIdWhMVnNEcTI4dE9YOVB3NDBXbStRNmVtL1hlckNWSHFpVlowQmJ1WnNxT05idFVpOUJFWVkxOGZlOENYWlREN3Q3NThNSEJCVnl1M3NncWp5S2ZjMGJWaFp2T1BOUjFvZEVJZ0VZMEV3Y3VWVFdBYkRxUWRsMUczTnh3ZEV5Y3d4VU5HRCtDaGlaUjdad0o5bnVYVFFucDF6SW9QUnZyWWdEVktoNmxlZXVCRnNBWEtPb3Qwbm1QT0pHc1AzODM5eXI0cERyUndxOHhGT09OZnNrQ1NKTHY2cE5QVlNGUFR6WFFKVEI1Z3ZxT3I2WTFBNkdVUmZVYnZsL1YvNFQxSGhnU210clZyVlZmV3d3T2l2ditkcUtPT0c5S3Yxdi92Z3dvVDJqbnV1aVdrZWhnaDNvcXhucnoyNDd2amp6ckFZT3J2c2xlWDdpU2Z2YlJwL1lTeTQ1a2UzM0hXYUhuYXFNQXdqcW4wZFFLU0grWkhMM29DM3V4dVhXNThINWc1dkRUcFdPeklWT0I3b2RGN01xZXo2VTRHK1k4VUQwcTRpN2txakpYekdPYVRPVDJJTEJBVW5zd1QxeXJCSTEyOEs5S0RGQndPOHpQY3dTajBzWXJZN0wxTnREV3BhbzYwdVZBbEtjbmRuVVpDWE9CSHg5ZWo0Sk1rY1ZIUUNYZkt3UHZ3UW1qUjQwZFNKT0dDbVMrdDBMVVNYMW8zNTJ3MzNIbE1jZnZ4allidzgyTDQ4L2ZuL2I2Qk56K1k5UFp0ZjlUZWF6aDJrVXAxNVlDMlhwMUs5a05WS05CZkVNRnBaUENNL2ZaTjZlTTFEbTduanJLNGNyUHB5U2VWQWxqb1lyRHVNWlVOd25NRnhJYVFyZ1MrY09wL005RkYrcno5VEFDNkNLUUV3dlZPdHRLWlpEd2tIcUNhZjdoQVNOTUxMUndrMmFuL0MvQjZmRXFGUFJBVlN4SGM5MjRmY3F1T0dCK1pMZmdrY09rUWtWSE10bjFGbmJTZmREc0Y2M2JWa2kyN1lmeGlBQUtOdTI3MjhiVVhUQmtubXljZlVKNE42a3Zpd2xmNU5WUWF5UFJ4blBnbXA4WXFiL2lDVldNUTNaSktKK25RN0JwYUxqV0RMV2FURTFpRElQdkN6TW1mQ3ZiaUZlMVFjMURIRTE5T2s1ZnROdHdTSDhtaHpVMUpBU0hzbkZ4a1RFc0s5bmZXT0lUb2Voem53eDFOY2ViNlp2ZndFdXBldCtyWThOOFIxSmpxbjhmUXRxMWFwTFBadG5ZZExDVHB1d3FHZkxQZ2ZIblZSQ3BBS2lFeEkzQzlBQzdVN05NVmRlc1FyWTcvVmNjblBsRmZ2YlJoUWRtN09jTys4OFdxZlpmMjRqUGhzOTNDRHIxTEJramdrVkR3cC9Jd09RakFkZHJBcWZBQzR3VC9CYURjUVluK1FKa1B5K1Rha1pMNDBCeG9IalJPL0U2bG5pbkpRbS9ld1gyVkdTQ3cwZ25NYUcwL2N4SHFEaCtNQTZVQzhIWVR4UWNvVWwzdjdiQWZYeURKNHBEY1NBTTRtZE9NL0NNb1c1Q3V1VFk5UEFkUXJBYUVXNEYxUFF1a1lUOWEyUUJ0aXR1NmxHUncvYmQ0VHNLWGsxT3JpbHhHVGx5cFV5c1hWVk5JV0M0UnFlaDhkUk5KaXIwZ09sY2xGNXdhbmhZQmNHOW9vaERHOUhCWlpLZ1pCNnJHUzFiUmpxUUJmaXhtdERaa3dJdmNTSlJxWm13UWdrYnhvMHFHT0RFWmdrL1pENm1NQXlwSCtwbVh4dmVpMm56bndKQkNmcStxYmVEbHlPODFLM3E1dWZGdkNzd2Q3emJZNVp0d2prQXMrQW9pNDVOc2V0eHU0OTI5aUpxS1dUUGlmdmRoK0o0TnNwUWJkdGVjaXZ3c0lEbFZ5M0RiQUkwdkxGaDlQZXRqak1uNDczT0xLOFl3TzFpbGoxOWtvWE1EVVF3a1J1eWV1RCs0Y0oyTHZ0RkFCZ2FoQ0k5NmpCMlZORFVvUFo0QjJRQkpUcGFRSnJGcml3aXdtZ00zVTNVaHN4L3ViL3h1aDd3dWdXb3VjcTFHK2o0RUhvMlZEVmgxNENZTlF4OEZJUHBwM0FwRUpIM1lwVFRYSE8yNUIxdFc0SzM2ZkszNGVHLzB4WTE1ZElkN3FYMityNm9QNWRUOU1tQmVvaHVzMWI1ak1BeWRrOE9BQm1hOVl1cE50dGtmZURMelhDMWR2Sll0U3pYVkRGQ2FMaWpRbmpkLzczT0xTVk1GVjBXcFZvZTZWT1FEai9DSDZzTjZoYzA4OSthZHlQY0E3akhtNVFqOUV0TlBXMWhSamZkREg0WVRvbHhtMU1jb3hDTEZBWmhnQkQvQzFrUUpkZURZZHRCcGlqemp2dTRFRGEwNXJSd3owcHFjSHVmM0lqSytFZjBEZE9IQmdpbGd3aDNydVlINXRZRU5xQWJQT1dlWHZEd0w1S25nMFNnTG1aYjN0bE0wd01TdU5JMGRUdzMrUFFVZ2lVdHJ3S1ROVkxLTXhEOElpbkFTQ3FUUHJaTUtwRi83MFFWNFlqRCtyWCtKaVc5SWRqWWh3UTk2cG40Z0RZcDJiOVJabmt2Q21OcUg4UlFobVBQVUl6MUd3YWJWZjE0WjJnSDhVdnhScXVOWXpyK2lZTWpoRUxuSDFzclFQbzlCYzBCVmVmb1plZ0NmOHNTUGZ0djZTKzZuQ2VyWHU3dHM5akFKTDNkZzNPQ3phajJaaFNTZDhjaWRUK0E3Q0tWdUs5UHV1Q3l0RkR4UUd3Q2pjd3ZlTWhLR3djYUtNOU9CMDhVcXUrZ1B4UjlRRmtxZG1tendZa3VlRlNBNk9KWnorVHFIbnBmempUSldYblRPdWswZ2pVOEdiYStqcERIREJQemxGUk0yL2FyMUFaSzlYN2dWV04rRENMN2Zlb1ExZ25UQmVNSWNPRUlhbHZGMmgvNW5oNnZlRlpUdTEvTlRPQVhLZW1CdEVPQUxicXRmYTBXcDMwTTZDNmNGWTB6Q3QzWVVNQ0hRT1RaYTFTMVFNd0JKTlZmZmpGUDR5WTErY0JGOTdXQUtwQ1lENCtEVXk5eHluMXB5OUpWV3BISnNPeFh4ejE4QmV5MXhBTXRicVAvMVozN2w2NlhaUEVnUUQ4OEVUVjl5LzhGdDdpS2ptdmNVTnBtbHhuR0hJTDdOVm5EaVFBQ3lBTmZZdWhHT25mUFlhMTluSk5RUXlZcWFubVhyYnNzK1JtZ0FCVXNlN3hSRlhnYlQ1VFgzUElHTElXeENnU1h6c0xwb0lSY2JaUFc1MDNITVFxYUpMVGg1bDJzNFA5Sno2ZzdlbGpMazc5R2tuQVJ4TE84US9lK0ZoaGFMN2hHVEpsMWNCaVFSV2wxQkdBR1FCbXZCck5OREVIL0g3aFRUVEczWWpNZ3l0TlNvMVp6b2E0SEZjYXN3czJUcDlINitOL0tYT0ZZYnd5dGZXbWdUUnBOOHg3Q2hZQ1NYTmhkd1RvZGdzR0lEbmR3UlZSRnpGVkRDTm9ZZ2ZpTHl4RTE2MVNwekZWeVZ0djNUS2xjejI3ZGNMYkQxSDFhcW9laEhvZXJWZkhKbm5JYzRIRnRxNXVrRSt6L2Z6WVpoMEQ5SGRYeEFFd0RiMzAxUm1VYVFDRStHUU05WVVIUnlRTXNlMlIxUnpPNFc5V0ZqUkNRRUVBaHJoNFlKK05KeldvOFBjdW5DTUFMRmd2UGV1ZGxlVDR5SFkxR1B2SXp1emx0NzRmZnBVZDhzQWxIMVJEQUhsamVOS0t1S1JidjNnZUpCck0ramNyakJnSlNKcVNoS2ZIb2N5QmJSdjFQUDRJTkZPcjJNQ0NJVndSalh6Y0VOWXkvTUxQM3I0SzdKZHJiZmhQRHo2SHVGeVJiSXRnU3hreFhQVTBGUmJaVU4xNUNuVjJXV3pESnNjbGdJL2VtdC9jWi85NUNSbmJjYjNsMEova0htYStEeEgwdUZvVEpkUTFhVkxXcXlsT2t4aGhJTW8rTFJ6SXBZSkJyVU04MlBXQ0Z5d1pKODhxSnZ6dEMvR284RWxEVUlrNmRvdmxCRzlQWEdDMWxUbjIyaW13MjNoQTJ6cHNFYkpUSW5EeE9YUzRXTmhpZGFHWE1PUVc3TC93RUFPSVkyR2dCQWdoT3pxZEU0SlFGem1mQnNaVTBtR3VFSVBySmYrT0x3M0VhWklweSthUXhHdHFNSWVYTEE4dmkvOWZTR0xZRzFVSnp0R1o5SXdYWTVsNzA2dnVFemxSKzdlRVN3b2hIbTAyQjZJNmMyME94SllFb0h6SVVWdk5qVVhiakROU3RZRW1hS05tZkFMelpiNm1aNlhKOEtZbWFzRURyV0Zna1lGV0JlTUdlbWx5b2FmVG9Nb0xZRWhkbkd5QnVzQnpDRGdiOVdsYjFJWi9YODJYbEFYVlpkTk1CMlVZS1VuUjJ4ZFg4MTBMWmRhQ0dpeXFlZ3hidk9kZ3ZXRWNodFhDY1lKN3liTFltR3M0OCtjTXExb1YxQzlQdXZwOHZDOWEyN3dkZFNNZ01YL1FKZ2ZZdnU0SGJkOUg2a0dqcCt5bm9DUERBM0VlY2gwWmlEY05nQjV4ekwwTXpkdUZiaHVoQXAwQXlYR0pDVkJuQmhuaWhDME4xUU5DOFoxNEYvemYzRG92ZG83QWxIVVphT0hoR1hXZ2FpbU1pbHRrZWtUcnNob0JnTUgyQ3dIbllBZjJKYUQ2ODJVZXFDa0FKYXYzQzJEc0F5ajllaW9PSTNnd056MFFVcldMNzA5NDhjTDFwdDlqdjdUdW4vcVhNOHhobmg3cmlzNlkvOXJCM2JOUWhTRThDUHFaT2haZFVBalZ4VklOclZDUFV3UDUwTWpFQTRURnI1UThIOXJ2c254UnpQck42MmdzdUZmTTNjc0YwRFpvQVRLbmZwTkNHRWF0K05peW9xVzRvYmtRM3hQYkg2SVFjV1hJaG9KZThFR3lrTGJlRUQvWEdCL3hUOVJ1Wk1IRTZaZysrU2oxZEVPMlRCZ0ppVWtQaHJqUWpZUytoZmlrYnlQRUxhTXI2V21qWVh3cVZMaFJFSjJwb0JiTFJPZUZ2c1FTdnNiRlMwTUtXYndIUW5SMlFwd3d4Qm1EZzdMTHMyU2ZjeFRBbU5oSEVYd2F1eEdueFNpb256cUNnblNBNVNzSHNncFR6dktWZzJnSEFMdmk4SFhtaUlmOG5MdXZlUXdacnNQaFBSbHpURmpYUWxHd2dvcGdMVDRYUWFmZGxLQ2V3c08yWHBYYW1zRnlIM0tSQkhnaG5Tc05Pc2RhTCtsM2F0VWFnQmF6b3dQd1BBT2FCSlFTM0Z1cDdjSkliRUhOQlhzRFYwU29Bam9KNnlEVTVYZHRiWE9tUmRQVGRMRElqb0VWcWM4YnZXQ3R2WFdqTUM0dUN5WU5FMFVQT2RpWUdrazEzUlF5L0JWbk1aQ3VZNlhBa1VjTVpEcGx6cEZIREtJZEFQUzZLemJwRWNmZExFcE01UU5RWHg5UFJzRTJRRUlFeVk5dkt1TEdoNk05UktLRlBTUEdHV3ZoNGRqNjRZYzVFRm13bzlRbGJNWlFpOVlwVDJudTM5N3EvSVc2TUdIeWV0OVljWVlMSEFpUlFvM3hUa1I0T3NIK0M3Wkc2YlkzY2IrSHNkdWd5OExJUm5qSG9HYkJ3RnFLOTlqVkFia2tBWlRVTVUzVi9wVStkd01UNnAwM0Q5QytsVGI3Mlk4K0xSV2VFUzVienF0dkxTRnJBVWNkczllbDEvWlZjbzQ2WmhEdDFKSTFycE81ODlzeWVYK3JMNW14QzdxTGFDTFpSdkljRkpmaW8vaXdUTUo4WWhNMjhEZFR3S1hiNDRGbGNXc0IrKzlGVmdlYk0zK01NWFhTcTFBUHdjWHpVTWNLZzdPUlZsSVFRMXp3R2o4cUl4a2FNcnE5cFM3NGxIZlNLRVhwYk1FV1FLLzJXa1BjTWdRQndzMnl2bSt4UHJUVTlsZDhNY09MaUFjZC9XWmdEOWhlMVJuUTRhWE50YjduZnNqT2dwdUthYlUybFNyUW5nT2M5Y0VKZlBkbDd2eEpNenBuSUlVbGN6TTZaeER0UkxISG4zU2pXWEwwWFhMWGRTZEw1cW5jUDBOVmtDbGMyYThHYUJQRWUzemE4eW9tbUZRcEVBRzNlSXRKUUdnYzJFS1FPYktjMzU2WkpNd0NjVFJCa3Q5aUJFcXBKMFpCQkY5VXRZSDVmSjZpeVZEeExyWDZSYkI5SDlXbnhBcyswS2xlRmFodnY2blE2YmxwcUlFMWpkK08xbUdWYVNRVkFXcXBzMlg2WWkvcGQyQVhzQ09ZTkxoN21abzNIcFFhekNIZnBGclFMbWpIQTFENm02VUhzblRsZmF4WU1SZ0FzbUxGSU5xSlluYmR2MFZQT3UzSDVvN3JUcFpoWUtvMmVTUmNjTTlyaEM1dUxWOEIzYVd1OEhzQjdrRlFPd2thMUcxRnpCVU1Ua1lLcWxoR3pkWjJvQ0d4QmVrUHpmVGxBS29QVmh0aU5hMDRueVRNckN2UXVPaWh5K1ZYYWFDU08vTkJTOFJuOXlnVldJT29ML0lYcUNXRVVIbzlwNDRyZjMxQjV3WFc2d3RZKzc5Q25Xb1ZadEdGU0FEVWFGRjFLZnh0ZjgxS0V2SUp0clg3QkJOU0szV0ZFa3FjOHhpSVF4T3NxM3RtNXVSVGZsSjk4WE1iOWdjblFmTHFpNThiUkR0OVlwNzF2SXZNOTcvNFdxT1RtUTFxV04xTEhxL0ZNNkw2aWZxNkhYUW55QnpxVkthZ2ZrMWdpMkNVQngwUmRWRE5XTVpTRndUWFdoWEhkVCswSDRpaC9XQm5SWldiT2RDWmdsQ1JYbFAxUzRHUzQrcU9ORkVxeFBad0NxMTBESmhscURXSWVCYTAxTGFkRWNoN2ZtNnUrQldSL01lS1g0WTFPQ0QrcHVHWlBxanY4SHYwK2ozTDlheXovZkRYVzRiZ1hRQ2VSNU1DQVhnOW5CbmtaM0NtNzB3UTdUbjdUNTc2OUVzR2haVmNudnIwUWJVVnBYenlVeTh0dnZuWXE4MU5QM3ljTlB6RlVaTi9HTkoxejhOUGhHa0xkZ0lZVnJJd1pseHBYVEF5R0VwUnhZS3JjU0xlbnZQcU53QzBiMW10YWVBTGpCZHNTOVF4WCtGbno0WHNteXlvM1FLVlJtMy9JZjczRmlwRElMbXpYYk9RcjU2aFdpRVl5QXlxeVVJeWdZMVNXN1FTVjY0dXVLSXEwQkUvWms1dFlsaXZTdnhwVUg5OHVLRWgyeWF1TVJldTNiTmY2SVJmbjA2N1lFdGZpc1BXNzRqQ0hna0pBRXhDOXBEajd0SFRUdi92UVdFbDE5Tk9IMVJiVWN6NHpsMDg4Zm5mTURmOThIRW14NzFoL2o0bzFORjB2K0tBR3R3Tm5mSW1FL2pKUytyU2owSm1pemkxRmdjcFJkMXZKZ0ZtcUlJVWIzcEZuNDJZR3VvR29tVmZpSnRYSEtad1prVlV1MGpEQXk1TW9ST2dnWm9XaUpzQXJSSjBWb2JneHJLVkF0R3UyejhjWnBNYjRheC9CL1lBU3BTWXNoK1pINkxCbHM0M0NXYUgrbi9IdUtiMUVZYXFObEdDQjk3MWYwdDFTa1Exa203QWU3Z3JxZXJGZ25UQVBQUDVGL0w1ei8xaVVGako1Zk9EVjhFQSt2d1hmNVBEVDM1OXR2R1dZMjFSZ3pBTjhTaytWR01nS3hVbVFLMWdjMFZ3Sy8vRW02Y1d0enlWdTNsUnJRYjlIaGhTYksyT28xTVNQdXpKaE9GVGVHZENqRmU5dVFkZUE1WENxV0ova0dMOHRpR1FGakdUUjB2UXJsZlZ3Y2JLTUFncXhqR2k0RTVZK2VzeXRyNkdtQ1V1ZmFaZkhKb0wyVGxoeGx5Z3FhQ1dGWGZlQXFjNVZOMTV1dXBHWXJyV3ZkQjQwQmsvOWx0cHpYNjJiaXJlV2dHZGhIelo0dDM4NW91L01raWM1UHptaXdmWlhoU0ZlK3pqWC9BVitkZGIzcFdOOVp0c0NuSFF3UHBuWWdXeVNkQ3VRbUg4YWxYQlh2Tk9TSFEyQXRqOGd3blp3OU96UEdMTVVCUEh3enNuYVVBM016VUFqUWViRk02MkV4KzRsTUlCVC9FQWFZQ011TDlCcEhJdmlYWUp5a3pJM0hFK1poZ2RVUk5HVFVLTXpqczlvU3BFZEk2a1ZxVXgrUlJ2Ukh1bnJOSWF0QllYbkY4STNBTzBnM3EyTld1cXhpS1VhalJXY090VHZXbFlTRUYyUTM3V2k3N0ZsNzgwNEJyUlgvN1NJTnZyRTMzcGIzOVJMdi9lMldicnpjZVpGbFRkZmhDQysyN3g5MzRTekJRd3BsanZyamd6VFgyNEpRQ0lPckFzUWMxbWRZUGhUM3lWdzBtU1R3amVDcTQ2VjdEL1RKYUFyK2taTUl6emhlTnkxSXppY3IxeTZzWnh4Mkp3SmRBc3FnYnhveHNhcnlsNU9lSVFwTHJqMU5SZ2t1Ukc5VTM5VEY0ZXdqVUd3OXB2T016Q1puV0xYblQ5aStsSFM3UUViWUlPS2JyVDRUaWFuNzZKK0h3TTZDN0lWeDIyamRlODlsUDc4dndmaUJ6UWxaSVVWdXR2bnZNUDhnOS85bEhUd2hWcTkzR3NvQzN3TXlldEQ1N0tPTEJZdmEwdVh2c0VKRlhKQS9BSEJ4VVZiTDNBY09uMFE2QjI1M3hid1c3SzhPQkxSanRNamxJNDFTdEZ2KzBuZUxVN2lvc3NhNzJ0TDVEWklhcGhJODVKd1hoblZwT0F1M1gwRXp6K1VOVWg5ZVNudjB5cXhNbjk0ZjZrS1N0V1hXTHZ5VGlncjdZdUxsZzUrODhPSy9wUTBOMWd0L3V3bzI5eStud2xyUndwTkY3MTBzL3kxYThPZkYyMzNIejFxNE51czArcVAzM0wrZmtsMzM2eDNQbmZUekZqUWpXbDhmbUhtMnJEaTErQjNRbFpEMWZhVGRWN2tGb2pOMzN6UXhhMEpJMlpFR293Q1R1R0lUWGQ4OVB3NmpmRy90S2dzMmZGdm5NNDc5ZlBWaWVDTHVxL01Md1NTdUVDa3FOcVhVa1N5VUE5b0RWM1ROazNMeVVFcDMwTU0zZ0ZKZ0daZXBXYkpjeHV2Q3FPb0ZhM0ZNYkpGaFpaMkdSaHB6cW5ZeW5vcUdKdjhxOUk0dkhHeVljQmlOdWdlTlJqZjhxcnp2bkVmb05oTDVMenFuTU9STHRSc2gxYmR0bVh2K0gveVB0dk9TM1RiVU5hRU92cHhGbVovdmxaQTR5RFRJQnBLYWhnUlJIeElJd2VZUEIydzRNejlXOHhIU214LzJJMmRiQUZmUnVGZ1ZiTDIzd1pNYVluRFpRQ1YxMHpoRjk4V3pSUmhva0FqSWtTQVlnQk1TMXZDL29ZbE9BZERvdXFqeFdLVHgwM1llVGYxZ0FLRTVyaWdvcWgrZkJ2djU4SjZqdVlKMXFEc3JMT0hseXVzRkJkUGZLZVo3dHR6dVFKQTRjcEFLUGpNUUg1OEdqWHZQVWQ3OUUxcXdkZnl4bklkYzNxQTlGdXY0d09YU1JQUGZ0VFhQakpQODhXZzRiUkVSTEt4OXZlYmJBN2dBV1FpYnBzR2FqbjZJUU01cGhnR1libkV0QVovTGJ3SkpMUWpPQit6dzBNdFNBUFRrWURNbC9RbW9ZSFk5Z1dBQ2k0d3RBQmdPRmswK0lWTVUwcmJMZTRKWXI4aFJySFJHbG96alhsQVJsR2Zwckd6L3ZWZXNkd0QwSWNNM2o0MGNiMXprWjR5V0w5UUhXcGI0Q1dpdDBOVmFkK1hhTEJFcDVMRDJRM05GLzVpbzl5MFlYZjNQZUgvc0FrTnhmTnpJcnA5bFd2L2JDNTdab255ZnFyVDh2bUMyVTdVY1ZBY0E2c0JYYUE5TUMybk5XaytNS1dZbXRqUER6bzROMkNCNWhuQlpQc2syWUNLNjdNMjdBdjRSdEdQR0xJcFluU0F0Tnk0S09ncm5aVmVQWnJVWmZWQ3AwUGpYdGJ0Uy9PNDhBWHpTdGZyMFpSMEFxeGxWZkZoUU5oVUEwTlgwWjNLcWlMOUJvaHhrUFRZSE5nd2pTWTR1MU42MnRTVmlXVTl6c0FKa2YxSFNLYm9QblU1MTVpLy93dEg5amZaLytySkxkLy9wWUQyWDRxRy9RTjczaWJ2UGYxM3pUZERmT3loaXVRT3QyOHM4WVp4ektPaS9GU3F3ZEpKeStsRHlPRVpLSnF0czZ4aUo2ek9sVlVaTkFzM0FwQ3hkQzBRSE1ERzB2NnQ5eHZGRDdwQUJmRFl3Z1lwV2EvRklBQlhxa3FUc2Y4ZXYyNytoZEZLOWRmTVNYT0NDNThUS1IwSG5uVEE3a2pMbzVIQXNRWUliYTErbzNGSzBQMmFOMHJkeDhWT3dIMmZ1ZGdoR2hPM0VGQXQwUHppS04va2IvK0QvK00yMjdaUGlnQTdFM3k3TFpiRG1UNy9kSXdQN1RQZjlVSDVNdnZmMysyeXQrK1FQbDRjc3RBdXM0N1l6RiszcDU2THV0ekIrdTNQdHFHMU1aNllXRXN4UGI4eUVZK2hGc3hzWkhZZkI1ODB1ejd0K0pIUDhpYy9VbU94cHE1MHdlVHB6TmdZRUdvd1ZwdlYxRkVhL3RQMVkwajEyQUtTWDhsWlA2bE1lckRDTDZkRU1RT2MyUDZRQmhZTkx5Z2ZyYXNxUE40dDNvUG1NVHVDejI4SDRyaHhidk0zMzdpenlxNGNYOGYrYStUdklyeHN4bVNzMzdudzdMdUY2ZHd6YitjblMzRFpWNzRUUmJuL0tsMWI2aE1nTTVQckN2QkRkRkJvb29TOWd0TW1ObmFXQytNQTFMbWk1V0x6d1V6RFI5MGJucXdOYjNhRFVWWEN0RE1xVXZBbDllaVRtY0pFNWRTU1Y2UVVNby9BbEVUODhHOVVoTEFabnVvRFBtNGMwbWRoZVBEQTZrWEgwR3FpV2VjaEhHaUE2YUVhcW1xU3FXS05WQ05RN1hSajB6NWlFNmNIaklKV2RXazhhYTMvalczMy9idHdUendYeTI1dWYyMm1UaFBMYmZmMXRQWC8vazdzenV2UDdIYWNlZkRzL2xDMWRVSVFnVkhNSk5RYlFlWjcwZWdBZ3RHUTl2VVJ3VHdHZThabzBsUUt6Z0NQcjRXeG5TbEFOUHc2VlJOejRwdU9YV05sWDh5YjRGbTN2WWI4dTA0Qm5Ud1N4a3dYZ0VheXJ1bDlDSWtYbGVGVWlLVXJoOSszUTRKc2Nlc3hFMm84WG95WG9iVzFWQWwrWnRxaFQ2N1VOMS80a1kvN0FhdzQ5N1VpY1lmYUFmTWRoaDU3aGwvd3cwLytkaitQZVFITG5sMnczNVhXZDEzdWVFbmQxZC8rcjQzbVkrODZldTA3MXVnTGFIeWhiakRRQUFXMkFLNkhIUU9jWVROcGN1bE56dXhoYUl0Q1BXNkdVSTkvZEtyWXhOQTFBQVRQRi9uL2Jyd1MwNi9rMUVRVmEvNFpJUGFwYTFCSDFrT0pQWUg3MnhROTFraEJLbWRxbTNnVml2S3dYcXpvWnJHc05IdXE2WmQ4M1MxYi90K1Y3WHVsd3pzWnRBTmlibmptOUF1bUMzUVBPdjNQbCtlODdwejkvZng3b3ZrNVIrL2VTYlBsOG9sNXV3L09pLzd4N2Q5bENGMWVRWUE0a0dXQStOZ040SWRvMTVkVlBjR3ZtQnNoKzgrSmxIYUdwQXhxTnlmWktBMGNBQm80bEswbmZQaHZGK3BuUTlwZXVBRjhBWGdwZkVSNm40a3EyWUt1U3Q5cXhabjFBYlBxOFJsekRnUFdMVkE4Rm5YWVFKVUg4T0c3QmF2dXRPNXZ2RitPSnN2QU5HaTJFeXg0MUQ5QW15YnZzbGhXb0pzZ2RienovNW05WjYvZlRNRFhJcjFnVWhlSFQzZ09TSDdJTlhSeDN5czJMVG1CUE5mLy9DNmJKRzdHUW8xRXlyb1JyQ0xGTHRNdlBwMUxvR2tWWS82QUVtdGZrby9vU0VNYjhYc1p1LzU0ajFkNnUrRUFMUm5QeVhEc1Y5U1VrRnFCa3d5L2NDN0s3V0RGR0l2aW1COFc0R2RLdnc4VWxSNmlEcWJUeVZEUXBwL21Cc0N2b3hkc1BXQ3ZlZmJpdDV2M1VVM2l1VGpxRmFwMWpqSExwWWc5STZ5YklIbWs1NTNNVzk1OXg5bVc3ZmV2LzlQZGQ4a3o3WnVuZWx6OWtudk5XODV0N251cHcvVFgxejUrSHllVVBhMEhoTEtnQTdvdldEbmdaMkRINTlYYjdEN0IyM0NkMXV6bjFGaUhlcFFaREpPcWN4UmZLWUxRZjBHMWV2L1JodlRzYUwwQlplbEJsNGZDd1lDZERhRTRrMEE5Um1rYnJVZW5DT1JFNGZrb2xNVCtpY3hKRkl6cXZkc293U204MndhcjMwYSt4bWwyZ1RWZWgrRU5uVnpzaDJhcHp6KzZ2eDFiMzBObXpac0hNVHozRmZKemFhQnBQWS9hREd3c2ZmR0QvNUo0MFBuZkt1MzdhN0R6TEJRMmNRZXhJMk15RWF3bzRySkhaK29xTE96VW1PR2hCSERneWw5c0RFTzI3a0hyeVk0SThIZUMrd1g2bmVFVDhpRWtRUnMwMVZ3eW9KZUhhcDQxc09wU3hYdnpOamttTVNPakhhbnFYK1AydDE1eWpYSWJIMmV2aFRTS240VWl4cWwycTVVOXpnblEzMlNqcTJjd3pGMDJMRzNaci8xbW5PNGQvWHEvWHVLRDE1eWMrK0JQL2ZVS1NmbFptSXloRHYzSXRXMTFTdmUvdTdHSjE3L1dWdjFzSGtkeFZEdkIrZ0d6NEtIdWJGaFZldTFuTmNwYVJHZjFCc3MvUUJvcU1IbmdlTkdsek0wT2h2cHJLV1VsWExQZGpYd3BHK1liWG9vSm94RnAxNTQ4Z25UT0ZNZzk0SFIwMzhjL3NQUmxlMG02dGV6bkhyR204WjhlTHV2SElkcU5lZ3VqUUZuVzRIWkNjUExqMXByWG5ET2E5aXhZWWJESVAyU3k0NER6NERaK0txWE55NjY0S205NHgveGFWbSs2bXIyQWtRN2QrWG5lTW1mbk5iODFvZGVFOUxEOFdwWWNyQldNZXNFT3dheVNDTzdTRjlnMnRLWEhDRFdxZUR1SkJUejQ3a1VFejk3QjEvNG5ySlNFbmhPeTNKQTRxeTY3SjJVd1VTdFAwK3FQcWVCRWxPUDlNUzRTSEF1TEZSdE4yeWtLZERTNFlzd2h1eTJxVmlxcm1MWHFBczZaOFRaZE5rNGpDeFpObEgreWNmZlpPSEtmWG1PQjBMeThvU0hIL0NUMkdWSDNGTGNjZWQ1NW12L2VFNzNqRFArbVNlKzRCUEFIcmxsRTcvMTVnL08vY1ZWVDdLM1huWjh1MW1UbWZvY1Vkc0Z1UmZNTU9qY2dPRlVwWVV4MitRM3RkQ1pnS0dPcnk3ZzdTempnYWJ1MzBxSTdhWGdDa0JNSFk5KzVwTzB0aDl1R29IdWxmbWtOc0NpWjBGc3AzNkpBbnRXWHZWMm9acWc5bnJUL0JWYk0yMEFwN0ZVSGFWYTZ3UE8xRVdHbUlLUmtSeDUyWnZlVTJ5ODlac1A5bmtPVXZKaTQ2MEgvQ1RGeGx1djcvNzI2MTdTV0gzUDF4ci8rUFhmTG0rNS9Bejd1S2Y4bXh6N3FIKzB5eDk2T2I3SVdIN3IxWGQxbnZtYWorVjNYZmtQUnFwWXRTTEdiblBRY2JEM2dRdzdVQnEwbmpzaWZqNWhmT2hlVlpZZDZJMURjd25PYXd3OTgwWm1FbHBSc21rcU40QVErc0dYZ2hINlNUME56VXovcEZLclRJbDJYVkN4d1pNZmg3S2RnRStUNHlvZmNBL0RlcGFxWjZuV0t0VmFqZE1ycVZ5c3IyVWhlODd2Zkh2cTlEUC9icDhlNEFHVXZIUDZtVE4xcnV2TnkzLy9aZktWTDMwNXYrNldFM1hMMTE2aHF5NzZyZUtVSjF4c0gvclk3MVNMRHI4S3VKbXB5VHZLeHNJSm1kdzhJa01TM2w4L1cxSGRrcS9iUWRjcmVyU2dKbmw0SWN3UldNbGFZdjJYN2s2b0pxR1k0NE5mRmpjZ0ZnQ1ZqdTBtZjlVRCtaZUJLaVNIaHUyUmJ1amZmNDhTQTZra1FlVm8xMVZRN29idS9mVFp0bHJWZ0l2N3VoWFBiYytGVzZxMTFCUExyYUNWa25XZ2VjU1J1OXJQL3FPUFNIdm5qTWI2ZnBYazB0NDVZeWZyUGV1Wk4yU1ZPVnYvL1J0ZnlPNjgvdFJDN0JCYnZ2ZkMvTm9mdkpERGo5b3FyYkhWNWRhdDg2Zkd0NDdROHFHd1lEb2x6MWRGMFMwR0hWYjBDRUZ6OWNtZFFreGxUd1BTWkZCT1FHY2pGSXVvaDFwc0hlNklKd2wyVlQxOHB3Z1NxcGlHVHFSZmszUi9qZTNZdUwyV0JHanBSVVVXOU1CVEMzWVNlcHZBZHZ5dXdjTk53aTNTYzcrYkN0dXpWT3NDODJrOTFkWHZtbHVRSXg1NUZjMlJhUHFVS3hvaTJsNlFYWHRUa2QxMTF6Wm1PQWdOa0dkWHpVdytZSlI1M014ci8renN6cGMvOWNYeXBzc2UxenJxQ0hSaWl1cW50eSt5UmhkVkdTN2ZNNFRGYkEySldMMGlkdzlkTmdnMEZUbmNUK0djSHVKSTEzWkRvTDBKR2d1UW9YbUFZckdJenpyUmFGc0pHdU44NGhFVzJOVUJSdWtQUCsvcDJxZEI2SFM0TFB4SlF5YldNN2dyNTJFb0hiREtUVkR1U2t3TC94R2ZxaFc5aWhMdFZ0aTFpbDJuc2ZocVBTQ2lMbDJ5Z042Nlc0N0lydi9HQzJTTWJkYnNQcm0xTGpzdHYvbWEwK1M2elF1cjQ1N3llbURHN2NJODJ6VEF0ZUllc0d5NTA3N3AzTE9yVDMvNE01T1hmL2M1UThjZFJYUHBJNms2MjdEVmRqTGJvOXN1bVpLeVhrQTUydlhPMDNUcjBTbTZ5V0FiQ29lQktYeGNVT2dIbm9BTC9QYWdmVGZrQzZBeGh2aUhQaTBWd245TkIvbFRGZ3pidy9mcHFyVUdXcXk0N05QbjZ3ck00V054cEJNQTV0ZEhLWGRBdVptNlNGOFlCVW5TdEtqQWxPaWtkUTdIZlZCVkdnc01CUUNHbk5WZUF6cjMzWGxjNDkvZSs3VnNyR256cm0zbTZ5ZGhUVVh2YVMvNWNmZnh6Nzk1UHgvcWc1Szg4L2puejhaNWdlNWE4NjRQLzNiMW1SVWYyZldkejd4aTZQQnhobzg2aVd6b09HQ0sxdFJXMkgwM0UrSnJZU2Q0aWx4blFFcUxiaEpzRTJTRklrVklmNm9Tc0dnZFd5dDNRL3NXeU9kQk51SkFtYkJSQUo3NlNHRThlUVNUcWNsTlBWTUs5QU1QK29HVy9qOGd3eWJuN1lIMkhCUGFLZWl0YzM4RnozYmhtSktVQ1hYS005OTZ4VmEySnR6YXQzSEdnUGVUUm9lR0tiSUZCYnN5eXMyVGRLdDVIWG54c3o3YVB1Y3YvZ1kzYjI3R0piY3JWczNHZWIzWWJmcXVELzUrbyt6ZE4zWGhGOS9hbmZpeGpCNTVGUG44SlRDeWlKWk1vcDIxVENiYzRVSWQzZzVFcUx5dFl6WkJWVUMyWEpITTFtUVdWRjRrS2dQZFRVajdlaGllaTlKQ3RJdEtlTGpoNmVGS3JZbnRHOWFWK0NWRUliVSsxOTdZY0M5TTJBL093R29lV0wzVjBOdEFuYWpuMlUvTDJ2bVFDaDIzMkRWZ055dnE2L3JGeUl3bVp6Q2dPUXoxb0RteUNNdDgycHMyVUkwc3VkazgrK3kzQWQ4ci92TWIrLzhvSDZUa3MzbHlMMTFPT3ZydHJjVnYzVGoxM2MrOTcvNDc3eDRaWHJhV29iRTVtT0djVnRhZ291TnFrek9OYkh5OHpScEZlc0JHaTgwRXMxeVIzTlpBQ2FNS2thME1kTzVCaXV1Unh0TlFiZUhtOFlaRTFCQ2VTWUsrdnRKNnpNM1dsUG1tVzRHSjE3ckh2MjFpdy9tUFZxNUlVN1VXdW5mNDdlS0dMUUk0QXhOcWhXNjNWT3NzdWwzZGVLOVh1MjY0V090cWI4RU16dHlJNUs3NzFtSjFWNGVubi9PWjRvaVQzdy9NN2pnc2tMTndzUFVCSDdRczVHUE5SM3ptN3ZKamIvMzQ3dlUvUDdLOWNoc3RGZktHdUdJRmhHZm9sYU9HMFY5bkUxYmljamp0SmhjL2t4VWdMYzllb2Q0RXZoRTN0QUpUdDJDeUpkanNjYUE5VkRyVUl4L2hDWmErMW91M0FVbFZzQ2FjbDRJd3BNOU9DNjMwNmNjU3Azcjl2R0RkRE4wYndFNDRzR3NOVHJCZ0tpZ3JkTE5TM2F2b2JwOW9hb25WcmZybldCSXRCOTBGblhaT3Z2U2s2eHFQUHZPZHdFVnNQU0N6TFBkWjhvT2xJd0NHKzc3YmZQRnIxbVUvK3ZZbjJuZGY5c1RkUzVXczBGaEdKUkNKRzl3S0htbE1ROEFheFZTQzNhSXU5M1FGTUdUclBZTXJyZXFUUHR2UXZnSVpYb1RLS2M0ZUZMK0F0b2JaY0tYVFlSTG01MEVzSUVRS3UybU1CNGthRFNFZmkxSzVjRXRrTlJCMkliMmZPTStYdkZhM3FjcnRXSFNqcy9lWXNoNTg2clc2dUhKcmxkWlp6Z3EycmVnT3lJWldqRGNmOVlKUFpDYzkrY080OWFjT0dzbk40VWZOZGgrbXk0M21rUjk0VWZNSDN6aXZ1dkNUcnl0NzNjd3VkcVNWWnArbmxiYXdMdDA4ZUthaVlMWXBWZ3l5REdURXVyQ05xbWVYQklUbE5xUjlNV1pvQVZhT1J1a1JXVkI5ckkxR0JKTjZGUjdaY0ErWkh1dFRieWVtb1pjeXFsbVJObEplQnIwN2F1YUxxVmQrYkhmY291c3R1azNSc09aYnlFV3dPUENWRUdxc2FjY0RqMWFWbmZENGkrU0p2L3Mzd0JXMmJ6ejY0SkRjNWdkZnAyVDhybTF5NWl2ZjJGeTA1SEp6NlpmUDY2Mi85U0VzeFMwK0dHenlURjNSSDF1RE1SU2FNcmkvc3NOaUtvRWxCaGFBaTdsQnpPOFBnT3l0UnJJTGtlYkx3QzVEcFUwZFN6UzQ1TldRbHVPWkw2MTBUKzBuOXpzWUtVb1NoOExIOEVSS1RIa0ZkSzRobHVxMUhueGluY3JkcHVnbXhZNHJXTWZBdHFveHFxRzZhZVhCdVJPa3lqRW5QTzJhN01UbmZrankxci9SMnoyNEZTa0hMREw1alUvT2RoOStwV2huOUpqcTJ1Ky9xM3ZUTjgrMmVUdVh4V0RtRUlzWFpJV0U2UnhJUTl6Y29oeE1RNUJjTUptNE1uNExEU3dXWkVnd1lRR2F6TlRGekUwSnJhZGo4OS9FNmdqMVBKRW1NSVF5aWt0TW5UNGxNMGlBWUpYOERkNXRqeEJxY1NzSHRoSHBZZXdQa2M0RlVFNjU2SHFZT2E2VlU3T2IxUUd3bzJocFhSTWRYOW0wWTkyTXdpN29sS1hhcVVnM3d5eDc1RzF5OGtzK3JpYys4MnY0VlVJT1pwSGROMTA5MjMzNHRTTHJ0MlY2N3gyL1VmNzAzOTlTM2ZPangrbElEMWtJWmdpa0tYVTFqWWE0T1VZRlNDNUlJUzVoSVFQSkRjd1ZaTEVnY3dUSmpjdGtNY2JOdlRVbFpBWGEraTJzZVNxcUJiRmhXZzZBWVlnbXpMREQxL3VMK1ZoZVRZTWJZWWt4eGg1dXZheU8rNGhpN0ZXWXpoZWcyZ2EyNlpNS1BJWHZzdGlOQ3VQZXJ1dXBxMnJhOFhaZDE0SFNUbGgwUXFGbllPNHhhOHd4TC95TUh2Mk16d096a3QzOFlFUW1MditQMmU3REF4WnRMQi9qcW0vOWZubmoxOTlZN2I3amFPWW9aaTZZSWFuckNEVTlDeGJpb2k5RllFVnhGZmxiZ2l3VXpBS0JwbmRsTWc5QzZVQ3hCTnM4QitWRTUzSkVFSTZnektWdlh2QmViY0JFM2VJcmYxTUNIWVEyWURCNks2YjdLZWl0QVIwaVZrWXRMZXh3ek1lRTkzQkxCemc2NnJLYXB5eDJzbkxBcXpKMDdPaDFac1VUdjhDeVU4OEhWaC9vWnpCb2thbUxQajdiZmRoMzJkbGNWZDE1NmV2TGRULzhQZHZlc05UTUI1a0hOTVFCTUJRNHlEd0xCa0FXZ3ZpSzhqSlhrQ1dDREJ1ZjdHTDhjZzV0S0I2R2Jmd3VWcGZnVk9zUVRnM1BBVWFwRTFKVEVBWjdjQzhBMU1DQWdtRTFXZmNUMEwwSmJLZzlZaDNEYmJYb051c1c5ZkhNRjhFM1pkR0owcTA2UlFOZGNNcHRMSC9pVnhnOTRpc2Nnc0FMSWxQLzlkSFo3c09ERmwyejdZU3F2Zm1QN04zLy92L1JXVCtQT2NCY3diUWM2SXhYd1RTOEtpNmNYUmhXU1RMRDNpNmM0OWxTL0p5U3JJdTJub1BOejNTcTJLMEZpeklDekVmN1dEQkp4Y0pYUDAzVFVLTHFGWVROWk4xL1FMby9BanZrdkZhc0t6NjAyYUs3MUJjUFY3OVlqSVdKTGt5cVd6U211WGpDTG43OHBicmlPVitUb1dVWEFiTTdvMndBSWxQWHpuZ0N4TUNsTjI0ZkpYZGUrRnJXWFBoYjJsbS9nRkdRVVpBaDQ1d1JEMEpUaUtzMVhqZ1FpbkdNS1lzRTVva25OZ09tQi9rUU92UktySG1NSDNGcG9JeWdMTUN2aE0yZWxjN1R1RjlZM2ErTFlCRTdRZFk3SCtuOEcxUSsxVjh0VEZyWXJPaTRPckxzV3VoMDBhbktNYUdaYTNYa21KL1o1Yy81cm80ODVOL3N5TExybUlXMHFRTWxNbkhyb1dNRC9qcVJyVHRQMGZWWHZvSjcvL05NSmxjZnFWa1hHUUtHeFlHeDZkU3d5WEExWXdvY0NIT0J4UUx6d2NSbFdpZWhjVHkyOVh0WUZ2a0FaQXZWdVNpTGlQT0Vrem5DUUIwOGprelk4NlQ2NzVqMi8zVXA5cmJoN0w0cEQ3NmRGam9kNkZab1YxQXpoZzZ0WEtOanAxeGk1ejNxdXpwMDlJLzRmNER0OWlZeWRkTUZzOTJIZ1l0c1duZTRwWE9HMlhqNW1XeTcrbkhhMjlRaVYyamhWMVlRcE1pUnB2RjVoNDRKV1NvdzZqTUJqWVdzUWx0bllQTm51N2lmTklBaHJDekNCU1ZkN21ETUdRdlpLMXE1Y3J4MGdSeFQvb3g4NnYzUXU4ZlpmV1hsMW92YjJJVnRGcXhnOC9tVkRoOXhweDA1NlhJZE9lWmlHb3QvRE53N1cvZHdwa1E2Tng3Y2NjRDlFYXVybW5SM25LYWRiUy9NTmw3MkhMUDc5cE9ZdWlzbmEvdVYxcW1MSG1TQ0djbGdtWUdXcjRvbGJTUmZoUTYvRWl2TFVReXVtdFlZeW1KWDFBamNVQjNVb1JTc0s3ZFdXckJkaXZhbmtJbHZ1YVczZ25rNE9RY2RuN2ZkdGg1eXM1MzM2Q3UxZGNSbG1vOWRDd3hrSWVoRFJhUjkrei9OZGg5bVJIck54ODQzM1YyUGxkM3JuMjUyM3Y2RWJQZE5KOUhkTXRlVTZ4Q3pFVFdUa0pYSXZNcU5tcVFyYzdXZWo4MmY2TmNNYWFJeWpNcGNyQzdFMlhKdUNFeXEwdFhtSzN0STFZTXFKK3RlamVsOUFyUlhhYlpzaXpZT3Y4TVdSOTFFZDk2MU5uLzREZEM1RTdlczRQOUlrYzRkQjJhbHBJTlpPcTNuajVBTkh5ZFRrNDh3VS9lZWFycGJUcFR1cm1Pa3QyV0pxZFkxSmR1Q05NZWg2SUtaZ253RldwenNWMHhxdUVRRnpWRG1vcFV2MlJZV2w4R29pcG5DWkZ2SnMzdE05b3RmQ0QrOVRSdUgvY3cyVHZpNTZLYTEvQThHM0hTUnp1YnpaN3NQc3k1VDloVk5NWFk1M2M3UnB0MVpKV0tQbExLM0NxdUxLTnNMeE80ZVJhc0dSak5mSjdnVUl4MHlNNkdtdVl1ODJFR2ViMWF4YTVGc2d6WkgxNU5uYTZYYXNSbVltdTNyTzVqbC93Y2ZoeFd6NFdlcTh3QUFBQUJKUlU1RXJrSmdnZz09Ii8+CjwvZGVmcz4KPC9zdmc+'\n\nexport default defineConfig({\n  name: 'Test Metadata 2',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  icon\n})\n"
  },
  {
    "path": "fixtures/valid/pricing-3-plans/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-3-plans',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      features: [\n        'Unlimited images **with watermark**',\n        'No backend generation',\n        'No custom templates`'\n      ],\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ]\n    },\n    {\n      name: 'Starter',\n      slug: 'starter',\n      features: [\n        'Unlimited images **without watermark**',\n        'Unlimited backend generation',\n        'No custom templates'\n      ],\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 999 // $9.99 USD\n        }\n      ]\n    },\n    {\n      name: 'Pro',\n      slug: 'pro',\n      features: [\n        'Unlimited images **without watermark**',\n        'Unlimited backend generation',\n        'Unlimited custom templates'\n      ],\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 2999 // $29.99 USD\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/valid/pricing-custom-0/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-custom-0',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingIntervals: ['month', 'year'],\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ]\n    },\n    {\n      name: 'Basic Monthly',\n      slug: 'basic-monthly',\n      interval: 'month',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 500\n        },\n        {\n          slug: 'custom-test',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 100\n        }\n      ],\n      rateLimit: {\n        limit: 1000,\n        // TODO\n        // interval: '30d' // 60 * 60 * 24 * 30 // 30 days in seconds\n        interval: 60 * 60 * 24 * 30 // 30 days in seconds\n      }\n    },\n    {\n      name: 'Basic Annual',\n      slug: 'basic-annual',\n      interval: 'year',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 400 * 12 // 20% discount\n        },\n        {\n          slug: 'custom-test',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 80 // 20% discount\n        }\n      ],\n      rateLimit: {\n        limit: 1500,\n        interval: 60 * 60 * 24 * 30 // 30 days in seconds\n      }\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/valid/pricing-freemium/agentic.config.ts",
    "content": "import { defaultFreePricingPlan, defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  // TODO: resolve name / slug conflicts\n  name: 'test-pricing-freemium',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [\n    defaultFreePricingPlan,\n    {\n      name: 'Basic',\n      slug: 'basic',\n      trialPeriodDays: 7,\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 499 // $4.99 USD\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/valid/pricing-monthly-annual/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-monthly-annual',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingIntervals: ['month', 'year'],\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'custom-base',\n          usageType: 'licensed',\n          amount: 0\n        }\n      ]\n    },\n    {\n      name: 'Basic Monthly',\n      slug: 'basic-monthly',\n      interval: 'month',\n      lineItems: [\n        {\n          slug: 'custom-base',\n          usageType: 'licensed',\n          amount: 100\n        }\n      ]\n    },\n    {\n      name: 'Basic Annual',\n      slug: 'basic-annual',\n      interval: 'year',\n      lineItems: [\n        {\n          slug: 'custom-base',\n          usageType: 'licensed',\n          amount: 70\n        }\n      ]\n    }\n  ]\n})\n"
  },
  {
    "path": "fixtures/valid/pricing-pay-as-you-go/agentic.config.ts",
    "content": "import { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: 'test-pricing-pay-as-you-go',\n  origin: {\n    type: 'raw',\n    url: 'https://httpbin.org'\n  },\n  pricingPlans: [\n    {\n      name: 'Free',\n      slug: 'free',\n      lineItems: [\n        {\n          slug: 'base',\n          usageType: 'licensed',\n          amount: 0\n        },\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'per_unit',\n          unitAmount: 0\n          // Free but limited to 20 requests per day\n        }\n      ],\n      rateLimit: {\n        limit: 20,\n        interval: 60 * 60 * 24 // 1 day in seconds\n      }\n    },\n    {\n      name: 'Pay-As-You-Go',\n      slug: 'pay-as-you-go',\n      lineItems: [\n        {\n          slug: 'requests',\n          usageType: 'metered',\n          billingScheme: 'tiered',\n          tiersMode: 'volume',\n          // $0.00467 USD per request up to 999 requests per month\n          // then $0.00053 USD for unlimited further requests that month\n          tiers: [\n            {\n              upTo: 999,\n              unitAmount: 0.467\n            },\n            {\n              upTo: 'inf',\n              unitAmount: 0.053\n            }\n          ]\n        }\n      ],\n      rateLimit: {\n        limit: 1000,\n        interval: '1d'\n      }\n    }\n  ]\n})\n"
  },
  {
    "path": "legacy/.editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\ntab_width = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": "legacy/.github/funding.yml",
    "content": "github: [transitive-bullshit]\n"
  },
  {
    "path": "legacy/.github/workflows/main.yml",
    "content": "name: CI\n\non: [push]\n\njobs:\n  test:\n    name: Test Node.js ${{ matrix.node-version }}\n    runs-on: ubuntu-latest\n\n    strategy:\n      fail-fast: true\n      matrix:\n        node-version:\n          - 18\n          - 22\n          - 23\n\n    steps:\n      - uses: actions/checkout@v4\n      - uses: pnpm/action-setup@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: 'pnpm'\n\n      - run: pnpm install --frozen-lockfile --strict-peer-dependencies\n      - run: pnpm build\n      - run: pnpm test\n"
  },
  {
    "path": "legacy/.github/workflows/release.yml",
    "content": "name: Release\n\non:\n  push:\n    tags:\n      - 'v*'\n  workflow_dispatch:\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - uses: pnpm/action-setup@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n          cache: pnpm\n      - run: pnpm dlx changelogithub\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": "legacy/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\nnode_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n.next/\n\n# production\nbuild/\ndist/\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# local env files\n.env*.local\n\n# turbo\n.turbo\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n\n.env\n\nold/\nout/\n"
  },
  {
    "path": "legacy/.husky/_/pre-commit",
    "content": "#!/bin/sh\n\nif [ \"$SKIP_SIMPLE_GIT_HOOKS\" = \"1\" ]; then\n    echo \"[INFO] SKIP_SIMPLE_GIT_HOOKS is set to 1, skipping hook.\"\n    exit 0\nfi\n\nif [ -f \"$SIMPLE_GIT_HOOKS_RC\" ]; then\n    . \"$SIMPLE_GIT_HOOKS_RC\"\nfi\n\nnpx lint-staged"
  },
  {
    "path": "legacy/.npmrc",
    "content": "enable-pre-post-scripts=true\npackage-manager-strict=false\n"
  },
  {
    "path": "legacy/.prettierignore",
    "content": "packages/openapi-to-ts/fixtures/generated\n"
  },
  {
    "path": "legacy/.vscode/launch.json",
    "content": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"tsx\",\n      \"type\": \"node\",\n      \"request\": \"launch\",\n\n      // Debug current file in VSCode\n      \"program\": \"${file}\",\n\n      /*\n       * Path to tsx binary\n       * Assuming locally installed\n       */\n      \"runtimeExecutable\": \"tsx\",\n\n      /*\n       * Open terminal when debugging starts (Optional)\n       * Useful to see console.logs\n       */\n      \"console\": \"integratedTerminal\",\n      \"internalConsoleOptions\": \"neverOpen\",\n\n      // Files to exclude from debugger (e.g. call stack)\n      \"skipFiles\": [\n        // Node.js internal core modules\n        \"<node_internals>/**\",\n\n        // Ignore all dependencies (optional)\n        \"${workspaceFolder}/node_modules/**\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "legacy/docs/intro.mdx",
    "content": "---\ntitle: Intro\ndescription: Agentic is an open source, TypeScript, AI agent standard library that works with any LLM and TS AI SDK.\n---\n\n<Frame style={{ maxWidth: 308, margin: '0 auto' }}>\n  <img src='/media/agentic-header.jpg' alt='Agentic header' />\n</Frame>\n\nAgentic's standard library of TypeScript AI tools are **optimized for both TS-usage as well as LLM-based usage**, which is really important for testing and debugging.\n\nAgentic tools work with any LLM capable of function calling and all of the major TS AI SDKs, including:\n\n- Vercel AI SDK\n- OpenAI\n- LangChain\n- LlamaIndex\n- Mastra\n- Firebase Genkit\n- Dexa Dexter\n- xsAI\n\n## Features\n\n- ✅ All tools are thoroughly tested in production\n- ✅ Tools work across all leading TS AI SDKs\n- ✅ Tools are hand-coded and extremely minimal\n- ✅ Tools have both a good manual DX and LLM DX via the `@aiFunction` decorator\n- ✅ Tools use native `fetch`\n- ✅ Tools use [ky](https://github.com/sindresorhus/ky) to wrap `fetch`, so HTTP options, throttling, retries, etc are easy to customize\n- ✅ Supports tools from any MCP server ([createMcpTools](/tools/mcp))\n- ✅ Generate new Agentic tool clients from OpenAPI specs ([@agentic/openapi-to-ts](https://github.com/transitive-bullshit/agentic/tree/main/packages/openapi-to-ts))\n- ✅ 100% open source && not trying to sell you anything 💯\n"
  },
  {
    "path": "legacy/docs/mint.json",
    "content": "{\n  \"$schema\": \"https://mintlify.com/schema.json\",\n  \"name\": \"Agentic\",\n  \"logo\": {\n    \"dark\": \"/media/agentic-logo-dark.svg\",\n    \"light\": \"/media/agentic-logo-light.svg\"\n  },\n  \"favicon\": \"/media/favicon.svg\",\n  \"backgroundImage\": \"/media/bg.png\",\n  \"colors\": {\n    \"primary\": \"#0D969D\",\n    \"light\": \"#13D3DC\",\n    \"dark\": \"#0D969D\",\n    \"anchors\": {\n      \"from\": \"#0D969D\",\n      \"to\": \"#13D3DC\"\n    }\n  },\n  \"topbarLinks\": [\n    {\n      \"name\": \"Twitter\",\n      \"url\": \"https://x.com/transitive_bs\"\n    }\n  ],\n  \"topbarCtaButton\": {\n    \"name\": \"GitHub\",\n    \"url\": \"https://github.com/transitive-bullshit/agentic\"\n  },\n  \"anchors\": [\n    {\n      \"name\": \"GitHub\",\n      \"icon\": \"github\",\n      \"url\": \"https://github.com/transitive-bullshit/agentic\"\n    }\n  ],\n  \"navigation\": [\n    {\n      \"group\": \"Getting Started\",\n      \"pages\": [\"intro\", \"quickstart\", \"usage\"]\n    },\n    {\n      \"group\": \"AI SDKs\",\n      \"pages\": [\n        \"sdks/ai-sdk\",\n        \"sdks/mastra\",\n        \"sdks/langchain\",\n        \"sdks/llamaindex\",\n        \"sdks/genkit\",\n        \"sdks/dexter\",\n        \"sdks/openai\",\n        \"sdks/genaiscript\",\n        \"sdks/xsai\"\n      ]\n    },\n    {\n      \"group\": \"Tools\",\n      \"pages\": [\n        \"tools/airtable\",\n        \"tools/apollo\",\n        \"tools/arxiv\",\n        \"tools/bing\",\n        \"tools/brave-search\",\n        \"tools/calculator\",\n        \"tools/clearbit\",\n        \"tools/dexa\",\n        \"tools/diffbot\",\n        \"tools/duck-duck-go\",\n        \"tools/e2b\",\n        \"tools/exa\",\n        \"tools/firecrawl\",\n        \"tools/hacker-news\",\n        \"tools/gravatar\",\n        \"tools/google-custom-search\",\n        \"tools/google-docs\",\n        \"tools/google-drive\",\n        \"tools/hunter\",\n        \"tools/jina\",\n        \"tools/leadmagic\",\n        \"tools/midjourney\",\n        \"tools/mcp\",\n        \"tools/notion\",\n        \"tools/novu\",\n        \"tools/open-meteo\",\n        \"tools/people-data-labs\",\n        \"tools/perigon\",\n        \"tools/polygon\",\n        \"tools/predict-leads\",\n        \"tools/proxycurl\",\n        \"tools/reddit\",\n        \"tools/rocketreach\",\n        \"tools/searxng\",\n        \"tools/serpapi\",\n        \"tools/serper\",\n        \"tools/slack\",\n        \"tools/social-data\",\n        \"tools/tavily\",\n        \"tools/twilio\",\n        \"tools/twitter\",\n        \"tools/typeform\",\n        \"tools/weather\",\n        \"tools/wikidata\",\n        \"tools/wikipedia\",\n        \"tools/wolfram-alpha\",\n        \"tools/youtube\",\n        \"tools/zoominfo\"\n      ]\n    }\n  ],\n  \"footerSocials\": {\n    \"x\": \"https://x.com/transitive_bs\",\n    \"github\": \"https://github.com/transitive-bullshit/agentic\"\n  },\n  \"seo\": {\n    \"indexHiddenPages\": true\n  },\n  \"modeToggle\": {\n    \"default\": \"light\",\n    \"isHidden\": true\n  }\n}\n"
  },
  {
    "path": "legacy/docs/quickstart.mdx",
    "content": "---\ntitle: Quick Start\n---\n\n<Info>\n  **Prerequisite**: All Agentic packages are [ESM\n  only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c)\n  and require `Node.js >= 18` or an equivalent environment (Bun, Deno, CF\n  workers, etc).\n</Info>\n\n<Steps>\n  <Step title='Install core deps (zod)'>\n    <CodeGroup>\n      ```bash npm\n      npm install zod\n      ```\n\n      ```bash yarn\n      yarn add zod\n      ```\n\n      ```bash pnpm\n      pnpm add zod\n      ```\n    </CodeGroup>\n\n  </Step>\n\n  <Step title='Install AI tools'>\n    You can either install all of the AI tools via `@agentic/stdlib`, or you can install them individually via their respective packages (`@agentic/weather`, `@agentic/twitter`, etc.).\n\n    <AccordionGroup>\n      <Accordion title=\"Install all AI tools\">\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/stdlib\n          ```\n\n          ```bash yarn\n          yarn add @agentic/stdlib\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/stdlib\n          ```\n        </CodeGroup>\n      </Accordion>\n\n      <Accordion title=\"Install individual AI tools\">\n        Docs for individual tools are available [here](/tools).\n\n        Here's an example of how to install the [Weather tool](/tools/weather):\n\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/weather\n          ```\n\n          ```bash yarn\n          yarn add @agentic/weather\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/weather\n          ```\n        </CodeGroup>\n      </Accordion>\n\n    </AccordionGroup>\n\n    <Note>\n      There is no functional difference between using `@agentic/stdlib` versus using the individual tool packages directly. The only difference is if you want to optimize your install size.\n\n      The default examples all use `@agentic/stdlib` for simplicity.\n    </Note>\n\n  </Step>\n\n  <Step title='Install an AI SDK Adapter'>\n    To use Agentic with one of the supported AI SDKs, you'll also need to install its corresponding adapter package.\n\n    <AccordionGroup>\n      <Accordion title=\"Vercel AI SDK\">\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/ai-sdk ai\n          ```\n\n          ```bash yarn\n          yarn add @agentic/ai-sdk ai\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/ai-sdk ai\n          ```\n        </CodeGroup>\n\n        See the [AI SDK adapter docs](/sdks/ai-sdk) for usage details.\n      </Accordion>\n\n      <Accordion title=\"Mastra\">\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/mastra @mastra/core\n          ```\n\n          ```bash yarn\n          yarn add @agentic/mastra @mastra/core\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/mastra @mastra/core\n          ```\n        </CodeGroup>\n\n        See the [Mastra adapter docs](/sdks/mastra) for usage details.\n      </Accordion>\n\n      <Accordion title=\"LangChain\">\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/langchain @langchain/core langchain\n          ```\n\n          ```bash yarn\n          yarn add @agentic/langchain @langchain/core langchain\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/langchain @langchain/core langchain\n          ```\n        </CodeGroup>\n\n        See the [LangChain adapter docs](/sdks/langchain) for usage details.\n      </Accordion>\n\n      <Accordion title=\"LlamaIndex\">\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/llamaindex llamaindex\n          ```\n\n          ```bash yarn\n          yarn add @agentic/llamaindex llamaindex\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/llamaindex llamaindex\n          ```\n        </CodeGroup>\n\n        See the [LlamaIndex adapter docs](/sdks/llamaindex) for usage details.\n      </Accordion>\n\n      <Accordion title=\"Firebase Genkit\">\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/genkit genkit\n          ```\n\n          ```bash yarn\n          yarn add @agentic/genkit genkit\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/genkit genkit\n          ```\n        </CodeGroup>\n\n        See the [Genkit adapter docs](/sdks/genkit) for usage details.\n      </Accordion>\n\n      <Accordion title=\"Dexa Dexter\">\n        <CodeGroup>\n          ```bash npm\n          npm install @agentic/dexter @dexaai/dexter\n          ```\n\n          ```bash yarn\n          yarn add @agentic/dexter @dexaai/dexter\n          ```\n\n          ```bash pnpm\n          pnpm add @agentic/dexter @dexaai/dexter\n          ```\n        </CodeGroup>\n\n        See the [Dexter adapter docs](/sdks/dexter) for usage details.\n      </Accordion>\n\n      <Accordion title=\"OpenAI SDK\">\n        <CodeGroup>\n          ```bash npm\n          npm install openai\n          ```\n\n          ```bash yarn\n          yarn add openai\n          ```\n\n          ```bash pnpm\n          pnpm add openai\n          ```\n        </CodeGroup>\n\n        There's no need for a separate adapter with the OpenAI SDK since all agentic tools are compatible with OpenAI by default. You can use `AIFunctionSet.specs` for function calling or `AIFunctionSet.toolSpecs` for parallel tool calling.\n\n        See the [OpenAI adapter docs](/sdks/openai) for usage details.\n      </Accordion>\n\n    </AccordionGroup>\n\n    <Note>\n      You can use Agentic without any of these AI SDKs. `@agentic/core`, `@agentic/stdlib`, and all individual tool packages are compatible with any LLM and AI SDK that supports function calling / tool use.\n    </Note>\n\n  </Step>\n\n</Steps>\n"
  },
  {
    "path": "legacy/docs/scratch.md",
    "content": "## Client Design Philosophy\n\n- clients should be as minimal as possible\n- clients should use `ky` and `zod` where possible\n- clients should have a strongly-typed TS DX\n- clients should expose select methods via the `@aiFunction(...)` decorator\n  - `inputSchema` zod schemas should be as minimal as possible with descriptions prompt engineered specifically for use with LLMs\n- clients and AIFunctions should be composable via `AIFunctionSet`\n- clients should work with all major TS AI SDKs\n\n## TODO\n\n- tools\n  - browserbase\n  - [brave search](https://brave.com/search/api/)\n  - [phantombuster](https://phantombuster.com)\n  - [apify](https://apify.com/store)\n  - perplexity\n  - valtown\n  - replicate\n  - huggingface\n  - pull from [clay](https://www.clay.com/integrations)\n  - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain)\n    - provide a converter for langchain `DynamicStructuredTool`\n  - pull from [nango](https://docs.nango.dev/integrations/overview)\n  - pull from [activepieces](https://github.com/activepieces/activepieces/tree/main/packages/pieces/community)\n  - general openapi support ala [workgpt](https://github.com/team-openpm/workgpt)\n- compound tools / chains / flows / runnables\n  - market maps\n- investigate [autotool](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/autotool)\n- investigate [alt search engines](https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/)\n- investigate [data connectors](https://github.com/mendableai/data-connectors)\n- add unit tests for individual providers\n"
  },
  {
    "path": "legacy/docs/sdks/genaiscript.mdx",
    "content": "---\ntitle: GenAIScript\ndescription: Builtin agentic tool support in GenAIScript.\n---\n\n- package: none necessary\n- [GenAIScript docs](https://microsoft.github.io/genaiscript/guides/agentic-tools/)\n\n## Usage\n\n```ts\nimport { calculator } from '@agentic/calculator'\ndefTool(calculator)\n\n$`Answer the following arithmetic question: How much is 11 + 4? then divide by 3?`\n```\n\n## Running this example\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx genaiscript examples/genaiscript/calculator.genai.mts\n```\n"
  },
  {
    "path": "legacy/docs/sdks/xsai.mdx",
    "content": "---\ntitle: xsAI SDK\ndescription: Agentic adapter for the xsAI SDK.\n---\n\n- package: `@agentic/xsai`\n- exports: `function createXSAITools`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/xsai/src/xsai.ts)\n- [xsAI SDK docs](https://xsai.js.org)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/xsai xsai @xsai/tool\n```\n\n```bash yarn\nyarn add @agentic/xsai xsai @xsai/tool\n```\n\n```bash pnpm\npnpm add @agentic/xsai xsai @xsai/tool\n```\n\n</CodeGroup>\n\n## Usage\n\n<Note>\n  Note that `createXSAITools` is `async` because `xsai`'s underlying\n  `xsschema.toJsonSchema` is async.\n</Note>\n\n```ts\nimport 'dotenv/config'\n\nimport { WeatherClient } from '@agentic/weather'\nimport { createXSAITools } from '@agentic/xsai'\nimport { generateText } from 'xsai'\n\nasync function main() {\n  const weather = new WeatherClient()\n\n  const result = await generateText({\n    apiKey: process.env.OPENAI_API_KEY!,\n    baseURL: 'https://api.openai.com/v1/',\n    model: 'gpt-4o-mini',\n    tools: await createXSAITools(weather),\n    toolChoice: 'required',\n    temperature: 0,\n    messages: [\n      {\n        role: 'system',\n        content: 'You are a helpful assistant. Be as concise as possible.'\n      },\n      { role: 'user', content: 'What is the weather in San Francisco?' }\n    ]\n  })\n\n  console.log(JSON.stringify(result, null, 2))\n}\n\nawait main()\n```\n\nNote that this example snippet also requires you to install the Agentic weather tool and `dotenv`.\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/weather dotenv\n```\n\n```bash yarn\nyarn add @agentic/weather dotenv\n```\n\n```bash pnpm\npnpm add @agentic/weather dotenv\n```\n\n</CodeGroup>\n\n## Running this example\n\n<Info>\n  You'll need a free API key from [weatherapi.com](https://www.weatherapi.com)\n  to run this example. Store it in a local `.env` file as `WEATHER_API_KEY`.\n</Info>\n\n<Info>\n  You'll need an [OpenAI API key](https://platform.openai.com/docs/quickstart)\n  to run this example. Store it in a local `.env` file as `OPENAI_API_KEY`.\n</Info>\n\n```sh\ngit clone git@github.com:transitive-bullshit/agentic.git\ncd agentic\npnpm install\necho 'WEATHER_API_KEY=your-key' >> .env\necho 'OPENAI_API_KEY=your-key' >> .env\nnpx tsx examples/xsai/bin/weather.ts\n```\n"
  },
  {
    "path": "legacy/docs/tools/airtable.mdx",
    "content": "---\ntitle: Airtable\ndescription: Airtable is a no-code spreadsheets, CRM, and database.\n---\n\n- package: `@agentic/airtable`\n- exports: `class AirtableClient`, `namespace airtable`\n- env vars: `AIRTABLE_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/airtable/src/airtable-client.ts)\n- [airtable api docs](https://airtable.com/developers/web/api/introduction)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/airtable\n```\n\n```bash yarn\nyarn add @agentic/airtable\n```\n\n```bash pnpm\npnpm add @agentic/airtable\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { AirtableClient } from '@agentic/airtable'\n\nconst airtable = new AirtableClient()\nconst { bases } = await airtable.listBases()\nconsole.log('bases', tables)\n\nconst baseId = bases[0]!.id\nconst tables = await airtable.listTables({ baseId })\nconsole.log('tables', tables)\n\nconst tableId = tables[0]!.id\nconst searchResults = await airtable.searchRecords({\n  baseId,\n  tableId,\n  searchTerm: 'Travis'\n})\nconsole.log('search results', searchResults)\n```\n\n(this is just an example of how you'd use the client)\n"
  },
  {
    "path": "legacy/docs/tools/apollo.mdx",
    "content": "---\ntitle: Apollo\ndescription: Apollo provides an API for B2B person and company enrichment.\n---\n\n- package: `@agentic/apollo`\n- exports: `class Apollo`, `namespace apollo`\n- env vars: `APOLLO_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/apollo/src/apollo-client.ts)\n- [apollo api docs](https://docs.apollo.io)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/apollo\n```\n\n```bash yarn\nyarn add @agentic/apollo\n```\n\n```bash pnpm\npnpm add @agentic/apollo\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { ApolloClient } from '@agentic/apollo'\n\nconst apollo = new ApolloClient()\nconst res = await apollo.enrichPerson({\n  linkedin_url: 'https://linkedin.com/in/fisch2'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/arxiv.mdx",
    "content": "---\ntitle: ArXiv\ndescription: Search for research articles.\n---\n\n- package: `@agentic/arxiv`\n- exports: `class ArXivClient`, `namespace arxiv`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/arxiv/src/arxiv-client.ts)\n- [arxiv api docs](https://info.arxiv.org/help/api/index.html)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/arxiv\n```\n\n```bash yarn\nyarn add @agentic/arxiv\n```\n\n```bash pnpm\npnpm add @agentic/arxiv\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { ArXivClient } from '@agentic/arxiv'\n\n// No API is required to use the ArXiv API\nconst arxiv = new ArXivClient()\nconst results = await arxiv.search({\n  query: 'machine learning',\n  maxResults: 10\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/bing.mdx",
    "content": "---\ntitle: Bing\ndescription: Bing web search API client.\n---\n\n- package: `@agentic/bing`\n- exports: `class BingClient`, `namespace bing`\n- env vars: `BING_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/bing/src/bing-client.ts)\n- [bing web search docs](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/bing\n```\n\n```bash yarn\nyarn add @agentic/bing\n```\n\n```bash pnpm\npnpm add @agentic/bing\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { BingClient } from '@agentic/bing'\n\nconst bing = new BingClient()\nconst res = await bing.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/brave-search.mdx",
    "content": "---\ntitle: Brave Search\ndescription: Brave web search and local places search.\n---\n\n- package: `@agentic/brave-search`\n- exports: `class BraveSearchClient`, `namespace braveSearch`\n- env vars: `BRAVE_SEARCH_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/brave-search/src/brave-search-client.ts)\n- [brave search docs](https://brave.com/search/api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/brave-search\n```\n\n```bash yarn\nyarn add @agentic/brave-search\n```\n\n```bash pnpm\npnpm add @agentic/brave-search\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { BraveSearchClient } from '@agentic/brave-search'\n\nconst braveSearch = new BraveSearchClient()\nconst res = await braveSearch.search('latest news about openai')\n```\n"
  },
  {
    "path": "legacy/docs/tools/calculator.mdx",
    "content": "---\ntitle: Calculator\ndescription: A simple calculator tool.\n---\n\n- package: `@agentic/calculator`\n- exports: `function calculator`\n- env vars: _none_\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/calculator/src/calculator.ts)\n- [mathjs docs](https://mathjs.org)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/calculator\n```\n\n```bash yarn\nyarn add @agentic/calculator\n```\n\n```bash pnpm\npnpm add @agentic/calculator\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { calculator } from '@agentic/calculator'\n\nconst res = await calculator({ expr: '1 + 1' })\n```\n"
  },
  {
    "path": "legacy/docs/tools/clearbit.mdx",
    "content": "---\ntitle: Clearbit\ndescription: Resolving and enriching people and company data.\n---\n\n- package: `@agentic/clearbit`\n- exports: `class ClearbitClient`, `namespace clearbit`\n- env vars: `CLEARBIT_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/clearbit/src/clearbit-client.ts)\n- [clearbit api docs](https://dashboard.clearbit.com/docs)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/clearbit\n```\n\n```bash yarn\nyarn add @agentic/clearbit\n```\n\n```bash pnpm\npnpm add @agentic/clearbit\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { ClearbitClient } from '@agentic/clearbit'\n\nconst clearbit = new ClearbitClient()\nconst res = await clearbit.companyEnrichment({ domain: 'apple.com' })\n```\n"
  },
  {
    "path": "legacy/docs/tools/dexa.mdx",
    "content": "---\ntitle: Dexa\ndescription: Answers questions from the world's best podcasters.\n---\n\n<Warning>\n  The [Dexa](https://dexa.ai) API is currently only available as a closed beta.\n</Warning>\n\n- package: `@agentic/dexa`\n- exports:\n  - `class DexaClient`, `namespace dexa`\n  - `class ScraperClient`, `namespace scraper`\n- env vars: `DEXA_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/dexa/src/dexa-client.ts)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/dexa\n```\n\n```bash yarn\nyarn add @agentic/dexa\n```\n\n```bash pnpm\npnpm add @agentic/dexa\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { DexaClient } from '@agentic/dexa'\n\nconst dexa = new DexaClient()\nconst res = await dexa.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/diffbot.mdx",
    "content": "---\ntitle: Diffbot\ndescription: Diffbot API client.\n---\n\nDiffbot provides web page classification and scraping. It also provides access to a knowledge graph with the ability to perform person and company data enrichment.\n\n- package: `@agentic/diffbot`\n- exports: `class DiffbotClient`, `namespace diffbot`\n- env vars: `DIFFBOT_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/diffbot/src/diffbot-client.ts)\n- [diffbot api docs](https://docs.diffbot.com)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/diffbot\n```\n\n```bash yarn\nyarn add @agentic/diffbot\n```\n\n```bash pnpm\npnpm add @agentic/diffbot\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { DiffbotClient } from '@agentic/diffbot'\n\nconst diffbot = new DiffbotClient()\nconst res = await diffbot.analyzeUrl('https://example.com')\n```\n"
  },
  {
    "path": "legacy/docs/tools/duck-duck-go.mdx",
    "content": "---\ntitle: DuckDuckGo\ndescription: Search for research articles.\n---\n\n- package: `@agentic/duck-duck-go`\n- exports: `class DuckDuckGoClient`, `namespace duckduckgo`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/duck-duck-go/src/duck-duck-go-client.ts)\n- [Duck Duck Go api docs](https://api.duckduckgo.com)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/duck-duck-go\n```\n\n```bash yarn\nyarn add @agentic/duck-duck-go\n```\n\n```bash pnpm\npnpm add @agentic/duck-duck-go\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { DuckDuckGoClient } from '@agentic/duck-duck-go'\n\n// No API is required to use the DuckDuckGo API\nconst duckDuckGo = new DuckDuckGoClient()\nconst results = await duckDuckGo.search({\n  query: 'latest news about AI'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/e2b.mdx",
    "content": "---\ntitle: E2B\ndescription: Hosted Python code interpreter sandbox.\n---\n\nHosted Python code intrepreter sandbox which is really useful for data analysis, flexible code execution, and advanced reasoning on-the-fly.\n\n- package: `@agentic/e2b`\n- exports: `function e2b`\n- env vars: `E2B_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/e2b/src/e2b.ts)\n- [e2b api docs](https://e2b.dev)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/e2b @e2b/code-interpreter\n```\n\n```bash yarn\nyarn add @agentic/e2b @e2b/code-interpreter\n```\n\n```bash pnpm\npnpm add @agentic/e2b @e2b/code-interpreter\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { e2b } from '@agentic/e2b'\n\nconst res = await e2b({ code: 'print(\"Hello, World\")' })\n```\n"
  },
  {
    "path": "legacy/docs/tools/exa.mdx",
    "content": "---\ntitle: Exa\ndescription: Web search tailored for LLMs.\n---\n\n- package: `@agentic/exa`\n- exports: `class ExaClient`, `namespace exa`\n- env vars: `EXA_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/exa/src/exa-client.ts)\n- [exa api docs](https://docs.exa.ai)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/exa\n```\n\n```bash yarn\nyarn add @agentic/exa\n```\n\n```bash pnpm\npnpm add @agentic/exa\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { ExaClient } from '@agentic/exa'\n\nconst exa = new ExaClient()\nconst res = await exa.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/firecrawl.mdx",
    "content": "---\ntitle: Firecrawl\ndescription: Website scraping and structured data extraction.\n---\n\nTurn websites into LLM-ready data. Crawl and convert any website into clean markdown or structured data.\n\n- package: `@agentic/firecrawl`\n- exports: `class FirecrawlClient`, `namespace firecrawl`\n- env vars: `FIRECRAWL_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/firecrawl/src/firecrawl-client.ts)\n- [firecrawl api docs](https://www.firecrawl.dev)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/firecrawl\n```\n\n```bash yarn\nyarn add @agentic/firecrawl\n```\n\n```bash pnpm\npnpm add @agentic/firecrawl\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { FirecrawlClient } from '@agentic/firecrawl'\n\nconst firecrawl = new FirecrawlClient()\nconst res = await firecrawl.scrapeUrl('https://example.com')\n```\n"
  },
  {
    "path": "legacy/docs/tools/google-custom-search.mdx",
    "content": "---\ntitle: Google Custom Search\ndescription: Google Custom Search for online trends, news, current events, real-time information, or research topics.\n---\n\n- package: `@agentic/google-custom-search`\n- exports: `class GoogleCustomSearchClient`, `namespace googleCustomSearch`\n- env vars: `GOOGLE_API_KEY`, `GOOGLE_CSE_ID`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/google-custom-search/src/google-custom-search-client.ts)\n- [google custom search docs](https://developers.google.com/custom-search/v1/overview)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/google-custom-search\n```\n\n```bash yarn\nyarn add @agentic/google-custom-search\n```\n\n```bash pnpm\npnpm add @agentic/google-custom-search\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { GoogleCustomSearchClient } from '@agentic/google-custom-search'\n\nconst googleCustomSearch = new GoogleCustomSearchClient()\nconst results = await googleCustomSearch.search('latest news about openai')\n```\n\nMake sure to set the `GOOGLE_API_KEY` and `GOOGLE_CSE_ID` environment variables or pass them to the constructor using the `apiKey` and `cseId` options.\n"
  },
  {
    "path": "legacy/docs/tools/google-docs.mdx",
    "content": "---\ntitle: Google Docs\ndescription: Simplified Google Docs API.\n---\n\n- package: `@agentic/google-docs`\n- exports: `class GoogleDocsClient`, `namespace googleDocs`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/google-docs/src/google-docs-client.ts)\n- [google docs docs](https://developers.google.com/workspace/docs/api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/google-docs googleapis @google-cloud/local-auth\n```\n\n```bash yarn\nyarn add @agentic/google-docs googleapis @google-cloud/local-auth\n```\n\n```bash pnpm\npnpm add @agentic/google-docs googleapis @google-cloud/local-auth\n```\n\n</CodeGroup>\n\n## Example Usage\n\n```ts\nimport { GoogleDriveClient } from '@agentic/google-drive'\nimport { authenticate } from '@google-cloud/local-auth'\nimport { google } from 'googleapis'\n\n// (in a real app, store these auth credentials and reuse them)\nconst auth = await authenticate({\n  scopes: ['https://www.googleapis.com/auth/documents.readonly'],\n  keyfilePath: process.env.GOOGLE_CREDENTIALS_PATH\n})\nconst docs = google.docs({ version: 'v1', auth })\nconst client = new GoogleDocsClient({ docs })\n\nconst document = await client.getDocument({ documentId: 'TODO' })\nconsole.log(document)\n```\n"
  },
  {
    "path": "legacy/docs/tools/google-drive.mdx",
    "content": "---\ntitle: Google Drive\ndescription: Simplified Google Drive API.\n---\n\n- package: `@agentic/google-drive`\n- exports: `class GoogleDriveClient`, `namespace googleDrive`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/google-drive/src/google-drive-client.ts)\n- [google drive docs](https://developers.google.com/workspace/drive/api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/google-drive googleapis google-auth-library\n```\n\n```bash yarn\nyarn add @agentic/google-drive googleapis google-auth-library\n```\n\n```bash pnpm\npnpm add @agentic/google-drive googleapis google-auth-library\n```\n\n</CodeGroup>\n\n## Example Usage\n\n```ts\nimport { GoogleDriveClient } from '@agentic/google-drive'\nimport { GoogleAuth } from 'google-auth-library'\nimport { google } from 'googleapis'\n\nconst auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive' })\nconst drive = google.drive({ version: 'v3', auth })\nconst client = new GoogleDriveClient({ drive })\n\nconst result = await client.listFiles()\n\nconst file = result.files[0]!\nconst metadata = await client.getFile({ fileId: file.id })\nconst content = await client.exportFile({\n  fileId: file.id,\n  mimeType: 'application/pdf'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/gravatar.mdx",
    "content": "---\ntitle: Gravatar\ndescription: Gravatar Profile API.\n---\n\n- package: `@agentic/gravatar`\n- exports: `class GravatarClient`, `namespace gravatar`\n- env vars: `GRAVATAR_API_KEY` _(optional)_\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/gravatar/src/gravatar-client.ts)\n- [Gravatar API docs](https://docs.gravatar.com/api/profiles/rest-api/)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/gravatar\n```\n\n```bash yarn\nyarn add @agentic/gravatar\n```\n\n```bash pnpm\npnpm add @agentic/gravatar\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { GravatarClient } from '@agentic/gravatar'\n\nconst gravatar = new GravatarClient()\nconst profile = await gravatar.getProfileByIdentifier('my-email@example.com')\n```\n"
  },
  {
    "path": "legacy/docs/tools/hacker-news.mdx",
    "content": "---\ntitle: HackerNews\ndescription: Basic client for the official Hacker News API.\n---\n\nNote that the [HN Algolia API](https://hn.algolia.com/api) seems to no longer be available, so we can't add search without quite a bit of overhead.\n\n- package: `@agentic/hacker-news`\n- exports: `class HackerNewsClient`, `namespace hackernews`\n- env vars: `HACKER_NEWS_API_USER_AGENT` _(optional)_\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/hacker-news/src/hacker-news-client.ts)\n- [HN api docs](https://github.com/HackerNews/API)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/hacker-news\n```\n\n```bash yarn\nyarn add @agentic/hacker-news\n```\n\n```bash pnpm\npnpm add @agentic/hacker-news\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { HackerNewsClient } from '@agentic/hacker-news'\n\nconst hn = new HackerNewsClient()\nconst res = await hn.searchItems({\n  query: 'example query',\n  tags: ['story'],\n  numericFilters: ['points>100']\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/hunter.mdx",
    "content": "---\ntitle: Hunter\ndescription: Email finder, verifier, and enrichment.\n---\n\n- package: `@agentic/hunter`\n- exports: `class HunterClient`, `namespace hunter`\n- env vars: `HUNTER_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/hunter/src/hunter-client.ts)\n- [hunter api docs](https://hunter.io/api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/hunter\n```\n\n```bash yarn\nyarn add @agentic/hunter\n```\n\n```bash pnpm\npnpm add @agentic/hunter\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { HunterClient } from '@agentic/hunter'\n\nconst hunter = new HunterClient()\nconst res0 = await hunter.domainSearch('apple.com')\nconst res1 = await hunter.emailFinder({\n  domain: 'transitivebullsh.it',\n  first_name: 'travis',\n  last_name: 'fischer'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/jina.mdx",
    "content": "---\ntitle: Jina\ndescription: URL scraper and web search\n---\n\nLLM-friendly URL reader and search client by [Jina AI](https://jina.ai/reader) with a basic free tier.\n\n- package: `@agentic/jina`\n- exports: `class JinaClient`, `namespace jina`\n- env vars: `JINA_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/jina/src/jina-client.ts)\n- [jina api docs](https://jina.ai/reader)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/jina\n```\n\n```bash yarn\nyarn add @agentic/jina\n```\n\n```bash pnpm\npnpm add @agentic/jina\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { JinaClient } from '@agentic/jina'\n\nconst jina = new JinaClient()\nconst res0 = await jina.readUrl('https://example.com')\nconst res1 = await jina.search({ query: 'latest news', json: true })\n```\n\n## Notes\n\n- Does not support \"stream mode\".\n- Results default to markdown text format.\n- To return JSON (especially useful for `search`), set `json: true` in the options.\n"
  },
  {
    "path": "legacy/docs/tools/leadmagic.mdx",
    "content": "---\ntitle: LeadMagic\ndescription: LeadMagic provides an API for B2B person, company, and email enrichment.\n---\n\n- package: `@agentic/leadmagic`\n- exports: `class LeadMagic`, `namespace leadmagic`\n- env vars: `LEADMAGIC_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/leadmagic/src/leadmagic-client.ts)\n- [leadmagic api docs](https://docs.leadmagic.io)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/leadmagic\n```\n\n```bash yarn\nyarn add @agentic/leadmagic\n```\n\n```bash pnpm\npnpm add @agentic/leadmagic\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { LeadMagicClient } from '@agentic/leadmagic'\n\nconst leadmagic = new LeadMagicClient()\nconst res = await leadmagic.profileSearch({\n  linkedinUsername: 'fisch2'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/mcp.mdx",
    "content": "---\ntitle: MCP Tools\ndescription: Agentic adapter for accessing tools defined by Model Context Protocol (MCP) servers.\n---\n\n- package: `@agentic/mcp`\n- exports: `createMcpTools`, `class McpTools`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/mcp/src/mcp-tools.ts)\n- [MCP docs](https://modelcontextprotocol.io)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/mcp\n```\n\n```bash yarn\nyarn add @agentic/mcp\n```\n\n```bash pnpm\npnpm add @agentic/mcp\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport 'dotenv/config'\n\nimport { createAISDKTools } from '@agentic/ai-sdk'\nimport { createMcpTools } from '@agentic/mcp'\nimport { openai } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\n\nasync function main() {\n  // Create an MCP tools provider, which will start a local MCP server process\n  // and use the stdio transport to communicate with it.\n  const mcpTools = await createMcpTools({\n    name: 'agentic-mcp-filesystem',\n    serverProcess: {\n      command: 'npx',\n      args: [\n        '-y',\n        // This example uses a built-in example MCP server from Anthropic, which\n        // provides a set of tools to access the local filesystem.\n        '@modelcontextprotocol/server-filesystem',\n        // Allow the MCP server to access the current working directory.\n        process.cwd()\n        // Feel free to add additional directories the tool should have access to.\n      ]\n    }\n  })\n\n  const result = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(mcpTools),\n    toolChoice: 'required',\n    temperature: 0,\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What files are in the current directory?'\n  })\n\n  console.log(result.toolResults[0])\n}\n\nawait main()\n```\n\n### createMcpTools\n\n`createMcpTools` creates a new `McpTools` instance by starting or connecting to an MCP server.\n\nYou must provide either an existing `transport`, an existing `serverUrl`, or a\n`serverProcess` to spawn.\n\nAll tools within the `McpTools` instance will be namespaced under the given `name`.\n\n`createMcpTools` takes in the following options ([source](https://github.com/transitive-bullshit/agentic/blob/main/packages/mcp/src/types.ts)):\n\n```ts\nexport interface McpToolsOptions {\n  /**\n   * Provide a name for this client which will be its namespace for all tools and prompts.\n   */\n  name: string\n\n  /**\n   * Provide a version number for this client (defaults to 1.0.0).\n   */\n  version?: string\n\n  /**\n   * If you already have an MCP transport you'd like to use, pass it here to connect to the server.\n   */\n  transport?: Transport\n\n  /**\n   * Start a local server process using the stdio MCP transport.\n   */\n  serverProcess?: StdioServerParameters\n\n  /**\n   * Connect to a remote server process using the SSE MCP transport.\n   */\n  serverUrl?: string\n\n  /**\n   * Return tool responses in raw MCP form instead of processing them for Genkit compatibility.\n   */\n  rawToolResponses?: boolean\n\n  /**\n   * An optional filter function to determine which tools should be enabled.\n   *\n   * By default, all tools available on the MCP server will be enabled, but you\n   * can use this to filter a subset of those tools.\n   */\n  toolsFilter?: McpToolsFilter\n}\n```\n\n### JSON Schema\n\nNote that `McpTools` uses JSON Schemas for toll input parameters, whereas most built-in tools use Zod schemas. This is important because some AI frameworks don't support JSON Schemas as AI function parameters.\n\nCurrently, Mastra, Dexter, and xsAI don't support JSON Schema input parameters, so they won't work with `McpTools`. All of the other AI SDKs should work fine with the JSON Schema-based tools.\n"
  },
  {
    "path": "legacy/docs/tools/midjourney.mdx",
    "content": "---\ntitle: Midjourney\ndescription: Unofficial Midjourney API client for generative images.\n---\n\n- package: `@agentic/midjourney`\n- exports: `class MidjourneyClient`, `namespace midjourney`\n- env vars: `MIDJOURNEY_IMAGINE_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/midjourney/src/midjourney-client.ts)\n- [imagine api docs](https://www.imagineapi.dev)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/midjourney\n```\n\n```bash yarn\nyarn add @agentic/midjourney\n```\n\n```bash pnpm\npnpm add @agentic/midjourney\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { MidjourneyClient } from '@agentic/midjourney'\n\nconst midjourney = new MidjourneyClient()\nconst res = await midjourney.imagine({\n  prompt: 'beautiful sunset over the ocean, oil painting, monet'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/notion.mdx",
    "content": "---\ntitle: Notion\ndescription: Notion API client.\n---\n\nThe [Notion API](https://developers.notion.com/docs) provides a router for accessing pages, databases, and content.\n\n- package: `@agentic/notion`\n- exports: `class NotionClient`, `namespace notion`\n- env vars: `NOTION_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/notion/src/notion-client.ts)\n- [notion api docs](https://developers.notion.com/docs)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/notion\n```\n\n```bash yarn\nyarn add @agentic/notion\n```\n\n```bash pnpm\npnpm add @agentic/notion\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { NotionClient } from '@agentic/notion'\n\nconst notion = new NotionClient()\nconst authenticatedUser = await notion.getSelf()\n```\n\nYou'll need to set up a [Notion Integration](https://developers.notion.com/docs/authorization), give it access to some pages in your Notion workspace, and then set the `NOTION_API_KEY` environment variable to the integration's token.\n"
  },
  {
    "path": "legacy/docs/tools/novu.mdx",
    "content": "---\ntitle: Novu\ndescription: Novu API client.\n---\n\nThe [Novu API](https://novu.co) provides a router for sending notifications across different channels like Email, SMS, Chat, In-App, and Push.\n\n- package: `@agentic/novu`\n- exports: `class NovuClient`, `namespace novu`\n- env vars: `NOVU_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/novu/src/novu-client.ts)\n- [novu api docs](https://novu.co)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/novu\n```\n\n```bash yarn\nyarn add @agentic/novu\n```\n\n```bash pnpm\npnpm add @agentic/novu\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { NovuClient } from '@agentic/novu'\n\nconst novu = new NovuClient()\nconst res = await novu.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/open-meteo.mdx",
    "content": "---\ntitle: Open Meteo\ndescription: Open-Meteo weather API client.\n---\n\nThe [Open-Meteo weather API](https://open-meteo.com) provides a free weather forecast API for open-source developers and non-commercial use.\n\n- package: `@agentic/open-meteo`\n- exports: `class OpenMeteoClient`, `namespace openmeteo`\n- env vars: `OPEN_METEO_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/open-meteo/src/open-meteo-client.ts)\n- [open-meteo api docs](https://open-meteo.com/en/docs)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/open-meteo\n```\n\n```bash yarn\nyarn add @agentic/open-meteo\n```\n\n```bash pnpm\npnpm add @agentic/open-meteo\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { OpenMeteoClient } from '@agentic/open-meteo'\n\nconst openMeteo = new OpenMeteoClient()\nconst res = await openMeteo.getForecast({\n  location: {\n    name: 'San Francisco'\n  }\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/people-data-labs.mdx",
    "content": "---\ntitle: People Data Labs\ndescription: People & company data enrichment.\n---\n\n<Warning>\n  People Data Labs tends to be more expensive than other similar data providers.\n  The author recommends you stay away from them.\n</Warning>\n\n- package: `@agentic/people-data-labs`\n- exports: `class PeopleDataLabsClient`, `namespace peopledatalabs`\n- env vars: `PEOPLE_DATA_LABS_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/people-data-labs/src/people-data-labs-client.ts)\n- [people data labs api docs](https://www.peopledatalabs.com)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/people-data-labs\n```\n\n```bash yarn\nyarn add @agentic/people-data-labs\n```\n\n```bash pnpm\npnpm add @agentic/people-data-labs\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { PeopleDataLabsClient } from '@agentic/people-data-labs'\n\nconst pdl = new PeopleDataLabsClient()\nconst res = await pdl.companyLookup({\n  query: {\n    website: 'apple.com'\n  }\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/perigon.mdx",
    "content": "---\ntitle: Perigon\ndescription: Real-time news API.\n---\n\nReal-time news API and web content data from 140,000+ sources. Structured and enriched by AI, primed for LLMs.\n\n- search news articles\n- search news stories (clusters of related news articles)\n- search people, companies, topics, and journalists\n\n- package: `@agentic/perigon`\n- exports: `class PerigonClient`, `namespace perigon`\n- env vars: `PERIGON_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/perigon/src/perigon-client.ts)\n- [perigon api docs](https://www.goperigon.com/products/news-api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/perigon\n```\n\n```bash yarn\nyarn add @agentic/perigon\n```\n\n```bash pnpm\npnpm add @agentic/perigon\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { PerigonClient } from '@agentic/perigon'\n\nconst perigon = new PerigonClient()\nconst res = await perigon.searchArticles({\n  q: '\"elon musk\" AND tesla'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/polygon.mdx",
    "content": "---\ntitle: Polygon\ndescription: Stock market and company financial data.\n---\n\n- package: `@agentic/polygon`\n- exports: `class PolygonClient`, `namespace polygon`\n- env vars: `POLYGON_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/polygon/src/polygon-client.ts)\n- [polygon api docs](https://polygon.io/docs)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/polygon\n```\n\n```bash yarn\nyarn add @agentic/polygon\n```\n\n```bash pnpm\npnpm add @agentic/polygon\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { PolygonClient } from '@agentic/polygon'\n\nconst polygon = new PolygonClient()\nconst res = await polygon.tickerDetails({ ticker: 'AAPL' })\n```\n"
  },
  {
    "path": "legacy/docs/tools/predict-leads.mdx",
    "content": "---\ntitle: Predict Leads\ndescription: Company data and events API.\n---\n\nIn-depth company data, including signals like fundraising announcemnts, hiring intent, new customers signed, technologies used, product launches, location expansions, awards received, etc.\n\n- package: `@agentic/predict-leads`\n- exports: `class PredictLeadsClient`, `namespace predictleads`\n- env vars: `PREDICT_LEADS_API_KEY`, `PREDICT_LEADS_API_TOKEN`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/predict-leads/src/predict-leads-client.ts)\n- [precit leads api docs](https://docs.predictleads.com/v3)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/predict-leads\n```\n\n```bash yarn\nyarn add @agentic/predict-leads\n```\n\n```bash pnpm\npnpm add @agentic/predict-leads\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { PredictLeadsClient } from '@agentic/predict-leads'\n\nconst predictLeads = new PredictLeadsClient()\nconst res = await predictLeads.getCompanyEvents({ domain: 'apple.com' })\n```\n"
  },
  {
    "path": "legacy/docs/tools/proxycurl.mdx",
    "content": "---\ntitle: Proxycurl\ndescription: People and company data from LinkedIn & Crunchbase.\n---\n\n- package: `@agentic/proxycurl`\n- exports: `class ProxycurlClient`, `namespace proxycurl`\n- env vars: `PROXYCURL_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/proxycurl/src/proxycurl-client.ts)\n- [proxycurl api docs](https://nubela.co/proxycurl)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/proxycurl\n```\n\n```bash yarn\nyarn add @agentic/proxycurl\n```\n\n```bash pnpm\npnpm add @agentic/proxycurl\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { ProxycurlClient } from '@agentic/proxycurl'\n\nconst proxycurl = new ProxycurlClient()\nconst company = await proxycurl.getLinkedInCompany({\n  url: 'https://linkedin.com/company/apple'\n})\n\nconst person = await proxycurl.getLinkedInPerson({\n  url: 'https://linkedin.com/in/fisch2'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/reddit.mdx",
    "content": "---\ntitle: Reddit\ndescription: Basic readonly Reddit API for getting top/hot/new/rising posts from subreddits.\n---\n\n- package: `@agentic/reddit`\n- exports: `class RedditClient`, `namespace reddit`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/reddit/src/reddit-client.ts)\n- [reddit legacy api docs](https://old.reddit.com/dev/api)\n\n<Note>\n  This client uses Reddit's free, legacy JSON API aimed at RSS feeds, so no auth\n  is required. With that being said, Reddit does impose rate limits on the API,\n  so be considerate.\n</Note>\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/reddit\n```\n\n```bash yarn\nyarn add @agentic/reddit\n```\n\n```bash pnpm\npnpm add @agentic/reddit\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { RedditClient } from '@agentic/reddit'\n\nconst reddit = new RedditClient()\nconst result = await reddit.getSubredditPosts({\n  subreddit: 'AskReddit',\n  type: 'hot',\n  limit: 10\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/rocketreach.mdx",
    "content": "---\ntitle: RocketReach\ndescription: RocketReach provides an API for B2B person and company enrichment.\n---\n\n- package: `@agentic/rocketreach`\n- exports: `class RocketReach`, `namespace rocketreach`\n- env vars: `ROCKETREACH_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/rocketreach/src/rocketreach-client.ts)\n- [rocketreach api docs](https://rocketreach.co/api/v2/docs)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/rocketreach\n```\n\n```bash yarn\nyarn add @agentic/rocketreach\n```\n\n```bash pnpm\npnpm add @agentic/rocketreach\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { RocketReachClient } from '@agentic/rocketreach'\n\nconst rocketreach = new RocketReachClient()\nconst res = await rocketreach.lookupPerson({\n  linkedin_url: 'https://www.linkedin.com/in/fisch2'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/searxng.mdx",
    "content": "---\ntitle: Searxng\ndescription: OSS meta search engine.\n---\n\nOpen source meta search engine capable of searching across many different\nsources and search engines.\n\nThe most important search engines are:\n\n- `reddit` (Reddit posts)\n- `google` (Google web search)\n- `google news` (Google News search)\n- `brave` (Brave web search)\n- `arxiv` (academic papers)\n- `genius` (Genius.com for song lyrics)\n- `imdb` (movies and TV shows)\n- `hackernews` (Hacker News)\n- `wikidata` (Wikidata)\n- `wolframalpha` (Wolfram Alpha)\n- `youtube` (YouTube videos)\n- `github` (GitHub code and repositories)\n\n---\n\n- package: `@agentic/searxng`\n- exports: `class SearxngClient`, `namespace searxng`\n- env vars: `SEARXNG_API_BASE_URL`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/searxng/src/searxng-client.ts)\n- [searxng api docs](https://docs.searxng.org)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/searxng\n```\n\n```bash yarn\nyarn add @agentic/searxng\n```\n\n```bash pnpm\npnpm add @agentic/searxng\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { SearxngClient } from '@agentic/searxng'\n\nconst searxng = new SearxngClient()\nconst res = await searxng.search({\n  query: 'us election',\n  engines: ['google', 'reddit', 'hackernews']\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/serpapi.mdx",
    "content": "---\ntitle: SerpAPI\ndescription: Lightweight wrapper around SerpAPI for Google search.\n---\n\n- package: `@agentic/serpapi`\n- exports: `class SerpAPIClient`, `namespace serpapi`\n- env vars: `SERPAPI_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/serpapi/src/serpapi-client.ts)\n- [serpapi api docs](https://serpapi.com/search-api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/serpapi\n```\n\n```bash yarn\nyarn add @agentic/serpapi\n```\n\n```bash pnpm\npnpm add @agentic/serpapi\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { SerpAPIClient } from '@agentic/serpapi'\n\nconst serpapi = new SerpAPIClient()\nconst res = await serpapi.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/serper.mdx",
    "content": "---\ntitle: Serper\ndescription: Lightweight wrapper around Serper for Google search.\n---\n\n- package: `@agentic/serper`\n- exports: `class SerperClient`, `namespace serper`\n- env vars: `SERPER_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/serper/src/serper-client.ts)\n- [serper api docs](https://serper.dev)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/serper\n```\n\n```bash yarn\nyarn add @agentic/serper\n```\n\n```bash pnpm\npnpm add @agentic/serper\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { SerperClient } from '@agentic/serper'\n\nconst serper = new SerperClient()\nconst res = await serper.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/slack.mdx",
    "content": "---\ntitle: Slack\ndescription: Minimal Slack API client for sending and receiving Slack messages.\n---\n\n- package: `@agentic/slack`\n- exports: `class SlackClient`, `namespace slack`\n- env vars: `SLACK_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/slack/src/slack-client.ts)\n- [slack api docs](https://api.slack.com/docs)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/slack\n```\n\n```bash yarn\nyarn add @agentic/slack\n```\n\n```bash pnpm\npnpm add @agentic/slack\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { SlackClient } from '@agentic/slack'\n\nconst slack = new SlackClient()\nconst res = await slack.sendMessage({\n  text: 'hello',\n  channel: 'general'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/social-data.mdx",
    "content": "---\ntitle: Social Data Tools\ndescription: Unofficial Twitter / X client (readonly) which is much cheaper than the official Twitter API.\n---\n\n- package: `@agentic/social-data`\n- exports: `class SocialDataClient`, `namespace socialdata`\n- env vars: `SOCIAL_DATA_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/social-data/src/social-data-client.ts)\n- [social data tools api docs](https://socialdata.tools)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/social-data\n```\n\n```bash yarn\nyarn add @agentic/social-data\n```\n\n```bash pnpm\npnpm add @agentic/social-data\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { SocialDataClient } from '@agentic/social-data'\n\nconst sd = new SocialDataClient()\nconst res = await sd.getUserByUsername('transitive_bs')\n```\n"
  },
  {
    "path": "legacy/docs/tools/tavily.mdx",
    "content": "---\ntitle: Tavily\ndescription: Web search API tailored for LLMs.\n---\n\n- package: `@agentic/tavily`\n- exports: `class TavilyClient`, `namespace tavily`\n- env vars: `TAVILY_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/tavily/src/tavily-client.ts)\n- [tavily api docs](https://tavily.com)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/tavily\n```\n\n```bash yarn\nyarn add @agentic/tavily\n```\n\n```bash pnpm\npnpm add @agentic/tavily\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { TavilyClient } from '@agentic/tavily'\n\nconst tavily = new TavilyClient()\nconst res = await tavily.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/twilio.mdx",
    "content": "---\ntitle: Twilio\ndescription: Twilio conversation API to send and receive SMS messages.\n---\n\n- package: `@agentic/twilio`\n- exports: `class TwilioClient`, `namespace twilio`\n- env vars: `TWILIO_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/twilio/src/twilio-client.ts)\n- [twilio api docs](https://www.twilio.com/docs/conversations/api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/twilio\n```\n\n```bash yarn\nyarn add @agentic/twilio\n```\n\n```bash pnpm\npnpm add @agentic/twilio\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { TwilioClient } from '@agentic/twilio'\n\nconst twilio = new TwilioClient()\nconst res = await twilio.sendMessage({\n  conversationId: 'TODO',\n  text: 'Hello, world'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/twitter.mdx",
    "content": "---\ntitle: Twitter\ndescription: Official Twitter / X API client.\n---\n\nBasic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting.\n\n- package: `@agentic/twitter`\n- exports: `class TwitterClient`, `namespace twitter`\n- env vars: `TWITTER_API_KEY`, `TWITTER_API_PLAN`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/twitter/src/twitter-client.ts)\n- [twitter api docs](https://docs.x.com/x-api)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/twitter\n```\n\n```bash yarn\nyarn add @agentic/twitter\n```\n\n```bash pnpm\npnpm add @agentic/twitter\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { TwitterClient, createTwitterV2Client } from '@agentic/twitter'\n\n// Requires Nango connection ID and callback URL environment variables\nconst rawClient = await createTwitterV2Client()\n\nconst twitter = new TwitterClient({ client: rawClient })\nconst res = await twitter.createTweet({\n  text: 'hello, world'\n})\n```\n\nThis example uses [Nango](https://www.nango.dev) for OAuth support via the [createTwitterV2Client](https://github.com/transitive-bullshit/agentic/blob/main/packages/twitter/src/client.ts#L53) helper function, but you can pass any instance of the underlying [TwitterV2Client](https://github.com/twitterdev/twitter-api-typescript-sdk) to the `TwitterClient` constructor.\n\nAll `TwitterClient` methods are automatically throttled based on your [Twitter API plan](https://docs.x.com/x-api/fundamentals/rate-limits). You can set the twitter plan by setting the `TWITTER_API_PLAN` environment variable or by passing the `twitterApiPlan` parameter to the `TwitterClient` constructor.\n\nThis twitter client is pretty robust, taking into account my [learnings from building a Twitter bot which gained over 150k followers](https://transitivebullsh.it/chatgpt-twitter-bot-lessons).\n"
  },
  {
    "path": "legacy/docs/tools/typeform.mdx",
    "content": "---\ntitle: Typeform\ndescription: Readonly Typeform API client for fetching form insights and responses.\n---\n\n- package: `@agentic/typeform`\n- exports: `class TypeformClient`, `namespace typeform`\n- env vars: `TYPEFORM_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/typeform/src/typeform-client.ts)\n- [typeform api docs](https://www.typeform.com/developers/get-started/)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/typeform\n```\n\n```bash yarn\nyarn add @agentic/typeform\n```\n\n```bash pnpm\npnpm add @agentic/typeform\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { TypeformClient } from '@agentic/typeform'\n\nconst typeform = new TypeformClient()\n\nconst responses = await typeform.getResponsesForForm({\n  formId: 'TODO'\n})\n\nconst insights = await typeform.getInsightsForForm({\n  formId: 'TODO'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/weather.mdx",
    "content": "---\ntitle: Weather\ndescription: Simple Weather API client for accessing weather data based on location.\n---\n\n- package: `@agentic/weather`\n- exports: `class WeatherClient`, `namespace weather`\n- env vars: `WEATHER_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/weather/src/weather-client.ts)\n- [weatherapi.com api docs](https://www.weatherapi.com)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/weather\n```\n\n```bash yarn\nyarn add @agentic/weather\n```\n\n```bash pnpm\npnpm add @agentic/weather\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { WeatherClient } from '@agentic/weather'\n\nconst weather = new WeatherClient()\nconst res = await weather.getCurrentWeather('new york')\n```\n"
  },
  {
    "path": "legacy/docs/tools/wikidata.mdx",
    "content": "---\ntitle: Wikidata\ndescription: Basic Wikidata client.\n---\n\n- package: `@agentic/wikidata`\n- exports: `class WikidataClient`, `namespace wikidata`\n- env vars: `WIKIDATA_API_USER_AGENT` _(optional)_\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/wikidata/src/wikidata-client.ts)\n- [wikibase api docs](https://github.com/maxlath/wikibase-sdk)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/wikidata\n```\n\n```bash yarn\nyarn add @agentic/wikidata\n```\n\n```bash pnpm\npnpm add @agentic/wikidata\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { WikidataClient } from '@agentic/wikidata'\n\nconst wikidata = new WikidataClient()\nconst res = await wikidata.getEntityById('Q317521') // elon musk\n```\n"
  },
  {
    "path": "legacy/docs/tools/wikipedia.mdx",
    "content": "---\ntitle: Wikipedia\ndescription: Wikipedia apage search and summary API.\n---\n\n- package: `@agentic/wikipedia`\n- exports: `class WikipediaClient`, `namespace wikipedia`\n- env vars: `WIKIPEDIA_API_USER_AGENT` _(optional)_\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/wikipedia/src/wikipedia-client.ts)\n- [wikipedia api docs](https://www.mediawiki.org/wiki/API)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/wikipedia\n```\n\n```bash yarn\nyarn add @agentic/wikipedia\n```\n\n```bash pnpm\npnpm add @agentic/wikipedia\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { WikipediaClient } from '@agentic/wikipedia'\n\nconst wikipedia = new WikipediaClient()\nconst res0 = await wikipedia.search({ query: 'steve jobs' })\nconst res1 = await wikipedia.getPageSummary({ title: 'Elon_Musk' })\n```\n"
  },
  {
    "path": "legacy/docs/tools/wolfram-alpha.mdx",
    "content": "---\ntitle: Wolfram Alpha\ndescription: Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions.\n---\n\n- package: `@agentic/wolfram-alpha`\n- exports: `class WolframAlphaClient`, `namespace wolframalpha`\n- env vars: `WOLFRAM_APP_ID`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/wolfram-alpha/src/wolfram-alpha-client.ts)\n- [wolfram alpha api docs](https://products.wolframalpha.com/llm-api/documentation)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/wolfram-alpha\n```\n\n```bash yarn\nyarn add @agentic/wolfram-alpha\n```\n\n```bash pnpm\npnpm add @agentic/wolfram-alpha\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { WolframAlphaClient } from '@agentic/wolfram-alpha'\n\nconst wolframAlpha = new WolframAlphaClient()\nconst res = await wolframAlpha.search('latest news')\n```\n"
  },
  {
    "path": "legacy/docs/tools/youtube.mdx",
    "content": "---\ntitle: YouTube\ndescription: YouTube data API v3 client for searching YT videos and channels.\n---\n\n- package: `@agentic/youtube`\n- exports: `class YouTubeClient`, `namespace youtube`\n- env vars: `YOUTUBE_API_KEY`\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/youtube/src/youtube-client.ts)\n- [youtube api docs](https://developers.google.com/youtube/v3)\n  - [search docs](https://developers.google.com/youtube/v3/docs/search/list)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/youtube\n```\n\n```bash yarn\nyarn add @agentic/youtube\n```\n\n```bash pnpm\npnpm add @agentic/youtube\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { YouTubeClient } from '@agentic/youtube'\n\nconst youtube = new YouTubeClient()\nconst res = await youtube.searchVideos({\n  query: 'cute kittens'\n})\n```\n"
  },
  {
    "path": "legacy/docs/tools/zoominfo.mdx",
    "content": "---\ntitle: ZoomInfo\ndescription: ZoomInfo provides a powerful API for B2B person and company data enrichment.\n---\n\n- package: `@agentic/zoominfo`\n- exports: `class ZoomInfo`, `namespace zoominfo`\n- env vars:\n  - `ZOOMINFO_USERNAME` and `ZOOMINFO_PASSWORD` for basic auth\n  - `ZOOMINFO_USERNAME`, `ZOOMINFO_CLIENT_ID`, and `ZOOMINFO_PRIVATE_KEY` for PKI auth\n- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/zoominfo/src/zoominfo-client.ts)\n- [zoominfo api docs](https://api-docs.zoominfo.com)\n\n## Install\n\n<CodeGroup>\n```bash npm\nnpm install @agentic/zoominfo\n```\n\n```bash yarn\nyarn add @agentic/zoominfo\n```\n\n```bash pnpm\npnpm add @agentic/zoominfo\n```\n\n</CodeGroup>\n\n## Usage\n\n```ts\nimport { ZoomInfoClient } from '@agentic/zoominfo'\n\nconst zoomInfo = new ZoomInfoClient()\nconst res = await zoomInfo.enrichContact({\n  emailAddress: 'travis@transitivebullsh.it'\n})\n```\n"
  },
  {
    "path": "legacy/docs/usage.mdx",
    "content": "---\ntitle: Usage\n---\n\n## TS Tool Usage\n\nAgentic clients like `WeatherClient` can be used as normal TS classes:\n\n```ts\nimport { WeatherClient } from '@agentic/stdlib'\n\n// Requires `process.env.WEATHER_API_KEY` (free from weatherapi.com)\nconst weather = new WeatherClient()\n\nconst result = await weather.getCurrentWeather({\n  q: 'San Francisco'\n})\nconsole.log(result)\n```\n\n## LLM Tool Usage\n\nOr you can use these clients as **LLM-based tools**. Here's an example using [Vercel's AI SDK](https://github.com/vercel/ai):\n\n```ts\n// sdk-specific imports\nimport { openai } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\nimport { createAISDKTools } from '@agentic/ai-sdk'\n\n// sdk-agnostic imports\nimport { WeatherClient } from '@agentic/stdlib'\n\nconst weather = new WeatherClient()\n\nconst result = await generateText({\n  model: openai('gpt-4o-mini'),\n  // this is the key line which uses the `@agentic/ai-sdk` adapter\n  tools: createAISDKTools(weather),\n  toolChoice: 'required',\n  prompt: 'What is the weather in San Francisco?'\n})\n\nconsole.log(result.toolResults[0])\n```\n\nYou can use our standard library of thoroughly tested AI functions with your favorite AI SDK – without having to write any glue code!\n\n### Using Multiple Tools\n\nAll adapters (like `createAISDKTools`) accept a very flexible var args of `AIFunctionLike` parameters, so you can pass as many tools as you'd like.\n\nThey also expose a `.functions` property which is an `AIFunctionSet`. This combination makes it really easy to mix & match different tools together.\n\n```ts\nimport { SerperClient, WikipediaClient, FirecrawlClient } from '@agentic/stdlib'\nimport { createAIFunction } from '@agentic/core'\nimport { z } from 'zod'\n\nconst googleSearch = new SerperClient()\nconst wikipedia = new WikipediaClient()\nconst firecrawl = new FirecrawlClient()\n\nconst result = await generateText({\n  model: openai('gpt-4o-mini'),\n  // This example uses tools from 4 different sources. You can pass as many\n  // AIFunctionLike objects as you want.\n  tools: createAISDKTools(\n    googleSearch,\n    wikipedia,\n    // Pick a single function from the firecrawl client's set of AI functions\n    firecrawl.functions.pick('firecrawl_search'),\n    // Create a custom AI function (based off of Anthropic's think tool: https://www.anthropic.com/engineering/claude-think-tool)\n    createAIFunction({\n      name: 'think',\n      description: `Use this tool to think about something. It will not obtain new information or change the database, but just append the thought to the log. Use it when complex reasoning or some cache memory is needed.`,\n      inputSchema: z.object({\n        thought: z.string().describe('A thought to think about.')\n      }),\n      execute: ({ thought }) => thought\n    })\n  ),\n  prompt:\n    'What year did Jurassic Park the movie come out, and what else happened that year?'\n})\n```\n\nAn `AIFunctionLike` can be any agentic client instance, a single `AIFunction` selected from the client's `.functions` property (which holds an `AIFunctionSet` of available AI functions), or an AI function created manually via `createAIFunction`.\n\n`AIFunctionLike` and `AIFunctionSet` are implementation details that you likely won't have to touch directly, but they're important because of their flexibility.\n\n## AI SDKs\n\n<CardGroup cols={2}>\n<Card title='Vercel AI SDK' href='/sdks/ai-sdk'>\n  Using Agentic with the Vercel AI SDK.\n</Card>\n\n<Card title='Mastra' href='/sdks/mastra'>\n  Using Agentic with Mastra.\n</Card>\n\n<Card title='LangChain' href='/sdks/langchain'>\n  Using Agentic with LangChain.\n</Card>\n\n<Card title='LlamaIndex' href='/sdks/llamaindex'>\n  Using Agentic with LlamaIndex.\n</Card>\n\n<Card title='Firebase Genkit' href='/sdks/genkit'>\n  Using Agentic with Genkit.\n</Card>\n\n<Card title='Dexa Dexter' href='/sdks/dexter'>\n  Using Agentic with Dexter.\n</Card>\n\n<Card title='OpenAI' href='/sdks/openai'>\n  Using Agentic with OpenAI directly.\n</Card>\n\n<Card title='xsAI SDK' href='/sdks/xsai'>\n  Using Agentic with the xsAI SDK.\n</Card>\n</CardGroup>\n"
  },
  {
    "path": "legacy/eslint.config.js",
    "content": "import { config } from '@fisch0920/config/eslint'\n\nexport default [\n  ...config,\n  {\n    ignores: ['packages/openapi-to-ts/fixtures/generated/**/*']\n  },\n  {\n    rules: {\n      'unicorn/prefer-single-call': 'off'\n    }\n  }\n]\n"
  },
  {
    "path": "legacy/examples/dexter/bin/code-interpreter.ts",
    "content": "import 'dotenv/config'\n\nimport { createDexterFunctions } from '@agentic/dexter'\nimport { e2b } from '@agentic/e2b'\nimport { ChatModel, createAIRunner } from '@dexaai/dexter'\n\nasync function main() {\n  const runner = createAIRunner({\n    chatModel: new ChatModel({\n      params: { model: 'gpt-4o-mini', temperature: 0 },\n      debug: true\n    }),\n    functions: createDexterFunctions(e2b)\n  })\n\n  const result = await runner(\n    'Visualize a distribution of height of men based on the latest data you know. Also print the median value.'\n  )\n  console.log(result)\n}\n\nawait main()\n"
  },
  {
    "path": "legacy/examples/dexter/bin/election-news.ts",
    "content": "import 'dotenv/config'\n\nimport { createDexterFunctions } from '@agentic/dexter'\nimport { PerigonClient } from '@agentic/perigon'\nimport { SerperClient } from '@agentic/serper'\nimport { ChatModel, createAIRunner } from '@dexaai/dexter'\n\nasync function main() {\n  const perigon = new PerigonClient()\n  const serper = new SerperClient()\n\n  const runner = createAIRunner({\n    chatModel: new ChatModel({\n      params: { model: 'gpt-4o-mini', temperature: 0 }\n      // debug: true\n    }),\n    functions: createDexterFunctions(\n      perigon.functions.pick('search_news_stories'),\n      serper\n    ),\n    systemMessage:\n      'You are a helpful assistant. Be as concise as possible. Respond in markdown. Always cite your sources.'\n  })\n\n  const result = await runner(\n    'Summarize the latest news stories about the upcoming US election.'\n  )\n  console.log(result)\n}\n\nawait main()\n"
  },
  {
    "path": "legacy/examples/dexter/bin/weather.ts",
    "content": "import 'dotenv/config'\n\nimport { createDexterFunctions } from '@agentic/dexter'\nimport { WeatherClient } from '@agentic/weather'\nimport { ChatModel, createAIRunner } from '@dexaai/dexter'\n\nasync function main() {\n  const weather = new WeatherClient()\n\n  const runner = createAIRunner({\n    chatModel: new ChatModel({\n      params: { model: 'gpt-4o-mini', temperature: 0 }\n      // debug: true\n    }),\n    functions: createDexterFunctions(weather),\n    systemMessage: 'You are a helpful assistant. Be as concise as possible.'\n  })\n\n  const result = await runner('What is the weather in San Francisco?')\n  console.log(result)\n}\n\nawait main()\n"
  },
  {
    "path": "legacy/examples/dexter/package.json",
    "content": "{\n  \"name\": \"agentic-examples-dexter\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/dexter\": \"workspace:*\",\n    \"@agentic/e2b\": \"workspace:*\",\n    \"@agentic/perigon\": \"workspace:*\",\n    \"@agentic/serper\": \"workspace:*\",\n    \"@agentic/stdlib\": \"workspace:*\",\n    \"@agentic/weather\": \"workspace:*\",\n    \"@dexaai/dexter\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "legacy/examples/dexter/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/examples/playground/bin/scratch.ts",
    "content": "import 'dotenv/config'\n\nimport * as stdlib from '@agentic/stdlib'\nimport restoreCursor from 'restore-cursor'\n\n/**\n * Scratch pad for testing.\n */\nasync function main() {\n  restoreCursor()\n\n  // const clearbit = new ClearbitClient()\n  // const res = await clearbit.companyEnrichment({\n  //   domain: 'https://clay.com'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const proxycurl = new ProxycurlClient()\n  // const res = await proxycurl.getLinkedInPerson({\n  //   linkedin_profile_url: 'https://linkedin.com/in/fisch2'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const wikipedia = new WikipediaClient()\n  // const res = await wikipedia.getPageSummary({\n  //   // title: 'Naruto_(TV_series)'\n  //   title: 'SpaceX'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const searxng = new SearxngClient()\n  // const res = await searxng.search({\n  //   query: 'golden gate bridge',\n  //   engines: ['reddit']\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const perigon = new PerigonClient()\n  // const res = await perigon.searchArticles({\n  //   q: 'AI agents AND startup',\n  //   sourceGroup: 'top50tech'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const firecrawl = new FirecrawlClient()\n  // const res = await firecrawl.scrapeUrl({\n  //   url: 'https://www.bbc.com/news/articles/cp4475gwny1o'\n  //   // url: 'https://www.theguardian.com/technology/article/2024/jun/04/openai-google-ai-risks-letter'\n  //   // url: 'https://www.firecrawl.dev'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const exa = new ExaClient()\n  // const res = await exa.search({\n  //   query: 'OpenAI',\n  //   contents: { text: true }\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const diffbot = new DiffbotClient()\n  // // const res = await diffbot.analyzeUrl({\n  // //   url: 'https://www.bbc.com/news/articles/cp4475gwny1o'\n  // // })\n  // const res = await diffbot.enhanceEntity({\n  //   type: 'Person',\n  //   name: 'Kevin Raheja'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const wolfram = new WolframAlphaClient()\n  // const res = await wolfram.ask({\n  //   input: 'population of new york city'\n  // })\n  // console.log(res)\n\n  // const client = await createTwitterV2Client({\n  //   scopes: ['tweet.read', 'users.read', 'offline.access']\n  // })\n  // const twitter = new TwitterClient({ client })\n  // // const res = await twitter.findUserByUsername({ username: 'transitive_bs' })\n  // const res = await twitter.searchRecentTweets({\n  //   query: 'open source AI agents'\n  // })\n  // console.log(res)\n\n  // const midjourney = new MidjourneyClient()\n  // const res = await midjourney.imagine(\n  //   'tiny lil baby kittens playing with an inquisitive AI robot, kawaii, anime'\n  // )\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const bing = new BingClient()\n  // const res = await bing.search({\n  //   q: 'world cup 2024 freestyle wrestling news'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const tavily = new TavilyClient()\n  // const res = await tavily.search({\n  //   query: 'when do experts predict that OpenAI will release GPT-5?',\n  //   include_answer: true\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const socialData = new SocialDataClient()\n  // const res = await socialData.getUserByUsername('transitive_bs')\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const hunter = new HunterClient()\n  // // const res = await hunter.emailVerifier({\n  // //   email: 'travis@transitivebullsh.it'\n  // // })\n  // const res = await hunter.emailFinder({\n  //   domain: 'aomni.com',\n  //   first_name: 'David',\n  //   last_name: 'Zhang'\n  // })\n  // console.log(JSON.stringify(res, null, 2))\n\n  // const jina = new JinaClient()\n  // const res = await jina.readUrl({\n  //   url: 'https://news.ycombinator.com'\n  //   // returnFormat: 'screenshot'\n  //   // json: true\n  // })\n  // const res = await jina.search({\n  //   query: 'trump assassination attempt',\n  //   // returnFormat: 'screenshot',\n  //   json: true\n  // })\n\n  // const exa = new ExaClient()\n  // const res = await exa.search({\n  //   query: 'OpenAI',\n  //   category: 'linkedin profile'\n  // })\n\n  // const zoomInfo = new ZoomInfoClient()\n  // const res = await zoomInfo.enrichContact({\n  //   // emailAddress: 'travis@transitivebullsh.it'\n  //   fullName: 'Kevin Raheja',\n  //   companyName: 'HeyGen'\n  // })\n  // const res = await zoomInfo.searchContacts({\n  //   fullName: 'Kevin Raheja'\n  // })\n  // const gravatar = new stdlib.GravatarClient()\n  // const res = await gravatar.getProfileByIdentifier('email@example.com')\n\n  const hn = new stdlib.HackerNewsClient()\n  // const res = await hn.getSearchItem('43201417')\n  const res = await hn.searchItems({\n    query: 'OpenAI',\n    tags: ['story'],\n    sortBy: 'recency',\n    numericFilters: ['points>1000']\n  })\n\n  console.log(JSON.stringify(res, null, 2))\n}\n\nawait main()\n"
  },
  {
    "path": "legacy/examples/playground/package.json",
    "content": "{\n  \"name\": \"agentic-examples-playground\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/stdlib\": \"workspace:*\",\n    \"restore-cursor\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "legacy/examples/playground/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/examples/xsai/bin/weather.ts",
    "content": "/* eslint-disable no-process-env */\nimport 'dotenv/config'\n\nimport { WeatherClient } from '@agentic/weather'\nimport { createXSAITools } from '@agentic/xsai'\nimport { generateText } from 'xsai'\n\nasync function main() {\n  const weather = new WeatherClient()\n\n  const result = await generateText({\n    apiKey: process.env.OPENAI_API_KEY!,\n    baseURL: 'https://api.openai.com/v1/',\n    model: 'gpt-4o-mini',\n    tools: await createXSAITools(weather),\n    toolChoice: 'required',\n    temperature: 0,\n    messages: [\n      {\n        role: 'system',\n        content: 'You are a helpful assistant. Be as concise as possible.'\n      },\n      { role: 'user', content: 'What is the weather in San Francisco?' }\n    ]\n  })\n\n  console.log(JSON.stringify(result, null, 2))\n}\n\nawait main()\n"
  },
  {
    "path": "legacy/examples/xsai/package.json",
    "content": "{\n  \"name\": \"agentic-examples-xsai\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:lint\": \"eslint .\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/xsai\": \"workspace:*\",\n    \"@agentic/weather\": \"workspace:*\",\n    \"xsai\": \"catalog:\",\n    \"@xsai/tool\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "legacy/examples/xsai/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"bin\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/license",
    "content": "MIT License\n\nCopyright (c) 2025 Travis Fischer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "legacy/package.json",
    "content": "{\n  \"name\": \"agentic\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\"\n  },\n  \"packageManager\": \"pnpm@10.12.2\",\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"turbo build\",\n    \"dev\": \"turbo dev --continue\",\n    \"docs\": \"cd docs && npx mintlify dev\",\n    \"clean\": \"turbo clean\",\n    \"fix\": \"run-s fix:*\",\n    \"fix:format\": \"prettier --write \\\"**/*.{js,ts,tsx}\\\"\",\n    \"test\": \"turbo test\",\n    \"test:format\": \"prettier --check \\\"**/*.{js,ts,tsx}\\\"\",\n    \"test:lint\": \"turbo test:lint\",\n    \"test:typecheck\": \"turbo test:typecheck\",\n    \"test:unit\": \"turbo test:unit\",\n    \"release\": \"bumpp -r && pnpm publish -r\",\n    \"pretest\": \"run-s build\",\n    \"prerelease\": \"run-s build\",\n    \"precommit\": \"lint-staged\",\n    \"preinstall\": \"npx only-allow pnpm\",\n    \"prepare\": \"simple-git-hooks\"\n  },\n  \"devDependencies\": {\n    \"@fisch0920/config\": \"catalog:\",\n    \"@types/node\": \"catalog:\",\n    \"bumpp\": \"catalog:\",\n    \"del-cli\": \"catalog:\",\n    \"dotenv\": \"catalog:\",\n    \"eslint\": \"catalog:\",\n    \"lint-staged\": \"catalog:\",\n    \"npm-run-all2\": \"catalog:\",\n    \"only-allow\": \"catalog:\",\n    \"prettier\": \"catalog:\",\n    \"simple-git-hooks\": \"catalog:\",\n    \"syncpack\": \"catalog:\",\n    \"tsup\": \"catalog:\",\n    \"tsx\": \"catalog:\",\n    \"turbo\": \"catalog:\",\n    \"typescript\": \"catalog:\",\n    \"vitest\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"prettier\": \"@fisch0920/config/prettier\",\n  \"simple-git-hooks\": {\n    \"pre-commit\": \"npx lint-staged\"\n  },\n  \"lint-staged\": {\n    \"*.{ts,tsx}\": [\n      \"prettier --ignore-unknown --write\",\n      \"eslint --fix\"\n    ]\n  }\n}\n"
  },
  {
    "path": "legacy/packages/airtable/package.json",
    "content": "{\n  \"name\": \"@agentic/airtable\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Airtable.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/airtable\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/airtable/src/airtable-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nimport { airtable } from './airtable'\n\n/**\n * Airtable API client.\n *\n * @see https://airtable.com/developers/web/api/introduction\n */\nexport class AirtableClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('AIRTABLE_API_KEY'),\n    apiBaseUrl = airtable.API_BASE_URL,\n    timeoutMs = 60_000,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      `AirtableClient missing required \"apiKey\" (defaults to \"AIRTABLE_API_KEY\")`\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        Authorization: `Bearer ${apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Lists all of the bases that the user has access to.\n   */\n  @aiFunction({\n    name: 'airtable_list_bases',\n    description: 'Lists all accessible Airtable bases.',\n    inputSchema: z.object({})\n  })\n  async listBases(): Promise<airtable.ListBasesResponse> {\n    return this.ky.get('v0/meta/bases').json<airtable.ListBasesResponse>()\n  }\n\n  /**\n   * Lists all of the tables in a base.\n   */\n  @aiFunction({\n    name: 'airtable_list_tables',\n    description: 'Lists all of the tables in a base.',\n    inputSchema: airtable.ListTablesArgsSchema\n  })\n  async listTables<\n    TDetailLevel extends airtable.TableDetailLevel = 'full'\n  >(args: {\n    baseId: string\n    detailLevel?: TDetailLevel\n  }): Promise<Array<airtable.AirtableTableToDetailLevel<TDetailLevel>>> {\n    const { baseId, detailLevel = 'full' } = args\n\n    const res = await this.ky\n      .get(`/v0/meta/bases/${baseId}/tables`)\n      .json<airtable.BaseSchemaResponse>()\n\n    return res.tables.map((table) =>\n      transformTableDetailLevel<TDetailLevel>({\n        table,\n        detailLevel: detailLevel as TDetailLevel\n      })\n    )\n  }\n\n  /**\n   * Gets a single table's schema in a base.\n   */\n  @aiFunction({\n    name: 'airtable_get_table',\n    description: \"Gets a single table's schema in a base.\",\n    inputSchema: airtable.DescribeTableArgsSchema\n  })\n  async getTable<\n    TDetailLevel extends airtable.TableDetailLevel = 'full'\n  >(args: {\n    baseId: string\n    tableId: string\n    detailLevel?: TDetailLevel\n  }): Promise<airtable.AirtableTableToDetailLevel<TDetailLevel>> {\n    const tables = await this.listTables<TDetailLevel>(args)\n    const table = tables.find((t) => t.id === args.tableId)\n    assert(table, `Table ${args.tableId} not found in base ${args.baseId}`)\n    return table\n  }\n\n  /**\n   * Lists records from a table.\n   */\n  @aiFunction({\n    name: 'airtable_list_records',\n    description: 'Lists records from a table.',\n    inputSchema: airtable.ListRecordsArgsSchema\n  })\n  async listRecords(\n    args: airtable.ListRecordsArgs\n  ): Promise<airtable.AirtableRecord[]> {\n    const { baseId, tableId, ...options } = args\n    return this.ky\n      .get(`/v0/${baseId}/${tableId}`, {\n        searchParams: sanitizeSearchParams(options)\n      })\n      .json<airtable.AirtableRecord[]>()\n  }\n\n  /**\n   * Lists all records from a table.\n   */\n  @aiFunction({\n    name: 'airtable_list_all_records',\n    description: 'Lists all records from a table.',\n    inputSchema: airtable.ListRecordsArgsSchema\n  })\n  async listAllRecords(\n    args: airtable.ListRecordsArgs\n  ): Promise<airtable.AirtableRecord[]> {\n    const allRecords: airtable.AirtableRecord[] = []\n    let offset = args.offset ?? 0\n\n    do {\n      const res = await this.listRecords({\n        ...args,\n        offset\n      })\n      if (!res.length) {\n        break\n      }\n\n      allRecords.push(...res)\n      offset += res.length\n    } while (true)\n\n    return allRecords\n  }\n\n  /**\n   * Gets a single record from a table.\n   */\n  @aiFunction({\n    name: 'airtable_get_record',\n    description: 'Gets a single record from a table.',\n    inputSchema: airtable.GetRecordArgsSchema\n  })\n  async getRecord(\n    args: airtable.GetRecordArgs\n  ): Promise<airtable.AirtableRecord> {\n    const { baseId, tableId, recordId } = args\n    return this.ky\n      .get(`/v0/${baseId}/${tableId}/${recordId}`)\n      .json<airtable.AirtableRecord>()\n  }\n\n  /**\n   * Creates a record in a table.\n   */\n  @aiFunction({\n    name: 'airtable_create_record',\n    description: 'Creates a record in a table.',\n    inputSchema: airtable.CreateRecordArgsSchema\n  })\n  async createRecord(\n    args: airtable.CreateRecordArgs\n  ): Promise<airtable.AirtableRecord> {\n    const { baseId, tableId, ...body } = args\n    return this.ky\n      .post(`/v0/${baseId}/${tableId}`, {\n        json: body\n      })\n      .json<airtable.AirtableRecord>()\n  }\n\n  /**\n   * Updates records in a table.\n   */\n  @aiFunction({\n    name: 'airtable_update_records',\n    description: 'Updates records in a table.',\n    inputSchema: airtable.UpdateRecordsArgsSchema\n  })\n  async updateRecords(\n    args: airtable.UpdateRecordsArgs\n  ): Promise<airtable.AirtableRecord[]> {\n    const { baseId, tableId, ...body } = args\n    return this.ky\n      .patch(`/v0/${baseId}/${tableId}`, {\n        json: body\n      })\n      .json<airtable.AirtableRecord[]>()\n  }\n\n  /**\n   * Deletes records from a table.\n   */\n  @aiFunction({\n    name: 'airtable_delete_records',\n    description: 'Deletes records from a table.',\n    inputSchema: airtable.DeleteRecordsArgsSchema\n  })\n  async deleteRecords(\n    args: airtable.DeleteRecordsArgs\n  ): Promise<{ id: string }[]> {\n    const { baseId, tableId, recordIds } = args\n    const queryString = recordIds.map((id) => `records[]=${id}`).join('&')\n\n    const res = await this.ky\n      .delete(`/v0/${baseId}/${tableId}?${queryString}`)\n      .json<{ records: { id: string; deleted: boolean }[] }>()\n\n    return res.records.map(({ id }) => ({ id }))\n  }\n\n  /**\n   * Creates a table in a base.\n   */\n  @aiFunction({\n    name: 'airtable_create_table',\n    description: 'Creates a table in a base.',\n    inputSchema: airtable.CreateTableArgsSchema\n  })\n  async createTable(args: airtable.CreateTableArgs): Promise<airtable.Table> {\n    const { baseId, ...body } = args\n\n    return this.ky\n      .post(`/v0/meta/bases/${baseId}/tables`, {\n        json: body\n      })\n      .json<airtable.Table>()\n  }\n\n  /**\n   * Updates a table in a base.\n   */\n  @aiFunction({\n    name: 'airtable_update_table',\n    description: 'Updates a table in a base.',\n    inputSchema: airtable.UpdateTableArgsSchema\n  })\n  async updateTable(args: airtable.UpdateTableArgs): Promise<airtable.Table> {\n    const { baseId, tableId, ...body } = args\n    return this.ky\n      .patch(`/v0/meta/bases/${baseId}/tables/${tableId}`, {\n        json: body\n      })\n      .json<airtable.Table>()\n  }\n\n  /**\n   * Creates a field in a table.\n   */\n  @aiFunction({\n    name: 'airtable_create_field',\n    description: 'Creates a field in a table.',\n    inputSchema: airtable.CreateFieldArgsSchema\n  })\n  async createField(args: airtable.CreateFieldArgs): Promise<airtable.Field> {\n    const { baseId, tableId, body } = args\n    return this.ky\n      .post(`/v0/meta/bases/${baseId}/tables/${tableId}/fields`, {\n        json: body.field\n      })\n      .json<airtable.Field>()\n  }\n\n  /**\n   * Updates a field in a table.\n   */\n  @aiFunction({\n    name: 'airtable_update_field',\n    description: 'Updates a field in a table.',\n    inputSchema: airtable.UpdateFieldArgsSchema\n  })\n  async updateField(args: airtable.UpdateFieldArgs): Promise<airtable.Field> {\n    const { baseId, tableId, fieldId, ...body } = args\n    return this.ky\n      .patch(`/v0/meta/bases/${baseId}/tables/${tableId}/fields/${fieldId}`, {\n        json: body\n      })\n      .json<airtable.Field>()\n  }\n\n  /**\n   * Searches for records in a table which contain specific text.\n   */\n  @aiFunction({\n    name: 'airtable_search_records',\n    description: 'Searches for records in a table which contain specific text.',\n    inputSchema: airtable.SearchRecordsArgsSchema\n  })\n  async searchRecords(\n    args: airtable.SearchRecordsArgs\n  ): Promise<airtable.AirtableRecord[]> {\n    const { baseId, tableId, fieldIds, searchTerm, ...opts } = args\n    // Validate and get search fields\n    const searchFieldIds = await this.validateAndGetSearchFields({\n      baseId,\n      tableId,\n      fieldIds\n    })\n\n    // Escape the search term to prevent formula injection\n    const escapedSearchTerm = searchTerm.replaceAll(/[\"\\\\]/g, '\\\\$&')\n\n    // Build OR(FIND(\"term\", field1), FIND(\"term\", field2), ...)\n    const filterByFormula = `OR(${searchFieldIds\n      .map((fieldId) => `FIND(\"${escapedSearchTerm}\", {${fieldId}})`)\n      .join(',')})`\n\n    return this.listRecords({ ...opts, baseId, tableId, filterByFormula })\n  }\n\n  /**\n   * Validates and gets the searchable text fields in a table.\n   */\n  protected async validateAndGetSearchFields({\n    baseId,\n    tableId,\n    fieldIds\n  }: {\n    baseId: string\n    tableId: string\n    fieldIds?: string[]\n  }): Promise<string[]> {\n    const table = await this.getTable({ baseId, tableId })\n\n    const searchableFieldTypes = new Set([\n      'singleLineText',\n      'multilineText',\n      'richText',\n      'email',\n      'url',\n      'phoneNumber'\n    ])\n\n    const searchableFieldIds = new Set(\n      table.fields\n        .filter((field) => searchableFieldTypes.has(field.type))\n        .map((field) => field.id)\n    )\n\n    if (!searchableFieldIds.size) {\n      throw new Error('No text fields available to search')\n    }\n\n    // If specific fields were requested, validate that they exist and are, in\n    // fact, valid searchable text fields.\n    if (fieldIds && fieldIds.length > 0) {\n      // Check if any requested fields were invalid\n      const invalidFieldIds = fieldIds.filter(\n        (fieldId) => !searchableFieldIds.has(fieldId)\n      )\n      if (invalidFieldIds.length > 0) {\n        throw new Error(\n          `Invalid fields requested: ${invalidFieldIds.join(', ')}`\n        )\n      }\n\n      return fieldIds\n    }\n\n    return Array.from(searchableFieldIds)\n  }\n}\n\nfunction transformTableDetailLevel<\n  T extends airtable.TableDetailLevel = 'full'\n>({\n  table,\n  detailLevel\n}: {\n  table: airtable.Table\n  detailLevel: T\n}): airtable.AirtableTableToDetailLevel<T> {\n  switch (detailLevel) {\n    case 'tableIdentifiersOnly':\n      return {\n        id: table.id,\n        name: table.name\n      } as any\n\n    case 'identifiersOnly':\n      return {\n        id: table.id,\n        name: table.name,\n        fields: table.fields.map((field) => ({\n          id: field.id,\n          name: field.name\n        })),\n        views: table.views.map((view) => ({\n          id: view.id,\n          name: view.name\n        }))\n      } as any\n\n    default:\n      return table as any\n  }\n}\n"
  },
  {
    "path": "legacy/packages/airtable/src/airtable.ts",
    "content": "import { z } from 'zod'\n\nexport namespace airtable {\n  export const API_BASE_URL = 'https://api.airtable.com'\n\n  export const BaseSchema = z.object({\n    id: z.string(),\n    name: z.string(),\n    permissionLevel: z.string()\n  })\n  export type Base = z.infer<typeof BaseSchema>\n\n  export const ListBasesResponseSchema = z.object({\n    bases: z.array(BaseSchema),\n    offset: z.string().optional()\n  })\n  export type ListBasesResponse = z.infer<typeof ListBasesResponseSchema>\n\n  export const FieldOptionsSchema = z\n    .object({\n      isReversed: z.boolean().optional(),\n      inverseLinkFieldId: z.string().optional(),\n      linkedTableId: z.string().optional(),\n      prefersSingleRecordLink: z.boolean().optional(),\n      color: z.string().optional(),\n      icon: z.string().optional()\n    })\n    .passthrough()\n  export type FieldOptions = z.infer<typeof FieldOptionsSchema>\n\n  export const FieldSchema = z\n    .object({\n      name: z.string(),\n      description: z.string().optional()\n    })\n    .and(\n      // Extracted from Airtable API docs\n      z.union([\n        z.object({ type: z.literal('autoNumber') }),\n        z.object({ type: z.literal('barcode') }),\n        z.object({ type: z.literal('button') }),\n        z\n          .object({\n            options: z.object({\n              color: z\n                .enum([\n                  'greenBright',\n                  'tealBright',\n                  'cyanBright',\n                  'blueBright',\n                  'purpleBright',\n                  'pinkBright',\n                  'redBright',\n                  'orangeBright',\n                  'yellowBright',\n                  'grayBright'\n                ])\n                .describe('The color of the checkbox.'),\n              icon: z\n                .enum([\n                  'check',\n                  'xCheckbox',\n                  'star',\n                  'heart',\n                  'thumbsUp',\n                  'flag',\n                  'dot'\n                ])\n                .describe('The icon name of the checkbox.')\n            }),\n            type: z.literal('checkbox')\n          })\n          .describe(\n            \"Bases on a free or plus plan are limited to using the `'check'` icon and `'greenBright'` color.\"\n          ),\n        z.object({ type: z.literal('createdBy') }),\n        z.object({\n          options: z.object({\n            result: z\n              .union([\n                z.object({\n                  options: z.object({\n                    dateFormat: z.object({\n                      format: z\n                        .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD'])\n                        .describe(\n                          '`format` is always provided when reading.\\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)'\n                        ),\n                      name: z.enum([\n                        'local',\n                        'friendly',\n                        'us',\n                        'european',\n                        'iso'\n                      ])\n                    })\n                  }),\n                  type: z.literal('date')\n                }),\n                z.object({\n                  options: z.object({\n                    dateFormat: z.object({\n                      format: z\n                        .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD'])\n                        .describe(\n                          '`format` is always provided when reading.\\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)'\n                        ),\n                      name: z.enum([\n                        'local',\n                        'friendly',\n                        'us',\n                        'european',\n                        'iso'\n                      ])\n                    }),\n                    timeFormat: z.object({\n                      format: z.enum(['h:mma', 'HH:mm']),\n                      name: z.enum(['12hour', '24hour'])\n                    }),\n                    timeZone: z.any()\n                  }),\n                  type: z.literal('dateTime')\n                })\n              ])\n              .describe(\n                'This will always be a `date` or `dateTime` field config.'\n              )\n              .optional()\n          }),\n          type: z.literal('createdTime')\n        }),\n        z.object({\n          options: z.object({\n            isValid: z\n              .boolean()\n              .describe(\n                '`false` when recordLinkFieldId is null, e.g. the referenced column was deleted.'\n              ),\n            recordLinkFieldId: z.union([z.string(), z.null()]).optional()\n          }),\n          type: z.literal('count')\n        }),\n        z.any(),\n        z.object({\n          options: z.object({\n            isValid: z\n              .boolean()\n              .describe(\n                'False if this formula/field configuation has an error'\n              ),\n            referencedFieldIds: z\n              .union([z.array(z.string()), z.null()])\n              .describe('The fields to check the last modified time of'),\n            result: z\n              .union([\n                z.object({\n                  options: z.object({\n                    dateFormat: z.object({\n                      format: z\n                        .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD'])\n                        .describe(\n                          '`format` is always provided when reading.\\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)'\n                        ),\n                      name: z.enum([\n                        'local',\n                        'friendly',\n                        'us',\n                        'european',\n                        'iso'\n                      ])\n                    })\n                  }),\n                  type: z.literal('date')\n                }),\n                z.object({\n                  options: z.object({\n                    dateFormat: z.object({\n                      format: z\n                        .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD'])\n                        .describe(\n                          '`format` is always provided when reading.\\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)'\n                        ),\n                      name: z.enum([\n                        'local',\n                        'friendly',\n                        'us',\n                        'european',\n                        'iso'\n                      ])\n                    }),\n                    timeFormat: z.object({\n                      format: z.enum(['h:mma', 'HH:mm']),\n                      name: z.enum(['12hour', '24hour'])\n                    }),\n                    timeZone: z.any()\n                  }),\n                  type: z.literal('dateTime')\n                }),\n                z.null()\n              ])\n              .describe(\n                'This will always be a `date` or `dateTime` field config.'\n              )\n          }),\n          type: z.literal('lastModifiedTime')\n        }),\n        z.object({ type: z.literal('lastModifiedBy') }),\n        z.object({\n          options: z.object({\n            fieldIdInLinkedTable: z\n              .union([z.string(), z.null()])\n              .describe(\n                'The field in the linked table that this field is looking up.'\n              ),\n            isValid: z\n              .boolean()\n              .describe(\n                'Is the field currently valid (e.g. false if the linked record field has\\nbeen deleted)'\n              ),\n            recordLinkFieldId: z\n              .union([z.string(), z.null()])\n              .describe('The linked record field in the current table.'),\n            result: z\n              .union([z.any(), z.null()])\n              .describe(\n                'The field type and options inside of the linked table. See other field\\ntype configs on this page for the possible values. Can be null if invalid.'\n              )\n          }),\n          type: z.literal('lookup')\n        }),\n        z.object({\n          options: z.object({\n            precision: z\n              .number()\n              .describe(\n                'Indicates the number of digits shown to the right of the decimal point for this field. (0-8 inclusive)'\n              )\n          }),\n          type: z.literal('number')\n        }),\n        z.object({\n          options: z.object({\n            precision: z\n              .number()\n              .describe(\n                'Indicates the number of digits shown to the right of the decimal point for this field. (0-8 inclusive)'\n              )\n          }),\n          type: z.literal('percent')\n        }),\n        z.object({\n          options: z.object({\n            precision: z\n              .number()\n              .describe(\n                'Indicates the number of digits shown to the right of the decimal point for this field. (0-7 inclusive)'\n              ),\n            symbol: z.string().describe('Currency symbol to use.')\n          }),\n          type: z.literal('currency')\n        }),\n        z.object({\n          options: z.object({\n            durationFormat: z.enum([\n              'h:mm',\n              'h:mm:ss',\n              'h:mm:ss.S',\n              'h:mm:ss.SS',\n              'h:mm:ss.SSS'\n            ])\n          }),\n          type: z.literal('duration')\n        }),\n        z.object({ type: z.literal('multilineText') }),\n        z.object({ type: z.literal('phoneNumber') }),\n        z\n          .object({\n            options: z.object({\n              color: z\n                .enum([\n                  'yellowBright',\n                  'orangeBright',\n                  'redBright',\n                  'pinkBright',\n                  'purpleBright',\n                  'blueBright',\n                  'cyanBright',\n                  'tealBright',\n                  'greenBright',\n                  'grayBright'\n                ])\n                .describe('The color of selected icons.'),\n              icon: z\n                .enum(['star', 'heart', 'thumbsUp', 'flag', 'dot'])\n                .describe('The icon name used to display the rating.'),\n              max: z\n                .number()\n                .describe(\n                  'The maximum value for the rating, from 1 to 10 inclusive.'\n                )\n            }),\n            type: z.literal('rating')\n          })\n          .describe(\n            \"Bases on a free or plus plan are limited to using the 'star' icon and 'yellowBright' color.\"\n          ),\n        z.object({ type: z.literal('richText') }),\n        z.object({\n          options: z.object({\n            fieldIdInLinkedTable: z\n              .string()\n              .describe('The id of the field in the linked table')\n              .optional(),\n            isValid: z.boolean().optional(),\n            recordLinkFieldId: z\n              .string()\n              .describe('The linked field id')\n              .optional(),\n            referencedFieldIds: z\n              .array(z.string())\n              .describe(\n                'The ids of any fields referenced in the rollup formula'\n              )\n              .optional(),\n            result: z\n              .union([z.any(), z.null()])\n              .describe(\n                'The resulting field type and options for the rollup. See other field\\ntype configs on this page for the possible values. Can be null if invalid.'\n              )\n              .optional()\n          }),\n          type: z.literal('rollup')\n        }),\n        z.object({ type: z.literal('singleLineText') }),\n        z.object({ type: z.literal('email') }),\n        z.object({ type: z.literal('url') }),\n        z.object({\n          options: z.object({\n            choices: z.array(\n              z.object({\n                color: z\n                  .string()\n                  .describe(\n                    'Optional when the select field is configured to not use colors.\\n\\nAllowed values: \"blueLight2\", \"cyanLight2\", \"tealLight2\", \"greenLight2\", \"yellowLight2\", \"orangeLight2\", \"redLight2\", \"pinkLight2\", \"purpleLight2\", \"grayLight2\", \"blueLight1\", \"cyanLight1\", \"tealLight1\", \"greenLight1\", \"yellowLight1\", \"orangeLight1\", \"redLight1\", \"pinkLight1\", \"purpleLight1\", \"grayLight1\", \"blueBright\", \"cyanBright\", \"tealBright\", \"greenBright\", \"yellowBright\", \"orangeBright\", \"redBright\", \"pinkBright\", \"purpleBright\", \"grayBright\", \"blueDark1\", \"cyanDark1\", \"tealDark1\", \"greenDark1\", \"yellowDark1\", \"orangeDark1\", \"redDark1\", \"pinkDark1\", \"purpleDark1\", \"grayDark1\"'\n                  )\n                  .optional(),\n                id: z.string(),\n                name: z.string()\n              })\n            )\n          }),\n          type: z.literal('externalSyncSource')\n        }),\n        z.object({\n          options: z.object({\n            prompt: z\n              .array(\n                z.union([\n                  z.string(),\n                  z.object({ field: z.object({ fieldId: z.string() }) })\n                ])\n              )\n              .describe(\n                'The prompt that is used to generate the results in the AI field, additional object\\ntypes may be added in the future. Currently, this is an array of strings or objects that identify any fields interpolated into the prompt.\\n\\nThe prompt will not currently be provided if this field config is within another\\nfields configuration (like a lookup field)'\n              )\n              .optional(),\n            referencedFieldIds: z\n              .array(z.string())\n              .describe(\n                'The other fields in the record that are used in the ai field\\n\\nThe referencedFieldIds will not currently be provided if this field config is within another\\nfields configuration (like a lookup field)'\n              )\n              .optional()\n          }),\n          type: z.literal('aiText')\n        }),\n        z\n          .object({\n            options: z.object({\n              linkedTableId: z\n                .string()\n                .describe('The ID of the table this field links to'),\n              viewIdForRecordSelection: z\n                .string()\n                .describe(\n                  'The ID of the view in the linked table\\nto use when showing a list of records to select from'\n                )\n                .optional()\n            }),\n            type: z.literal('multipleRecordLinks')\n          })\n          .describe(\n            'Creating \"multipleRecordLinks\" fields is supported but updating options for\\nexisting \"multipleRecordLinks\" fields is not supported.'\n          ),\n        z.object({\n          options: z.object({\n            choices: z.array(\n              z.object({\n                color: z\n                  .string()\n                  .describe('Optional when creating an option.')\n                  .optional(),\n                id: z\n                  .string()\n                  .describe(\n                    'This is not specified when creating new options, useful when specifing existing\\noptions (for example: reordering options, keeping old options and adding new ones, etc)'\n                  )\n                  .optional(),\n                name: z.string()\n              })\n            )\n          }),\n          type: z.literal('singleSelect')\n        }),\n        z.object({\n          options: z.object({\n            choices: z.array(\n              z.object({\n                color: z\n                  .string()\n                  .describe('Optional when creating an option.')\n                  .optional(),\n                id: z\n                  .string()\n                  .describe(\n                    'This is not specified when creating new options, useful when specifing existing\\noptions (for example: reordering options, keeping old options and adding new ones, etc)'\n                  )\n                  .optional(),\n                name: z.string()\n              })\n            )\n          }),\n          type: z.literal('multipleSelects')\n        }),\n        z.object({\n          options: z.record(z.any()).optional(),\n          type: z.literal('singleCollaborator')\n        }),\n        z.object({\n          options: z.record(z.any()).optional(),\n          type: z.literal('multipleCollaborators')\n        }),\n        z.object({\n          options: z.object({\n            dateFormat: z.object({\n              format: z\n                .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD'])\n                .describe(\n                  'Format is optional when writing, but it must match\\nthe corresponding name if provided.\\n\\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)'\n                )\n                .optional(),\n              name: z.enum(['local', 'friendly', 'us', 'european', 'iso'])\n            })\n          }),\n          type: z.literal('date')\n        }),\n        z.object({\n          options: z.object({\n            dateFormat: z.object({\n              format: z\n                .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD'])\n                .describe(\n                  'Format is optional when writing, but it must match\\nthe corresponding name if provided.\\n\\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)'\n                )\n                .optional(),\n              name: z.enum(['local', 'friendly', 'us', 'european', 'iso'])\n            }),\n            timeFormat: z.object({\n              format: z.enum(['h:mma', 'HH:mm']).optional(),\n              name: z.enum(['12hour', '24hour'])\n            }),\n            timeZone: z.any()\n          }),\n          type: z.literal('dateTime')\n        }),\n        z.object({\n          options: z.object({ isReversed: z.boolean() }).optional(),\n          type: z.literal('multipleAttachments')\n        })\n      ])\n    )\n    .describe(\n      'The config of a field. NB: Formula fields cannot be created with this MCP due to a limitation in the Airtable API.'\n    )\n  export type Field = z.infer<typeof FieldSchema> & { id: string }\n\n  export const ViewSchema = z.object({\n    id: z.string(),\n    name: z.string(),\n    type: z.string()\n  })\n  export type View = z.infer<typeof ViewSchema>\n\n  export const TableSchema = z.object({\n    id: z.string(),\n    name: z.string(),\n    description: z.string().optional(),\n    primaryFieldId: z.string(),\n    fields: z.array(FieldSchema.and(z.object({ id: z.string() }))),\n    views: z.array(ViewSchema)\n  })\n  export type Table = z.infer<typeof TableSchema>\n\n  export const BaseSchemaResponseSchema = z.object({\n    tables: z.array(TableSchema)\n  })\n  export type BaseSchemaResponse = z.infer<typeof BaseSchemaResponseSchema>\n\n  // Zod schemas for tool arguments\n  export const ListRecordsArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    offset: z\n      .number()\n      .optional()\n      .describe('Offset to start the list from. Defaults to 0.'),\n    maxRecords: z\n      .number()\n      .optional()\n      .describe('Maximum number of records to return. Defaults to 100.'),\n    filterByFormula: z\n      .string()\n      .optional()\n      .describe('Airtable formula to filter records')\n  })\n  export type ListRecordsArgs = z.infer<typeof ListRecordsArgsSchema>\n\n  export const SearchRecordsArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    searchTerm: z.string().describe('Text to search for in records'),\n    fieldIds: z\n      .array(z.string())\n      .optional()\n      .describe(\n        'Specific field ids to search in. If not provided, searches all text-based fields.'\n      ),\n    maxRecords: z\n      .number()\n      .optional()\n      .describe('Maximum number of records to return. Defaults to 100.')\n  })\n  export type SearchRecordsArgs = z.infer<typeof SearchRecordsArgsSchema>\n\n  export const TableDetailLevelSchema = z.enum([\n    'tableIdentifiersOnly',\n    'identifiersOnly',\n    'full'\n  ]).describe(`Detail level for table information:\n  - tableIdentifiersOnly: table IDs and names\n  - identifiersOnly: table, field, and view IDs and names\n  - full: complete details including field types, descriptions, and configurations\n\n  Note for LLMs: To optimize context window usage, request the minimum detail level needed:\n  - Use 'tableIdentifiersOnly' when you only need to list or reference tables\n  - Use 'identifiersOnly' when you need to work with field or view references\n  - Only use 'full' when you need field types, descriptions, or other detailed configuration\n\n  If you only need detailed information on a few tables in a base with many complex tables, it might be more efficient for you to use list_tables with tableIdentifiersOnly, then describe_table with full on the specific tables you want.`)\n  export type TableDetailLevel = z.infer<typeof TableDetailLevelSchema>\n\n  export const DescribeTableArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    detailLevel: TableDetailLevelSchema.optional().default('full')\n  })\n  export type DescribeTableArgs = z.infer<typeof DescribeTableArgsSchema>\n\n  export const ListTablesArgsSchema = z.object({\n    baseId: z.string(),\n    detailLevel: TableDetailLevelSchema.optional().default('full')\n  })\n  export type ListTablesArgs = z.infer<typeof ListTablesArgsSchema>\n\n  export const GetRecordArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    recordId: z.string()\n  })\n  export type GetRecordArgs = z.infer<typeof GetRecordArgsSchema>\n\n  export const CreateRecordArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    fields: z.record(z.any())\n  })\n  export type CreateRecordArgs = z.infer<typeof CreateRecordArgsSchema>\n\n  export const UpdateRecordsArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    records: z.array(\n      z.object({\n        id: z.string(),\n        fields: z.record(z.any())\n      })\n    )\n  })\n  export type UpdateRecordsArgs = z.infer<typeof UpdateRecordsArgsSchema>\n\n  export const DeleteRecordsArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    recordIds: z.array(z.string())\n  })\n  export type DeleteRecordsArgs = z.infer<typeof DeleteRecordsArgsSchema>\n\n  export const CreateTableArgsSchema = z.object({\n    baseId: z.string(),\n    name: z\n      .string()\n      .describe('Name for the new table. Must be unique in the base.'),\n    description: z.string().optional(),\n    fields: z.array(FieldSchema).describe(`Table fields. Rules:\n  - At least one field must be specified.\n  - The primary (first) field must be one of: single line text, long text, date, phone number, email, URL, number, currency, percent, duration, formula, autonumber, barcode.`)\n  })\n  export type CreateTableArgs = z.infer<typeof CreateTableArgsSchema>\n\n  export const UpdateTableArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    name: z.string().optional(),\n    description: z.string().optional()\n  })\n  export type UpdateTableArgs = z.infer<typeof UpdateTableArgsSchema>\n\n  export const CreateFieldArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    // This is used as a workaround for https://github.com/orgs/modelcontextprotocol/discussions/90\n    body: z.object({\n      field: FieldSchema\n    })\n  })\n  export type CreateFieldArgs = z.infer<typeof CreateFieldArgsSchema>\n\n  export const UpdateFieldArgsSchema = z.object({\n    baseId: z.string(),\n    tableId: z.string(),\n    fieldId: z.string(),\n    name: z.string().optional(),\n    description: z.string().optional()\n  })\n  export type UpdateFieldArgs = z.infer<typeof UpdateFieldArgsSchema>\n\n  export type FieldSet = Record<string, any>\n  export type AirtableRecord = { id: string; fields: FieldSet }\n\n  export type AirtableTableToDetailLevel<\n    TDetailLevel extends TableDetailLevel | undefined = 'full'\n  > = TDetailLevel extends undefined\n    ? airtable.Table\n    : TDetailLevel extends 'full'\n      ? airtable.Table\n      : TDetailLevel extends 'identifiersOnly'\n        ? {\n            id: string\n            name: string\n            fields: { id: string; name: string }[]\n            views: { id: string; name: string }[]\n          }\n        : TDetailLevel extends 'tableIdentifiersOnly'\n          ? { id: string; name: string }\n          : never\n}\n"
  },
  {
    "path": "legacy/packages/airtable/src/index.ts",
    "content": "export * from './airtable'\nexport * from './airtable-client'\n"
  },
  {
    "path": "legacy/packages/airtable/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/apollo/package.json",
    "content": "{\n  \"name\": \"@agentic/apollo\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Apollo.io.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/apollo\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/apollo/src/apollo-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace apollo {\n  export const API_BASE_URL = 'https://api.apollo.io'\n\n  // Allow up to 5 requests per second by default.\n  // https://docs.apollo.io/reference/rate-limits\n  export const throttle = pThrottle({\n    limit: 5,\n    interval: 1000\n  })\n\n  export interface EnrichPersonOptions {\n    first_name?: string\n    last_name?: string\n    name?: string\n    email?: string\n    hashed_email?: string\n    organization_name?: string\n    domain?: string\n    id?: string\n    linkedin_url?: string\n    reveal_personal_emails?: boolean\n    reveal_phone_number?: boolean\n    webhook_url?: string\n  }\n\n  export interface EnrichPersonResponse {\n    person: Person\n  }\n\n  export interface Person {\n    id: string\n    first_name: string\n    last_name: string\n    name: string\n    linkedin_url: string\n    title: string\n    email_status: string\n    photo_url: string\n    twitter_url: any\n    github_url: any\n    facebook_url: any\n    extrapolated_email_confidence: any\n    headline: string\n    email: string\n    organization_id: string\n    employment_history: EmploymentHistory[]\n    state: string\n    city: string\n    country: string\n    contact_id: string\n    contact: Contact\n    revealed_for_current_team: boolean\n    organization: Organization\n    is_likely_to_engage: boolean\n    intent_strength: any\n    show_intent: boolean\n    departments: string[]\n    subdepartments: string[]\n    functions: string[]\n    seniority: string\n  }\n\n  export interface EmploymentHistory {\n    _id: string\n    id: string\n    created_at: string | null\n    updated_at: string | null\n    title: string\n    key: string\n    current: boolean\n    degree: string | null\n    description: string | null\n    emails: any\n    end_date?: string\n    grade_level: string | null\n    kind: string | null\n    major: string | null\n    organization_id?: string | null\n    organization_name: string | null\n    raw_address: string | null\n    start_date: string\n  }\n\n  export interface Contact {\n    contact_roles: any[]\n    id: string\n    first_name: string\n    last_name: string\n    name: string\n    linkedin_url: string\n    title: string\n    contact_stage_id: string\n    owner_id: any\n    creator_id: string\n    person_id: string\n    email_needs_tickling: any\n    organization_name: string\n    source: string\n    original_source: string\n    organization_id: string\n    headline: string\n    photo_url: any\n    present_raw_address: string\n    linkedin_uid: any\n    extrapolated_email_confidence: any\n    salesforce_id: any\n    salesforce_lead_id: any\n    salesforce_contact_id: any\n    salesforce_account_id: any\n    crm_owner_id: any\n    created_at: string\n    emailer_campaign_ids: any[]\n    direct_dial_status: any\n    direct_dial_enrichment_failed_at: any\n    email_status: string\n    email_source: any\n    account_id: string\n    last_activity_date: any\n    hubspot_vid: any\n    hubspot_company_id: any\n    crm_id: any\n    sanitized_phone: string\n    merged_crm_ids: any\n    updated_at: string\n    queued_for_crm_push: any\n    suggested_from_rule_engine_config_id: any\n    email_unsubscribed: any\n    label_ids: any[]\n    has_pending_email_arcgate_request: boolean\n    has_email_arcgate_request: boolean\n    existence_level: string\n    email: string\n    email_from_customer: boolean\n    typed_custom_fields: TypedCustomFields\n    custom_field_errors: any\n    crm_record_url: any\n    email_status_unavailable_reason: any\n    email_true_status: string\n    updated_email_true_status: boolean\n    contact_rule_config_statuses: any[]\n    source_display_name: string\n    contact_emails: ContactEmail[]\n    time_zone: string\n    phone_numbers: PhoneNumber[]\n    account_phone_note: any\n    free_domain: boolean\n    is_likely_to_engage: boolean\n  }\n\n  export type TypedCustomFields = any\n\n  export interface ContactEmail {\n    email: string\n    email_md5: string\n    email_sha256: string\n    email_status: string\n    email_source: any\n    extrapolated_email_confidence: any\n    position: number\n    email_from_customer: any\n    free_domain: boolean\n  }\n\n  export interface PhoneNumber {\n    raw_number: string\n    sanitized_number: string\n    type: any\n    position: number\n    status: string\n    dnc_status: any\n    dnc_other_info: any\n    dialer_flags?: DialerFlags\n  }\n\n  export interface DialerFlags {\n    country_name: string\n    country_enabled: boolean\n    high_risk_calling_enabled: boolean\n    potential_high_risk_number: boolean\n  }\n\n  export interface Organization {\n    id: string\n    name: string\n    website_url: string\n    blog_url: any\n    angellist_url: any\n    linkedin_url: string\n    twitter_url: string\n    facebook_url: string\n    primary_phone: PrimaryPhone\n    languages: any[]\n    alexa_ranking: number\n    phone: any\n    linkedin_uid: string\n    founded_year: number\n    publicly_traded_symbol: any\n    publicly_traded_exchange: any\n    logo_url: string\n    crunchbase_url: any\n    primary_domain: string\n    industry: string\n    keywords: string[]\n    estimated_num_employees: number\n    industries: string[]\n    secondary_industries: any[]\n    snippets_loaded: boolean\n    industry_tag_id: string\n    industry_tag_hash: IndustryTagHash\n    retail_location_count: number\n    raw_address: string\n    street_address: string\n    city: string\n    state: string\n    postal_code: string\n    country: string\n    owned_by_organization_id: any\n    seo_description: string\n    short_description: string\n    suborganizations: any[]\n    num_suborganizations: number\n    annual_revenue_printed: string\n    annual_revenue: number\n    total_funding: number\n    total_funding_printed: string\n    latest_funding_round_date: string\n    latest_funding_stage: string\n    funding_events: FundingEvent[]\n    technology_names: string[]\n    current_technologies: CurrentTechnology[]\n    org_chart_root_people_ids: string[]\n    org_chart_sector: string\n    org_chart_removed: boolean\n    org_chart_show_department_filter: boolean\n  }\n\n  export type PrimaryPhone = any\n\n  export interface IndustryTagHash {\n    'information technology & services': string\n  }\n\n  export interface FundingEvent {\n    id: string\n    date: string\n    news_url?: string\n    type: string\n    investors: string\n    amount: string\n    currency: string\n  }\n\n  export interface CurrentTechnology {\n    uid: string\n    name: string\n    category: string\n  }\n}\n\n/**\n * Apollo.io is a B2B person and company enrichment API.\n *\n * @see https://docs.apollo.io\n */\nexport class ApolloClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('APOLLO_API_KEY'),\n    apiBaseUrl = apollo.API_BASE_URL,\n    timeoutMs = 60_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      `ApolloClient missing required \"apiKey\" (defaults to \"APOLLO_API_KEY\")`\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, apollo.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        'x-api-key': apiKey\n      }\n    })\n  }\n\n  /**\n   * Attempts to enrich a person with Apollo data.\n   *\n   * Apollo relies on the information you pass via the endpoint's parameters to identify the correct person to enrich. If you provide more information about a person, Apollo is more likely to find a match within its database. If you only provide general information, such as a name without a domain or email address, you might receive a 200 response, but the response will indicate that no records have been enriched.\n   *\n   * By default, this endpoint does not return personal emails or phone numbers. Use the reveal_personal_emails and reveal_phone_number parameters to retrieve emails and phone numbers.\n   */\n  @aiFunction({\n    name: 'apollo_enrich_person',\n    description: `Attempts to enrich a person with Apollo data.\n\nApollo relies on the information you pass via the endpoint's parameters to identify the correct person to enrich. If you provide more information about a person, Apollo is more likely to find a match within its database. If you only provide general information, such as a name without a domain or email address, you might receive a 200 response, but the response will indicate that no records have been enriched.\n\nBy default, this endpoint does not return personal emails or phone numbers. Use the reveal_personal_emails and reveal_phone_number parameters to retrieve emails and phone numbers.`,\n    inputSchema: z.object({\n      first_name: z.string().optional(),\n      last_name: z.string().optional(),\n      name: z.string().optional(),\n      email: z.string().optional(),\n      hashed_email: z.string().optional(),\n      organization_name: z.string().optional(),\n      domain: z.string().optional(),\n      id: z.string().optional(),\n      linkedin_url: z.string().optional(),\n      reveal_personal_emails: z.boolean().optional(),\n      reveal_phone_number: z.boolean().optional(),\n      webhook_url: z.string().optional()\n    })\n  })\n  async enrichPerson(opts: apollo.EnrichPersonOptions) {\n    return this.ky\n      .post('api/v1/people/match', { json: opts })\n      .json<apollo.EnrichPersonResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/apollo/src/index.ts",
    "content": "export * from './apollo-client'\n"
  },
  {
    "path": "legacy/packages/apollo/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/arxiv/package.json",
    "content": "{\n  \"name\": \"@agentic/arxiv\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Arxiv.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/arxiv\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"fast-xml-parser\": \"catalog:\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/arxiv/src/arxiv-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  pruneEmpty,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport { XMLParser } from 'fast-xml-parser'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nimport { castArray, getProp } from './utils'\n\nexport namespace arxiv {\n  export const API_BASE_URL = 'https://export.arxiv.org/api'\n\n  export const SortType = {\n    RELEVANCE: 'relevance',\n    LAST_UPDATED_DATE: 'lastUpdatedDate',\n    SUBMITTED_DATE: 'submittedDate'\n  } as const\n\n  export const SortOrder = {\n    ASCENDING: 'ascending',\n    DESCENDING: 'descending'\n  } as const\n\n  export const FilterType = {\n    ALL: 'all',\n    TITLE: 'title',\n    AUTHOR: 'author',\n    ABSTRACT: 'abstract',\n    COMMENT: 'comment',\n    JOURNAL_REFERENCE: 'journal_reference',\n    SUBJECT_CATEGORY: 'subject_category',\n    REPORT_NUMBER: 'report_number'\n  } as const\n\n  export type ValueOf<T extends NonNullable<unknown>> = T[keyof T]\n  export const FilterTypeMapping: Record<ValueOf<typeof FilterType>, string> = {\n    all: 'all',\n    title: 'ti',\n    author: 'au',\n    abstract: 'abs',\n    comment: 'co',\n    journal_reference: 'jr',\n    subject_category: 'cat',\n    report_number: 'rn'\n  }\n\n  export const Separators = {\n    AND: '+AND+',\n    OR: '+OR+',\n    ANDNOT: '+ANDNOT+'\n  } as const\n\n  export interface ArXivResponse {\n    totalResults: number\n    startIndex: number\n    itemsPerPage: number\n    entries: {\n      id: string\n      title: string\n      summary: string\n      published: string\n      updated: string\n      authors: { name: string; affiliation: string[] }[]\n      doi: string\n      comment: string\n      journalReference: string\n      primaryCategory: string\n      categories: string[]\n      links: string[]\n    }[]\n  }\n\n  export const extractId = (value: string) =>\n    value\n      .replace('https://arxiv.org/abs/', '')\n      .replace('https://arxiv.org/pdf/', '')\n      .replace(/v\\d$/, '')\n\n  const EntrySchema = z.object({\n    field: z.nativeEnum(FilterType).default(FilterType.ALL),\n    value: z.string().min(1)\n  })\n\n  export const SearchParamsSchema = z\n    .object({\n      ids: z.array(z.string().min(1)).optional(),\n      searchQuery: z\n        .union([\n          z.string(),\n          z.object({\n            include: z\n              .array(EntrySchema)\n              .nonempty()\n              .describe('Filters to include results.'),\n            exclude: z\n              .array(EntrySchema)\n              .optional()\n              .describe('Filters to exclude results.')\n          })\n        ])\n        .optional(),\n      start: z.number().int().min(0).default(0),\n      maxResults: z.number().int().min(1).max(100).default(5)\n    })\n    .describe('Sorting by date is not supported.')\n  export type SearchParams = z.infer<typeof SearchParamsSchema>\n}\n\n/**\n * Lightweight wrapper around ArXiv for academic / scholarly research articles.\n *\n * @see https://arxiv.org\n */\nexport class ArXivClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = arxiv.API_BASE_URL,\n    ky = defaultKy\n  }: {\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl\n    })\n  }\n\n  /**\n   * Searches for research articles published on arXiv.\n   */\n  @aiFunction({\n    name: 'arxiv_search',\n    description: 'Searches for research articles published on arXiv.',\n    inputSchema: arxiv.SearchParamsSchema\n  })\n  async search(queryOrOpts: string | arxiv.SearchParams) {\n    const opts =\n      typeof queryOrOpts === 'string'\n        ? ({ searchQuery: queryOrOpts } as arxiv.SearchParams)\n        : queryOrOpts\n\n    if (!opts.ids?.length && !opts.searchQuery) {\n      throw new Error(\n        `The 'searchQuery' property must be non-empty if the 'ids' property is not provided.`\n      )\n    }\n\n    const searchParams = sanitizeSearchParams({\n      start: opts.start,\n      max_results: opts.maxResults,\n      id_list: opts.ids?.map(arxiv.extractId),\n      search_query: opts.searchQuery\n        ? typeof opts.searchQuery === 'string'\n          ? opts.searchQuery\n          : [\n              opts.searchQuery.include\n                .map(\n                  (tag) => `${arxiv.FilterTypeMapping[tag.field]}:${tag.value}`\n                )\n                .join(arxiv.Separators.AND),\n              (opts.searchQuery.exclude ?? [])\n                .map(\n                  (tag) => `${arxiv.FilterTypeMapping[tag.field]}:${tag.value}`\n                )\n                .join(arxiv.Separators.ANDNOT)\n            ]\n              .filter(Boolean)\n              .join(arxiv.Separators.ANDNOT)\n        : undefined,\n      sortBy: arxiv.SortType.RELEVANCE,\n      sortOrder: arxiv.SortOrder.DESCENDING\n    })\n\n    const responseText = await this.ky.get('query', { searchParams }).text()\n\n    const parser = new XMLParser({\n      allowBooleanAttributes: true,\n      alwaysCreateTextNode: false,\n      attributeNamePrefix: '@_',\n      attributesGroupName: false,\n      cdataPropName: '#cdata',\n      ignoreAttributes: true,\n      numberParseOptions: { hex: false, leadingZeros: true },\n      parseAttributeValue: false,\n      parseTagValue: true,\n      preserveOrder: false,\n      removeNSPrefix: true,\n      textNodeName: '#text',\n      trimValues: true,\n      ignoreDeclaration: true\n    })\n\n    const parsedData = parser.parse(responseText)\n\n    let entries: Record<string, any>[] = getProp(\n      parsedData,\n      ['feed', 'entry'],\n      []\n    )\n    entries = castArray(entries)\n\n    return {\n      totalResults: Math.max(\n        getProp(parsedData, ['feed', 'totalResults'], 0),\n        entries.length\n      ),\n      startIndex: getProp(parsedData, ['feed', 'startIndex'], 0),\n      itemsPerPage: getProp(parsedData, ['feed', 'itemsPerPage'], 0),\n      entries: entries.map((entry) =>\n        pruneEmpty({\n          id: arxiv.extractId(entry.id),\n          url: entry.id,\n          title: entry.title,\n          summary: entry.summary,\n          published: entry.published,\n          updated: entry.updated,\n          authors: castArray(entry.author)\n            .filter(Boolean)\n            .map((author: any) => ({\n              name: author.name,\n              affiliation: castArray(author.affiliation ?? [])\n            })),\n          doi: entry.doi,\n          comment: entry.comment,\n          journalReference: entry.journal_ref,\n          primaryCategory: entry.primary_category,\n          categories: castArray(entry.category).filter(Boolean),\n          links: castArray(entry.link).filter(Boolean)\n        })\n      )\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/arxiv/src/index.ts",
    "content": "export * from './arxiv-client'\n"
  },
  {
    "path": "legacy/packages/arxiv/src/utils.ts",
    "content": "export function hasProp<T>(\n  target: T | undefined,\n  key: keyof T\n): key is keyof T {\n  return Boolean(target) && Object.prototype.hasOwnProperty.call(target, key)\n}\n\nexport function getProp(\n  target: unknown,\n  paths: readonly (keyof any)[],\n  defaultValue: any = undefined\n) {\n  let value: any = target\n  if (!value) {\n    return undefined\n  }\n\n  for (const key of paths) {\n    if (!hasProp(value, key)) {\n      return defaultValue\n    }\n    value = value[key]\n  }\n  return value\n}\n\nexport function castArray<T>(arr: T) {\n  const result = Array.isArray(arr) ? arr : [arr]\n  return result as T extends unknown[] ? T : [T]\n}\n"
  },
  {
    "path": "legacy/packages/arxiv/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/bing/package.json",
    "content": "{\n  \"name\": \"@agentic/bing\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Bing search.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/bing\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/bing/src/bing-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  omit\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace bing {\n  export const API_BASE_URL = 'https://api.bing.microsoft.com'\n\n  export interface SearchQuery {\n    q: string\n    mkt?: string\n    offset?: number\n    count?: number\n    safeSearch?: 'Off' | 'Moderate' | 'Strict'\n    textDecorations?: boolean\n    textFormat?: 'Raw' | 'HTML'\n  }\n\n  export interface SearchResponse {\n    _type: string\n    entities: Entities\n    images: Images\n    places: Places\n    queryContext: QueryContext\n    rankingResponse: RankingResponse\n    relatedSearches: RelatedSearches\n    videos: Videos\n    webPages: WebPages\n  }\n\n  interface Entities {\n    value: EntitiesValue[]\n  }\n\n  interface EntitiesValue {\n    bingId: string\n    contractualRules: PurpleContractualRule[]\n    description: string\n    entityPresentationInfo: EntityPresentationInfo\n    id: string\n    image: Image\n    name: string\n    webSearchUrl: string\n  }\n\n  interface PurpleContractualRule {\n    _type: string\n    license?: DeepLink\n    licenseNotice?: string\n    mustBeCloseToContent: boolean\n    targetPropertyName: string\n    text?: string\n    url?: string\n  }\n\n  interface DeepLink {\n    name: string\n    url: string\n  }\n\n  interface EntityPresentationInfo {\n    entityScenario: string\n    entityTypeHints: string[]\n  }\n\n  interface Image {\n    height: number\n    hostPageUrl: string\n    name: string\n    provider: Provider[]\n    sourceHeight: number\n    sourceWidth: number\n    thumbnailUrl: string\n    width: number\n  }\n\n  interface Provider {\n    _type: string\n    url: string\n  }\n\n  interface Images {\n    id: string\n    isFamilyFriendly: boolean\n    readLink: string\n    value: ImagesValue[]\n    webSearchUrl: string\n  }\n\n  interface ImagesValue {\n    contentSize: string\n    contentUrl: string\n    encodingFormat: string\n    height: number\n    hostPageDisplayUrl: string\n    hostPageUrl: string\n    name: string\n    thumbnail: Thumbnail\n    thumbnailUrl: string\n    webSearchUrl: string\n    width: number\n  }\n\n  interface Thumbnail {\n    height: number\n    width: number\n  }\n\n  interface Places {\n    value: PlacesValue[]\n  }\n\n  interface PlacesValue {\n    _type: string\n    address: Address\n    entityPresentationInfo: EntityPresentationInfo\n    id: string\n    name: string\n    telephone: string\n    url: string\n    webSearchUrl: string\n  }\n\n  interface Address {\n    addressCountry: string\n    addressLocality: string\n    addressRegion: string\n    neighborhood: string\n    postalCode: string\n  }\n\n  interface QueryContext {\n    askUserForLocation: boolean\n    originalQuery: string\n  }\n\n  interface RankingResponse {\n    mainline: Mainline\n    sidebar: Mainline\n  }\n\n  interface Mainline {\n    items: Item[]\n  }\n\n  interface Item {\n    answerType: string\n    resultIndex?: number\n    value?: ItemValue\n  }\n\n  interface ItemValue {\n    id: string\n  }\n\n  interface RelatedSearches {\n    id: string\n    value: RelatedSearchesValue[]\n  }\n\n  interface RelatedSearchesValue {\n    displayText: string\n    text: string\n    webSearchUrl: string\n  }\n\n  interface Videos {\n    id: string\n    isFamilyFriendly: boolean\n    readLink: string\n    scenario: string\n    value: VideosValue[]\n    webSearchUrl: string\n  }\n\n  interface VideosValue {\n    allowHttpsEmbed: boolean\n    allowMobileEmbed: boolean\n    contentUrl: string\n    creator: Creator\n    datePublished: Date\n    description: string\n    duration: string\n    embedHtml: string\n    encodingFormat: EncodingFormat\n    height: number\n    hostPageDisplayUrl: string\n    hostPageUrl: string\n    isAccessibleForFree: boolean\n    isSuperfresh: boolean\n    motionThumbnailUrl: string\n    name: string\n    publisher: Creator[]\n    thumbnail: Thumbnail\n    thumbnailUrl: string\n    viewCount: number\n    webSearchUrl: string\n    width: number\n  }\n\n  interface Creator {\n    name: string\n  }\n\n  enum EncodingFormat {\n    Mp4 = 'mp4'\n  }\n\n  interface WebPages {\n    totalEstimatedMatches: number\n    value: WebPagesValue[]\n    webSearchUrl: string\n  }\n\n  interface WebPagesValue {\n    dateLastCrawled: Date\n    deepLinks?: DeepLink[]\n    displayUrl: string\n    id: string\n    isFamilyFriendly: boolean\n    isNavigational: boolean\n    language: string\n    name: string\n    snippet: string\n    thumbnailUrl?: string\n    url: string\n    contractualRules?: FluffyContractualRule[]\n  }\n\n  interface FluffyContractualRule {\n    _type: string\n    license: DeepLink\n    licenseNotice: string\n    mustBeCloseToContent: boolean\n    targetPropertyIndex: number\n    targetPropertyName: string\n  }\n}\n\n/**\n * Bing web search client.\n *\n * @see https://www.microsoft.com/en-us/bing/apis/bing-web-search-api\n */\nexport class BingClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('BING_API_KEY'),\n    apiBaseUrl = bing.API_BASE_URL,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'BingClient missing required \"apiKey\" (defaults to \"BING_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl\n    })\n  }\n\n  /**\n   * Searches the web using the Bing search engine to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.\n   */\n  @aiFunction({\n    name: 'bing_web_search',\n    description:\n      'Searches the web using the Bing search engine to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.',\n    inputSchema: z.object({\n      q: z.string().describe('search query')\n    })\n  })\n  async search(queryOrOpts: string | bing.SearchQuery) {\n    const defaultQuery: Partial<bing.SearchQuery> = {\n      mkt: 'en-US'\n    }\n\n    const searchParams =\n      typeof queryOrOpts === 'string'\n        ? {\n            ...defaultQuery,\n            q: queryOrOpts\n          }\n        : {\n            ...defaultQuery,\n            ...queryOrOpts\n          }\n\n    // console.log(searchParams)\n    const res = await this.ky\n      .get('v7.0/search', {\n        headers: {\n          'Ocp-Apim-Subscription-Key': this.apiKey\n        },\n        searchParams\n      })\n      .json<bing.SearchResponse>()\n\n    return omit(res, 'rankingResponse')\n  }\n}\n"
  },
  {
    "path": "legacy/packages/bing/src/index.ts",
    "content": "export * from './bing-client'\n"
  },
  {
    "path": "legacy/packages/bing/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/brave-search/package.json",
    "content": "{\n  \"name\": \"@agentic/brave-search\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Brave search engine.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/brave-search\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/brave-search/src/brave-search-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { bravesearch } from './brave-search'\n\n/**\n * Agentic client for the Brave search engine.\n *\n * @see https://brave.com/search/api\n */\nexport class BraveSearchClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('BRAVE_SEARCH_API_KEY'),\n    apiBaseUrl = bravesearch.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'BraveSearchClient missing required \"apiKey\" (defaults to \"BRAVE_SEARCH_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        'X-Subscription-Token': apiKey\n      }\n    })\n  }\n\n  /**\n   * Brave web search.\n   */\n  @aiFunction({\n    name: 'brave_search',\n    description:\n      'Performs a web search using the Brave Search API, ideal for general queries, news, articles, and online content. ' +\n      'Use this for broad information gathering, recent events, or when you need diverse web sources. ' +\n      'Supports pagination, content filtering, and freshness controls. ' +\n      'Maximum 20 results per request, with offset for pagination. ',\n    inputSchema: bravesearch.SearchParamsSchema\n  })\n  async search(\n    queryOrParams: string | bravesearch.SearchParams\n  ): Promise<bravesearch.SearchResponse> {\n    const { query: q, ...params } =\n      typeof queryOrParams === 'string'\n        ? { query: queryOrParams }\n        : queryOrParams\n\n    return this.ky\n      .get('res/v1/web/search', {\n        searchParams: sanitizeSearchParams({\n          ...params,\n          q\n        })\n      })\n      .json<bravesearch.SearchResponse>()\n  }\n\n  /**\n   * Brave local search for businesses and places.\n   */\n  @aiFunction({\n    name: 'brave_local_search',\n    description:\n      \"Searches for local businesses and places using Brave's Local Search API. \" +\n      'Best for queries related to physical locations, businesses, restaurants, services, etc. ' +\n      'Returns detailed information including:\\n' +\n      '- Business names and addresses\\n' +\n      '- Ratings and review counts\\n' +\n      '- Phone numbers and opening hours\\n' +\n      \"Use this when the query implies 'near me' or mentions specific locations. \" +\n      'Automatically falls back to web search if no local results are found.',\n    inputSchema: bravesearch.LocalSearchParamsSchema\n  })\n  async localSearch(\n    queryOrParams: string | bravesearch.LocalSearchParams\n  ): Promise<bravesearch.LocalSearchResponse | bravesearch.SearchResponse> {\n    const { query: q, ...params } =\n      typeof queryOrParams === 'string'\n        ? { query: queryOrParams }\n        : queryOrParams\n\n    const webData = await this.ky\n      .get('res/v1/web/search', {\n        searchParams: sanitizeSearchParams({\n          search_lang: 'en',\n          result_filter: 'locations',\n          ...params,\n          q\n        })\n      })\n      .json<bravesearch.SearchResponse>()\n\n    const locationIds = webData.locations?.results\n      ?.filter((r) => !!r.id)\n      .map((r) => r.id)\n\n    if (!locationIds?.length) {\n      return this.search(queryOrParams)\n    }\n\n    // Get POI details and descriptions in parallel\n    const [pois, descriptions] = await Promise.all([\n      this.getPoisData(locationIds),\n      this.getDescriptionsData(locationIds)\n    ])\n\n    const desc = descriptions.descriptions\n\n    return Object.entries(desc).map(([id, description]) => ({\n      description,\n      ...pois.results.find((r) => r.id === id)!\n    }))\n  }\n\n  async getPoisData(ids: string[]): Promise<bravesearch.PoiResponse> {\n    return this.ky\n      .get('res/v1/local/pois', {\n        searchParams: sanitizeSearchParams({\n          ids: ids.filter(Boolean)\n        })\n      })\n      .json<bravesearch.PoiResponse>()\n  }\n\n  async getDescriptionsData(ids: string[]): Promise<bravesearch.Description> {\n    return this.ky\n      .get('res/v1/local/descriptions', {\n        searchParams: sanitizeSearchParams({\n          ids: ids.filter(Boolean)\n        })\n      })\n      .json<bravesearch.Description>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/brave-search/src/brave-search.ts",
    "content": "import { z } from 'zod'\n\nexport namespace bravesearch {\n  export const apiBaseUrl = 'https://api.search.brave.com'\n\n  export const SearchParamsSchema = z.object({\n    query: z\n      .string()\n      .describe('Search query (max 400 chars, 50 words)')\n      .optional(),\n    count: z\n      .number()\n      .int()\n      .min(1)\n      .max(20)\n      .describe('Number of results (1-20, default 10)')\n      .optional(),\n    offset: z\n      .number()\n      .describe('Pagination offset (max 9, default 0)')\n      .optional()\n  })\n  export type SearchParams = z.infer<typeof SearchParamsSchema>\n\n  export const LocalSearchParamsSchema = z.object({\n    query: z\n      .string()\n      .describe('Search query (max 400 chars, 50 words)')\n      .optional(),\n    count: z\n      .number()\n      .describe('Number of results (1-20, default 10)')\n      .int()\n      .min(1)\n      .max(20)\n      .optional()\n  })\n  export type LocalSearchParams = z.infer<typeof LocalSearchParamsSchema>\n\n  export interface SearchResponse {\n    web?: {\n      results?: Array<{\n        title: string\n        description: string\n        url: string\n        language?: string\n        published?: string\n        rank?: number\n      }>\n    }\n    locations?: {\n      results?: Array<{\n        id: string // Required by API\n        title?: string\n      }>\n    }\n  }\n\n  export interface Location {\n    id: string\n    name: string\n    address: {\n      streetAddress?: string\n      addressLocality?: string\n      addressRegion?: string\n      postalCode?: string\n    }\n    coordinates?: {\n      latitude: number\n      longitude: number\n    }\n    phone?: string\n    rating?: {\n      ratingValue?: number\n      ratingCount?: number\n    }\n    openingHours?: string[]\n    priceRange?: string\n  }\n\n  export interface PoiResponse {\n    results: Location[]\n  }\n\n  export interface Description {\n    descriptions: { [id: string]: string }\n  }\n\n  export type LocalSearchResponse = Array<Location & { description: string }>\n}\n"
  },
  {
    "path": "legacy/packages/brave-search/src/index.ts",
    "content": "export * from './brave-search'\nexport * from './brave-search-client'\n"
  },
  {
    "path": "legacy/packages/brave-search/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/calculator/package.json",
    "content": "{\n  \"name\": \"@agentic/calculator\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic calculator tool wrapping mathjs.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/calculator\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"mathjs\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/calculator/src/calculator.ts",
    "content": "import { createAIFunction } from '@agentic/core'\nimport { evaluate } from 'mathjs'\nimport { z } from 'zod'\n\n// TODO: ensure `expr` is sanitized to not run arbitrary code\n\nexport const CalculatorInputSchema = z.object({\n  expr: z.string().describe('mathematical expression to evaluate')\n})\nexport type CalculatorInput = z.infer<typeof CalculatorInputSchema>\n\nexport const calculator = createAIFunction(\n  {\n    name: 'calculator',\n    description:\n      'Computes the result of simple mathematical expressions. Handles basic arithmetic operations like addition, subtraction, multiplication, division, exponentiation, and common functions like sin, cos, abs, exp, and random. Example expressions: \"1.2 * (2 + 4.5)\", \"12.7 cm to inch\", \"sin(45 deg) ^ 2\"',\n    inputSchema: CalculatorInputSchema\n  },\n  async (input: CalculatorInput) => {\n    const result: number = evaluate(input.expr)\n    return result\n  }\n)\n"
  },
  {
    "path": "legacy/packages/calculator/src/index.ts",
    "content": "export * from './calculator'\n"
  },
  {
    "path": "legacy/packages/calculator/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/clearbit/package.json",
    "content": "{\n  \"name\": \"@agentic/clearbit\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Clearbit.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/clearbit\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/clearbit/src/clearbit-client.ts",
    "content": "import {\n  assert,\n  delay,\n  getEnv,\n  pruneNullOrUndefinedDeep,\n  sanitizeSearchParams,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\n\nexport namespace clearbit {\n  // Allow up to 600 requests per minute by default.\n  // (10 requests per second)\n  export const throttle = pThrottle({\n    limit: 10,\n    interval: 1000\n  })\n\n  export const MAX_PAGE_SIZE = 100\n\n  export interface CompanyEnrichmentOptions {\n    domain: string\n    webhook_url?: string\n    company_name?: string\n    linkedin?: string\n    twitter?: string\n    facebook?: string\n  }\n\n  export type CompanyNullableProps = {\n    name: string\n    legalName: string\n    domain: string\n    domainAliases: string[]\n    site: {\n      phoneNumbers: string[]\n      emailAddresses: string[]\n    }\n    category: Partial<{\n      sector: string\n      industryGroup: string\n      industry: string\n      subIndustry: string\n      gicsCode: string\n      sicCode: string\n      sic4Codes: string[]\n      naicsCode: string\n      naics6Codes: string[]\n      naics6Codes2022: string[]\n    }>\n    tags: string[]\n    description: string\n    foundedYear: number\n    location: string\n    timeZone: string\n    utcOffset: number\n    geo: Partial<{\n      streetNumber: string\n      streetName: string\n      subPremise: string\n      streetAddress: string\n      city: string\n      postalCode: string\n      state: string\n      stateCode: string\n      country: string\n      countryCode: string\n      lat: number\n      lng: number\n    }>\n    logo: string\n    facebook: Partial<{\n      handle: string\n      likes: number\n    }>\n    linkedin: {\n      handle: string\n    }\n    twitter: Partial<{\n      handle: string\n      id: string\n      bio: string\n      followers: number\n      following: number\n      location: string\n      site: string\n      avatar: string\n    }>\n    crunchbase: {\n      handle: string\n    }\n    emailProvider: boolean\n    type: string\n    ticker: string\n    identifiers: Partial<{\n      usEIN: string\n      usCIK: string\n    }>\n    phone: string\n    metrics: Partial<{\n      alexaUsRank: number\n      alexaGlobalRank: number\n      trafficRank: string\n      employees: number\n      employeesRange: string\n      marketCap: number\n      raised: number\n      annualRevenue: string\n      estimatedAnnualRevenue: string\n      fiscalYearEnd: number\n    }>\n    indexedAt: string\n    tech: string[]\n    techCategories: string[]\n    parent: {\n      domain: string\n    }\n    ultimateParent: {\n      domain: string\n    }\n  }\n\n  export type EmailLookupResponse = Partial<{\n    id: string\n    name: Partial<Name>\n    email: string\n    location: string\n    timeZone: string\n    utcOffset: number\n    geo: Partial<GeoIP>\n    bio: string\n    site: string\n    avatar: string\n    employment: Partial<EmploymentAttributes>\n    facebook: {\n      handle: string\n    }\n    github: Partial<{\n      handle: string\n      id: string\n      avatar: string\n      company: string\n      blog: string\n      followers: number\n      following: number\n    }>\n    twitter: Partial<{\n      handle: string\n      id: string\n      bio: string\n      followers: number\n      following: number\n      statuses: number\n      favorites: number\n      location: string\n      site: string\n      avatar: string\n    }>\n    linkedin: {\n      handle: string\n    }\n    googleplus: {\n      handle: null\n    }\n    gravatar: Partial<{\n      handle: string\n      urls: {\n        value: string\n        title: string\n      }[]\n      avatar: string\n      avatars: {\n        url: string\n        type: string\n      }[]\n    }>\n    fuzzy: boolean\n    emailProvider: boolean\n    indexedAt: string\n    phone: string\n    activeAt: string\n    inactiveAt: string\n  }>\n\n  export type CompanyResponse = {\n    id: string\n  } & Partial<CompanyNullableProps>\n\n  export interface CompanySearchOptions {\n    /**\n     * See clearbit docs: https://dashboard.clearbit.com/docs?shell#discovery-api-tech-queries\n     * Examples:\n     * tech:google_apps\n     * or:(twitter_followers:10000~ type:nonprofit)\n     */\n    query: string\n    page?: number\n    page_size?: number\n    limit?: number\n    sort?: string\n  }\n\n  export interface CompanySearchResponse {\n    total: number\n    page: number\n    results: CompanyResponse[]\n  }\n\n  export interface BasicCompanyResponse {\n    domain: string\n    logo: string\n    name: string\n  }\n\n  export interface PeopleSearchOptionsV2 {\n    domains?: string[]\n    names?: string[]\n    roles?: string[]\n    seniorities?: string[]\n    titles?: string[]\n    locations?: string[]\n    employees_ranges?: string[]\n    company_tags?: string[]\n    company_tech?: string[]\n    company_types?: string[]\n    industries?: string[]\n    revenue_ranges?: string[]\n    linkedin_profile_handles?: string[]\n    page?: number\n    page_size?: number\n    suppression?: string\n  }\n\n  // Prospector types\n  export interface ProspectorResponseV2 {\n    page: number\n    page_size: number\n    total: number\n    results: PersonAttributesV2[]\n  }\n\n  export interface EmploymentAttributes {\n    company?: string\n    domain?: string\n    linkedin?: string\n    title?: string\n    role?: string\n    subRole?: string\n    seniority?: string\n    startDate?: string\n    endDate?: string\n    present?: boolean\n    location?: string\n    email?: string\n    highlight?: boolean\n  }\n\n  export interface EmailAttributes {\n    address: string\n    type: string\n  }\n\n  export interface PhoneAttributes {\n    number: string\n    type: string\n  }\n\n  interface Name {\n    givenName: string\n    familyName: string\n    fullName: string\n  }\n\n  export type PersonAttributesV2 = {\n    id: string\n  } & Partial<{\n    name: Name\n    avatar: string\n    location: string\n    linkedin: string\n    employments: EmploymentAttributes[]\n    emails: EmailAttributes[]\n    phones: PhoneAttributes[]\n  }>\n\n  export type PeopleSearchOptionsV1 = {\n    domain: string\n    role?: string\n    roles?: string[]\n    seniority?: string\n    seniorities?: string[]\n    title?: string\n    titles?: string[]\n    city?: string\n    cities?: string[]\n    state?: string\n    states?: string[]\n    country?: string\n    countries?: string[]\n    name?: string\n    query?: string\n    page?: number\n    page_size?: number\n    suppression?: string\n    email?: boolean\n  }\n\n  export interface Company {\n    name: string\n  }\n\n  export interface PeopleSearchResponseV1 {\n    id: string\n    name: Name\n    title: string\n    role: string\n    subRole: string\n    seniority: string\n    company: Company\n    email: string\n    verified: boolean\n    phone: string\n  }\n\n  export interface ProspectorResponseV1 {\n    page: number\n    page_size: number\n    total: number\n    results: PeopleSearchResponseV1[]\n  }\n\n  export interface GeoIP {\n    city: string\n    state: string\n    stateCode: string\n    country: string\n    countryCode: string\n    lat?: number\n    lng?: number\n  }\n\n  export interface CompanyRevealResponse {\n    ip: string\n    fuzzy: boolean\n    domain: string\n    type: string\n    company?: CompanyResponse\n    geoIP: GeoIP\n    confidenceScore: 'very_high' | 'high' | 'medium' | 'low'\n    role: string\n    seniority: string\n  }\n\n  export const PersonRoles = [\n    'communications',\n    'customer_service',\n    'education',\n    'engineering',\n    'finance',\n    'health_professional',\n    'human_resources',\n    'information_technology',\n    'leadership',\n    'legal',\n    'marketing',\n    'operations',\n    'product',\n    'public_relations',\n    'real_estate',\n    'recruiting',\n    'research',\n    'sales'\n  ]\n\n  export const SenioritiesV2 = [\n    'Executive',\n    'VP',\n    'Owner',\n    'Partner',\n    'Director',\n    'Manager',\n    'Senior',\n    'Entry'\n  ]\n\n  export const Seniorities = ['executive', 'director', 'manager']\n\n  export const SubIndustries = [\n    'Automotive',\n    'Consumer Discretionary',\n    'Consumer Goods',\n    'Consumer Electronics',\n    'Household Appliances',\n    'Photography',\n    'Sporting Goods',\n    'Apparel, Accessories & Luxury Goods',\n    'Textiles',\n    'Textiles, Apparel & Luxury Goods',\n    'Consumer Services',\n    'Education Services',\n    'Specialized Consumer Services',\n    'Casinos & Gaming',\n    'Hotels, Restaurants & Leisure',\n    'Leisure Facilities',\n    'Restaurants',\n    'Education',\n    'Family Services',\n    'Legal Services',\n    'Advertising',\n    'Broadcasting',\n    'Media',\n    'Movies & Entertainment',\n    'Public Relations',\n    'Publishing',\n    'Distributors',\n    'Retailing',\n    'Home Improvement Retail',\n    'Homefurnishing Retail',\n    'Specialty Retail',\n    'Consumer Staples',\n    'Food Retail',\n    'Beverages',\n    'Agricultural Products',\n    'Food',\n    'Food Production',\n    'Packaged Foods & Meats',\n    'Tobacco',\n    'Cosmetics',\n    'Oil & Gas',\n    'Banking & Mortgages',\n    'Accounting',\n    'Finance',\n    'Financial Services',\n    'Asset Management & Custody Banks',\n    'Diversified Capital Markets',\n    'Fundraising',\n    'Investment Banking & Brokerage',\n    'Payments',\n    'Insurance',\n    'Real Estate',\n    'Eyewear',\n    'Health & Wellness',\n    'Health Care',\n    'Health Care Services',\n    'Biotechnology',\n    'Life Sciences Tools & Services',\n    'Pharmaceuticals',\n    'Aerospace & Defense',\n    'Capital Goods',\n    'Civil Engineering',\n    'Construction',\n    'Construction & Engineering',\n    'Mechanical Engineering',\n    'Electrical',\n    'Electrical Equipment',\n    'Industrials & Manufacturing',\n    'Industrial Machinery',\n    'Machinery',\n    'Trading Companies & Distributors',\n    'Business Supplies',\n    'Commercial Printing',\n    'Corporate & Business',\n    'Architecture',\n    'Automation',\n    'Consulting',\n    'Design',\n    'Human Resource & Employment Services',\n    'Professional Services',\n    'Research & Consulting Services',\n    'Industrials',\n    'Shipping & Logistics',\n    'Airlines',\n    'Marine',\n    'Ground Transportation',\n    'Transportation',\n    'Semiconductors',\n    'Cloud Services',\n    'Internet',\n    'Internet Software & Services',\n    'Data Processing & Outsourced Services',\n    'Graphic Design',\n    'Communications',\n    'Computer Networking',\n    'Nanotechnology',\n    'Computer Hardware',\n    'Technology Hardware, Storage & Peripherals',\n    'Building Materials',\n    'Chemicals',\n    'Commodity Chemicals',\n    'Containers & Packaging',\n    'Gold',\n    'Metals & Mining',\n    'Paper Products',\n    'Integrated Telecommunication Services',\n    'Wireless Telecommunication Services',\n    'Renewable Energy',\n    'Energy',\n    'Utilities'\n  ]\n}\n\n/**\n * The Clearbit API helps with resolving and enriching people and company data.\n *\n * @see https://dashboard.clearbit.com/docs\n */\nexport class ClearbitClient {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n\n  constructor({\n    apiKey = getEnv('CLEARBIT_API_KEY'),\n    timeoutMs = 30_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'ClearbitClient missing required \"apiKey\" (defaults to \"CLEARBIT_API_KEY\")'\n    )\n\n    this.apiKey = apiKey\n\n    const throttledKy = throttle ? throttleKy(ky, clearbit.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      timeout: timeoutMs,\n      headers: {\n        // Authorization: `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`\n        Authorization: `Bearer ${apiKey}`\n      }\n    })\n  }\n\n  async companyEnrichment(options: clearbit.CompanyEnrichmentOptions) {\n    const res = await this.ky\n      .get('https://company-stream.clearbit.com/v2/companies/find', {\n        searchParams: sanitizeSearchParams(options)\n      })\n      .json<clearbit.CompanyResponse>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n\n  async companySearch(options: clearbit.CompanySearchOptions) {\n    const res = await this.ky\n      .get('https://discovery.clearbit.com/v1/companies/search', {\n        searchParams: sanitizeSearchParams(options)\n      })\n      .json<clearbit.CompanySearchResponse>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n\n  async companyAutocomplete(name: string) {\n    const res = await this.ky\n      .get('https://autocomplete.clearbit.com/v1/companies/suggest', {\n        searchParams: { query: name }\n      })\n      .json<clearbit.BasicCompanyResponse[]>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n\n  async prospectorPeopleV2(options: clearbit.PeopleSearchOptionsV2) {\n    const res = await this.ky\n      .get('https://prospector.clearbit.com/v2/people/search', {\n        searchParams: sanitizeSearchParams({\n          ...options,\n          page_size: Math.min(\n            clearbit.MAX_PAGE_SIZE,\n            options.page_size || clearbit.MAX_PAGE_SIZE\n          )\n        })\n      })\n      .json<clearbit.ProspectorResponseV2>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n\n  async prospectorPeopleV1(options: clearbit.PeopleSearchOptionsV1) {\n    const res = await this.ky\n      .get('https://prospector.clearbit.com/v1/people/search', {\n        searchParams: sanitizeSearchParams({\n          email: false,\n          ...options,\n          page_size: Math.min(\n            clearbit.MAX_PAGE_SIZE,\n            options.page_size || clearbit.MAX_PAGE_SIZE\n          )\n        })\n      })\n      .json<clearbit.ProspectorResponseV1>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n\n  // TODO Status code = 202 means the response was queued.\n  // Implement webhook when needed. The polling works well, in most cases we need\n  // to try again once to get a 200 response.\n  async emailLookup({\n    email,\n    maxRetries = 2\n  }: {\n    email: string\n    maxRetries?: number\n  }): Promise<clearbit.EmailLookupResponse> {\n    const url = 'https://person.clearbit.com/v2/people/find'\n    let response = await this.ky.get(url, {\n      searchParams: { email }\n    })\n\n    if (response.status !== 202 || !maxRetries) {\n      const res = await response.json<clearbit.EmailLookupResponse>()\n      return pruneNullOrUndefinedDeep(res)\n    }\n\n    if (maxRetries && response.status === 202) {\n      let count = 0\n      let running = true\n      while (running && count < maxRetries) {\n        console.log(`Email Lookup was queued, retry ${count + 1}.`)\n        await delay(1000)\n        response = await this.ky.get(url, {\n          searchParams: { email }\n        })\n        count++\n        running = response.status === 202\n      }\n      const res = await response.json<clearbit.EmailLookupResponse>()\n      return pruneNullOrUndefinedDeep(res)\n    }\n\n    throw new Error('clearbit email lookup error 202', { cause: response })\n  }\n\n  async nameToDomain(name: string) {\n    return this.ky\n      .get('https://company.clearbit.com/v1/domains/find', {\n        searchParams: { name }\n      })\n      .json<clearbit.BasicCompanyResponse>()\n      .catch((_) => undefined)\n  }\n\n  async revealCompanyFromIP(ip: string) {\n    const res = await this.ky\n      .get('https://reveal.clearbit.com/v1/companies/find', {\n        searchParams: { ip }\n      })\n      .json<clearbit.CompanyRevealResponse>()\n      .catch((_) => undefined)\n\n    if (res) {\n      return pruneNullOrUndefinedDeep(res)\n    }\n  }\n\n  static filterEmploymentProspectorV2(\n    companyName: string,\n    employments?: Array<Partial<clearbit.EmploymentAttributes>>\n  ) {\n    if (employments && employments.length > 0) {\n      // We filter by employment endDate because some people could have multiple\n      // jobs at the same time.\n      // Here we want to filter by people that actively works at a specific company.\n      return employments\n        .filter((item) => !item?.endDate)\n        .some((item) =>\n          item?.company?.toLowerCase().includes(companyName.toLowerCase())\n        )\n    }\n\n    return false\n  }\n}\n"
  },
  {
    "path": "legacy/packages/clearbit/src/index.ts",
    "content": "export * from './clearbit-client'\n"
  },
  {
    "path": "legacy/packages/clearbit/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/diffbot/package.json",
    "content": "{\n  \"name\": \"@agentic/diffbot\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Diffbot.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/diffbot\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/diffbot/src/diffbot-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace diffbot {\n  export const API_BASE_URL = 'https://api.diffbot.com'\n  export const KNOWLEDGE_GRAPH_API_BASE_URL = 'https://kg.diffbot.com'\n\n  // Allow up to 5 requests per second by default.\n  // https://docs.diffbot.com/reference/rate-limits\n  export const throttle = pThrottle({\n    limit: 5,\n    interval: 1000,\n    strict: true\n  })\n\n  export interface ExtractOptions {\n    /** Specify optional fields to be returned from any fully-extracted pages, e.g.: &fields=querystring,links. See available fields within each API's individual documentation pages.\n     * @see https://docs.diffbot.com/reference/extract-optional-fields\n     */\n    fields?: string[]\n\n    /** (*Undocumented*) Pass paging=false to disable automatic concatenation of multiple-page articles. (By default, Diffbot will concatenate up to 20 pages of a single article.) */\n    paging?: boolean\n\n    /** Pass discussion=false to disable automatic extraction of comments or reviews from pages identified as articles or products. This will not affect pages identified as discussions. */\n    discussion?: boolean\n\n    /** Sets a value in milliseconds to wait for the retrieval/fetch of content from the requested URL. The default timeout for the third-party response is 30 seconds (30000). */\n    timeout?: number\n\n    /** Used to specify the IP address of a custom proxy that will be used to fetch the target page, instead of Diffbot's default IPs/proxies. (Ex: &proxy=168.212.226.204) */\n    proxy?: string\n\n    /** Used to specify the authentication parameters that will be used with the proxy specified in the &proxy parameter. (Ex: &proxyAuth=username:password) */\n    proxyAuth?: string\n\n    /** `none` will instruct Extract to not use proxies, even if proxies have been enabled for this particular URL globally. */\n    useProxy?: string\n\n    /** @see https://docs.diffbot.com/reference/extract-custom-javascript */\n    customJs?: string\n\n    /** @see https://docs.diffbot.com/reference/extract-custom-headers */\n    customHeaders?: Record<string, string>\n  }\n\n  export interface ExtractAnalyzeOptions extends ExtractOptions {\n    /** URL of the web page to process */\n    url: string\n\n    /** By default the Analyze API will fully extract all pages that match an existing Automatic API -- articles, products or image pages. Set mode to a specific page-type (e.g., mode=article) to extract content only from that specific page-type. All other pages will simply return the default Analyze fields. */\n    mode?: string\n\n    /** Force any non-extracted pages (those with a type of \"other\") through a specific API. For example, to route all \"other\" pages through the Article API, pass &fallback=article. Pages that utilize this functionality will return a fallbackType field at the top-level of the response and a originalType field within each extracted object, both of which will indicate the fallback API used. */\n    fallback?: string\n  }\n\n  export interface ExtractArticleOptions extends ExtractOptions {\n    /** URL of the web page to process */\n    url: string\n\n    /** Set the maximum number of automatically-generated tags to return. By default a maximum of ten tags will be returned. */\n    maxTags?: number\n\n    /** Set the minimum relevance score of tags to return, between 0.0 and 1.0. By default only tags with a score equal to or above 0.5 will be returned. */\n    tagConfidence?: number\n\n    /** Used to request the output of the Diffbot Natural Language API in the field naturalLanguage. Example: &naturalLanguage=entities,facts,categories,sentiment. */\n    naturalLanguage?: string[]\n  }\n\n  export interface ExtractResponse {\n    request: DiffbotRequest\n    objects: DiffbotObject[]\n  }\n\n  export type ExtractArticleResponse = ExtractResponse\n\n  export interface ExtractAnalyzeResponse extends ExtractResponse {\n    type: string\n    title: string\n    humanLanguage: string\n  }\n\n  export interface DiffbotObject {\n    type: string\n    title: string\n    pageUrl: string\n    diffbotUri: string\n    description?: string\n    date?: string\n    sentiment?: number\n    author?: string\n    estimatedDate?: string\n    publisherRegion?: string\n    icon?: string\n    siteName?: string\n    publisherCountry?: string\n    humanLanguage?: string\n    authorUrl?: string\n    html?: string\n    text?: string\n    images?: Image[]\n    tags?: Tag[]\n    categories?: ObjectCategory[]\n    authors?: Author[]\n    breadcrumb?: Breadcrumb[]\n    items?: ListItem[]\n    meta?: any\n  }\n\n  export interface ListItem {\n    title: string\n    link: string\n    summary: string\n    image?: string\n  }\n\n  export interface Author {\n    name: string\n    link: string\n  }\n\n  export interface ObjectCategory {\n    score: number\n    name: string\n    id: string\n  }\n\n  export interface Breadcrumb {\n    link: string\n    name: string\n  }\n\n  export interface Image {\n    url: string\n    diffbotUri: string\n\n    naturalWidth: number\n    naturalHeight: number\n    width: number\n    height: number\n\n    isCached?: boolean\n    primary?: boolean\n  }\n\n  export interface Tag {\n    score: number\n    sentiment: number\n    count: number\n    label: string\n    uri: string\n    rdfTypes: string[]\n  }\n\n  export interface DiffbotRequest {\n    pageUrl: string\n    api: string\n    version: number\n  }\n\n  export interface KnowledgeGraphSearchOptions {\n    type?: 'query' | 'text' | 'queryTextFallback' | 'crawl'\n    query: string\n    col?: string\n    from?: number\n    size?: number\n\n    // NOTE: we only support `json`, so these options are not needed\n    // We can always convert from json to another format if needed.\n    // format?: 'json' | 'jsonl' | 'csv' | 'xls' | 'xlsx'\n    // exportspec?: string\n    // exportseparator?: string\n    // exportfile?: string\n\n    filter?: string\n    jsonmode?: 'extended' | 'id'\n    nonCanonicalFacts?: boolean\n    noDedupArticles?: boolean\n    cluster?: 'all' | 'best' | 'dedupe'\n    report?: boolean\n  }\n\n  export interface KnowledgeGraphEnhanceOptions {\n    type: EntityType\n\n    id?: string\n    name?: string\n    url?: string\n    phone?: string\n    email?: string\n    employer?: string\n    title?: string\n    school?: string\n    location?: string\n    ip?: string\n    customId?: string\n\n    size?: number\n    threshold?: number\n\n    refresh?: boolean\n    search?: boolean\n    useCache?: boolean\n\n    filter?: string\n    jsonmode?: 'extended' | 'id'\n    nonCanonicalFacts?: boolean\n  }\n\n  export interface KnowledgeGraphResponse {\n    data: KnowledgeGraphNode[]\n    version: number\n    hits: number\n    results: number\n    kgversion: string\n    diffbot_type: string\n    facet?: boolean\n    errors?: any[]\n  }\n\n  export interface KnowledgeGraphNode {\n    score: number\n    esscore?: number\n    entity: KnowledgeGraphEntity\n    entity_ctx: any\n    errors: string[]\n    callbackQuery: string\n    upperBound: number\n    lowerBound: number\n    count: number\n    value: string\n    uri: string\n  }\n\n  export interface KnowledgeGraphEntity {\n    id: string\n    diffbotUri: string\n    type?: string\n    name: string\n    images: Image[]\n    origins: string[]\n    nbOrigins?: number\n\n    gender?: Gender\n    githubUri?: string\n    importance?: number\n    description?: string\n    homepageUri?: string\n    allNames?: string[]\n    skills?: Partial<BasicEntity>[]\n    crawlTimestamp?: number\n    summary?: string\n    image?: string\n    types?: string[]\n    nbIncomingEdges?: number\n    allUris?: string[]\n    employments?: Employment[]\n    locations?: Location[]\n    location?: Location\n    allOriginHashes?: string[]\n    nameDetail?: NameDetail\n  }\n\n  export type EntityType = 'Organization' | 'Place'\n\n  export const EnhanceEntityOptionsSchema = z.object({\n    type: z.enum(['Person', 'Organization']),\n    id: z\n      .string()\n      .optional()\n      .describe('Diffbot ID of the entity to enhance if known'),\n    name: z\n      .union([z.string(), z.array(z.string())])\n      .optional()\n      .describe('Name of the entity'),\n    url: z\n      .union([z.string(), z.array(z.string())])\n      .optional()\n      .describe('Origin or homepage URL of the entity'),\n    phone: z.string().optional().describe('Phone number of the entity'),\n    email: z.string().optional().describe('Email of the entity'),\n    employer: z\n      .string()\n      .optional()\n      .describe(\"Name of the entity's employer (for Person entities)\"),\n    title: z\n      .string()\n      .optional()\n      .describe('Title of the entity (for Person entities)'),\n    school: z\n      .string()\n      .optional()\n      .describe('School of the entity (for Person entities)'),\n    location: z.string().optional().describe('Location of the entity'),\n    ip: z.string().optional().describe('IP address of the entity'),\n    customId: z.string().optional().describe('User-defined ID for correlation'),\n    threshold: z.number().optional().describe('Similarity threshold'),\n    refresh: z\n      .boolean()\n      .optional()\n      .describe(\n        'If set, will attempt to refresh the entity data by recrawling the source URLs.'\n      ),\n    search: z\n      .boolean()\n      .optional()\n      .describe(\n        'If set, will attempt to search the web for the entity and merge the results into its knowledge base.'\n      ),\n    size: z\n      .number()\n      .int()\n      .max(100)\n      .optional()\n      .describe('Number of results to return')\n  })\n  export type EnhanceEntityOptions = z.infer<typeof EnhanceEntityOptionsSchema>\n\n  export interface EnhanceEntityResponse {\n    version: number\n    hits: number\n    kgversion: string\n    request_ctx: RequestCtx\n    data: EnhanceEntityResult[]\n    errors: any[]\n  }\n\n  export interface RequestCtx {\n    query: Query\n    query_ctx: QueryCtx\n  }\n\n  export interface Query {\n    type: string\n    name: string[]\n  }\n\n  export interface QueryCtx {\n    search: string\n  }\n\n  export interface EnhanceEntityResult {\n    score: number\n    esscore: number\n    entity: Entity\n    errors: any[]\n  }\n\n  export interface Entity {\n    name: string\n    type: EntityType\n    id: string\n    summary?: string\n    description?: string\n    homepageUri?: string\n    twitterUri?: string\n    linkedInUri?: string\n    githubUri?: string\n    crunchbaseUri?: string\n    googlePlusUri?: string\n    facebookUri?: string\n    angellistUri?: string\n    wikipediaUri?: string\n    diffbotUri?: string\n    origin?: string\n    origins?: string[]\n    allUris?: string[]\n\n    // extra metadata\n    nbOrigins?: number\n    nbIncomingEdges?: number\n    nbFollowers?: number\n    nbLocations?: number\n    nbEmployees?: number\n    nbEmployeesMin?: number\n    nbEmployeesMax?: number\n    nbActiveEmployeeEdges?: number\n    nbUniqueInvestors?: number\n    educations?: Education[]\n    nationalities?: Nationality[]\n    fullName?: string\n    allNames?: string[]\n    skills?: Partial<BasicEntity>[]\n    children?: BasicEntity[]\n    height?: number\n    image?: string\n    images?: Image[]\n    allOriginHashes?: string[]\n    nameDetail?: NameDetail\n    parents?: BasicEntity[]\n    gender?: Gender\n    importance?: number\n    monthlyTraffic?: number\n    monthlyTrafficGrowth?: number\n    wikipediaPageviews?: number\n    wikipediaPageviewsLastQuarterGrowth?: number\n    wikipediaPageviewsLastYear?: number\n    wikipediaPageviewsLastYearGrowth?: number\n    wikipediaPageviewsLastQuarter?: number\n    wikipediaPageviewsGrowth?: number\n    birthPlace?: Location\n    types?: string[]\n    unions?: Union[]\n    languages?: Language[]\n    employments?: Employment[]\n    birthDate?: DateTime\n    religion?: Partial<BasicEntity>\n    awards?: Award[]\n    netWorth?: Amount\n    allDescriptions?: string[]\n    locations?: Location[]\n    location?: Location\n    interests?: Interest[]\n    suppliers?: BasicEntity[]\n    subsidiaries?: BasicEntity[]\n    ipo?: {\n      date: DateTime\n      stockExchange: string\n    }\n    motto?: string\n    logo?: string\n    foundingDate?: DateTime\n    totalInvestment?: Amount\n    naicsClassification2017?: any[]\n    naicsClassification?: any[]\n    sicClassification?: any[]\n    naceClassification?: any[]\n    iSicClassification?: any[]\n    employeeCategories?: any[]\n    emailAddresses?: EmailAddress[]\n    age?: number\n    isPublic?: boolean\n    isAcquired?: boolean\n    isDissolved?: boolean\n    isNonProfit?: boolean\n    crawlTimestamp?: number\n    founders?: BasicEntity[]\n    boardMembers?: BasicEntity[]\n    ceo?: BasicEntity\n    investments?: Investment[]\n    acquiredBy?: BasicEntity[]\n    diffbotClassification?: any[]\n    blogUri?: string\n    descriptors?: string[]\n    industries?: string[]\n    partnerships?: BasicEntity[]\n    categories?: Category[]\n    customers?: BasicEntity[]\n    technographics?: Technographic[]\n    stock?: Stock\n    companiesHouseIds?: string[]\n    yearlyRevenues?: AnnualRevenue[]\n    revenue?: Amount\n    parentCompany?: BasicEntity\n    legalEntities?: BasicEntity[]\n  }\n\n  export interface AnnualRevenue {\n    revenue: Amount\n    isCurrent: boolean\n    year: number\n    filingDate: DateTime\n    revenueDate: DateTime\n  }\n\n  export interface Technographic {\n    technology: Partial<BasicEntity>\n    categories: string[]\n  }\n\n  export interface Category {\n    level?: number\n    isPrimary?: boolean\n    name: string\n    diffbotUri?: string\n    targetDiffbotId?: string\n    type?: string\n  }\n\n  export interface Investment {\n    date: DateTime\n    amount?: Amount\n    isCurrent: boolean\n    series: string\n    investors: BasicEntity[]\n  }\n\n  export interface Amount {\n    currency: string\n    value: number\n  }\n\n  export interface EmailAddress {\n    contactString: string\n    type: string\n  }\n\n  export interface Education {\n    institution: BasicEntity\n    isCurrent?: boolean\n    major?: BasicEntity\n    degree?: BasicEntity\n    from?: DateTime\n    to?: DateTime\n  }\n\n  export interface DateTime {\n    str: string\n    precision: number\n    timestamp: number\n  }\n\n  export interface Nationality {\n    name: string\n    type: string\n  }\n\n  export interface Image {\n    url: string\n    primary?: boolean\n  }\n\n  export interface NameDetail {\n    firstName: string\n    lastName: string\n    middleName?: string[]\n  }\n\n  export interface Gender {\n    normalizedValue: string\n  }\n\n  export interface Stock {\n    symbol: string\n    isCurrent: boolean\n    exchange: string\n  }\n\n  export interface Union {\n    person: BasicEntity\n    from?: DateTime\n    to?: DateTime\n    type?: string\n  }\n\n  export interface BasicEntity {\n    name: string\n    summary: string\n    type: string\n    image?: string\n    types?: string[]\n    diffbotUri: string\n    targetDiffbotId: string\n  }\n\n  export interface Language {\n    str: string\n    normalizedValue: string\n  }\n\n  export interface Employment {\n    isCurrent?: boolean\n    title?: string\n    description?: string\n    employer?: BasicEntity\n    location?: Location\n    categories?: Partial<BasicEntity>[]\n    from?: DateTime\n    to?: DateTime\n  }\n\n  export interface Location {\n    isCurrent: boolean\n    country?: BasicEntity\n    address?: string\n    city?: BasicEntity\n    street?: string\n    metroArea?: BasicEntity\n    subregion?: BasicEntity\n    surfaceForm?: string\n    latitude?: number\n    longitude?: number\n    postalCode?: string\n    region?: BasicEntity\n    precision?: number\n  }\n\n  export interface Award {\n    title: string\n    date?: DateTime\n  }\n\n  export interface Interest {\n    name: string\n    type: string\n  }\n}\n\n/**\n * Diffbot provides web page classification and scraping. It also provides\n * access to a knowledge graph with the ability to perform person and company\n * data enrichment.\n *\n * @see https://docs.diffbot.com\n */\nexport class DiffbotClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly kyKnowledgeGraph: KyInstance\n\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n  protected readonly apiKnowledgeGraphBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('DIFFBOT_API_KEY'),\n    apiBaseUrl = diffbot.API_BASE_URL,\n    apiKnowledgeGraphBaseUrl = diffbot.KNOWLEDGE_GRAPH_API_BASE_URL,\n    timeoutMs = 30_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    apiKnowledgeGraphBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      `DiffbotClient missing required \"apiKey\" (defaults to \"DIFFBOT_API_KEY\")`\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n    this.apiKnowledgeGraphBaseUrl = apiKnowledgeGraphBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, diffbot.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs\n    })\n\n    this.kyKnowledgeGraph = throttledKy.extend({\n      prefixUrl: apiKnowledgeGraphBaseUrl,\n      timeout: timeoutMs\n    })\n  }\n\n  /**\n   * Scrapes and extracts structured data from a web page. Also classifies the web page as one of several types (article, product, discussion, job, image, video, list, event, or other).\n   */\n  @aiFunction({\n    name: 'diffbot_analyze_url',\n    description:\n      'Scrapes and extracts structured data from a web page. Also classifies the web page as one of several types (article, product, discussion, job, image, video, list, event, or other).',\n    inputSchema: z.object({\n      url: z.string().url().describe('The URL to process.')\n    })\n  })\n  async analyzeUrl(options: diffbot.ExtractAnalyzeOptions) {\n    return this._extract<diffbot.ExtractAnalyzeResponse>('v3/analyze', options)\n  }\n\n  /**\n   * Scrapes and extracts clean article text from news articles, blog posts, and other text-heavy web pages.\n   */\n  @aiFunction({\n    name: 'diffbot_extract_article_from_url',\n    description:\n      'Scrapes and extracts clean article text from news articles, blog posts, and other text-heavy web pages.',\n    inputSchema: z.object({\n      url: z.string().url().describe('The URL to process.')\n    })\n  })\n  async extractArticleFromUrl(options: diffbot.ExtractArticleOptions) {\n    return this._extract<diffbot.ExtractArticleResponse>('v3/article', options)\n  }\n\n  /**\n   * Resolves and enriches a partial person or organization entity.\n   */\n  @aiFunction({\n    name: 'diffbot_enhance_entity',\n    description:\n      'Resolves and enriches a partial person or organization entity.',\n    inputSchema: diffbot.EnhanceEntityOptionsSchema.omit({\n      refresh: true,\n      search: true,\n      customId: true,\n      threshold: true\n    })\n  })\n  async enhanceEntity(\n    opts: diffbot.EnhanceEntityOptions\n  ): Promise<diffbot.EnhanceEntityResponse> {\n    return this.kyKnowledgeGraph\n      .get('kg/v3/enhance', {\n        searchParams: sanitizeSearchParams({\n          ...opts,\n          token: this.apiKey\n        })\n      })\n      .json<diffbot.EnhanceEntityResponse>()\n  }\n\n  async searchKnowledgeGraph(options: diffbot.KnowledgeGraphSearchOptions) {\n    return this.kyKnowledgeGraph\n      .get('kg/v3/dql', {\n        searchParams: {\n          ...options,\n          token: this.apiKey\n        }\n      })\n      .json<diffbot.KnowledgeGraphResponse>()\n  }\n\n  async enhanceKnowledgeGraph(options: diffbot.KnowledgeGraphEnhanceOptions) {\n    return this.kyKnowledgeGraph\n      .get('kg/v3/enhance', {\n        searchParams: {\n          ...options,\n          token: this.apiKey\n        }\n      })\n      .json<diffbot.KnowledgeGraphResponse>()\n  }\n\n  protected async _extract<\n    T extends diffbot.ExtractResponse = diffbot.ExtractResponse\n  >(endpoint: string, options: diffbot.ExtractOptions): Promise<T> {\n    const { customJs, customHeaders, ...rest } = options\n    const searchParams = sanitizeSearchParams({\n      ...rest,\n      token: this.apiKey\n    })\n    const headers = {\n      ...Object.fromEntries(\n        [['X-Forward-X-Evaluate', customJs]].filter(([, value]) => value)\n      ),\n      ...customHeaders\n    }\n\n    // console.log(`DiffbotClient._extract: ${endpoint}`, searchParams)\n\n    return this.ky\n      .get(endpoint, {\n        searchParams,\n        headers,\n        retry: 1\n      })\n      .json<T>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/diffbot/src/index.ts",
    "content": "export * from './diffbot-client'\n"
  },
  {
    "path": "legacy/packages/diffbot/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/duck-duck-go/package.json",
    "content": "{\n  \"name\": \"@agentic/duck-duck-go\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for DuckDuckGo.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/duck-duck-go\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"duck-duck-scrape\": \"catalog:\",\n    \"string-strip-html\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/duck-duck-go/src/duck-duck-go-client.ts",
    "content": "import { aiFunction, AIFunctionsProvider } from '@agentic/core'\nimport { SafeSearchType, search, type SearchOptions } from 'duck-duck-scrape'\nimport { z } from 'zod'\n\nimport { paginate } from './paginate'\n\nexport namespace duckduckgo {\n  export interface DuckDuckGoSearchToolOptions {\n    search?: SearchOptions\n    maxResults: number\n  }\n\n  export interface DuckDuckGoSearchToolRunOptions {\n    search?: SearchOptions\n  }\n}\n/**\n * DuckDuckGo search client.\n *\n * @see https://duckduckgo.com\n */\nexport class DuckDuckGoClient extends AIFunctionsProvider {\n  /**\n   * Searches the web using DuckDuckGo for a given query.\n   */\n  @aiFunction({\n    name: 'duck_duck_go_search',\n    description: 'Searches the web using DuckDuckGo for a given query.',\n    inputSchema: z.object({\n      query: z.string({ description: 'Search query' }).min(1).max(128),\n      maxResults: z.number().min(1).max(100).optional()\n    })\n  })\n  async search(\n    queryOrOptions:\n      | string\n      | { query: string; maxResults?: number; search?: SearchOptions }\n  ) {\n    const options =\n      typeof queryOrOptions === 'string'\n        ? { query: queryOrOptions }\n        : queryOrOptions\n\n    const results = await paginate({\n      size: options.maxResults ?? 10,\n      handler: async ({ cursor = 0 }) => {\n        const { results: data, noResults: done } = await search(\n          options.query,\n          {\n            safeSearch: SafeSearchType.MODERATE,\n            ...options.search,\n            offset: cursor\n          },\n          {\n            uri_modifier: (rawUrl: string) => {\n              const url = new URL(rawUrl)\n              url.searchParams.delete('ss_mkt')\n              return url.toString()\n            }\n          }\n        )\n\n        return {\n          data,\n          nextCursor: done ? undefined : cursor + data.length\n        }\n      }\n    })\n\n    const { stripHtml } = await import('string-strip-html')\n\n    return results.map((result) => ({\n      url: result.url,\n      title: stripHtml(result.title).result,\n      description: stripHtml(result.description).result\n    }))\n  }\n}\n"
  },
  {
    "path": "legacy/packages/duck-duck-go/src/index.ts",
    "content": "export * from './duck-duck-go-client'\n"
  },
  {
    "path": "legacy/packages/duck-duck-go/src/paginate.ts",
    "content": "export interface PaginateInput<T, C> {\n  size: number\n  handler: (data: {\n    cursor?: C\n    limit: number\n  }) => Promise<{ data: T[]; nextCursor?: C }>\n}\n\nexport async function paginate<T, C = number>(\n  input: PaginateInput<T, C>\n): Promise<T[]> {\n  const acc: T[] = []\n  let cursor: C | undefined\n\n  while (acc.length < input.size) {\n    const { data, nextCursor } = await input.handler({\n      cursor,\n      limit: input.size - acc.length\n    })\n    acc.push(...data)\n\n    if (nextCursor === undefined || data.length === 0) {\n      break\n    }\n\n    cursor = nextCursor\n  }\n\n  if (acc.length > input.size) {\n    acc.length = input.size\n  }\n\n  return acc\n}\n"
  },
  {
    "path": "legacy/packages/duck-duck-go/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/e2b/package.json",
    "content": "{\n  \"name\": \"@agentic/e2b\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for E2B's hosted code interpreter.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/e2b\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\"\n  },\n  \"peerDependencies\": {\n    \"@e2b/code-interpreter\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@e2b/code-interpreter\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/e2b/src/e2b.ts",
    "content": "import { createAIFunction, getEnv } from '@agentic/core'\nimport { Sandbox } from '@e2b/code-interpreter'\nimport { z } from 'zod'\n\n/**\n * E2B Python code interpreter sandbox.\n *\n * @see https://e2b.dev\n */\nexport const e2b = createAIFunction(\n  {\n    name: 'execute_python',\n    description: `\nExecute python code in a Jupyter notebook cell and returns any result, stdout, stderr, display_data, and error.\n\n- code has access to the internet and can make api requests\n- code has access to the filesystem and can read/write files\n- coce can install any pip package (if it exists) if you need to, but the usual packages for data analysis are already preinstalled\n- code uses python3\n- code is executed in a secure sandbox environment, so you don't need to worry about safety\n      `.trim(),\n    inputSchema: z.object({\n      code: z\n        .string()\n        .describe('Python code to execute in a single notebook cell.')\n    })\n  },\n  async ({ code }) => {\n    const sandbox = await Sandbox.create({\n      apiKey: getEnv('E2B_API_KEY')\n    })\n\n    try {\n      const exec = await sandbox.runCode(code, {\n        onStderr: (msg) => {\n          console.warn('[Code Interpreter stderr]', msg)\n        },\n\n        onStdout: (stdout) => {\n          console.log('[Code Interpreter stdout]', stdout)\n        }\n      })\n\n      if (exec.error) {\n        console.error('[Code Interpreter error]', exec.error)\n        throw new Error(exec.error.value)\n      }\n\n      return exec.results.map((result) => result.toJSON())\n    } finally {\n      await sandbox.kill()\n    }\n  }\n)\n"
  },
  {
    "path": "legacy/packages/e2b/src/index.ts",
    "content": "export * from './e2b'\n"
  },
  {
    "path": "legacy/packages/e2b/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"compilerOptions\": {\n    \"noImplicitAny\": false\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/exa/package.json",
    "content": "{\n  \"name\": \"@agentic/exa\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Exa search engine.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/exa\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/exa/src/exa-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  pruneUndefined\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace exa {\n  export const TextContentsOptionsSchema = z.object({\n    maxCharacters: z\n      .number()\n      .optional()\n      .describe('The maximum number of characters to return.'),\n    includeHtmlTags: z\n      .boolean()\n      .optional()\n      .describe('If true, includes HTML tags in the returned text.')\n  })\n  export type TextContentsOptions = z.infer<typeof TextContentsOptionsSchema>\n\n  export const HighlightsContentsOptionsSchema = z.object({\n    query: z\n      .string()\n      .optional()\n      .describe('The query string to use for highlights search.'),\n    numSentences: z\n      .number()\n      .optional()\n      .describe('The number of sentences to return for each highlight.'),\n    highlightsPerUrl: z\n      .number()\n      .optional()\n      .describe('The number of highlights to return for each URL.')\n  })\n  export type HighlightsContentsOptions = z.infer<\n    typeof HighlightsContentsOptionsSchema\n  >\n\n  export const ContentsOptionsSchema = z.object({\n    text: z.union([TextContentsOptionsSchema, z.literal(true)]).optional(),\n    highlights: z\n      .union([HighlightsContentsOptionsSchema, z.literal(true)])\n      .optional()\n  })\n  export type ContentsOptions = z.infer<typeof ContentsOptionsSchema>\n\n  export const BaseSearchOptionsSchema = z.object({\n    numResults: z\n      .number()\n      .optional()\n      .describe('Number of search results to return.'),\n    includeDomains: z\n      .array(z.string())\n      .optional()\n      .describe('List of domains to include in the search.'),\n    excludeDomains: z\n      .array(z.string())\n      .optional()\n      .describe('List of domains to exclude from the search.'),\n    startCrawlDate: z\n      .string()\n      .optional()\n      .describe(\n        'Start date for results based on crawl date (ISO 8601 format).'\n      ),\n    endCrawlDate: z\n      .string()\n      .optional()\n      .describe('End date for results based on crawl date (ISO 8601 format).'),\n    startPublishedDate: z\n      .string()\n      .optional()\n      .describe(\n        'Start date for results based on published date (ISO 8601 format).'\n      ),\n    endPublishedDate: z\n      .string()\n      .optional()\n      .describe(\n        'End date for results based on published date (ISO 8601 format).'\n      ),\n    category: z\n      .string()\n      .optional()\n      .describe(\n        'A data category to focus on, with higher comprehensivity and data cleanliness. Currently, the only category is company.'\n      ),\n    contents: ContentsOptionsSchema.optional().describe(\n      'Whether to include the contents of the search results.'\n    )\n  })\n  export type BaseSearchOptions = z.infer<typeof BaseSearchOptionsSchema>\n\n  export const RegularSearchOptionsSchema = BaseSearchOptionsSchema.extend({\n    query: z.string().describe('search query'),\n    useAutoprompt: z.boolean().optional(),\n    type: z.enum(['keyword', 'neural', 'magic']).optional()\n  })\n  export type RegularSearchOptions = z.infer<typeof RegularSearchOptionsSchema>\n\n  export const FindSimilarOptionsSchema = BaseSearchOptionsSchema.extend({\n    url: z\n      .string()\n      .describe('The url for which you would like to find similar links'),\n    excludeSourceDomain: z\n      .boolean()\n      .optional()\n      .describe('If true, excludes links from the base domain of the input.')\n  })\n  export type FindSimilarOptions = z.infer<typeof FindSimilarOptionsSchema>\n\n  export const GetContentsOptionsSchema = ContentsOptionsSchema.extend({\n    ids: z\n      .array(z.string())\n      .nonempty()\n      .describe('Exa IDs of the documents to retrieve.')\n  })\n  export type GetContentsOptions = z.infer<typeof GetContentsOptionsSchema>\n\n  /**\n   * Represents a search result object.\n   */\n  export type SearchResult = {\n    /** The title of the search result. */\n    title: string | null\n\n    /** The URL of the search result. */\n    url: string\n\n    /** The estimated creation date of the content (ISO 8601 format). */\n    publishedDate?: string\n\n    /** The author of the content, if available. */\n    author?: string\n\n    /** Similarity score between the query/url and the result. */\n    score?: number\n\n    /** The temporary Exa ID for the document. */\n    id: string\n\n    /** Text from page */\n    text?: string\n\n    /** The highlights as an array of strings. */\n    highlights?: string[]\n\n    /** The corresponding scores as an array of floats, 0 to 1 */\n    highlightScores?: number[]\n  }\n\n  /**\n   * Represents a search response object.\n   */\n  export type SearchResponse = {\n    /** The list of search results. */\n    results: SearchResult[]\n\n    /** The autoprompt string, if applicable. */\n    autopromptString?: string\n\n    /** Internal ID of this request. */\n    requestId?: string\n  }\n}\n\n/**\n * Web search tailored for LLMs.\n *\n * @see https://docs.exa.ai\n */\nexport class ExaClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('EXA_API_KEY'),\n    apiBaseUrl = getEnv('EXA_API_BASE_URL') ?? 'https://api.exa.ai',\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'ExaClient missing required \"apiKey\" (defaults to \"EXA_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl,\n      headers: {\n        'x-api-key': apiKey\n      }\n    })\n  }\n\n  /**\n   * Performs an Exa search for the given query.\n   */\n  @aiFunction({\n    name: 'exa_search',\n    description: 'Search the web for the given query.',\n    inputSchema: exa.RegularSearchOptionsSchema\n  })\n  async search(queryOrOpts: string | exa.RegularSearchOptions) {\n    const json =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    return this.ky.post('search', { json }).json<exa.SearchResponse>()\n  }\n\n  /**\n   * Finds similar links to the provided URL.\n   */\n  @aiFunction({\n    name: 'exa_find_similar',\n    description: 'Find similar links to the provided URL.',\n    inputSchema: exa.FindSimilarOptionsSchema\n  })\n  async findSimilar(opts: exa.FindSimilarOptions) {\n    const { excludeSourceDomain, ...rest } = opts\n    const excludeDomains = (opts.excludeDomains ?? []).concat(\n      excludeSourceDomain ? [new URL(opts.url).hostname] : []\n    )\n\n    return this.ky\n      .post('findSimilar', {\n        json: pruneUndefined({\n          ...rest,\n          excludeDomains: excludeDomains.length ? excludeDomains : undefined\n        })\n      })\n      .json<exa.SearchResponse>()\n  }\n\n  /**\n   * Retrieves contents of documents based on a list of Exa document IDs.\n   */\n  @aiFunction({\n    name: 'exa_get_contents',\n    description:\n      'Retrieve contents of documents based on a list of Exa document IDs.',\n    inputSchema: exa.GetContentsOptionsSchema\n  })\n  async getContents({ ids, ...opts }: exa.GetContentsOptions) {\n    const documentIDs = Array.isArray(ids) ? ids : [ids]\n    assert(documentIDs.length, 'Must provide at least one document ID')\n\n    return this.ky\n      .post('contents', {\n        json: {\n          ...opts,\n          ids: documentIDs\n        }\n      })\n      .json<exa.SearchResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/exa/src/index.ts",
    "content": "export * from './exa-client'\n"
  },
  {
    "path": "legacy/packages/exa/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/firecrawl/package.json",
    "content": "{\n  \"name\": \"@agentic/firecrawl\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Firecrawl.\",\n  \"authors\": [\n    \"Travis Fischer <travis@transitivebullsh.it>\",\n    \"Ademílson Tonato <ademilsonft@outlook.com>\"\n  ],\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/firecrawl\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/firecrawl/src/firecrawl-client.test.ts",
    "content": "import { z } from 'zod'\n\nimport { FirecrawlClient } from './firecrawl-client'\n\n// Initialize the client with the API key\nconst apiKey = 'FIRECRAWL-API-KEY'\nconst firecrawl = new FirecrawlClient({ apiKey })\n\n// =============================================\n// Test 1: URL Scraping\n// =============================================\nasync function testUrlScraping() {\n  console.log('🔍 Testing URL scraping...')\n  try {\n    const result = await firecrawl.scrapeUrl('https://mairistumpf.com')\n    console.log('✅ URL scraping successful!')\n    console.log('Result:', result)\n  } catch (err) {\n    console.error('❌ URL scraping failed:', err)\n  }\n}\n\n// =============================================\n// Test 2: Search\n// =============================================\nasync function testSearch() {\n  console.log('\\n🔍 Testing search...')\n  try {\n    const result = await firecrawl.search({\n      query: 'artificial intelligence news',\n      limit: 5,\n      lang: 'en',\n      country: 'us'\n    })\n    console.log('✅ Search successful!')\n    console.log('Results:', result.data)\n    console.log('Results:', result.data.length)\n  } catch (err) {\n    console.error('❌ Search failed:', err)\n  }\n}\n\n// =============================================\n// Test 3: Crawl URL\n// =============================================\nasync function testCrawlUrl() {\n  console.log('\\n🔍 Testing URL crawling...')\n  try {\n    const result = await firecrawl.crawlUrl({\n      url: 'https://example.com',\n      maxDepth: 2,\n      limit: 5\n    })\n    console.log('✅ Crawl initiated successfully!')\n    console.log('Result:', result)\n\n    if (result.success && result.id) {\n      // Test crawl status\n      console.log('\\n🔍 Testing crawl status...')\n      const statusResult = await firecrawl.checkCrawlStatus(result.id)\n      console.log('✅ Crawl status check successful!')\n      console.log('Status:', statusResult)\n\n      // Test crawl errors\n      console.log('\\n🔍 Testing crawl errors...')\n      const errorsResult = await firecrawl.checkCrawlErrors(result.id)\n      console.log('✅ Crawl errors check successful!')\n      console.log('Errors:', errorsResult)\n\n      // Test crawl cancellation\n      console.log('\\n🔍 Testing crawl cancellation...')\n      const cancelResult = await firecrawl.cancelCrawl(result.id)\n      console.log('✅ Crawl cancellation successful!')\n      console.log('Result:', cancelResult)\n    }\n  } catch (err) {\n    console.error('❌ Crawl operations failed:', err)\n  }\n}\n\n// =============================================\n// Test 4: Extract\n// =============================================\nasync function testExtract() {\n  console.log('\\n🔍 Testing extract...')\n  try {\n    const result = await firecrawl.extract(['https://firecrawl.dev'], {\n      prompt: 'Extract the pricing information from the website',\n      schema: z.object({\n        pricing: z.object({\n          free: z.object({\n            price: z.number(),\n            features: z.array(z.string())\n          }),\n          pro: z.object({\n            price: z.number(),\n            features: z.array(z.string())\n          })\n        })\n      }),\n      enableWebSearch: false,\n      ignoreSitemap: false,\n      includeSubdomains: true,\n      showSources: false,\n      scrapeOptions: {\n        formats: ['markdown'],\n        onlyMainContent: true,\n        blockAds: true,\n        proxy: 'basic',\n        location: {\n          country: 'US',\n          languages: ['en-US']\n        }\n      }\n    })\n    console.log('✅ Extract successful!')\n    console.log('Result:', result)\n\n    if (result.success && result.id) {\n      // Test extract status\n      console.log('\\n🔍 Testing extract status...')\n      const statusResult = await firecrawl.checkExtractStatus(result.id)\n      console.log('✅ Extract status check successful!')\n      console.log('Status:', statusResult)\n    }\n  } catch (err) {\n    console.error('❌ Extract failed:', err)\n  }\n}\n\nasync function testExtractUntilCompletion() {\n  console.log('\\n🔍 Testing extract...')\n  try {\n    const result = await firecrawl.extract(['https://firecrawl.dev'], {\n      prompt: 'Extract the pricing information from the website',\n      schema: z.object({\n        pricing: z.object({\n          free: z.object({\n            price: z.number(),\n            features: z.array(z.string())\n          }),\n          pro: z.object({\n            price: z.number(),\n            features: z.array(z.string())\n          })\n        })\n      }),\n      enableWebSearch: false,\n      ignoreSitemap: false,\n      includeSubdomains: true,\n      showSources: false,\n      scrapeOptions: {\n        formats: ['markdown'],\n        onlyMainContent: true,\n        blockAds: true,\n        proxy: 'basic',\n        location: {\n          country: 'US',\n          languages: ['en-US']\n        }\n      }\n    })\n    console.log('✅ Extract successful!')\n    console.log('Result:', result)\n\n    if (result.success && result.id) {\n      // Test extract status\n      console.log('\\n🔍 Testing extract status...')\n      let statusResult = await firecrawl.checkExtractStatus(result.id)\n\n      while (statusResult.status === 'processing') {\n        // wait 5 seconds and check again\n        await new Promise((resolve) => setTimeout(resolve, 5000))\n        statusResult = await firecrawl.checkExtractStatus(result.id)\n      }\n      console.log('✅ Extract status check successful!')\n      console.log('Status:', statusResult)\n    }\n  } catch (err) {\n    console.error('❌ Extract failed:', err)\n  }\n}\n\n// =============================================\n// Run all tests\n// =============================================\nconsole.log('🚀 Starting FirecrawlClient tests...\\n')\n\n// Run tests sequentially\nawait testUrlScraping()\nawait testSearch()\nawait testCrawlUrl()\nawait testExtract()\nawait testExtractUntilCompletion()\n\nconsole.log('\\n🏁 All tests completed!')\n"
  },
  {
    "path": "legacy/packages/firecrawl/src/firecrawl-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  throttleKy,\n  zodToJsonSchema\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace firecrawl {\n  export const BASE_URL = 'https://api.firecrawl.dev'\n\n  // Allow up to 50 request per minute by default.\n  export const throttle = pThrottle({\n    limit: 1,\n    interval: 1200,\n    strict: true\n  })\n\n  /**\n   * Configuration interface for FirecrawlClient.\n   */\n  export interface ClientConfig {\n    apiKey?: string\n    apiBaseUrl?: string\n  }\n\n  /**\n   * Metadata for a Firecrawl document.\n   */\n  export interface DocumentMetadata {\n    title?: string\n    description?: string\n    language?: string\n    keywords?: string\n    robots?: string\n    ogTitle?: string\n    ogDescription?: string\n    ogUrl?: string\n    ogImage?: string\n    ogAudio?: string\n    ogDeterminer?: string\n    ogLocale?: string\n    ogLocaleAlternate?: string[]\n    ogSiteName?: string\n    ogVideo?: string\n    dctermsCreated?: string\n    dcDateCreated?: string\n    dcDate?: string\n    dctermsType?: string\n    dcType?: string\n    dctermsAudience?: string\n    dctermsSubject?: string\n    dcSubject?: string\n    dcDescription?: string\n    dctermsKeywords?: string\n    modifiedTime?: string\n    publishedTime?: string\n    articleTag?: string\n    articleSection?: string\n    sourceURL?: string\n    statusCode?: number\n    error?: string\n    [key: string]: any\n  }\n\n  /**\n   * Document interface for Firecrawl.\n   */\n  export interface Document<\n    T = any,\n    ActionsSchema extends ActionsResult | never = never\n  > {\n    url?: string\n    markdown?: string\n    html?: string\n    rawHtml?: string\n    links?: string[]\n    extract?: T\n    json?: T\n    screenshot?: string\n    metadata?: DocumentMetadata\n    actions: ActionsSchema\n    title?: string\n    description?: string\n  }\n\n  /**\n   * Parameters for scraping operations.\n   * Defines the options and configurations available for scraping web content.\n   */\n  export interface ScrapeOptions {\n    formats?: (\n      | 'markdown'\n      | 'html'\n      | 'rawHtml'\n      | 'content'\n      | 'links'\n      | 'screenshot'\n      | 'screenshot@fullPage'\n      | 'extract'\n      | 'json'\n    )[]\n    headers?: Record<string, string>\n    includeTags?: string[]\n    excludeTags?: string[]\n    onlyMainContent?: boolean\n    waitFor?: number\n    timeout?: number\n    location?: {\n      country?: string\n      languages?: string[]\n    }\n    mobile?: boolean\n    skipTlsVerification?: boolean\n    removeBase64Images?: boolean\n    blockAds?: boolean\n    proxy?: 'basic' | 'stealth'\n  }\n\n  /**\n   * Parameters for scraping operations.\n   */\n  export interface ScrapeParams<\n    LLMSchema extends z.ZodSchema = any,\n    ActionsSchema extends Action[] | undefined = undefined\n  > {\n    formats?: (\n      | 'markdown'\n      | 'html'\n      | 'rawHtml'\n      | 'content'\n      | 'links'\n      | 'screenshot'\n      | 'screenshot@fullPage'\n      | 'extract'\n      | 'json'\n    )[]\n    headers?: Record<string, string>\n    includeTags?: string[]\n    excludeTags?: string[]\n    onlyMainContent?: boolean\n    waitFor?: number\n    timeout?: number\n    location?: {\n      country?: string\n      languages?: string[]\n    }\n    mobile?: boolean\n    skipTlsVerification?: boolean\n    removeBase64Images?: boolean\n    blockAds?: boolean\n    proxy?: 'basic' | 'stealth'\n    extract?: {\n      prompt?: string\n      schema?: LLMSchema\n      systemPrompt?: string\n    }\n    jsonOptions?: {\n      prompt?: string\n      schema?: LLMSchema\n      systemPrompt?: string\n    }\n    actions?: ActionsSchema\n  }\n\n  export type Action =\n    | {\n        type: 'wait'\n        milliseconds?: number\n        selector?: string\n      }\n    | {\n        type: 'click'\n        selector: string\n      }\n    | {\n        type: 'screenshot'\n        fullPage?: boolean\n      }\n    | {\n        type: 'write'\n        text: string\n      }\n    | {\n        type: 'press'\n        key: string\n      }\n    | {\n        type: 'scroll'\n        direction?: 'up' | 'down'\n        selector?: string\n      }\n    | {\n        type: 'scrape'\n      }\n    | {\n        type: 'executeJavascript'\n        script: string\n      }\n\n  export interface ActionsResult {\n    screenshots: string[]\n  }\n\n  /**\n   * Response interface for scraping operations.\n   */\n  export interface ScrapeResponse<\n    LLMResult = any,\n    ActionsSchema extends ActionsResult | never = never\n  > extends Document<LLMResult, ActionsSchema> {\n    success: true\n    warning?: string\n    error?: string\n  }\n\n  /**\n   * Parameters for search operations.\n   */\n  export interface SearchParams {\n    limit?: number\n    tbs?: string\n    filter?: string\n    lang?: string\n    country?: string\n    location?: string\n    origin?: string\n    timeout?: number\n    scrapeOptions?: ScrapeParams\n  }\n\n  /**\n   * Response interface for search operations.\n   */\n  export interface SearchResponse {\n    success: boolean\n    data: Document[]\n    warning?: string\n    error?: string\n  }\n\n  /**\n   * Parameters for crawling operations.\n   */\n  export interface CrawlParams {\n    includePaths?: string[]\n    excludePaths?: string[]\n    maxDepth?: number\n    maxDiscoveryDepth?: number\n    limit?: number\n    allowBackwardLinks?: boolean\n    allowExternalLinks?: boolean\n    ignoreSitemap?: boolean\n    scrapeOptions?: ScrapeParams\n    webhook?:\n      | string\n      | {\n          url: string\n          headers?: Record<string, string>\n          metadata?: Record<string, string>\n          events?: ['completed', 'failed', 'page', 'started'][number][]\n        }\n    deduplicateSimilarURLs?: boolean\n    ignoreQueryParameters?: boolean\n    regexOnFullURL?: boolean\n  }\n\n  /**\n   * Response interface for crawling operations.\n   */\n  export interface CrawlResponse {\n    id?: string\n    url?: string\n    success: true\n    error?: string\n  }\n\n  /**\n   * Response interface for job status checks.\n   */\n  export interface CrawlStatusResponse {\n    success: true\n    status: 'scraping' | 'completed' | 'failed' | 'cancelled'\n    completed: number\n    total: number\n    creditsUsed: number\n    expiresAt: Date\n    next?: string\n    data: Document[]\n  }\n\n  /**\n   * Response interface for crawl errors.\n   */\n  export interface CrawlErrorsResponse {\n    errors: {\n      id: string\n      timestamp?: string\n      url: string\n      error: string\n    }[]\n    robotsBlocked: string[]\n  }\n\n  /**\n   * Error response interface.\n   */\n  export interface ErrorResponse {\n    success: false\n    error: string\n  }\n\n  /**\n   * Custom error class for Firecrawl.\n   */\n  export class FirecrawlError extends Error {\n    statusCode: number\n    details?: any\n\n    constructor(message: string, statusCode: number, details?: any) {\n      super(message)\n      this.statusCode = statusCode\n      this.details = details\n    }\n  }\n\n  /**\n   * Parameters for extracting information from URLs.\n   */\n  export interface ExtractParams<T extends z.ZodSchema = any> {\n    prompt: string\n    schema?: T\n    enableWebSearch?: boolean\n    ignoreSitemap?: boolean\n    includeSubdomains?: boolean\n    showSources?: boolean\n    scrapeOptions?: ScrapeOptions\n  }\n\n  /**\n   * Response interface for extracting information from URLs.\n   * Defines the structure of the response received after extracting information from URLs.\n   */\n  export interface ExtractResponse<T = any> {\n    success: boolean\n    id?: string\n    data: T\n    error?: string\n    warning?: string\n    sources?: string[]\n  }\n\n  /**\n   * Response interface for extract status operations.\n   */\n  export interface ExtractStatusResponse<T = any> {\n    success: boolean\n    status: 'processing' | 'completed' | 'failed'\n    data?: T\n    error?: string\n    expiresAt?: string\n  }\n\n  /**\n   * Parameters for LLMs.txt generation operations.\n   */\n  export interface GenerateLLMsTextParams {\n    /**\n     * Maximum number of URLs to process (1-100)\n     * @default 10\n     */\n    maxUrls?: number\n    /**\n     * Whether to show the full LLMs-full.txt in the response\n     * @default false\n     */\n    showFullText?: boolean\n  }\n\n  /**\n   * Response interface for LLMs.txt generation operations.\n   */\n  export interface GenerateLLMsTextResponse {\n    success: boolean\n    id: string\n  }\n\n  /**\n   * Status response interface for LLMs.txt generation operations.\n   */\n  export interface GenerateLLMsTextStatusResponse {\n    success: boolean\n    data: {\n      llmstxt: string\n      llmsfulltxt?: string\n    }\n    status: 'processing' | 'completed' | 'failed'\n    error?: string\n    expiresAt: string\n  }\n}\n\n/**\n * Turn websites into LLM-ready data. Crawl and convert any website into clean\n * markdown or structured data.\n *\n * @see https://www.firecrawl.dev\n * @see https://github.com/mendableai/firecrawl\n */\nexport class FirecrawlClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('FIRECRAWL_API_KEY'),\n    apiBaseUrl = getEnv('FIRECRAWL_API_BASE_URL') ?? firecrawl.BASE_URL,\n    throttle = true,\n    timeoutMs = 60_000,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    throttle?: boolean\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'FirecrawlClient missing required \"apiKey\" (defaults to \"FIRECRAWL_API_KEY\")'\n    )\n    assert(\n      apiBaseUrl,\n      'FirecrawlClient missing required \"apiBaseUrl\" (defaults to \"FIRECRAWL_API_BASE_URL\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, firecrawl.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`,\n        'X-Origin': 'agentic',\n        'X-Origin-Type': 'integration'\n      }\n    })\n  }\n\n  /**\n   * Scrape the contents of a URL.\n   */\n  @aiFunction({\n    name: 'firecrawl_scrape_url',\n    description: 'Scrape the contents of a URL.',\n    inputSchema: z.object({\n      url: z.string().url().describe('The URL to scrape.')\n    })\n  })\n  async scrapeUrl<\n    T extends z.ZodSchema,\n    ActionsSchema extends firecrawl.Action[] | undefined = undefined\n  >(\n    orlOrOpts:\n      | string\n      | ({ url: string } & firecrawl.ScrapeParams<T, ActionsSchema>)\n  ): Promise<\n    | firecrawl.ScrapeResponse<\n        z.infer<T>,\n        ActionsSchema extends firecrawl.Action[]\n          ? firecrawl.ActionsResult\n          : never\n      >\n    | firecrawl.ErrorResponse\n  > {\n    const { url, ...params } =\n      typeof orlOrOpts === 'string' ? { url: orlOrOpts } : orlOrOpts\n    let jsonData: any = { url, ...params }\n\n    if (jsonData?.extract?.schema) {\n      let schema = jsonData.extract.schema\n      try {\n        schema = zodToJsonSchema(schema)\n      } catch {}\n      jsonData = {\n        ...jsonData,\n        extract: {\n          ...jsonData.extract,\n          schema\n        }\n      }\n    }\n\n    if (jsonData?.jsonOptions?.schema) {\n      let schema = jsonData.jsonOptions.schema\n      try {\n        schema = zodToJsonSchema(schema)\n      } catch {}\n      jsonData = {\n        ...jsonData,\n        jsonOptions: {\n          ...jsonData.jsonOptions,\n          schema\n        }\n      }\n    }\n\n    try {\n      const response = await this.postRequest('v1/scrape', jsonData)\n      return response\n    } catch (err) {\n      if (err instanceof firecrawl.FirecrawlError) {\n        throw err\n      }\n      throw new firecrawl.FirecrawlError(\n        err instanceof Error ? err.message : 'Unknown error',\n        500\n      )\n    }\n  }\n\n  /**\n   * Searches using the Firecrawl API.\n   */\n  @aiFunction({\n    name: 'firecrawl_search',\n    description: 'Searches the internet for the given query.',\n    inputSchema: z.object({\n      query: z.string().describe('Search query.')\n    })\n  })\n  async search(\n    queryOrOpts: string | ({ query: string } & firecrawl.SearchParams)\n  ): Promise<firecrawl.SearchResponse> {\n    const { query, ...params } =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    const jsonData = {\n      query,\n      limit: params?.limit ?? 5,\n      tbs: params?.tbs,\n      filter: params?.filter,\n      lang: params?.lang ?? 'en',\n      country: params?.country ?? 'us',\n      location: params?.location,\n      origin: params?.origin ?? 'api',\n      timeout: params?.timeout ?? 60_000,\n      scrapeOptions: params?.scrapeOptions ?? { formats: [] }\n    }\n\n    try {\n      const response = await this.postRequest('v1/search', jsonData)\n      if (response.success) {\n        return {\n          success: true,\n          data: response.data as firecrawl.Document[],\n          warning: response.warning\n        }\n      } else {\n        throw new firecrawl.FirecrawlError(\n          `Failed to search. Error: ${response.error}`,\n          500\n        )\n      }\n    } catch (err: any) {\n      if (err.response?.data?.error) {\n        throw new firecrawl.FirecrawlError(\n          `Request failed with status code ${err.response.status}. Error: ${err.response.data.error} ${err.response.data.details ? ` - ${JSON.stringify(err.response.data.details)}` : ''}`,\n          err.response.status\n        )\n      } else {\n        throw new firecrawl.FirecrawlError(err.message, 500)\n      }\n    }\n  }\n\n  /**\n   * Initiates a crawl job for a URL.\n   */\n  @aiFunction({\n    name: 'firecrawl_crawl_url',\n    description: 'Initiates a crawl job for a URL.',\n    inputSchema: z.object({\n      url: z.string().url().describe('The URL to crawl.')\n    })\n  })\n  async crawlUrl(\n    urlOrOpts: string | ({ url: string } & firecrawl.CrawlParams)\n  ): Promise<firecrawl.CrawlResponse | firecrawl.ErrorResponse> {\n    const { url, ...params } =\n      typeof urlOrOpts === 'string' ? { url: urlOrOpts } : urlOrOpts\n    const jsonData = { url, ...params }\n\n    try {\n      const response = await this.postRequest('v1/crawl', jsonData)\n      if (response.success) {\n        return response\n      } else {\n        throw new firecrawl.FirecrawlError(\n          `Failed to start crawl job. Error: ${response.error}`,\n          500\n        )\n      }\n    } catch (err: any) {\n      if (err.response?.data?.error) {\n        throw new firecrawl.FirecrawlError(\n          `Request failed with status code ${err.response.status}. Error: ${err.response.data.error} ${err.response.data.details ? ` - ${JSON.stringify(err.response.data.details)}` : ''}`,\n          err.response.status\n        )\n      } else {\n        throw new firecrawl.FirecrawlError(err.message, 500)\n      }\n    }\n  }\n\n  /**\n   * Checks the status of a crawl job.\n   */\n  async checkCrawlStatus(\n    id: string\n  ): Promise<firecrawl.CrawlStatusResponse | firecrawl.ErrorResponse> {\n    if (!id) {\n      throw new firecrawl.FirecrawlError('No crawl ID provided', 400)\n    }\n\n    try {\n      const response = await this.getRequest(`v1/crawl/${id}`)\n      if (response.success) {\n        return response\n      } else {\n        throw new firecrawl.FirecrawlError(\n          `Failed to check crawl status. Error: ${response.error}`,\n          500\n        )\n      }\n    } catch (err: any) {\n      throw new firecrawl.FirecrawlError(err.message, 500)\n    }\n  }\n\n  /**\n   * Returns information about crawl errors.\n   */\n  async checkCrawlErrors(\n    id: string\n  ): Promise<firecrawl.CrawlErrorsResponse | firecrawl.ErrorResponse> {\n    try {\n      const response = await this.getRequest(`v1/crawl/${id}/errors`)\n      if (response.errors) {\n        return response\n      } else {\n        throw new firecrawl.FirecrawlError(\n          `Failed to check crawl errors. Error: ${response.error}`,\n          500\n        )\n      }\n    } catch (err: any) {\n      throw new firecrawl.FirecrawlError(err.message, 500)\n    }\n  }\n\n  /**\n   * Cancels a crawl job.\n   */\n  async cancelCrawl(id: string): Promise<firecrawl.ErrorResponse> {\n    try {\n      const response = await this.deleteRequest(`v1/crawl/${id}`)\n      if (response.status) {\n        return response\n      } else {\n        throw new firecrawl.FirecrawlError(\n          `Failed to cancel crawl job. Error: ${response.error}`,\n          500\n        )\n      }\n    } catch (err: any) {\n      throw new firecrawl.FirecrawlError(err.message, 500)\n    }\n  }\n\n  /**\n   * Extracts structured data from URLs using LLMs.\n   *\n   * @param urls - Array of URLs to extract data from\n   * @param params - Additional parameters for the extract request\n   * @returns The response from the extract operation\n   */\n  async extract<T extends z.ZodSchema>(\n    urls: string[],\n    params: firecrawl.ExtractParams<T>\n  ): Promise<firecrawl.ExtractResponse<z.infer<T>>> {\n    const jsonData = {\n      urls,\n      ...params,\n      schema: params.schema ? zodToJsonSchema(params.schema) : undefined\n    }\n\n    try {\n      const response = await this.postRequest('v1/extract', jsonData)\n      if (!response.success) {\n        throw new firecrawl.FirecrawlError(\n          response.error || 'Extract operation failed',\n          500\n        )\n      }\n      return response\n    } catch (err) {\n      if (err instanceof firecrawl.FirecrawlError) {\n        throw err\n      }\n      throw new firecrawl.FirecrawlError(\n        err instanceof Error ? err.message : 'Unknown error',\n        500\n      )\n    }\n  }\n\n  /**\n   * Checks the status of an extract operation.\n   */\n  async checkExtractStatus<T = any>(\n    id: string\n  ): Promise<firecrawl.ExtractStatusResponse<T>> {\n    if (!id) {\n      throw new firecrawl.FirecrawlError('No extract ID provided', 400)\n    }\n\n    try {\n      const response = await this.getRequest(`v1/extract/${id}`)\n      return response\n    } catch (err) {\n      if (err instanceof firecrawl.FirecrawlError) {\n        throw err\n      }\n      throw new firecrawl.FirecrawlError(\n        err instanceof Error ? err.message : 'Unknown error',\n        500\n      )\n    }\n  }\n\n  /**\n   * Generates LLMs.txt for a given URL.\n   */\n  async generateLLMsText(\n    url: string,\n    params?: firecrawl.GenerateLLMsTextParams\n  ): Promise<\n    firecrawl.GenerateLLMsTextStatusResponse | firecrawl.ErrorResponse\n  > {\n    const jsonData = {\n      url,\n      ...params\n    }\n\n    try {\n      const response = await this.postRequest('v1/llmstxt', jsonData)\n      return response\n    } catch (err) {\n      if (err instanceof firecrawl.FirecrawlError) {\n        throw err\n      }\n      throw new firecrawl.FirecrawlError(\n        err instanceof Error ? err.message : 'Unknown error',\n        500\n      )\n    }\n  }\n\n  /**\n   * Sends a POST request.\n   */\n  protected async postRequest(path: string, data: any): Promise<any> {\n    try {\n      const response = await this.ky.post(path, { json: data })\n      return await response.json()\n    } catch (err) {\n      if (err instanceof Error) {\n        const response = await (err as any).response?.json()\n        if (response?.error) {\n          throw new firecrawl.FirecrawlError(\n            `Request failed. Error: ${response.error}`,\n            (err as any).response?.status ?? 500,\n            response?.details\n          )\n        }\n      }\n      throw err\n    }\n  }\n\n  /**\n   * Sends a GET request.\n   */\n  protected async getRequest(path: string): Promise<any> {\n    try {\n      const response = await this.ky.get(path)\n      return await response.json()\n    } catch (err) {\n      if (err instanceof Error) {\n        const response = await (err as any).response?.json()\n        if (response?.error) {\n          throw new firecrawl.FirecrawlError(\n            `Request failed. Error: ${response.error}`,\n            (err as any).response?.status ?? 500,\n            response?.details\n          )\n        }\n      }\n      throw err\n    }\n  }\n\n  /**\n   * Sends a DELETE request.\n   */\n  protected async deleteRequest(path: string): Promise<any> {\n    try {\n      const response = await this.ky.delete(path)\n      return await response.json()\n    } catch (err) {\n      if (err instanceof Error) {\n        const response = await (err as any).response?.json()\n        if (response?.error) {\n          throw new firecrawl.FirecrawlError(\n            `Request failed. Error: ${response.error}`,\n            (err as any).response?.status ?? 500,\n            response?.details\n          )\n        }\n      }\n      throw err\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/firecrawl/src/index.ts",
    "content": "export * from './firecrawl-client'\n"
  },
  {
    "path": "legacy/packages/firecrawl/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/github/package.json",
    "content": "{\n  \"name\": \"@agentic/github\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for GitHub.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/github\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"octokit\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/github/src/github-client.ts",
    "content": "import { aiFunction, AIFunctionsProvider, assert, getEnv } from '@agentic/core'\nimport { Octokit } from 'octokit'\nimport { z } from 'zod'\n\nexport namespace github {\n  export interface User {\n    id: number\n    login: string\n    name: string\n    bio: string\n    node_id: string\n    gravatar_id: string\n    type: string\n    site_admin: boolean\n    company: string\n    blog?: string\n    location?: string\n    hireable?: boolean\n    twitter_username?: string\n    email?: string\n    public_repos: number\n    public_gists: number\n    followers: number\n    following: number\n    avatar_url: string\n    url: string\n    html_url: string\n    followers_url: string\n    following_url: string\n    gists_url: string\n    starred_url: string\n    subscriptions_url: string\n    organizations_url: string\n    repos_url: string\n    events_url: string\n    received_events_url: string\n    created_at: string\n    updated_at: string\n  }\n}\n\n/**\n * Agentic GitHub client.\n */\nexport class GitHubClient extends AIFunctionsProvider {\n  protected readonly apiKey: string\n  protected readonly octokit: Octokit\n\n  constructor({\n    apiKey = getEnv('GITHUB_API_KEY')\n  }: {\n    apiKey?: string\n  } = {}) {\n    assert(\n      apiKey,\n      'GitHubClient missing required \"apiKey\" (defaults to \"GITHUB_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.octokit = new Octokit({ auth: apiKey })\n  }\n\n  /**\n   * Get a user by username.\n   */\n  @aiFunction({\n    name: 'github_get_user_by_username',\n    description: 'Get a user by username.',\n    inputSchema: z.object({\n      username: z.string().describe('The username of the user to get.')\n    })\n  })\n  async getUserByUsername(\n    usernameOrOpts: string | { username: string }\n  ): Promise<github.User> {\n    const { username } =\n      typeof usernameOrOpts === 'string'\n        ? { username: usernameOrOpts }\n        : usernameOrOpts\n\n    const res = await this.octokit.request(`GET /users/${username}`, {\n      headers: {\n        'X-GitHub-Api-Version': '2022-11-28'\n      }\n    })\n\n    return res.data\n  }\n}\n"
  },
  {
    "path": "legacy/packages/github/src/index.ts",
    "content": "export * from './github-client'\n"
  },
  {
    "path": "legacy/packages/github/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/google-custom-search/package.json",
    "content": "{\n  \"name\": \"@agentic/google-custom-search\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic client for the Google Custom Search API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/google-custom-search\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@googleapis/customsearch\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/google-custom-search/src/google-custom-search-client.ts",
    "content": "import { aiFunction, AIFunctionsProvider, assert, getEnv } from '@agentic/core'\nimport { customsearch_v1 as GoogleSearchAPI } from '@googleapis/customsearch'\nimport { z } from 'zod'\n\nimport { paginate } from './paginate'\n\nexport namespace googleCustomSearch {\n  export const SearchParamsSchema = z.object({\n    query: z.string().min(1).max(2048).describe('Search query'),\n    maxResults: z.number().optional(),\n    safeSearch: z\n      .union([z.literal('active'), z.literal('off')])\n      .optional()\n      .describe('Search safety level. Defaults to \"active\".')\n  })\n  export type SearchParams = z.infer<typeof SearchParamsSchema>\n}\n\n/**\n * Agentic client for the official Google Custom Search API.\n *\n * @see https://developers.google.com/custom-search/v1/overview\n */\nexport class GoogleCustomSearchClient extends AIFunctionsProvider {\n  protected readonly apiKey: string\n\n  readonly cseId: string\n  readonly client: GoogleSearchAPI.Customsearch\n\n  constructor({\n    apiKey = getEnv('GOOGLE_API_KEY'),\n    cseId = getEnv('GOOGLE_CSE_ID')\n  }: {\n    /** Google API key */\n    apiKey?: string\n\n    /** Google Custom Search Engine ID */\n    cseId?: string\n  } = {}) {\n    assert(\n      apiKey,\n      'GoogleCustomSearchClient missing required \"apiKey\" (defaults to \"GOOGLE_API_KEY\")'\n    )\n    assert(\n      cseId,\n      'GoogleCustomSearchClient missing required \"cseId\" (defaults to \"GOOGLE_CSE_ID\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.cseId = cseId\n\n    this.client = new GoogleSearchAPI.Customsearch({\n      auth: this.apiKey\n    })\n  }\n\n  /**\n   * Google Custom Search for online trends, news, current events, real-time information, or research topics.\n   */\n  @aiFunction({\n    name: 'google_custom_search',\n    description: `Google Custom Search for online trends, news, current events, real-time information, or research topics.`,\n    inputSchema: googleCustomSearch.SearchParamsSchema\n  })\n  async search(\n    queryOrParams: string | googleCustomSearch.SearchParams\n  ): Promise<any> {\n    const params =\n      typeof queryOrParams === 'string'\n        ? { query: queryOrParams }\n        : queryOrParams\n\n    const results = await paginate({\n      size: params.maxResults ?? 10,\n      handler: async ({ cursor = 0, limit }) => {\n        const maxChunkSize = 10\n\n        const {\n          data: { items = [] }\n        } = await this.client.cse.list({\n          cx: this.cseId,\n          q: params.query,\n          start: cursor,\n          num: Math.min(limit, maxChunkSize),\n          safe: params.safeSearch ?? 'active'\n        })\n\n        return {\n          data: items,\n          nextCursor:\n            items.length < maxChunkSize ? undefined : cursor + items.length\n        }\n      }\n    })\n\n    return results\n  }\n}\n"
  },
  {
    "path": "legacy/packages/google-custom-search/src/index.ts",
    "content": "export * from './google-custom-search-client'\n"
  },
  {
    "path": "legacy/packages/google-custom-search/src/paginate.ts",
    "content": "export interface PaginateInput<T, C> {\n  size: number\n  handler: (data: {\n    cursor?: C\n    limit: number\n  }) => Promise<{ data: T[]; nextCursor?: C }>\n}\n\nexport async function paginate<T, C = number>(\n  input: PaginateInput<T, C>\n): Promise<T[]> {\n  const acc: T[] = []\n  let cursor: C | undefined\n\n  while (acc.length < input.size) {\n    const { data, nextCursor } = await input.handler({\n      cursor,\n      limit: input.size - acc.length\n    })\n    acc.push(...data)\n\n    if (nextCursor === undefined || data.length === 0) {\n      break\n    }\n\n    cursor = nextCursor\n  }\n\n  if (acc.length > input.size) {\n    acc.length = input.size\n  }\n\n  return acc\n}\n"
  },
  {
    "path": "legacy/packages/google-custom-search/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/google-docs/package.json",
    "content": "{\n  \"name\": \"@agentic/google-docs\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Google Docs.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/google-docs\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"googleapis\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"googleapis\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/google-docs/src/google-docs-client.ts",
    "content": "import type * as google from 'googleapis'\nimport type { SetNonNullable, Simplify } from 'type-fest'\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  pruneNullOrUndefinedDeep,\n  type SetRequired\n} from '@agentic/core'\nimport { z } from 'zod'\n\nexport namespace googleDocs {\n  export type Document = Simplify<\n    SetNonNullable<google.docs_v1.Schema$Document>\n  >\n}\n\n/**\n * Simplified Google Docs API client.\n *\n * @see https://developers.google.com/workspace/drive/api\n *\n * @example\n * ```ts\n * import { GoogleDocsClient } from '@agentic/google-docs'\n * import { authenticate } from '@google-cloud/local-auth'\n * import { google } from 'googleapis'\n *\n * // (in a real app, store these auth credentials and reuse them)\n * const auth = await authenticate({\n *   scopes: ['https://www.googleapis.com/auth/documents.readonly'],\n *   keyfilePath: process.env.GOOGLE_CREDENTIALS_PATH\n * })\n * const docs = google.docs({ version: 'v1', auth })\n * const client = new GoogleDocsClient({ docs })\n * ```\n */\nexport class GoogleDocsClient extends AIFunctionsProvider {\n  protected readonly docs: google.docs_v1.Docs\n\n  constructor({ docs }: { docs: google.docs_v1.Docs }) {\n    super()\n\n    this.docs = docs\n  }\n\n  /**\n   * Gets a Google Docs document by ID.\n   */\n  @aiFunction({\n    name: 'google_docs_get_document',\n    description: 'Gets a Google Docs document by ID.',\n    inputSchema: z.object({\n      documentId: z.string()\n    })\n  })\n  async getDocument(\n    args: Simplify<\n      SetRequired<google.docs_v1.Params$Resource$Documents$Get, 'documentId'>\n    >\n  ): Promise<googleDocs.Document> {\n    const { documentId, ...opts } = args\n\n    const { data } = await this.docs.documents.get({\n      ...opts,\n      documentId\n    })\n\n    return convertDocument(data)\n  }\n}\n\nfunction convertDocument(\n  data: google.docs_v1.Schema$Document\n): googleDocs.Document {\n  return pruneNullOrUndefinedDeep(data)\n}\n"
  },
  {
    "path": "legacy/packages/google-docs/src/index.ts",
    "content": "export * from './google-docs-client'\n"
  },
  {
    "path": "legacy/packages/google-docs/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/google-drive/package.json",
    "content": "{\n  \"name\": \"@agentic/google-drive\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Google Drive.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/google-drive\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"googleapis\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"googleapis\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/google-drive/src/google-drive-client.ts",
    "content": "import type * as google from 'googleapis'\nimport type { SetNonNullable, Simplify } from 'type-fest'\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  pick,\n  pruneNullOrUndefined,\n  pruneNullOrUndefinedDeep\n} from '@agentic/core'\nimport { z } from 'zod'\n\nexport namespace googleDrive {\n  export type File = Simplify<\n    SetNonNullable<\n      Pick<\n        google.drive_v3.Schema$File,\n        | 'id'\n        | 'name'\n        | 'mimeType'\n        | 'webViewLink'\n        | 'webContentLink'\n        | 'size'\n        | 'createdTime'\n        | 'modifiedTime'\n        | 'parents'\n      >\n    >\n  >\n\n  export const fileFields: readonly (keyof File)[] = [\n    'id',\n    'name',\n    'mimeType',\n    'webViewLink',\n    'webContentLink',\n    'size',\n    'createdTime',\n    'modifiedTime',\n    'parents'\n  ]\n  export const requestFileFields = `files(${fileFields.join(',')}),nextPageToken`\n\n  export interface ListFilesResponse {\n    files: File[]\n    nextPageToken?: string\n  }\n\n  export interface DownloadResponse {\n    content: string\n    metadata: File\n  }\n\n  export const ListFilesParamsSchema = z.object({\n    folderId: z.string().optional(),\n    query: z.string().optional(),\n    pageSize: z.number().optional(),\n    pageToken: z.string().optional()\n  })\n}\n\n/**\n * Simplified Google Drive API client.\n *\n * @see https://developers.google.com/workspace/drive/api\n *\n * @example\n * ```ts\n * import { GoogleDriveClient } from '@agentic/google-drive'\n * import { GoogleAuth } from 'google-auth-library'\n * import { google } from 'googleapis'\n *\n * const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive' })\n * const drive = google.drive({ version: 'v3', auth })\n * const client = new GoogleDriveClient({ drive })\n * ```\n */\nexport class GoogleDriveClient extends AIFunctionsProvider {\n  protected readonly drive: google.drive_v3.Drive\n\n  constructor({ drive }: { drive: google.drive_v3.Drive }) {\n    super()\n\n    this.drive = drive\n  }\n\n  /**\n   * Lists files and folders in a Google Drive folder.\n   */\n  @aiFunction({\n    name: 'google_drive_list_files',\n    description: 'Lists files and folders in a Google Drive folder.',\n    inputSchema: googleDrive.ListFilesParamsSchema\n  })\n  async listFiles(\n    args: {\n      folderId?: string\n      query?: string\n    } & google.drive_v3.Params$Resource$Files$Get\n  ): Promise<googleDrive.ListFilesResponse> {\n    const { folderId, query, ...opts } = args\n    // Build the query conditions\n    const conditions = ['trashed = false'] // Always exclude trashed files\n\n    if (folderId) {\n      conditions.push(`'${folderId}' in parents`)\n    }\n\n    if (query) {\n      conditions.push(`name contains '${query}'`)\n    }\n\n    // Combine all conditions with AND\n    const q = conditions.join(' and ')\n\n    const { data } = await this.drive.files.list({\n      fields: googleDrive.requestFileFields,\n      ...opts,\n      q\n    })\n    const files = (data.files ?? []).map(convertFile)\n\n    return pruneNullOrUndefined({\n      files,\n      nextPageToken: data.nextPageToken\n    })\n  }\n\n  /**\n   * Gets a file's metadata from Google Drive.\n   */\n  @aiFunction({\n    name: 'google_drive_get_file',\n    description: \"Gets a file's metadata from Google Drive.\",\n    inputSchema: z.object({ fileId: z.string() })\n  })\n  async getFile(\n    opts: google.drive_v3.Params$Resource$Files$Get\n  ): Promise<googleDrive.File> {\n    const { data } = await this.drive.files.get({\n      fields: googleDrive.requestFileFields,\n      ...opts\n    })\n\n    return convertFile(data)\n  }\n\n  /**\n   * Exports a file from Google Drive.\n   */\n  @aiFunction({\n    name: 'google_drive_export_file',\n    description: 'Exports a file from Google Drive to a given mime-type.',\n    inputSchema: z.object({\n      fileId: z.string().describe('The ID of the file to export.'),\n      mimeType: z\n        .string()\n        .describe('The MIME type of the format requested for this export.')\n    })\n  })\n  async exportFile(\n    opts: google.drive_v3.Params$Resource$Files$Export\n  ): Promise<unknown> {\n    return this.drive.files.export(opts)\n  }\n\n  @aiFunction({\n    name: 'google_drive_create_folder',\n    description: 'Creates a new folder in Google Drive.',\n    inputSchema: z.object({\n      name: z.string().describe('The name of the folder to create.'),\n      parentId: z.string().describe('The ID of the parent folder.').optional()\n    })\n  })\n  async createFolder(\n    opts: Omit<\n      google.drive_v3.Params$Resource$Files$Create,\n      'media' | 'requestBody'\n    > & {\n      name: string\n      parentId?: string\n    }\n  ): Promise<googleDrive.File> {\n    const { data } = await this.drive.files.create({\n      requestBody: {\n        mimeType: 'application/vnd.google-apps.folder',\n        name: opts.name,\n        parents: opts.parentId ? [opts.parentId] : undefined\n      },\n      fields: googleDrive.requestFileFields,\n      ...opts\n    })\n\n    return convertFile(data)\n  }\n}\n\nfunction convertFile(data: google.drive_v3.Schema$File): googleDrive.File {\n  return pruneNullOrUndefinedDeep(\n    pick(data, ...googleDrive.fileFields)\n  ) as googleDrive.File\n}\n"
  },
  {
    "path": "legacy/packages/google-drive/src/index.ts",
    "content": "export * from './google-drive-client'\n"
  },
  {
    "path": "legacy/packages/google-drive/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/gravatar/package.json",
    "content": "{\n  \"name\": \"@agentic/gravatar\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Gravatar.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/gravatar\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/gravatar/src/gravatar-client.ts",
    "content": "import crypto from 'node:crypto'\n\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  getEnv,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace gravatar {\n  export const API_BASE_URL = 'https://api.gravatar.com'\n\n  // Allow up to 100 unauthenticated requests per hour by default.\n  export const unauthenticatedThrottle = pThrottle({\n    limit: 100,\n    interval: 60 * 60 * 1000\n  })\n\n  // Allow up to 1000 authenticated requests per hour by default.\n  export const authenticatedThrottle = pThrottle({\n    limit: 1000,\n    interval: 60 * 60 * 1000\n  })\n\n  export type GetProfileByIdentifierOptions = {\n    email: string\n  }\n\n  export interface Profile {\n    /** The SHA256 hash of the user’s primary email address. */\n    hash: string\n    /** The user’s display name that appears on their profile. */\n    display_name: string\n    first_name?: string\n    last_name?: string\n    /** The full URL to the user’s Gravatar profile. */\n    profile_url: string\n    /** The URL to the user’s avatar image, if set. */\n    avatar_url: string\n    /** Alternative text describing the user’s avatar. */\n    avatar_alt_text: string\n    /** The user’s geographical location. */\n    location: string\n    /** A short biography or description about the user found on their profile. */\n    description: string\n    /** The user’s current job title. */\n    job_title: string\n    /** The name of the company where the user is employed. */\n    company: string\n    /** An array of verified accounts the user has added to their profile. The number of verified accounts displayed is limited to a maximum of 4 in unauthenticated requests. */\n    verified_accounts: VerifiedAccount[]\n    /** A phonetic guide to pronouncing the user’s name. */\n    pronunciation: string\n    /** The pronouns the user prefers to use. */\n    pronouns: string\n\n    is_organization?: boolean\n    links?: Link[]\n    interests?: any[]\n    gallery?: GalleryImage[]\n    payments?: {\n      links?: Link[]\n      crypto_wallets?: CryptoWallet[]\n    }\n\n    /** The total number of verified accounts the user has added to their profile, including those not displayed on their profile. This property is only provided in authenticated API requests. */\n    number_verified_accounts?: number\n\n    /** The date and time (UTC) when the user last edited their profile. This property is only provided in authenticated API requests. Example: \"2021-10-01T12:00:00Z\" */\n    last_profile_edit?: string\n\n    /** The date the user registered their account. This property is only provided in authenticated API requests. Example: \"2021-10-01\" */\n    registration_date?: string\n\n    contact_info?: ContactInfo\n  }\n\n  export interface VerifiedAccount {\n    service_type: string\n    service_label: string\n    service_icon: string\n    url: string\n    is_hidden: boolean\n  }\n\n  export interface Link {\n    label: string\n    url: string\n  }\n\n  export interface GalleryImage {\n    url: string\n    alt_text: string\n  }\n\n  export interface CryptoWallet {\n    label: string\n    address: string\n  }\n\n  export interface ContactInfo {\n    home_phone: string\n    work_phone: string\n    cell_phone: string\n    email: string\n    contact_form: string\n    calendar: string\n  }\n}\n\n/**\n * A client for the Gravatar API.\n *\n * API key is optional.\n *\n * @see https://docs.gravatar.com/getting-started/\n */\nexport class GravatarClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey?: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('GRAVATAR_API_KEY'),\n    apiBaseUrl = gravatar.API_BASE_URL,\n    timeoutMs = 60_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    // API key is optional\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle\n      ? throttleKy(\n          ky,\n          apiKey\n            ? gravatar.authenticatedThrottle\n            : gravatar.unauthenticatedThrottle\n        )\n      : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: Object.fromEntries(\n        apiKey ? [['Authorization', `Bearer ${apiKey}`]] : []\n      )\n    })\n  }\n\n  /**\n   * Get Gravatar profile by email. Returns a profile object or `undefined` if not found.\n   */\n  @aiFunction({\n    name: 'gravatar_get_profile',\n    description:\n      'Get Gravatar profile by email. Returns a profile object or `undefined` if not found.',\n    inputSchema: z.object({\n      email: z.string()\n    })\n  })\n  async getProfileByIdentifier(\n    emailOrOpts: string | gravatar.GetProfileByIdentifierOptions\n  ): Promise<gravatar.Profile | undefined> {\n    const { email } =\n      typeof emailOrOpts === 'string' ? { email: emailOrOpts } : emailOrOpts\n    const hashedEmail = crypto\n      .createHash('SHA256')\n      .update(email.trim().toLowerCase(), 'utf8')\n      .digest('hex')\n\n    try {\n      return await this.ky\n        .get(`v3/profiles/${hashedEmail}`)\n        .json<gravatar.Profile>()\n    } catch (err: any) {\n      if (err.response?.status === 404) {\n        return\n      }\n\n      throw err\n    }\n  }\n\n  async getAvatarForIdentifier(\n    emailOrOpts: string | gravatar.GetProfileByIdentifierOptions\n  ): Promise<string> {\n    const { email } =\n      typeof emailOrOpts === 'string' ? { email: emailOrOpts } : emailOrOpts\n    const hashedEmail = crypto\n      .createHash('SHA256')\n      .update(email.trim().toLowerCase(), 'utf8')\n      .digest('hex')\n\n    return `https://gravatar.com/avatar/${hashedEmail}`\n  }\n}\n"
  },
  {
    "path": "legacy/packages/gravatar/src/index.ts",
    "content": "export * from './gravatar-client'\n"
  },
  {
    "path": "legacy/packages/gravatar/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/hacker-news/package.json",
    "content": "{\n  \"name\": \"@agentic/hacker-news\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Hacker News.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/hacker-news\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/hacker-news/src/hacker-news-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace hackernews {\n  export const HACKER_NEWS_API_BASE_URL = 'https://hacker-news.firebaseio.com'\n  export const HACKER_NEWS_API_SEARCH_BASE_URL = 'https://hn.algolia.com'\n  export const HACKER_NEWS_API_USER_AGENT =\n    'Agentic (https://github.com/transitive-bullshit/agentic)'\n\n  export type ItemType =\n    | 'story'\n    | 'comment'\n    | 'ask'\n    | 'job'\n    | 'poll'\n    | 'pollopt'\n\n  export interface Item {\n    id: number\n    type: ItemType\n    by: string\n    time: number\n    score: number\n    title?: string\n    url?: string\n    text?: string\n    descendants?: number\n    parent?: number\n    kids?: number[]\n    parts?: number[]\n  }\n\n  export interface User {\n    id: string\n    created: number\n    about: string\n    karma: number\n    submitted: number[]\n  }\n\n  export type SearchTag =\n    | 'story'\n    | 'comment'\n    | 'poll'\n    | 'pollopt'\n    | 'show_hn'\n    | 'ask_hn'\n    | 'front_page'\n\n  export type SearchNumericFilterField =\n    | 'created_at_i'\n    | 'points'\n    | 'num_comments'\n  export type SearchNumericFilterCondition = '<' | '<=' | '=' | '>=' | '>'\n\n  export type SearchSortBy = 'relevance' | 'recency'\n\n  export interface SearchOptions {\n    /** Full-text search query */\n    query?: string\n\n    /** Filter by author's HN username */\n    author?: string\n\n    /** Filter by story id */\n    story?: string\n\n    /** Filter by type of item (story, comment, etc.) */\n    tags?: Array<SearchTag>\n\n    /** Filter by numeric range (created_at_i, points, or num_comments); (created_at_i is a timestamp in seconds) */\n    numericFilters?: Array<`${SearchNumericFilterField}${SearchNumericFilterCondition}${number}`>\n\n    /** Page number to return */\n    page?: number\n\n    /** Number of results to return per page */\n    hitsPerPage?: number\n\n    /** How to sort the results */\n    sortBy?: SearchSortBy\n  }\n\n  export interface SearchItem {\n    id: number\n    created_at: string\n    created_at_i: number\n    title?: string\n    url?: string\n    author: string\n    text: string | null\n    points: number | null\n    parent_id: number | null\n    story_id: number | null\n    type: ItemType\n    children: SearchItem[]\n    options?: any[]\n  }\n\n  export interface SearchUser {\n    username: string\n    about: string\n    karma: number\n  }\n\n  export interface SearchResponse {\n    hits: SearchHit[]\n    page: number\n    nbHits: number\n    nbPages: number\n    hitsPerPage: number\n    query: string\n    params: string\n    processingTimeMS: number\n    serverTimeMS: number\n    processingTimingsMS?: any\n  }\n\n  export interface SearchHit {\n    objectID: string\n    url: string\n    title: string\n    author: string\n    story_text?: string\n    story_id?: number\n    story_url?: string\n    comment_text?: string\n    points?: number\n    num_comments?: number\n    created_at: string\n    created_at_i: number\n    updated_at: string\n    parts?: number[]\n    children: number[]\n    _tags: string[]\n    _highlightResult: SearchHighlightResult\n  }\n\n  export interface SearchHighlightResult {\n    author: Highlight\n    title?: Highlight\n    url?: Highlight\n    comment_text?: Highlight\n    story_title?: Highlight\n    story_url?: Highlight\n  }\n\n  export interface Highlight {\n    value: string\n    matchLevel: string\n    matchedWords: string[]\n    fullyHighlighted?: boolean\n  }\n\n  export const searchTagSchema = z.union([\n    z.literal('story'),\n    z.literal('comment'),\n    z.literal('poll'),\n    z.literal('pollopt'),\n    z.literal('show_hn'),\n    z.literal('ask_hn'),\n    z.literal('front_page')\n  ])\n\n  export const searchSortBySchema = z.union([\n    z.literal('relevance'),\n    z.literal('recency')\n  ])\n\n  export const searchOptionsSchema = z.object({\n    query: z.string().optional().describe('Full-text search query'),\n    author: z.string().optional().describe(\"Filter by author's HN username\"),\n    story: z.string().optional().describe('Filter by story id'),\n    tags: z\n      .array(hackernews.searchTagSchema)\n      .optional()\n      .describe(\n        \"Filter by type of item (story, comment, etc.). Multiple tags are AND'ed together.\"\n      ),\n    numericFilters: z\n      .array(z.any())\n      .optional()\n      .describe(\n        'Filter by numeric range (created_at_i, points, or num_comments); (created_at_i is a timestamp in seconds). Ex: numericFilters=points>100,num_comments>=1000'\n      ),\n    page: z.number().int().optional().describe('Page number to return'),\n    hitsPerPage: z\n      .number()\n      .int()\n      .optional()\n      .describe('Number of results to return per page (defaults to 50)'),\n    sortBy: hackernews.searchSortBySchema\n      .optional()\n      .describe('How to sort the results (defaults to relevancy)')\n  })\n}\n\n/**\n * Basic client for the official Hacker News API.\n *\n * The normal API methods (`getItem`) use the official Firebase API, while the\n * search-prefixed methods use the more powerful Algolia API. The tradeoff is\n * that the official Firebase API is generally more reliable in my experience,\n * which is why we opted to support both.\n *\n * @see https://github.com/HackerNews/API\n * @see https://hn.algolia.com/api\n */\nexport class HackerNewsClient extends AIFunctionsProvider {\n  protected readonly apiKy: KyInstance\n  protected readonly apiSearchKy: KyInstance\n\n  protected readonly apiBaseUrl: string\n  protected readonly apiSearchBaseUrl: string\n  protected readonly apiUserAgent: string\n\n  constructor({\n    apiBaseUrl = getEnv('HACKER_NEWS_API_BASE_URL') ??\n      hackernews.HACKER_NEWS_API_BASE_URL,\n    apiSearchBaseUrl = getEnv('HACKER_NEWS_API_SEARCH_BASE_URL') ??\n      hackernews.HACKER_NEWS_API_SEARCH_BASE_URL,\n    apiUserAgent = getEnv('HACKER_NEWS_API_USER_AGENT') ??\n      hackernews.HACKER_NEWS_API_USER_AGENT,\n    ky = defaultKy,\n    timeoutMs = 60_000\n  }: {\n    apiBaseUrl?: string\n    apiSearchBaseUrl?: string\n    apiUserAgent?: string\n    ky?: KyInstance\n    timeoutMs?: number\n  } = {}) {\n    assert(apiBaseUrl, 'HackerNewsClient missing required \"apiBaseUrl\"')\n    assert(\n      apiSearchBaseUrl,\n      'HackerNewsClient missing required \"apiSearchBaseUrl\"'\n    )\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n    this.apiSearchBaseUrl = apiSearchBaseUrl\n    this.apiUserAgent = apiUserAgent\n\n    this.apiKy = ky.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        'user-agent': apiUserAgent\n      }\n    })\n\n    this.apiSearchKy = ky.extend({\n      prefixUrl: apiSearchBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        'user-agent': apiUserAgent\n      }\n    })\n  }\n\n  /** Fetches a HN story or comment by its ID. */\n  @aiFunction({\n    name: 'hacker_news_get_item',\n    description: 'Fetches a HN story or comment by its ID.',\n    inputSchema: z.object({ itemId: z.string() })\n  })\n  async getSearchItem(itemIdOrOpts: string | number | { itemId: string }) {\n    const { itemId } =\n      typeof itemIdOrOpts === 'string' || typeof itemIdOrOpts === 'number'\n        ? { itemId: itemIdOrOpts }\n        : itemIdOrOpts\n\n    return this.apiSearchKy\n      .get(`api/v1/items/${itemId}`)\n      .json<hackernews.SearchItem>()\n  }\n\n  /**\n   * Fetches a HN user by username.\n   */\n  @aiFunction({\n    name: 'hacker_news_get_user',\n    description: 'Fetches a HN user by username.',\n    inputSchema: z.object({ username: z.string() })\n  })\n  async getSearchUser(usernameOrOpts: string | number | { username: string }) {\n    const { username } =\n      typeof usernameOrOpts === 'string' || typeof usernameOrOpts === 'number'\n        ? { username: usernameOrOpts }\n        : usernameOrOpts\n\n    return this.apiSearchKy\n      .get(`api/v1/users/${username}`)\n      .json<hackernews.SearchUser>()\n  }\n\n  /** Searches HN for stories and comments matching the given query. */\n  @aiFunction({\n    name: 'hacker_news_search',\n    description:\n      'Searches HN for stories and comments matching the given query.',\n    inputSchema: hackernews.searchOptionsSchema\n  })\n  async searchItems(queryOrOpts: string | hackernews.SearchOptions) {\n    const {\n      query,\n      numericFilters,\n      page,\n      hitsPerPage,\n      sortBy = 'relevance',\n      ...opts\n    } = typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    // Tags are AND'ed together; we do not support OR'ing tags via parentheses.\n    const tags = [\n      ...(opts.tags ?? []),\n      opts.story ? `story_${opts.story}` : undefined,\n      opts.author ? `author_${opts.author}` : undefined\n    ].filter(Boolean)\n\n    return this.apiSearchKy\n      .get(sortBy === 'relevance' ? 'api/v1/search' : 'api/v1/search_by_date', {\n        searchParams: sanitizeSearchParams(\n          {\n            query,\n            tags,\n            numericFilters,\n            page,\n            hitsPerPage\n          },\n          { csv: true }\n        )\n      })\n      .json<hackernews.SearchResponse>()\n  }\n\n  /**\n   * Fetches / searches the top stories currently on the front page of HN. This is the same as `hacker_news_search`, but with `tags: [\"front_page\"]` set to filter only by the current front page stories.\n   */\n  @aiFunction({\n    name: 'hacker_news_get_top_stories',\n    description:\n      'Fetches / searches the top stories currently on the front page of HN. This is the same as `hacker_news_search`, but with `tags: [\"front_page\"]` set to filter only by the current front page stories.',\n    inputSchema: hackernews.searchOptionsSchema\n  })\n  async getSearchTopStories(queryOrOpts: string | hackernews.SearchOptions) {\n    const opts =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    return this.searchItems({\n      ...opts,\n      tags: ['front_page', ...(opts.tags ?? [])]\n    })\n  }\n\n  async getItem(id: string | number) {\n    return this.apiKy.get(`v0/item/${id}.json`).json<hackernews.Item>()\n  }\n\n  async getTopStories() {\n    return this.apiKy.get('v0/topstories.json').json<number[]>()\n  }\n\n  async getNewStories() {\n    return this.apiKy.get('v0/newstories.json').json<number[]>()\n  }\n\n  async getBestStories() {\n    return this.apiKy.get('v0/beststories.json').json<number[]>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/hacker-news/src/index.ts",
    "content": "export * from './hacker-news-client'\n"
  },
  {
    "path": "legacy/packages/hacker-news/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/hunter/package.json",
    "content": "{\n  \"name\": \"@agentic/hunter\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for hunter.io email lookup.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/hunter\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/hunter/src/hunter-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  pruneNullOrUndefinedDeep,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace hunter {\n  export const API_BASE_URL = 'https://api.hunter.io'\n\n  export const DepartmentSchema = z.enum([\n    'executive',\n    'it',\n    'finance',\n    'management',\n    'sales',\n    'legal',\n    'support',\n    'hr',\n    'marketing',\n    'communication',\n    'education',\n    'design',\n    'health',\n    'operations'\n  ])\n  export type Department = z.infer<typeof DepartmentSchema>\n\n  export const SenioritySchema = z.enum(['junior', 'senior', 'executive'])\n  export type Seniority = z.infer<typeof SenioritySchema>\n\n  export const PersonFieldSchema = z.enum([\n    'full_name',\n    'position',\n    'phone_number'\n  ])\n  export type PersonField = z.infer<typeof PersonFieldSchema>\n\n  export const DomainSearchOptionsSchema = z.object({\n    domain: z.string().optional().describe('domain to search for'),\n    company: z.string().optional().describe('company name to search for'),\n    limit: z.number().int().optional(),\n    offset: z.number().int().optional(),\n    type: z.enum(['personal', 'generic']).optional(),\n    seniority: z.union([SenioritySchema, z.array(SenioritySchema)]).optional(),\n    department: z\n      .union([DepartmentSchema, z.array(DepartmentSchema)])\n      .optional(),\n    required_field: z\n      .union([PersonFieldSchema, z.array(PersonFieldSchema)])\n      .optional()\n  })\n  export type DomainSearchOptions = z.infer<typeof DomainSearchOptionsSchema>\n\n  export const EmailFinderOptionsSchema = z.object({\n    domain: z.string().optional().describe('domain to search for'),\n    company: z.string().optional().describe('company name to search for'),\n    first_name: z.string().describe(\"person's first name\"),\n    last_name: z.string().describe(\"person's last name\"),\n    max_duration: z.number().int().min(3).max(20).optional()\n  })\n  export type EmailFinderOptions = z.infer<typeof EmailFinderOptionsSchema>\n\n  export const EmailVerifierOptionsSchema = z.object({\n    email: z.string().describe('email address to verify')\n  })\n  export type EmailVerifierOptions = z.infer<typeof EmailVerifierOptionsSchema>\n\n  export interface DomainSearchResponse {\n    data: DomainSearchData\n    meta: {\n      results: number\n      limit: number\n      offset: number\n      params: {\n        domain?: string\n        company?: string\n        type?: string\n        seniority?: string\n        department?: string\n      }\n    }\n    errors?: Error[]\n  }\n\n  export interface DomainSearchData {\n    domain: string\n    disposable: boolean\n    webmail?: boolean\n    accept_all?: boolean\n    pattern?: string\n    organization?: string\n    description?: string\n    industry?: string\n    twitter?: string\n    facebook?: string\n    linkedin?: string\n    instagram?: string\n    youtube?: string\n    technologies?: string[]\n    country?: string\n    state?: string\n    city?: string\n    postal_code?: string\n    street?: string\n    headcount?: string\n    company_type?: string\n    emails?: Email[]\n    linked_domains?: string[]\n  }\n\n  export interface Email {\n    value: string\n    type: string\n    confidence: number\n    first_name?: string\n    last_name?: string\n    position?: string\n    seniority?: string\n    department?: string\n    linkedin?: string\n    twitter?: string\n    phone_number?: string\n    verification?: Verification\n    sources?: Source[]\n  }\n\n  export interface Source {\n    domain: string\n    uri: string\n    extracted_on: string\n    last_seen_on: string\n    still_on_page?: boolean\n  }\n\n  export interface Verification {\n    date: string\n    status: string\n  }\n\n  export interface EmailFinderResponse {\n    data: EmailFinderData\n    meta: {\n      params: {\n        first_name?: string\n        last_name?: string\n        full_name?: string\n        domain?: string\n        company?: string\n        max_duration?: string\n      }\n    }\n    errors?: Error[]\n  }\n\n  export interface EmailFinderData {\n    first_name: string\n    last_name: string\n    email: string\n    score: number\n    domain: string\n    accept_all: boolean\n    position?: string\n    twitter?: any\n    linkedin_url?: any\n    phone_number?: any\n    company?: string\n    sources?: Source[]\n    verification?: Verification\n  }\n\n  export interface EmailVerifierResponse {\n    data: EmailVerifierData\n    meta: {\n      params: {\n        email: string\n      }\n    }\n    errors?: Error[]\n  }\n\n  export interface EmailVerifierData {\n    status:\n      | 'valid'\n      | 'invalid'\n      | 'accept_all'\n      | 'webmail'\n      | 'disposable'\n      | 'unknown'\n    result: 'deliverable' | 'undeliverable' | 'risky'\n    score: number\n    email: string\n    regexp: boolean\n    gibberish: boolean\n    disposable: boolean\n    webmail: boolean\n    mx_records: boolean\n    smtp_server: boolean\n    smtp_check: boolean\n    accept_all: boolean\n    block: boolean\n    sources?: Source[]\n    _deprecation_notice?: string\n  }\n\n  export interface Error {\n    id: string\n    code: number\n    details: string\n  }\n}\n\n/**\n * Lightweight wrapper around Hunter.io email finder, verifier, and enrichment\n * APIs.\n *\n * @see https://hunter.io/api-documentation\n */\nexport class HunterClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('HUNTER_API_KEY'),\n    apiBaseUrl = hunter.API_BASE_URL,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'HunterClient missing required \"apiKey\" (defaults to \"HUNTER_API_KEY\")'\n    )\n\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl\n    })\n  }\n\n  /**\n   * Gets all the email addresses associated with a given company or domain.\n   */\n  @aiFunction({\n    name: 'hunter_domain_search',\n    description:\n      'Gets all the email addresses associated with a given company or domain.',\n    inputSchema: hunter.DomainSearchOptionsSchema.pick({\n      domain: true,\n      company: true\n    })\n  })\n  async domainSearch(domainOrOpts: string | hunter.DomainSearchOptions) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    if (!opts.domain && !opts.company) {\n      throw new Error('Either \"domain\" or \"company\" is required')\n    }\n\n    const res = await this.ky\n      .get('v2/domain-search', {\n        searchParams: sanitizeSearchParams(\n          {\n            ...opts,\n            api_key: this.apiKey\n          },\n          { csv: true }\n        )\n      })\n      .json<hunter.DomainSearchResponse>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n\n  /**\n   * Finds the most likely email address from a domain name, a first name and a last name.\n   */\n  @aiFunction({\n    name: 'hunter_email_finder',\n    description:\n      'Finds the most likely email address from a domain name, a first name and a last name.',\n    inputSchema: hunter.EmailFinderOptionsSchema.pick({\n      domain: true,\n      company: true,\n      first_name: true,\n      last_name: true\n    })\n  })\n  async emailFinder(opts: hunter.EmailFinderOptions) {\n    if (!opts.domain && !opts.company) {\n      throw new Error('Either \"domain\" or \"company\" is required')\n    }\n\n    const res = await this.ky\n      .get('v2/email-finder', {\n        searchParams: sanitizeSearchParams({\n          ...opts,\n          api_key: this.apiKey\n        })\n      })\n      .json<hunter.EmailFinderResponse>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n\n  /**\n   * Verifies the deliverability of an email address.\n   */\n  @aiFunction({\n    name: 'hunter_email_verifier',\n    description: 'Verifies the deliverability of an email address.',\n    inputSchema: hunter.EmailVerifierOptionsSchema\n  })\n  async emailVerifier(emailOrOpts: string | hunter.EmailVerifierOptions) {\n    const opts =\n      typeof emailOrOpts === 'string' ? { email: emailOrOpts } : emailOrOpts\n\n    const res = await this.ky\n      .get('v2/email-verifier', {\n        searchParams: sanitizeSearchParams({\n          ...opts,\n          api_key: this.apiKey\n        })\n      })\n      .json<hunter.EmailVerifierResponse>()\n\n    return pruneNullOrUndefinedDeep(res)\n  }\n}\n"
  },
  {
    "path": "legacy/packages/hunter/src/index.ts",
    "content": "export * from './hunter-client'\n"
  },
  {
    "path": "legacy/packages/hunter/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/jigsawstack/package.json",
    "content": "{\n  \"name\": \"@agentic/jigsawstack\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic adapter for the Jigsawstack AI SDK.\",\n  \"author\": \"Narcisse Egonu\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/jigsawstack\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test-unit\": \"vitest run\"\n  },\n  \"peerDependencies\": {\n    \"@agentic/core\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@ai-sdk/openai\": \"catalog:\",\n    \"ai\": \"catalog:\"\n  },\n  \"dependencies\": {\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/jigsawstack/src/index.ts",
    "content": "export * from './jigsawstack-client'\n"
  },
  {
    "path": "legacy/packages/jigsawstack/src/integration.test.ts",
    "content": "import { openai } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\nimport { expect, test } from 'vitest'\n\nimport { createAISDKTools } from '../../ai-sdk'\nimport { JigsawStackClient } from './jigsawstack-client'\n\n// Do ensure to set your JIGSAWSTACK_API_KEY environment variable.\n\nconst jigsaw = new JigsawStackClient({ timeoutMs: 30_000 })\n\ntest.skip('should run successfully and return search result', async () => {\n  const { toolResults } = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(jigsaw),\n    toolChoice: 'required',\n    prompt: 'Tell me about \"Santorini\"'\n  })\n\n  // console.log(toolResults, 'toolResults')\n  expect(toolResults[0]).toBeTruthy()\n})\n\ntest.skip('should scrape url successfully and return result', async () => {\n  const { toolResults } = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(jigsaw),\n    toolChoice: 'required',\n    prompt: 'Scrape https://jigsawstack.com and tell me their title'\n  })\n\n  // console.log(toolResults[0], 'toolResults')\n  expect(toolResults[0]).toBeTruthy()\n})\n\ntest.skip('should perform vision based OCR and return result', async () => {\n  const { toolResults } = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(jigsaw),\n    toolChoice: 'required',\n    prompt:\n      'Tell me about this image : https://rogilvkqloanxtvjfrkm.supabase.co/storage/v1/object/public/demo/Collabo%201080x842.jpg?t=2024-03-22T09%3A22%3A48.442Z'\n  })\n  // console.log(toolResults[0], 'toolResults')\n  expect(toolResults[0]).toBeTruthy()\n})\n\ntest.skip('should perform speech to text  and return result', async () => {\n  const { toolResults } = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(jigsaw),\n    toolChoice: 'required',\n    prompt:\n      'Get the transcription from this video url : https://rogilvkqloanxtvjfrkm.supabase.co/storage/v1/object/public/demo/Video%201737458382653833217.mp4?t=2024-03-22T09%3A50%3A49.894Z'\n  })\n  // console.log(toolResults[0], 'toolResults')\n  expect(toolResults[0]).toBeTruthy()\n})\n\ntest('should perform text to sql and return result', async () => {\n  const prompt = `\n  Generate a query to get transactions that amount exceed 10000 and sort by when created. Given this schema:\n    \"CREATE TABLE Transactions (transaction_id INT PRIMARY KEY, user_id INT NOT NULL,total_amount DECIMAL(10, 2 NOT NULL, transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(20) DEFAULT 'pending',FOREIGN KEY(user_id) REFERENCES Users(user_id))\"`\n  const { toolResults } = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(jigsaw),\n    toolChoice: 'required',\n    prompt\n  })\n  expect(toolResults[0]).toBeTruthy()\n})\n"
  },
  {
    "path": "legacy/packages/jigsawstack/src/jigsawstack-client.ts",
    "content": "import { aiFunction, AIFunctionsProvider, assert, getEnv } from '@agentic/core'\nimport ky, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace jigsawstack {\n  export interface BaseResponse {\n    success: boolean\n  }\n\n  export const API_BASE_URL = 'https://api.jigsawstack.com/v1/'\n\n  export interface SearchParams {\n    query: string\n    ai_overview?: boolean\n    safe_search?: 'moderate' | 'strict' | 'off'\n    spell_check?: boolean\n  }\n\n  export interface SearchResponse extends BaseResponse {\n    query: string\n    spell_fixed: string\n    is_safe: boolean\n    ai_overview: string\n    results: {\n      title: string\n      url: string\n      description: string\n      content: string\n      is_safe: boolean\n      site_name: string\n      site_long_name: string\n      age: string\n      language: string\n      favicon: string\n      snippets: string[]\n      related_index: []\n    }[]\n  }\n\n  export interface CookieParameter {\n    name: string\n    value: string\n    url?: string\n    domain?: string\n    path?: string\n    secure?: boolean\n    httpOnly?: boolean\n    sameSite?: 'Strict' | 'Lax' | 'None'\n    expires?: boolean\n    priority?: string\n    sameParty?: boolean\n  }\n\n  export interface ScrapeParams {\n    url: string\n    element_prompts: string[]\n    http_headers?: object\n    reject_request_pattern?: string[]\n    goto_options?: {\n      timeout: number\n      wait_until: string\n    }\n    wait_for?: {\n      mode: string\n      value: string | number\n    }\n    advance_config?: {\n      console: boolean\n      network: boolean\n      cookies: boolean\n    }\n    size_preset?: string\n    is_mobile?: boolean\n    scale?: number\n    width?: number\n    height?: number\n    cookies?: Array<CookieParameter>\n  }\n\n  export interface ScrapeResponse extends BaseResponse {\n    data: any\n  }\n\n  export interface VOCRParams {\n    prompt: string | string[]\n    url?: string\n    file_store_key?: string\n  }\n\n  export interface VOCRResponse extends BaseResponse {\n    context: string\n    width: number\n    height: number\n    tags: string[]\n    has_text: boolean\n    sections: Array<any>\n  }\n\n  export interface TextToSqlParams {\n    prompt: string\n    sql_schema?: string\n    file_store_key?: string\n  }\n\n  export interface TextToSqlResponse extends BaseResponse {\n    sql: string\n  }\n\n  export interface SpeechToTextParams {\n    url?: string\n    file_store_key?: string\n    language?: string\n    translate?: boolean\n    by_speaker?: boolean\n    webhook_url?: string\n  }\n\n  export interface SpeechToTextResponse extends BaseResponse {\n    text: string\n    chunks: Array<{\n      timestamp: number[]\n      text: string\n    }>\n    status?: 'processing' | 'error'\n    id?: string\n  }\n}\n\n/**\n * Basic JigsawStack API wrapper.\n */\nexport class JigsawStackClient extends AIFunctionsProvider {\n  protected readonly apiKey: string\n  protected readonly ky: KyInstance\n  constructor({\n    apiKey = getEnv('JIGSAWSTACK_API_KEY'),\n    timeoutMs = 60_000\n  }: {\n    apiKey?: string\n    throttle?: boolean\n    timeoutMs?: number\n  } = {}) {\n    assert(\n      apiKey,\n      'Please set the JIGSAWSTACK_API_KEY environment variable or pass it to the constructor as the apiKey field.'\n    )\n    super()\n    this.apiKey = apiKey\n    this.ky = ky.extend({\n      prefixUrl: jigsawstack.API_BASE_URL,\n      timeout: timeoutMs,\n      headers: {\n        'x-api-key': this.apiKey\n      }\n    })\n  }\n\n  /**\n   * Perform web searches and retrieve high-quality results of the given query\n   */\n  @aiFunction({\n    name: 'jigsawstack_ai_search',\n    description:\n      'Perform web searches and retrieve high-quality results of the given query',\n    inputSchema: z.object({\n      query: z.string().describe('The search query')\n    })\n  })\n  async aiSearch(params: jigsawstack.SearchParams) {\n    return this.ky\n      .get('web/search', {\n        searchParams: {\n          ...params\n        }\n      })\n      .json<jigsawstack.SearchResponse>()\n  }\n\n  /**\n   * Scrape any website\n   */\n  @aiFunction({\n    name: 'jigsawstack_ai_scrape',\n    description: 'Scrape any website',\n    inputSchema: z.object({\n      url: z.string().describe('The url to scrape its content'),\n      element_prompts: z\n        .array(z.string())\n        .describe(\n          'The items to scrape (retrieve) from the given url. eg. Page title, price, etc'\n        )\n    })\n  })\n  async aiScrape(params: jigsawstack.ScrapeParams) {\n    return this.ky\n      .post('ai/scrape', {\n        json: {\n          ...params\n        }\n      })\n      .json<jigsawstack.ScrapeResponse>()\n  }\n\n  /**\n   * Recognise, describe and retrieve data within an image with great accuracy.\n   */\n  @aiFunction({\n    name: 'jigsawstack_vocr',\n    description:\n      'Recognise, describe and retrieve data within an image with great accuracy.',\n    inputSchema: z.object({\n      url: z.string().describe('The image url to OCR'),\n      prompt: z\n        .string()\n        .default('Describe the image in detail.')\n        .describe('What you want to know  or retrieve from the image')\n    })\n  })\n  async vocr(params: jigsawstack.VOCRParams) {\n    return this.ky\n      .post('vocr', {\n        json: {\n          ...params\n        }\n      })\n      .json<jigsawstack.VOCRResponse>()\n  }\n\n  /**\n   * Generate semantically correct SQL queries from text.\n   */\n  @aiFunction({\n    name: 'jigsawstack_text_to_sql',\n    description: 'Generate semantically correct SQL queries from text.',\n    inputSchema: z.object({\n      prompt: z\n        .string()\n        .describe('The text that will be translated to an SQL query.'),\n      sql_schema: z\n        .string()\n        .describe('The valid sql schema where the query will be run')\n    })\n  })\n  async textToSql(\n    params: jigsawstack.TextToSqlParams\n  ): Promise<jigsawstack.TextToSqlResponse> {\n    return this.ky\n      .post('ai/sql', {\n        json: {\n          ...params\n        }\n      })\n      .json<jigsawstack.TextToSqlResponse>()\n  }\n\n  /**\n   * Convert audio/video files into accurate text transcriptions instantly.\n   */\n  @aiFunction({\n    name: 'jigsawstack_speech_to_text',\n    description:\n      'Convert audio/video files into accurate text transcriptions instantly.',\n    inputSchema: z.object({\n      url: z.string().describe('The audio or video url')\n    })\n  })\n  async speechToText(\n    params: jigsawstack.SpeechToTextParams\n  ): Promise<jigsawstack.SpeechToTextResponse> {\n    return this.ky\n      .post('ai/transcribe', {\n        json: {\n          ...params\n        }\n      })\n      .json<jigsawstack.SpeechToTextResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/jigsawstack/src/tool.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { type jigsawstack, JigsawStackClient } from './jigsawstack-client'\n\nconst jigsaw = new JigsawStackClient()\n\ntest.skip('should run successfully and return the search result', async () => {\n  const params: jigsawstack.SearchParams = {\n    query: 'The leaning tower of pisa',\n    ai_overview: true,\n    spell_check: true\n  }\n  const result = await jigsaw.aiSearch(params)\n  expect(result).toBeTruthy()\n  expect(result.success).toBe(true)\n})\n\ntest.skip('should run successfully and return the valid sql result', async () => {\n  const params: jigsawstack.TextToSqlParams = {\n    sql_schema:\n      \"CREATE TABLE Transactions (transaction_id INT PRIMARY KEY, user_id INT NOT NULL,total_amount DECIMAL(10, 2 NOT NULL, transaction_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(20) DEFAULT 'pending',FOREIGN KEY(user_id) REFERENCES Users(user_id))\",\n    prompt:\n      'Generate a query to get transactions that amount exceed 10000 and sort by when created'\n  }\n\n  const result = await jigsaw.textToSql(params)\n  expect(result).toBeTruthy()\n  expect(result.success).toBe(true)\n})\n\ntest.skip('should return result.success is true for successful vocr', async () => {\n  const result = await jigsaw.vocr({\n    prompt: 'Describe the image in detail',\n    url: 'https://rogilvkqloanxtvjfrkm.supabase.co/storage/v1/object/public/demo/Collabo%201080x842.jpg?t=2024-03-22T09%3A22%3A48.442Z'\n  })\n  expect(result.success).toBe(true)\n})\n\ntest('should run successfully and return the transcribe result', async () => {\n  const data = await jigsaw.speechToText({\n    url: 'https://rogilvkqloanxtvjfrkm.supabase.co/storage/v1/object/public/demo/Video%201737458382653833217.mp4?t=2024-03-22T09%3A50%3A49.894'\n  })\n  expect(data).toBeTruthy()\n  expect(data.success).toBe(true)\n})\n\ntest.skip('should run successfully and return scrape result', async () => {\n  const params: jigsawstack.ScrapeParams = {\n    url: 'https://jigsawstack.com/pricing',\n    element_prompts: ['Pro Plan']\n  }\n  const result = await jigsaw.aiScrape(params)\n  expect(result).toBeTruthy()\n  expect(result.success).toBe(true)\n})\n"
  },
  {
    "path": "legacy/packages/jigsawstack/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/jina/package.json",
    "content": "{\n  \"name\": \"@agentic/jina\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Jina AI.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/jina\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/jina/src/index.ts",
    "content": "export * from './jina-client'\n"
  },
  {
    "path": "legacy/packages/jina/src/jina-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  getEnv,\n  pruneNullOrUndefined,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace jina {\n  export const ReaderFormatSchema = z.enum([\n    'text',\n    'html',\n    'markdown',\n    'screenshot'\n  ])\n  export type ReaderFormat = z.infer<typeof ReaderFormatSchema>\n\n  export const ReaderOptionsSchema = z.object({\n    url: z.string().describe('URL to read'),\n    timeout: z.number().optional().describe('Optional timeout in seconds'),\n    targetSelector: z\n      .string()\n      .optional()\n      .describe(\n        \"Optional CSS selector to focus on a more specific part of the page. Useful when your desired content doesn't show under the default settings.\"\n      ),\n    waitForSelector: z\n      .string()\n      .optional()\n      .describe(\n        \"Optional CSS selector to wait for before returning. Useful when your desired content doesn't show under the default settings.\"\n      ),\n    withGeneratedAlt: z.boolean().optional(),\n    withLinksSummary: z.boolean().optional(),\n    withImagesSummary: z.boolean().optional(),\n    setCookie: z.string().optional(),\n    proxyUrl: z.string().optional(),\n    noCache: z.boolean().optional(),\n    returnFormat: ReaderFormatSchema.optional(),\n    json: z.boolean().optional()\n  })\n  export type ReaderOptions = z.infer<typeof ReaderOptionsSchema>\n\n  export const SearchOptionsSchema = z.object({\n    query: z.string().describe('Search query'),\n    site: z\n      .string()\n      .optional()\n      .describe(\n        'Returns the search results only from the specified website or domain. By default it searches the entire web.'\n      ),\n    withGeneratedAlt: z.boolean().optional(),\n    withLinksSummary: z.boolean().optional(),\n    withImagesSummary: z.boolean().optional(),\n    withFavicon: z.boolean().optional(),\n    setCookie: z.string().optional(),\n    proxyUrl: z.string().optional(),\n    noCache: z.boolean().optional(),\n    returnFormat: ReaderFormatSchema.exclude(['screenshot']).optional(),\n    json: z.boolean().optional()\n  })\n  export type SearchOptions = z.infer<typeof SearchOptionsSchema>\n\n  export interface JinaResponse {\n    code: number\n    status: number\n    data: unknown\n  }\n\n  export interface ReaderResponse extends JinaResponse {\n    data: ReaderData\n  }\n\n  export interface ReaderResponseScreenshot extends JinaResponse {\n    data: {\n      screenshotUrl: string\n    }\n  }\n\n  export interface ReaderResponseHtml extends JinaResponse {\n    data: {\n      html: string\n    }\n  }\n\n  export interface SearchResponse extends JinaResponse {\n    data: ReaderData[]\n  }\n\n  export interface ReaderData {\n    url: string\n    title: string\n    content: string\n    description?: string\n    publishedTime?: string\n    favicon?: string\n  }\n}\n\n/**\n * LLM-friendly URL reader and search client by Jina AI.\n *\n * - Includes a small free tier.\n * - Does not support \"stream mode\".\n * - Results default to markdown text format.\n * - To return JSON (especially useful for `search`), set `json: true` in the\n *   options.\n *\n * @see https://jina.ai/reader\n */\nexport class JinaClient extends AIFunctionsProvider {\n  protected readonly kyReader: KyInstance\n  protected readonly kySearch: KyInstance\n  protected readonly apiKey?: string\n\n  constructor({\n    apiKey = getEnv('JINA_API_KEY'),\n    timeoutMs = 60_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiKey = apiKey\n\n    if (apiKey) {\n      ky = ky.extend({ headers: { Authorization: `Bearer ${apiKey}` } })\n    }\n\n    ky = ky.extend({ timeout: timeoutMs })\n\n    const throttledKyReader = throttle\n      ? throttleKy(\n          ky,\n          pThrottle({\n            limit: apiKey ? 200 : 20,\n            interval: 60 * 60 * 1000 // 60 minutes\n          })\n        )\n      : ky\n    this.kyReader = throttledKyReader.extend({ prefixUrl: 'https://r.jina.ai' })\n\n    const throttledKySearch = throttle\n      ? throttleKy(\n          ky,\n          pThrottle({\n            limit: apiKey ? 40 : 5,\n            interval: 60 * 60 * 1000 // 60 minutes\n          })\n        )\n      : ky\n    this.kySearch = throttledKySearch.extend({ prefixUrl: 'https://s.jina.ai' })\n  }\n\n  /**\n   * Reads the contents of the given URL and returns it's main contents in a clean, LLM-friendly format.\n   */\n  @aiFunction({\n    name: 'readUrl',\n    description:\n      \"Reads the contents of the given URL and returns it's main contents in a clean, LLM-friendly format.\",\n    inputSchema: jina.ReaderOptionsSchema\n  })\n  async readUrl<T extends string | jina.ReaderOptions>(\n    urlOrOptions: T\n  ): Promise<\n    T extends string\n      ? string\n      : T extends jina.ReaderOptions\n        ? T['json'] extends true\n          ? T['returnFormat'] extends 'screenshot'\n            ? jina.ReaderResponseScreenshot\n            : T['returnFormat'] extends 'html'\n              ? jina.ReaderResponseHtml\n              : jina.ReaderResponse\n          : T['returnFormat'] extends 'screenshot'\n            ? ArrayBuffer\n            : string\n        : never\n  > {\n    const { url, ...opts } =\n      typeof urlOrOptions === 'string'\n        ? { url: urlOrOptions }\n        : jina.ReaderOptionsSchema.parse(pruneNullOrUndefined(urlOrOptions))\n    const headers = this._getHeadersFromOptions(opts)\n\n    const res = this.kyReader.get(url, { headers })\n\n    if (opts.json) {\n      return res.json<jina.ReaderResponse>() as any\n    } else if (opts.returnFormat === 'screenshot') {\n      return res.arrayBuffer() as any\n    } else {\n      return res.text() as any\n    }\n  }\n\n  /**\n   * Searches the web for the given query and returns the top-5 results including their page contents in a clean, LLM-friendly format.\n   */\n  @aiFunction({\n    name: 'search',\n    description:\n      'Searches the web for the given query and returns the top-5 results including their page contents in a clean, LLM-friendly format.',\n    inputSchema: jina.SearchOptionsSchema\n  })\n  async search<T extends string | jina.SearchOptions>(\n    queryOrOptions: T\n  ): Promise<\n    T extends string\n      ? string\n      : T extends jina.SearchOptions\n        ? T['json'] extends true\n          ? jina.SearchResponse\n          : string\n        : never\n  > {\n    const { query, ...opts } =\n      typeof queryOrOptions === 'string'\n        ? { query: queryOrOptions }\n        : jina.SearchOptionsSchema.parse(pruneNullOrUndefined(queryOrOptions))\n    const headers = this._getHeadersFromOptions(opts)\n\n    const res = this.kySearch.get(query, { headers })\n\n    if (opts.json) {\n      return res.json<jina.SearchResponse>() as any\n    } else {\n      return res.text() as any\n    }\n  }\n\n  protected _getHeadersFromOptions(\n    options: Record<string, string | boolean | number>\n  ) {\n    const { json, ...rest } = options\n\n    const headerMap: Record<string, string> = {\n      site: 'site',\n      timeout: 'x-timeout',\n      targetSelector: 'x-target-selector',\n      waitForSelector: 'x-wait-for-selector',\n      withGeneratedAlt: 'x-with-generated-alt',\n      withLinksSummary: 'x-with-links-summary',\n      withImagesSummary: 'x-with-images-summary',\n      withFavicon: 'x-with-favicon',\n      setCookie: 'x-set-cookie',\n      proxyUrl: 'x-proxy-url',\n      noCache: 'x-no-cache',\n      returnFormat: 'x-return-format'\n    }\n\n    const headers = Object.fromEntries(\n      Object.entries(rest).map(([key, value]) => [\n        headerMap[key as string]!,\n        String(value)\n      ])\n    )\n\n    if (json) {\n      headers.accept = 'application/json'\n    } else if (options.returnFormat !== 'screenshot') {\n      headers.accept = 'text/plain'\n    }\n\n    return headers\n  }\n}\n"
  },
  {
    "path": "legacy/packages/jina/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/leadmagic/package.json",
    "content": "{\n  \"name\": \"@agentic/leadmagic\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for LeadMagic.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/leadmagic\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/leadmagic/src/index.ts",
    "content": "export * from './leadmagic-client'\n"
  },
  {
    "path": "legacy/packages/leadmagic/src/leadmagic-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace leadmagic {\n  export const API_BASE_URL = 'https://api.leadmagic.io'\n\n  // Allow up to 300 requests per minute by default.\n  // (5 requests per second)\n  export const throttle = pThrottle({\n    limit: 5,\n    interval: 1000\n  })\n\n  export interface ProfileSearchOptions {\n    linkedinUrl: string\n  }\n\n  export interface EnrichedPerson {\n    profileUrl: string\n    creditsConsumed: number\n    firstName: string\n    lastName: string\n    fullName: string\n    headline: string\n    userSkills: string\n    company_name: string\n    company_size: string\n    company_industry: string\n    company_website: string\n    totalTenureMonths: number\n    totalTenureDays: number\n    totalTenureYears: number\n    connections: number\n    country: string\n    location: string\n    about: string\n    experiences: Experience[]\n    highlights: any[]\n  }\n\n  export interface Experience {\n    title: string\n    subtitle: string\n    caption: string\n    subComponents: any[]\n  }\n\n  export interface EmailFinderOptions {\n    first_name: string\n    last_name: string\n    domain: string\n  }\n\n  export interface MobileFinderOptions {\n    linkedinUrl: string\n  }\n\n  export interface RoleFinderOptions {\n    role: string\n    domain: string\n  }\n\n  export interface CreditsResponse {\n    credits: number\n  }\n\n  export interface EmailFinderResponse {\n    emailAddress: string\n    emailScore: number\n    domain: string\n    firstName: string\n    lastName: string\n    creditsConsumed: number\n  }\n\n  export interface MobileFinderResponse {\n    profileUrl: string\n    mobileNumber: string\n    firstName: string\n    lastName: string\n    verificationScore: number\n    creditsConsumed: number\n  }\n\n  export interface RoleFinderResponse {\n    matches: RoleMatch[]\n    creditsConsumed: number\n  }\n\n  export interface RoleMatch {\n    fullName: string\n    firstName: string\n    lastName: string\n    headline: string\n    profileUrl: string\n    emailAddress: string\n    score: number\n  }\n}\n\n/**\n * LeadMagic.io is a B2B person, company, and email enrichment API.\n *\n * @see https://docs.leadmagic.io\n */\nexport class LeadMagicClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('LEADMAGIC_API_KEY'),\n    apiBaseUrl = leadmagic.API_BASE_URL,\n    timeoutMs = 60_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      `LeadMagicClient missing required \"apiKey\" (defaults to \"LEADMAGIC_API_KEY\")`\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, leadmagic.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        'X-API-Key': apiKey\n      }\n    })\n  }\n\n  /**\n   * Attempts to enrich a person with LeadMagic data based on their public\n   * LinkedIn URL.\n   */\n  @aiFunction({\n    name: 'leadmagic_get_person_by_linkedin_url',\n    description:\n      'Attempts to enrich a person with LeadMagic data based on their LinkedIn profile URL.',\n    inputSchema: z.object({\n      linkedinUrl: z\n        .string()\n        .describe(\n          'The LinkedIn profile URL of the person to enrich. For example, \"https://linkedin.com/in/fisch2\"'\n        )\n    })\n  })\n  async getPersonByLinkedInUrl(urlOrOpts: leadmagic.ProfileSearchOptions) {\n    const opts =\n      typeof urlOrOpts === 'string' ? { linkedinUrl: urlOrOpts } : urlOrOpts\n\n    return this.ky\n      .post('profile-search', {\n        json: {\n          profile_url: opts.linkedinUrl\n        }\n      })\n      .json<leadmagic.EnrichedPerson>()\n  }\n\n  /**\n   * Checks the remaining credits balance for your LeadMagic account.\n   */\n  @aiFunction({\n    name: 'leadmagic_check_credits',\n    description:\n      'Checks the remaining credits balance for your LeadMagic account.',\n    inputSchema: z.object({})\n  })\n  async checkCredits() {\n    return this.ky.post('credits').json()\n  }\n\n  /**\n   * Finds email addresses based on a person's first name, last name, and company\n   * domain.\n   */\n  @aiFunction({\n    name: 'leadmagic_email_finder',\n    description:\n      \"Finds email addresses based on a person's first name, last name, and company domain.\",\n    inputSchema: z.object({\n      first_name: z.string().describe('The first name of the person'),\n      last_name: z.string().describe('The last name of the person'),\n      domain: z\n        .string()\n        .describe('The company domain (e.g., \"https://company.com\")')\n    })\n  })\n  async findEmailsForPerson(opts: leadmagic.EmailFinderOptions) {\n    return this.ky\n      .post('email-finder', {\n        json: {\n          first_name: opts.first_name,\n          last_name: opts.last_name,\n          domain: opts.domain\n        }\n      })\n      .json<leadmagic.EmailFinderResponse>()\n  }\n\n  /**\n   * Finds mobile/phone numbers based on a person's LinkedIn profile URL.\n   */\n  @aiFunction({\n    name: 'leadmagic_mobile_finder',\n    description:\n      \"Finds mobile/phone numbers based on a person's LinkedIn profile URL.\",\n    inputSchema: z.object({\n      linkedinUrl: z\n        .string()\n        .describe(\n          'The LinkedIn profile URL of the person. For example, `https://linkedin.com/in/fisch2`'\n        )\n    })\n  })\n  async findMobilePhoneNumberForPerson(\n    urlOrOpts: string | leadmagic.MobileFinderOptions\n  ) {\n    const opts =\n      typeof urlOrOpts === 'string' ? { linkedinUrl: urlOrOpts } : urlOrOpts\n\n    return this.ky\n      .post('mobile-finder', {\n        json: {\n          profile_url: opts.linkedinUrl\n        }\n      })\n      .json<leadmagic.MobileFinderResponse>()\n  }\n\n  /**\n   * Finds people matching specific job roles at a company based on the company\n   * domain.\n   */\n  @aiFunction({\n    name: 'leadmagic_role_finder',\n    description:\n      'Finds people matching specific job roles at a company based on the company domain.',\n    inputSchema: z.object({\n      role: z\n        .string()\n        .describe(\n          'The job role/title to search for (e.g., \"CTO\", \"Marketing Manager\")'\n        ),\n      domain: z\n        .string()\n        .describe('The company domain (e.g., \"https://company.com\")')\n    })\n  })\n  async findPeopleByRole(opts: leadmagic.RoleFinderOptions) {\n    return this.ky\n      .post('role-finder', {\n        json: {\n          role: opts.role,\n          domain: opts.domain\n        }\n      })\n      .json<leadmagic.RoleFinderResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/leadmagic/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/midjourney/package.json",
    "content": "{\n  \"name\": \"@agentic/midjourney\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the unofficial Midjourney API via imagineapi.dev.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/midjourney\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/midjourney/src/index.ts",
    "content": "export * from './midjourney-client'\n"
  },
  {
    "path": "legacy/packages/midjourney/src/midjourney-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  delay,\n  getEnv,\n  pruneNullOrUndefined,\n  TimeoutError\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\n// TODO: add additional methods for upscaling, variations, etc.\n\nexport namespace midjourney {\n  export const API_BASE_URL = 'https://cl.imagineapi.dev'\n\n  export type JobStatus = 'pending' | 'in-progress' | 'completed' | 'failed'\n\n  export interface ImagineResponse {\n    data: Job\n  }\n\n  export interface Job {\n    id: string\n    prompt: string\n    status: JobStatus\n    user_created: string\n    date_created: string\n    results?: string\n    progress?: string\n    url?: string\n    error?: string\n    upscaled_urls?: string[]\n    ref?: string\n    upscaled?: string[]\n  }\n\n  export interface JobOptions {\n    wait?: boolean\n    timeoutMs?: number\n    intervalMs?: number\n  }\n}\n\n/**\n * Unofficial Midjourney API client for generative images.\n *\n * @see https://www.imagineapi.dev\n */\nexport class MidjourneyClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('MIDJOURNEY_IMAGINE_API_KEY'),\n    apiBaseUrl = midjourney.API_BASE_URL,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'MidjourneyClient missing required \"apiKey\" (defaults to \"MIDJOURNEY_IMAGINE_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Creates 4 images from a prompt using the Midjourney API. Useful for generating images on the fly.\n   */\n  @aiFunction({\n    name: 'midjourney_create_images',\n    description:\n      'Creates 4 images from a prompt using the Midjourney API. Useful for generating images on the fly.',\n    inputSchema: z.object({\n      prompt: z\n        .string()\n        .describe(\n          'Simple, short, comma-separated list of phrases which describe the image you want to generate'\n        )\n    })\n  })\n  async imagine(\n    promptOrOptions:\n      | string\n      | ({\n          prompt: string\n        } & midjourney.JobOptions)\n  ): Promise<midjourney.Job> {\n    const {\n      wait = true,\n      timeoutMs,\n      intervalMs,\n      ...options\n    } = typeof promptOrOptions === 'string'\n      ? ({ prompt: promptOrOptions } as {\n          prompt: string\n        } & midjourney.JobOptions)\n      : promptOrOptions\n\n    const res = await this.ky\n      .post('items/images', {\n        json: { ...options }\n      })\n      .json<midjourney.ImagineResponse>()\n\n    const job = pruneNullOrUndefined(res.data)\n    if (!wait) {\n      return job\n    }\n\n    if (job.status === 'completed' || job.status === 'failed') {\n      return job\n    }\n\n    return this.waitForJobById(job.id, {\n      timeoutMs,\n      intervalMs\n    })\n  }\n\n  async getJobById(\n    jobIdOrOptions:\n      | string\n      | ({\n          jobId: string\n        } & midjourney.JobOptions)\n  ): Promise<midjourney.Job> {\n    const {\n      jobId,\n      wait = true,\n      timeoutMs,\n      intervalMs\n    } = typeof jobIdOrOptions === 'string'\n      ? ({ jobId: jobIdOrOptions } as {\n          jobId: string\n        } & midjourney.JobOptions)\n      : jobIdOrOptions\n\n    const res = await this.ky\n      .get(`items/images/${jobId}`)\n      .json<midjourney.ImagineResponse>()\n\n    const job = pruneNullOrUndefined(res.data)\n    if (!wait) {\n      return job\n    }\n\n    if (job.status === 'completed' || job.status === 'failed') {\n      return job\n    }\n\n    return this.waitForJobById(job.id, {\n      timeoutMs,\n      intervalMs\n    })\n  }\n\n  async waitForJobById(\n    jobId: string,\n    {\n      timeoutMs = 5 * 60 * 1000, // 5 minutes\n      intervalMs = 1000\n    }: Omit<midjourney.JobOptions, 'wait'> = {}\n  ): Promise<midjourney.Job> {\n    const startTimeMs = Date.now()\n\n    function checkForTimeout() {\n      const elapsedTimeMs = Date.now() - startTimeMs\n      if (elapsedTimeMs >= timeoutMs) {\n        throw new TimeoutError(\n          `MidjourneyClient timeout waiting for job \"${jobId}\"`\n        )\n      }\n    }\n\n    do {\n      checkForTimeout()\n\n      const job = await this.getJobById(jobId)\n      if (job.status === 'completed' || job.status === 'failed') {\n        return job\n      }\n\n      checkForTimeout()\n      await delay(intervalMs)\n    } while (true)\n  }\n}\n"
  },
  {
    "path": "legacy/packages/midjourney/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/notion/package.json",
    "content": "{\n  \"name\": \"@agentic/notion\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Notion.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/notion\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/notion/src/index.ts",
    "content": "export * from './notion'\nexport * from './notion-client'\n"
  },
  {
    "path": "legacy/packages/notion/src/notion-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { notion } from './notion'\n\n/**\n * Agentic Notion client.\n */\nexport class NotionClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('NOTION_API_KEY'),\n    apiBaseUrl = notion.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'NotionClient missing required \"apiKey\" (defaults to \"NOTION_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: `Bearer ${apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Get current user.\n   */\n  @aiFunction({\n    name: 'notion_get_self',\n    description: `Get current user.`,\n    inputSchema: notion.GetSelfParamsSchema\n  })\n  async getSelf(\n    _params: notion.GetSelfParams\n  ): Promise<notion.GetSelfResponse> {\n    return this.ky.get('/users/me').json<notion.GetSelfResponse>()\n  }\n\n  /**\n   * Get user.\n   */\n  @aiFunction({\n    name: 'notion_get_user',\n    description: `Get user.`,\n    inputSchema: notion.GetUserParamsSchema\n  })\n  async getUser(params: notion.GetUserParams): Promise<notion.GetUserResponse> {\n    return this.ky\n      .get(`/users/${params.user_id}`)\n      .json<notion.GetUserResponse>()\n  }\n\n  /**\n   * List users.\n   */\n  @aiFunction({\n    name: 'notion_list_users',\n    description: `List users.`,\n    inputSchema: notion.ListUsersParamsSchema\n  })\n  async listUsers(\n    params: notion.ListUsersParams\n  ): Promise<notion.ListUsersResponse> {\n    return this.ky\n      .get('/users', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListUsersResponse>()\n  }\n\n  /**\n   * Create page.\n   */\n  @aiFunction({\n    name: 'notion_create_page',\n    description: `Create page.`,\n    inputSchema: notion.CreatePageParamsSchema\n  })\n  async createPage(\n    params: notion.CreatePageParams\n  ): Promise<notion.CreatePageResponse> {\n    return this.ky\n      .post('/pages', {\n        json: pick(params, 'parent', 'properties')\n      })\n      .json<notion.CreatePageResponse>()\n  }\n\n  /**\n   * Get page.\n   */\n  @aiFunction({\n    name: 'notion_get_page',\n    description: `Get page.`,\n    inputSchema: notion.GetPageParamsSchema\n  })\n  async getPage(params: notion.GetPageParams): Promise<notion.GetPageResponse> {\n    return this.ky\n      .get(`/pages/${params.page_id}`, {\n        searchParams: sanitizeSearchParams(pick(params, 'filter_properties'))\n      })\n      .json<notion.GetPageResponse>()\n  }\n\n  /**\n   * Update page.\n   */\n  @aiFunction({\n    name: 'notion_update_page',\n    description: `Update page.`,\n    inputSchema: notion.UpdatePageParamsSchema\n  })\n  async updatePage(\n    params: notion.UpdatePageParams\n  ): Promise<notion.UpdatePageResponse> {\n    return this.ky\n      .patch(`/pages/${params.page_id}`, {\n        json: pick(params, 'properties', 'archived')\n      })\n      .json<notion.UpdatePageResponse>()\n  }\n\n  /**\n   * Get page property.\n   */\n  @aiFunction({\n    name: 'notion_get_page_property',\n    description: `Get page property.`,\n    inputSchema: notion.GetPagePropertyParamsSchema\n  })\n  async getPageProperty(\n    params: notion.GetPagePropertyParams\n  ): Promise<notion.GetPagePropertyResponse> {\n    return this.ky\n      .get(`/pages/${params.page_id}/properties/${params.property_id}`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.GetPagePropertyResponse>()\n  }\n\n  /**\n   * Get block.\n   */\n  @aiFunction({\n    name: 'notion_get_block',\n    description: `Get block.`,\n    inputSchema: notion.GetBlockParamsSchema\n  })\n  async getBlock(\n    params: notion.GetBlockParams\n  ): Promise<notion.GetBlockResponse> {\n    return this.ky\n      .get(`/blocks/${params.block_id}`)\n      .json<notion.GetBlockResponse>()\n  }\n\n  /**\n   * Delete block.\n   */\n  @aiFunction({\n    name: 'notion_delete_block',\n    description: `Delete block.`,\n    inputSchema: notion.DeleteBlockParamsSchema\n  })\n  async deleteBlock(\n    params: notion.DeleteBlockParams\n  ): Promise<notion.DeleteBlockResponse> {\n    return this.ky\n      .delete(`/blocks/${params.block_id}`)\n      .json<notion.DeleteBlockResponse>()\n  }\n\n  /**\n   * Update block.\n   */\n  @aiFunction({\n    name: 'notion_update_block',\n    description: `Update block.`,\n    inputSchema: notion.UpdateBlockParamsSchema\n  })\n  async updateBlock(\n    params: notion.UpdateBlockParams\n  ): Promise<notion.UpdateBlockResponse> {\n    return this.ky\n      .patch(`/blocks/${params.block_id}`, {\n        json: pick(\n          params,\n          'paragraph',\n          'heading_1',\n          'heading_2',\n          'heading_3',\n          'bulleted_list_item',\n          'numbered_list_item',\n          'quote',\n          'to_do',\n          'toggle',\n          'code',\n          'embed',\n          'image',\n          'video',\n          'file',\n          'pdf',\n          'bookmark',\n          'equation',\n          'divider',\n          'table_of_contents',\n          'breadcrumb',\n          'column_list',\n          'column',\n          'link_to_page',\n          'table_row',\n          'archived'\n        )\n      })\n      .json<notion.UpdateBlockResponse>()\n  }\n\n  /**\n   * List block children.\n   */\n  @aiFunction({\n    name: 'notion_list_block_children',\n    description: `List block children.`,\n    inputSchema: notion.ListBlockChildrenParamsSchema\n  })\n  async listBlockChildren(\n    params: notion.ListBlockChildrenParams\n  ): Promise<notion.ListBlockChildrenResponse> {\n    return this.ky\n      .get(`/blocks/${params.block_id}/children`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListBlockChildrenResponse>()\n  }\n\n  /**\n   * Append block children.\n   */\n  @aiFunction({\n    name: 'notion_append_block_children',\n    description: `Append block children.`,\n    inputSchema: notion.AppendBlockChildrenParamsSchema\n  })\n  async appendBlockChildren(\n    params: notion.AppendBlockChildrenParams\n  ): Promise<notion.AppendBlockChildrenResponse> {\n    return this.ky\n      .patch(`/blocks/${params.block_id}/children`, {\n        json: pick(params, 'children')\n      })\n      .json<notion.AppendBlockChildrenResponse>()\n  }\n\n  /**\n   * Get database.\n   */\n  @aiFunction({\n    name: 'notion_get_database',\n    description: `Get database.`,\n    inputSchema: notion.GetDatabaseParamsSchema\n  })\n  async getDatabase(\n    params: notion.GetDatabaseParams\n  ): Promise<notion.GetDatabaseResponse> {\n    return this.ky\n      .get(`/databases/${params.database_id}`)\n      .json<notion.GetDatabaseResponse>()\n  }\n\n  /**\n   * Update database.\n   */\n  @aiFunction({\n    name: 'notion_update_database',\n    description: `Update database.`,\n    inputSchema: notion.UpdateDatabaseParamsSchema\n  })\n  async updateDatabase(\n    params: notion.UpdateDatabaseParams\n  ): Promise<notion.UpdateDatabaseResponse> {\n    return this.ky\n      .patch(`/databases/${params.database_id}`, {\n        json: pick(\n          params,\n          'title',\n          'description',\n          'icon',\n          'cover',\n          'properties',\n          'is_inline',\n          'archived'\n        )\n      })\n      .json<notion.UpdateDatabaseResponse>()\n  }\n\n  /**\n   * Query database.\n   */\n  @aiFunction({\n    name: 'notion_query_database',\n    description: `Query database.`,\n    inputSchema: notion.QueryDatabaseParamsSchema\n  })\n  async queryDatabase(\n    params: notion.QueryDatabaseParams\n  ): Promise<notion.QueryDatabaseResponse> {\n    return this.ky\n      .post(`/databases/${params.database_id}/query`, {\n        searchParams: sanitizeSearchParams(pick(params, 'filter_properties')),\n        json: pick(\n          params,\n          'sorts',\n          'filter',\n          'start_cursor',\n          'page_size',\n          'archived'\n        )\n      })\n      .json<notion.QueryDatabaseResponse>()\n  }\n\n  /**\n   * List databases.\n   */\n  @aiFunction({\n    name: 'notion_list_databases',\n    description: `List databases.`,\n    inputSchema: notion.ListDatabasesParamsSchema\n  })\n  async listDatabases(\n    params: notion.ListDatabasesParams\n  ): Promise<notion.ListDatabasesResponse> {\n    return this.ky\n      .get('/databases', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListDatabasesResponse>()\n  }\n\n  /**\n   * Create database.\n   */\n  @aiFunction({\n    name: 'notion_create_database',\n    description: `Create database.`,\n    inputSchema: notion.CreateDatabaseParamsSchema\n  })\n  async createDatabase(\n    params: notion.CreateDatabaseParams\n  ): Promise<notion.CreateDatabaseResponse> {\n    return this.ky\n      .post('/databases', {\n        json: pick(\n          params,\n          'parent',\n          'properties',\n          'icon',\n          'cover',\n          'title',\n          'description',\n          'is_inline'\n        )\n      })\n      .json<notion.CreateDatabaseResponse>()\n  }\n\n  /**\n   * Search.\n   */\n  @aiFunction({\n    name: 'notion_search',\n    description: `Search.`,\n    inputSchema: notion.SearchParamsSchema\n  })\n  async search(params: notion.SearchParams): Promise<notion.SearchResponse> {\n    return this.ky\n      .post('/search', {\n        json: pick(\n          params,\n          'query',\n          'sort',\n          'filter',\n          'start_cursor',\n          'page_size'\n        )\n      })\n      .json<notion.SearchResponse>()\n  }\n\n  /**\n   * List comments.\n   */\n  @aiFunction({\n    name: 'notion_list_comments',\n    description: `List comments.`,\n    inputSchema: notion.ListCommentsParamsSchema\n  })\n  async listComments(\n    params: notion.ListCommentsParams\n  ): Promise<notion.ListCommentsResponse> {\n    return this.ky\n      .get('/comments', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'block_id', 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListCommentsResponse>()\n  }\n\n  /**\n   * Create comment.\n   */\n  @aiFunction({\n    name: 'notion_create_comment',\n    description: `Create comment.`,\n    // TODO: Improve handling of union params\n    inputSchema: notion.CreateCommentParamsSchema as any\n  })\n  async createComment(\n    params: notion.CreateCommentParams\n  ): Promise<notion.CreateCommentResponse> {\n    return this.ky\n      .post('/comments', {\n        json: params\n      })\n      .json<notion.CreateCommentResponse>()\n  }\n\n  /**\n   * OAuth token.\n   */\n  @aiFunction({\n    name: 'notion_oauth_token',\n    description: `OAuth token.`,\n    inputSchema: notion.OauthTokenParamsSchema\n  })\n  async oauthToken(\n    params: notion.OauthTokenParams\n  ): Promise<notion.OauthTokenResponse> {\n    return this.ky\n      .post('/oauth/token', {\n        json: pick(\n          params,\n          'grant_type',\n          'code',\n          'redirect_uri',\n          'external_account'\n        )\n      })\n      .json<notion.OauthTokenResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/notion/src/notion.ts",
    "content": "import { z } from 'zod'\n\nexport namespace notion {\n  export const apiBaseUrl = 'https://api.notion.so'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const UserObjectResponseSchema = z.object({\n    object: z.literal('user'),\n    id: z.string(),\n    type: z.enum(['person', 'bot']),\n    name: z.string(),\n    avatar_url: z.string()\n  })\n  export type UserObjectResponse = z.infer<typeof UserObjectResponseSchema>\n\n  export const AnnotationRequestSchema = z.object({\n    bold: z.boolean().optional(),\n    italic: z.boolean().optional(),\n    strikethrough: z.boolean().optional(),\n    underline: z.boolean().optional(),\n    code: z.boolean().optional(),\n    color: z\n      .enum([\n        'default',\n        'gray',\n        'brown',\n        'orange',\n        'yellow',\n        'green',\n        'blue',\n        'purple',\n        'pink',\n        'red',\n        'gray_background',\n        'brown_background',\n        'orange_background',\n        'yellow_background',\n        'green_background',\n        'blue_background',\n        'purple_background',\n        'pink_background',\n        'red_background'\n      ])\n      .optional()\n  })\n  export type AnnotationRequest = z.infer<typeof AnnotationRequestSchema>\n\n  export const DateRequestSchema = z.object({\n    start: z.string(),\n    end: z.union([z.string(), z.null()]).optional(),\n    time_zone: z.union([z.string(), z.null()]).optional()\n  })\n  export type DateRequest = z.infer<typeof DateRequestSchema>\n\n  export const PageObjectResponseSchema = z.object({\n    object: z.literal('page'),\n    id: z.string(),\n    created_time: z.string(),\n    last_edited_time: z.string(),\n    archived: z.boolean(),\n    url: z.string()\n  })\n  export type PageObjectResponse = z.infer<typeof PageObjectResponseSchema>\n\n  export const PartialPageObjectResponseSchema = z.object({\n    object: z.literal('page'),\n    id: z.string()\n  })\n  export type PartialPageObjectResponse = z.infer<\n    typeof PartialPageObjectResponseSchema\n  >\n\n  export const PropertyItemObjectResponseSchema = z.object({\n    type: z.string(),\n    id: z.string()\n  })\n  export type PropertyItemObjectResponse = z.infer<\n    typeof PropertyItemObjectResponseSchema\n  >\n\n  export const PartialBlockObjectResponseSchema = z.object({\n    object: z.literal('block'),\n    id: z.string()\n  })\n  export type PartialBlockObjectResponse = z.infer<\n    typeof PartialBlockObjectResponseSchema\n  >\n\n  export const BlockObjectResponseSchema = z.object({\n    object: z.literal('block'),\n    id: z.string(),\n    type: z.string(),\n    created_time: z.string(),\n    last_edited_time: z.string(),\n    has_children: z.boolean(),\n    archived: z.boolean()\n  })\n  export type BlockObjectResponse = z.infer<typeof BlockObjectResponseSchema>\n\n  export const TitlePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('title'),\n    title: z.record(z.any())\n  })\n  export type TitlePropertyResponse = z.infer<\n    typeof TitlePropertyResponseSchema\n  >\n\n  export const RichTextPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('rich_text'),\n    rich_text: z.record(z.any())\n  })\n  export type RichTextPropertyResponse = z.infer<\n    typeof RichTextPropertyResponseSchema\n  >\n\n  export const NumberPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('number'),\n    number: z.object({ format: z.string() })\n  })\n  export type NumberPropertyResponse = z.infer<\n    typeof NumberPropertyResponseSchema\n  >\n\n  export const SelectOptionSchema = z.object({\n    id: z.string(),\n    name: z.string(),\n    color: z.string()\n  })\n  export type SelectOption = z.infer<typeof SelectOptionSchema>\n\n  export const DatePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('date'),\n    date: z.record(z.any())\n  })\n  export type DatePropertyResponse = z.infer<typeof DatePropertyResponseSchema>\n\n  export const PeoplePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('people'),\n    people: z.record(z.any())\n  })\n  export type PeoplePropertyResponse = z.infer<\n    typeof PeoplePropertyResponseSchema\n  >\n\n  export const FilePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('files'),\n    files: z.record(z.any())\n  })\n  export type FilePropertyResponse = z.infer<typeof FilePropertyResponseSchema>\n\n  export const CheckboxPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('checkbox'),\n    checkbox: z.record(z.any())\n  })\n  export type CheckboxPropertyResponse = z.infer<\n    typeof CheckboxPropertyResponseSchema\n  >\n\n  export const UrlPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('url'),\n    url: z.record(z.any())\n  })\n  export type UrlPropertyResponse = z.infer<typeof UrlPropertyResponseSchema>\n\n  export const EmailPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('email'),\n    email: z.record(z.any())\n  })\n  export type EmailPropertyResponse = z.infer<\n    typeof EmailPropertyResponseSchema\n  >\n\n  export const PhoneNumberPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('phone_number'),\n    phone_number: z.record(z.any())\n  })\n  export type PhoneNumberPropertyResponse = z.infer<\n    typeof PhoneNumberPropertyResponseSchema\n  >\n\n  export const FormulaPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('formula'),\n    formula: z.object({ expression: z.string() })\n  })\n  export type FormulaPropertyResponse = z.infer<\n    typeof FormulaPropertyResponseSchema\n  >\n\n  export const RelationPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('relation'),\n    relation: z.object({\n      database_id: z.string(),\n      synced_property_name: z.string(),\n      synced_property_id: z.string()\n    })\n  })\n  export type RelationPropertyResponse = z.infer<\n    typeof RelationPropertyResponseSchema\n  >\n\n  export const RollupPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('rollup'),\n    rollup: z.object({\n      relation_property_name: z.string(),\n      relation_property_id: z.string(),\n      rollup_property_name: z.string(),\n      rollup_property_id: z.string(),\n      function: z.string()\n    })\n  })\n  export type RollupPropertyResponse = z.infer<\n    typeof RollupPropertyResponseSchema\n  >\n\n  export const CreatedTimePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('created_time'),\n    created_time: z.record(z.any())\n  })\n  export type CreatedTimePropertyResponse = z.infer<\n    typeof CreatedTimePropertyResponseSchema\n  >\n\n  export const CreatedByPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('created_by'),\n    created_by: z.record(z.any())\n  })\n  export type CreatedByPropertyResponse = z.infer<\n    typeof CreatedByPropertyResponseSchema\n  >\n\n  export const LastEditedTimePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('last_edited_time'),\n    last_edited_time: z.record(z.any())\n  })\n  export type LastEditedTimePropertyResponse = z.infer<\n    typeof LastEditedTimePropertyResponseSchema\n  >\n\n  export const LastEditedByPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('last_edited_by'),\n    last_edited_by: z.record(z.any())\n  })\n  export type LastEditedByPropertyResponse = z.infer<\n    typeof LastEditedByPropertyResponseSchema\n  >\n\n  export const PartialUserObjectResponseSchema = z.object({\n    object: z.literal('user'),\n    id: z.string()\n  })\n  export type PartialUserObjectResponse = z.infer<\n    typeof PartialUserObjectResponseSchema\n  >\n\n  export const AnnotationResponseSchema = z.object({\n    bold: z.boolean(),\n    italic: z.boolean(),\n    strikethrough: z.boolean(),\n    underline: z.boolean(),\n    code: z.boolean(),\n    color: z.enum([\n      'default',\n      'gray',\n      'brown',\n      'orange',\n      'yellow',\n      'green',\n      'blue',\n      'purple',\n      'pink',\n      'red',\n      'gray_background',\n      'brown_background',\n      'orange_background',\n      'yellow_background',\n      'green_background',\n      'blue_background',\n      'purple_background',\n      'pink_background',\n      'red_background'\n    ])\n  })\n  export type AnnotationResponse = z.infer<typeof AnnotationResponseSchema>\n\n  export const DateResponseSchema = z.object({\n    start: z.string(),\n    end: z.union([z.string(), z.null()]),\n    time_zone: z.union([z.string(), z.null()])\n  })\n  export type DateResponse = z.infer<typeof DateResponseSchema>\n\n  export const PropertyUpdateSchemaSchema = z.object({\n    name: z.string().optional(),\n    type: z.string().optional()\n  })\n  export type PropertyUpdateSchema = z.infer<typeof PropertyUpdateSchemaSchema>\n\n  export const TextPropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    does_not_equal: z.string().optional(),\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    starts_with: z.string().optional(),\n    ends_with: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type TextPropertyFilter = z.infer<typeof TextPropertyFilterSchema>\n\n  export const NumberPropertyFilterSchema = z.object({\n    equals: z.number().optional(),\n    does_not_equal: z.number().optional(),\n    greater_than: z.number().optional(),\n    less_than: z.number().optional(),\n    greater_than_or_equal_to: z.number().optional(),\n    less_than_or_equal_to: z.number().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type NumberPropertyFilter = z.infer<typeof NumberPropertyFilterSchema>\n\n  export const CheckboxPropertyFilterSchema = z.object({\n    equals: z.boolean().optional(),\n    does_not_equal: z.boolean().optional()\n  })\n  export type CheckboxPropertyFilter = z.infer<\n    typeof CheckboxPropertyFilterSchema\n  >\n\n  export const SelectPropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    does_not_equal: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type SelectPropertyFilter = z.infer<typeof SelectPropertyFilterSchema>\n\n  export const MultiSelectPropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type MultiSelectPropertyFilter = z.infer<\n    typeof MultiSelectPropertyFilterSchema\n  >\n\n  export const DatePropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    before: z.string().optional(),\n    after: z.string().optional(),\n    on_or_before: z.string().optional(),\n    on_or_after: z.string().optional(),\n    past_week: z.any().optional(),\n    past_month: z.any().optional(),\n    past_year: z.any().optional(),\n    next_week: z.any().optional(),\n    next_month: z.any().optional(),\n    next_year: z.any().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type DatePropertyFilter = z.infer<typeof DatePropertyFilterSchema>\n\n  export const PeoplePropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type PeoplePropertyFilter = z.infer<typeof PeoplePropertyFilterSchema>\n\n  export const FilesPropertyFilterSchema = z.object({\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type FilesPropertyFilter = z.infer<typeof FilesPropertyFilterSchema>\n\n  export const RelationPropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type RelationPropertyFilter = z.infer<\n    typeof RelationPropertyFilterSchema\n  >\n\n  export const PropertySchemaSchema = z.object({\n    type: z.string(),\n    name: z.union([z.string(), z.null()]).optional()\n  })\n  export type PropertySchema = z.infer<typeof PropertySchemaSchema>\n\n  export const SearchParametersSchema = z.object({\n    query: z.string().optional(),\n    sort: z\n      .object({\n        direction: z.enum(['ascending', 'descending']),\n        timestamp: z.literal('last_edited_time')\n      })\n      .optional(),\n    filter: z\n      .object({\n        value: z.enum(['page', 'database']),\n        property: z.literal('object')\n      })\n      .optional(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type SearchParameters = z.infer<typeof SearchParametersSchema>\n\n  export const PartialCommentObjectResponseSchema = z.object({\n    object: z.literal('comment'),\n    id: z.string()\n  })\n  export type PartialCommentObjectResponse = z.infer<\n    typeof PartialCommentObjectResponseSchema\n  >\n\n  export const OauthTokenParametersSchema = z.object({\n    grant_type: z.string(),\n    code: z.string(),\n    redirect_uri: z.string().optional(),\n    external_account: z.object({ key: z.string(), name: z.string() }).optional()\n  })\n  export type OauthTokenParameters = z.infer<typeof OauthTokenParametersSchema>\n\n  export const ListUsersResponseSchema = z.object({\n    results: z.array(UserObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListUsersResponse = z.infer<typeof ListUsersResponseSchema>\n\n  export const PropertyItemListResponseSchema = z.object({\n    results: z.array(PropertyItemObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type PropertyItemListResponse = z.infer<\n    typeof PropertyItemListResponseSchema\n  >\n\n  export const SelectPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('select'),\n    select: z.object({ options: z.array(SelectOptionSchema) })\n  })\n  export type SelectPropertyResponse = z.infer<\n    typeof SelectPropertyResponseSchema\n  >\n\n  export const MultiSelectPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('multi_select'),\n    multi_select: z.object({ options: z.array(SelectOptionSchema) })\n  })\n  export type MultiSelectPropertyResponse = z.infer<\n    typeof MultiSelectPropertyResponseSchema\n  >\n\n  export const TextRichTextItemResponseSchema = z.object({\n    type: z.literal('text'),\n    text: z.object({\n      content: z.string(),\n      link: z.union([z.object({ url: z.string() }), z.null()])\n    }),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type TextRichTextItemResponse = z.infer<\n    typeof TextRichTextItemResponseSchema\n  >\n\n  export const EquationRichTextItemResponseSchema = z.object({\n    type: z.literal('equation'),\n    equation: z.object({ expression: z.string() }),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type EquationRichTextItemResponse = z.infer<\n    typeof EquationRichTextItemResponseSchema\n  >\n\n  export const ListBlockChildrenResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PartialBlockObjectResponseSchema, BlockObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListBlockChildrenResponse = z.infer<\n    typeof ListBlockChildrenResponseSchema\n  >\n\n  export const AppendBlockChildrenResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PartialBlockObjectResponseSchema, BlockObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type AppendBlockChildrenResponse = z.infer<\n    typeof AppendBlockChildrenResponseSchema\n  >\n\n  export const QueryDatabaseResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PageObjectResponseSchema, PartialPageObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type QueryDatabaseResponse = z.infer<\n    typeof QueryDatabaseResponseSchema\n  >\n\n  export const OauthTokenResponseSchema = z.object({\n    access_token: z.string(),\n    token_type: z.literal('bearer'),\n    bot_id: z.string(),\n    workspace_name: z.union([z.string(), z.null()]),\n    workspace_icon: z.union([z.string(), z.null()]),\n    workspace_id: z.string(),\n    owner: z.union([\n      z.object({\n        type: z.literal('user'),\n        user: z.union([\n          UserObjectResponseSchema,\n          PartialUserObjectResponseSchema\n        ])\n      }),\n      z.object({ type: z.literal('workspace'), workspace: z.literal(true) })\n    ]),\n    duplicated_template_id: z.union([z.string(), z.null()])\n  })\n  export type OauthTokenResponse = z.infer<typeof OauthTokenResponseSchema>\n\n  export const RichTextItemRequestSchema = z.union([\n    z.object({\n      text: z.object({\n        content: z.string(),\n        link: z.union([z.object({ url: z.string() }), z.null()]).optional()\n      }),\n      type: z.literal('text').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    }),\n    z.object({\n      mention: z.union([\n        z.object({\n          user: z.union([\n            z.object({ id: z.string() }),\n            UserObjectResponseSchema\n          ])\n        }),\n        z.object({ page: z.object({ id: z.string() }) }),\n        z.object({ database: z.object({ id: z.string() }) }),\n        z.object({ date: DateRequestSchema })\n      ]),\n      type: z.literal('mention').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    }),\n    z.object({\n      equation: z.object({ expression: z.string() }),\n      type: z.literal('equation').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    })\n  ])\n  export type RichTextItemRequest = z.infer<typeof RichTextItemRequestSchema>\n\n  export const CreatePageParametersSchema = z.object({\n    parent: z\n      .record(z.any())\n      .and(\n        z.union([\n          z.object({ type: z.literal('page_id'), page_id: z.string() }),\n          z.object({ type: z.literal('database_id'), database_id: z.string() })\n        ])\n      ),\n    properties: z.record(\n      z.union([\n        z.object({ title: z.array(RichTextItemRequestSchema) }),\n        z.object({ rich_text: z.array(RichTextItemRequestSchema) }),\n        z.object({ number: z.union([z.number(), z.null()]) }),\n        z.object({\n          select: z.union([z.object({ name: z.string() }), z.null()])\n        })\n      ])\n    )\n  })\n  export type CreatePageParameters = z.infer<typeof CreatePageParametersSchema>\n\n  export const UpdatePageParametersSchema = z.object({\n    properties: z\n      .record(\n        z.union([\n          z.object({ title: z.array(RichTextItemRequestSchema) }),\n          z.object({ rich_text: z.array(RichTextItemRequestSchema) }),\n          z.object({ number: z.union([z.number(), z.null()]) }),\n          z.object({\n            select: z.union([z.object({ name: z.string() }), z.null()])\n          })\n        ])\n      )\n      .optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdatePageParameters = z.infer<typeof UpdatePageParametersSchema>\n\n  export const UpdateBlockParametersSchema = z.object({\n    paragraph: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_1: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_2: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_3: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    bulleted_list_item: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    numbered_list_item: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    quote: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    to_do: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        checked: z.boolean().optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    toggle: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    code: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        language: z.string().optional()\n      })\n      .optional(),\n    embed: z.object({ url: z.string().optional() }).optional(),\n    image: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    video: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    file: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    pdf: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    bookmark: z.object({ url: z.string().optional() }).optional(),\n    equation: z.object({ expression: z.string().optional() }).optional(),\n    divider: z.record(z.any()).optional(),\n    table_of_contents: z.object({ color: z.string().optional() }).optional(),\n    breadcrumb: z.record(z.any()).optional(),\n    column_list: z.record(z.any()).optional(),\n    column: z.record(z.any()).optional(),\n    link_to_page: z\n      .object({\n        type: z.enum(['page_id', 'database_id']).optional(),\n        page_id: z.string().optional(),\n        database_id: z.string().optional()\n      })\n      .optional(),\n    table_row: z\n      .object({ cells: z.array(z.array(RichTextItemRequestSchema)).optional() })\n      .optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdateBlockParameters = z.infer<\n    typeof UpdateBlockParametersSchema\n  >\n\n  export const BlockObjectRequestSchema = z.union([\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('paragraph'),\n      paragraph: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_1'),\n      heading_1: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_2'),\n      heading_2: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_3'),\n      heading_3: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('bulleted_list_item'),\n      bulleted_list_item: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('numbered_list_item'),\n      numbered_list_item: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('to_do'),\n      to_do: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        checked: z.boolean(),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('toggle'),\n      toggle: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('code'),\n      code: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        language: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('child_page'),\n      child_page: z.object({ title: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('child_database'),\n      child_database: z.object({ title: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('embed'),\n      embed: z.object({\n        url: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('image'),\n      image: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('video'),\n      video: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('file'),\n      file: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('pdf'),\n      pdf: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('bookmark'),\n      bookmark: z.object({\n        url: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('equation'),\n      equation: z.object({ expression: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('divider'),\n      divider: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table_of_contents'),\n      table_of_contents: z.object({ color: z.string().optional() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('column_list'),\n      column_list: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('column'),\n      column: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('link_to_page'),\n      link_to_page: z.union([\n        z.object({ type: z.literal('page_id'), page_id: z.string() }),\n        z.object({ type: z.literal('database_id'), database_id: z.string() })\n      ])\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table'),\n      table: z.object({\n        table_width: z.number().int(),\n        has_column_header: z.boolean().optional(),\n        has_row_header: z.boolean().optional(),\n        children: z.array(\n          // TODO: Support recursive types for `BlockObjectRequestSchema`.\n          z.any()\n        )\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table_row'),\n      table_row: z.object({\n        cells: z.array(z.array(RichTextItemRequestSchema))\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('synced_block'),\n      synced_block: z.object({\n        synced_from: z\n          .union([\n            z.object({ type: z.literal('block_id'), block_id: z.string() }),\n            z.null()\n          ])\n          .optional(),\n        children: z\n          .array(\n            // TODO: Support recursive types for `BlockObjectRequestSchema`.\n            z.any()\n          )\n          .optional()\n      })\n    })\n  ])\n  export type BlockObjectRequest = z.infer<typeof BlockObjectRequestSchema>\n\n  export const MentionRichTextItemResponseSchema = z.object({\n    type: z.literal('mention'),\n    mention: z.union([\n      z.object({\n        type: z.literal('user'),\n        user: z.union([\n          PartialUserObjectResponseSchema,\n          UserObjectResponseSchema\n        ])\n      }),\n      z.object({ type: z.literal('date'), date: DateResponseSchema }),\n      z.object({\n        type: z.literal('link_preview'),\n        link_preview: z.object({ url: z.string() })\n      }),\n      z.object({ type: z.literal('page'), page: z.object({ id: z.string() }) }),\n      z.object({\n        type: z.literal('database'),\n        database: z.object({ id: z.string() })\n      })\n    ]),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type MentionRichTextItemResponse = z.infer<\n    typeof MentionRichTextItemResponseSchema\n  >\n\n  export const CreateCommentParametersSchema = z.union([\n    z.object({\n      parent: z.object({\n        page_id: z.string(),\n        type: z.literal('page_id').optional()\n      }),\n      rich_text: z.array(RichTextItemRequestSchema)\n    }),\n    z.object({\n      discussion_id: z.string(),\n      rich_text: z.array(RichTextItemRequestSchema)\n    })\n  ])\n  export type CreateCommentParameters = z.infer<\n    typeof CreateCommentParametersSchema\n  >\n\n  export const AppendBlockChildrenParametersSchema = z.object({\n    children: z.array(BlockObjectRequestSchema)\n  })\n  export type AppendBlockChildrenParameters = z.infer<\n    typeof AppendBlockChildrenParametersSchema\n  >\n\n  export const UpdateDatabaseParametersSchema = z.object({\n    title: z.array(RichTextItemRequestSchema).optional(),\n    description: z.array(RichTextItemRequestSchema).optional(),\n    icon: z\n      .union([\n        z.object({ emoji: z.string(), type: z.literal('emoji') }),\n        z.object({\n          external: z.object({ url: z.string() }),\n          type: z.literal('external')\n        }),\n        z.null()\n      ])\n      .optional(),\n    cover: z\n      .union([\n        z.object({\n          external: z.object({ url: z.string() }),\n          type: z.literal('external')\n        }),\n        z.null()\n      ])\n      .optional(),\n    properties: z.record(PropertyUpdateSchemaSchema).optional(),\n    is_inline: z.boolean().optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdateDatabaseParameters = z.infer<\n    typeof UpdateDatabaseParametersSchema\n  >\n\n  export const CreateDatabaseParametersSchema = z.object({\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('database_id'), database_id: z.string() })\n    ]),\n    properties: z.record(PropertySchemaSchema),\n    icon: z\n      .union([\n        z.object({ type: z.literal('emoji'), emoji: z.string() }),\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    cover: z\n      .union([\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    title: z.array(RichTextItemRequestSchema),\n    description: z.array(RichTextItemRequestSchema).optional(),\n    is_inline: z.boolean().optional()\n  })\n  export type CreateDatabaseParameters = z.infer<\n    typeof CreateDatabaseParametersSchema\n  >\n\n  export const RichTextItemResponseSchema = z.union([\n    TextRichTextItemResponseSchema,\n    MentionRichTextItemResponseSchema,\n    EquationRichTextItemResponseSchema\n  ])\n  export type RichTextItemResponse = z.infer<typeof RichTextItemResponseSchema>\n\n  export const CommentObjectResponseSchema = z.object({\n    object: z.literal('comment'),\n    id: z.string(),\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('block_id'), block_id: z.string() })\n    ]),\n    discussion_id: z.string(),\n    rich_text: z.array(RichTextItemResponseSchema),\n    created_by: PartialUserObjectResponseSchema,\n    created_time: z.string(),\n    last_edited_time: z.string()\n  })\n  export type CommentObjectResponse = z.infer<\n    typeof CommentObjectResponseSchema\n  >\n\n  export const PropertyFilterSchema = z.union([\n    z.object({ property: z.string(), title: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), rich_text: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), number: NumberPropertyFilterSchema }),\n    z.object({ property: z.string(), checkbox: CheckboxPropertyFilterSchema }),\n    z.object({ property: z.string(), select: SelectPropertyFilterSchema }),\n    z.object({\n      property: z.string(),\n      multi_select: MultiSelectPropertyFilterSchema\n    }),\n    z.object({ property: z.string(), date: DatePropertyFilterSchema }),\n    z.object({ property: z.string(), people: PeoplePropertyFilterSchema }),\n    z.object({ property: z.string(), files: FilesPropertyFilterSchema }),\n    z.object({ property: z.string(), url: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), email: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), phone_number: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), relation: RelationPropertyFilterSchema }),\n    z.object({ property: z.string(), created_by: PeoplePropertyFilterSchema }),\n    z.object({ property: z.string(), created_time: DatePropertyFilterSchema }),\n    z.object({\n      property: z.string(),\n      last_edited_by: PeoplePropertyFilterSchema\n    }),\n    z.object({\n      property: z.string(),\n      last_edited_time: DatePropertyFilterSchema\n    }),\n    z.object({\n      timestamp: z.enum(['created_time', 'last_edited_time']),\n      created_time: DatePropertyFilterSchema\n    }),\n    z.object({\n      timestamp: z.enum(['created_time', 'last_edited_time']),\n      last_edited_time: DatePropertyFilterSchema\n    })\n  ])\n  export type PropertyFilter = z.infer<typeof PropertyFilterSchema>\n\n  export const ListCommentsResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(CommentObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListCommentsResponse = z.infer<typeof ListCommentsResponseSchema>\n\n  export const CompoundFilterSchema = z.object({\n    and: z.array(PropertyFilterSchema).optional(),\n    or: z.array(PropertyFilterSchema).optional()\n  })\n  export type CompoundFilter = z.infer<typeof CompoundFilterSchema>\n\n  export const QueryDatabaseParametersSchema = z.object({\n    sorts: z\n      .array(\n        z.union([\n          z.object({\n            property: z.string(),\n            direction: z.enum(['ascending', 'descending'])\n          }),\n          z.object({\n            timestamp: z.enum(['created_time', 'last_edited_time']),\n            direction: z.enum(['ascending', 'descending'])\n          })\n        ])\n      )\n      .optional(),\n    filter: z.union([PropertyFilterSchema, CompoundFilterSchema]).optional(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional(),\n    archived: z.boolean().optional()\n  })\n  export type QueryDatabaseParameters = z.infer<\n    typeof QueryDatabaseParametersSchema\n  >\n\n  export const DatabasePropertyConfigResponseSchema = z.union([\n    TitlePropertyResponseSchema,\n    RichTextPropertyResponseSchema,\n    NumberPropertyResponseSchema,\n    SelectPropertyResponseSchema,\n    MultiSelectPropertyResponseSchema,\n    DatePropertyResponseSchema,\n    PeoplePropertyResponseSchema,\n    FilePropertyResponseSchema,\n    CheckboxPropertyResponseSchema,\n    UrlPropertyResponseSchema,\n    EmailPropertyResponseSchema,\n    PhoneNumberPropertyResponseSchema,\n    FormulaPropertyResponseSchema,\n    RelationPropertyResponseSchema,\n    RollupPropertyResponseSchema,\n    CreatedTimePropertyResponseSchema,\n    CreatedByPropertyResponseSchema,\n    LastEditedTimePropertyResponseSchema,\n    LastEditedByPropertyResponseSchema\n  ])\n  export type DatabasePropertyConfigResponse = z.infer<\n    typeof DatabasePropertyConfigResponseSchema\n  >\n\n  export const PartialDatabaseObjectResponseSchema = z.object({\n    object: z.literal('database'),\n    id: z.string(),\n    properties: z.record(DatabasePropertyConfigResponseSchema)\n  })\n  export type PartialDatabaseObjectResponse = z.infer<\n    typeof PartialDatabaseObjectResponseSchema\n  >\n\n  export const DatabaseObjectResponseSchema = z.object({\n    object: z.literal('database'),\n    id: z.string(),\n    cover: z\n      .union([\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    icon: z\n      .union([\n        z.object({ type: z.literal('emoji'), emoji: z.string() }),\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    created_time: z.string(),\n    created_by: PartialUserObjectResponseSchema,\n    last_edited_time: z.string(),\n    last_edited_by: PartialUserObjectResponseSchema,\n    title: z.array(RichTextItemResponseSchema),\n    description: z.array(RichTextItemResponseSchema),\n    is_inline: z.boolean(),\n    properties: z.record(DatabasePropertyConfigResponseSchema),\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('workspace'), workspace: z.literal(true) })\n    ]),\n    url: z.string(),\n    archived: z.boolean()\n  })\n  export type DatabaseObjectResponse = z.infer<\n    typeof DatabaseObjectResponseSchema\n  >\n\n  export const ListDatabasesResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([\n        PartialDatabaseObjectResponseSchema,\n        DatabaseObjectResponseSchema\n      ])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListDatabasesResponse = z.infer<\n    typeof ListDatabasesResponseSchema\n  >\n\n  export const SearchResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([\n        PageObjectResponseSchema,\n        PartialPageObjectResponseSchema,\n        PartialDatabaseObjectResponseSchema,\n        DatabaseObjectResponseSchema\n      ])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type SearchResponse = z.infer<typeof SearchResponseSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetSelfParamsSchema = z.object({})\n  export type GetSelfParams = z.infer<typeof GetSelfParamsSchema>\n\n  export const GetSelfResponseSchema = UserObjectResponseSchema\n  export type GetSelfResponse = z.infer<typeof GetSelfResponseSchema>\n\n  export const GetUserParamsSchema = z.object({ user_id: z.string() })\n  export type GetUserParams = z.infer<typeof GetUserParamsSchema>\n\n  export const GetUserResponseSchema = UserObjectResponseSchema\n  export type GetUserResponse = z.infer<typeof GetUserResponseSchema>\n\n  export const ListUsersParamsSchema = z.object({\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListUsersParams = z.infer<typeof ListUsersParamsSchema>\n\n  export const CreatePageParamsSchema = CreatePageParametersSchema\n  export type CreatePageParams = z.infer<typeof CreatePageParamsSchema>\n\n  export const CreatePageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type CreatePageResponse = z.infer<typeof CreatePageResponseSchema>\n\n  export const GetPageParamsSchema = z.object({\n    page_id: z.string(),\n    filter_properties: z.array(z.string()).optional()\n  })\n  export type GetPageParams = z.infer<typeof GetPageParamsSchema>\n\n  export const GetPageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type GetPageResponse = z.infer<typeof GetPageResponseSchema>\n\n  export const UpdatePageParamsSchema = z\n    .object({ page_id: z.string() })\n    .merge(UpdatePageParametersSchema)\n  export type UpdatePageParams = z.infer<typeof UpdatePageParamsSchema>\n\n  export const UpdatePageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type UpdatePageResponse = z.infer<typeof UpdatePageResponseSchema>\n\n  export const GetPagePropertyParamsSchema = z.object({\n    page_id: z.string(),\n    property_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type GetPagePropertyParams = z.infer<\n    typeof GetPagePropertyParamsSchema\n  >\n\n  export const GetPagePropertyResponseSchema = z.union([\n    PropertyItemObjectResponseSchema,\n    PropertyItemListResponseSchema\n  ])\n  export type GetPagePropertyResponse = z.infer<\n    typeof GetPagePropertyResponseSchema\n  >\n\n  export const GetBlockParamsSchema = z.object({ block_id: z.string() })\n  export type GetBlockParams = z.infer<typeof GetBlockParamsSchema>\n\n  export const GetBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type GetBlockResponse = z.infer<typeof GetBlockResponseSchema>\n\n  export const DeleteBlockParamsSchema = z.object({ block_id: z.string() })\n  export type DeleteBlockParams = z.infer<typeof DeleteBlockParamsSchema>\n\n  export const DeleteBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type DeleteBlockResponse = z.infer<typeof DeleteBlockResponseSchema>\n\n  export const UpdateBlockParamsSchema = z\n    .object({ block_id: z.string() })\n    .merge(UpdateBlockParametersSchema)\n  export type UpdateBlockParams = z.infer<typeof UpdateBlockParamsSchema>\n\n  export const UpdateBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type UpdateBlockResponse = z.infer<typeof UpdateBlockResponseSchema>\n\n  export const ListBlockChildrenParamsSchema = z.object({\n    block_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListBlockChildrenParams = z.infer<\n    typeof ListBlockChildrenParamsSchema\n  >\n\n  export const AppendBlockChildrenParamsSchema = z\n    .object({ block_id: z.string() })\n    .merge(AppendBlockChildrenParametersSchema)\n  export type AppendBlockChildrenParams = z.infer<\n    typeof AppendBlockChildrenParamsSchema\n  >\n\n  export const GetDatabaseParamsSchema = z.object({ database_id: z.string() })\n  export type GetDatabaseParams = z.infer<typeof GetDatabaseParamsSchema>\n\n  export const GetDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type GetDatabaseResponse = z.infer<typeof GetDatabaseResponseSchema>\n\n  export const UpdateDatabaseParamsSchema = z\n    .object({ database_id: z.string() })\n    .merge(UpdateDatabaseParametersSchema)\n  export type UpdateDatabaseParams = z.infer<typeof UpdateDatabaseParamsSchema>\n\n  export const UpdateDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type UpdateDatabaseResponse = z.infer<\n    typeof UpdateDatabaseResponseSchema\n  >\n\n  export const QueryDatabaseParamsSchema = z\n    .object({\n      database_id: z.string(),\n      filter_properties: z.array(z.string()).optional()\n    })\n    .merge(QueryDatabaseParametersSchema)\n  export type QueryDatabaseParams = z.infer<typeof QueryDatabaseParamsSchema>\n\n  export const ListDatabasesParamsSchema = z.object({\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListDatabasesParams = z.infer<typeof ListDatabasesParamsSchema>\n\n  export const CreateDatabaseParamsSchema = CreateDatabaseParametersSchema\n  export type CreateDatabaseParams = z.infer<typeof CreateDatabaseParamsSchema>\n\n  export const CreateDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type CreateDatabaseResponse = z.infer<\n    typeof CreateDatabaseResponseSchema\n  >\n\n  export const SearchParamsSchema = SearchParametersSchema\n  export type SearchParams = z.infer<typeof SearchParamsSchema>\n\n  export const ListCommentsParamsSchema = z.object({\n    block_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListCommentsParams = z.infer<typeof ListCommentsParamsSchema>\n\n  export const CreateCommentParamsSchema = CreateCommentParametersSchema\n  export type CreateCommentParams = z.infer<typeof CreateCommentParamsSchema>\n\n  export const CreateCommentResponseSchema = z.union([\n    CommentObjectResponseSchema,\n    PartialCommentObjectResponseSchema\n  ])\n  export type CreateCommentResponse = z.infer<\n    typeof CreateCommentResponseSchema\n  >\n\n  export const OauthTokenParamsSchema = OauthTokenParametersSchema\n  export type OauthTokenParams = z.infer<typeof OauthTokenParamsSchema>\n}\n"
  },
  {
    "path": "legacy/packages/notion/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/novu/package.json",
    "content": "{\n  \"name\": \"@agentic/novu\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Novu notifications API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/novu\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/novu/src/index.ts",
    "content": "export * from './novu-client'\n"
  },
  {
    "path": "legacy/packages/novu/src/novu-client.ts",
    "content": "import { aiFunction, AIFunctionsProvider, assert, getEnv } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace novu {\n  export const API_BASE_URL = 'https://api.novu.co/v1'\n\n  /**\n   * Novu subscriber object.\n   */\n  export type Subscriber = {\n    /**\n     * Unique identifier for the subscriber. This can be any value that is meaningful to your application such as a user ID stored in your database or a unique email address.\n     */\n    subscriberId: string\n\n    /**\n     * Email address of the subscriber.\n     */\n    email?: string\n\n    /**\n     * First name of the subscriber.\n     */\n    firstName?: string\n\n    /**\n     * Last name of the subscriber.\n     */\n    lastName?: string\n\n    /**\n     * Phone number of the subscriber.\n     */\n    phone?: string\n  }\n\n  /**\n   * Response from the Novu API when triggering an event.\n   *\n   * @see {@link https://docs.novu.co/api/client-libraries#trigger-event}\n   */\n  export type TriggerEventResponse = {\n    /**\n     * Data about the triggered event.\n     */\n    data: {\n      /**\n       * Whether the trigger was acknowledged or not.\n       */\n      acknowledged?: boolean\n\n      /**\n       * Status for trigger.\n       */\n      status?: string\n\n      /**\n       * Transaction id for trigger.\n       */\n      transactionId?: string\n\n      /**\n       * In case of an error, this field will contain the error message.\n       */\n      error?: Array<any>\n    }\n  }\n\n  /**\n   * Options for triggering an event in Novu.\n   */\n  export type TriggerOptions = {\n    /**\n     * Name of the event to trigger. This should match the name of an existing notification template in Novu.\n     */\n    name: string\n\n    /**\n     * Payload to use for the event. This will be used to populate any handlebars placeholders in the notification template.\n     */\n    payload: Record<string, unknown>\n\n    /**\n     * List of subscribers to send the notification to. Each subscriber must at least have a unique `subscriberId` to identify them in Novu and, if not already known to Novu, an `email` address or `phone` number depending on the notification template being used.\n     */\n    to: Subscriber[]\n  }\n}\n\n/**\n * The Novu API provides a router for sending notifications across different\n * channels like Email, SMS, Chat, In-App, and Push.\n *\n * @see https://novu.co\n */\nexport class NovuClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('NOVU_API_KEY'),\n    apiBaseUrl = novu.API_BASE_URL,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'NovuClient missing required \"apiKey\" (defaults to \"NOVU_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl,\n      headers: {\n        Authorization: `ApiKey ${this.apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Triggers an event in Novu.\n   *\n   * @see https://docs.novu.co/api-reference/events/trigger-event\n   */\n  @aiFunction({\n    name: 'novu_trigger_event',\n    description:\n      'Sends a notification to a person given their novu `subscriberId` and an `email` or `phone` number. Useful for sending emails or SMS text messages to people.',\n    inputSchema: z.object({\n      name: z.string(),\n      // TODO: make this more\n      payload: z.record(z.any()),\n      to: z.array(\n        z.object({\n          subscriberId: z.string(),\n          email: z.string().optional(),\n          firstName: z.string().optional(),\n          lastName: z.string().optional(),\n          phone: z.string().optional()\n        })\n      )\n    })\n  })\n  async triggerEvent(options: novu.TriggerOptions) {\n    return this.ky\n      .post('events/trigger', {\n        json: options\n      })\n      .json<novu.TriggerEventResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/novu/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/open-meteo/package.json",
    "content": "{\n  \"name\": \"@agentic/open-meteo\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Open-Meteo weather API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/open-meteo\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/open-meteo/src/index.ts",
    "content": "export * from './open-meteo'\nexport * from './open-meteo-client'\n"
  },
  {
    "path": "legacy/packages/open-meteo/src/open-meteo-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  getEnv,\n  omit,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { openmeteo } from './open-meteo'\n\n/**\n * Agentic OpenMeteo weather client.\n *\n * Open-Meteo offers free weather forecast APIs for open-source developers\n * and non-commercial use.\n *\n * @note The API key is optional.\n *\n * @see https://open-meteo.com/en/docs\n */\nexport class OpenMeteoClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string | undefined\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('OPEN_METEO_API_KEY'),\n    apiBaseUrl = openmeteo.apiBaseUrl,\n    timeoutMs = 60_000,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      ...(apiKey\n        ? {\n            headers: {\n              Authorization: `Bearer ${apiKey}`\n            }\n          }\n        : {})\n    })\n  }\n\n  /**\n   * Gets the 7-day weather variables in hourly and daily resolution for given\n   * WGS84 latitude and longitude coordinates. Available worldwide.\n   */\n  @aiFunction({\n    name: 'open_meteo_get_forecast',\n    description: `Gets the 7-day weather forecast in hourly and daily resolution for given location. Available worldwide.`,\n    inputSchema: openmeteo.GetV1ForecastParamsSchema\n  })\n  async getForecast(\n    params: openmeteo.GetV1ForecastParams\n  ): Promise<openmeteo.GetV1ForecastResponse> {\n    const extractLocation = async (): Promise<openmeteo.Location> => {\n      if ('name' in params.location) {\n        const response = await this._geocode(params.location)\n        return pick(response, 'latitude', 'longitude')\n      }\n\n      return params.location\n    }\n\n    const { start, end } = validateAndSetDates(params.startDate, params.endDate)\n\n    const response = await this.ky\n      .get('forecast', {\n        searchParams: sanitizeSearchParams({\n          ...(await extractLocation()),\n          temperature_unit: params.temperatureUnit,\n          start_date: toDateString(start),\n          end_date: toDateString(end),\n          current: [\n            'temperature_2m',\n            'rain',\n            'relative_humidity_2m',\n            'wind_speed_10m'\n          ],\n          daily: ['temperature_2m_max', 'temperature_2m_min', 'rain_sum'],\n          hourly: ['temperature_2m', 'relative_humidity_2m', 'rain'],\n          timezone: 'UTC'\n        })\n      })\n      .json<openmeteo.GetV1ForecastResponse>()\n\n    return omit(\n      response,\n      'latitude',\n      'longitude',\n      'elevation',\n      'generationtime_ms',\n      'utc_offset_seconds',\n      'timezone',\n      'timezone_abbreviation',\n      'elevation',\n      'hourly',\n      'hourly_units'\n    )\n  }\n\n  protected async _geocode(\n    location: openmeteo.LocationSearch\n  ): Promise<openmeteo.Location> {\n    const { results } = await this.ky\n      .get('search', {\n        searchParams: sanitizeSearchParams({\n          name: location.name,\n          language: location.language,\n          country: location.country,\n          format: 'json',\n          count: 1\n        })\n      })\n      .json<any>()\n\n    if (!results?.length) {\n      throw new Error(`No results found for location \"${location.name}\"`)\n    }\n\n    return results[0]\n  }\n}\n\nfunction toDateString(date: Date): string {\n  return date.toISOString().split('T')[0]!\n}\n\nfunction validateAndSetDates(\n  startDateStr: string,\n  endDateStr?: string\n): { start: Date; end: Date } {\n  const now = new Date()\n  const start = startDateStr\n    ? new Date(startDateStr)\n    : new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()))\n\n  if (endDateStr) {\n    const end = new Date(endDateStr)\n    if (end < start) {\n      throw new Error(\n        `The 'end_date' (${endDateStr}) has to occur on or after the 'start_date' (${startDateStr}).`\n      )\n    }\n    return { start, end }\n  } else {\n    // If endDate is undefined, set it to the start date\n    return { start, end: new Date(start) }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/open-meteo/src/open-meteo.ts",
    "content": "import { z } from 'zod'\n\nexport namespace openmeteo {\n  export const apiBaseUrl = 'https://api.open-meteo.com/v1'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  /** For each selected weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps. */\n  export const HourlyResponseSchema = z\n    .object({\n      time: z.array(z.string()),\n      temperature_2m: z.array(z.number()).optional(),\n      relative_humidity_2m: z.array(z.number()).optional(),\n      dew_point_2m: z.array(z.number()).optional(),\n      apparent_temperature: z.array(z.number()).optional(),\n      pressure_msl: z.array(z.number()).optional(),\n      cloud_cover: z.array(z.number()).optional(),\n      cloud_cover_low: z.array(z.number()).optional(),\n      cloud_cover_mid: z.array(z.number()).optional(),\n      cloud_cover_high: z.array(z.number()).optional(),\n      wind_speed_10m: z.array(z.number()).optional(),\n      wind_speed_80m: z.array(z.number()).optional(),\n      wind_speed_120m: z.array(z.number()).optional(),\n      wind_speed_180m: z.array(z.number()).optional(),\n      wind_direction_10m: z.array(z.number()).optional(),\n      wind_direction_80m: z.array(z.number()).optional(),\n      wind_direction_120m: z.array(z.number()).optional(),\n      wind_direction_180m: z.array(z.number()).optional(),\n      wind_gusts_10m: z.array(z.number()).optional(),\n      shortwave_radiation: z.array(z.number()).optional(),\n      direct_radiation: z.array(z.number()).optional(),\n      direct_normal_irradiance: z.array(z.number()).optional(),\n      diffuse_radiation: z.array(z.number()).optional(),\n      vapour_pressure_deficit: z.array(z.number()).optional(),\n      evapotranspiration: z.array(z.number()).optional(),\n      precipitation: z.array(z.number()).optional(),\n      weather_code: z.array(z.number()).optional(),\n      snow_height: z.array(z.number()).optional(),\n      freezing_level_height: z.array(z.number()).optional(),\n      soil_temperature_0cm: z.array(z.number()).optional(),\n      soil_temperature_6cm: z.array(z.number()).optional(),\n      soil_temperature_18cm: z.array(z.number()).optional(),\n      soil_temperature_54cm: z.array(z.number()).optional(),\n      soil_moisture_0_1cm: z.array(z.number()).optional(),\n      soil_moisture_1_3cm: z.array(z.number()).optional(),\n      soil_moisture_3_9cm: z.array(z.number()).optional(),\n      soil_moisture_9_27cm: z.array(z.number()).optional(),\n      soil_moisture_27_81cm: z.array(z.number()).optional()\n    })\n    .describe(\n      'For each selected weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.'\n    )\n  export type HourlyResponse = z.infer<typeof HourlyResponseSchema>\n\n  /** For each selected daily weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps. */\n  export const DailyResponseSchema = z\n    .object({\n      time: z.array(z.string()),\n      temperature_2m_max: z.array(z.number()).optional(),\n      temperature_2m_min: z.array(z.number()).optional(),\n      apparent_temperature_max: z.array(z.number()).optional(),\n      apparent_temperature_min: z.array(z.number()).optional(),\n      precipitation_sum: z.array(z.number()).optional(),\n      precipitation_hours: z.array(z.number()).optional(),\n      weather_code: z.array(z.number()).optional(),\n      sunrise: z.array(z.number()).optional(),\n      sunset: z.array(z.number()).optional(),\n      wind_speed_10m_max: z.array(z.number()).optional(),\n      wind_gusts_10m_max: z.array(z.number()).optional(),\n      wind_direction_10m_dominant: z.array(z.number()).optional(),\n      shortwave_radiation_sum: z.array(z.number()).optional(),\n      uv_index_max: z.array(z.number()).optional(),\n      uv_index_clear_sky_max: z.array(z.number()).optional(),\n      et0_fao_evapotranspiration: z.array(z.number()).optional()\n    })\n    .describe(\n      'For each selected daily weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.'\n    )\n  export type DailyResponse = z.infer<typeof DailyResponseSchema>\n\n  /** Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code */\n  export const CurrentWeatherSchema = z\n    .object({\n      time: z.string(),\n      temperature: z.number(),\n      wind_speed: z.number(),\n      wind_direction: z.number(),\n      weather_code: z.number().int()\n    })\n    .describe(\n      'Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code'\n    )\n  export type CurrentWeather = z.infer<typeof CurrentWeatherSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetV1ForecastParamsSchema = z.object({\n    location: z.union([\n      z\n        .object({\n          name: z.string().min(1),\n          country: z.string().optional(),\n          language: z.string().default('English')\n        })\n        .strip(),\n      z\n        .object({\n          latitude: z.coerce.number(),\n          longitude: z.coerce.number()\n        })\n        .strip()\n    ]),\n    startDate: z\n      .string()\n      .date()\n      .describe(\n        'Start date for the weather forecast in the format YYYY-MM-DD (UTC)'\n      ),\n    endDate: z\n      .string()\n      .date()\n      .describe(\n        'End date for the weather forecast in the format YYYY-MM-DD (UTC)'\n      )\n      .optional(),\n    temperatureUnit: z.enum(['celsius', 'fahrenheit']).default('fahrenheit')\n  })\n  export type GetV1ForecastParams = z.infer<typeof GetV1ForecastParamsSchema>\n\n  export const GetV1ForecastResponseSchema = z.object({\n    /** WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. */\n    latitude: z\n      .number()\n      .describe(\n        'WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.'\n      )\n      .optional(),\n    /** WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. */\n    longitude: z\n      .number()\n      .describe(\n        'WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.'\n      )\n      .optional(),\n    /** The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect. */\n    elevation: z\n      .number()\n      .describe(\n        'The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.'\n      )\n      .optional(),\n    /** Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements. */\n    generationtime_ms: z\n      .number()\n      .describe(\n        'Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.'\n      )\n      .optional(),\n    /** Applied timezone offset from the &timezone= parameter. */\n    utc_offset_seconds: z\n      .number()\n      .int()\n      .describe('Applied timezone offset from the &timezone= parameter.')\n      .optional(),\n    hourly: HourlyResponseSchema.optional(),\n    /** For each selected weather variable, the unit will be listed here. */\n    hourly_units: z\n      .record(z.string())\n      .describe(\n        'For each selected weather variable, the unit will be listed here.'\n      )\n      .optional(),\n    daily: DailyResponseSchema.optional(),\n    /** For each selected daily weather variable, the unit will be listed here. */\n    daily_units: z\n      .record(z.string())\n      .describe(\n        'For each selected daily weather variable, the unit will be listed here.'\n      )\n      .optional(),\n    current_weather: CurrentWeatherSchema.optional()\n  })\n  export type GetV1ForecastResponse = z.infer<\n    typeof GetV1ForecastResponseSchema\n  >\n\n  export interface Location {\n    latitude: number\n    longitude: number\n  }\n\n  export interface LocationSearch {\n    name: string\n    country?: string\n    language?: string\n  }\n}\n"
  },
  {
    "path": "legacy/packages/open-meteo/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/bin/openapi-to-ts.ts",
    "content": "#!/usr/bin/env node\n\nimport { cli } from 'cleye'\nimport { gracefulExit } from 'exit-hook'\n\nimport { generateTSFromOpenAPI } from '../src'\n\nasync function main() {\n  const args = cli(\n    {\n      name: 'openapi-to-ts',\n      parameters: ['<openapi file path>'],\n      flags: {\n        debug: {\n          type: Boolean,\n          description: 'Enables verbose debug logging',\n          alias: 'v',\n          default: false\n        },\n        outputDir: {\n          type: String,\n          description: 'Path to the output directory (defaults to cwd)',\n          alias: 'o'\n        },\n        dryRun: {\n          type: Boolean,\n          description: 'Disables all side effects',\n          default: false\n        },\n        noPrettier: {\n          type: Boolean,\n          description: 'Disables prettier formatting',\n          default: false\n        },\n        noEslint: {\n          type: Boolean,\n          description: 'Disables eslint formatting',\n          default: false\n        },\n        noZodJsDocs: {\n          type: Boolean,\n          description: 'Disables js docs for zod schemas',\n          default: false\n        }\n      }\n    },\n    () => {},\n    process.argv\n  )\n\n  const openapiFilePath = args._[2]!\n\n  if (!openapiFilePath) {\n    console.error('Missing required argument: <openapi file path>\\n')\n    args.showHelp()\n    gracefulExit(1)\n    return\n  }\n\n  if (Object.keys(args.unknownFlags).length) {\n    console.error(\n      'Unknown flags:',\n      Object.keys(args.unknownFlags).join(', '),\n      '\\n'\n    )\n    args.showHelp()\n    gracefulExit(1)\n    return\n  }\n\n  const output = await generateTSFromOpenAPI({\n    openapiFilePath,\n    outputDir: args.flags.outputDir || process.cwd(),\n    dryRun: args.flags.dryRun,\n    prettier: !args.flags.noPrettier,\n    eslint: !args.flags.noEslint,\n    zodSchemaJsDocs: !args.flags.noZodJsDocs\n  })\n\n  if (args.flags.dryRun) {\n    console.log(output)\n  }\n}\n\ntry {\n  await main()\n  gracefulExit(0)\n} catch (err) {\n  console.error(err)\n  gracefulExit(1)\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/firecrawl-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  pick\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { firecrawl } from './firecrawl'\n\n/**\n * Agentic Firecrawl client.\n *\n * API for interacting with Firecrawl services to perform web scraping and crawling tasks.\n */\nexport class FirecrawlClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('FIRECRAWL_API_KEY'),\n    apiBaseUrl = firecrawl.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'FirecrawlClient missing required \"apiKey\" (defaults to \"FIRECRAWL_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: apiKey\n      }\n    })\n  }\n\n  /**\n   * Scrape a single URL.\n   */\n  @aiFunction({\n    name: 'firecrawl_scrape',\n    description: `Scrape a single URL.`,\n    inputSchema: firecrawl.ScrapeParamsSchema,\n    tags: ['Scraping']\n  })\n  async scrape(\n    params: firecrawl.ScrapeParams\n  ): Promise<firecrawl.ScrapeResponse> {\n    return this.ky\n      .post('/scrape', {\n        json: pick(\n          params,\n          'url',\n          'formats',\n          'headers',\n          'includeTags',\n          'excludeTags',\n          'onlyMainContent',\n          'timeout',\n          'waitFor'\n        )\n      })\n      .json<firecrawl.ScrapeResponse>()\n  }\n\n  /**\n   * Crawl multiple URLs based on options.\n   */\n  @aiFunction({\n    name: 'firecrawl_crawl_urls',\n    description: `Crawl multiple URLs based on options.`,\n    inputSchema: firecrawl.CrawlUrlsParamsSchema,\n    tags: ['Crawling']\n  })\n  async crawlUrls(\n    params: firecrawl.CrawlUrlsParams\n  ): Promise<firecrawl.CrawlUrlsResponse> {\n    return this.ky\n      .post('/crawl', {\n        json: pick(params, 'url', 'crawlerOptions', 'pageOptions')\n      })\n      .json<firecrawl.CrawlUrlsResponse>()\n  }\n\n  /**\n   * Search for a keyword in Google, returns top page results with markdown content for each page.\n   */\n  @aiFunction({\n    name: 'firecrawl_search_google',\n    description: `Search for a keyword in Google, returns top page results with markdown content for each page.`,\n    inputSchema: firecrawl.SearchGoogleParamsSchema,\n    tags: ['Search']\n  })\n  async searchGoogle(\n    params: firecrawl.SearchGoogleParams\n  ): Promise<firecrawl.SearchGoogleResponse> {\n    return this.ky\n      .post('/search', {\n        json: pick(params, 'query', 'pageOptions', 'searchOptions')\n      })\n      .json<firecrawl.SearchGoogleResponse>()\n  }\n\n  /**\n   * Get the status of a crawl job.\n   */\n  @aiFunction({\n    name: 'firecrawl_get_crawl_status',\n    description: `Get the status of a crawl job.`,\n    inputSchema: firecrawl.GetCrawlStatusParamsSchema,\n    tags: ['Crawl']\n  })\n  async getCrawlStatus(\n    params: firecrawl.GetCrawlStatusParams\n  ): Promise<firecrawl.GetCrawlStatusResponse> {\n    return this.ky\n      .get(`/crawl/status/${params.jobId}`)\n      .json<firecrawl.GetCrawlStatusResponse>()\n  }\n\n  /**\n   * Cancel a crawl job.\n   */\n  @aiFunction({\n    name: 'firecrawl_cancel_crawl_job',\n    description: `Cancel a crawl job.`,\n    inputSchema: firecrawl.CancelCrawlJobParamsSchema,\n    tags: ['Crawl']\n  })\n  async cancelCrawlJob(\n    params: firecrawl.CancelCrawlJobParams\n  ): Promise<firecrawl.CancelCrawlJobResponse> {\n    return this.ky\n      .delete(`/crawl/cancel/${params.jobId}`)\n      .json<firecrawl.CancelCrawlJobResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/firecrawl.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace firecrawl {\n  export const apiBaseUrl = 'https://api.firecrawl.dev/v0'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const ScrapeResponseSchema = z.object({\n    success: z.boolean().optional(),\n    /** Warning message to let you know of any issues. */\n    warning: z\n      .string()\n      .describe('Warning message to let you know of any issues.')\n      .optional(),\n    data: z\n      .object({\n        /** Markdown content of the page if the `markdown` format was specified (default) */\n        markdown: z\n          .string()\n          .describe(\n            'Markdown content of the page if the `markdown` format was specified (default)'\n          )\n          .optional(),\n        /** HTML version of the content on page if the `html` format was specified */\n        html: z\n          .string()\n          .describe(\n            'HTML version of the content on page if the `html` format was specified'\n          )\n          .optional(),\n        /** Raw HTML content of the page if the `rawHtml` format was specified */\n        rawHtml: z\n          .string()\n          .describe(\n            'Raw HTML content of the page if the `rawHtml` format was specified'\n          )\n          .optional(),\n        /** Links on the page if the `links` format was specified */\n        links: z\n          .array(z.string().url())\n          .describe('Links on the page if the `links` format was specified')\n          .optional(),\n        /** URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified */\n        screenshot: z\n          .string()\n          .describe(\n            'URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified'\n          )\n          .optional(),\n        metadata: z\n          .object({\n            title: z.string().optional(),\n            description: z.string().optional(),\n            language: z.string().optional(),\n            sourceURL: z.string().url().optional(),\n            '<any other metadata> ': z.string().optional(),\n            /** The status code of the page */\n            statusCode: z\n              .number()\n              .int()\n              .describe('The status code of the page')\n              .optional(),\n            /** The error message of the page */\n            error: z\n              .string()\n              .describe('The error message of the page')\n              .optional()\n          })\n          .optional()\n      })\n      .optional()\n  })\n  export type ScrapeResponse = z.infer<typeof ScrapeResponseSchema>\n\n  export const CrawlResponseSchema = z.object({\n    success: z.boolean().optional(),\n    id: z.string().optional(),\n    url: z.string().url().optional()\n  })\n  export type CrawlResponse = z.infer<typeof CrawlResponseSchema>\n\n  export const SearchResponseSchema = z.object({\n    success: z.boolean().optional(),\n    data: z.array(z.any()).optional()\n  })\n  export type SearchResponse = z.infer<typeof SearchResponseSchema>\n\n  export const CrawlStatusResponseObjSchema = z.object({\n    /** Markdown content of the page if the `markdown` format was specified (default) */\n    markdown: z\n      .string()\n      .describe(\n        'Markdown content of the page if the `markdown` format was specified (default)'\n      )\n      .optional(),\n    /** HTML version of the content on page if the `html` format was specified */\n    html: z\n      .string()\n      .describe(\n        'HTML version of the content on page if the `html` format was specified'\n      )\n      .optional(),\n    /** Raw HTML content of the page if the `rawHtml` format was specified */\n    rawHtml: z\n      .string()\n      .describe(\n        'Raw HTML content of the page if the `rawHtml` format was specified'\n      )\n      .optional(),\n    /** Links on the page if the `links` format was specified */\n    links: z\n      .array(z.string().url())\n      .describe('Links on the page if the `links` format was specified')\n      .optional(),\n    /** URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified */\n    screenshot: z\n      .string()\n      .describe(\n        'URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified'\n      )\n      .optional(),\n    metadata: z\n      .object({\n        title: z.string().optional(),\n        description: z.string().optional(),\n        language: z.string().optional(),\n        sourceURL: z.string().url().optional(),\n        '<any other metadata> ': z.string().optional(),\n        /** The status code of the page */\n        statusCode: z\n          .number()\n          .int()\n          .describe('The status code of the page')\n          .optional(),\n        /** The error message of the page */\n        error: z.string().describe('The error message of the page').optional()\n      })\n      .optional()\n  })\n  export type CrawlStatusResponseObj = z.infer<\n    typeof CrawlStatusResponseObjSchema\n  >\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const ScrapeParamsSchema = z.object({\n    /** The URL to scrape */\n    url: z.string().url().describe('The URL to scrape'),\n    /**\n     * Specific formats to return.\n     *\n     *  - markdown: The page in Markdown format.\n     *  - html: The page's HTML, trimmed to include only meaningful content.\n     *  - rawHtml: The page's original HTML.\n     *  - links: The links on the page.\n     *  - screenshot: A screenshot of the top of the page.\n     *  - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\n     */\n    formats: z\n      .array(\n        z.enum([\n          'markdown',\n          'html',\n          'rawHtml',\n          'links',\n          'screenshot',\n          'screenshot@fullPage'\n        ])\n      )\n      .describe(\n        \"Specific formats to return.\\n\\n - markdown: The page in Markdown format.\\n - html: The page's HTML, trimmed to include only meaningful content.\\n - rawHtml: The page's original HTML.\\n - links: The links on the page.\\n - screenshot: A screenshot of the top of the page.\\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\"\n      )\n      .default(['markdown']),\n    /** Headers to send with the request. Can be used to send cookies, user-agent, etc. */\n    headers: z\n      .record(z.any())\n      .describe(\n        'Headers to send with the request. Can be used to send cookies, user-agent, etc.'\n      )\n      .optional(),\n    /** Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer' */\n    includeTags: z\n      .array(z.string())\n      .describe(\n        \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n      )\n      .optional(),\n    /** Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer' */\n    excludeTags: z\n      .array(z.string())\n      .describe(\n        \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n      )\n      .optional(),\n    /** Only return the main content of the page excluding headers, navs, footers, etc. */\n    onlyMainContent: z\n      .boolean()\n      .describe(\n        'Only return the main content of the page excluding headers, navs, footers, etc.'\n      )\n      .default(true),\n    /** Timeout in milliseconds for the request */\n    timeout: z\n      .number()\n      .int()\n      .describe('Timeout in milliseconds for the request')\n      .default(30_000),\n    /** Wait x amount of milliseconds for the page to load to fetch content */\n    waitFor: z\n      .number()\n      .int()\n      .describe(\n        'Wait x amount of milliseconds for the page to load to fetch content'\n      )\n      .default(0)\n  })\n  export type ScrapeParams = z.infer<typeof ScrapeParamsSchema>\n\n  export const CrawlUrlsParamsSchema = z.object({\n    /** The base URL to start crawling from */\n    url: z.string().url().describe('The base URL to start crawling from'),\n    crawlerOptions: z\n      .object({\n        /** URL patterns to include */\n        includes: z\n          .array(z.string())\n          .describe('URL patterns to include')\n          .optional(),\n        /** URL patterns to exclude */\n        excludes: z\n          .array(z.string())\n          .describe('URL patterns to exclude')\n          .optional(),\n        /** Generate alt text for images using LLMs (must have a paid plan) */\n        generateImgAltText: z\n          .boolean()\n          .describe(\n            'Generate alt text for images using LLMs (must have a paid plan)'\n          )\n          .default(false),\n        /** If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents. */\n        returnOnlyUrls: z\n          .boolean()\n          .describe(\n            'If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.'\n          )\n          .default(false),\n        /** Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern. */\n        maxDepth: z\n          .number()\n          .int()\n          .describe(\n            'Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.'\n          )\n          .optional(),\n        /** The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites. */\n        mode: z\n          .enum(['default', 'fast'])\n          .describe(\n            \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\"\n          )\n          .default('default'),\n        /** Ignore the website sitemap when crawling */\n        ignoreSitemap: z\n          .boolean()\n          .describe('Ignore the website sitemap when crawling')\n          .default(false),\n        /** Maximum number of pages to crawl */\n        limit: z\n          .number()\n          .int()\n          .describe('Maximum number of pages to crawl')\n          .default(10_000),\n        /** Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product' */\n        allowBackwardCrawling: z\n          .boolean()\n          .describe(\n            \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\"\n          )\n          .default(false),\n        /** Allows the crawler to follow links to external websites. */\n        allowExternalContentLinks: z\n          .boolean()\n          .describe('Allows the crawler to follow links to external websites.')\n          .default(false)\n      })\n      .optional(),\n    pageOptions: z\n      .object({\n        /** Headers to send with the request. Can be used to send cookies, user-agent, etc. */\n        headers: z\n          .record(z.any())\n          .describe(\n            'Headers to send with the request. Can be used to send cookies, user-agent, etc.'\n          )\n          .optional(),\n        /** Include the HTML version of the content on page. Will output a html key in the response. */\n        includeHtml: z\n          .boolean()\n          .describe(\n            'Include the HTML version of the content on page. Will output a html key in the response.'\n          )\n          .default(false),\n        /** Include the raw HTML content of the page. Will output a rawHtml key in the response. */\n        includeRawHtml: z\n          .boolean()\n          .describe(\n            'Include the raw HTML content of the page. Will output a rawHtml key in the response.'\n          )\n          .default(false),\n        /** Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer' */\n        onlyIncludeTags: z\n          .array(z.string())\n          .describe(\n            \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n          )\n          .optional(),\n        /** Only return the main content of the page excluding headers, navs, footers, etc. */\n        onlyMainContent: z\n          .boolean()\n          .describe(\n            'Only return the main content of the page excluding headers, navs, footers, etc.'\n          )\n          .default(false),\n        /** Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer' */\n        removeTags: z\n          .array(z.string())\n          .describe(\n            \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n          )\n          .optional(),\n        /** Replace all relative paths with absolute paths for images and links */\n        replaceAllPathsWithAbsolutePaths: z\n          .boolean()\n          .describe(\n            'Replace all relative paths with absolute paths for images and links'\n          )\n          .default(false),\n        /** Include a screenshot of the top of the page that you are scraping. */\n        screenshot: z\n          .boolean()\n          .describe(\n            'Include a screenshot of the top of the page that you are scraping.'\n          )\n          .default(false),\n        /** Include a full page screenshot of the page that you are scraping. */\n        fullPageScreenshot: z\n          .boolean()\n          .describe(\n            'Include a full page screenshot of the page that you are scraping.'\n          )\n          .default(false),\n        /** Wait x amount of milliseconds for the page to load to fetch content */\n        waitFor: z\n          .number()\n          .int()\n          .describe(\n            'Wait x amount of milliseconds for the page to load to fetch content'\n          )\n          .default(0)\n      })\n      .optional()\n  })\n  export type CrawlUrlsParams = z.infer<typeof CrawlUrlsParamsSchema>\n\n  export const CrawlUrlsResponseSchema = CrawlResponseSchema\n  export type CrawlUrlsResponse = z.infer<typeof CrawlUrlsResponseSchema>\n\n  export const SearchGoogleParamsSchema = z.object({\n    /** The query to search for */\n    query: z.string().url().describe('The query to search for'),\n    pageOptions: z\n      .object({\n        /** Only return the main content of the page excluding headers, navs, footers, etc. */\n        onlyMainContent: z\n          .boolean()\n          .describe(\n            'Only return the main content of the page excluding headers, navs, footers, etc.'\n          )\n          .default(false),\n        /** Fetch the content of each page. If false, defaults to a basic fast serp API. */\n        fetchPageContent: z\n          .boolean()\n          .describe(\n            'Fetch the content of each page. If false, defaults to a basic fast serp API.'\n          )\n          .default(true),\n        /** Include the HTML version of the content on page. Will output a html key in the response. */\n        includeHtml: z\n          .boolean()\n          .describe(\n            'Include the HTML version of the content on page. Will output a html key in the response.'\n          )\n          .default(false),\n        /** Include the raw HTML content of the page. Will output a rawHtml key in the response. */\n        includeRawHtml: z\n          .boolean()\n          .describe(\n            'Include the raw HTML content of the page. Will output a rawHtml key in the response.'\n          )\n          .default(false)\n      })\n      .optional(),\n    searchOptions: z\n      .object({\n        /** Maximum number of results. Max is 20 during beta. */\n        limit: z\n          .number()\n          .int()\n          .describe('Maximum number of results. Max is 20 during beta.')\n          .optional()\n      })\n      .optional()\n  })\n  export type SearchGoogleParams = z.infer<typeof SearchGoogleParamsSchema>\n\n  export const SearchGoogleResponseSchema = SearchResponseSchema\n  export type SearchGoogleResponse = z.infer<typeof SearchGoogleResponseSchema>\n\n  export const GetCrawlStatusParamsSchema = z.object({\n    /** ID of the crawl job */\n    jobId: z.string().describe('ID of the crawl job')\n  })\n  export type GetCrawlStatusParams = z.infer<typeof GetCrawlStatusParamsSchema>\n\n  export const GetCrawlStatusResponseSchema = z.object({\n    /** Status of the job (completed, active, failed, paused) */\n    status: z\n      .string()\n      .describe('Status of the job (completed, active, failed, paused)')\n      .optional(),\n    /** Current page number */\n    current: z.number().int().describe('Current page number').optional(),\n    /** Total number of pages */\n    total: z.number().int().describe('Total number of pages').optional(),\n    /** Data returned from the job (null when it is in progress) */\n    data: z\n      .array(CrawlStatusResponseObjSchema)\n      .describe('Data returned from the job (null when it is in progress)')\n      .optional(),\n    /** Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in `data`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array. */\n    partial_data: z\n      .array(CrawlStatusResponseObjSchema)\n      .describe(\n        'Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in `data`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.'\n      )\n      .optional()\n  })\n  export type GetCrawlStatusResponse = z.infer<\n    typeof GetCrawlStatusResponseSchema\n  >\n\n  export const CancelCrawlJobParamsSchema = z.object({\n    /** ID of the crawl job */\n    jobId: z.string().describe('ID of the crawl job')\n  })\n  export type CancelCrawlJobParams = z.infer<typeof CancelCrawlJobParamsSchema>\n\n  export const CancelCrawlJobResponseSchema = z.object({\n    /** Returns cancelled. */\n    status: z.string().describe('Returns cancelled.').optional()\n  })\n  export type CancelCrawlJobResponse = z.infer<\n    typeof CancelCrawlJobResponseSchema\n  >\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/github-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { github } from './github'\n\n/**\n * Agentic Github client.\n *\n * GitHub's v3 REST API.\n */\nexport class GithubClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = github.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n   * Get Hypermedia links to resources accessible in GitHub's REST API.\n   */\n  @aiFunction({\n    name: 'github_meta_root',\n    description: `Get Hypermedia links to resources accessible in GitHub's REST API.`,\n    inputSchema: github.MetaRootParamsSchema,\n    tags: ['meta']\n  })\n  async metaRoot(\n    _params: github.MetaRootParams\n  ): Promise<github.MetaRootResponse> {\n    return this.ky.get('/').json<github.MetaRootResponse>()\n  }\n\n  /**\n * Lists all global security advisories that match the specified parameters. If no other parameters are defined, the request will return only GitHub-reviewed advisories that are not malware.\n\nBy default, all responses will exclude advisories for malware, because malware are not standard vulnerabilities. To list advisories for malware, you must include the `type` parameter in your request, with the value `malware`. For more information about the different types of security advisories, see \"[About the GitHub Advisory database](https://docs.github.com/code-security/security-advisories/global-security-advisories/about-the-github-advisory-database#about-types-of-security-advisories).\".\n */\n  @aiFunction({\n    name: 'github_security_advisories_list_global_advisories',\n    description: `Lists all global security advisories that match the specified parameters. If no other parameters are defined, the request will return only GitHub-reviewed advisories that are not malware.\n\nBy default, all responses will exclude advisories for malware, because malware are not standard vulnerabilities. To list advisories for malware, you must include the \\`type\\` parameter in your request, with the value \\`malware\\`. For more information about the different types of security advisories, see \"[About the GitHub Advisory database](https://docs.github.com/code-security/security-advisories/global-security-advisories/about-the-github-advisory-database#about-types-of-security-advisories).\".`,\n    inputSchema: github.SecurityAdvisoriesListGlobalAdvisoriesParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesListGlobalAdvisories(\n    params: github.SecurityAdvisoriesListGlobalAdvisoriesParams\n  ): Promise<github.SecurityAdvisoriesListGlobalAdvisoriesResponse> {\n    return this.ky\n      .get('/advisories', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'ghsa_id',\n            'type',\n            'cve_id',\n            'ecosystem',\n            'severity',\n            'cwes',\n            'is_withdrawn',\n            'affects',\n            'published',\n            'updated',\n            'modified',\n            'epss_percentage',\n            'epss_percentile',\n            'before',\n            'after',\n            'direction',\n            'per_page',\n            'sort'\n          )\n        )\n      })\n      .json<github.SecurityAdvisoriesListGlobalAdvisoriesResponse>()\n  }\n\n  /**\n   * Gets a global security advisory using its GitHub Security Advisory (GHSA) identifier.\n   */\n  @aiFunction({\n    name: 'github_security_advisories_get_global_advisory',\n    description: `Gets a global security advisory using its GitHub Security Advisory (GHSA) identifier.`,\n    inputSchema: github.SecurityAdvisoriesGetGlobalAdvisoryParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesGetGlobalAdvisory(\n    params: github.SecurityAdvisoriesGetGlobalAdvisoryParams\n  ): Promise<github.SecurityAdvisoriesGetGlobalAdvisoryResponse> {\n    return this.ky\n      .get(`/advisories/${params.ghsa_id}`)\n      .json<github.SecurityAdvisoriesGetGlobalAdvisoryResponse>()\n  }\n\n  /**\n * Returns the GitHub App associated with the authentication credentials used. To see how many app installations are associated with this GitHub App, see the `installations_count` in the response. For more details about your app's installations, see the \"[List installations for the authenticated app](https://docs.github.com/rest/apps/apps#list-installations-for-the-authenticated-app)\" endpoint.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_authenticated',\n    description: `Returns the GitHub App associated with the authentication credentials used. To see how many app installations are associated with this GitHub App, see the \\`installations_count\\` in the response. For more details about your app's installations, see the \"[List installations for the authenticated app](https://docs.github.com/rest/apps/apps#list-installations-for-the-authenticated-app)\" endpoint.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsGetAuthenticatedParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetAuthenticated(\n    _params: github.AppsGetAuthenticatedParams\n  ): Promise<github.AppsGetAuthenticatedResponse> {\n    return this.ky.get('/app').json<github.AppsGetAuthenticatedResponse>()\n  }\n\n  /**\n   * Use this endpoint to complete the handshake necessary when implementing the [GitHub App Manifest flow](https://docs.github.com/apps/building-github-apps/creating-github-apps-from-a-manifest/). When you create a GitHub App with the manifest flow, you receive a temporary `code` used to retrieve the GitHub App's `id`, `pem` (private key), and `webhook_secret`.\n   */\n  @aiFunction({\n    name: 'github_apps_create_from_manifest',\n    description: `Use this endpoint to complete the handshake necessary when implementing the [GitHub App Manifest flow](https://docs.github.com/apps/building-github-apps/creating-github-apps-from-a-manifest/). When you create a GitHub App with the manifest flow, you receive a temporary \\`code\\` used to retrieve the GitHub App's \\`id\\`, \\`pem\\` (private key), and \\`webhook_secret\\`.`,\n    inputSchema: github.AppsCreateFromManifestParamsSchema,\n    tags: ['apps']\n  })\n  async appsCreateFromManifest(\n    params: github.AppsCreateFromManifestParams\n  ): Promise<github.AppsCreateFromManifestResponse> {\n    return this.ky\n      .post(`/app-manifests/${params.code}/conversions`)\n      .json<github.AppsCreateFromManifestResponse>()\n  }\n\n  /**\n * Returns the webhook configuration for a GitHub App. For more information about configuring a webhook for your app, see \"[Creating a GitHub App](/developers/apps/creating-a-github-app).\"\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_webhook_config_for_app',\n    description: `Returns the webhook configuration for a GitHub App. For more information about configuring a webhook for your app, see \"[Creating a GitHub App](/developers/apps/creating-a-github-app).\"\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsGetWebhookConfigForAppParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetWebhookConfigForApp(\n    _params: github.AppsGetWebhookConfigForAppParams\n  ): Promise<github.AppsGetWebhookConfigForAppResponse> {\n    return this.ky\n      .get('/app/hook/config')\n      .json<github.AppsGetWebhookConfigForAppResponse>()\n  }\n\n  /**\n * Updates the webhook configuration for a GitHub App. For more information about configuring a webhook for your app, see \"[Creating a GitHub App](/developers/apps/creating-a-github-app).\"\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_update_webhook_config_for_app',\n    description: `Updates the webhook configuration for a GitHub App. For more information about configuring a webhook for your app, see \"[Creating a GitHub App](/developers/apps/creating-a-github-app).\"\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsUpdateWebhookConfigForAppParamsSchema,\n    tags: ['apps']\n  })\n  async appsUpdateWebhookConfigForApp(\n    params: github.AppsUpdateWebhookConfigForAppParams\n  ): Promise<github.AppsUpdateWebhookConfigForAppResponse> {\n    return this.ky\n      .patch('/app/hook/config', {\n        json: pick(params, 'url', 'content_type', 'secret', 'insecure_ssl')\n      })\n      .json<github.AppsUpdateWebhookConfigForAppResponse>()\n  }\n\n  /**\n * Returns a list of webhook deliveries for the webhook configured for a GitHub App.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_list_webhook_deliveries',\n    description: `Returns a list of webhook deliveries for the webhook configured for a GitHub App.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsListWebhookDeliveriesParamsSchema,\n    tags: ['apps']\n  })\n  async appsListWebhookDeliveries(\n    params: github.AppsListWebhookDeliveriesParams\n  ): Promise<github.AppsListWebhookDeliveriesResponse> {\n    return this.ky\n      .get('/app/hook/deliveries', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'cursor'))\n      })\n      .json<github.AppsListWebhookDeliveriesResponse>()\n  }\n\n  /**\n * Returns a delivery for the webhook configured for a GitHub App.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_webhook_delivery',\n    description: `Returns a delivery for the webhook configured for a GitHub App.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsGetWebhookDeliveryParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetWebhookDelivery(\n    params: github.AppsGetWebhookDeliveryParams\n  ): Promise<github.AppsGetWebhookDeliveryResponse> {\n    return this.ky\n      .get(`/app/hook/deliveries/${params.delivery_id}`)\n      .json<github.AppsGetWebhookDeliveryResponse>()\n  }\n\n  /**\n * Redeliver a delivery for the webhook configured for a GitHub App.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_redeliver_webhook_delivery',\n    description: `Redeliver a delivery for the webhook configured for a GitHub App.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsRedeliverWebhookDeliveryParamsSchema,\n    tags: ['apps']\n  })\n  async appsRedeliverWebhookDelivery(\n    params: github.AppsRedeliverWebhookDeliveryParams\n  ): Promise<github.AppsRedeliverWebhookDeliveryResponse> {\n    return this.ky\n      .post(`/app/hook/deliveries/${params.delivery_id}/attempts`)\n      .json<github.AppsRedeliverWebhookDeliveryResponse>()\n  }\n\n  /**\n   * Lists all the pending installation requests for the authenticated GitHub App.\n   */\n  @aiFunction({\n    name: 'github_apps_list_installation_requests_for_authenticated_app',\n    description: `Lists all the pending installation requests for the authenticated GitHub App.`,\n    inputSchema:\n      github.AppsListInstallationRequestsForAuthenticatedAppParamsSchema,\n    tags: ['apps']\n  })\n  async appsListInstallationRequestsForAuthenticatedApp(\n    params: github.AppsListInstallationRequestsForAuthenticatedAppParams\n  ): Promise<github.AppsListInstallationRequestsForAuthenticatedAppResponse> {\n    return this.ky\n      .get('/app/installation-requests', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListInstallationRequestsForAuthenticatedAppResponse>()\n  }\n\n  /**\n * The permissions the installation has are included under the `permissions` key.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_list_installations',\n    description: `The permissions the installation has are included under the \\`permissions\\` key.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsListInstallationsParamsSchema,\n    tags: ['apps']\n  })\n  async appsListInstallations(\n    params: github.AppsListInstallationsParams\n  ): Promise<github.AppsListInstallationsResponse> {\n    return this.ky\n      .get('/app/installations', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'since', 'outdated')\n        )\n      })\n      .json<github.AppsListInstallationsResponse>()\n  }\n\n  /**\n * Enables an authenticated GitHub App to find an installation's information using the installation id.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_installation',\n    description: `Enables an authenticated GitHub App to find an installation's information using the installation id.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsGetInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetInstallation(\n    params: github.AppsGetInstallationParams\n  ): Promise<github.AppsGetInstallationResponse> {\n    return this.ky\n      .get(`/app/installations/${params.installation_id}`)\n      .json<github.AppsGetInstallationResponse>()\n  }\n\n  /**\n * Uninstalls a GitHub App on a user, organization, or business account. If you prefer to temporarily suspend an app's access to your account's resources, then we recommend the \"[Suspend an app installation](https://docs.github.com/rest/apps/apps#suspend-an-app-installation)\" endpoint.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_delete_installation',\n    description: `Uninstalls a GitHub App on a user, organization, or business account. If you prefer to temporarily suspend an app's access to your account's resources, then we recommend the \"[Suspend an app installation](https://docs.github.com/rest/apps/apps#suspend-an-app-installation)\" endpoint.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsDeleteInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsDeleteInstallation(\n    params: github.AppsDeleteInstallationParams\n  ): Promise<github.AppsDeleteInstallationResponse> {\n    return this.ky\n      .delete(`/app/installations/${params.installation_id}`)\n      .json<github.AppsDeleteInstallationResponse>()\n  }\n\n  /**\n * Creates an installation access token that enables a GitHub App to make authenticated API requests for the app's installation on an organization or individual account. Installation tokens expire one hour from the time you create them. Using an expired token produces a status code of `401 - Unauthorized`, and requires creating a new installation token. By default the installation token has access to all repositories that the installation can access.\n\nOptionally, you can use the `repositories` or `repository_ids` body parameters to specify individual repositories that the installation access token can access. If you don't use `repositories` or `repository_ids` to grant access to specific repositories, the installation access token will have access to all repositories that the installation was granted access to. The installation access token cannot be granted access to repositories that the installation was not granted access to. Up to 500 repositories can be listed in this manner.\n\nOptionally, use the `permissions` body parameter to specify the permissions that the installation access token should have. If `permissions` is not specified, the installation access token will have all of the permissions that were granted to the app. The installation access token cannot be granted permissions that the app was not granted.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_create_installation_access_token',\n    description: `Creates an installation access token that enables a GitHub App to make authenticated API requests for the app's installation on an organization or individual account. Installation tokens expire one hour from the time you create them. Using an expired token produces a status code of \\`401 - Unauthorized\\`, and requires creating a new installation token. By default the installation token has access to all repositories that the installation can access.\n\nOptionally, you can use the \\`repositories\\` or \\`repository_ids\\` body parameters to specify individual repositories that the installation access token can access. If you don't use \\`repositories\\` or \\`repository_ids\\` to grant access to specific repositories, the installation access token will have access to all repositories that the installation was granted access to. The installation access token cannot be granted access to repositories that the installation was not granted access to. Up to 500 repositories can be listed in this manner.\n\nOptionally, use the \\`permissions\\` body parameter to specify the permissions that the installation access token should have. If \\`permissions\\` is not specified, the installation access token will have all of the permissions that were granted to the app. The installation access token cannot be granted permissions that the app was not granted.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsCreateInstallationAccessTokenParamsSchema,\n    tags: ['apps']\n  })\n  async appsCreateInstallationAccessToken(\n    params: github.AppsCreateInstallationAccessTokenParams\n  ): Promise<github.AppsCreateInstallationAccessTokenResponse> {\n    return this.ky\n      .post(`/app/installations/${params.installation_id}/access_tokens`, {\n        json: pick(params, 'repositories', 'repository_ids', 'permissions')\n      })\n      .json<github.AppsCreateInstallationAccessTokenResponse>()\n  }\n\n  /**\n * Suspends a GitHub App on a user, organization, or business account, which blocks the app from accessing the account's resources. When a GitHub App is suspended, the app's access to the GitHub API or webhook events is blocked for that account.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_suspend_installation',\n    description: `Suspends a GitHub App on a user, organization, or business account, which blocks the app from accessing the account's resources. When a GitHub App is suspended, the app's access to the GitHub API or webhook events is blocked for that account.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsSuspendInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsSuspendInstallation(\n    params: github.AppsSuspendInstallationParams\n  ): Promise<github.AppsSuspendInstallationResponse> {\n    return this.ky\n      .put(`/app/installations/${params.installation_id}/suspended`)\n      .json<github.AppsSuspendInstallationResponse>()\n  }\n\n  /**\n * Removes a GitHub App installation suspension.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_unsuspend_installation',\n    description: `Removes a GitHub App installation suspension.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsUnsuspendInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsUnsuspendInstallation(\n    params: github.AppsUnsuspendInstallationParams\n  ): Promise<github.AppsUnsuspendInstallationResponse> {\n    return this.ky\n      .delete(`/app/installations/${params.installation_id}/suspended`)\n      .json<github.AppsUnsuspendInstallationResponse>()\n  }\n\n  /**\n * OAuth and GitHub application owners can revoke a grant for their application and a specific user. You must provide a valid OAuth `access_token` as an input parameter and the grant for the token's owner will be deleted.\nDeleting an application's grant will also delete all OAuth tokens associated with the application for the user. Once deleted, the application will have no access to the user's account and will no longer be listed on [the application authorizations settings screen within GitHub](https://github.com/settings/applications#authorized).\n */\n  @aiFunction({\n    name: 'github_apps_delete_authorization',\n    description: `OAuth and GitHub application owners can revoke a grant for their application and a specific user. You must provide a valid OAuth \\`access_token\\` as an input parameter and the grant for the token's owner will be deleted.\nDeleting an application's grant will also delete all OAuth tokens associated with the application for the user. Once deleted, the application will have no access to the user's account and will no longer be listed on [the application authorizations settings screen within GitHub](https://github.com/settings/applications#authorized).`,\n    inputSchema: github.AppsDeleteAuthorizationParamsSchema,\n    tags: ['apps']\n  })\n  async appsDeleteAuthorization(\n    params: github.AppsDeleteAuthorizationParams\n  ): Promise<github.AppsDeleteAuthorizationResponse> {\n    return this.ky\n      .delete(`/applications/${params.client_id}/grant`, {\n        json: pick(params, 'access_token')\n      })\n      .json<github.AppsDeleteAuthorizationResponse>()\n  }\n\n  /**\n   * OAuth applications and GitHub applications with OAuth authorizations can use this API method for checking OAuth token validity without exceeding the normal rate limits for failed login attempts. Authentication works differently with this particular endpoint. Invalid tokens will return `404 NOT FOUND`.\n   */\n  @aiFunction({\n    name: 'github_apps_check_token',\n    description: `OAuth applications and GitHub applications with OAuth authorizations can use this API method for checking OAuth token validity without exceeding the normal rate limits for failed login attempts. Authentication works differently with this particular endpoint. Invalid tokens will return \\`404 NOT FOUND\\`.`,\n    inputSchema: github.AppsCheckTokenParamsSchema,\n    tags: ['apps']\n  })\n  async appsCheckToken(\n    params: github.AppsCheckTokenParams\n  ): Promise<github.AppsCheckTokenResponse> {\n    return this.ky\n      .post(`/applications/${params.client_id}/token`, {\n        json: pick(params, 'access_token')\n      })\n      .json<github.AppsCheckTokenResponse>()\n  }\n\n  /**\n   * OAuth  or GitHub application owners can revoke a single token for an OAuth application or a GitHub application with an OAuth authorization.\n   */\n  @aiFunction({\n    name: 'github_apps_delete_token',\n    description: `OAuth  or GitHub application owners can revoke a single token for an OAuth application or a GitHub application with an OAuth authorization.`,\n    inputSchema: github.AppsDeleteTokenParamsSchema,\n    tags: ['apps']\n  })\n  async appsDeleteToken(\n    params: github.AppsDeleteTokenParams\n  ): Promise<github.AppsDeleteTokenResponse> {\n    return this.ky\n      .delete(`/applications/${params.client_id}/token`, {\n        json: pick(params, 'access_token')\n      })\n      .json<github.AppsDeleteTokenResponse>()\n  }\n\n  /**\n   * OAuth applications and GitHub applications with OAuth authorizations can use this API method to reset a valid OAuth token without end-user involvement. Applications must save the \"token\" property in the response because changes take effect immediately. Invalid tokens will return `404 NOT FOUND`.\n   */\n  @aiFunction({\n    name: 'github_apps_reset_token',\n    description: `OAuth applications and GitHub applications with OAuth authorizations can use this API method to reset a valid OAuth token without end-user involvement. Applications must save the \"token\" property in the response because changes take effect immediately. Invalid tokens will return \\`404 NOT FOUND\\`.`,\n    inputSchema: github.AppsResetTokenParamsSchema,\n    tags: ['apps']\n  })\n  async appsResetToken(\n    params: github.AppsResetTokenParams\n  ): Promise<github.AppsResetTokenResponse> {\n    return this.ky\n      .patch(`/applications/${params.client_id}/token`, {\n        json: pick(params, 'access_token')\n      })\n      .json<github.AppsResetTokenResponse>()\n  }\n\n  /**\n * Use a non-scoped user access token to create a repository-scoped and/or permission-scoped user access token. You can specify\nwhich repositories the token can access and which permissions are granted to the\ntoken.\n\nInvalid tokens will return `404 NOT FOUND`.\n */\n  @aiFunction({\n    name: 'github_apps_scope_token',\n    description: `Use a non-scoped user access token to create a repository-scoped and/or permission-scoped user access token. You can specify\nwhich repositories the token can access and which permissions are granted to the\ntoken.\n\nInvalid tokens will return \\`404 NOT FOUND\\`.`,\n    inputSchema: github.AppsScopeTokenParamsSchema,\n    tags: ['apps']\n  })\n  async appsScopeToken(\n    params: github.AppsScopeTokenParams\n  ): Promise<github.AppsScopeTokenResponse> {\n    return this.ky\n      .post(`/applications/${params.client_id}/token/scoped`, {\n        json: pick(\n          params,\n          'access_token',\n          'target',\n          'target_id',\n          'repositories',\n          'repository_ids',\n          'permissions'\n        )\n      })\n      .json<github.AppsScopeTokenResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> The `:app_slug` is just the URL-friendly name of your GitHub App. You can find this on the settings page for your GitHub App (e.g., `https://github.com/settings/apps/:app_slug`).\n */\n  @aiFunction({\n    name: 'github_apps_get_by_slug',\n    description: `> [!NOTE]\n> The \\`:app_slug\\` is just the URL-friendly name of your GitHub App. You can find this on the settings page for your GitHub App (e.g., \\`https://github.com/settings/apps/:app_slug\\`).`,\n    inputSchema: github.AppsGetBySlugParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetBySlug(\n    params: github.AppsGetBySlugParams\n  ): Promise<github.AppsGetBySlugResponse> {\n    return this.ky\n      .get(`/apps/${params.app_slug}`)\n      .json<github.AppsGetBySlugResponse>()\n  }\n\n  /**\n   * Gets a GitHub Classroom assignment. Assignment will only be returned if the current user is an administrator of the GitHub Classroom for the assignment.\n   */\n  @aiFunction({\n    name: 'github_classroom_get_an_assignment',\n    description: `Gets a GitHub Classroom assignment. Assignment will only be returned if the current user is an administrator of the GitHub Classroom for the assignment.`,\n    inputSchema: github.ClassroomGetAnAssignmentParamsSchema,\n    tags: ['classroom']\n  })\n  async classroomGetAnAssignment(\n    params: github.ClassroomGetAnAssignmentParams\n  ): Promise<github.ClassroomGetAnAssignmentResponse> {\n    return this.ky\n      .get(`/assignments/${params.assignment_id}`)\n      .json<github.ClassroomGetAnAssignmentResponse>()\n  }\n\n  /**\n   * Lists any assignment repositories that have been created by students accepting a GitHub Classroom assignment. Accepted assignments will only be returned if the current user is an administrator of the GitHub Classroom for the assignment.\n   */\n  @aiFunction({\n    name: 'github_classroom_list_accepted_assignments_for_an_assignment',\n    description: `Lists any assignment repositories that have been created by students accepting a GitHub Classroom assignment. Accepted assignments will only be returned if the current user is an administrator of the GitHub Classroom for the assignment.`,\n    inputSchema:\n      github.ClassroomListAcceptedAssignmentsForAnAssignmentParamsSchema,\n    tags: ['classroom']\n  })\n  async classroomListAcceptedAssignmentsForAnAssignment(\n    params: github.ClassroomListAcceptedAssignmentsForAnAssignmentParams\n  ): Promise<github.ClassroomListAcceptedAssignmentsForAnAssignmentResponse> {\n    return this.ky\n      .get(`/assignments/${params.assignment_id}/accepted_assignments`, {\n        searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n      })\n      .json<github.ClassroomListAcceptedAssignmentsForAnAssignmentResponse>()\n  }\n\n  /**\n   * Gets grades for a GitHub Classroom assignment. Grades will only be returned if the current user is an administrator of the GitHub Classroom for the assignment.\n   */\n  @aiFunction({\n    name: 'github_classroom_get_assignment_grades',\n    description: `Gets grades for a GitHub Classroom assignment. Grades will only be returned if the current user is an administrator of the GitHub Classroom for the assignment.`,\n    inputSchema: github.ClassroomGetAssignmentGradesParamsSchema,\n    tags: ['classroom']\n  })\n  async classroomGetAssignmentGrades(\n    params: github.ClassroomGetAssignmentGradesParams\n  ): Promise<github.ClassroomGetAssignmentGradesResponse> {\n    return this.ky\n      .get(`/assignments/${params.assignment_id}/grades`)\n      .json<github.ClassroomGetAssignmentGradesResponse>()\n  }\n\n  /**\n   * Lists GitHub Classroom classrooms for the current user. Classrooms will only be returned if the current user is an administrator of one or more GitHub Classrooms.\n   */\n  @aiFunction({\n    name: 'github_classroom_list_classrooms',\n    description: `Lists GitHub Classroom classrooms for the current user. Classrooms will only be returned if the current user is an administrator of one or more GitHub Classrooms.`,\n    inputSchema: github.ClassroomListClassroomsParamsSchema,\n    tags: ['classroom']\n  })\n  async classroomListClassrooms(\n    params: github.ClassroomListClassroomsParams\n  ): Promise<github.ClassroomListClassroomsResponse> {\n    return this.ky\n      .get('/classrooms', {\n        searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n      })\n      .json<github.ClassroomListClassroomsResponse>()\n  }\n\n  /**\n   * Gets a GitHub Classroom classroom for the current user. Classroom will only be returned if the current user is an administrator of the GitHub Classroom.\n   */\n  @aiFunction({\n    name: 'github_classroom_get_a_classroom',\n    description: `Gets a GitHub Classroom classroom for the current user. Classroom will only be returned if the current user is an administrator of the GitHub Classroom.`,\n    inputSchema: github.ClassroomGetAclassroomParamsSchema,\n    tags: ['classroom']\n  })\n  async classroomGetAClassroom(\n    params: github.ClassroomGetAclassroomParams\n  ): Promise<github.ClassroomGetAclassroomResponse> {\n    return this.ky\n      .get(`/classrooms/${params.classroom_id}`)\n      .json<github.ClassroomGetAclassroomResponse>()\n  }\n\n  /**\n   * Lists GitHub Classroom assignments for a classroom. Assignments will only be returned if the current user is an administrator of the GitHub Classroom.\n   */\n  @aiFunction({\n    name: 'github_classroom_list_assignments_for_a_classroom',\n    description: `Lists GitHub Classroom assignments for a classroom. Assignments will only be returned if the current user is an administrator of the GitHub Classroom.`,\n    inputSchema: github.ClassroomListAssignmentsForAclassroomParamsSchema,\n    tags: ['classroom']\n  })\n  async classroomListAssignmentsForAClassroom(\n    params: github.ClassroomListAssignmentsForAclassroomParams\n  ): Promise<github.ClassroomListAssignmentsForAclassroomResponse> {\n    return this.ky\n      .get(`/classrooms/${params.classroom_id}/assignments`, {\n        searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n      })\n      .json<github.ClassroomListAssignmentsForAclassroomResponse>()\n  }\n\n  /**\n   * Returns array of all GitHub's codes of conduct.\n   */\n  @aiFunction({\n    name: 'github_codes_of_conduct_get_all_codes_of_conduct',\n    description: `Returns array of all GitHub's codes of conduct.`,\n    inputSchema: github.CodesOfConductGetAllCodesOfConductParamsSchema,\n    tags: ['codes-of-conduct']\n  })\n  async codesOfConductGetAllCodesOfConduct(\n    _params: github.CodesOfConductGetAllCodesOfConductParams\n  ): Promise<github.CodesOfConductGetAllCodesOfConductResponse> {\n    return this.ky\n      .get('/codes_of_conduct')\n      .json<github.CodesOfConductGetAllCodesOfConductResponse>()\n  }\n\n  /**\n   * Returns information about the specified GitHub code of conduct.\n   */\n  @aiFunction({\n    name: 'github_codes_of_conduct_get_conduct_code',\n    description: `Returns information about the specified GitHub code of conduct.`,\n    inputSchema: github.CodesOfConductGetConductCodeParamsSchema,\n    tags: ['codes-of-conduct']\n  })\n  async codesOfConductGetConductCode(\n    params: github.CodesOfConductGetConductCodeParams\n  ): Promise<github.CodesOfConductGetConductCodeResponse> {\n    return this.ky\n      .get(`/codes_of_conduct/${params.key}`)\n      .json<github.CodesOfConductGetConductCodeResponse>()\n  }\n\n  /**\n   * Lists all the emojis available to use on GitHub.\n   */\n  @aiFunction({\n    name: 'github_emojis_get',\n    description: `Lists all the emojis available to use on GitHub.`,\n    inputSchema: github.EmojisGetParamsSchema,\n    tags: ['emojis']\n  })\n  async emojisGet(\n    _params: github.EmojisGetParams\n  ): Promise<github.EmojisGetResponse> {\n    return this.ky.get('/emojis').json<github.EmojisGetResponse>()\n  }\n\n  /**\n * Lists all code security configurations available in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `read:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_configurations_for_enterprise',\n    description: `Lists all code security configurations available in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:enterprise\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityGetConfigurationsForEnterpriseParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetConfigurationsForEnterprise(\n    params: github.CodeSecurityGetConfigurationsForEnterpriseParams\n  ): Promise<github.CodeSecurityGetConfigurationsForEnterpriseResponse> {\n    return this.ky\n      .get(\n        `/enterprises/${params.enterprise}/code-security/configurations`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'per_page', 'before', 'after')\n          )\n        }\n      )\n      .json<github.CodeSecurityGetConfigurationsForEnterpriseResponse>()\n  }\n\n  /**\n * Creates a code security configuration in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_create_configuration_for_enterprise',\n    description: `Creates a code security configuration in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:enterprise\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodeSecurityCreateConfigurationForEnterpriseParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityCreateConfigurationForEnterprise(\n    params: github.CodeSecurityCreateConfigurationForEnterpriseParams\n  ): Promise<github.CodeSecurityCreateConfigurationForEnterpriseResponse> {\n    return this.ky\n      .post(\n        `/enterprises/${params.enterprise}/code-security/configurations`,\n        {\n          json: pick(\n            params,\n            'name',\n            'description',\n            'advanced_security',\n            'dependency_graph',\n            'dependency_graph_autosubmit_action',\n            'dependency_graph_autosubmit_action_options',\n            'dependabot_alerts',\n            'dependabot_security_updates',\n            'code_scanning_default_setup',\n            'code_scanning_default_setup_options',\n            'code_scanning_delegated_alert_dismissal',\n            'secret_scanning',\n            'secret_scanning_push_protection',\n            'secret_scanning_validity_checks',\n            'secret_scanning_non_provider_patterns',\n            'secret_scanning_generic_secrets',\n            'secret_scanning_delegated_alert_dismissal',\n            'private_vulnerability_reporting',\n            'enforcement'\n          )\n        }\n      )\n      .json<github.CodeSecurityCreateConfigurationForEnterpriseResponse>()\n  }\n\n  /**\n * Lists the default code security configurations for an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `read:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_default_configurations_for_enterprise',\n    description: `Lists the default code security configurations for an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:enterprise\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodeSecurityGetDefaultConfigurationsForEnterpriseParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetDefaultConfigurationsForEnterprise(\n    params: github.CodeSecurityGetDefaultConfigurationsForEnterpriseParams\n  ): Promise<github.CodeSecurityGetDefaultConfigurationsForEnterpriseResponse> {\n    return this.ky\n      .get(\n        `/enterprises/${params.enterprise}/code-security/configurations/defaults`\n      )\n      .json<github.CodeSecurityGetDefaultConfigurationsForEnterpriseResponse>()\n  }\n\n  /**\n * Gets a code security configuration available in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `read:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_single_configuration_for_enterprise',\n    description: `Gets a code security configuration available in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:enterprise\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodeSecurityGetSingleConfigurationForEnterpriseParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetSingleConfigurationForEnterprise(\n    params: github.CodeSecurityGetSingleConfigurationForEnterpriseParams\n  ): Promise<github.CodeSecurityGetSingleConfigurationForEnterpriseResponse> {\n    return this.ky\n      .get(\n        `/enterprises/${params.enterprise}/code-security/configurations/${params.configuration_id}`,\n        {}\n      )\n      .json<github.CodeSecurityGetSingleConfigurationForEnterpriseResponse>()\n  }\n\n  /**\n * Deletes a code security configuration from an enterprise.\nRepositories attached to the configuration will retain their settings but will no longer be associated with\nthe configuration.\n\nThe authenticated user must be an administrator for the enterprise to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_delete_configuration_for_enterprise',\n    description: `Deletes a code security configuration from an enterprise.\nRepositories attached to the configuration will retain their settings but will no longer be associated with\nthe configuration.\n\nThe authenticated user must be an administrator for the enterprise to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:enterprise\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodeSecurityDeleteConfigurationForEnterpriseParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityDeleteConfigurationForEnterprise(\n    params: github.CodeSecurityDeleteConfigurationForEnterpriseParams\n  ): Promise<github.CodeSecurityDeleteConfigurationForEnterpriseResponse> {\n    return this.ky\n      .delete(\n        `/enterprises/${params.enterprise}/code-security/configurations/${params.configuration_id}`,\n        {}\n      )\n      .json<github.CodeSecurityDeleteConfigurationForEnterpriseResponse>()\n  }\n\n  /**\n * Updates a code security configuration in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_update_enterprise_configuration',\n    description: `Updates a code security configuration in an enterprise.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:enterprise\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityUpdateEnterpriseConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityUpdateEnterpriseConfiguration(\n    params: github.CodeSecurityUpdateEnterpriseConfigurationParams\n  ): Promise<github.CodeSecurityUpdateEnterpriseConfigurationResponse> {\n    return this.ky\n      .patch(\n        `/enterprises/${params.enterprise}/code-security/configurations/${params.configuration_id}`,\n        {\n          json: pick(\n            params,\n            'name',\n            'description',\n            'advanced_security',\n            'dependency_graph',\n            'dependency_graph_autosubmit_action',\n            'dependency_graph_autosubmit_action_options',\n            'dependabot_alerts',\n            'dependabot_security_updates',\n            'code_scanning_default_setup',\n            'code_scanning_default_setup_options',\n            'code_scanning_delegated_alert_dismissal',\n            'secret_scanning',\n            'secret_scanning_push_protection',\n            'secret_scanning_validity_checks',\n            'secret_scanning_non_provider_patterns',\n            'secret_scanning_generic_secrets',\n            'secret_scanning_delegated_alert_dismissal',\n            'private_vulnerability_reporting',\n            'enforcement'\n          )\n        }\n      )\n      .json<github.CodeSecurityUpdateEnterpriseConfigurationResponse>()\n  }\n\n  /**\n * Attaches an enterprise code security configuration to repositories. If the repositories specified are already attached to a configuration, they will be re-attached to the provided configuration.\n\nIf insufficient GHAS licenses are available to attach the configuration to a repository, only free features will be enabled.\n\nThe authenticated user must be an administrator for the enterprise to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_attach_enterprise_configuration',\n    description: `Attaches an enterprise code security configuration to repositories. If the repositories specified are already attached to a configuration, they will be re-attached to the provided configuration.\n\nIf insufficient GHAS licenses are available to attach the configuration to a repository, only free features will be enabled.\n\nThe authenticated user must be an administrator for the enterprise to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:enterprise\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityAttachEnterpriseConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityAttachEnterpriseConfiguration(\n    params: github.CodeSecurityAttachEnterpriseConfigurationParams\n  ): Promise<github.CodeSecurityAttachEnterpriseConfigurationResponse> {\n    return this.ky\n      .post(\n        `/enterprises/${params.enterprise}/code-security/configurations/${params.configuration_id}/attach`,\n        {\n          json: pick(params, 'scope')\n        }\n      )\n      .json<github.CodeSecurityAttachEnterpriseConfigurationResponse>()\n  }\n\n  /**\n * Sets a code security configuration as a default to be applied to new repositories in your enterprise.\n\nThis configuration will be applied by default to the matching repository type when created, but only for organizations within the enterprise that do not already have a default code security configuration set.\n\nThe authenticated user must be an administrator for the enterprise to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_set_configuration_as_default_for_enterprise',\n    description: `Sets a code security configuration as a default to be applied to new repositories in your enterprise.\n\nThis configuration will be applied by default to the matching repository type when created, but only for organizations within the enterprise that do not already have a default code security configuration set.\n\nThe authenticated user must be an administrator for the enterprise to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:enterprise\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodeSecuritySetConfigurationAsDefaultForEnterpriseParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecuritySetConfigurationAsDefaultForEnterprise(\n    params: github.CodeSecuritySetConfigurationAsDefaultForEnterpriseParams\n  ): Promise<github.CodeSecuritySetConfigurationAsDefaultForEnterpriseResponse> {\n    return this.ky\n      .put(\n        `/enterprises/${params.enterprise}/code-security/configurations/${params.configuration_id}/defaults`,\n        {\n          json: pick(params, 'default_for_new_repos')\n        }\n      )\n      .json<github.CodeSecuritySetConfigurationAsDefaultForEnterpriseResponse>()\n  }\n\n  /**\n * Lists the repositories associated with an enterprise code security configuration in an organization.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `read:enterprise` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_repositories_for_enterprise_configuration',\n    description: `Lists the repositories associated with an enterprise code security configuration in an organization.\n\nThe authenticated user must be an administrator of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:enterprise\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodeSecurityGetRepositoriesForEnterpriseConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetRepositoriesForEnterpriseConfiguration(\n    params: github.CodeSecurityGetRepositoriesForEnterpriseConfigurationParams\n  ): Promise<github.CodeSecurityGetRepositoriesForEnterpriseConfigurationResponse> {\n    return this.ky\n      .get(\n        `/enterprises/${params.enterprise}/code-security/configurations/${params.configuration_id}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'per_page', 'before', 'after', 'status')\n          )\n        }\n      )\n      .json<github.CodeSecurityGetRepositoriesForEnterpriseConfigurationResponse>()\n  }\n\n  /**\n * Lists Dependabot alerts for repositories that are owned by the specified enterprise.\n\nThe authenticated user must be a member of the enterprise to use this endpoint.\n\nAlerts are only returned for organizations in the enterprise for which you are an organization owner or a security manager. For more information about security managers, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `security_events` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_list_alerts_for_enterprise',\n    description: `Lists Dependabot alerts for repositories that are owned by the specified enterprise.\n\nThe authenticated user must be a member of the enterprise to use this endpoint.\n\nAlerts are only returned for organizations in the enterprise for which you are an organization owner or a security manager. For more information about security managers, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`security_events\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotListAlertsForEnterpriseParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotListAlertsForEnterprise(\n    params: github.DependabotListAlertsForEnterpriseParams\n  ): Promise<github.DependabotListAlertsForEnterpriseResponse> {\n    return this.ky\n      .get(`/enterprises/${params.enterprise}/dependabot/alerts`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'state',\n            'severity',\n            'ecosystem',\n            'package',\n            'epss_percentage',\n            'scope',\n            'sort',\n            'direction',\n            'before',\n            'after',\n            'first',\n            'last',\n            'per_page'\n          )\n        )\n      })\n      .json<github.DependabotListAlertsForEnterpriseResponse>()\n  }\n\n  /**\n * Lists secret scanning alerts for eligible repositories in an enterprise, from newest to oldest.\n\nAlerts are only returned for organizations in the enterprise for which the authenticated user is an organization owner or a [security manager](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\n\nThe authenticated user must be a member of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope or `security_events` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_list_alerts_for_enterprise',\n    description: `Lists secret scanning alerts for eligible repositories in an enterprise, from newest to oldest.\n\nAlerts are only returned for organizations in the enterprise for which the authenticated user is an organization owner or a [security manager](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\n\nThe authenticated user must be a member of the enterprise in order to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope or \\`security_events\\` scope to use this endpoint.`,\n    inputSchema: github.SecretScanningListAlertsForEnterpriseParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningListAlertsForEnterprise(\n    params: github.SecretScanningListAlertsForEnterpriseParams\n  ): Promise<github.SecretScanningListAlertsForEnterpriseResponse> {\n    return this.ky\n      .get(`/enterprises/${params.enterprise}/secret-scanning/alerts`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'state',\n            'secret_type',\n            'resolution',\n            'sort',\n            'direction',\n            'per_page',\n            'before',\n            'after',\n            'validity',\n            'is_publicly_leaked',\n            'is_multi_repo'\n          )\n        )\n      })\n      .json<github.SecretScanningListAlertsForEnterpriseResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_public_events',\n    description: `> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListPublicEventsParamsSchema,\n    tags: ['activity']\n  })\n  async activityListPublicEvents(\n    params: github.ActivityListPublicEventsParams\n  ): Promise<github.ActivityListPublicEventsResponse> {\n    return this.ky\n      .get('/events', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListPublicEventsResponse>()\n  }\n\n  /**\n * Lists the feeds available to the authenticated user. The response provides a URL for each feed. You can then get a specific feed by sending a request to one of the feed URLs.\n\n*   **Timeline**: The GitHub global public timeline\n*   **User**: The public timeline for any user, using `uri_template`. For more information, see \"[Hypermedia](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#hypermedia).\"\n*   **Current user public**: The public timeline for the authenticated user\n*   **Current user**: The private timeline for the authenticated user\n*   **Current user actor**: The private timeline for activity created by the authenticated user\n*   **Current user organizations**: The private timeline for the organizations the authenticated user is a member of.\n*   **Security advisories**: A collection of public announcements that provide information about security-related vulnerabilities in software on GitHub.\n\nBy default, timeline resources are returned in JSON. You can specify the `application/atom+xml` type in the `Accept` header to return timeline resources in Atom format. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n> [!NOTE]\n> Private feeds are only returned when [authenticating via Basic Auth](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) since current feed URIs use the older, non revocable auth tokens.\n */\n  @aiFunction({\n    name: 'github_activity_get_feeds',\n    description: `Lists the feeds available to the authenticated user. The response provides a URL for each feed. You can then get a specific feed by sending a request to one of the feed URLs.\n\n*   **Timeline**: The GitHub global public timeline\n*   **User**: The public timeline for any user, using \\`uri_template\\`. For more information, see \"[Hypermedia](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#hypermedia).\"\n*   **Current user public**: The public timeline for the authenticated user\n*   **Current user**: The private timeline for the authenticated user\n*   **Current user actor**: The private timeline for activity created by the authenticated user\n*   **Current user organizations**: The private timeline for the organizations the authenticated user is a member of.\n*   **Security advisories**: A collection of public announcements that provide information about security-related vulnerabilities in software on GitHub.\n\nBy default, timeline resources are returned in JSON. You can specify the \\`application/atom+xml\\` type in the \\`Accept\\` header to return timeline resources in Atom format. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n> [!NOTE]\n> Private feeds are only returned when [authenticating via Basic Auth](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) since current feed URIs use the older, non revocable auth tokens.`,\n    inputSchema: github.ActivityGetFeedsParamsSchema,\n    tags: ['activity']\n  })\n  async activityGetFeeds(\n    _params: github.ActivityGetFeedsParams\n  ): Promise<github.ActivityGetFeedsResponse> {\n    return this.ky.get('/feeds').json<github.ActivityGetFeedsResponse>()\n  }\n\n  /**\n   * Lists the authenticated user's gists or if called anonymously, this endpoint returns all public gists:.\n   */\n  @aiFunction({\n    name: 'github_gists_list',\n    description: `Lists the authenticated user's gists or if called anonymously, this endpoint returns all public gists:.`,\n    inputSchema: github.GistsListParamsSchema,\n    tags: ['gists']\n  })\n  async gistsList(\n    params: github.GistsListParams\n  ): Promise<github.GistsListResponse> {\n    return this.ky\n      .get('/gists', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'since', 'per_page', 'page')\n        )\n      })\n      .json<github.GistsListResponse>()\n  }\n\n  /**\n * Allows you to add a new gist with one or more files.\n\n> [!NOTE]\n> Don't name your files \"gistfile\" with a numerical suffix. This is the format of the automatic naming scheme that Gist uses internally.\n */\n  @aiFunction({\n    name: 'github_gists_create',\n    description: `Allows you to add a new gist with one or more files.\n\n> [!NOTE]\n> Don't name your files \"gistfile\" with a numerical suffix. This is the format of the automatic naming scheme that Gist uses internally.`,\n    inputSchema: github.GistsCreateParamsSchema,\n    tags: ['gists']\n  })\n  async gistsCreate(\n    params: github.GistsCreateParams\n  ): Promise<github.GistsCreateResponse> {\n    return this.ky\n      .post('/gists', {\n        json: pick(params, 'description', 'files', 'public')\n      })\n      .json<github.GistsCreateResponse>()\n  }\n\n  /**\n * List public gists sorted by most recently updated to least recently updated.\n\nNote: With [pagination](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api), you can fetch up to 3000 gists. For example, you can fetch 100 pages with 30 gists per page or 30 pages with 100 gists per page.\n */\n  @aiFunction({\n    name: 'github_gists_list_public',\n    description: `List public gists sorted by most recently updated to least recently updated.\n\nNote: With [pagination](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api), you can fetch up to 3000 gists. For example, you can fetch 100 pages with 30 gists per page or 30 pages with 100 gists per page.`,\n    inputSchema: github.GistsListPublicParamsSchema,\n    tags: ['gists']\n  })\n  async gistsListPublic(\n    params: github.GistsListPublicParams\n  ): Promise<github.GistsListPublicResponse> {\n    return this.ky\n      .get('/gists/public', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'since', 'per_page', 'page')\n        )\n      })\n      .json<github.GistsListPublicResponse>()\n  }\n\n  /**\n   * List the authenticated user's starred gists:.\n   */\n  @aiFunction({\n    name: 'github_gists_list_starred',\n    description: `List the authenticated user's starred gists:.`,\n    inputSchema: github.GistsListStarredParamsSchema,\n    tags: ['gists']\n  })\n  async gistsListStarred(\n    params: github.GistsListStarredParams\n  ): Promise<github.GistsListStarredResponse> {\n    return this.ky\n      .get('/gists/starred', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'since', 'per_page', 'page')\n        )\n      })\n      .json<github.GistsListStarredResponse>()\n  }\n\n  /**\n * Gets a specified gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.base64+json`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.\n */\n  @aiFunction({\n    name: 'github_gists_get',\n    description: `Gets a specified gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.base64+json\\`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.`,\n    inputSchema: github.GistsGetParamsSchema,\n    tags: ['gists']\n  })\n  async gistsGet(\n    params: github.GistsGetParams\n  ): Promise<github.GistsGetResponse> {\n    return this.ky\n      .get(`/gists/${params.gist_id}`)\n      .json<github.GistsGetResponse>()\n  }\n\n  /**\n   * Delete a gist.\n   */\n  @aiFunction({\n    name: 'github_gists_delete',\n    description: `Delete a gist.`,\n    inputSchema: github.GistsDeleteParamsSchema,\n    tags: ['gists']\n  })\n  async gistsDelete(\n    params: github.GistsDeleteParams\n  ): Promise<github.GistsDeleteResponse> {\n    return this.ky\n      .delete(`/gists/${params.gist_id}`)\n      .json<github.GistsDeleteResponse>()\n  }\n\n  /**\n * Allows you to update a gist's description and to update, delete, or rename gist files. Files\nfrom the previous version of the gist that aren't explicitly changed during an edit\nare unchanged.\n\nAt least one of `description` or `files` is required.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.base64+json`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.\n */\n  @aiFunction({\n    name: 'github_gists_update',\n    description: `Allows you to update a gist's description and to update, delete, or rename gist files. Files\nfrom the previous version of the gist that aren't explicitly changed during an edit\nare unchanged.\n\nAt least one of \\`description\\` or \\`files\\` is required.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.base64+json\\`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.`,\n    inputSchema: github.GistsUpdateParamsSchema,\n    tags: ['gists']\n  })\n  async gistsUpdate(\n    params: github.GistsUpdateParams\n  ): Promise<github.GistsUpdateResponse> {\n    return this.ky\n      .patch(`/gists/${params.gist_id}`, {\n        json: pick(params, 'description', 'files')\n      })\n      .json<github.GistsUpdateResponse>()\n  }\n\n  /**\n * Lists the comments on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.base64+json`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.\n */\n  @aiFunction({\n    name: 'github_gists_list_comments',\n    description: `Lists the comments on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.base64+json\\`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.`,\n    inputSchema: github.GistsListCommentsParamsSchema,\n    tags: ['gists']\n  })\n  async gistsListComments(\n    params: github.GistsListCommentsParams\n  ): Promise<github.GistsListCommentsResponse> {\n    return this.ky\n      .get(`/gists/${params.gist_id}/comments`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.GistsListCommentsResponse>()\n  }\n\n  /**\n * Creates a comment on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.base64+json`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.\n */\n  @aiFunction({\n    name: 'github_gists_create_comment',\n    description: `Creates a comment on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.base64+json\\`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.`,\n    inputSchema: github.GistsCreateCommentParamsSchema,\n    tags: ['gists']\n  })\n  async gistsCreateComment(\n    params: github.GistsCreateCommentParams\n  ): Promise<github.GistsCreateCommentResponse> {\n    return this.ky\n      .post(`/gists/${params.gist_id}/comments`, {\n        json: pick(params, 'body')\n      })\n      .json<github.GistsCreateCommentResponse>()\n  }\n\n  /**\n * Gets a comment on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.base64+json`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.\n */\n  @aiFunction({\n    name: 'github_gists_get_comment',\n    description: `Gets a comment on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.base64+json\\`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.`,\n    inputSchema: github.GistsGetCommentParamsSchema,\n    tags: ['gists']\n  })\n  async gistsGetComment(\n    params: github.GistsGetCommentParams\n  ): Promise<github.GistsGetCommentResponse> {\n    return this.ky\n      .get(`/gists/${params.gist_id}/comments/${params.comment_id}`, {})\n      .json<github.GistsGetCommentResponse>()\n  }\n\n  /**\n   * Delete a gist comment.\n   */\n  @aiFunction({\n    name: 'github_gists_delete_comment',\n    description: `Delete a gist comment.`,\n    inputSchema: github.GistsDeleteCommentParamsSchema,\n    tags: ['gists']\n  })\n  async gistsDeleteComment(\n    params: github.GistsDeleteCommentParams\n  ): Promise<github.GistsDeleteCommentResponse> {\n    return this.ky\n      .delete(\n        `/gists/${params.gist_id}/comments/${params.comment_id}`,\n        {}\n      )\n      .json<github.GistsDeleteCommentResponse>()\n  }\n\n  /**\n * Updates a comment on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.base64+json`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.\n */\n  @aiFunction({\n    name: 'github_gists_update_comment',\n    description: `Updates a comment on a gist.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.base64+json\\`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.`,\n    inputSchema: github.GistsUpdateCommentParamsSchema,\n    tags: ['gists']\n  })\n  async gistsUpdateComment(\n    params: github.GistsUpdateCommentParams\n  ): Promise<github.GistsUpdateCommentResponse> {\n    return this.ky\n      .patch(`/gists/${params.gist_id}/comments/${params.comment_id}`, {\n        json: pick(params, 'body')\n      })\n      .json<github.GistsUpdateCommentResponse>()\n  }\n\n  /**\n   * List gist commits.\n   */\n  @aiFunction({\n    name: 'github_gists_list_commits',\n    description: `List gist commits.`,\n    inputSchema: github.GistsListCommitsParamsSchema,\n    tags: ['gists']\n  })\n  async gistsListCommits(\n    params: github.GistsListCommitsParams\n  ): Promise<github.GistsListCommitsResponse> {\n    return this.ky\n      .get(`/gists/${params.gist_id}/commits`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.GistsListCommitsResponse>()\n  }\n\n  /**\n   * List gist forks.\n   */\n  @aiFunction({\n    name: 'github_gists_list_forks',\n    description: `List gist forks.`,\n    inputSchema: github.GistsListForksParamsSchema,\n    tags: ['gists']\n  })\n  async gistsListForks(\n    params: github.GistsListForksParams\n  ): Promise<github.GistsListForksResponse> {\n    return this.ky\n      .get(`/gists/${params.gist_id}/forks`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.GistsListForksResponse>()\n  }\n\n  /**\n   * Fork a gist.\n   */\n  @aiFunction({\n    name: 'github_gists_fork',\n    description: `Fork a gist.`,\n    inputSchema: github.GistsForkParamsSchema,\n    tags: ['gists']\n  })\n  async gistsFork(\n    params: github.GistsForkParams\n  ): Promise<github.GistsForkResponse> {\n    return this.ky\n      .post(`/gists/${params.gist_id}/forks`)\n      .json<github.GistsForkResponse>()\n  }\n\n  /**\n   * Check if a gist is starred.\n   */\n  @aiFunction({\n    name: 'github_gists_check_is_starred',\n    description: `Check if a gist is starred.`,\n    inputSchema: github.GistsCheckIsStarredParamsSchema,\n    tags: ['gists']\n  })\n  async gistsCheckIsStarred(\n    params: github.GistsCheckIsStarredParams\n  ): Promise<github.GistsCheckIsStarredResponse> {\n    return this.ky\n      .get(`/gists/${params.gist_id}/star`)\n      .json<github.GistsCheckIsStarredResponse>()\n  }\n\n  /**\n   * Note that you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".\n   */\n  @aiFunction({\n    name: 'github_gists_star',\n    description: `Note that you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".`,\n    inputSchema: github.GistsStarParamsSchema,\n    tags: ['gists']\n  })\n  async gistsStar(\n    params: github.GistsStarParams\n  ): Promise<github.GistsStarResponse> {\n    return this.ky\n      .put(`/gists/${params.gist_id}/star`)\n      .json<github.GistsStarResponse>()\n  }\n\n  /**\n   * Unstar a gist.\n   */\n  @aiFunction({\n    name: 'github_gists_unstar',\n    description: `Unstar a gist.`,\n    inputSchema: github.GistsUnstarParamsSchema,\n    tags: ['gists']\n  })\n  async gistsUnstar(\n    params: github.GistsUnstarParams\n  ): Promise<github.GistsUnstarResponse> {\n    return this.ky\n      .delete(`/gists/${params.gist_id}/star`)\n      .json<github.GistsUnstarResponse>()\n  }\n\n  /**\n * Gets a specified gist revision.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.base64+json`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.\n */\n  @aiFunction({\n    name: 'github_gists_get_revision',\n    description: `Gets a specified gist revision.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.base64+json\\`**: Returns the base64-encoded contents. This can be useful if your gist contains any invalid UTF-8 sequences.`,\n    inputSchema: github.GistsGetRevisionParamsSchema,\n    tags: ['gists']\n  })\n  async gistsGetRevision(\n    params: github.GistsGetRevisionParams\n  ): Promise<github.GistsGetRevisionResponse> {\n    return this.ky\n      .get(`/gists/${params.gist_id}/${params.sha}`, {})\n      .json<github.GistsGetRevisionResponse>()\n  }\n\n  /**\n   * List all templates available to pass as an option when [creating a repository](https://docs.github.com/rest/repos/repos#create-a-repository-for-the-authenticated-user).\n   */\n  @aiFunction({\n    name: 'github_gitignore_get_all_templates',\n    description: `List all templates available to pass as an option when [creating a repository](https://docs.github.com/rest/repos/repos#create-a-repository-for-the-authenticated-user).`,\n    inputSchema: github.GitignoreGetAllTemplatesParamsSchema,\n    tags: ['gitignore']\n  })\n  async gitignoreGetAllTemplates(\n    _params: github.GitignoreGetAllTemplatesParams\n  ): Promise<github.GitignoreGetAllTemplatesResponse> {\n    return this.ky\n      .get('/gitignore/templates')\n      .json<github.GitignoreGetAllTemplatesResponse>()\n  }\n\n  /**\n * Get the content of a gitignore template.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw .gitignore contents.\n */\n  @aiFunction({\n    name: 'github_gitignore_get_template',\n    description: `Get the content of a gitignore template.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw .gitignore contents.`,\n    inputSchema: github.GitignoreGetTemplateParamsSchema,\n    tags: ['gitignore']\n  })\n  async gitignoreGetTemplate(\n    params: github.GitignoreGetTemplateParams\n  ): Promise<github.GitignoreGetTemplateResponse> {\n    return this.ky\n      .get(`/gitignore/templates/${params.name}`)\n      .json<github.GitignoreGetTemplateResponse>()\n  }\n\n  /**\n   * List repositories that an app installation can access.\n   */\n  @aiFunction({\n    name: 'github_apps_list_repos_accessible_to_installation',\n    description: `List repositories that an app installation can access.`,\n    inputSchema: github.AppsListReposAccessibleToInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsListReposAccessibleToInstallation(\n    params: github.AppsListReposAccessibleToInstallationParams\n  ): Promise<github.AppsListReposAccessibleToInstallationResponse> {\n    return this.ky\n      .get('/installation/repositories', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListReposAccessibleToInstallationResponse>()\n  }\n\n  /**\n * Revokes the installation token you're using to authenticate as an installation and access this endpoint.\n\nOnce an installation token is revoked, the token is invalidated and cannot be used. Other endpoints that require the revoked installation token must have a new installation token to work. You can create a new token using the \"[Create an installation access token for an app](https://docs.github.com/rest/apps/apps#create-an-installation-access-token-for-an-app)\" endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_revoke_installation_access_token',\n    description: `Revokes the installation token you're using to authenticate as an installation and access this endpoint.\n\nOnce an installation token is revoked, the token is invalidated and cannot be used. Other endpoints that require the revoked installation token must have a new installation token to work. You can create a new token using the \"[Create an installation access token for an app](https://docs.github.com/rest/apps/apps#create-an-installation-access-token-for-an-app)\" endpoint.`,\n    inputSchema: github.AppsRevokeInstallationAccessTokenParamsSchema,\n    tags: ['apps']\n  })\n  async appsRevokeInstallationAccessToken(\n    _params: github.AppsRevokeInstallationAccessTokenParams\n  ): Promise<github.AppsRevokeInstallationAccessTokenResponse> {\n    return this.ky\n      .delete('/installation/token')\n      .json<github.AppsRevokeInstallationAccessTokenResponse>()\n  }\n\n  /**\n * List issues assigned to the authenticated user across all visible repositories including owned repositories, member\nrepositories, and organization repositories. You can use the `filter` query parameter to fetch issues that are not\nnecessarily assigned to you.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the `pull_request` key. Be aware that the `id` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_list',\n    description: `List issues assigned to the authenticated user across all visible repositories including owned repositories, member\nrepositories, and organization repositories. You can use the \\`filter\\` query parameter to fetch issues that are not\nnecessarily assigned to you.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the \\`pull_request\\` key. Be aware that the \\`id\\` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesListParamsSchema,\n    tags: ['issues']\n  })\n  async issuesList(\n    params: github.IssuesListParams\n  ): Promise<github.IssuesListResponse> {\n    return this.ky\n      .get('/issues', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'filter',\n            'state',\n            'labels',\n            'sort',\n            'direction',\n            'since',\n            'collab',\n            'orgs',\n            'owned',\n            'pulls',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.IssuesListResponse>()\n  }\n\n  /**\n   * Lists the most commonly used licenses on GitHub. For more information, see \"[Licensing a repository ](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository).\".\n   */\n  @aiFunction({\n    name: 'github_licenses_get_all_commonly_used',\n    description: `Lists the most commonly used licenses on GitHub. For more information, see \"[Licensing a repository ](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository).\".`,\n    inputSchema: github.LicensesGetAllCommonlyUsedParamsSchema,\n    tags: ['licenses']\n  })\n  async licensesGetAllCommonlyUsed(\n    params: github.LicensesGetAllCommonlyUsedParams\n  ): Promise<github.LicensesGetAllCommonlyUsedResponse> {\n    return this.ky\n      .get('/licenses', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'featured', 'per_page', 'page')\n        )\n      })\n      .json<github.LicensesGetAllCommonlyUsedResponse>()\n  }\n\n  /**\n   * Gets information about a specific license. For more information, see \"[Licensing a repository ](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository).\".\n   */\n  @aiFunction({\n    name: 'github_licenses_get',\n    description: `Gets information about a specific license. For more information, see \"[Licensing a repository ](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository).\".`,\n    inputSchema: github.LicensesGetParamsSchema,\n    tags: ['licenses']\n  })\n  async licensesGet(\n    params: github.LicensesGetParams\n  ): Promise<github.LicensesGetResponse> {\n    return this.ky\n      .get(`/licenses/${params.license}`)\n      .json<github.LicensesGetResponse>()\n  }\n\n  /**\n   * Render a Markdown document.\n   */\n  @aiFunction({\n    name: 'github_markdown_render',\n    description: `Render a Markdown document.`,\n    inputSchema: github.MarkdownRenderParamsSchema,\n    tags: ['markdown']\n  })\n  async markdownRender(\n    params: github.MarkdownRenderParams\n  ): Promise<github.MarkdownRenderResponse> {\n    return this.ky\n      .post('/markdown', {\n        json: pick(params, 'text', 'mode', 'context')\n      })\n      .json<github.MarkdownRenderResponse>()\n  }\n\n  /**\n   * You must send Markdown as plain text (using a `Content-Type` header of `text/plain` or `text/x-markdown`) to this endpoint, rather than using JSON format. In raw mode, [GitHub Flavored Markdown](https://github.github.com/gfm/) is not supported and Markdown will be rendered in plain format like a README.md file. Markdown content must be 400 KB or less.\n   */\n  @aiFunction({\n    name: 'github_markdown_render_raw',\n    description: `You must send Markdown as plain text (using a \\`Content-Type\\` header of \\`text/plain\\` or \\`text/x-markdown\\`) to this endpoint, rather than using JSON format. In raw mode, [GitHub Flavored Markdown](https://github.github.com/gfm/) is not supported and Markdown will be rendered in plain format like a README.md file. Markdown content must be 400 KB or less.`,\n    inputSchema: github.MarkdownRenderRawParamsSchema,\n    tags: ['markdown']\n  })\n  async markdownRenderRaw(\n    _params: github.MarkdownRenderRawParams\n  ): Promise<github.MarkdownRenderRawResponse> {\n    return this.ky\n      .post('/markdown/raw')\n      .json<github.MarkdownRenderRawResponse>()\n  }\n\n  /**\n * Shows whether the user or organization account actively subscribes to a plan listed by the authenticated GitHub App. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_subscription_plan_for_account',\n    description: `Shows whether the user or organization account actively subscribes to a plan listed by the authenticated GitHub App. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.`,\n    inputSchema: github.AppsGetSubscriptionPlanForAccountParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetSubscriptionPlanForAccount(\n    params: github.AppsGetSubscriptionPlanForAccountParams\n  ): Promise<github.AppsGetSubscriptionPlanForAccountResponse> {\n    return this.ky\n      .get(`/marketplace_listing/accounts/${params.account_id}`)\n      .json<github.AppsGetSubscriptionPlanForAccountResponse>()\n  }\n\n  /**\n * Lists all plans that are part of your GitHub Marketplace listing.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_list_plans',\n    description: `Lists all plans that are part of your GitHub Marketplace listing.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.`,\n    inputSchema: github.AppsListPlansParamsSchema,\n    tags: ['apps']\n  })\n  async appsListPlans(\n    params: github.AppsListPlansParams\n  ): Promise<github.AppsListPlansResponse> {\n    return this.ky\n      .get('/marketplace_listing/plans', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListPlansResponse>()\n  }\n\n  /**\n * Returns user and organization accounts associated with the specified plan, including free plans. For per-seat pricing, you see the list of accounts that have purchased the plan, including the number of seats purchased. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_list_accounts_for_plan',\n    description: `Returns user and organization accounts associated with the specified plan, including free plans. For per-seat pricing, you see the list of accounts that have purchased the plan, including the number of seats purchased. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.`,\n    inputSchema: github.AppsListAccountsForPlanParamsSchema,\n    tags: ['apps']\n  })\n  async appsListAccountsForPlan(\n    params: github.AppsListAccountsForPlanParams\n  ): Promise<github.AppsListAccountsForPlanResponse> {\n    return this.ky\n      .get(`/marketplace_listing/plans/${params.plan_id}/accounts`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sort', 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.AppsListAccountsForPlanResponse>()\n  }\n\n  /**\n * Shows whether the user or organization account actively subscribes to a plan listed by the authenticated GitHub App. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_subscription_plan_for_account_stubbed',\n    description: `Shows whether the user or organization account actively subscribes to a plan listed by the authenticated GitHub App. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.`,\n    inputSchema: github.AppsGetSubscriptionPlanForAccountStubbedParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetSubscriptionPlanForAccountStubbed(\n    params: github.AppsGetSubscriptionPlanForAccountStubbedParams\n  ): Promise<github.AppsGetSubscriptionPlanForAccountStubbedResponse> {\n    return this.ky\n      .get(`/marketplace_listing/stubbed/accounts/${params.account_id}`)\n      .json<github.AppsGetSubscriptionPlanForAccountStubbedResponse>()\n  }\n\n  /**\n * Lists all plans that are part of your GitHub Marketplace listing.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_list_plans_stubbed',\n    description: `Lists all plans that are part of your GitHub Marketplace listing.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.`,\n    inputSchema: github.AppsListPlansStubbedParamsSchema,\n    tags: ['apps']\n  })\n  async appsListPlansStubbed(\n    params: github.AppsListPlansStubbedParams\n  ): Promise<github.AppsListPlansStubbedResponse> {\n    return this.ky\n      .get('/marketplace_listing/stubbed/plans', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListPlansStubbedResponse>()\n  }\n\n  /**\n * Returns repository and organization accounts associated with the specified plan, including free plans. For per-seat pricing, you see the list of accounts that have purchased the plan, including the number of seats purchased. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_list_accounts_for_plan_stubbed',\n    description: `Returns repository and organization accounts associated with the specified plan, including free plans. For per-seat pricing, you see the list of accounts that have purchased the plan, including the number of seats purchased. When someone submits a plan change that won't be processed until the end of their billing cycle, you will also see the upcoming pending change.\n\nGitHub Apps must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint. OAuth apps must use [basic authentication](https://docs.github.com/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication) with their client ID and client secret to access this endpoint.`,\n    inputSchema: github.AppsListAccountsForPlanStubbedParamsSchema,\n    tags: ['apps']\n  })\n  async appsListAccountsForPlanStubbed(\n    params: github.AppsListAccountsForPlanStubbedParams\n  ): Promise<github.AppsListAccountsForPlanStubbedResponse> {\n    return this.ky\n      .get(`/marketplace_listing/stubbed/plans/${params.plan_id}/accounts`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sort', 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.AppsListAccountsForPlanStubbedResponse>()\n  }\n\n  /**\n * Returns meta information about GitHub, including a list of GitHub's IP addresses. For more information, see \"[About GitHub's IP addresses](https://docs.github.com/articles/about-github-s-ip-addresses/).\"\n\nThe API's response also includes a list of GitHub's domain names.\n\nThe values shown in the documentation's response are example values. You must always query the API directly to get the latest values.\n\n> [!NOTE]\n> This endpoint returns both IPv4 and IPv6 addresses. However, not all features support IPv6. You should refer to the specific documentation for each feature to determine if IPv6 is supported.\n */\n  @aiFunction({\n    name: 'github_meta_get',\n    description: `Returns meta information about GitHub, including a list of GitHub's IP addresses. For more information, see \"[About GitHub's IP addresses](https://docs.github.com/articles/about-github-s-ip-addresses/).\"\n\nThe API's response also includes a list of GitHub's domain names.\n\nThe values shown in the documentation's response are example values. You must always query the API directly to get the latest values.\n\n> [!NOTE]\n> This endpoint returns both IPv4 and IPv6 addresses. However, not all features support IPv6. You should refer to the specific documentation for each feature to determine if IPv6 is supported.`,\n    inputSchema: github.MetaGetParamsSchema,\n    tags: ['meta']\n  })\n  async metaGet(\n    _params: github.MetaGetParams\n  ): Promise<github.MetaGetResponse> {\n    return this.ky.get('/meta').json<github.MetaGetResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_public_events_for_repo_network',\n    description: `> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListPublicEventsForRepoNetworkParamsSchema,\n    tags: ['activity']\n  })\n  async activityListPublicEventsForRepoNetwork(\n    params: github.ActivityListPublicEventsForRepoNetworkParams\n  ): Promise<github.ActivityListPublicEventsForRepoNetworkResponse> {\n    return this.ky\n      .get(`/networks/${params.owner}/${params.repo}/events`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListPublicEventsForRepoNetworkResponse>()\n  }\n\n  /**\n   * List all notifications for the current user, sorted by most recently updated.\n   */\n  @aiFunction({\n    name: 'github_activity_list_notifications_for_authenticated_user',\n    description: `List all notifications for the current user, sorted by most recently updated.`,\n    inputSchema:\n      github.ActivityListNotificationsForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListNotificationsForAuthenticatedUser(\n    params: github.ActivityListNotificationsForAuthenticatedUserParams\n  ): Promise<github.ActivityListNotificationsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/notifications', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'all',\n            'participating',\n            'since',\n            'before',\n            'page',\n            'per_page'\n          )\n        )\n      })\n      .json<github.ActivityListNotificationsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Marks all notifications as \"read\" for the current user. If the number of notifications is too large to complete in one request, you will receive a `202 Accepted` status and GitHub will run an asynchronous process to mark notifications as \"read.\" To check whether any \"unread\" notifications remain, you can use the [List notifications for the authenticated user](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user) endpoint and pass the query parameter `all=false`.\n   */\n  @aiFunction({\n    name: 'github_activity_mark_notifications_as_read',\n    description: `Marks all notifications as \"read\" for the current user. If the number of notifications is too large to complete in one request, you will receive a \\`202 Accepted\\` status and GitHub will run an asynchronous process to mark notifications as \"read.\" To check whether any \"unread\" notifications remain, you can use the [List notifications for the authenticated user](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user) endpoint and pass the query parameter \\`all=false\\`.`,\n    inputSchema: github.ActivityMarkNotificationsAsReadParamsSchema,\n    tags: ['activity']\n  })\n  async activityMarkNotificationsAsRead(\n    params: github.ActivityMarkNotificationsAsReadParams\n  ): Promise<github.ActivityMarkNotificationsAsReadResponse> {\n    return this.ky\n      .put('/notifications', {\n        json: pick(params, 'last_read_at', 'read')\n      })\n      .json<github.ActivityMarkNotificationsAsReadResponse>()\n  }\n\n  /**\n   * Gets information about a notification thread.\n   */\n  @aiFunction({\n    name: 'github_activity_get_thread',\n    description: `Gets information about a notification thread.`,\n    inputSchema: github.ActivityGetThreadParamsSchema,\n    tags: ['activity']\n  })\n  async activityGetThread(\n    params: github.ActivityGetThreadParams\n  ): Promise<github.ActivityGetThreadResponse> {\n    return this.ky\n      .get(`/notifications/threads/${params.thread_id}`)\n      .json<github.ActivityGetThreadResponse>()\n  }\n\n  /**\n   * Marks a thread as \"done.\" Marking a thread as \"done\" is equivalent to marking a notification in your notification inbox on GitHub as done: https://github.com/notifications.\n   */\n  @aiFunction({\n    name: 'github_activity_mark_thread_as_done',\n    description: `Marks a thread as \"done.\" Marking a thread as \"done\" is equivalent to marking a notification in your notification inbox on GitHub as done: https://github.com/notifications.`,\n    inputSchema: github.ActivityMarkThreadAsDoneParamsSchema,\n    tags: ['activity']\n  })\n  async activityMarkThreadAsDone(\n    params: github.ActivityMarkThreadAsDoneParams\n  ): Promise<github.ActivityMarkThreadAsDoneResponse> {\n    return this.ky\n      .delete(`/notifications/threads/${params.thread_id}`)\n      .json<github.ActivityMarkThreadAsDoneResponse>()\n  }\n\n  /**\n   * Marks a thread as \"read.\" Marking a thread as \"read\" is equivalent to clicking a notification in your notification inbox on GitHub: https://github.com/notifications.\n   */\n  @aiFunction({\n    name: 'github_activity_mark_thread_as_read',\n    description: `Marks a thread as \"read.\" Marking a thread as \"read\" is equivalent to clicking a notification in your notification inbox on GitHub: https://github.com/notifications.`,\n    inputSchema: github.ActivityMarkThreadAsReadParamsSchema,\n    tags: ['activity']\n  })\n  async activityMarkThreadAsRead(\n    params: github.ActivityMarkThreadAsReadParams\n  ): Promise<github.ActivityMarkThreadAsReadResponse> {\n    return this.ky\n      .patch(`/notifications/threads/${params.thread_id}`)\n      .json<github.ActivityMarkThreadAsReadResponse>()\n  }\n\n  /**\n * This checks to see if the current user is subscribed to a thread. You can also [get a repository subscription](https://docs.github.com/rest/activity/watching#get-a-repository-subscription).\n\nNote that subscriptions are only generated if a user is participating in a conversation--for example, they've replied to the thread, were **@mentioned**, or manually subscribe to a thread.\n */\n  @aiFunction({\n    name: 'github_activity_get_thread_subscription_for_authenticated_user',\n    description: `This checks to see if the current user is subscribed to a thread. You can also [get a repository subscription](https://docs.github.com/rest/activity/watching#get-a-repository-subscription).\n\nNote that subscriptions are only generated if a user is participating in a conversation--for example, they've replied to the thread, were **@mentioned**, or manually subscribe to a thread.`,\n    inputSchema:\n      github.ActivityGetThreadSubscriptionForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityGetThreadSubscriptionForAuthenticatedUser(\n    params: github.ActivityGetThreadSubscriptionForAuthenticatedUserParams\n  ): Promise<github.ActivityGetThreadSubscriptionForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/notifications/threads/${params.thread_id}/subscription`)\n      .json<github.ActivityGetThreadSubscriptionForAuthenticatedUserResponse>()\n  }\n\n  /**\n * If you are watching a repository, you receive notifications for all threads by default. Use this endpoint to ignore future notifications for threads until you comment on the thread or get an **@mention**.\n\nYou can also use this endpoint to subscribe to threads that you are currently not receiving notifications for or to subscribed to threads that you have previously ignored.\n\nUnsubscribing from a conversation in a repository that you are not watching is functionally equivalent to the [Delete a thread subscription](https://docs.github.com/rest/activity/notifications#delete-a-thread-subscription) endpoint.\n */\n  @aiFunction({\n    name: 'github_activity_set_thread_subscription',\n    description: `If you are watching a repository, you receive notifications for all threads by default. Use this endpoint to ignore future notifications for threads until you comment on the thread or get an **@mention**.\n\nYou can also use this endpoint to subscribe to threads that you are currently not receiving notifications for or to subscribed to threads that you have previously ignored.\n\nUnsubscribing from a conversation in a repository that you are not watching is functionally equivalent to the [Delete a thread subscription](https://docs.github.com/rest/activity/notifications#delete-a-thread-subscription) endpoint.`,\n    inputSchema: github.ActivitySetThreadSubscriptionParamsSchema,\n    tags: ['activity']\n  })\n  async activitySetThreadSubscription(\n    params: github.ActivitySetThreadSubscriptionParams\n  ): Promise<github.ActivitySetThreadSubscriptionResponse> {\n    return this.ky\n      .put(`/notifications/threads/${params.thread_id}/subscription`, {\n        json: pick(params, 'ignored')\n      })\n      .json<github.ActivitySetThreadSubscriptionResponse>()\n  }\n\n  /**\n   * Mutes all future notifications for a conversation until you comment on the thread or get an **@mention**. If you are watching the repository of the thread, you will still receive notifications. To ignore future notifications for a repository you are watching, use the [Set a thread subscription](https://docs.github.com/rest/activity/notifications#set-a-thread-subscription) endpoint and set `ignore` to `true`.\n   */\n  @aiFunction({\n    name: 'github_activity_delete_thread_subscription',\n    description: `Mutes all future notifications for a conversation until you comment on the thread or get an **@mention**. If you are watching the repository of the thread, you will still receive notifications. To ignore future notifications for a repository you are watching, use the [Set a thread subscription](https://docs.github.com/rest/activity/notifications#set-a-thread-subscription) endpoint and set \\`ignore\\` to \\`true\\`.`,\n    inputSchema: github.ActivityDeleteThreadSubscriptionParamsSchema,\n    tags: ['activity']\n  })\n  async activityDeleteThreadSubscription(\n    params: github.ActivityDeleteThreadSubscriptionParams\n  ): Promise<github.ActivityDeleteThreadSubscriptionResponse> {\n    return this.ky\n      .delete(`/notifications/threads/${params.thread_id}/subscription`)\n      .json<github.ActivityDeleteThreadSubscriptionResponse>()\n  }\n\n  /**\n   * Get the octocat as ASCII art.\n   */\n  @aiFunction({\n    name: 'github_meta_get_octocat',\n    description: `Get the octocat as ASCII art.`,\n    inputSchema: github.MetaGetOctocatParamsSchema,\n    tags: ['meta']\n  })\n  async metaGetOctocat(\n    params: github.MetaGetOctocatParams\n  ): Promise<github.MetaGetOctocatResponse> {\n    return this.ky\n      .get('/octocat', {\n        searchParams: sanitizeSearchParams(params)\n      })\n      .json<github.MetaGetOctocatResponse>()\n  }\n\n  /**\n * Lists all organizations, in the order that they were created.\n\n> [!NOTE]\n> Pagination is powered exclusively by the `since` parameter. Use the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers) to get the URL for the next page of organizations.\n */\n  @aiFunction({\n    name: 'github_orgs_list',\n    description: `Lists all organizations, in the order that they were created.\n\n> [!NOTE]\n> Pagination is powered exclusively by the \\`since\\` parameter. Use the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers) to get the URL for the next page of organizations.`,\n    inputSchema: github.OrgsListParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsList(\n    params: github.OrgsListParams\n  ): Promise<github.OrgsListResponse> {\n    return this.ky\n      .get('/organizations', {\n        searchParams: sanitizeSearchParams(pick(params, 'since', 'per_page'))\n      })\n      .json<github.OrgsListResponse>()\n  }\n\n  /**\n * Gets a report of the total usage for an organization. To use this endpoint, you must be an administrator of an organization within an enterprise or an organization account.\n\n**Note:** This endpoint is only available to organizations with access to the enhanced billing platform. For more information, see \"[About the enhanced billing platform](https://docs.github.com/billing/using-the-new-billing-platform).\".\n */\n  @aiFunction({\n    name: 'github_billing_get_github_billing_usage_report_org',\n    description: `Gets a report of the total usage for an organization. To use this endpoint, you must be an administrator of an organization within an enterprise or an organization account.\n\n**Note:** This endpoint is only available to organizations with access to the enhanced billing platform. For more information, see \"[About the enhanced billing platform](https://docs.github.com/billing/using-the-new-billing-platform).\".`,\n    inputSchema: github.BillingGetGithubBillingUsageReportOrgParamsSchema,\n    tags: ['billing']\n  })\n  async billingGetGithubBillingUsageReportOrg(\n    params: github.BillingGetGithubBillingUsageReportOrgParams\n  ): Promise<github.BillingGetGithubBillingUsageReportOrgResponse> {\n    return this.ky\n      .get(`/organizations/${params.org}/settings/billing/usage`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'year', 'month', 'day', 'hour')\n        )\n      })\n      .json<github.BillingGetGithubBillingUsageReportOrgResponse>()\n  }\n\n  /**\n * Gets information about an organization.\n\nWhen the value of `two_factor_requirement_enabled` is `true`, the organization requires all members, billing managers, outside collaborators, guest collaborators, repository collaborators, or everyone with access to any repository within the organization to enable [two-factor authentication](https://docs.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/).\n\nTo see the full details about an organization, the authenticated user must be an organization owner.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to see the full details about an organization.\n\nTo see information about an organization's GitHub plan, GitHub Apps need the `Organization plan` permission.\n */\n  @aiFunction({\n    name: 'github_orgs_get',\n    description: `Gets information about an organization.\n\nWhen the value of \\`two_factor_requirement_enabled\\` is \\`true\\`, the organization requires all members, billing managers, outside collaborators, guest collaborators, repository collaborators, or everyone with access to any repository within the organization to enable [two-factor authentication](https://docs.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/).\n\nTo see the full details about an organization, the authenticated user must be an organization owner.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to see the full details about an organization.\n\nTo see information about an organization's GitHub plan, GitHub Apps need the \\`Organization plan\\` permission.`,\n    inputSchema: github.OrgsGetParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGet(params: github.OrgsGetParams): Promise<github.OrgsGetResponse> {\n    return this.ky.get(`/orgs/${params.org}`).json<github.OrgsGetResponse>()\n  }\n\n  /**\n * Deletes an organization and all its repositories.\n\nThe organization login will be unavailable for 90 days after deletion.\n\nPlease review the Terms of Service regarding account deletion before using this endpoint:\n\nhttps://docs.github.com/site-policy/github-terms/github-terms-of-service.\n */\n  @aiFunction({\n    name: 'github_orgs_delete',\n    description: `Deletes an organization and all its repositories.\n\nThe organization login will be unavailable for 90 days after deletion.\n\nPlease review the Terms of Service regarding account deletion before using this endpoint:\n\nhttps://docs.github.com/site-policy/github-terms/github-terms-of-service.`,\n    inputSchema: github.OrgsDeleteParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsDelete(\n    params: github.OrgsDeleteParams\n  ): Promise<github.OrgsDeleteResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}`)\n      .json<github.OrgsDeleteResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** GitHub will replace and discontinue `members_allowed_repository_creation_type` in favor of more granular permissions. The new input parameters are `members_can_create_public_repositories`, `members_can_create_private_repositories` for all organizations and `members_can_create_internal_repositories` for organizations associated with an enterprise account using GitHub Enterprise Cloud or GitHub Enterprise Server 2.20+. For more information, see the [blog post](https://developer.github.com/changes/2019-12-03-internal-visibility-changes).\n\n> [!WARNING]\n> **Closing down notice:** Code security product enablement for new repositories through the organization API is closing down. Please use [code security configurations](https://docs.github.com/rest/code-security/configurations#set-a-code-security-configuration-as-a-default-for-an-organization) to set defaults instead. For more information on setting a default security configuration, see the [changelog](https://github.blog/changelog/2024-07-09-sunsetting-security-settings-defaults-parameters-in-the-organizations-rest-api/).\n\nUpdates the organization's profile and member privileges.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` or `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_update',\n    description: `> [!WARNING]\n> **Closing down notice:** GitHub will replace and discontinue \\`members_allowed_repository_creation_type\\` in favor of more granular permissions. The new input parameters are \\`members_can_create_public_repositories\\`, \\`members_can_create_private_repositories\\` for all organizations and \\`members_can_create_internal_repositories\\` for organizations associated with an enterprise account using GitHub Enterprise Cloud or GitHub Enterprise Server 2.20+. For more information, see the [blog post](https://developer.github.com/changes/2019-12-03-internal-visibility-changes).\n\n> [!WARNING]\n> **Closing down notice:** Code security product enablement for new repositories through the organization API is closing down. Please use [code security configurations](https://docs.github.com/rest/code-security/configurations#set-a-code-security-configuration-as-a-default-for-an-organization) to set defaults instead. For more information on setting a default security configuration, see the [changelog](https://github.blog/changelog/2024-07-09-sunsetting-security-settings-defaults-parameters-in-the-organizations-rest-api/).\n\nUpdates the organization's profile and member privileges.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` or \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsUpdateParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUpdate(\n    params: github.OrgsUpdateParams\n  ): Promise<github.OrgsUpdateResponse> {\n    return this.ky\n      .patch(`/orgs/${params.org}`, {\n        json: pick(\n          params,\n          'billing_email',\n          'company',\n          'email',\n          'twitter_username',\n          'location',\n          'name',\n          'description',\n          'has_organization_projects',\n          'has_repository_projects',\n          'default_repository_permission',\n          'members_can_create_repositories',\n          'members_can_create_internal_repositories',\n          'members_can_create_private_repositories',\n          'members_can_create_public_repositories',\n          'members_allowed_repository_creation_type',\n          'members_can_create_pages',\n          'members_can_create_public_pages',\n          'members_can_create_private_pages',\n          'members_can_fork_private_repositories',\n          'web_commit_signoff_required',\n          'blog',\n          'advanced_security_enabled_for_new_repositories',\n          'dependabot_alerts_enabled_for_new_repositories',\n          'dependabot_security_updates_enabled_for_new_repositories',\n          'dependency_graph_enabled_for_new_repositories',\n          'secret_scanning_enabled_for_new_repositories',\n          'secret_scanning_push_protection_enabled_for_new_repositories',\n          'secret_scanning_push_protection_custom_link_enabled',\n          'secret_scanning_push_protection_custom_link',\n          'deploy_keys_enabled_for_repositories'\n        )\n      })\n      .json<github.OrgsUpdateResponse>()\n  }\n\n  /**\n * Gets the total GitHub Actions cache usage for an organization.\nThe data fetched using this API is refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.\n\nOAuth tokens and personal access tokens (classic) need the `read:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_actions_cache_usage_for_org',\n    description: `Gets the total GitHub Actions cache usage for an organization.\nThe data fetched using this API is refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.\n\nOAuth tokens and personal access tokens (classic) need the \\`read:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetActionsCacheUsageForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetActionsCacheUsageForOrg(\n    params: github.ActionsGetActionsCacheUsageForOrgParams\n  ): Promise<github.ActionsGetActionsCacheUsageForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/cache/usage`)\n      .json<github.ActionsGetActionsCacheUsageForOrgResponse>()\n  }\n\n  /**\n * Lists repositories and their GitHub Actions cache usage for an organization.\nThe data fetched using this API is refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.\n\nOAuth tokens and personal access tokens (classic) need the `read:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_actions_cache_usage_by_repo_for_org',\n    description: `Lists repositories and their GitHub Actions cache usage for an organization.\nThe data fetched using this API is refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.\n\nOAuth tokens and personal access tokens (classic) need the \\`read:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetActionsCacheUsageByRepoForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetActionsCacheUsageByRepoForOrg(\n    params: github.ActionsGetActionsCacheUsageByRepoForOrgParams\n  ): Promise<github.ActionsGetActionsCacheUsageByRepoForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/cache/usage-by-repository`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsGetActionsCacheUsageByRepoForOrgResponse>()\n  }\n\n  /**\n * Lists all GitHub-hosted runners configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `manage_runner:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_hosted_runners_for_org',\n    description: `Lists all GitHub-hosted runners configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`manage_runner:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListHostedRunnersForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListHostedRunnersForOrg(\n    params: github.ActionsListHostedRunnersForOrgParams\n  ): Promise<github.ActionsListHostedRunnersForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/hosted-runners`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsListHostedRunnersForOrgResponse>()\n  }\n\n  /**\n * Creates a GitHub-hosted runner for an organization.\nOAuth tokens and personal access tokens (classic) need the `manage_runners:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_hosted_runner_for_org',\n    description: `Creates a GitHub-hosted runner for an organization.\nOAuth tokens and personal access tokens (classic) need the \\`manage_runners:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateHostedRunnerForOrg(\n    params: github.ActionsCreateHostedRunnerForOrgParams\n  ): Promise<github.ActionsCreateHostedRunnerForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/actions/hosted-runners`, {\n        json: pick(\n          params,\n          'name',\n          'image',\n          'size',\n          'runner_group_id',\n          'maximum_runners',\n          'enable_static_ip'\n        )\n      })\n      .json<github.ActionsCreateHostedRunnerForOrgResponse>()\n  }\n\n  /**\n   * Get the list of GitHub-owned images available for GitHub-hosted runners for an organization.\n   */\n  @aiFunction({\n    name: 'github_actions_get_hosted_runners_github_owned_images_for_org',\n    description: `Get the list of GitHub-owned images available for GitHub-hosted runners for an organization.`,\n    inputSchema:\n      github.ActionsGetHostedRunnersGithubOwnedImagesForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetHostedRunnersGithubOwnedImagesForOrg(\n    params: github.ActionsGetHostedRunnersGithubOwnedImagesForOrgParams\n  ): Promise<github.ActionsGetHostedRunnersGithubOwnedImagesForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/hosted-runners/images/github-owned`)\n      .json<github.ActionsGetHostedRunnersGithubOwnedImagesForOrgResponse>()\n  }\n\n  /**\n   * Get the list of partner images available for GitHub-hosted runners for an organization.\n   */\n  @aiFunction({\n    name: 'github_actions_get_hosted_runners_partner_images_for_org',\n    description: `Get the list of partner images available for GitHub-hosted runners for an organization.`,\n    inputSchema: github.ActionsGetHostedRunnersPartnerImagesForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetHostedRunnersPartnerImagesForOrg(\n    params: github.ActionsGetHostedRunnersPartnerImagesForOrgParams\n  ): Promise<github.ActionsGetHostedRunnersPartnerImagesForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/hosted-runners/images/partner`)\n      .json<github.ActionsGetHostedRunnersPartnerImagesForOrgResponse>()\n  }\n\n  /**\n   * Get the GitHub-hosted runners limits for an organization.\n   */\n  @aiFunction({\n    name: 'github_actions_get_hosted_runners_limits_for_org',\n    description: `Get the GitHub-hosted runners limits for an organization.`,\n    inputSchema: github.ActionsGetHostedRunnersLimitsForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetHostedRunnersLimitsForOrg(\n    params: github.ActionsGetHostedRunnersLimitsForOrgParams\n  ): Promise<github.ActionsGetHostedRunnersLimitsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/hosted-runners/limits`)\n      .json<github.ActionsGetHostedRunnersLimitsForOrgResponse>()\n  }\n\n  /**\n   * Get the list of machine specs available for GitHub-hosted runners for an organization.\n   */\n  @aiFunction({\n    name: 'github_actions_get_hosted_runners_machine_specs_for_org',\n    description: `Get the list of machine specs available for GitHub-hosted runners for an organization.`,\n    inputSchema: github.ActionsGetHostedRunnersMachineSpecsForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetHostedRunnersMachineSpecsForOrg(\n    params: github.ActionsGetHostedRunnersMachineSpecsForOrgParams\n  ): Promise<github.ActionsGetHostedRunnersMachineSpecsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/hosted-runners/machine-sizes`)\n      .json<github.ActionsGetHostedRunnersMachineSpecsForOrgResponse>()\n  }\n\n  /**\n   * Get the list of platforms available for GitHub-hosted runners for an organization.\n   */\n  @aiFunction({\n    name: 'github_actions_get_hosted_runners_platforms_for_org',\n    description: `Get the list of platforms available for GitHub-hosted runners for an organization.`,\n    inputSchema: github.ActionsGetHostedRunnersPlatformsForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetHostedRunnersPlatformsForOrg(\n    params: github.ActionsGetHostedRunnersPlatformsForOrgParams\n  ): Promise<github.ActionsGetHostedRunnersPlatformsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/hosted-runners/platforms`)\n      .json<github.ActionsGetHostedRunnersPlatformsForOrgResponse>()\n  }\n\n  /**\n * Gets a GitHub-hosted runner configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `manage_runners:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_hosted_runner_for_org',\n    description: `Gets a GitHub-hosted runner configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`manage_runners:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetHostedRunnerForOrg(\n    params: github.ActionsGetHostedRunnerForOrgParams\n  ): Promise<github.ActionsGetHostedRunnerForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/hosted-runners/${params.hosted_runner_id}`,\n        {}\n      )\n      .json<github.ActionsGetHostedRunnerForOrgResponse>()\n  }\n\n  /**\n   * Deletes a GitHub-hosted runner for an organization.\n   */\n  @aiFunction({\n    name: 'github_actions_delete_hosted_runner_for_org',\n    description: `Deletes a GitHub-hosted runner for an organization.`,\n    inputSchema: github.ActionsDeleteHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteHostedRunnerForOrg(\n    params: github.ActionsDeleteHostedRunnerForOrgParams\n  ): Promise<github.ActionsDeleteHostedRunnerForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/hosted-runners/${params.hosted_runner_id}`,\n        {}\n      )\n      .json<github.ActionsDeleteHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Updates a GitHub-hosted runner for an organization.\nOAuth app tokens and personal access tokens (classic) need the `manage_runners:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_update_hosted_runner_for_org',\n    description: `Updates a GitHub-hosted runner for an organization.\nOAuth app tokens and personal access tokens (classic) need the \\`manage_runners:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsUpdateHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsUpdateHostedRunnerForOrg(\n    params: github.ActionsUpdateHostedRunnerForOrgParams\n  ): Promise<github.ActionsUpdateHostedRunnerForOrgResponse> {\n    return this.ky\n      .patch(\n        `/orgs/${params.org}/actions/hosted-runners/${params.hosted_runner_id}`,\n        {\n          json: pick(\n            params,\n            'name',\n            'runner_group_id',\n            'maximum_runners',\n            'enable_static_ip'\n          )\n        }\n      )\n      .json<github.ActionsUpdateHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Gets the customization template for an OpenID Connect (OIDC) subject claim.\n\nOAuth app tokens and personal access tokens (classic) need the `read:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_oidc_get_oidc_custom_sub_template_for_org',\n    description: `Gets the customization template for an OpenID Connect (OIDC) subject claim.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:org\\` scope to use this endpoint.`,\n    inputSchema: github.OidcGetOidcCustomSubTemplateForOrgParamsSchema,\n    tags: ['oidc']\n  })\n  async oidcGetOidcCustomSubTemplateForOrg(\n    params: github.OidcGetOidcCustomSubTemplateForOrgParams\n  ): Promise<github.OidcGetOidcCustomSubTemplateForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/oidc/customization/sub`)\n      .json<github.OidcGetOidcCustomSubTemplateForOrgResponse>()\n  }\n\n  /**\n * Creates or updates the customization template for an OpenID Connect (OIDC) subject claim.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_oidc_update_oidc_custom_sub_template_for_org',\n    description: `Creates or updates the customization template for an OpenID Connect (OIDC) subject claim.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.OidcUpdateOidcCustomSubTemplateForOrgParamsSchema,\n    tags: ['oidc']\n  })\n  async oidcUpdateOidcCustomSubTemplateForOrg(\n    params: github.OidcUpdateOidcCustomSubTemplateForOrgParams\n  ): Promise<github.OidcUpdateOidcCustomSubTemplateForOrgResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/actions/oidc/customization/sub`, {\n        json: pick(params, 'include_claim_keys')\n      })\n      .json<github.OidcUpdateOidcCustomSubTemplateForOrgResponse>()\n  }\n\n  /**\n * Gets the GitHub Actions permissions policy for repositories and allowed actions and reusable workflows in an organization.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_github_actions_permissions_organization',\n    description: `Gets the GitHub Actions permissions policy for repositories and allowed actions and reusable workflows in an organization.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsGetGithubActionsPermissionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetGithubActionsPermissionsOrganization(\n    params: github.ActionsGetGithubActionsPermissionsOrganizationParams\n  ): Promise<github.ActionsGetGithubActionsPermissionsOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/permissions`)\n      .json<github.ActionsGetGithubActionsPermissionsOrganizationResponse>()\n  }\n\n  /**\n * Sets the GitHub Actions permissions policy for repositories and allowed actions and reusable workflows in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_github_actions_permissions_organization',\n    description: `Sets the GitHub Actions permissions policy for repositories and allowed actions and reusable workflows in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsSetGithubActionsPermissionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetGithubActionsPermissionsOrganization(\n    params: github.ActionsSetGithubActionsPermissionsOrganizationParams\n  ): Promise<github.ActionsSetGithubActionsPermissionsOrganizationResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/actions/permissions`, {\n        json: pick(params, 'enabled_repositories', 'allowed_actions')\n      })\n      .json<github.ActionsSetGithubActionsPermissionsOrganizationResponse>()\n  }\n\n  /**\n * Lists the selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for `enabled_repositories` must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_selected_repositories_enabled_github_actions_organization',\n    description: `Lists the selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for \\`enabled_repositories\\` must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListSelectedRepositoriesEnabledGithubActionsOrganization(\n    params: github.ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationParams\n  ): Promise<github.ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/permissions/repositories`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationResponse>()\n  }\n\n  /**\n * Replaces the list of selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for `enabled_repositories` must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_selected_repositories_enabled_github_actions_organization',\n    description: `Replaces the list of selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for \\`enabled_repositories\\` must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetSelectedRepositoriesEnabledGithubActionsOrganization(\n    params: github.ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationParams\n  ): Promise<github.ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/actions/permissions/repositories`, {\n        json: pick(params, 'selected_repository_ids')\n      })\n      .json<github.ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationResponse>()\n  }\n\n  /**\n * Adds a repository to the list of selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for `enabled_repositories` must be must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_enable_selected_repository_github_actions_organization',\n    description: `Adds a repository to the list of selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for \\`enabled_repositories\\` must be must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsEnableSelectedRepositoryGithubActionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsEnableSelectedRepositoryGithubActionsOrganization(\n    params: github.ActionsEnableSelectedRepositoryGithubActionsOrganizationParams\n  ): Promise<github.ActionsEnableSelectedRepositoryGithubActionsOrganizationResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/permissions/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsEnableSelectedRepositoryGithubActionsOrganizationResponse>()\n  }\n\n  /**\n * Removes a repository from the list of selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for `enabled_repositories` must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_disable_selected_repository_github_actions_organization',\n    description: `Removes a repository from the list of selected repositories that are enabled for GitHub Actions in an organization. To use this endpoint, the organization permission policy for \\`enabled_repositories\\` must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsDisableSelectedRepositoryGithubActionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDisableSelectedRepositoryGithubActionsOrganization(\n    params: github.ActionsDisableSelectedRepositoryGithubActionsOrganizationParams\n  ): Promise<github.ActionsDisableSelectedRepositoryGithubActionsOrganizationResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/permissions/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsDisableSelectedRepositoryGithubActionsOrganizationResponse>()\n  }\n\n  /**\n * Gets the selected actions and reusable workflows that are allowed in an organization. To use this endpoint, the organization permission policy for `allowed_actions` must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_allowed_actions_organization',\n    description: `Gets the selected actions and reusable workflows that are allowed in an organization. To use this endpoint, the organization permission policy for \\`allowed_actions\\` must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetAllowedActionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetAllowedActionsOrganization(\n    params: github.ActionsGetAllowedActionsOrganizationParams\n  ): Promise<github.ActionsGetAllowedActionsOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/permissions/selected-actions`)\n      .json<github.ActionsGetAllowedActionsOrganizationResponse>()\n  }\n\n  /**\n * Sets the actions and reusable workflows that are allowed in an organization. To use this endpoint, the organization permission policy for `allowed_actions` must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_allowed_actions_organization',\n    description: `Sets the actions and reusable workflows that are allowed in an organization. To use this endpoint, the organization permission policy for \\`allowed_actions\\` must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for an organization](#set-github-actions-permissions-for-an-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsSetAllowedActionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetAllowedActionsOrganization(\n    params: github.ActionsSetAllowedActionsOrganizationParams\n  ): Promise<github.ActionsSetAllowedActionsOrganizationResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/actions/permissions/selected-actions`, {\n        json: pick(\n          params,\n          'github_owned_allowed',\n          'verified_allowed',\n          'patterns_allowed'\n        )\n      })\n      .json<github.ActionsSetAllowedActionsOrganizationResponse>()\n  }\n\n  /**\n * Gets the default workflow permissions granted to the `GITHUB_TOKEN` when running workflows in an organization,\nas well as whether GitHub Actions can submit approving pull request reviews. For more information, see\n\"[Setting the permissions of the GITHUB_TOKEN for your organization](https://docs.github.com/organizations/managing-organization-settings/disabling-or-limiting-github-actions-for-your-organization#setting-the-permissions-of-the-github_token-for-your-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_github_actions_default_workflow_permissions_organization',\n    description: `Gets the default workflow permissions granted to the \\`GITHUB_TOKEN\\` when running workflows in an organization,\nas well as whether GitHub Actions can submit approving pull request reviews. For more information, see\n\"[Setting the permissions of the GITHUB_TOKEN for your organization](https://docs.github.com/organizations/managing-organization-settings/disabling-or-limiting-github-actions-for-your-organization#setting-the-permissions-of-the-github_token-for-your-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetGithubActionsDefaultWorkflowPermissionsOrganization(\n    params: github.ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationParams\n  ): Promise<github.ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/permissions/workflow`)\n      .json<github.ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationResponse>()\n  }\n\n  /**\n * Sets the default workflow permissions granted to the `GITHUB_TOKEN` when running workflows in an organization, and sets if GitHub Actions\ncan submit approving pull request reviews. For more information, see\n\"[Setting the permissions of the GITHUB_TOKEN for your organization](https://docs.github.com/organizations/managing-organization-settings/disabling-or-limiting-github-actions-for-your-organization#setting-the-permissions-of-the-github_token-for-your-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_github_actions_default_workflow_permissions_organization',\n    description: `Sets the default workflow permissions granted to the \\`GITHUB_TOKEN\\` when running workflows in an organization, and sets if GitHub Actions\ncan submit approving pull request reviews. For more information, see\n\"[Setting the permissions of the GITHUB_TOKEN for your organization](https://docs.github.com/organizations/managing-organization-settings/disabling-or-limiting-github-actions-for-your-organization#setting-the-permissions-of-the-github_token-for-your-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetGithubActionsDefaultWorkflowPermissionsOrganization(\n    params: github.ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationParams\n  ): Promise<github.ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/actions/permissions/workflow`, {\n        json: pick(\n          params,\n          'default_workflow_permissions',\n          'can_approve_pull_request_reviews'\n        )\n      })\n      .json<github.ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationResponse>()\n  }\n\n  /**\n * Lists all self-hosted runner groups configured in an organization and inherited from an enterprise.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_self_hosted_runner_groups_for_org',\n    description: `Lists all self-hosted runner groups configured in an organization and inherited from an enterprise.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListSelfHostedRunnerGroupsForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListSelfHostedRunnerGroupsForOrg(\n    params: github.ActionsListSelfHostedRunnerGroupsForOrgParams\n  ): Promise<github.ActionsListSelfHostedRunnerGroupsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/runner-groups`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'visible_to_repository')\n        )\n      })\n      .json<github.ActionsListSelfHostedRunnerGroupsForOrgResponse>()\n  }\n\n  /**\n * Creates a new self-hosted runner group for an organization.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_self_hosted_runner_group_for_org',\n    description: `Creates a new self-hosted runner group for an organization.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateSelfHostedRunnerGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateSelfHostedRunnerGroupForOrg(\n    params: github.ActionsCreateSelfHostedRunnerGroupForOrgParams\n  ): Promise<github.ActionsCreateSelfHostedRunnerGroupForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/actions/runner-groups`, {\n        json: pick(\n          params,\n          'name',\n          'visibility',\n          'selected_repository_ids',\n          'runners',\n          'allows_public_repositories',\n          'restricted_to_workflows',\n          'selected_workflows',\n          'network_configuration_id'\n        )\n      })\n      .json<github.ActionsCreateSelfHostedRunnerGroupForOrgResponse>()\n  }\n\n  /**\n * Gets a specific self-hosted runner group for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_self_hosted_runner_group_for_org',\n    description: `Gets a specific self-hosted runner group for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetSelfHostedRunnerGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetSelfHostedRunnerGroupForOrg(\n    params: github.ActionsGetSelfHostedRunnerGroupForOrgParams\n  ): Promise<github.ActionsGetSelfHostedRunnerGroupForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}`,\n        {}\n      )\n      .json<github.ActionsGetSelfHostedRunnerGroupForOrgResponse>()\n  }\n\n  /**\n * Deletes a self-hosted runner group for an organization.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_self_hosted_runner_group_from_org',\n    description: `Deletes a self-hosted runner group for an organization.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteSelfHostedRunnerGroupFromOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteSelfHostedRunnerGroupFromOrg(\n    params: github.ActionsDeleteSelfHostedRunnerGroupFromOrgParams\n  ): Promise<github.ActionsDeleteSelfHostedRunnerGroupFromOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}`,\n        {}\n      )\n      .json<github.ActionsDeleteSelfHostedRunnerGroupFromOrgResponse>()\n  }\n\n  /**\n * Updates the `name` and `visibility` of a self-hosted runner group in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_update_self_hosted_runner_group_for_org',\n    description: `Updates the \\`name\\` and \\`visibility\\` of a self-hosted runner group in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsUpdateSelfHostedRunnerGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsUpdateSelfHostedRunnerGroupForOrg(\n    params: github.ActionsUpdateSelfHostedRunnerGroupForOrgParams\n  ): Promise<github.ActionsUpdateSelfHostedRunnerGroupForOrgResponse> {\n    return this.ky\n      .patch(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}`,\n        {\n          json: pick(\n            params,\n            'name',\n            'visibility',\n            'allows_public_repositories',\n            'restricted_to_workflows',\n            'selected_workflows',\n            'network_configuration_id'\n          )\n        }\n      )\n      .json<github.ActionsUpdateSelfHostedRunnerGroupForOrgResponse>()\n  }\n\n  /**\n * Lists the GitHub-hosted runners in an organization group.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_github_hosted_runners_in_group_for_org',\n    description: `Lists the GitHub-hosted runners in an organization group.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListGithubHostedRunnersInGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListGithubHostedRunnersInGroupForOrg(\n    params: github.ActionsListGithubHostedRunnersInGroupForOrgParams\n  ): Promise<github.ActionsListGithubHostedRunnersInGroupForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/hosted-runners`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ActionsListGithubHostedRunnersInGroupForOrgResponse>()\n  }\n\n  /**\n * Lists the repositories with access to a self-hosted runner group configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_repo_access_to_self_hosted_runner_group_in_org',\n    description: `Lists the repositories with access to a self-hosted runner group configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsListRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRepoAccessToSelfHostedRunnerGroupInOrg(\n    params: github.ActionsListRepoAccessToSelfHostedRunnerGroupInOrgParams\n  ): Promise<github.ActionsListRepoAccessToSelfHostedRunnerGroupInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.ActionsListRepoAccessToSelfHostedRunnerGroupInOrgResponse>()\n  }\n\n  /**\n * Replaces the list of repositories that have access to a self-hosted runner group configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_repo_access_to_self_hosted_runner_group_in_org',\n    description: `Replaces the list of repositories that have access to a self-hosted runner group configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetRepoAccessToSelfHostedRunnerGroupInOrg(\n    params: github.ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgParams\n  ): Promise<github.ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/repositories`,\n        {\n          json: pick(params, 'selected_repository_ids')\n        }\n      )\n      .json<github.ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgResponse>()\n  }\n\n  /**\n * Adds a repository to the list of repositories that can access a self-hosted runner group. The runner group must have `visibility` set to `selected`. For more information, see \"[Create a self-hosted runner group for an organization](#create-a-self-hosted-runner-group-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_add_repo_access_to_self_hosted_runner_group_in_org',\n    description: `Adds a repository to the list of repositories that can access a self-hosted runner group. The runner group must have \\`visibility\\` set to \\`selected\\`. For more information, see \"[Create a self-hosted runner group for an organization](#create-a-self-hosted-runner-group-for-an-organization).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsAddRepoAccessToSelfHostedRunnerGroupInOrg(\n    params: github.ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgParams\n  ): Promise<github.ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgResponse>()\n  }\n\n  /**\n * Removes a repository from the list of selected repositories that can access a self-hosted runner group. The runner group must have `visibility` set to `selected`. For more information, see \"[Create a self-hosted runner group for an organization](#create-a-self-hosted-runner-group-for-an-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_remove_repo_access_to_self_hosted_runner_group_in_org',\n    description: `Removes a repository from the list of selected repositories that can access a self-hosted runner group. The runner group must have \\`visibility\\` set to \\`selected\\`. For more information, see \"[Create a self-hosted runner group for an organization](#create-a-self-hosted-runner-group-for-an-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveRepoAccessToSelfHostedRunnerGroupInOrg(\n    params: github.ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgParams\n  ): Promise<github.ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgResponse>()\n  }\n\n  /**\n * Lists self-hosted runners that are in a specific organization group.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_self_hosted_runners_in_group_for_org',\n    description: `Lists self-hosted runners that are in a specific organization group.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListSelfHostedRunnersInGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListSelfHostedRunnersInGroupForOrg(\n    params: github.ActionsListSelfHostedRunnersInGroupForOrgParams\n  ): Promise<github.ActionsListSelfHostedRunnersInGroupForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/runners`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ActionsListSelfHostedRunnersInGroupForOrgResponse>()\n  }\n\n  /**\n * Replaces the list of self-hosted runners that are part of an organization runner group.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_self_hosted_runners_in_group_for_org',\n    description: `Replaces the list of self-hosted runners that are part of an organization runner group.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsSetSelfHostedRunnersInGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetSelfHostedRunnersInGroupForOrg(\n    params: github.ActionsSetSelfHostedRunnersInGroupForOrgParams\n  ): Promise<github.ActionsSetSelfHostedRunnersInGroupForOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/runners`,\n        {\n          json: pick(params, 'runners')\n        }\n      )\n      .json<github.ActionsSetSelfHostedRunnersInGroupForOrgResponse>()\n  }\n\n  /**\n * Adds a self-hosted runner to a runner group configured in an organization.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_add_self_hosted_runner_to_group_for_org',\n    description: `Adds a self-hosted runner to a runner group configured in an organization.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsAddSelfHostedRunnerToGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsAddSelfHostedRunnerToGroupForOrg(\n    params: github.ActionsAddSelfHostedRunnerToGroupForOrgParams\n  ): Promise<github.ActionsAddSelfHostedRunnerToGroupForOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/runners/${params.runner_id}`,\n        {}\n      )\n      .json<github.ActionsAddSelfHostedRunnerToGroupForOrgResponse>()\n  }\n\n  /**\n * Removes a self-hosted runner from a group configured in an organization. The runner is then returned to the default group.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_remove_self_hosted_runner_from_group_for_org',\n    description: `Removes a self-hosted runner from a group configured in an organization. The runner is then returned to the default group.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsRemoveSelfHostedRunnerFromGroupForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveSelfHostedRunnerFromGroupForOrg(\n    params: github.ActionsRemoveSelfHostedRunnerFromGroupForOrgParams\n  ): Promise<github.ActionsRemoveSelfHostedRunnerFromGroupForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/runner-groups/${params.runner_group_id}/runners/${params.runner_id}`,\n        {}\n      )\n      .json<github.ActionsRemoveSelfHostedRunnerFromGroupForOrgResponse>()\n  }\n\n  /**\n * Lists all self-hosted runners configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_list_self_hosted_runners_for_org',\n    description: `Lists all self-hosted runners configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsListSelfHostedRunnersForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListSelfHostedRunnersForOrg(\n    params: github.ActionsListSelfHostedRunnersForOrgParams\n  ): Promise<github.ActionsListSelfHostedRunnersForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/runners`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'name', 'per_page', 'page')\n        )\n      })\n      .json<github.ActionsListSelfHostedRunnersForOrgResponse>()\n  }\n\n  /**\n * Lists binaries for the runner application that you can download and run.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.  If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_list_runner_applications_for_org',\n    description: `Lists binaries for the runner application that you can download and run.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.  If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsListRunnerApplicationsForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRunnerApplicationsForOrg(\n    params: github.ActionsListRunnerApplicationsForOrgParams\n  ): Promise<github.ActionsListRunnerApplicationsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/runners/downloads`)\n      .json<github.ActionsListRunnerApplicationsForOrgResponse>()\n  }\n\n  /**\n * Generates a configuration that can be passed to the runner application at startup.\n\nThe authenticated user must have admin access to the organization.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_generate_runner_jitconfig_for_org',\n    description: `Generates a configuration that can be passed to the runner application at startup.\n\nThe authenticated user must have admin access to the organization.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGenerateRunnerJitconfigForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGenerateRunnerJitconfigForOrg(\n    params: github.ActionsGenerateRunnerJitconfigForOrgParams\n  ): Promise<github.ActionsGenerateRunnerJitconfigForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/actions/runners/generate-jitconfig`, {\n        json: pick(params, 'name', 'runner_group_id', 'labels', 'work_folder')\n      })\n      .json<github.ActionsGenerateRunnerJitconfigForOrgResponse>()\n  }\n\n  /**\n * Returns a token that you can pass to the `config` script. The token expires after one hour.\n\nFor example, you can replace `TOKEN` in the following example with the registration token provided by this endpoint to configure your self-hosted runner:\n\n```\n./config.sh --url https://github.com/octo-org --token TOKEN\n```\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_registration_token_for_org',\n    description: `Returns a token that you can pass to the \\`config\\` script. The token expires after one hour.\n\nFor example, you can replace \\`TOKEN\\` in the following example with the registration token provided by this endpoint to configure your self-hosted runner:\n\n\\`\\`\\`\n./config.sh --url https://github.com/octo-org --token TOKEN\n\\`\\`\\`\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateRegistrationTokenForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateRegistrationTokenForOrg(\n    params: github.ActionsCreateRegistrationTokenForOrgParams\n  ): Promise<github.ActionsCreateRegistrationTokenForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/actions/runners/registration-token`)\n      .json<github.ActionsCreateRegistrationTokenForOrgResponse>()\n  }\n\n  /**\n * Returns a token that you can pass to the `config` script to remove a self-hosted runner from an organization. The token expires after one hour.\n\nFor example, you can replace `TOKEN` in the following example with the registration token provided by this endpoint to remove your self-hosted runner from an organization:\n\n```\n./config.sh remove --token TOKEN\n```\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_remove_token_for_org',\n    description: `Returns a token that you can pass to the \\`config\\` script to remove a self-hosted runner from an organization. The token expires after one hour.\n\nFor example, you can replace \\`TOKEN\\` in the following example with the registration token provided by this endpoint to remove your self-hosted runner from an organization:\n\n\\`\\`\\`\n./config.sh remove --token TOKEN\n\\`\\`\\`\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateRemoveTokenForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateRemoveTokenForOrg(\n    params: github.ActionsCreateRemoveTokenForOrgParams\n  ): Promise<github.ActionsCreateRemoveTokenForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/actions/runners/remove-token`)\n      .json<github.ActionsCreateRemoveTokenForOrgResponse>()\n  }\n\n  /**\n * Gets a specific self-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_get_self_hosted_runner_for_org',\n    description: `Gets a specific self-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsGetSelfHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetSelfHostedRunnerForOrg(\n    params: github.ActionsGetSelfHostedRunnerForOrgParams\n  ): Promise<github.ActionsGetSelfHostedRunnerForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/runners/${params.runner_id}`, {})\n      .json<github.ActionsGetSelfHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Forces the removal of a self-hosted runner from an organization. You can use this endpoint to completely remove the runner when the machine you were using no longer exists.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_self_hosted_runner_from_org',\n    description: `Forces the removal of a self-hosted runner from an organization. You can use this endpoint to completely remove the runner when the machine you were using no longer exists.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteSelfHostedRunnerFromOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteSelfHostedRunnerFromOrg(\n    params: github.ActionsDeleteSelfHostedRunnerFromOrgParams\n  ): Promise<github.ActionsDeleteSelfHostedRunnerFromOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/runners/${params.runner_id}`,\n        {}\n      )\n      .json<github.ActionsDeleteSelfHostedRunnerFromOrgResponse>()\n  }\n\n  /**\n * Lists all labels for a self-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_list_labels_for_self_hosted_runner_for_org',\n    description: `Lists all labels for a self-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsListLabelsForSelfHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListLabelsForSelfHostedRunnerForOrg(\n    params: github.ActionsListLabelsForSelfHostedRunnerForOrgParams\n  ): Promise<github.ActionsListLabelsForSelfHostedRunnerForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/runners/${params.runner_id}/labels`,\n        {}\n      )\n      .json<github.ActionsListLabelsForSelfHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Adds custom labels to a self-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_add_custom_labels_to_self_hosted_runner_for_org',\n    description: `Adds custom labels to a self-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsAddCustomLabelsToSelfHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsAddCustomLabelsToSelfHostedRunnerForOrg(\n    params: github.ActionsAddCustomLabelsToSelfHostedRunnerForOrgParams\n  ): Promise<github.ActionsAddCustomLabelsToSelfHostedRunnerForOrgResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/actions/runners/${params.runner_id}/labels`,\n        {\n          json: pick(params, 'labels')\n        }\n      )\n      .json<github.ActionsAddCustomLabelsToSelfHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Remove all previous custom labels and set the new custom labels for a specific\nself-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_set_custom_labels_for_self_hosted_runner_for_org',\n    description: `Remove all previous custom labels and set the new custom labels for a specific\nself-hosted runner configured in an organization.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema:\n      github.ActionsSetCustomLabelsForSelfHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetCustomLabelsForSelfHostedRunnerForOrg(\n    params: github.ActionsSetCustomLabelsForSelfHostedRunnerForOrgParams\n  ): Promise<github.ActionsSetCustomLabelsForSelfHostedRunnerForOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/runners/${params.runner_id}/labels`,\n        {\n          json: pick(params, 'labels')\n        }\n      )\n      .json<github.ActionsSetCustomLabelsForSelfHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Remove all custom labels from a self-hosted runner configured in an\norganization. Returns the remaining read-only labels from the runner.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_remove_all_custom_labels_from_self_hosted_runner_for_org',\n    description: `Remove all custom labels from a self-hosted runner configured in an\norganization. Returns the remaining read-only labels from the runner.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema:\n      github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrg(\n    params: github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgParams\n  ): Promise<github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/runners/${params.runner_id}/labels`,\n        {}\n      )\n      .json<github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Remove a custom label from a self-hosted runner configured\nin an organization. Returns the remaining labels from the runner.\n\nThis endpoint returns a `404 Not Found` status if the custom label is not\npresent on the runner.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_remove_custom_label_from_self_hosted_runner_for_org',\n    description: `Remove a custom label from a self-hosted runner configured\nin an organization. Returns the remaining labels from the runner.\n\nThis endpoint returns a \\`404 Not Found\\` status if the custom label is not\npresent on the runner.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema:\n      github.ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveCustomLabelFromSelfHostedRunnerForOrg(\n    params: github.ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgParams\n  ): Promise<github.ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/runners/${params.runner_id}/labels/${params.name}`,\n        {}\n      )\n      .json<github.ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgResponse>()\n  }\n\n  /**\n * Lists all secrets available in an organization without revealing their\nencrypted values.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_list_org_secrets',\n    description: `Lists all secrets available in an organization without revealing their\nencrypted values.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsListOrgSecretsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListOrgSecrets(\n    params: github.ActionsListOrgSecretsParams\n  ): Promise<github.ActionsListOrgSecretsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/secrets`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsListOrgSecretsResponse>()\n  }\n\n  /**\n * Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nThe authenticated user must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_org_public_key',\n    description: `Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nThe authenticated user must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetOrgPublicKeyParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetOrgPublicKey(\n    params: github.ActionsGetOrgPublicKeyParams\n  ): Promise<github.ActionsGetOrgPublicKeyResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/secrets/public-key`)\n      .json<github.ActionsGetOrgPublicKeyResponse>()\n  }\n\n  /**\n * Gets a single organization secret without revealing its encrypted value.\n\nThe authenticated user must have collaborator access to a repository to create, update, or read secrets\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_org_secret',\n    description: `Gets a single organization secret without revealing its encrypted value.\n\nThe authenticated user must have collaborator access to a repository to create, update, or read secrets\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetOrgSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetOrgSecret(\n    params: github.ActionsGetOrgSecretParams\n  ): Promise<github.ActionsGetOrgSecretResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.ActionsGetOrgSecretResponse>()\n  }\n\n  /**\n * Creates or updates an organization secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_or_update_org_secret',\n    description: `Creates or updates an organization secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateOrUpdateOrgSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateOrUpdateOrgSecret(\n    params: github.ActionsCreateOrUpdateOrgSecretParams\n  ): Promise<github.ActionsCreateOrUpdateOrgSecretResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/actions/secrets/${params.secret_name}`, {\n        json: pick(\n          params,\n          'encrypted_value',\n          'key_id',\n          'visibility',\n          'selected_repository_ids'\n        )\n      })\n      .json<github.ActionsCreateOrUpdateOrgSecretResponse>()\n  }\n\n  /**\n * Deletes a secret in an organization using the secret name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_org_secret',\n    description: `Deletes a secret in an organization using the secret name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteOrgSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteOrgSecret(\n    params: github.ActionsDeleteOrgSecretParams\n  ): Promise<github.ActionsDeleteOrgSecretResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.ActionsDeleteOrgSecretResponse>()\n  }\n\n  /**\n * Lists all repositories that have been selected when the `visibility`\nfor repository access to a secret is set to `selected`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_list_selected_repos_for_org_secret',\n    description: `Lists all repositories that have been selected when the \\`visibility\\`\nfor repository access to a secret is set to \\`selected\\`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsListSelectedReposForOrgSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListSelectedReposForOrgSecret(\n    params: github.ActionsListSelectedReposForOrgSecretParams\n  ): Promise<github.ActionsListSelectedReposForOrgSecretResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/secrets/${params.secret_name}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.ActionsListSelectedReposForOrgSecretResponse>()\n  }\n\n  /**\n * Replaces all repositories for an organization secret when the `visibility`\nfor repository access is set to `selected`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret).\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_set_selected_repos_for_org_secret',\n    description: `Replaces all repositories for an organization secret when the \\`visibility\\`\nfor repository access is set to \\`selected\\`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret).\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsSetSelectedReposForOrgSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetSelectedReposForOrgSecret(\n    params: github.ActionsSetSelectedReposForOrgSecretParams\n  ): Promise<github.ActionsSetSelectedReposForOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/secrets/${params.secret_name}/repositories`,\n        {\n          json: pick(params, 'selected_repository_ids')\n        }\n      )\n      .json<github.ActionsSetSelectedReposForOrgSecretResponse>()\n  }\n\n  /**\n * Adds a repository to an organization secret when the `visibility` for\nrepository access is set to `selected`. For more information about setting the visibility, see [Create or\nupdate an organization secret](https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret).\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_add_selected_repo_to_org_secret',\n    description: `Adds a repository to an organization secret when the \\`visibility\\` for\nrepository access is set to \\`selected\\`. For more information about setting the visibility, see [Create or\nupdate an organization secret](https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret).\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsAddSelectedRepoToOrgSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsAddSelectedRepoToOrgSecret(\n    params: github.ActionsAddSelectedRepoToOrgSecretParams\n  ): Promise<github.ActionsAddSelectedRepoToOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsAddSelectedRepoToOrgSecretResponse>()\n  }\n\n  /**\n * Removes a repository from an organization secret when the `visibility`\nfor repository access is set to `selected`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret).\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_remove_selected_repo_from_org_secret',\n    description: `Removes a repository from an organization secret when the \\`visibility\\`\nfor repository access is set to \\`selected\\`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret).\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsRemoveSelectedRepoFromOrgSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveSelectedRepoFromOrgSecret(\n    params: github.ActionsRemoveSelectedRepoFromOrgSecretParams\n  ): Promise<github.ActionsRemoveSelectedRepoFromOrgSecretResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsRemoveSelectedRepoFromOrgSecretResponse>()\n  }\n\n  /**\n * Lists all organization variables.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_list_org_variables',\n    description: `Lists all organization variables.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsListOrgVariablesParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListOrgVariables(\n    params: github.ActionsListOrgVariablesParams\n  ): Promise<github.ActionsListOrgVariablesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/variables`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsListOrgVariablesResponse>()\n  }\n\n  /**\n * Creates an organization variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_org_variable',\n    description: `Creates an organization variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateOrgVariable(\n    params: github.ActionsCreateOrgVariableParams\n  ): Promise<github.ActionsCreateOrgVariableResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/actions/variables`, {\n        json: pick(\n          params,\n          'name',\n          'value',\n          'visibility',\n          'selected_repository_ids'\n        )\n      })\n      .json<github.ActionsCreateOrgVariableResponse>()\n  }\n\n  /**\n * Gets a specific variable in an organization.\n\nThe authenticated user must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_org_variable',\n    description: `Gets a specific variable in an organization.\n\nThe authenticated user must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetOrgVariable(\n    params: github.ActionsGetOrgVariableParams\n  ): Promise<github.ActionsGetOrgVariableResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/actions/variables/${params.name}`, {})\n      .json<github.ActionsGetOrgVariableResponse>()\n  }\n\n  /**\n * Deletes an organization variable using the variable name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the`admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_org_variable',\n    description: `Deletes an organization variable using the variable name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the\\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteOrgVariable(\n    params: github.ActionsDeleteOrgVariableParams\n  ): Promise<github.ActionsDeleteOrgVariableResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/actions/variables/${params.name}`, {})\n      .json<github.ActionsDeleteOrgVariableResponse>()\n  }\n\n  /**\n * Updates an organization variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_update_org_variable',\n    description: `Updates an organization variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsUpdateOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsUpdateOrgVariable(\n    params: github.ActionsUpdateOrgVariableParams\n  ): Promise<github.ActionsUpdateOrgVariableResponse> {\n    return this.ky\n      .patch(`/orgs/${params.org}/actions/variables/${params.name}`, {\n        json: pick(\n          params,\n          'name',\n          'value',\n          'visibility',\n          'selected_repository_ids'\n        )\n      })\n      .json<github.ActionsUpdateOrgVariableResponse>()\n  }\n\n  /**\n * Lists all repositories that can access an organization variable\nthat is available to selected repositories.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_list_selected_repos_for_org_variable',\n    description: `Lists all repositories that can access an organization variable\nthat is available to selected repositories.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsListSelectedReposForOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListSelectedReposForOrgVariable(\n    params: github.ActionsListSelectedReposForOrgVariableParams\n  ): Promise<github.ActionsListSelectedReposForOrgVariableResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/actions/variables/${params.name}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.ActionsListSelectedReposForOrgVariableResponse>()\n  }\n\n  /**\n * Replaces all repositories for an organization variable that is available\nto selected repositories. Organization variables that are available to selected\nrepositories have their `visibility` field set to `selected`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_set_selected_repos_for_org_variable',\n    description: `Replaces all repositories for an organization variable that is available\nto selected repositories. Organization variables that are available to selected\nrepositories have their \\`visibility\\` field set to \\`selected\\`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsSetSelectedReposForOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetSelectedReposForOrgVariable(\n    params: github.ActionsSetSelectedReposForOrgVariableParams\n  ): Promise<github.ActionsSetSelectedReposForOrgVariableResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/variables/${params.name}/repositories`,\n        {\n          json: pick(params, 'selected_repository_ids')\n        }\n      )\n      .json<github.ActionsSetSelectedReposForOrgVariableResponse>()\n  }\n\n  /**\n * Adds a repository to an organization variable that is available to selected repositories.\nOrganization variables that are available to selected repositories have their `visibility` field set to `selected`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_add_selected_repo_to_org_variable',\n    description: `Adds a repository to an organization variable that is available to selected repositories.\nOrganization variables that are available to selected repositories have their \\`visibility\\` field set to \\`selected\\`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsAddSelectedRepoToOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsAddSelectedRepoToOrgVariable(\n    params: github.ActionsAddSelectedRepoToOrgVariableParams\n  ): Promise<github.ActionsAddSelectedRepoToOrgVariableResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/actions/variables/${params.name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsAddSelectedRepoToOrgVariableResponse>()\n  }\n\n  /**\n * Removes a repository from an organization variable that is\navailable to selected repositories. Organization variables that are available to\nselected repositories have their `visibility` field set to `selected`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint. If the repository is private, the `repo` scope is also required.\n */\n  @aiFunction({\n    name: 'github_actions_remove_selected_repo_from_org_variable',\n    description: `Removes a repository from an organization variable that is\navailable to selected repositories. Organization variables that are available to\nselected repositories have their \\`visibility\\` field set to \\`selected\\`.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint. If the repository is private, the \\`repo\\` scope is also required.`,\n    inputSchema: github.ActionsRemoveSelectedRepoFromOrgVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveSelectedRepoFromOrgVariable(\n    params: github.ActionsRemoveSelectedRepoFromOrgVariableParams\n  ): Promise<github.ActionsRemoveSelectedRepoFromOrgVariableResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/actions/variables/${params.name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.ActionsRemoveSelectedRepoFromOrgVariableResponse>()\n  }\n\n  /**\n * List a collection of artifact attestations with a given subject digest that are associated with repositories owned by an organization.\n\nThe collection of attestations returned by this endpoint is filtered according to the authenticated user's permissions; if the authenticated user cannot read a repository, the attestations associated with that repository will not be included in the response. In addition, when using a fine-grained access token the `attestations:read` permission is required.\n\n**Please note:** in order to offer meaningful security benefits, an attestation's signature and timestamps **must** be cryptographically verified, and the identity of the attestation signer **must** be validated. Attestations can be verified using the [GitHub CLI `attestation verify` command](https://cli.github.com/manual/gh_attestation_verify). For more information, see [our guide on how to use artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n */\n  @aiFunction({\n    name: 'github_orgs_list_attestations',\n    description: `List a collection of artifact attestations with a given subject digest that are associated with repositories owned by an organization.\n\nThe collection of attestations returned by this endpoint is filtered according to the authenticated user's permissions; if the authenticated user cannot read a repository, the attestations associated with that repository will not be included in the response. In addition, when using a fine-grained access token the \\`attestations:read\\` permission is required.\n\n**Please note:** in order to offer meaningful security benefits, an attestation's signature and timestamps **must** be cryptographically verified, and the identity of the attestation signer **must** be validated. Attestations can be verified using the [GitHub CLI \\`attestation verify\\` command](https://cli.github.com/manual/gh_attestation_verify). For more information, see [our guide on how to use artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).`,\n    inputSchema: github.OrgsListAttestationsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListAttestations(\n    params: github.OrgsListAttestationsParams\n  ): Promise<github.OrgsListAttestationsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/attestations/${params.subject_digest}`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'before', 'after', 'predicate_type')\n        )\n      })\n      .json<github.OrgsListAttestationsResponse>()\n  }\n\n  /**\n   * List the users blocked by an organization.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_blocked_users',\n    description: `List the users blocked by an organization.`,\n    inputSchema: github.OrgsListBlockedUsersParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListBlockedUsers(\n    params: github.OrgsListBlockedUsersParams\n  ): Promise<github.OrgsListBlockedUsersResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/blocks`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsListBlockedUsersResponse>()\n  }\n\n  /**\n   * Returns a 204 if the given user is blocked by the given organization. Returns a 404 if the organization is not blocking the user, or if the user account has been identified as spam by GitHub.\n   */\n  @aiFunction({\n    name: 'github_orgs_check_blocked_user',\n    description: `Returns a 204 if the given user is blocked by the given organization. Returns a 404 if the organization is not blocking the user, or if the user account has been identified as spam by GitHub.`,\n    inputSchema: github.OrgsCheckBlockedUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCheckBlockedUser(\n    params: github.OrgsCheckBlockedUserParams\n  ): Promise<github.OrgsCheckBlockedUserResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/blocks/${params.username}`, {})\n      .json<github.OrgsCheckBlockedUserResponse>()\n  }\n\n  /**\n   * Blocks the given user on behalf of the specified organization and returns a 204. If the organization cannot block the given user a 422 is returned.\n   */\n  @aiFunction({\n    name: 'github_orgs_block_user',\n    description: `Blocks the given user on behalf of the specified organization and returns a 204. If the organization cannot block the given user a 422 is returned.`,\n    inputSchema: github.OrgsBlockUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsBlockUser(\n    params: github.OrgsBlockUserParams\n  ): Promise<github.OrgsBlockUserResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/blocks/${params.username}`, {})\n      .json<github.OrgsBlockUserResponse>()\n  }\n\n  /**\n   * Unblocks the given user on behalf of the specified organization.\n   */\n  @aiFunction({\n    name: 'github_orgs_unblock_user',\n    description: `Unblocks the given user on behalf of the specified organization.`,\n    inputSchema: github.OrgsUnblockUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUnblockUser(\n    params: github.OrgsUnblockUserParams\n  ): Promise<github.OrgsUnblockUserResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/blocks/${params.username}`, {})\n      .json<github.OrgsUnblockUserResponse>()\n  }\n\n  /**\n * Lists code scanning alerts for the default branch for all eligible repositories in an organization. Eligible repositories are repositories that are owned by organizations that you own or for which you are a security manager. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nThe authenticated user must be an owner or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` or `repo`s cope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_list_alerts_for_org',\n    description: `Lists code scanning alerts for the default branch for all eligible repositories in an organization. Eligible repositories are repositories that are owned by organizations that you own or for which you are a security manager. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nThe authenticated user must be an owner or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` or \\`repo\\`s cope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningListAlertsForOrgParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningListAlertsForOrg(\n    params: github.CodeScanningListAlertsForOrgParams\n  ): Promise<github.CodeScanningListAlertsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/code-scanning/alerts`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'tool_name',\n            'tool_guid',\n            'before',\n            'after',\n            'page',\n            'per_page',\n            'direction',\n            'state',\n            'sort',\n            'severity'\n          )\n        )\n      })\n      .json<github.CodeScanningListAlertsForOrgResponse>()\n  }\n\n  /**\n * Lists all code security configurations available in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_configurations_for_org',\n    description: `Lists all code security configurations available in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityGetConfigurationsForOrgParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetConfigurationsForOrg(\n    params: github.CodeSecurityGetConfigurationsForOrgParams\n  ): Promise<github.CodeSecurityGetConfigurationsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/code-security/configurations`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'target_type', 'per_page', 'before', 'after')\n        )\n      })\n      .json<github.CodeSecurityGetConfigurationsForOrgResponse>()\n  }\n\n  /**\n * Creates a code security configuration in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_create_configuration',\n    description: `Creates a code security configuration in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityCreateConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityCreateConfiguration(\n    params: github.CodeSecurityCreateConfigurationParams\n  ): Promise<github.CodeSecurityCreateConfigurationResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/code-security/configurations`, {\n        json: pick(\n          params,\n          'name',\n          'description',\n          'advanced_security',\n          'dependency_graph',\n          'dependency_graph_autosubmit_action',\n          'dependency_graph_autosubmit_action_options',\n          'dependabot_alerts',\n          'dependabot_security_updates',\n          'code_scanning_default_setup',\n          'code_scanning_default_setup_options',\n          'code_scanning_delegated_alert_dismissal',\n          'secret_scanning',\n          'secret_scanning_push_protection',\n          'secret_scanning_delegated_bypass',\n          'secret_scanning_delegated_bypass_options',\n          'secret_scanning_validity_checks',\n          'secret_scanning_non_provider_patterns',\n          'secret_scanning_generic_secrets',\n          'secret_scanning_delegated_alert_dismissal',\n          'private_vulnerability_reporting',\n          'enforcement'\n        )\n      })\n      .json<github.CodeSecurityCreateConfigurationResponse>()\n  }\n\n  /**\n * Lists the default code security configurations for an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_default_configurations',\n    description: `Lists the default code security configurations for an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityGetDefaultConfigurationsParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetDefaultConfigurations(\n    params: github.CodeSecurityGetDefaultConfigurationsParams\n  ): Promise<github.CodeSecurityGetDefaultConfigurationsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/code-security/configurations/defaults`)\n      .json<github.CodeSecurityGetDefaultConfigurationsResponse>()\n  }\n\n  /**\n * Detach code security configuration(s) from a set of repositories.\nRepositories will retain their settings but will no longer be associated with the configuration.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_detach_configuration',\n    description: `Detach code security configuration(s) from a set of repositories.\nRepositories will retain their settings but will no longer be associated with the configuration.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityDetachConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityDetachConfiguration(\n    params: github.CodeSecurityDetachConfigurationParams\n  ): Promise<github.CodeSecurityDetachConfigurationResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/code-security/configurations/detach`, {\n        json: pick(params, 'selected_repository_ids')\n      })\n      .json<github.CodeSecurityDetachConfigurationResponse>()\n  }\n\n  /**\n * Gets a code security configuration available in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_configuration',\n    description: `Gets a code security configuration available in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityGetConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetConfiguration(\n    params: github.CodeSecurityGetConfigurationParams\n  ): Promise<github.CodeSecurityGetConfigurationResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/code-security/configurations/${params.configuration_id}`,\n        {}\n      )\n      .json<github.CodeSecurityGetConfigurationResponse>()\n  }\n\n  /**\n * Deletes the desired code security configuration from an organization.\nRepositories attached to the configuration will retain their settings but will no longer be associated with\nthe configuration.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_delete_configuration',\n    description: `Deletes the desired code security configuration from an organization.\nRepositories attached to the configuration will retain their settings but will no longer be associated with\nthe configuration.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityDeleteConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityDeleteConfiguration(\n    params: github.CodeSecurityDeleteConfigurationParams\n  ): Promise<github.CodeSecurityDeleteConfigurationResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/code-security/configurations/${params.configuration_id}`,\n        {}\n      )\n      .json<github.CodeSecurityDeleteConfigurationResponse>()\n  }\n\n  /**\n * Updates a code security configuration in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_update_configuration',\n    description: `Updates a code security configuration in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityUpdateConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityUpdateConfiguration(\n    params: github.CodeSecurityUpdateConfigurationParams\n  ): Promise<github.CodeSecurityUpdateConfigurationResponse> {\n    return this.ky\n      .patch(\n        `/orgs/${params.org}/code-security/configurations/${params.configuration_id}`,\n        {\n          json: pick(\n            params,\n            'name',\n            'description',\n            'advanced_security',\n            'dependency_graph',\n            'dependency_graph_autosubmit_action',\n            'dependency_graph_autosubmit_action_options',\n            'dependabot_alerts',\n            'dependabot_security_updates',\n            'code_scanning_default_setup',\n            'code_scanning_default_setup_options',\n            'code_scanning_delegated_alert_dismissal',\n            'secret_scanning',\n            'secret_scanning_push_protection',\n            'secret_scanning_delegated_bypass',\n            'secret_scanning_delegated_bypass_options',\n            'secret_scanning_validity_checks',\n            'secret_scanning_non_provider_patterns',\n            'secret_scanning_generic_secrets',\n            'secret_scanning_delegated_alert_dismissal',\n            'private_vulnerability_reporting',\n            'enforcement'\n          )\n        }\n      )\n      .json<github.CodeSecurityUpdateConfigurationResponse>()\n  }\n\n  /**\n * Attach a code security configuration to a set of repositories. If the repositories specified are already attached to a configuration, they will be re-attached to the provided configuration.\n\nIf insufficient GHAS licenses are available to attach the configuration to a repository, only free features will be enabled.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_attach_configuration',\n    description: `Attach a code security configuration to a set of repositories. If the repositories specified are already attached to a configuration, they will be re-attached to the provided configuration.\n\nIf insufficient GHAS licenses are available to attach the configuration to a repository, only free features will be enabled.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityAttachConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityAttachConfiguration(\n    params: github.CodeSecurityAttachConfigurationParams\n  ): Promise<github.CodeSecurityAttachConfigurationResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/code-security/configurations/${params.configuration_id}/attach`,\n        {\n          json: pick(params, 'scope', 'selected_repository_ids')\n        }\n      )\n      .json<github.CodeSecurityAttachConfigurationResponse>()\n  }\n\n  /**\n * Sets a code security configuration as a default to be applied to new repositories in your organization.\n\nThis configuration will be applied to the matching repository type (all, none, public, private and internal) by default when they are created.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_set_configuration_as_default',\n    description: `Sets a code security configuration as a default to be applied to new repositories in your organization.\n\nThis configuration will be applied to the matching repository type (all, none, public, private and internal) by default when they are created.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecuritySetConfigurationAsDefaultParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecuritySetConfigurationAsDefault(\n    params: github.CodeSecuritySetConfigurationAsDefaultParams\n  ): Promise<github.CodeSecuritySetConfigurationAsDefaultResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/code-security/configurations/${params.configuration_id}/defaults`,\n        {\n          json: pick(params, 'default_for_new_repos')\n        }\n      )\n      .json<github.CodeSecuritySetConfigurationAsDefaultResponse>()\n  }\n\n  /**\n * Lists the repositories associated with a code security configuration in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `write:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_repositories_for_configuration',\n    description: `Lists the repositories associated with a code security configuration in an organization.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityGetRepositoriesForConfigurationParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetRepositoriesForConfiguration(\n    params: github.CodeSecurityGetRepositoriesForConfigurationParams\n  ): Promise<github.CodeSecurityGetRepositoriesForConfigurationResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/code-security/configurations/${params.configuration_id}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'per_page', 'before', 'after', 'status')\n          )\n        }\n      )\n      .json<github.CodeSecurityGetRepositoriesForConfigurationResponse>()\n  }\n\n  /**\n * Lists the codespaces associated to a specified organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_in_organization',\n    description: `Lists the codespaces associated to a specified organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesListInOrganizationParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListInOrganization(\n    params: github.CodespacesListInOrganizationParams\n  ): Promise<github.CodespacesListInOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/codespaces`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.CodespacesListInOrganizationResponse>()\n  }\n\n  /**\n * Sets which users can access codespaces in an organization. This is synonymous with granting or revoking codespaces access permissions for users according to the visibility.\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_set_codespaces_access',\n    description: `Sets which users can access codespaces in an organization. This is synonymous with granting or revoking codespaces access permissions for users according to the visibility.\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesSetCodespacesAccessParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesSetCodespacesAccess(\n    params: github.CodespacesSetCodespacesAccessParams\n  ): Promise<github.CodespacesSetCodespacesAccessResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/codespaces/access`, {\n        json: pick(params, 'visibility', 'selected_usernames')\n      })\n      .json<github.CodespacesSetCodespacesAccessResponse>()\n  }\n\n  /**\n * Codespaces for the specified users will be billed to the organization.\n\nTo use this endpoint, the access settings for the organization must be set to `selected_members`.\nFor information on how to change this setting, see \"[Manage access control for organization codespaces](https://docs.github.com/rest/codespaces/organizations#manage-access-control-for-organization-codespaces).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_set_codespaces_access_users',\n    description: `Codespaces for the specified users will be billed to the organization.\n\nTo use this endpoint, the access settings for the organization must be set to \\`selected_members\\`.\nFor information on how to change this setting, see \"[Manage access control for organization codespaces](https://docs.github.com/rest/codespaces/organizations#manage-access-control-for-organization-codespaces).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesSetCodespacesAccessUsersParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesSetCodespacesAccessUsers(\n    params: github.CodespacesSetCodespacesAccessUsersParams\n  ): Promise<github.CodespacesSetCodespacesAccessUsersResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/codespaces/access/selected_users`, {\n        json: pick(params, 'selected_usernames')\n      })\n      .json<github.CodespacesSetCodespacesAccessUsersResponse>()\n  }\n\n  /**\n * Codespaces for the specified users will no longer be billed to the organization.\n\nTo use this endpoint, the access settings for the organization must be set to `selected_members`.\nFor information on how to change this setting, see \"[Manage access control for organization codespaces](https://docs.github.com/rest/codespaces/organizations#manage-access-control-for-organization-codespaces).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_delete_codespaces_access_users',\n    description: `Codespaces for the specified users will no longer be billed to the organization.\n\nTo use this endpoint, the access settings for the organization must be set to \\`selected_members\\`.\nFor information on how to change this setting, see \"[Manage access control for organization codespaces](https://docs.github.com/rest/codespaces/organizations#manage-access-control-for-organization-codespaces).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesDeleteCodespacesAccessUsersParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesDeleteCodespacesAccessUsers(\n    params: github.CodespacesDeleteCodespacesAccessUsersParams\n  ): Promise<github.CodespacesDeleteCodespacesAccessUsersResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/codespaces/access/selected_users`, {\n        json: pick(params, 'selected_usernames')\n      })\n      .json<github.CodespacesDeleteCodespacesAccessUsersResponse>()\n  }\n\n  /**\n * Lists all Codespaces development environment secrets available at the organization-level without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_org_secrets',\n    description: `Lists all Codespaces development environment secrets available at the organization-level without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesListOrgSecretsParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListOrgSecrets(\n    params: github.CodespacesListOrgSecretsParams\n  ): Promise<github.CodespacesListOrgSecretsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/codespaces/secrets`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.CodespacesListOrgSecretsResponse>()\n  }\n\n  /**\n * Gets a public key for an organization, which is required in order to encrypt secrets. You need to encrypt the value of a secret before you can create or update secrets.\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_org_public_key',\n    description: `Gets a public key for an organization, which is required in order to encrypt secrets. You need to encrypt the value of a secret before you can create or update secrets.\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetOrgPublicKeyParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetOrgPublicKey(\n    params: github.CodespacesGetOrgPublicKeyParams\n  ): Promise<github.CodespacesGetOrgPublicKeyResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/codespaces/secrets/public-key`)\n      .json<github.CodespacesGetOrgPublicKeyResponse>()\n  }\n\n  /**\n * Gets an organization development environment secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_org_secret',\n    description: `Gets an organization development environment secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetOrgSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetOrgSecret(\n    params: github.CodespacesGetOrgSecretParams\n  ): Promise<github.CodespacesGetOrgSecretResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/codespaces/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.CodespacesGetOrgSecretResponse>()\n  }\n\n  /**\n * Creates or updates an organization development environment secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_create_or_update_org_secret',\n    description: `Creates or updates an organization development environment secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesCreateOrUpdateOrgSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesCreateOrUpdateOrgSecret(\n    params: github.CodespacesCreateOrUpdateOrgSecretParams\n  ): Promise<github.CodespacesCreateOrUpdateOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/codespaces/secrets/${params.secret_name}`,\n        {\n          json: pick(\n            params,\n            'encrypted_value',\n            'key_id',\n            'visibility',\n            'selected_repository_ids'\n          )\n        }\n      )\n      .json<github.CodespacesCreateOrUpdateOrgSecretResponse>()\n  }\n\n  /**\n * Deletes an organization development environment secret using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_delete_org_secret',\n    description: `Deletes an organization development environment secret using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesDeleteOrgSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesDeleteOrgSecret(\n    params: github.CodespacesDeleteOrgSecretParams\n  ): Promise<github.CodespacesDeleteOrgSecretResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/codespaces/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.CodespacesDeleteOrgSecretResponse>()\n  }\n\n  /**\n * Lists all repositories that have been selected when the `visibility`\nfor repository access to a secret is set to `selected`.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_selected_repos_for_org_secret',\n    description: `Lists all repositories that have been selected when the \\`visibility\\`\nfor repository access to a secret is set to \\`selected\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesListSelectedReposForOrgSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListSelectedReposForOrgSecret(\n    params: github.CodespacesListSelectedReposForOrgSecretParams\n  ): Promise<github.CodespacesListSelectedReposForOrgSecretResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/codespaces/secrets/${params.secret_name}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.CodespacesListSelectedReposForOrgSecretResponse>()\n  }\n\n  /**\n * Replaces all repositories for an organization development environment secret when the `visibility`\nfor repository access is set to `selected`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_set_selected_repos_for_org_secret',\n    description: `Replaces all repositories for an organization development environment secret when the \\`visibility\\`\nfor repository access is set to \\`selected\\`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesSetSelectedReposForOrgSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesSetSelectedReposForOrgSecret(\n    params: github.CodespacesSetSelectedReposForOrgSecretParams\n  ): Promise<github.CodespacesSetSelectedReposForOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/codespaces/secrets/${params.secret_name}/repositories`,\n        {\n          json: pick(params, 'selected_repository_ids')\n        }\n      )\n      .json<github.CodespacesSetSelectedReposForOrgSecretResponse>()\n  }\n\n  /**\n * Adds a repository to an organization development environment secret when the `visibility` for repository access is set to `selected`. The visibility is set when you [Create or update an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret).\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_add_selected_repo_to_org_secret',\n    description: `Adds a repository to an organization development environment secret when the \\`visibility\\` for repository access is set to \\`selected\\`. The visibility is set when you [Create or update an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret).\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesAddSelectedRepoToOrgSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesAddSelectedRepoToOrgSecret(\n    params: github.CodespacesAddSelectedRepoToOrgSecretParams\n  ): Promise<github.CodespacesAddSelectedRepoToOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/codespaces/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.CodespacesAddSelectedRepoToOrgSecretResponse>()\n  }\n\n  /**\n * Removes a repository from an organization development environment secret when the `visibility`\nfor repository access is set to `selected`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_remove_selected_repo_from_org_secret',\n    description: `Removes a repository from an organization development environment secret when the \\`visibility\\`\nfor repository access is set to \\`selected\\`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesRemoveSelectedRepoFromOrgSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesRemoveSelectedRepoFromOrgSecret(\n    params: github.CodespacesRemoveSelectedRepoFromOrgSecretParams\n  ): Promise<github.CodespacesRemoveSelectedRepoFromOrgSecretResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/codespaces/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.CodespacesRemoveSelectedRepoFromOrgSecretResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGets information about an organization's Copilot subscription, including seat breakdown\nand feature policies. To configure these settings, go to your organization's settings on GitHub.com.\nFor more information, see \"[Managing policies for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-policies-for-copilot-business-in-your-organization).\"\n\nOnly organization owners can view details about the organization's Copilot Business or Copilot Enterprise subscription.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot` or `read:org` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_get_copilot_organization_details',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGets information about an organization's Copilot subscription, including seat breakdown\nand feature policies. To configure these settings, go to your organization's settings on GitHub.com.\nFor more information, see \"[Managing policies for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-policies-for-copilot-business-in-your-organization).\"\n\nOnly organization owners can view details about the organization's Copilot Business or Copilot Enterprise subscription.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\` or \\`read:org\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotGetCopilotOrganizationDetailsParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotGetCopilotOrganizationDetails(\n    params: github.CopilotGetCopilotOrganizationDetailsParams\n  ): Promise<github.CopilotGetCopilotOrganizationDetailsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/copilot/billing`)\n      .json<github.CopilotGetCopilotOrganizationDetailsResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nLists all Copilot seats for which an organization with a Copilot Business or Copilot Enterprise subscription is currently being billed.\nOnly organization owners can view assigned seats.\n\nEach seat object contains information about the assigned user's most recent Copilot activity. Users must have telemetry enabled in their IDE for Copilot in the IDE activity to be reflected in `last_activity_at`.\nFor more information about activity data, see \"[Reviewing user activity data for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/reviewing-activity-related-to-github-copilot-in-your-organization/reviewing-user-activity-data-for-copilot-in-your-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot` or `read:org` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_list_copilot_seats',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nLists all Copilot seats for which an organization with a Copilot Business or Copilot Enterprise subscription is currently being billed.\nOnly organization owners can view assigned seats.\n\nEach seat object contains information about the assigned user's most recent Copilot activity. Users must have telemetry enabled in their IDE for Copilot in the IDE activity to be reflected in \\`last_activity_at\\`.\nFor more information about activity data, see \"[Reviewing user activity data for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/reviewing-activity-related-to-github-copilot-in-your-organization/reviewing-user-activity-data-for-copilot-in-your-organization).\"\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\` or \\`read:org\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotListCopilotSeatsParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotListCopilotSeats(\n    params: github.CopilotListCopilotSeatsParams\n  ): Promise<github.CopilotListCopilotSeatsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/copilot/billing/seats`, {\n        searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n      })\n      .json<github.CopilotListCopilotSeatsResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nPurchases a GitHub Copilot seat for all users within each specified team.\nThe organization will be billed for each seat based on the organization's Copilot plan. For more information about Copilot pricing, see \"[About billing for GitHub Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/about-billing-for-github-copilot-in-your-organization).\"\n\nOnly organization owners can purchase Copilot seats for their organization members. The organization must have a Copilot Business or Copilot Enterprise subscription and a configured suggestion matching policy.\nFor more information about setting up a Copilot subscription, see \"[Subscribing to Copilot for your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/subscribing-to-copilot-for-your-organization).\"\nFor more information about setting a suggestion matching policy, see \"[Managing policies for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/setting-policies-for-copilot-in-your-organization/managing-policies-for-copilot-in-your-organization#policies-for-suggestion-matching).\"\n\nThe response contains the total number of new seats that were created and existing seats that were refreshed.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot` or `admin:org` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_add_copilot_seats_for_teams',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nPurchases a GitHub Copilot seat for all users within each specified team.\nThe organization will be billed for each seat based on the organization's Copilot plan. For more information about Copilot pricing, see \"[About billing for GitHub Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/about-billing-for-github-copilot-in-your-organization).\"\n\nOnly organization owners can purchase Copilot seats for their organization members. The organization must have a Copilot Business or Copilot Enterprise subscription and a configured suggestion matching policy.\nFor more information about setting up a Copilot subscription, see \"[Subscribing to Copilot for your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/subscribing-to-copilot-for-your-organization).\"\nFor more information about setting a suggestion matching policy, see \"[Managing policies for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/setting-policies-for-copilot-in-your-organization/managing-policies-for-copilot-in-your-organization#policies-for-suggestion-matching).\"\n\nThe response contains the total number of new seats that were created and existing seats that were refreshed.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\` or \\`admin:org\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotAddCopilotSeatsForTeamsParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotAddCopilotSeatsForTeams(\n    params: github.CopilotAddCopilotSeatsForTeamsParams\n  ): Promise<github.CopilotAddCopilotSeatsForTeamsResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/copilot/billing/selected_teams`, {\n        json: pick(params, 'selected_teams')\n      })\n      .json<github.CopilotAddCopilotSeatsForTeamsResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nSets seats for all members of each team specified to \"pending cancellation\".\nThis will cause the members of the specified team(s) to lose access to GitHub Copilot at the end of the current billing cycle unless they retain access through another team.\nFor more information about disabling access to Copilot, see \"[Revoking access to Copilot for members of your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-access-to-github-copilot-in-your-organization/revoking-access-to-copilot-for-members-of-your-organization).\"\n\nOnly organization owners can cancel Copilot seats for their organization members.\n\nThe response contains the total number of seats set to \"pending cancellation\".\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot` or `admin:org` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_cancel_copilot_seat_assignment_for_teams',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nSets seats for all members of each team specified to \"pending cancellation\".\nThis will cause the members of the specified team(s) to lose access to GitHub Copilot at the end of the current billing cycle unless they retain access through another team.\nFor more information about disabling access to Copilot, see \"[Revoking access to Copilot for members of your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-access-to-github-copilot-in-your-organization/revoking-access-to-copilot-for-members-of-your-organization).\"\n\nOnly organization owners can cancel Copilot seats for their organization members.\n\nThe response contains the total number of seats set to \"pending cancellation\".\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\` or \\`admin:org\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotCancelCopilotSeatAssignmentForTeamsParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotCancelCopilotSeatAssignmentForTeams(\n    params: github.CopilotCancelCopilotSeatAssignmentForTeamsParams\n  ): Promise<github.CopilotCancelCopilotSeatAssignmentForTeamsResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/copilot/billing/selected_teams`, {\n        json: pick(params, 'selected_teams')\n      })\n      .json<github.CopilotCancelCopilotSeatAssignmentForTeamsResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nPurchases a GitHub Copilot seat for each user specified.\nThe organization will be billed for each seat based on the organization's Copilot plan. For more information about Copilot pricing, see \"[About billing for GitHub Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/about-billing-for-github-copilot-in-your-organization).\"\n\nOnly organization owners can purchase Copilot seats for their organization members. The organization must have a Copilot Business or Copilot Enterprise subscription and a configured suggestion matching policy.\nFor more information about setting up a Copilot subscription, see \"[Subscribing to Copilot for your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/subscribing-to-copilot-for-your-organization).\"\nFor more information about setting a suggestion matching policy, see \"[Managing policies for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/setting-policies-for-copilot-in-your-organization/managing-policies-for-copilot-in-your-organization#policies-for-suggestion-matching).\"\n\nThe response contains the total number of new seats that were created and existing seats that were refreshed.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot` or `admin:org` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_add_copilot_seats_for_users',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nPurchases a GitHub Copilot seat for each user specified.\nThe organization will be billed for each seat based on the organization's Copilot plan. For more information about Copilot pricing, see \"[About billing for GitHub Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/about-billing-for-github-copilot-in-your-organization).\"\n\nOnly organization owners can purchase Copilot seats for their organization members. The organization must have a Copilot Business or Copilot Enterprise subscription and a configured suggestion matching policy.\nFor more information about setting up a Copilot subscription, see \"[Subscribing to Copilot for your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-the-copilot-subscription-for-your-organization/subscribing-to-copilot-for-your-organization).\"\nFor more information about setting a suggestion matching policy, see \"[Managing policies for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/setting-policies-for-copilot-in-your-organization/managing-policies-for-copilot-in-your-organization#policies-for-suggestion-matching).\"\n\nThe response contains the total number of new seats that were created and existing seats that were refreshed.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\` or \\`admin:org\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotAddCopilotSeatsForUsersParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotAddCopilotSeatsForUsers(\n    params: github.CopilotAddCopilotSeatsForUsersParams\n  ): Promise<github.CopilotAddCopilotSeatsForUsersResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/copilot/billing/selected_users`, {\n        json: pick(params, 'selected_usernames')\n      })\n      .json<github.CopilotAddCopilotSeatsForUsersResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nSets seats for all users specified to \"pending cancellation\".\nThis will cause the specified users to lose access to GitHub Copilot at the end of the current billing cycle unless they retain access through team membership.\nFor more information about disabling access to Copilot, see \"[Revoking access to Copilot for members of your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-access-to-github-copilot-in-your-organization/revoking-access-to-copilot-for-members-of-your-organization).\"\n\nOnly organization owners can cancel Copilot seats for their organization members.\n\nThe response contains the total number of seats set to \"pending cancellation\".\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot` or `admin:org` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_cancel_copilot_seat_assignment_for_users',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nSets seats for all users specified to \"pending cancellation\".\nThis will cause the specified users to lose access to GitHub Copilot at the end of the current billing cycle unless they retain access through team membership.\nFor more information about disabling access to Copilot, see \"[Revoking access to Copilot for members of your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-access-to-github-copilot-in-your-organization/revoking-access-to-copilot-for-members-of-your-organization).\"\n\nOnly organization owners can cancel Copilot seats for their organization members.\n\nThe response contains the total number of seats set to \"pending cancellation\".\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\` or \\`admin:org\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotCancelCopilotSeatAssignmentForUsersParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotCancelCopilotSeatAssignmentForUsers(\n    params: github.CopilotCancelCopilotSeatAssignmentForUsersParams\n  ): Promise<github.CopilotCancelCopilotSeatAssignmentForUsersResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/copilot/billing/selected_users`, {\n        json: pick(params, 'selected_usernames')\n      })\n      .json<github.CopilotCancelCopilotSeatAssignmentForUsersResponse>()\n  }\n\n  /**\n * Use this endpoint to see a breakdown of aggregated metrics for various GitHub Copilot features. See the response schema tab for detailed metrics definitions.\n\n> [!NOTE]\n> This endpoint will only return results for a given day if the organization contained **five or more members with active Copilot licenses** on that day, as evaluated at the end of that day.\n\nThe response contains metrics for up to 28 days prior. Metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\nTo access this endpoint, the Copilot Metrics API access policy must be enabled for the organization.\nOnly organization owners and owners and billing managers of the parent enterprise can view Copilot metrics.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot`, `read:org`, or `read:enterprise` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_copilot_metrics_for_organization',\n    description: `Use this endpoint to see a breakdown of aggregated metrics for various GitHub Copilot features. See the response schema tab for detailed metrics definitions.\n\n> [!NOTE]\n> This endpoint will only return results for a given day if the organization contained **five or more members with active Copilot licenses** on that day, as evaluated at the end of that day.\n\nThe response contains metrics for up to 28 days prior. Metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\nTo access this endpoint, the Copilot Metrics API access policy must be enabled for the organization.\nOnly organization owners and owners and billing managers of the parent enterprise can view Copilot metrics.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\`, \\`read:org\\`, or \\`read:enterprise\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotCopilotMetricsForOrganizationParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotCopilotMetricsForOrganization(\n    params: github.CopilotCopilotMetricsForOrganizationParams\n  ): Promise<github.CopilotCopilotMetricsForOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/copilot/metrics`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'since', 'until', 'page', 'per_page')\n        )\n      })\n      .json<github.CopilotCopilotMetricsForOrganizationResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is closing down. It will be accessible throughout February 2025, but will not return any new data after February 1st.\n\nYou can use this endpoint to see a daily breakdown of aggregated usage metrics for Copilot completions and Copilot Chat in the IDE\nacross an organization, with a further breakdown of suggestions, acceptances, and number of active users by editor and language for each day.\nSee the response schema tab for detailed metrics definitions.\n\nThe response contains metrics for up to 28 days prior. Usage metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\nOrganization owners, and owners and billing managers of the parent enterprise, can view Copilot usage metrics.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot`, `read:org`, or `read:enterprise` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_usage_metrics_for_org',\n    description: `> [!NOTE]\n> This endpoint is closing down. It will be accessible throughout February 2025, but will not return any new data after February 1st.\n\nYou can use this endpoint to see a daily breakdown of aggregated usage metrics for Copilot completions and Copilot Chat in the IDE\nacross an organization, with a further breakdown of suggestions, acceptances, and number of active users by editor and language for each day.\nSee the response schema tab for detailed metrics definitions.\n\nThe response contains metrics for up to 28 days prior. Usage metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\nOrganization owners, and owners and billing managers of the parent enterprise, can view Copilot usage metrics.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\`, \\`read:org\\`, or \\`read:enterprise\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotUsageMetricsForOrgParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotUsageMetricsForOrg(\n    params: github.CopilotUsageMetricsForOrgParams\n  ): Promise<github.CopilotUsageMetricsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/copilot/usage`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'since', 'until', 'page', 'per_page')\n        )\n      })\n      .json<github.CopilotUsageMetricsForOrgResponse>()\n  }\n\n  /**\n * Lists Dependabot alerts for an organization.\n\nThe authenticated user must be an owner or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_dependabot_list_alerts_for_org',\n    description: `Lists Dependabot alerts for an organization.\n\nThe authenticated user must be an owner or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.DependabotListAlertsForOrgParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotListAlertsForOrg(\n    params: github.DependabotListAlertsForOrgParams\n  ): Promise<github.DependabotListAlertsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/dependabot/alerts`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'state',\n            'severity',\n            'ecosystem',\n            'package',\n            'epss_percentage',\n            'scope',\n            'sort',\n            'direction',\n            'before',\n            'after',\n            'first',\n            'last',\n            'per_page'\n          )\n        )\n      })\n      .json<github.DependabotListAlertsForOrgResponse>()\n  }\n\n  /**\n * Lists all secrets available in an organization without revealing their\nencrypted values.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_list_org_secrets',\n    description: `Lists all secrets available in an organization without revealing their\nencrypted values.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotListOrgSecretsParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotListOrgSecrets(\n    params: github.DependabotListOrgSecretsParams\n  ): Promise<github.DependabotListOrgSecretsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/dependabot/secrets`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.DependabotListOrgSecretsResponse>()\n  }\n\n  /**\n * Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_get_org_public_key',\n    description: `Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotGetOrgPublicKeyParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotGetOrgPublicKey(\n    params: github.DependabotGetOrgPublicKeyParams\n  ): Promise<github.DependabotGetOrgPublicKeyResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/dependabot/secrets/public-key`)\n      .json<github.DependabotGetOrgPublicKeyResponse>()\n  }\n\n  /**\n * Gets a single organization secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_get_org_secret',\n    description: `Gets a single organization secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotGetOrgSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotGetOrgSecret(\n    params: github.DependabotGetOrgSecretParams\n  ): Promise<github.DependabotGetOrgSecretResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/dependabot/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.DependabotGetOrgSecretResponse>()\n  }\n\n  /**\n * Creates or updates an organization secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_create_or_update_org_secret',\n    description: `Creates or updates an organization secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotCreateOrUpdateOrgSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotCreateOrUpdateOrgSecret(\n    params: github.DependabotCreateOrUpdateOrgSecretParams\n  ): Promise<github.DependabotCreateOrUpdateOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/dependabot/secrets/${params.secret_name}`,\n        {\n          json: pick(\n            params,\n            'encrypted_value',\n            'key_id',\n            'visibility',\n            'selected_repository_ids'\n          )\n        }\n      )\n      .json<github.DependabotCreateOrUpdateOrgSecretResponse>()\n  }\n\n  /**\n * Deletes a secret in an organization using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_delete_org_secret',\n    description: `Deletes a secret in an organization using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotDeleteOrgSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotDeleteOrgSecret(\n    params: github.DependabotDeleteOrgSecretParams\n  ): Promise<github.DependabotDeleteOrgSecretResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/dependabot/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.DependabotDeleteOrgSecretResponse>()\n  }\n\n  /**\n * Lists all repositories that have been selected when the `visibility`\nfor repository access to a secret is set to `selected`.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_list_selected_repos_for_org_secret',\n    description: `Lists all repositories that have been selected when the \\`visibility\\`\nfor repository access to a secret is set to \\`selected\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotListSelectedReposForOrgSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotListSelectedReposForOrgSecret(\n    params: github.DependabotListSelectedReposForOrgSecretParams\n  ): Promise<github.DependabotListSelectedReposForOrgSecretResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/dependabot/secrets/${params.secret_name}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.DependabotListSelectedReposForOrgSecretResponse>()\n  }\n\n  /**\n * Replaces all repositories for an organization secret when the `visibility`\nfor repository access is set to `selected`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_set_selected_repos_for_org_secret',\n    description: `Replaces all repositories for an organization secret when the \\`visibility\\`\nfor repository access is set to \\`selected\\`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotSetSelectedReposForOrgSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotSetSelectedReposForOrgSecret(\n    params: github.DependabotSetSelectedReposForOrgSecretParams\n  ): Promise<github.DependabotSetSelectedReposForOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/dependabot/secrets/${params.secret_name}/repositories`,\n        {\n          json: pick(params, 'selected_repository_ids')\n        }\n      )\n      .json<github.DependabotSetSelectedReposForOrgSecretResponse>()\n  }\n\n  /**\n * Adds a repository to an organization secret when the `visibility` for\nrepository access is set to `selected`. The visibility is set when you [Create or\nupdate an organization secret](https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_add_selected_repo_to_org_secret',\n    description: `Adds a repository to an organization secret when the \\`visibility\\` for\nrepository access is set to \\`selected\\`. The visibility is set when you [Create or\nupdate an organization secret](https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotAddSelectedRepoToOrgSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotAddSelectedRepoToOrgSecret(\n    params: github.DependabotAddSelectedRepoToOrgSecretParams\n  ): Promise<github.DependabotAddSelectedRepoToOrgSecretResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/dependabot/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.DependabotAddSelectedRepoToOrgSecretResponse>()\n  }\n\n  /**\n * Removes a repository from an organization secret when the `visibility`\nfor repository access is set to `selected`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_remove_selected_repo_from_org_secret',\n    description: `Removes a repository from an organization secret when the \\`visibility\\`\nfor repository access is set to \\`selected\\`. The visibility is set when you [Create\nor update an organization secret](https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret).\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotRemoveSelectedRepoFromOrgSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotRemoveSelectedRepoFromOrgSecret(\n    params: github.DependabotRemoveSelectedRepoFromOrgSecretParams\n  ): Promise<github.DependabotRemoveSelectedRepoFromOrgSecretResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/dependabot/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.DependabotRemoveSelectedRepoFromOrgSecretResponse>()\n  }\n\n  /**\n * Lists all packages that are in a specific organization, are readable by the requesting user, and that encountered a conflict during a Docker migration.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_packages_list_docker_migration_conflicting_packages_for_organization',\n    description: `Lists all packages that are in a specific organization, are readable by the requesting user, and that encountered a conflict during a Docker migration.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint.`,\n    inputSchema:\n      github.PackagesListDockerMigrationConflictingPackagesForOrganizationParamsSchema,\n    tags: ['packages']\n  })\n  async packagesListDockerMigrationConflictingPackagesForOrganization(\n    params: github.PackagesListDockerMigrationConflictingPackagesForOrganizationParams\n  ): Promise<github.PackagesListDockerMigrationConflictingPackagesForOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/docker/conflicts`)\n      .json<github.PackagesListDockerMigrationConflictingPackagesForOrganizationResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_public_org_events',\n    description: `> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListPublicOrgEventsParamsSchema,\n    tags: ['activity']\n  })\n  async activityListPublicOrgEvents(\n    params: github.ActivityListPublicOrgEventsParams\n  ): Promise<github.ActivityListPublicOrgEventsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/events`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListPublicOrgEventsResponse>()\n  }\n\n  /**\n   * The return hash contains `failed_at` and `failed_reason` fields which represent the time at which the invitation failed and the reason for the failure.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_failed_invitations',\n    description: `The return hash contains \\`failed_at\\` and \\`failed_reason\\` fields which represent the time at which the invitation failed and the reason for the failure.`,\n    inputSchema: github.OrgsListFailedInvitationsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListFailedInvitations(\n    params: github.OrgsListFailedInvitationsParams\n  ): Promise<github.OrgsListFailedInvitationsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/failed_invitations`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsListFailedInvitationsResponse>()\n  }\n\n  /**\n * List webhooks for an organization.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_list_webhooks',\n    description: `List webhooks for an organization.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsListWebhooksParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListWebhooks(\n    params: github.OrgsListWebhooksParams\n  ): Promise<github.OrgsListWebhooksResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/hooks`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsListWebhooksResponse>()\n  }\n\n  /**\n * Create a hook that posts payloads in JSON format.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or\nedit webhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_create_webhook',\n    description: `Create a hook that posts payloads in JSON format.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or\nedit webhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsCreateWebhookParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCreateWebhook(\n    params: github.OrgsCreateWebhookParams\n  ): Promise<github.OrgsCreateWebhookResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/hooks`, {\n        json: pick(params, 'name', 'config', 'events', 'active')\n      })\n      .json<github.OrgsCreateWebhookResponse>()\n  }\n\n  /**\n * Returns a webhook configured in an organization. To get only the webhook\n`config` properties, see \"[Get a webhook configuration for an organization](/rest/orgs/webhooks#get-a-webhook-configuration-for-an-organization).\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_get_webhook',\n    description: `Returns a webhook configured in an organization. To get only the webhook\n\\`config\\` properties, see \"[Get a webhook configuration for an organization](/rest/orgs/webhooks#get-a-webhook-configuration-for-an-organization).\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsGetWebhookParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetWebhook(\n    params: github.OrgsGetWebhookParams\n  ): Promise<github.OrgsGetWebhookResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/hooks/${params.hook_id}`, {})\n      .json<github.OrgsGetWebhookResponse>()\n  }\n\n  /**\n * Delete a webhook for an organization.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_delete_webhook',\n    description: `Delete a webhook for an organization.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsDeleteWebhookParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsDeleteWebhook(\n    params: github.OrgsDeleteWebhookParams\n  ): Promise<github.OrgsDeleteWebhookResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/hooks/${params.hook_id}`, {})\n      .json<github.OrgsDeleteWebhookResponse>()\n  }\n\n  /**\n * Updates a webhook configured in an organization. When you update a webhook,\nthe `secret` will be overwritten. If you previously had a `secret` set, you must\nprovide the same `secret` or set a new `secret` or the secret will be removed. If\nyou are only updating individual webhook `config` properties, use \"[Update a webhook\nconfiguration for an organization](/rest/orgs/webhooks#update-a-webhook-configuration-for-an-organization)\".\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_update_webhook',\n    description: `Updates a webhook configured in an organization. When you update a webhook,\nthe \\`secret\\` will be overwritten. If you previously had a \\`secret\\` set, you must\nprovide the same \\`secret\\` or set a new \\`secret\\` or the secret will be removed. If\nyou are only updating individual webhook \\`config\\` properties, use \"[Update a webhook\nconfiguration for an organization](/rest/orgs/webhooks#update-a-webhook-configuration-for-an-organization)\".\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsUpdateWebhookParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUpdateWebhook(\n    params: github.OrgsUpdateWebhookParams\n  ): Promise<github.OrgsUpdateWebhookResponse> {\n    return this.ky\n      .patch(`/orgs/${params.org}/hooks/${params.hook_id}`, {\n        json: pick(params, 'config', 'events', 'active', 'name')\n      })\n      .json<github.OrgsUpdateWebhookResponse>()\n  }\n\n  /**\n * Returns the webhook configuration for an organization. To get more information about the webhook, including the `active` state and `events`, use \"[Get an organization webhook ](/rest/orgs/webhooks#get-an-organization-webhook).\"\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_get_webhook_config_for_org',\n    description: `Returns the webhook configuration for an organization. To get more information about the webhook, including the \\`active\\` state and \\`events\\`, use \"[Get an organization webhook ](/rest/orgs/webhooks#get-an-organization-webhook).\"\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsGetWebhookConfigForOrgParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetWebhookConfigForOrg(\n    params: github.OrgsGetWebhookConfigForOrgParams\n  ): Promise<github.OrgsGetWebhookConfigForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/hooks/${params.hook_id}/config`, {})\n      .json<github.OrgsGetWebhookConfigForOrgResponse>()\n  }\n\n  /**\n * Updates the webhook configuration for an organization. To update more information about the webhook, including the `active` state and `events`, use \"[Update an organization webhook ](/rest/orgs/webhooks#update-an-organization-webhook).\"\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_update_webhook_config_for_org',\n    description: `Updates the webhook configuration for an organization. To update more information about the webhook, including the \\`active\\` state and \\`events\\`, use \"[Update an organization webhook ](/rest/orgs/webhooks#update-an-organization-webhook).\"\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsUpdateWebhookConfigForOrgParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUpdateWebhookConfigForOrg(\n    params: github.OrgsUpdateWebhookConfigForOrgParams\n  ): Promise<github.OrgsUpdateWebhookConfigForOrgResponse> {\n    return this.ky\n      .patch(`/orgs/${params.org}/hooks/${params.hook_id}/config`, {\n        json: pick(params, 'url', 'content_type', 'secret', 'insecure_ssl')\n      })\n      .json<github.OrgsUpdateWebhookConfigForOrgResponse>()\n  }\n\n  /**\n * Returns a list of webhook deliveries for a webhook configured in an organization.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_list_webhook_deliveries',\n    description: `Returns a list of webhook deliveries for a webhook configured in an organization.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsListWebhookDeliveriesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListWebhookDeliveries(\n    params: github.OrgsListWebhookDeliveriesParams\n  ): Promise<github.OrgsListWebhookDeliveriesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/hooks/${params.hook_id}/deliveries`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'cursor'))\n      })\n      .json<github.OrgsListWebhookDeliveriesResponse>()\n  }\n\n  /**\n * Returns a delivery for a webhook configured in an organization.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_get_webhook_delivery',\n    description: `Returns a delivery for a webhook configured in an organization.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsGetWebhookDeliveryParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetWebhookDelivery(\n    params: github.OrgsGetWebhookDeliveryParams\n  ): Promise<github.OrgsGetWebhookDeliveryResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/hooks/${params.hook_id}/deliveries/${params.delivery_id}`,\n        {}\n      )\n      .json<github.OrgsGetWebhookDeliveryResponse>()\n  }\n\n  /**\n * Redeliver a delivery for a webhook configured in an organization.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_redeliver_webhook_delivery',\n    description: `Redeliver a delivery for a webhook configured in an organization.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsRedeliverWebhookDeliveryParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRedeliverWebhookDelivery(\n    params: github.OrgsRedeliverWebhookDeliveryParams\n  ): Promise<github.OrgsRedeliverWebhookDeliveryResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/hooks/${params.hook_id}/deliveries/${params.delivery_id}/attempts`,\n        {}\n      )\n      .json<github.OrgsRedeliverWebhookDeliveryResponse>()\n  }\n\n  /**\n * This will trigger a [ping event](https://docs.github.com/webhooks/#ping-event)\nto be sent to the hook.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need `admin:org_hook` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.\n */\n  @aiFunction({\n    name: 'github_orgs_ping_webhook',\n    description: `This will trigger a [ping event](https://docs.github.com/webhooks/#ping-event)\nto be sent to the hook.\n\nYou must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need \\`admin:org_hook\\` scope. OAuth apps cannot list, view, or edit\nwebhooks that they did not create and users cannot list, view, or edit webhooks that were created by OAuth apps.`,\n    inputSchema: github.OrgsPingWebhookParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsPingWebhook(\n    params: github.OrgsPingWebhookParams\n  ): Promise<github.OrgsPingWebhookResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/hooks/${params.hook_id}/pings`, {})\n      .json<github.OrgsPingWebhookResponse>()\n  }\n\n  /**\n   * Get API request count statistics for an actor broken down by route within a specified time frame.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_route_stats_by_actor',\n    description: `Get API request count statistics for an actor broken down by route within a specified time frame.`,\n    inputSchema: github.ApiInsightsGetRouteStatsByActorParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetRouteStatsByActor(\n    params: github.ApiInsightsGetRouteStatsByActorParams\n  ): Promise<github.ApiInsightsGetRouteStatsByActorResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/insights/api/route-stats/${params.actor_type}/${params.actor_id}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'min_timestamp',\n              'max_timestamp',\n              'page',\n              'per_page',\n              'direction',\n              'sort',\n              'api_route_substring'\n            )\n          )\n        }\n      )\n      .json<github.ApiInsightsGetRouteStatsByActorResponse>()\n  }\n\n  /**\n   * Get API request statistics for all subjects within an organization within a specified time frame. Subjects can be users or GitHub Apps.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_subject_stats',\n    description: `Get API request statistics for all subjects within an organization within a specified time frame. Subjects can be users or GitHub Apps.`,\n    inputSchema: github.ApiInsightsGetSubjectStatsParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetSubjectStats(\n    params: github.ApiInsightsGetSubjectStatsParams\n  ): Promise<github.ApiInsightsGetSubjectStatsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/insights/api/subject-stats`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'min_timestamp',\n            'max_timestamp',\n            'page',\n            'per_page',\n            'direction',\n            'sort',\n            'subject_name_substring'\n          )\n        )\n      })\n      .json<github.ApiInsightsGetSubjectStatsResponse>()\n  }\n\n  /**\n   * Get overall statistics of API requests made within an organization by all users and apps within a specified time frame.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_summary_stats',\n    description: `Get overall statistics of API requests made within an organization by all users and apps within a specified time frame.`,\n    inputSchema: github.ApiInsightsGetSummaryStatsParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetSummaryStats(\n    params: github.ApiInsightsGetSummaryStatsParams\n  ): Promise<github.ApiInsightsGetSummaryStatsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/insights/api/summary-stats`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'min_timestamp', 'max_timestamp')\n        )\n      })\n      .json<github.ApiInsightsGetSummaryStatsResponse>()\n  }\n\n  /**\n   * Get overall statistics of API requests within the organization for a user.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_summary_stats_by_user',\n    description: `Get overall statistics of API requests within the organization for a user.`,\n    inputSchema: github.ApiInsightsGetSummaryStatsByUserParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetSummaryStatsByUser(\n    params: github.ApiInsightsGetSummaryStatsByUserParams\n  ): Promise<github.ApiInsightsGetSummaryStatsByUserResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/insights/api/summary-stats/users/${params.user_id}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'min_timestamp', 'max_timestamp')\n          )\n        }\n      )\n      .json<github.ApiInsightsGetSummaryStatsByUserResponse>()\n  }\n\n  /**\n   * Get overall statistics of API requests within the organization made by a specific actor. Actors can be GitHub App installations, OAuth apps or other tokens on behalf of a user.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_summary_stats_by_actor',\n    description: `Get overall statistics of API requests within the organization made by a specific actor. Actors can be GitHub App installations, OAuth apps or other tokens on behalf of a user.`,\n    inputSchema: github.ApiInsightsGetSummaryStatsByActorParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetSummaryStatsByActor(\n    params: github.ApiInsightsGetSummaryStatsByActorParams\n  ): Promise<github.ApiInsightsGetSummaryStatsByActorResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/insights/api/summary-stats/${params.actor_type}/${params.actor_id}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'min_timestamp', 'max_timestamp')\n          )\n        }\n      )\n      .json<github.ApiInsightsGetSummaryStatsByActorResponse>()\n  }\n\n  /**\n   * Get the number of API requests and rate-limited requests made within an organization over a specified time period.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_time_stats',\n    description: `Get the number of API requests and rate-limited requests made within an organization over a specified time period.`,\n    inputSchema: github.ApiInsightsGetTimeStatsParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetTimeStats(\n    params: github.ApiInsightsGetTimeStatsParams\n  ): Promise<github.ApiInsightsGetTimeStatsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/insights/api/time-stats`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'min_timestamp', 'max_timestamp', 'timestamp_increment')\n        )\n      })\n      .json<github.ApiInsightsGetTimeStatsResponse>()\n  }\n\n  /**\n   * Get the number of API requests and rate-limited requests made within an organization by a specific user over a specified time period.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_time_stats_by_user',\n    description: `Get the number of API requests and rate-limited requests made within an organization by a specific user over a specified time period.`,\n    inputSchema: github.ApiInsightsGetTimeStatsByUserParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetTimeStatsByUser(\n    params: github.ApiInsightsGetTimeStatsByUserParams\n  ): Promise<github.ApiInsightsGetTimeStatsByUserResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/insights/api/time-stats/users/${params.user_id}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'min_timestamp',\n              'max_timestamp',\n              'timestamp_increment'\n            )\n          )\n        }\n      )\n      .json<github.ApiInsightsGetTimeStatsByUserResponse>()\n  }\n\n  /**\n   * Get the number of API requests and rate-limited requests made within an organization by a specific actor within a specified time period.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_time_stats_by_actor',\n    description: `Get the number of API requests and rate-limited requests made within an organization by a specific actor within a specified time period.`,\n    inputSchema: github.ApiInsightsGetTimeStatsByActorParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetTimeStatsByActor(\n    params: github.ApiInsightsGetTimeStatsByActorParams\n  ): Promise<github.ApiInsightsGetTimeStatsByActorResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/insights/api/time-stats/${params.actor_type}/${params.actor_id}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'min_timestamp',\n              'max_timestamp',\n              'timestamp_increment'\n            )\n          )\n        }\n      )\n      .json<github.ApiInsightsGetTimeStatsByActorResponse>()\n  }\n\n  /**\n   * Get API usage statistics within an organization for a user broken down by the type of access.\n   */\n  @aiFunction({\n    name: 'github_api_insights_get_user_stats',\n    description: `Get API usage statistics within an organization for a user broken down by the type of access.`,\n    inputSchema: github.ApiInsightsGetUserStatsParamsSchema,\n    tags: ['orgs']\n  })\n  async apiInsightsGetUserStats(\n    params: github.ApiInsightsGetUserStatsParams\n  ): Promise<github.ApiInsightsGetUserStatsResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/insights/api/user-stats/${params.user_id}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'min_timestamp',\n              'max_timestamp',\n              'page',\n              'per_page',\n              'direction',\n              'sort',\n              'actor_name_substring'\n            )\n          )\n        }\n      )\n      .json<github.ApiInsightsGetUserStatsResponse>()\n  }\n\n  /**\n * Enables an authenticated GitHub App to find the organization's installation information.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_org_installation',\n    description: `Enables an authenticated GitHub App to find the organization's installation information.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsGetOrgInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetOrgInstallation(\n    params: github.AppsGetOrgInstallationParams\n  ): Promise<github.AppsGetOrgInstallationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/installation`)\n      .json<github.AppsGetOrgInstallationResponse>()\n  }\n\n  /**\n * Lists all GitHub Apps in an organization. The installation count includes\nall GitHub Apps installed on repositories in the organization.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:read` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_app_installations',\n    description: `Lists all GitHub Apps in an organization. The installation count includes\nall GitHub Apps installed on repositories in the organization.\n\nThe authenticated user must be an organization owner to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:read\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsListAppInstallationsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListAppInstallations(\n    params: github.OrgsListAppInstallationsParams\n  ): Promise<github.OrgsListAppInstallationsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/installations`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsListAppInstallationsResponse>()\n  }\n\n  /**\n   * Shows which type of GitHub user can interact with this organization and when the restriction expires. If there is no restrictions, you will see an empty response.\n   */\n  @aiFunction({\n    name: 'github_interactions_get_restrictions_for_org',\n    description: `Shows which type of GitHub user can interact with this organization and when the restriction expires. If there is no restrictions, you will see an empty response.`,\n    inputSchema: github.InteractionsGetRestrictionsForOrgParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsGetRestrictionsForOrg(\n    params: github.InteractionsGetRestrictionsForOrgParams\n  ): Promise<github.InteractionsGetRestrictionsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/interaction-limits`)\n      .json<github.InteractionsGetRestrictionsForOrgResponse>()\n  }\n\n  /**\n   * Temporarily restricts interactions to a certain type of GitHub user in any public repository in the given organization. You must be an organization owner to set these restrictions. Setting the interaction limit at the organization level will overwrite any interaction limits that are set for individual repositories owned by the organization.\n   */\n  @aiFunction({\n    name: 'github_interactions_set_restrictions_for_org',\n    description: `Temporarily restricts interactions to a certain type of GitHub user in any public repository in the given organization. You must be an organization owner to set these restrictions. Setting the interaction limit at the organization level will overwrite any interaction limits that are set for individual repositories owned by the organization.`,\n    inputSchema: github.InteractionsSetRestrictionsForOrgParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsSetRestrictionsForOrg(\n    params: github.InteractionsSetRestrictionsForOrgParams\n  ): Promise<github.InteractionsSetRestrictionsForOrgResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/interaction-limits`, {\n        json: pick(params, 'limit', 'expiry')\n      })\n      .json<github.InteractionsSetRestrictionsForOrgResponse>()\n  }\n\n  /**\n   * Removes all interaction restrictions from public repositories in the given organization. You must be an organization owner to remove restrictions.\n   */\n  @aiFunction({\n    name: 'github_interactions_remove_restrictions_for_org',\n    description: `Removes all interaction restrictions from public repositories in the given organization. You must be an organization owner to remove restrictions.`,\n    inputSchema: github.InteractionsRemoveRestrictionsForOrgParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsRemoveRestrictionsForOrg(\n    params: github.InteractionsRemoveRestrictionsForOrgParams\n  ): Promise<github.InteractionsRemoveRestrictionsForOrgResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/interaction-limits`)\n      .json<github.InteractionsRemoveRestrictionsForOrgResponse>()\n  }\n\n  /**\n * The return hash contains a `role` field which refers to the Organization\nInvitation role and will be one of the following values: `direct_member`, `admin`,\n`billing_manager`, or `hiring_manager`. If the invitee is not a GitHub\nmember, the `login` field in the return hash will be `null`.\n */\n  @aiFunction({\n    name: 'github_orgs_list_pending_invitations',\n    description: `The return hash contains a \\`role\\` field which refers to the Organization\nInvitation role and will be one of the following values: \\`direct_member\\`, \\`admin\\`,\n\\`billing_manager\\`, or \\`hiring_manager\\`. If the invitee is not a GitHub\nmember, the \\`login\\` field in the return hash will be \\`null\\`.`,\n    inputSchema: github.OrgsListPendingInvitationsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListPendingInvitations(\n    params: github.OrgsListPendingInvitationsParams\n  ): Promise<github.OrgsListPendingInvitationsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/invitations`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'role', 'invitation_source')\n        )\n      })\n      .json<github.OrgsListPendingInvitationsResponse>()\n  }\n\n  /**\n * Invite people to an organization by using their GitHub user ID or their email address. In order to create invitations in an organization, the authenticated user must be an organization owner.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".\n */\n  @aiFunction({\n    name: 'github_orgs_create_invitation',\n    description: `Invite people to an organization by using their GitHub user ID or their email address. In order to create invitations in an organization, the authenticated user must be an organization owner.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".`,\n    inputSchema: github.OrgsCreateInvitationParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCreateInvitation(\n    params: github.OrgsCreateInvitationParams\n  ): Promise<github.OrgsCreateInvitationResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/invitations`, {\n        json: pick(params, 'invitee_id', 'email', 'role', 'team_ids')\n      })\n      .json<github.OrgsCreateInvitationResponse>()\n  }\n\n  /**\n * Cancel an organization invitation. In order to cancel an organization invitation, the authenticated user must be an organization owner.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications).\n */\n  @aiFunction({\n    name: 'github_orgs_cancel_invitation',\n    description: `Cancel an organization invitation. In order to cancel an organization invitation, the authenticated user must be an organization owner.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications).`,\n    inputSchema: github.OrgsCancelInvitationParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCancelInvitation(\n    params: github.OrgsCancelInvitationParams\n  ): Promise<github.OrgsCancelInvitationResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/invitations/${params.invitation_id}`,\n        {}\n      )\n      .json<github.OrgsCancelInvitationResponse>()\n  }\n\n  /**\n   * List all teams associated with an invitation. In order to see invitations in an organization, the authenticated user must be an organization owner.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_invitation_teams',\n    description: `List all teams associated with an invitation. In order to see invitations in an organization, the authenticated user must be an organization owner.`,\n    inputSchema: github.OrgsListInvitationTeamsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListInvitationTeams(\n    params: github.OrgsListInvitationTeamsParams\n  ): Promise<github.OrgsListInvitationTeamsResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/invitations/${params.invitation_id}/teams`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.OrgsListInvitationTeamsResponse>()\n  }\n\n  /**\n   * Lists all issue types for an organization. OAuth app tokens and personal access tokens (classic) need the read:org scope to use this endpoint.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_issue_types',\n    description: `Lists all issue types for an organization. OAuth app tokens and personal access tokens (classic) need the read:org scope to use this endpoint.`,\n    inputSchema: github.OrgsListIssueTypesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListIssueTypes(\n    params: github.OrgsListIssueTypesParams\n  ): Promise<github.OrgsListIssueTypesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/issue-types`)\n      .json<github.OrgsListIssueTypesResponse>()\n  }\n\n  /**\n * Create a new issue type for an organization.\n\nYou can find out more about issue types in [Managing issue types in an organization](https://docs.github.com/issues/tracking-your-work-with-issues/configuring-issues/managing-issue-types-in-an-organization).\n\nTo use this endpoint, the authenticated user must be an administrator for the organization. OAuth app tokens and\npersonal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_create_issue_type',\n    description: `Create a new issue type for an organization.\n\nYou can find out more about issue types in [Managing issue types in an organization](https://docs.github.com/issues/tracking-your-work-with-issues/configuring-issues/managing-issue-types-in-an-organization).\n\nTo use this endpoint, the authenticated user must be an administrator for the organization. OAuth app tokens and\npersonal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsCreateIssueTypeParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCreateIssueType(\n    params: github.OrgsCreateIssueTypeParams\n  ): Promise<github.OrgsCreateIssueTypeResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/issue-types`, {\n        json: pick(\n          params,\n          'name',\n          'is_enabled',\n          'is_private',\n          'description',\n          'color'\n        )\n      })\n      .json<github.OrgsCreateIssueTypeResponse>()\n  }\n\n  /**\n * Updates an issue type for an organization.\n\nYou can find out more about issue types in [Managing issue types in an organization](https://docs.github.com/issues/tracking-your-work-with-issues/configuring-issues/managing-issue-types-in-an-organization).\n\nTo use this endpoint, the authenticated user must be an administrator for the organization. OAuth app tokens and\npersonal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_update_issue_type',\n    description: `Updates an issue type for an organization.\n\nYou can find out more about issue types in [Managing issue types in an organization](https://docs.github.com/issues/tracking-your-work-with-issues/configuring-issues/managing-issue-types-in-an-organization).\n\nTo use this endpoint, the authenticated user must be an administrator for the organization. OAuth app tokens and\npersonal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsUpdateIssueTypeParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUpdateIssueType(\n    params: github.OrgsUpdateIssueTypeParams\n  ): Promise<github.OrgsUpdateIssueTypeResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/issue-types/${params.issue_type_id}`, {\n        json: pick(\n          params,\n          'name',\n          'is_enabled',\n          'is_private',\n          'description',\n          'color'\n        )\n      })\n      .json<github.OrgsUpdateIssueTypeResponse>()\n  }\n\n  /**\n * Deletes an issue type for an organization.\n\nYou can find out more about issue types in [Managing issue types in an organization](https://docs.github.com/issues/tracking-your-work-with-issues/configuring-issues/managing-issue-types-in-an-organization).\n\nTo use this endpoint, the authenticated user must be an administrator for the organization. OAuth app tokens and\npersonal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_delete_issue_type',\n    description: `Deletes an issue type for an organization.\n\nYou can find out more about issue types in [Managing issue types in an organization](https://docs.github.com/issues/tracking-your-work-with-issues/configuring-issues/managing-issue-types-in-an-organization).\n\nTo use this endpoint, the authenticated user must be an administrator for the organization. OAuth app tokens and\npersonal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsDeleteIssueTypeParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsDeleteIssueType(\n    params: github.OrgsDeleteIssueTypeParams\n  ): Promise<github.OrgsDeleteIssueTypeResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/issue-types/${params.issue_type_id}`,\n        {}\n      )\n      .json<github.OrgsDeleteIssueTypeResponse>()\n  }\n\n  /**\n * List issues in an organization assigned to the authenticated user.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the `pull_request` key. Be aware that the `id` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_list_for_org',\n    description: `List issues in an organization assigned to the authenticated user.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the \\`pull_request\\` key. Be aware that the \\`id\\` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesListForOrgParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListForOrg(\n    params: github.IssuesListForOrgParams\n  ): Promise<github.IssuesListForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/issues`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'filter',\n            'state',\n            'labels',\n            'type',\n            'sort',\n            'direction',\n            'since',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.IssuesListForOrgResponse>()\n  }\n\n  /**\n   * List all users who are members of an organization. If the authenticated user is also a member of this organization then both concealed and public members will be returned.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_members',\n    description: `List all users who are members of an organization. If the authenticated user is also a member of this organization then both concealed and public members will be returned.`,\n    inputSchema: github.OrgsListMembersParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListMembers(\n    params: github.OrgsListMembersParams\n  ): Promise<github.OrgsListMembersResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/members`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'filter', 'role', 'per_page', 'page')\n        )\n      })\n      .json<github.OrgsListMembersResponse>()\n  }\n\n  /**\n   * Check if a user is, publicly or privately, a member of the organization.\n   */\n  @aiFunction({\n    name: 'github_orgs_check_membership_for_user',\n    description: `Check if a user is, publicly or privately, a member of the organization.`,\n    inputSchema: github.OrgsCheckMembershipForUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCheckMembershipForUser(\n    params: github.OrgsCheckMembershipForUserParams\n  ): Promise<github.OrgsCheckMembershipForUserResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/members/${params.username}`, {})\n      .json<github.OrgsCheckMembershipForUserResponse>()\n  }\n\n  /**\n   * Removing a user from this list will remove them from all teams and they will no longer have any access to the organization's repositories.\n   */\n  @aiFunction({\n    name: 'github_orgs_remove_member',\n    description: `Removing a user from this list will remove them from all teams and they will no longer have any access to the organization's repositories.`,\n    inputSchema: github.OrgsRemoveMemberParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRemoveMember(\n    params: github.OrgsRemoveMemberParams\n  ): Promise<github.OrgsRemoveMemberResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/members/${params.username}`, {})\n      .json<github.OrgsRemoveMemberResponse>()\n  }\n\n  /**\n * Lists the codespaces that a member of an organization has for repositories in that organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_codespaces_for_user_in_org',\n    description: `Lists the codespaces that a member of an organization has for repositories in that organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetCodespacesForUserInOrgParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetCodespacesForUserInOrg(\n    params: github.CodespacesGetCodespacesForUserInOrgParams\n  ): Promise<github.CodespacesGetCodespacesForUserInOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/members/${params.username}/codespaces`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.CodespacesGetCodespacesForUserInOrgResponse>()\n  }\n\n  /**\n * Deletes a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_delete_from_organization',\n    description: `Deletes a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesDeleteFromOrganizationParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesDeleteFromOrganization(\n    params: github.CodespacesDeleteFromOrganizationParams\n  ): Promise<github.CodespacesDeleteFromOrganizationResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/members/${params.username}/codespaces/${params.codespace_name}`,\n        {}\n      )\n      .json<github.CodespacesDeleteFromOrganizationResponse>()\n  }\n\n  /**\n * Stops a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_stop_in_organization',\n    description: `Stops a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesStopInOrganizationParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesStopInOrganization(\n    params: github.CodespacesStopInOrganizationParams\n  ): Promise<github.CodespacesStopInOrganizationResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/members/${params.username}/codespaces/${params.codespace_name}/stop`,\n        {}\n      )\n      .json<github.CodespacesStopInOrganizationResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGets the GitHub Copilot seat details for a member of an organization who currently has access to GitHub Copilot.\n\nThe seat object contains information about the user's most recent Copilot activity. Users must have telemetry enabled in their IDE for Copilot in the IDE activity to be reflected in `last_activity_at`.\nFor more information about activity data, see \"[Reviewing user activity data for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/reviewing-activity-related-to-github-copilot-in-your-organization/reviewing-user-activity-data-for-copilot-in-your-organization).\"\n\nOnly organization owners can view Copilot seat assignment details for members of their organization.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot` or `read:org` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_get_copilot_seat_details_for_user',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGets the GitHub Copilot seat details for a member of an organization who currently has access to GitHub Copilot.\n\nThe seat object contains information about the user's most recent Copilot activity. Users must have telemetry enabled in their IDE for Copilot in the IDE activity to be reflected in \\`last_activity_at\\`.\nFor more information about activity data, see \"[Reviewing user activity data for Copilot in your organization](https://docs.github.com/copilot/managing-copilot/managing-github-copilot-in-your-organization/reviewing-activity-related-to-github-copilot-in-your-organization/reviewing-user-activity-data-for-copilot-in-your-organization).\"\n\nOnly organization owners can view Copilot seat assignment details for members of their organization.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\` or \\`read:org\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotGetCopilotSeatDetailsForUserParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotGetCopilotSeatDetailsForUser(\n    params: github.CopilotGetCopilotSeatDetailsForUserParams\n  ): Promise<github.CopilotGetCopilotSeatDetailsForUserResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/members/${params.username}/copilot`, {})\n      .json<github.CopilotGetCopilotSeatDetailsForUserResponse>()\n  }\n\n  /**\n   * In order to get a user's membership with an organization, the authenticated user must be an organization member. The `state` parameter in the response can be used to identify the user's membership status.\n   */\n  @aiFunction({\n    name: 'github_orgs_get_membership_for_user',\n    description: `In order to get a user's membership with an organization, the authenticated user must be an organization member. The \\`state\\` parameter in the response can be used to identify the user's membership status.`,\n    inputSchema: github.OrgsGetMembershipForUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetMembershipForUser(\n    params: github.OrgsGetMembershipForUserParams\n  ): Promise<github.OrgsGetMembershipForUserResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/memberships/${params.username}`, {})\n      .json<github.OrgsGetMembershipForUserResponse>()\n  }\n\n  /**\n * Only authenticated organization owners can add a member to the organization or update the member's role.\n\n*   If the authenticated user is _adding_ a member to the organization, the invited user will receive an email inviting them to the organization. The user's [membership status](https://docs.github.com/rest/orgs/members#get-organization-membership-for-a-user) will be `pending` until they accept the invitation.\n\n*   Authenticated users can _update_ a user's membership by passing the `role` parameter. If the authenticated user changes a member's role to `admin`, the affected user will receive an email notifying them that they've been made an organization owner. If the authenticated user changes an owner's role to `member`, no email will be sent.\n\n**Rate limits**\n\nTo prevent abuse, organization owners are limited to creating 50 organization invitations for an organization within a 24 hour period. If the organization is more than one month old or on a paid plan, the limit is 500 invitations per 24 hour period.\n */\n  @aiFunction({\n    name: 'github_orgs_set_membership_for_user',\n    description: `Only authenticated organization owners can add a member to the organization or update the member's role.\n\n*   If the authenticated user is _adding_ a member to the organization, the invited user will receive an email inviting them to the organization. The user's [membership status](https://docs.github.com/rest/orgs/members#get-organization-membership-for-a-user) will be \\`pending\\` until they accept the invitation.\n\n*   Authenticated users can _update_ a user's membership by passing the \\`role\\` parameter. If the authenticated user changes a member's role to \\`admin\\`, the affected user will receive an email notifying them that they've been made an organization owner. If the authenticated user changes an owner's role to \\`member\\`, no email will be sent.\n\n**Rate limits**\n\nTo prevent abuse, organization owners are limited to creating 50 organization invitations for an organization within a 24 hour period. If the organization is more than one month old or on a paid plan, the limit is 500 invitations per 24 hour period.`,\n    inputSchema: github.OrgsSetMembershipForUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsSetMembershipForUser(\n    params: github.OrgsSetMembershipForUserParams\n  ): Promise<github.OrgsSetMembershipForUserResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/memberships/${params.username}`, {\n        json: pick(params, 'role')\n      })\n      .json<github.OrgsSetMembershipForUserResponse>()\n  }\n\n  /**\n * In order to remove a user's membership with an organization, the authenticated user must be an organization owner.\n\nIf the specified user is an active member of the organization, this will remove them from the organization. If the specified user has been invited to the organization, this will cancel their invitation. The specified user will receive an email notification in both cases.\n */\n  @aiFunction({\n    name: 'github_orgs_remove_membership_for_user',\n    description: `In order to remove a user's membership with an organization, the authenticated user must be an organization owner.\n\nIf the specified user is an active member of the organization, this will remove them from the organization. If the specified user has been invited to the organization, this will cancel their invitation. The specified user will receive an email notification in both cases.`,\n    inputSchema: github.OrgsRemoveMembershipForUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRemoveMembershipForUser(\n    params: github.OrgsRemoveMembershipForUserParams\n  ): Promise<github.OrgsRemoveMembershipForUserResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/memberships/${params.username}`, {})\n      .json<github.OrgsRemoveMembershipForUserResponse>()\n  }\n\n  /**\n * Lists the most recent migrations, including both exports (which can be started through the REST API) and imports (which cannot be started using the REST API).\n\nA list of `repositories` is only returned for export migrations.\n */\n  @aiFunction({\n    name: 'github_migrations_list_for_org',\n    description: `Lists the most recent migrations, including both exports (which can be started through the REST API) and imports (which cannot be started using the REST API).\n\nA list of \\`repositories\\` is only returned for export migrations.`,\n    inputSchema: github.MigrationsListForOrgParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsListForOrg(\n    params: github.MigrationsListForOrgParams\n  ): Promise<github.MigrationsListForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/migrations`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'exclude')\n        )\n      })\n      .json<github.MigrationsListForOrgResponse>()\n  }\n\n  /**\n   * Initiates the generation of a migration archive.\n   */\n  @aiFunction({\n    name: 'github_migrations_start_for_org',\n    description: `Initiates the generation of a migration archive.`,\n    inputSchema: github.MigrationsStartForOrgParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsStartForOrg(\n    params: github.MigrationsStartForOrgParams\n  ): Promise<github.MigrationsStartForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/migrations`, {\n        json: pick(\n          params,\n          'repositories',\n          'lock_repositories',\n          'exclude_metadata',\n          'exclude_git_data',\n          'exclude_attachments',\n          'exclude_releases',\n          'exclude_owner_projects',\n          'org_metadata_only',\n          'exclude'\n        )\n      })\n      .json<github.MigrationsStartForOrgResponse>()\n  }\n\n  /**\n * Fetches the status of a migration.\n\nThe `state` of a migration can be one of the following values:\n\n*   `pending`, which means the migration hasn't started yet.\n*   `exporting`, which means the migration is in progress.\n*   `exported`, which means the migration finished successfully.\n*   `failed`, which means the migration failed.\n */\n  @aiFunction({\n    name: 'github_migrations_get_status_for_org',\n    description: `Fetches the status of a migration.\n\nThe \\`state\\` of a migration can be one of the following values:\n\n*   \\`pending\\`, which means the migration hasn't started yet.\n*   \\`exporting\\`, which means the migration is in progress.\n*   \\`exported\\`, which means the migration finished successfully.\n*   \\`failed\\`, which means the migration failed.`,\n    inputSchema: github.MigrationsGetStatusForOrgParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsGetStatusForOrg(\n    params: github.MigrationsGetStatusForOrgParams\n  ): Promise<github.MigrationsGetStatusForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/migrations/${params.migration_id}`, {\n        searchParams: sanitizeSearchParams(pick(params, 'exclude'))\n      })\n      .json<github.MigrationsGetStatusForOrgResponse>()\n  }\n\n  /**\n   * Fetches the URL to a migration archive.\n   */\n  @aiFunction({\n    name: 'github_migrations_download_archive_for_org',\n    description: `Fetches the URL to a migration archive.`,\n    inputSchema: github.MigrationsDownloadArchiveForOrgParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsDownloadArchiveForOrg(\n    params: github.MigrationsDownloadArchiveForOrgParams\n  ): Promise<github.MigrationsDownloadArchiveForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/migrations/${params.migration_id}/archive`,\n        {}\n      )\n      .json<github.MigrationsDownloadArchiveForOrgResponse>()\n  }\n\n  /**\n   * Deletes a previous migration archive. Migration archives are automatically deleted after seven days.\n   */\n  @aiFunction({\n    name: 'github_migrations_delete_archive_for_org',\n    description: `Deletes a previous migration archive. Migration archives are automatically deleted after seven days.`,\n    inputSchema: github.MigrationsDeleteArchiveForOrgParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsDeleteArchiveForOrg(\n    params: github.MigrationsDeleteArchiveForOrgParams\n  ): Promise<github.MigrationsDeleteArchiveForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/migrations/${params.migration_id}/archive`,\n        {}\n      )\n      .json<github.MigrationsDeleteArchiveForOrgResponse>()\n  }\n\n  /**\n   * Unlocks a repository that was locked for migration. You should unlock each migrated repository and [delete them](https://docs.github.com/rest/repos/repos#delete-a-repository) when the migration is complete and you no longer need the source data.\n   */\n  @aiFunction({\n    name: 'github_migrations_unlock_repo_for_org',\n    description: `Unlocks a repository that was locked for migration. You should unlock each migrated repository and [delete them](https://docs.github.com/rest/repos/repos#delete-a-repository) when the migration is complete and you no longer need the source data.`,\n    inputSchema: github.MigrationsUnlockRepoForOrgParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsUnlockRepoForOrg(\n    params: github.MigrationsUnlockRepoForOrgParams\n  ): Promise<github.MigrationsUnlockRepoForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/migrations/${params.migration_id}/repos/${params.repo_name}/lock`,\n        {}\n      )\n      .json<github.MigrationsUnlockRepoForOrgResponse>()\n  }\n\n  /**\n   * List all the repositories for this organization migration.\n   */\n  @aiFunction({\n    name: 'github_migrations_list_repos_for_org',\n    description: `List all the repositories for this organization migration.`,\n    inputSchema: github.MigrationsListReposForOrgParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsListReposForOrg(\n    params: github.MigrationsListReposForOrgParams\n  ): Promise<github.MigrationsListReposForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/migrations/${params.migration_id}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.MigrationsListReposForOrgResponse>()\n  }\n\n  /**\n * Lists the organization roles available in this organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, the authenticated user must be one of:\n\n- An administrator for the organization.\n- A user, or a user on a team, with the fine-grained permissions of `read_organization_custom_org_role` in the organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_org_roles',\n    description: `Lists the organization roles available in this organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, the authenticated user must be one of:\n\n- An administrator for the organization.\n- A user, or a user on a team, with the fine-grained permissions of \\`read_organization_custom_org_role\\` in the organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsListOrgRolesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListOrgRoles(\n    params: github.OrgsListOrgRolesParams\n  ): Promise<github.OrgsListOrgRolesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/organization-roles`)\n      .json<github.OrgsListOrgRolesResponse>()\n  }\n\n  /**\n * Removes all assigned organization roles from a team. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_revoke_all_org_roles_team',\n    description: `Removes all assigned organization roles from a team. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsRevokeAllOrgRolesTeamParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRevokeAllOrgRolesTeam(\n    params: github.OrgsRevokeAllOrgRolesTeamParams\n  ): Promise<github.OrgsRevokeAllOrgRolesTeamResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/organization-roles/teams/${params.team_slug}`,\n        {}\n      )\n      .json<github.OrgsRevokeAllOrgRolesTeamResponse>()\n  }\n\n  /**\n * Assigns an organization role to a team in an organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_assign_team_to_org_role',\n    description: `Assigns an organization role to a team in an organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsAssignTeamToOrgRoleParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsAssignTeamToOrgRole(\n    params: github.OrgsAssignTeamToOrgRoleParams\n  ): Promise<github.OrgsAssignTeamToOrgRoleResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/organization-roles/teams/${params.team_slug}/${params.role_id}`,\n        {}\n      )\n      .json<github.OrgsAssignTeamToOrgRoleResponse>()\n  }\n\n  /**\n * Removes an organization role from a team. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_revoke_org_role_team',\n    description: `Removes an organization role from a team. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsRevokeOrgRoleTeamParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRevokeOrgRoleTeam(\n    params: github.OrgsRevokeOrgRoleTeamParams\n  ): Promise<github.OrgsRevokeOrgRoleTeamResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/organization-roles/teams/${params.team_slug}/${params.role_id}`,\n        {}\n      )\n      .json<github.OrgsRevokeOrgRoleTeamResponse>()\n  }\n\n  /**\n * Revokes all assigned organization roles from a user. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_revoke_all_org_roles_user',\n    description: `Revokes all assigned organization roles from a user. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsRevokeAllOrgRolesUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRevokeAllOrgRolesUser(\n    params: github.OrgsRevokeAllOrgRolesUserParams\n  ): Promise<github.OrgsRevokeAllOrgRolesUserResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/organization-roles/users/${params.username}`,\n        {}\n      )\n      .json<github.OrgsRevokeAllOrgRolesUserResponse>()\n  }\n\n  /**\n * Assigns an organization role to a member of an organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_assign_user_to_org_role',\n    description: `Assigns an organization role to a member of an organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsAssignUserToOrgRoleParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsAssignUserToOrgRole(\n    params: github.OrgsAssignUserToOrgRoleParams\n  ): Promise<github.OrgsAssignUserToOrgRoleResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/organization-roles/users/${params.username}/${params.role_id}`,\n        {}\n      )\n      .json<github.OrgsAssignUserToOrgRoleResponse>()\n  }\n\n  /**\n * Remove an organization role from a user. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_revoke_org_role_user',\n    description: `Remove an organization role from a user. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nThe authenticated user must be an administrator for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsRevokeOrgRoleUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRevokeOrgRoleUser(\n    params: github.OrgsRevokeOrgRoleUserParams\n  ): Promise<github.OrgsRevokeOrgRoleUserResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/organization-roles/users/${params.username}/${params.role_id}`,\n        {}\n      )\n      .json<github.OrgsRevokeOrgRoleUserResponse>()\n  }\n\n  /**\n * Gets an organization role that is available to this organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, the authenticated user must be one of:\n\n- An administrator for the organization.\n- A user, or a user on a team, with the fine-grained permissions of `read_organization_custom_org_role` in the organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_get_org_role',\n    description: `Gets an organization role that is available to this organization. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, the authenticated user must be one of:\n\n- An administrator for the organization.\n- A user, or a user on a team, with the fine-grained permissions of \\`read_organization_custom_org_role\\` in the organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsGetOrgRoleParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetOrgRole(\n    params: github.OrgsGetOrgRoleParams\n  ): Promise<github.OrgsGetOrgRoleResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/organization-roles/${params.role_id}`, {})\n      .json<github.OrgsGetOrgRoleResponse>()\n  }\n\n  /**\n * Lists the teams that are assigned to an organization role. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, you must be an administrator for the organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_org_role_teams',\n    description: `Lists the teams that are assigned to an organization role. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, you must be an administrator for the organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsListOrgRoleTeamsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListOrgRoleTeams(\n    params: github.OrgsListOrgRoleTeamsParams\n  ): Promise<github.OrgsListOrgRoleTeamsResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/organization-roles/${params.role_id}/teams`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.OrgsListOrgRoleTeamsResponse>()\n  }\n\n  /**\n * Lists organization members that are assigned to an organization role. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, you must be an administrator for the organization.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_org_role_users',\n    description: `Lists organization members that are assigned to an organization role. For more information on organization roles, see \"[Using organization roles](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/using-organization-roles).\"\n\nTo use this endpoint, you must be an administrator for the organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.OrgsListOrgRoleUsersParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListOrgRoleUsers(\n    params: github.OrgsListOrgRoleUsersParams\n  ): Promise<github.OrgsListOrgRoleUsersResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/organization-roles/${params.role_id}/users`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.OrgsListOrgRoleUsersResponse>()\n  }\n\n  /**\n   * List all users who are outside collaborators of an organization.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_outside_collaborators',\n    description: `List all users who are outside collaborators of an organization.`,\n    inputSchema: github.OrgsListOutsideCollaboratorsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListOutsideCollaborators(\n    params: github.OrgsListOutsideCollaboratorsParams\n  ): Promise<github.OrgsListOutsideCollaboratorsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/outside_collaborators`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'filter', 'per_page', 'page')\n        )\n      })\n      .json<github.OrgsListOutsideCollaboratorsResponse>()\n  }\n\n  /**\n   * When an organization member is converted to an outside collaborator, they'll only have access to the repositories that their current team membership allows. The user will no longer be a member of the organization. For more information, see \"[Converting an organization member to an outside collaborator](https://docs.github.com/articles/converting-an-organization-member-to-an-outside-collaborator/)\". Converting an organization member to an outside collaborator may be restricted by enterprise administrators. For more information, see \"[Enforcing repository management policies in your enterprise](https://docs.github.com/admin/policies/enforcing-policies-for-your-enterprise/enforcing-repository-management-policies-in-your-enterprise#enforcing-a-policy-for-inviting-outside-collaborators-to-repositories).\".\n   */\n  @aiFunction({\n    name: 'github_orgs_convert_member_to_outside_collaborator',\n    description: `When an organization member is converted to an outside collaborator, they'll only have access to the repositories that their current team membership allows. The user will no longer be a member of the organization. For more information, see \"[Converting an organization member to an outside collaborator](https://docs.github.com/articles/converting-an-organization-member-to-an-outside-collaborator/)\". Converting an organization member to an outside collaborator may be restricted by enterprise administrators. For more information, see \"[Enforcing repository management policies in your enterprise](https://docs.github.com/admin/policies/enforcing-policies-for-your-enterprise/enforcing-repository-management-policies-in-your-enterprise#enforcing-a-policy-for-inviting-outside-collaborators-to-repositories).\".`,\n    inputSchema: github.OrgsConvertMemberToOutsideCollaboratorParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsConvertMemberToOutsideCollaborator(\n    params: github.OrgsConvertMemberToOutsideCollaboratorParams\n  ): Promise<github.OrgsConvertMemberToOutsideCollaboratorResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/outside_collaborators/${params.username}`,\n        {\n          json: pick(params, 'async')\n        }\n      )\n      .json<github.OrgsConvertMemberToOutsideCollaboratorResponse>()\n  }\n\n  /**\n   * Removing a user from this list will remove them from all the organization's repositories.\n   */\n  @aiFunction({\n    name: 'github_orgs_remove_outside_collaborator',\n    description: `Removing a user from this list will remove them from all the organization's repositories.`,\n    inputSchema: github.OrgsRemoveOutsideCollaboratorParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRemoveOutsideCollaborator(\n    params: github.OrgsRemoveOutsideCollaboratorParams\n  ): Promise<github.OrgsRemoveOutsideCollaboratorResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/outside_collaborators/${params.username}`,\n        {}\n      )\n      .json<github.OrgsRemoveOutsideCollaboratorResponse>()\n  }\n\n  /**\n * Lists packages in an organization readable by the user.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_list_packages_for_organization',\n    description: `Lists packages in an organization readable by the user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesListPackagesForOrganizationParamsSchema,\n    tags: ['packages']\n  })\n  async packagesListPackagesForOrganization(\n    params: github.PackagesListPackagesForOrganizationParams\n  ): Promise<github.PackagesListPackagesForOrganizationResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/packages`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'package_type', 'visibility', 'page', 'per_page')\n        )\n      })\n      .json<github.PackagesListPackagesForOrganizationResponse>()\n  }\n\n  /**\n * Gets a specific package in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_package_for_organization',\n    description: `Gets a specific package in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesGetPackageForOrganizationParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetPackageForOrganization(\n    params: github.PackagesGetPackageForOrganizationParams\n  ): Promise<github.PackagesGetPackageForOrganizationResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/packages/${params.package_type}/${params.package_name}`,\n        {}\n      )\n      .json<github.PackagesGetPackageForOrganizationResponse>()\n  }\n\n  /**\n * Deletes an entire package in an organization. You cannot delete a public package if any version of the package has more than 5,000 downloads. In this scenario, contact GitHub support for further assistance.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `delete:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_delete_package_for_org',\n    description: `Deletes an entire package in an organization. You cannot delete a public package if any version of the package has more than 5,000 downloads. In this scenario, contact GitHub support for further assistance.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`delete:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesDeletePackageForOrgParamsSchema,\n    tags: ['packages']\n  })\n  async packagesDeletePackageForOrg(\n    params: github.PackagesDeletePackageForOrgParams\n  ): Promise<github.PackagesDeletePackageForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/packages/${params.package_type}/${params.package_name}`,\n        {}\n      )\n      .json<github.PackagesDeletePackageForOrgResponse>()\n  }\n\n  /**\n * Restores an entire package in an organization.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `write:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_restore_package_for_org',\n    description: `Restores an entire package in an organization.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`write:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesRestorePackageForOrgParamsSchema,\n    tags: ['packages']\n  })\n  async packagesRestorePackageForOrg(\n    params: github.PackagesRestorePackageForOrgParams\n  ): Promise<github.PackagesRestorePackageForOrgResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/packages/${params.package_type}/${params.package_name}/restore`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'token'))\n        }\n      )\n      .json<github.PackagesRestorePackageForOrgResponse>()\n  }\n\n  /**\n * Lists package versions for a package owned by an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_all_package_versions_for_package_owned_by_org',\n    description: `Lists package versions for a package owned by an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema:\n      github.PackagesGetAllPackageVersionsForPackageOwnedByOrgParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetAllPackageVersionsForPackageOwnedByOrg(\n    params: github.PackagesGetAllPackageVersionsForPackageOwnedByOrgParams\n  ): Promise<github.PackagesGetAllPackageVersionsForPackageOwnedByOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/packages/${params.package_type}/${params.package_name}/versions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'page', 'per_page', 'state')\n          )\n        }\n      )\n      .json<github.PackagesGetAllPackageVersionsForPackageOwnedByOrgResponse>()\n  }\n\n  /**\n * Gets a specific package version in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_package_version_for_organization',\n    description: `Gets a specific package version in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesGetPackageVersionForOrganizationParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetPackageVersionForOrganization(\n    params: github.PackagesGetPackageVersionForOrganizationParams\n  ): Promise<github.PackagesGetPackageVersionForOrganizationResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}`,\n        {}\n      )\n      .json<github.PackagesGetPackageVersionForOrganizationResponse>()\n  }\n\n  /**\n * Deletes a specific package version in an organization. If the package is public and the package version has more than 5,000 downloads, you cannot delete the package version. In this scenario, contact GitHub support for further assistance.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `delete:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_delete_package_version_for_org',\n    description: `Deletes a specific package version in an organization. If the package is public and the package version has more than 5,000 downloads, you cannot delete the package version. In this scenario, contact GitHub support for further assistance.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`delete:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesDeletePackageVersionForOrgParamsSchema,\n    tags: ['packages']\n  })\n  async packagesDeletePackageVersionForOrg(\n    params: github.PackagesDeletePackageVersionForOrgParams\n  ): Promise<github.PackagesDeletePackageVersionForOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}`,\n        {}\n      )\n      .json<github.PackagesDeletePackageVersionForOrgResponse>()\n  }\n\n  /**\n * Restores a specific package version in an organization.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `write:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_restore_package_version_for_org',\n    description: `Restores a specific package version in an organization.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint. If the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must also have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`write:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesRestorePackageVersionForOrgParamsSchema,\n    tags: ['packages']\n  })\n  async packagesRestorePackageVersionForOrg(\n    params: github.PackagesRestorePackageVersionForOrgParams\n  ): Promise<github.PackagesRestorePackageVersionForOrgResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}/restore`,\n        {}\n      )\n      .json<github.PackagesRestorePackageVersionForOrgResponse>()\n  }\n\n  /**\n * Lists requests from organization members to access organization resources with a fine-grained personal access token.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_pat_grant_requests',\n    description: `Lists requests from organization members to access organization resources with a fine-grained personal access token.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsListPatGrantRequestsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListPatGrantRequests(\n    params: github.OrgsListPatGrantRequestsParams\n  ): Promise<github.OrgsListPatGrantRequestsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/personal-access-token-requests`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'per_page',\n            'page',\n            'sort',\n            'direction',\n            'owner',\n            'repository',\n            'permission',\n            'last_used_before',\n            'last_used_after',\n            'token_id'\n          )\n        )\n      })\n      .json<github.OrgsListPatGrantRequestsResponse>()\n  }\n\n  /**\n * Approves or denies multiple pending requests to access organization resources via a fine-grained personal access token.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_review_pat_grant_requests_in_bulk',\n    description: `Approves or denies multiple pending requests to access organization resources via a fine-grained personal access token.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsReviewPatGrantRequestsInBulkParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsReviewPatGrantRequestsInBulk(\n    params: github.OrgsReviewPatGrantRequestsInBulkParams\n  ): Promise<github.OrgsReviewPatGrantRequestsInBulkResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/personal-access-token-requests`, {\n        json: pick(params, 'pat_request_ids', 'action', 'reason')\n      })\n      .json<github.OrgsReviewPatGrantRequestsInBulkResponse>()\n  }\n\n  /**\n * Approves or denies a pending request to access organization resources via a fine-grained personal access token.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_review_pat_grant_request',\n    description: `Approves or denies a pending request to access organization resources via a fine-grained personal access token.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsReviewPatGrantRequestParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsReviewPatGrantRequest(\n    params: github.OrgsReviewPatGrantRequestParams\n  ): Promise<github.OrgsReviewPatGrantRequestResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/personal-access-token-requests/${params.pat_request_id}`,\n        {\n          json: pick(params, 'action', 'reason')\n        }\n      )\n      .json<github.OrgsReviewPatGrantRequestResponse>()\n  }\n\n  /**\n * Lists the repositories a fine-grained personal access token request is requesting access to.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_pat_grant_request_repositories',\n    description: `Lists the repositories a fine-grained personal access token request is requesting access to.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsListPatGrantRequestRepositoriesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListPatGrantRequestRepositories(\n    params: github.OrgsListPatGrantRequestRepositoriesParams\n  ): Promise<github.OrgsListPatGrantRequestRepositoriesResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/personal-access-token-requests/${params.pat_request_id}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.OrgsListPatGrantRequestRepositoriesResponse>()\n  }\n\n  /**\n * Lists approved fine-grained personal access tokens owned by organization members that can access organization resources.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_pat_grants',\n    description: `Lists approved fine-grained personal access tokens owned by organization members that can access organization resources.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsListPatGrantsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListPatGrants(\n    params: github.OrgsListPatGrantsParams\n  ): Promise<github.OrgsListPatGrantsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/personal-access-tokens`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'per_page',\n            'page',\n            'sort',\n            'direction',\n            'owner',\n            'repository',\n            'permission',\n            'last_used_before',\n            'last_used_after',\n            'token_id'\n          )\n        )\n      })\n      .json<github.OrgsListPatGrantsResponse>()\n  }\n\n  /**\n * Updates the access organization members have to organization resources via fine-grained personal access tokens. Limited to revoking a token's existing access.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_update_pat_accesses',\n    description: `Updates the access organization members have to organization resources via fine-grained personal access tokens. Limited to revoking a token's existing access.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsUpdatePatAccessesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUpdatePatAccesses(\n    params: github.OrgsUpdatePatAccessesParams\n  ): Promise<github.OrgsUpdatePatAccessesResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/personal-access-tokens`, {\n        json: pick(params, 'action', 'pat_ids')\n      })\n      .json<github.OrgsUpdatePatAccessesResponse>()\n  }\n\n  /**\n * Updates the access an organization member has to organization resources via a fine-grained personal access token. Limited to revoking the token's existing access. Limited to revoking a token's existing access.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_update_pat_access',\n    description: `Updates the access an organization member has to organization resources via a fine-grained personal access token. Limited to revoking the token's existing access. Limited to revoking a token's existing access.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsUpdatePatAccessParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUpdatePatAccess(\n    params: github.OrgsUpdatePatAccessParams\n  ): Promise<github.OrgsUpdatePatAccessResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/personal-access-tokens/${params.pat_id}`,\n        {\n          json: pick(params, 'action')\n        }\n      )\n      .json<github.OrgsUpdatePatAccessResponse>()\n  }\n\n  /**\n * Lists the repositories a fine-grained personal access token has access to.\n\nOnly GitHub Apps can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_list_pat_grant_repositories',\n    description: `Lists the repositories a fine-grained personal access token has access to.\n\nOnly GitHub Apps can use this endpoint.`,\n    inputSchema: github.OrgsListPatGrantRepositoriesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListPatGrantRepositories(\n    params: github.OrgsListPatGrantRepositoriesParams\n  ): Promise<github.OrgsListPatGrantRepositoriesResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/personal-access-tokens/${params.pat_id}/repositories`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.OrgsListPatGrantRepositoriesResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nLists all private registry configurations available at the organization-level without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_private_registries_list_org_private_registries',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nLists all private registry configurations available at the organization-level without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.PrivateRegistriesListOrgPrivateRegistriesParamsSchema,\n    tags: ['private-registries']\n  })\n  async privateRegistriesListOrgPrivateRegistries(\n    params: github.PrivateRegistriesListOrgPrivateRegistriesParams\n  ): Promise<github.PrivateRegistriesListOrgPrivateRegistriesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/private-registries`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.PrivateRegistriesListOrgPrivateRegistriesResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nCreates a private registry configuration with an encrypted value for an organization. Encrypt your secret using [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_private_registries_create_org_private_registry',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nCreates a private registry configuration with an encrypted value for an organization. Encrypt your secret using [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.PrivateRegistriesCreateOrgPrivateRegistryParamsSchema,\n    tags: ['private-registries']\n  })\n  async privateRegistriesCreateOrgPrivateRegistry(\n    params: github.PrivateRegistriesCreateOrgPrivateRegistryParams\n  ): Promise<github.PrivateRegistriesCreateOrgPrivateRegistryResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/private-registries`, {\n        json: pick(\n          params,\n          'registry_type',\n          'username',\n          'encrypted_value',\n          'key_id',\n          'visibility',\n          'selected_repository_ids'\n        )\n      })\n      .json<github.PrivateRegistriesCreateOrgPrivateRegistryResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGets the org public key, which is needed to encrypt private registry secrets. You need to encrypt a secret before you can create or update secrets.\n\nOAuth tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_private_registries_get_org_public_key',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGets the org public key, which is needed to encrypt private registry secrets. You need to encrypt a secret before you can create or update secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.PrivateRegistriesGetOrgPublicKeyParamsSchema,\n    tags: ['private-registries']\n  })\n  async privateRegistriesGetOrgPublicKey(\n    params: github.PrivateRegistriesGetOrgPublicKeyParams\n  ): Promise<github.PrivateRegistriesGetOrgPublicKeyResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/private-registries/public-key`)\n      .json<github.PrivateRegistriesGetOrgPublicKeyResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGet the configuration of a single private registry defined for an organization, omitting its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_private_registries_get_org_private_registry',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nGet the configuration of a single private registry defined for an organization, omitting its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.PrivateRegistriesGetOrgPrivateRegistryParamsSchema,\n    tags: ['private-registries']\n  })\n  async privateRegistriesGetOrgPrivateRegistry(\n    params: github.PrivateRegistriesGetOrgPrivateRegistryParams\n  ): Promise<github.PrivateRegistriesGetOrgPrivateRegistryResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/private-registries/${params.secret_name}`,\n        {}\n      )\n      .json<github.PrivateRegistriesGetOrgPrivateRegistryResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nDelete a private registry configuration at the organization-level.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_private_registries_delete_org_private_registry',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nDelete a private registry configuration at the organization-level.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.PrivateRegistriesDeleteOrgPrivateRegistryParamsSchema,\n    tags: ['private-registries']\n  })\n  async privateRegistriesDeleteOrgPrivateRegistry(\n    params: github.PrivateRegistriesDeleteOrgPrivateRegistryParams\n  ): Promise<github.PrivateRegistriesDeleteOrgPrivateRegistryResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/private-registries/${params.secret_name}`,\n        {}\n      )\n      .json<github.PrivateRegistriesDeleteOrgPrivateRegistryResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nUpdates a private registry configuration with an encrypted value for an organization. Encrypt your secret using [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_private_registries_update_org_private_registry',\n    description: `> [!NOTE]\n> This endpoint is in public preview and is subject to change.\n\nUpdates a private registry configuration with an encrypted value for an organization. Encrypt your secret using [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.PrivateRegistriesUpdateOrgPrivateRegistryParamsSchema,\n    tags: ['private-registries']\n  })\n  async privateRegistriesUpdateOrgPrivateRegistry(\n    params: github.PrivateRegistriesUpdateOrgPrivateRegistryParams\n  ): Promise<github.PrivateRegistriesUpdateOrgPrivateRegistryResponse> {\n    return this.ky\n      .patch(\n        `/orgs/${params.org}/private-registries/${params.secret_name}`,\n        {\n          json: pick(\n            params,\n            'registry_type',\n            'username',\n            'encrypted_value',\n            'key_id',\n            'visibility',\n            'selected_repository_ids'\n          )\n        }\n      )\n      .json<github.PrivateRegistriesUpdateOrgPrivateRegistryResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_list_for_org',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsListForOrgParamsSchema,\n    tags: ['projects']\n  })\n  async projectsListForOrg(\n    params: github.ProjectsListForOrgParams\n  ): Promise<github.ProjectsListForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/projects`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'state', 'per_page', 'page')\n        )\n      })\n      .json<github.ProjectsListForOrgResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_create_for_org',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsCreateForOrgParamsSchema,\n    tags: ['projects']\n  })\n  async projectsCreateForOrg(\n    params: github.ProjectsCreateForOrgParams\n  ): Promise<github.ProjectsCreateForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/projects`, {\n        json: pick(params, 'name', 'body')\n      })\n      .json<github.ProjectsCreateForOrgResponse>()\n  }\n\n  /**\n * Gets all custom properties defined for an organization.\nOrganization members can read these properties.\n */\n  @aiFunction({\n    name: 'github_orgs_get_all_custom_properties',\n    description: `Gets all custom properties defined for an organization.\nOrganization members can read these properties.`,\n    inputSchema: github.OrgsGetAllCustomPropertiesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetAllCustomProperties(\n    params: github.OrgsGetAllCustomPropertiesParams\n  ): Promise<github.OrgsGetAllCustomPropertiesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/properties/schema`)\n      .json<github.OrgsGetAllCustomPropertiesResponse>()\n  }\n\n  /**\n * Creates new or updates existing custom properties defined for an organization in a batch.\n\nIf the property already exists, the existing property will be replaced with the new values.\nMissing optional values will fall back to default values, previous values will be overwritten.\nE.g. if a property exists with `values_editable_by: org_and_repo_actors` and it's updated without specifying `values_editable_by`, it will be updated to default value `org_actors`.\n\nTo use this endpoint, the authenticated user must be one of:\n  - An administrator for the organization.\n  - A user, or a user on a team, with the fine-grained permission of `custom_properties_org_definitions_manager` in the organization.\n */\n  @aiFunction({\n    name: 'github_orgs_create_or_update_custom_properties',\n    description: `Creates new or updates existing custom properties defined for an organization in a batch.\n\nIf the property already exists, the existing property will be replaced with the new values.\nMissing optional values will fall back to default values, previous values will be overwritten.\nE.g. if a property exists with \\`values_editable_by: org_and_repo_actors\\` and it's updated without specifying \\`values_editable_by\\`, it will be updated to default value \\`org_actors\\`.\n\nTo use this endpoint, the authenticated user must be one of:\n  - An administrator for the organization.\n  - A user, or a user on a team, with the fine-grained permission of \\`custom_properties_org_definitions_manager\\` in the organization.`,\n    inputSchema: github.OrgsCreateOrUpdateCustomPropertiesParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCreateOrUpdateCustomProperties(\n    params: github.OrgsCreateOrUpdateCustomPropertiesParams\n  ): Promise<github.OrgsCreateOrUpdateCustomPropertiesResponse> {\n    return this.ky\n      .patch(`/orgs/${params.org}/properties/schema`, {\n        json: pick(params, 'properties')\n      })\n      .json<github.OrgsCreateOrUpdateCustomPropertiesResponse>()\n  }\n\n  /**\n * Gets a custom property that is defined for an organization.\nOrganization members can read these properties.\n */\n  @aiFunction({\n    name: 'github_orgs_get_custom_property',\n    description: `Gets a custom property that is defined for an organization.\nOrganization members can read these properties.`,\n    inputSchema: github.OrgsGetCustomPropertyParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetCustomProperty(\n    params: github.OrgsGetCustomPropertyParams\n  ): Promise<github.OrgsGetCustomPropertyResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/properties/schema/${params.custom_property_name}`,\n        {}\n      )\n      .json<github.OrgsGetCustomPropertyResponse>()\n  }\n\n  /**\n * Creates a new or updates an existing custom property that is defined for an organization.\n\nTo use this endpoint, the authenticated user must be one of:\n- An administrator for the organization.\n- A user, or a user on a team, with the fine-grained permission of `custom_properties_org_definitions_manager` in the organization.\n */\n  @aiFunction({\n    name: 'github_orgs_create_or_update_custom_property',\n    description: `Creates a new or updates an existing custom property that is defined for an organization.\n\nTo use this endpoint, the authenticated user must be one of:\n- An administrator for the organization.\n- A user, or a user on a team, with the fine-grained permission of \\`custom_properties_org_definitions_manager\\` in the organization.`,\n    inputSchema: github.OrgsCreateOrUpdateCustomPropertyParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCreateOrUpdateCustomProperty(\n    params: github.OrgsCreateOrUpdateCustomPropertyParams\n  ): Promise<github.OrgsCreateOrUpdateCustomPropertyResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/properties/schema/${params.custom_property_name}`,\n        {\n          json: pick(\n            params,\n            'value_type',\n            'required',\n            'default_value',\n            'description',\n            'allowed_values',\n            'values_editable_by'\n          )\n        }\n      )\n      .json<github.OrgsCreateOrUpdateCustomPropertyResponse>()\n  }\n\n  /**\n * Removes a custom property that is defined for an organization.\n\nTo use this endpoint, the authenticated user must be one of:\n  - An administrator for the organization.\n  - A user, or a user on a team, with the fine-grained permission of `custom_properties_org_definitions_manager` in the organization.\n */\n  @aiFunction({\n    name: 'github_orgs_remove_custom_property',\n    description: `Removes a custom property that is defined for an organization.\n\nTo use this endpoint, the authenticated user must be one of:\n  - An administrator for the organization.\n  - A user, or a user on a team, with the fine-grained permission of \\`custom_properties_org_definitions_manager\\` in the organization.`,\n    inputSchema: github.OrgsRemoveCustomPropertyParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRemoveCustomProperty(\n    params: github.OrgsRemoveCustomPropertyParams\n  ): Promise<github.OrgsRemoveCustomPropertyResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/properties/schema/${params.custom_property_name}`,\n        {}\n      )\n      .json<github.OrgsRemoveCustomPropertyResponse>()\n  }\n\n  /**\n * Lists organization repositories with all of their custom property values.\nOrganization members can read these properties.\n */\n  @aiFunction({\n    name: 'github_orgs_list_custom_properties_values_for_repos',\n    description: `Lists organization repositories with all of their custom property values.\nOrganization members can read these properties.`,\n    inputSchema: github.OrgsListCustomPropertiesValuesForReposParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListCustomPropertiesValuesForRepos(\n    params: github.OrgsListCustomPropertiesValuesForReposParams\n  ): Promise<github.OrgsListCustomPropertiesValuesForReposResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/properties/values`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'repository_query')\n        )\n      })\n      .json<github.OrgsListCustomPropertiesValuesForReposResponse>()\n  }\n\n  /**\n * Create new or update existing custom property values for repositories in a batch that belong to an organization.\nEach target repository will have its custom property values updated to match the values provided in the request.\n\nA maximum of 30 repositories can be updated in a single request.\n\nUsing a value of `null` for a custom property will remove or 'unset' the property value from the repository.\n\nTo use this endpoint, the authenticated user must be one of:\n  - An administrator for the organization.\n  - A user, or a user on a team, with the fine-grained permission of `custom_properties_org_values_editor` in the organization.\n */\n  @aiFunction({\n    name: 'github_orgs_create_or_update_custom_properties_values_for_repos',\n    description: `Create new or update existing custom property values for repositories in a batch that belong to an organization.\nEach target repository will have its custom property values updated to match the values provided in the request.\n\nA maximum of 30 repositories can be updated in a single request.\n\nUsing a value of \\`null\\` for a custom property will remove or 'unset' the property value from the repository.\n\nTo use this endpoint, the authenticated user must be one of:\n  - An administrator for the organization.\n  - A user, or a user on a team, with the fine-grained permission of \\`custom_properties_org_values_editor\\` in the organization.`,\n    inputSchema:\n      github.OrgsCreateOrUpdateCustomPropertiesValuesForReposParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCreateOrUpdateCustomPropertiesValuesForRepos(\n    params: github.OrgsCreateOrUpdateCustomPropertiesValuesForReposParams\n  ): Promise<github.OrgsCreateOrUpdateCustomPropertiesValuesForReposResponse> {\n    return this.ky\n      .patch(`/orgs/${params.org}/properties/values`, {\n        json: pick(params, 'repository_names', 'properties')\n      })\n      .json<github.OrgsCreateOrUpdateCustomPropertiesValuesForReposResponse>()\n  }\n\n  /**\n   * Members of an organization can choose to have their membership publicized or not.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_public_members',\n    description: `Members of an organization can choose to have their membership publicized or not.`,\n    inputSchema: github.OrgsListPublicMembersParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListPublicMembers(\n    params: github.OrgsListPublicMembersParams\n  ): Promise<github.OrgsListPublicMembersResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/public_members`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsListPublicMembersResponse>()\n  }\n\n  /**\n   * Check if the provided user is a public member of the organization.\n   */\n  @aiFunction({\n    name: 'github_orgs_check_public_membership_for_user',\n    description: `Check if the provided user is a public member of the organization.`,\n    inputSchema: github.OrgsCheckPublicMembershipForUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsCheckPublicMembershipForUser(\n    params: github.OrgsCheckPublicMembershipForUserParams\n  ): Promise<github.OrgsCheckPublicMembershipForUserResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/public_members/${params.username}`, {})\n      .json<github.OrgsCheckPublicMembershipForUserResponse>()\n  }\n\n  /**\n * The user can publicize their own membership. (A user cannot publicize the membership for another user.)\n\nNote that you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".\n */\n  @aiFunction({\n    name: 'github_orgs_set_public_membership_for_authenticated_user',\n    description: `The user can publicize their own membership. (A user cannot publicize the membership for another user.)\n\nNote that you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".`,\n    inputSchema: github.OrgsSetPublicMembershipForAuthenticatedUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsSetPublicMembershipForAuthenticatedUser(\n    params: github.OrgsSetPublicMembershipForAuthenticatedUserParams\n  ): Promise<github.OrgsSetPublicMembershipForAuthenticatedUserResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/public_members/${params.username}`, {})\n      .json<github.OrgsSetPublicMembershipForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Removes the public membership for the authenticated user from the specified organization, unless public visibility is enforced by default.\n   */\n  @aiFunction({\n    name: 'github_orgs_remove_public_membership_for_authenticated_user',\n    description: `Removes the public membership for the authenticated user from the specified organization, unless public visibility is enforced by default.`,\n    inputSchema:\n      github.OrgsRemovePublicMembershipForAuthenticatedUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRemovePublicMembershipForAuthenticatedUser(\n    params: github.OrgsRemovePublicMembershipForAuthenticatedUserParams\n  ): Promise<github.OrgsRemovePublicMembershipForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/public_members/${params.username}`, {})\n      .json<github.OrgsRemovePublicMembershipForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists repositories for the specified organization.\n\n> [!NOTE]\n> In order to see the `security_and_analysis` block for a repository you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\".\n */\n  @aiFunction({\n    name: 'github_repos_list_for_org',\n    description: `Lists repositories for the specified organization.\n\n> [!NOTE]\n> In order to see the \\`security_and_analysis\\` block for a repository you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\".`,\n    inputSchema: github.ReposListForOrgParamsSchema,\n    tags: ['repos']\n  })\n  async reposListForOrg(\n    params: github.ReposListForOrgParams\n  ): Promise<github.ReposListForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/repos`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'type', 'sort', 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.ReposListForOrgResponse>()\n  }\n\n  /**\n * Creates a new repository in the specified organization. The authenticated user must be a member of the organization.\n\nOAuth app tokens and personal access tokens (classic) need the `public_repo` or `repo` scope to create a public repository, and `repo` scope to create a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_create_in_org',\n    description: `Creates a new repository in the specified organization. The authenticated user must be a member of the organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`public_repo\\` or \\`repo\\` scope to create a public repository, and \\`repo\\` scope to create a private repository.`,\n    inputSchema: github.ReposCreateInOrgParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateInOrg(\n    params: github.ReposCreateInOrgParams\n  ): Promise<github.ReposCreateInOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/repos`, {\n        json: pick(\n          params,\n          'name',\n          'description',\n          'homepage',\n          'private',\n          'visibility',\n          'has_issues',\n          'has_projects',\n          'has_wiki',\n          'has_downloads',\n          'is_template',\n          'team_id',\n          'auto_init',\n          'gitignore_template',\n          'license_template',\n          'allow_squash_merge',\n          'allow_merge_commit',\n          'allow_rebase_merge',\n          'allow_auto_merge',\n          'delete_branch_on_merge',\n          'use_squash_pr_title_as_default',\n          'squash_merge_commit_title',\n          'squash_merge_commit_message',\n          'merge_commit_title',\n          'merge_commit_message',\n          'custom_properties'\n        )\n      })\n      .json<github.ReposCreateInOrgResponse>()\n  }\n\n  /**\n   * Get all the repository rulesets for an organization.\n   */\n  @aiFunction({\n    name: 'github_repos_get_org_rulesets',\n    description: `Get all the repository rulesets for an organization.`,\n    inputSchema: github.ReposGetOrgRulesetsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetOrgRulesets(\n    params: github.ReposGetOrgRulesetsParams\n  ): Promise<github.ReposGetOrgRulesetsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/rulesets`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'targets')\n        )\n      })\n      .json<github.ReposGetOrgRulesetsResponse>()\n  }\n\n  /**\n   * Create a repository ruleset for an organization.\n   */\n  @aiFunction({\n    name: 'github_repos_create_org_ruleset',\n    description: `Create a repository ruleset for an organization.`,\n    inputSchema: github.ReposCreateOrgRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateOrgRuleset(\n    params: github.ReposCreateOrgRulesetParams\n  ): Promise<github.ReposCreateOrgRulesetResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/rulesets`, {\n        json: pick(\n          params,\n          'name',\n          'target',\n          'enforcement',\n          'bypass_actors',\n          'conditions',\n          'rules'\n        )\n      })\n      .json<github.ReposCreateOrgRulesetResponse>()\n  }\n\n  /**\n * Lists suites of rule evaluations at the organization level.\nFor more information, see \"[Managing rulesets for repositories in your organization](https://docs.github.com/organizations/managing-organization-settings/managing-rulesets-for-repositories-in-your-organization#viewing-insights-for-rulesets).\".\n */\n  @aiFunction({\n    name: 'github_repos_get_org_rule_suites',\n    description: `Lists suites of rule evaluations at the organization level.\nFor more information, see \"[Managing rulesets for repositories in your organization](https://docs.github.com/organizations/managing-organization-settings/managing-rulesets-for-repositories-in-your-organization#viewing-insights-for-rulesets).\".`,\n    inputSchema: github.ReposGetOrgRuleSuitesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetOrgRuleSuites(\n    params: github.ReposGetOrgRuleSuitesParams\n  ): Promise<github.ReposGetOrgRuleSuitesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/rulesets/rule-suites`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'ref',\n            'repository_name',\n            'time_period',\n            'actor_name',\n            'rule_suite_result',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.ReposGetOrgRuleSuitesResponse>()\n  }\n\n  /**\n * Gets information about a suite of rule evaluations from within an organization.\nFor more information, see \"[Managing rulesets for repositories in your organization](https://docs.github.com/organizations/managing-organization-settings/managing-rulesets-for-repositories-in-your-organization#viewing-insights-for-rulesets).\".\n */\n  @aiFunction({\n    name: 'github_repos_get_org_rule_suite',\n    description: `Gets information about a suite of rule evaluations from within an organization.\nFor more information, see \"[Managing rulesets for repositories in your organization](https://docs.github.com/organizations/managing-organization-settings/managing-rulesets-for-repositories-in-your-organization#viewing-insights-for-rulesets).\".`,\n    inputSchema: github.ReposGetOrgRuleSuiteParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetOrgRuleSuite(\n    params: github.ReposGetOrgRuleSuiteParams\n  ): Promise<github.ReposGetOrgRuleSuiteResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/rulesets/rule-suites/${params.rule_suite_id}`,\n        {}\n      )\n      .json<github.ReposGetOrgRuleSuiteResponse>()\n  }\n\n  /**\n * Get a repository ruleset for an organization.\n\n**Note:** To prevent leaking sensitive information, the `bypass_actors` property is only returned if the user\nmaking the API request has write access to the ruleset.\n */\n  @aiFunction({\n    name: 'github_repos_get_org_ruleset',\n    description: `Get a repository ruleset for an organization.\n\n**Note:** To prevent leaking sensitive information, the \\`bypass_actors\\` property is only returned if the user\nmaking the API request has write access to the ruleset.`,\n    inputSchema: github.ReposGetOrgRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetOrgRuleset(\n    params: github.ReposGetOrgRulesetParams\n  ): Promise<github.ReposGetOrgRulesetResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/rulesets/${params.ruleset_id}`, {})\n      .json<github.ReposGetOrgRulesetResponse>()\n  }\n\n  /**\n   * Update a ruleset for an organization.\n   */\n  @aiFunction({\n    name: 'github_repos_update_org_ruleset',\n    description: `Update a ruleset for an organization.`,\n    inputSchema: github.ReposUpdateOrgRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateOrgRuleset(\n    params: github.ReposUpdateOrgRulesetParams\n  ): Promise<github.ReposUpdateOrgRulesetResponse> {\n    return this.ky\n      .put(`/orgs/${params.org}/rulesets/${params.ruleset_id}`, {\n        json: pick(\n          params,\n          'name',\n          'target',\n          'enforcement',\n          'bypass_actors',\n          'conditions',\n          'rules'\n        )\n      })\n      .json<github.ReposUpdateOrgRulesetResponse>()\n  }\n\n  /**\n   * Delete a ruleset for an organization.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_org_ruleset',\n    description: `Delete a ruleset for an organization.`,\n    inputSchema: github.ReposDeleteOrgRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteOrgRuleset(\n    params: github.ReposDeleteOrgRulesetParams\n  ): Promise<github.ReposDeleteOrgRulesetResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/rulesets/${params.ruleset_id}`, {})\n      .json<github.ReposDeleteOrgRulesetResponse>()\n  }\n\n  /**\n   * Get the history of an organization ruleset.\n   */\n  @aiFunction({\n    name: 'github_orgs_get_org_ruleset_history',\n    description: `Get the history of an organization ruleset.`,\n    inputSchema: github.OrgsGetOrgRulesetHistoryParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetOrgRulesetHistory(\n    params: github.OrgsGetOrgRulesetHistoryParams\n  ): Promise<github.OrgsGetOrgRulesetHistoryResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/rulesets/${params.ruleset_id}/history`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsGetOrgRulesetHistoryResponse>()\n  }\n\n  /**\n   * Get a version of an organization ruleset.\n   */\n  @aiFunction({\n    name: 'github_orgs_get_org_ruleset_version',\n    description: `Get a version of an organization ruleset.`,\n    inputSchema: github.OrgsGetOrgRulesetVersionParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetOrgRulesetVersion(\n    params: github.OrgsGetOrgRulesetVersionParams\n  ): Promise<github.OrgsGetOrgRulesetVersionResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/rulesets/${params.ruleset_id}/history/${params.version_id}`,\n        {}\n      )\n      .json<github.OrgsGetOrgRulesetVersionResponse>()\n  }\n\n  /**\n * Lists secret scanning alerts for eligible repositories in an organization, from newest to oldest.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_list_alerts_for_org',\n    description: `Lists secret scanning alerts for eligible repositories in an organization, from newest to oldest.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.SecretScanningListAlertsForOrgParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningListAlertsForOrg(\n    params: github.SecretScanningListAlertsForOrgParams\n  ): Promise<github.SecretScanningListAlertsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/secret-scanning/alerts`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'state',\n            'secret_type',\n            'resolution',\n            'sort',\n            'direction',\n            'page',\n            'per_page',\n            'before',\n            'after',\n            'validity',\n            'is_publicly_leaked',\n            'is_multi_repo'\n          )\n        )\n      })\n      .json<github.SecretScanningListAlertsForOrgResponse>()\n  }\n\n  /**\n * Lists repository security advisories for an organization.\n\nThe authenticated user must be an owner or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repository_advisories:write` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_security_advisories_list_org_repository_advisories',\n    description: `Lists repository security advisories for an organization.\n\nThe authenticated user must be an owner or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repository_advisories:write\\` scope to use this endpoint.`,\n    inputSchema:\n      github.SecurityAdvisoriesListOrgRepositoryAdvisoriesParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesListOrgRepositoryAdvisories(\n    params: github.SecurityAdvisoriesListOrgRepositoryAdvisoriesParams\n  ): Promise<github.SecurityAdvisoriesListOrgRepositoryAdvisoriesResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/security-advisories`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'direction',\n            'sort',\n            'before',\n            'after',\n            'per_page',\n            'state'\n          )\n        )\n      })\n      .json<github.SecurityAdvisoriesListOrgRepositoryAdvisoriesResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed starting January 1, 2026. Please use the \"[Organization Roles](https://docs.github.com/rest/orgs/organization-roles)\" endpoints instead.\n */\n  @aiFunction({\n    name: 'github_orgs_list_security_manager_teams',\n    description: `> [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed starting January 1, 2026. Please use the \"[Organization Roles](https://docs.github.com/rest/orgs/organization-roles)\" endpoints instead.`,\n    inputSchema: github.OrgsListSecurityManagerTeamsParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListSecurityManagerTeams(\n    params: github.OrgsListSecurityManagerTeamsParams\n  ): Promise<github.OrgsListSecurityManagerTeamsResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/security-managers`)\n      .json<github.OrgsListSecurityManagerTeamsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed starting January 1, 2026. Please use the \"[Organization Roles](https://docs.github.com/rest/orgs/organization-roles)\" endpoints instead.\n */\n  @aiFunction({\n    name: 'github_orgs_add_security_manager_team',\n    description: `> [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed starting January 1, 2026. Please use the \"[Organization Roles](https://docs.github.com/rest/orgs/organization-roles)\" endpoints instead.`,\n    inputSchema: github.OrgsAddSecurityManagerTeamParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsAddSecurityManagerTeam(\n    params: github.OrgsAddSecurityManagerTeamParams\n  ): Promise<github.OrgsAddSecurityManagerTeamResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/security-managers/teams/${params.team_slug}`,\n        {}\n      )\n      .json<github.OrgsAddSecurityManagerTeamResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed starting January 1, 2026. Please use the \"[Organization Roles](https://docs.github.com/rest/orgs/organization-roles)\" endpoints instead.\n */\n  @aiFunction({\n    name: 'github_orgs_remove_security_manager_team',\n    description: `> [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed starting January 1, 2026. Please use the \"[Organization Roles](https://docs.github.com/rest/orgs/organization-roles)\" endpoints instead.`,\n    inputSchema: github.OrgsRemoveSecurityManagerTeamParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsRemoveSecurityManagerTeam(\n    params: github.OrgsRemoveSecurityManagerTeamParams\n  ): Promise<github.OrgsRemoveSecurityManagerTeamResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/security-managers/teams/${params.team_slug}`,\n        {}\n      )\n      .json<github.OrgsRemoveSecurityManagerTeamResponse>()\n  }\n\n  /**\n * Gets the summary of the free and paid GitHub Actions minutes used.\n\nPaid minutes only apply to workflows in private repositories that use GitHub-hosted runners. Minutes used is listed for each GitHub-hosted runner operating system. Any job re-runs are also included in the usage. The usage returned includes any minute multipliers for macOS and Windows runners, and is rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_billing_get_github_actions_billing_org',\n    description: `Gets the summary of the free and paid GitHub Actions minutes used.\n\nPaid minutes only apply to workflows in private repositories that use GitHub-hosted runners. Minutes used is listed for each GitHub-hosted runner operating system. Any job re-runs are also included in the usage. The usage returned includes any minute multipliers for macOS and Windows runners, and is rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.BillingGetGithubActionsBillingOrgParamsSchema,\n    tags: ['billing']\n  })\n  async billingGetGithubActionsBillingOrg(\n    params: github.BillingGetGithubActionsBillingOrgParams\n  ): Promise<github.BillingGetGithubActionsBillingOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/settings/billing/actions`)\n      .json<github.BillingGetGithubActionsBillingOrgResponse>()\n  }\n\n  /**\n * Gets the free and paid storage used for GitHub Packages in gigabytes.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_billing_get_github_packages_billing_org',\n    description: `Gets the free and paid storage used for GitHub Packages in gigabytes.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.BillingGetGithubPackagesBillingOrgParamsSchema,\n    tags: ['billing']\n  })\n  async billingGetGithubPackagesBillingOrg(\n    params: github.BillingGetGithubPackagesBillingOrgParams\n  ): Promise<github.BillingGetGithubPackagesBillingOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/settings/billing/packages`)\n      .json<github.BillingGetGithubPackagesBillingOrgResponse>()\n  }\n\n  /**\n * Gets the estimated paid and estimated total storage used for GitHub Actions and GitHub Packages.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `admin:org` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_billing_get_shared_storage_billing_org',\n    description: `Gets the estimated paid and estimated total storage used for GitHub Actions and GitHub Packages.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`admin:org\\` scope to use this endpoint.`,\n    inputSchema: github.BillingGetSharedStorageBillingOrgParamsSchema,\n    tags: ['billing']\n  })\n  async billingGetSharedStorageBillingOrg(\n    params: github.BillingGetSharedStorageBillingOrgParams\n  ): Promise<github.BillingGetSharedStorageBillingOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/settings/billing/shared-storage`)\n      .json<github.BillingGetSharedStorageBillingOrgResponse>()\n  }\n\n  /**\n * Lists all hosted compute network configurations configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `read:network_configurations` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_hosted_compute_list_network_configurations_for_org',\n    description: `Lists all hosted compute network configurations configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:network_configurations\\` scope to use this endpoint.`,\n    inputSchema:\n      github.HostedComputeListNetworkConfigurationsForOrgParamsSchema,\n    tags: ['hosted-compute']\n  })\n  async hostedComputeListNetworkConfigurationsForOrg(\n    params: github.HostedComputeListNetworkConfigurationsForOrgParams\n  ): Promise<github.HostedComputeListNetworkConfigurationsForOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/settings/network-configurations`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.HostedComputeListNetworkConfigurationsForOrgResponse>()\n  }\n\n  /**\n * Creates a hosted compute network configuration for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `write:network_configurations` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_hosted_compute_create_network_configuration_for_org',\n    description: `Creates a hosted compute network configuration for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:network_configurations\\` scope to use this endpoint.`,\n    inputSchema:\n      github.HostedComputeCreateNetworkConfigurationForOrgParamsSchema,\n    tags: ['hosted-compute']\n  })\n  async hostedComputeCreateNetworkConfigurationForOrg(\n    params: github.HostedComputeCreateNetworkConfigurationForOrgParams\n  ): Promise<github.HostedComputeCreateNetworkConfigurationForOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/settings/network-configurations`, {\n        json: pick(params, 'name', 'compute_service', 'network_settings_ids')\n      })\n      .json<github.HostedComputeCreateNetworkConfigurationForOrgResponse>()\n  }\n\n  /**\n * Gets a hosted compute network configuration configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `read:network_configurations` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_hosted_compute_get_network_configuration_for_org',\n    description: `Gets a hosted compute network configuration configured in an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:network_configurations\\` scope to use this endpoint.`,\n    inputSchema: github.HostedComputeGetNetworkConfigurationForOrgParamsSchema,\n    tags: ['hosted-compute']\n  })\n  async hostedComputeGetNetworkConfigurationForOrg(\n    params: github.HostedComputeGetNetworkConfigurationForOrgParams\n  ): Promise<github.HostedComputeGetNetworkConfigurationForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/settings/network-configurations/${params.network_configuration_id}`,\n        {}\n      )\n      .json<github.HostedComputeGetNetworkConfigurationForOrgResponse>()\n  }\n\n  /**\n * Deletes a hosted compute network configuration from an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `write:network_configurations` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_hosted_compute_delete_network_configuration_from_org',\n    description: `Deletes a hosted compute network configuration from an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:network_configurations\\` scope to use this endpoint.`,\n    inputSchema:\n      github.HostedComputeDeleteNetworkConfigurationFromOrgParamsSchema,\n    tags: ['hosted-compute']\n  })\n  async hostedComputeDeleteNetworkConfigurationFromOrg(\n    params: github.HostedComputeDeleteNetworkConfigurationFromOrgParams\n  ): Promise<github.HostedComputeDeleteNetworkConfigurationFromOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/settings/network-configurations/${params.network_configuration_id}`,\n        {}\n      )\n      .json<github.HostedComputeDeleteNetworkConfigurationFromOrgResponse>()\n  }\n\n  /**\n * Updates a hosted compute network configuration for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `write:network_configurations` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_hosted_compute_update_network_configuration_for_org',\n    description: `Updates a hosted compute network configuration for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:network_configurations\\` scope to use this endpoint.`,\n    inputSchema:\n      github.HostedComputeUpdateNetworkConfigurationForOrgParamsSchema,\n    tags: ['hosted-compute']\n  })\n  async hostedComputeUpdateNetworkConfigurationForOrg(\n    params: github.HostedComputeUpdateNetworkConfigurationForOrgParams\n  ): Promise<github.HostedComputeUpdateNetworkConfigurationForOrgResponse> {\n    return this.ky\n      .patch(\n        `/orgs/${params.org}/settings/network-configurations/${params.network_configuration_id}`,\n        {\n          json: pick(params, 'name', 'compute_service', 'network_settings_ids')\n        }\n      )\n      .json<github.HostedComputeUpdateNetworkConfigurationForOrgResponse>()\n  }\n\n  /**\n * Gets a hosted compute network settings resource configured for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the `read:network_configurations` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_hosted_compute_get_network_settings_for_org',\n    description: `Gets a hosted compute network settings resource configured for an organization.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:network_configurations\\` scope to use this endpoint.`,\n    inputSchema: github.HostedComputeGetNetworkSettingsForOrgParamsSchema,\n    tags: ['hosted-compute']\n  })\n  async hostedComputeGetNetworkSettingsForOrg(\n    params: github.HostedComputeGetNetworkSettingsForOrgParams\n  ): Promise<github.HostedComputeGetNetworkSettingsForOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/settings/network-settings/${params.network_settings_id}`,\n        {}\n      )\n      .json<github.HostedComputeGetNetworkSettingsForOrgResponse>()\n  }\n\n  /**\n * Use this endpoint to see a breakdown of aggregated metrics for various GitHub Copilot features. See the response schema tab for detailed metrics definitions.\n\n> [!NOTE]\n> This endpoint will only return results for a given day if the team had **five or more members with active Copilot licenses** on that day, as evaluated at the end of that day.\n\nThe response contains metrics for up to 28 days prior. Metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\nTo access this endpoint, the Copilot Metrics API access policy must be enabled for the organization containing the team within GitHub settings.\nOnly organization owners for the organization that contains this team and owners and billing managers of the parent enterprise can view Copilot metrics for a team.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot`, `read:org`, or `read:enterprise` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_copilot_metrics_for_team',\n    description: `Use this endpoint to see a breakdown of aggregated metrics for various GitHub Copilot features. See the response schema tab for detailed metrics definitions.\n\n> [!NOTE]\n> This endpoint will only return results for a given day if the team had **five or more members with active Copilot licenses** on that day, as evaluated at the end of that day.\n\nThe response contains metrics for up to 28 days prior. Metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\nTo access this endpoint, the Copilot Metrics API access policy must be enabled for the organization containing the team within GitHub settings.\nOnly organization owners for the organization that contains this team and owners and billing managers of the parent enterprise can view Copilot metrics for a team.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\`, \\`read:org\\`, or \\`read:enterprise\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotCopilotMetricsForTeamParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotCopilotMetricsForTeam(\n    params: github.CopilotCopilotMetricsForTeamParams\n  ): Promise<github.CopilotCopilotMetricsForTeamResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/team/${params.team_slug}/copilot/metrics`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'since', 'until', 'page', 'per_page')\n          )\n        }\n      )\n      .json<github.CopilotCopilotMetricsForTeamResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This endpoint is closing down. It will be accessible throughout February 2025, but will not return any new data after February 1st.\n\nYou can use this endpoint to see a daily breakdown of aggregated usage metrics for Copilot completions and Copilot Chat in the IDE\nfor users within a team, with a further breakdown of suggestions, acceptances, and number of active users by editor and language for each day.\nSee the response schema tab for detailed metrics definitions.\n\nThe response contains metrics for up to 28 days prior. Usage metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\n> [!NOTE]\n> This endpoint will only return results for a given day if the team had five or more members with active Copilot licenses, as evaluated at the end of that day.\n\nOrganization owners for the organization that contains this team, and owners and billing managers of the parent enterprise can view Copilot usage metrics for a team.\n\nOAuth app tokens and personal access tokens (classic) need either the `manage_billing:copilot`, `read:org`, or `read:enterprise` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_copilot_usage_metrics_for_team',\n    description: `> [!NOTE]\n> This endpoint is closing down. It will be accessible throughout February 2025, but will not return any new data after February 1st.\n\nYou can use this endpoint to see a daily breakdown of aggregated usage metrics for Copilot completions and Copilot Chat in the IDE\nfor users within a team, with a further breakdown of suggestions, acceptances, and number of active users by editor and language for each day.\nSee the response schema tab for detailed metrics definitions.\n\nThe response contains metrics for up to 28 days prior. Usage metrics are processed once per day for the previous day,\nand the response will only include data up until yesterday. In order for an end user to be counted towards these metrics,\nthey must have telemetry enabled in their IDE.\n\n> [!NOTE]\n> This endpoint will only return results for a given day if the team had five or more members with active Copilot licenses, as evaluated at the end of that day.\n\nOrganization owners for the organization that contains this team, and owners and billing managers of the parent enterprise can view Copilot usage metrics for a team.\n\nOAuth app tokens and personal access tokens (classic) need either the \\`manage_billing:copilot\\`, \\`read:org\\`, or \\`read:enterprise\\` scopes to use this endpoint.`,\n    inputSchema: github.CopilotUsageMetricsForTeamParamsSchema,\n    tags: ['copilot']\n  })\n  async copilotUsageMetricsForTeam(\n    params: github.CopilotUsageMetricsForTeamParams\n  ): Promise<github.CopilotUsageMetricsForTeamResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/team/${params.team_slug}/copilot/usage`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'since', 'until', 'page', 'per_page')\n        )\n      })\n      .json<github.CopilotUsageMetricsForTeamResponse>()\n  }\n\n  /**\n   * Lists all teams in an organization that are visible to the authenticated user.\n   */\n  @aiFunction({\n    name: 'github_teams_list',\n    description: `Lists all teams in an organization that are visible to the authenticated user.`,\n    inputSchema: github.TeamsListParamsSchema,\n    tags: ['teams']\n  })\n  async teamsList(\n    params: github.TeamsListParams\n  ): Promise<github.TeamsListResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListResponse>()\n  }\n\n  /**\n * To create a team, the authenticated user must be a member or owner of `{org}`. By default, organization members can create teams. Organization owners can limit team creation to organization owners. For more information, see \"[Setting team creation permissions](https://docs.github.com/articles/setting-team-creation-permissions-in-your-organization).\"\n\nWhen you create a new team, you automatically become a team maintainer without explicitly adding yourself to the optional array of `maintainers`. For more information, see \"[About teams](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/about-teams)\".\n */\n  @aiFunction({\n    name: 'github_teams_create',\n    description: `To create a team, the authenticated user must be a member or owner of \\`{org}\\`. By default, organization members can create teams. Organization owners can limit team creation to organization owners. For more information, see \"[Setting team creation permissions](https://docs.github.com/articles/setting-team-creation-permissions-in-your-organization).\"\n\nWhen you create a new team, you automatically become a team maintainer without explicitly adding yourself to the optional array of \\`maintainers\\`. For more information, see \"[About teams](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/about-teams)\".`,\n    inputSchema: github.TeamsCreateParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCreate(\n    params: github.TeamsCreateParams\n  ): Promise<github.TeamsCreateResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/teams`, {\n        json: pick(\n          params,\n          'name',\n          'description',\n          'maintainers',\n          'repo_names',\n          'privacy',\n          'notification_setting',\n          'permission',\n          'parent_team_id'\n        )\n      })\n      .json<github.TeamsCreateResponse>()\n  }\n\n  /**\n * Gets a team using the team's `slug`. To create the `slug`, GitHub replaces special characters in the `name` string, changes all words to lowercase, and replaces spaces with a `-` separator. For example, `\"My TEam Näme\"` would become `my-team-name`.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}`.\n */\n  @aiFunction({\n    name: 'github_teams_get_by_name',\n    description: `Gets a team using the team's \\`slug\\`. To create the \\`slug\\`, GitHub replaces special characters in the \\`name\\` string, changes all words to lowercase, and replaces spaces with a \\`-\\` separator. For example, \\`\"My TEam Näme\"\\` would become \\`my-team-name\\`.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}\\`.`,\n    inputSchema: github.TeamsGetByNameParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetByName(\n    params: github.TeamsGetByNameParams\n  ): Promise<github.TeamsGetByNameResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams/${params.team_slug}`, {})\n      .json<github.TeamsGetByNameResponse>()\n  }\n\n  /**\n * To delete a team, the authenticated user must be an organization owner or team maintainer.\n\nIf you are an organization owner, deleting a parent team will delete all of its child teams as well.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `DELETE /organizations/{org_id}/team/{team_id}`.\n */\n  @aiFunction({\n    name: 'github_teams_delete_in_org',\n    description: `To delete a team, the authenticated user must be an organization owner or team maintainer.\n\nIf you are an organization owner, deleting a parent team will delete all of its child teams as well.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`DELETE /organizations/{org_id}/team/{team_id}\\`.`,\n    inputSchema: github.TeamsDeleteInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsDeleteInOrg(\n    params: github.TeamsDeleteInOrgParams\n  ): Promise<github.TeamsDeleteInOrgResponse> {\n    return this.ky\n      .delete(`/orgs/${params.org}/teams/${params.team_slug}`, {})\n      .json<github.TeamsDeleteInOrgResponse>()\n  }\n\n  /**\n * To edit a team, the authenticated user must either be an organization owner or a team maintainer.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `PATCH /organizations/{org_id}/team/{team_id}`.\n */\n  @aiFunction({\n    name: 'github_teams_update_in_org',\n    description: `To edit a team, the authenticated user must either be an organization owner or a team maintainer.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`PATCH /organizations/{org_id}/team/{team_id}\\`.`,\n    inputSchema: github.TeamsUpdateInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsUpdateInOrg(\n    params: github.TeamsUpdateInOrgParams\n  ): Promise<github.TeamsUpdateInOrgResponse> {\n    return this.ky\n      .patch(`/orgs/${params.org}/teams/${params.team_slug}`, {\n        json: pick(\n          params,\n          'name',\n          'description',\n          'privacy',\n          'notification_setting',\n          'permission',\n          'parent_team_id'\n        )\n      })\n      .json<github.TeamsUpdateInOrgResponse>()\n  }\n\n  /**\n * List all discussions on a team's page.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/discussions`.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_list_discussions_in_org',\n    description: `List all discussions on a team's page.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/discussions\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsListDiscussionsInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListDiscussionsInOrg(\n    params: github.TeamsListDiscussionsInOrgParams\n  ): Promise<github.TeamsListDiscussionsInOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams/${params.team_slug}/discussions`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'direction', 'per_page', 'page', 'pinned')\n        )\n      })\n      .json<github.TeamsListDiscussionsInOrgResponse>()\n  }\n\n  /**\n * Creates a new discussion post on a team's page.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `POST /organizations/{org_id}/team/{team_id}/discussions`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_create_discussion_in_org',\n    description: `Creates a new discussion post on a team's page.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`POST /organizations/{org_id}/team/{team_id}/discussions\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsCreateDiscussionInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCreateDiscussionInOrg(\n    params: github.TeamsCreateDiscussionInOrgParams\n  ): Promise<github.TeamsCreateDiscussionInOrgResponse> {\n    return this.ky\n      .post(`/orgs/${params.org}/teams/${params.team_slug}/discussions`, {\n        json: pick(params, 'title', 'body', 'private')\n      })\n      .json<github.TeamsCreateDiscussionInOrgResponse>()\n  }\n\n  /**\n * Get a specific discussion on a team's page.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}`.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_get_discussion_in_org',\n    description: `Get a specific discussion on a team's page.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsGetDiscussionInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetDiscussionInOrg(\n    params: github.TeamsGetDiscussionInOrgParams\n  ): Promise<github.TeamsGetDiscussionInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}`,\n        {}\n      )\n      .json<github.TeamsGetDiscussionInOrgResponse>()\n  }\n\n  /**\n * Delete a discussion from a team's page.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `DELETE /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_delete_discussion_in_org',\n    description: `Delete a discussion from a team's page.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`DELETE /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsDeleteDiscussionInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsDeleteDiscussionInOrg(\n    params: github.TeamsDeleteDiscussionInOrgParams\n  ): Promise<github.TeamsDeleteDiscussionInOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}`,\n        {}\n      )\n      .json<github.TeamsDeleteDiscussionInOrgResponse>()\n  }\n\n  /**\n * Edits the title and body text of a discussion post. Only the parameters you provide are updated.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `PATCH /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_update_discussion_in_org',\n    description: `Edits the title and body text of a discussion post. Only the parameters you provide are updated.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`PATCH /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsUpdateDiscussionInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsUpdateDiscussionInOrg(\n    params: github.TeamsUpdateDiscussionInOrgParams\n  ): Promise<github.TeamsUpdateDiscussionInOrgResponse> {\n    return this.ky\n      .patch(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}`,\n        {\n          json: pick(params, 'title', 'body')\n        }\n      )\n      .json<github.TeamsUpdateDiscussionInOrgResponse>()\n  }\n\n  /**\n * List all comments on a team discussion.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments`.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_list_discussion_comments_in_org',\n    description: `List all comments on a team discussion.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsListDiscussionCommentsInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListDiscussionCommentsInOrg(\n    params: github.TeamsListDiscussionCommentsInOrgParams\n  ): Promise<github.TeamsListDiscussionCommentsInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'direction', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.TeamsListDiscussionCommentsInOrgResponse>()\n  }\n\n  /**\n * Creates a new comment on a team discussion.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `POST /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_create_discussion_comment_in_org',\n    description: `Creates a new comment on a team discussion.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`POST /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsCreateDiscussionCommentInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCreateDiscussionCommentInOrg(\n    params: github.TeamsCreateDiscussionCommentInOrgParams\n  ): Promise<github.TeamsCreateDiscussionCommentInOrgResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.TeamsCreateDiscussionCommentInOrgResponse>()\n  }\n\n  /**\n * Get a specific comment on a team discussion.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments/{comment_number}`.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_get_discussion_comment_in_org',\n    description: `Get a specific comment on a team discussion.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments/{comment_number}\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsGetDiscussionCommentInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetDiscussionCommentInOrg(\n    params: github.TeamsGetDiscussionCommentInOrgParams\n  ): Promise<github.TeamsGetDiscussionCommentInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments/${params.comment_number}`,\n        {}\n      )\n      .json<github.TeamsGetDiscussionCommentInOrgResponse>()\n  }\n\n  /**\n * Deletes a comment on a team discussion.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `DELETE /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments/{comment_number}`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_delete_discussion_comment_in_org',\n    description: `Deletes a comment on a team discussion.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`DELETE /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments/{comment_number}\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsDeleteDiscussionCommentInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsDeleteDiscussionCommentInOrg(\n    params: github.TeamsDeleteDiscussionCommentInOrgParams\n  ): Promise<github.TeamsDeleteDiscussionCommentInOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments/${params.comment_number}`,\n        {}\n      )\n      .json<github.TeamsDeleteDiscussionCommentInOrgResponse>()\n  }\n\n  /**\n * Edits the body text of a discussion comment.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `PATCH /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments/{comment_number}`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_update_discussion_comment_in_org',\n    description: `Edits the body text of a discussion comment.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`PATCH /organizations/{org_id}/team/{team_id}/discussions/{discussion_number}/comments/{comment_number}\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsUpdateDiscussionCommentInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsUpdateDiscussionCommentInOrg(\n    params: github.TeamsUpdateDiscussionCommentInOrgParams\n  ): Promise<github.TeamsUpdateDiscussionCommentInOrgResponse> {\n    return this.ky\n      .patch(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments/${params.comment_number}`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.TeamsUpdateDiscussionCommentInOrgResponse>()\n  }\n\n  /**\n * List the reactions to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions`.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_list_for_team_discussion_comment_in_org',\n    description: `List the reactions to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsListForTeamDiscussionCommentInOrgParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForTeamDiscussionCommentInOrg(\n    params: github.ReactionsListForTeamDiscussionCommentInOrgParams\n  ): Promise<github.ReactionsListForTeamDiscussionCommentInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments/${params.comment_number}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForTeamDiscussionCommentInOrgResponse>()\n  }\n\n  /**\n * Create a reaction to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nA response with an HTTP `200` status means that you already added the reaction type to this team discussion comment.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `POST /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_create_for_team_discussion_comment_in_org',\n    description: `Create a reaction to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nA response with an HTTP \\`200\\` status means that you already added the reaction type to this team discussion comment.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`POST /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ReactionsCreateForTeamDiscussionCommentInOrgParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForTeamDiscussionCommentInOrg(\n    params: github.ReactionsCreateForTeamDiscussionCommentInOrgParams\n  ): Promise<github.ReactionsCreateForTeamDiscussionCommentInOrgResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments/${params.comment_number}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForTeamDiscussionCommentInOrgResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> You can also specify a team or organization with `team_id` and `org_id` using the route `DELETE /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions/:reaction_id`.\n\nDelete a reaction to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_delete_for_team_discussion_comment',\n    description: `> [!NOTE]\n> You can also specify a team or organization with \\`team_id\\` and \\`org_id\\` using the route \\`DELETE /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions/:reaction_id\\`.\n\nDelete a reaction to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsDeleteForTeamDiscussionCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsDeleteForTeamDiscussionComment(\n    params: github.ReactionsDeleteForTeamDiscussionCommentParams\n  ): Promise<github.ReactionsDeleteForTeamDiscussionCommentResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/comments/${params.comment_number}/reactions/${params.reaction_id}`,\n        {}\n      )\n      .json<github.ReactionsDeleteForTeamDiscussionCommentResponse>()\n  }\n\n  /**\n * List the reactions to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions`.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_list_for_team_discussion_in_org',\n    description: `List the reactions to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsListForTeamDiscussionInOrgParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForTeamDiscussionInOrg(\n    params: github.ReactionsListForTeamDiscussionInOrgParams\n  ): Promise<github.ReactionsListForTeamDiscussionInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForTeamDiscussionInOrgResponse>()\n  }\n\n  /**\n * Create a reaction to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nA response with an HTTP `200` status means that you already added the reaction type to this team discussion.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `POST /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions`.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_create_for_team_discussion_in_org',\n    description: `Create a reaction to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nA response with an HTTP \\`200\\` status means that you already added the reaction type to this team discussion.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`POST /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsCreateForTeamDiscussionInOrgParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForTeamDiscussionInOrg(\n    params: github.ReactionsCreateForTeamDiscussionInOrgParams\n  ): Promise<github.ReactionsCreateForTeamDiscussionInOrgResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForTeamDiscussionInOrgResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> You can also specify a team or organization with `team_id` and `org_id` using the route `DELETE /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions/:reaction_id`.\n\nDelete a reaction to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_delete_for_team_discussion',\n    description: `> [!NOTE]\n> You can also specify a team or organization with \\`team_id\\` and \\`org_id\\` using the route \\`DELETE /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions/:reaction_id\\`.\n\nDelete a reaction to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsDeleteForTeamDiscussionParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsDeleteForTeamDiscussion(\n    params: github.ReactionsDeleteForTeamDiscussionParams\n  ): Promise<github.ReactionsDeleteForTeamDiscussionResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/teams/${params.team_slug}/discussions/${params.discussion_number}/reactions/${params.reaction_id}`,\n        {}\n      )\n      .json<github.ReactionsDeleteForTeamDiscussionResponse>()\n  }\n\n  /**\n * The return hash contains a `role` field which refers to the Organization Invitation role and will be one of the following values: `direct_member`, `admin`, `billing_manager`, `hiring_manager`, or `reinstate`. If the invitee is not a GitHub member, the `login` field in the return hash will be `null`.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/invitations`.\n */\n  @aiFunction({\n    name: 'github_teams_list_pending_invitations_in_org',\n    description: `The return hash contains a \\`role\\` field which refers to the Organization Invitation role and will be one of the following values: \\`direct_member\\`, \\`admin\\`, \\`billing_manager\\`, \\`hiring_manager\\`, or \\`reinstate\\`. If the invitee is not a GitHub member, the \\`login\\` field in the return hash will be \\`null\\`.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/invitations\\`.`,\n    inputSchema: github.TeamsListPendingInvitationsInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListPendingInvitationsInOrg(\n    params: github.TeamsListPendingInvitationsInOrgParams\n  ): Promise<github.TeamsListPendingInvitationsInOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams/${params.team_slug}/invitations`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListPendingInvitationsInOrgResponse>()\n  }\n\n  /**\n * Team members will include the members of child teams.\n\nTo list members in a team, the team must be visible to the authenticated user.\n */\n  @aiFunction({\n    name: 'github_teams_list_members_in_org',\n    description: `Team members will include the members of child teams.\n\nTo list members in a team, the team must be visible to the authenticated user.`,\n    inputSchema: github.TeamsListMembersInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListMembersInOrg(\n    params: github.TeamsListMembersInOrgParams\n  ): Promise<github.TeamsListMembersInOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams/${params.team_slug}/members`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'role', 'per_page', 'page')\n        )\n      })\n      .json<github.TeamsListMembersInOrgResponse>()\n  }\n\n  /**\n * Team members will include the members of child teams.\n\nTo get a user's membership with a team, the team must be visible to the authenticated user.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/memberships/{username}`.\n\n> [!NOTE]\n> The response contains the `state` of the membership and the member's `role`.\n\nThe `role` for organization owners is set to `maintainer`. For more information about `maintainer` roles, see [Create a team](https://docs.github.com/rest/teams/teams#create-a-team).\n */\n  @aiFunction({\n    name: 'github_teams_get_membership_for_user_in_org',\n    description: `Team members will include the members of child teams.\n\nTo get a user's membership with a team, the team must be visible to the authenticated user.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/memberships/{username}\\`.\n\n> [!NOTE]\n> The response contains the \\`state\\` of the membership and the member's \\`role\\`.\n\nThe \\`role\\` for organization owners is set to \\`maintainer\\`. For more information about \\`maintainer\\` roles, see [Create a team](https://docs.github.com/rest/teams/teams#create-a-team).`,\n    inputSchema: github.TeamsGetMembershipForUserInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetMembershipForUserInOrg(\n    params: github.TeamsGetMembershipForUserInOrgParams\n  ): Promise<github.TeamsGetMembershipForUserInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/memberships/${params.username}`,\n        {}\n      )\n      .json<github.TeamsGetMembershipForUserInOrgResponse>()\n  }\n\n  /**\n * Adds an organization member to a team. An authenticated organization owner or team maintainer can add organization members to a team.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\nAn organization owner can add someone who is not part of the team's organization to a team. When an organization owner adds someone to a team who is not an organization member, this endpoint will send an invitation to the person via email. This newly-created membership will be in the \"pending\" state until the person accepts the invitation, at which point the membership will transition to the \"active\" state and the user will be added as a member of the team.\n\nIf the user is already a member of the team, this endpoint will update the role of the team member's role. To update the membership of a team member, the authenticated user must be an organization owner or a team maintainer.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `PUT /organizations/{org_id}/team/{team_id}/memberships/{username}`.\n */\n  @aiFunction({\n    name: 'github_teams_add_or_update_membership_for_user_in_org',\n    description: `Adds an organization member to a team. An authenticated organization owner or team maintainer can add organization members to a team.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\nAn organization owner can add someone who is not part of the team's organization to a team. When an organization owner adds someone to a team who is not an organization member, this endpoint will send an invitation to the person via email. This newly-created membership will be in the \"pending\" state until the person accepts the invitation, at which point the membership will transition to the \"active\" state and the user will be added as a member of the team.\n\nIf the user is already a member of the team, this endpoint will update the role of the team member's role. To update the membership of a team member, the authenticated user must be an organization owner or a team maintainer.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`PUT /organizations/{org_id}/team/{team_id}/memberships/{username}\\`.`,\n    inputSchema: github.TeamsAddOrUpdateMembershipForUserInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsAddOrUpdateMembershipForUserInOrg(\n    params: github.TeamsAddOrUpdateMembershipForUserInOrgParams\n  ): Promise<github.TeamsAddOrUpdateMembershipForUserInOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/teams/${params.team_slug}/memberships/${params.username}`,\n        {\n          json: pick(params, 'role')\n        }\n      )\n      .json<github.TeamsAddOrUpdateMembershipForUserInOrgResponse>()\n  }\n\n  /**\n * To remove a membership between a user and a team, the authenticated user must have 'admin' permissions to the team or be an owner of the organization that the team is associated with. Removing team membership does not delete the user, it just removes their membership from the team.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `DELETE /organizations/{org_id}/team/{team_id}/memberships/{username}`.\n */\n  @aiFunction({\n    name: 'github_teams_remove_membership_for_user_in_org',\n    description: `To remove a membership between a user and a team, the authenticated user must have 'admin' permissions to the team or be an owner of the organization that the team is associated with. Removing team membership does not delete the user, it just removes their membership from the team.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`DELETE /organizations/{org_id}/team/{team_id}/memberships/{username}\\`.`,\n    inputSchema: github.TeamsRemoveMembershipForUserInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsRemoveMembershipForUserInOrg(\n    params: github.TeamsRemoveMembershipForUserInOrgParams\n  ): Promise<github.TeamsRemoveMembershipForUserInOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/teams/${params.team_slug}/memberships/${params.username}`,\n        {}\n      )\n      .json<github.TeamsRemoveMembershipForUserInOrgResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_list_projects_in_org',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsListProjectsInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListProjectsInOrg(\n    params: github.TeamsListProjectsInOrgParams\n  ): Promise<github.TeamsListProjectsInOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams/${params.team_slug}/projects`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListProjectsInOrgResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_check_permissions_for_project_in_org',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsCheckPermissionsForProjectInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCheckPermissionsForProjectInOrg(\n    params: github.TeamsCheckPermissionsForProjectInOrgParams\n  ): Promise<github.TeamsCheckPermissionsForProjectInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/projects/${params.project_id}`,\n        {}\n      )\n      .json<github.TeamsCheckPermissionsForProjectInOrgResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_add_or_update_project_permissions_in_org',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsAddOrUpdateProjectPermissionsInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsAddOrUpdateProjectPermissionsInOrg(\n    params: github.TeamsAddOrUpdateProjectPermissionsInOrgParams\n  ): Promise<github.TeamsAddOrUpdateProjectPermissionsInOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/teams/${params.team_slug}/projects/${params.project_id}`,\n        {\n          json: pick(params, 'permission')\n        }\n      )\n      .json<github.TeamsAddOrUpdateProjectPermissionsInOrgResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_remove_project_in_org',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsRemoveProjectInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsRemoveProjectInOrg(\n    params: github.TeamsRemoveProjectInOrgParams\n  ): Promise<github.TeamsRemoveProjectInOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/teams/${params.team_slug}/projects/${params.project_id}`,\n        {}\n      )\n      .json<github.TeamsRemoveProjectInOrgResponse>()\n  }\n\n  /**\n * Lists a team's repositories visible to the authenticated user.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/repos`.\n */\n  @aiFunction({\n    name: 'github_teams_list_repos_in_org',\n    description: `Lists a team's repositories visible to the authenticated user.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/repos\\`.`,\n    inputSchema: github.TeamsListReposInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListReposInOrg(\n    params: github.TeamsListReposInOrgParams\n  ): Promise<github.TeamsListReposInOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams/${params.team_slug}/repos`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListReposInOrgResponse>()\n  }\n\n  /**\n * Checks whether a team has `admin`, `push`, `maintain`, `triage`, or `pull` permission for a repository. Repositories inherited through a parent team will also be checked.\n\nYou can also get information about the specified repository, including what permissions the team grants on it, by passing the following custom [media type](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types/) via the `application/vnd.github.v3.repository+json` accept header.\n\nIf a team doesn't have permission for the repository, you will receive a `404 Not Found` response status.\n\nIf the repository is private, you must have at least `read` permission for that repository, and your token must have the `repo` or `admin:org` scope. Otherwise, you will receive a `404 Not Found` response status.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/repos/{owner}/{repo}`.\n */\n  @aiFunction({\n    name: 'github_teams_check_permissions_for_repo_in_org',\n    description: `Checks whether a team has \\`admin\\`, \\`push\\`, \\`maintain\\`, \\`triage\\`, or \\`pull\\` permission for a repository. Repositories inherited through a parent team will also be checked.\n\nYou can also get information about the specified repository, including what permissions the team grants on it, by passing the following custom [media type](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types/) via the \\`application/vnd.github.v3.repository+json\\` accept header.\n\nIf a team doesn't have permission for the repository, you will receive a \\`404 Not Found\\` response status.\n\nIf the repository is private, you must have at least \\`read\\` permission for that repository, and your token must have the \\`repo\\` or \\`admin:org\\` scope. Otherwise, you will receive a \\`404 Not Found\\` response status.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/repos/{owner}/{repo}\\`.`,\n    inputSchema: github.TeamsCheckPermissionsForRepoInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCheckPermissionsForRepoInOrg(\n    params: github.TeamsCheckPermissionsForRepoInOrgParams\n  ): Promise<github.TeamsCheckPermissionsForRepoInOrgResponse> {\n    return this.ky\n      .get(\n        `/orgs/${params.org}/teams/${params.team_slug}/repos/${params.owner}/${params.repo}`,\n        {}\n      )\n      .json<github.TeamsCheckPermissionsForRepoInOrgResponse>()\n  }\n\n  /**\n * To add a repository to a team or update the team's permission on a repository, the authenticated user must have admin access to the repository, and must be able to see the team. The repository must be owned by the organization, or a direct fork of a repository owned by the organization. You will get a `422 Unprocessable Entity` status if you attempt to add a repository to a team that is not owned by the organization. Note that, if you choose not to pass any parameters, you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `PUT /organizations/{org_id}/team/{team_id}/repos/{owner}/{repo}`.\n\nFor more information about the permission levels, see \"[Repository permission levels for an organization](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization#permission-levels-for-repositories-owned-by-an-organization)\".\n */\n  @aiFunction({\n    name: 'github_teams_add_or_update_repo_permissions_in_org',\n    description: `To add a repository to a team or update the team's permission on a repository, the authenticated user must have admin access to the repository, and must be able to see the team. The repository must be owned by the organization, or a direct fork of a repository owned by the organization. You will get a \\`422 Unprocessable Entity\\` status if you attempt to add a repository to a team that is not owned by the organization. Note that, if you choose not to pass any parameters, you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`PUT /organizations/{org_id}/team/{team_id}/repos/{owner}/{repo}\\`.\n\nFor more information about the permission levels, see \"[Repository permission levels for an organization](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization#permission-levels-for-repositories-owned-by-an-organization)\".`,\n    inputSchema: github.TeamsAddOrUpdateRepoPermissionsInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsAddOrUpdateRepoPermissionsInOrg(\n    params: github.TeamsAddOrUpdateRepoPermissionsInOrgParams\n  ): Promise<github.TeamsAddOrUpdateRepoPermissionsInOrgResponse> {\n    return this.ky\n      .put(\n        `/orgs/${params.org}/teams/${params.team_slug}/repos/${params.owner}/${params.repo}`,\n        {\n          json: pick(params, 'permission')\n        }\n      )\n      .json<github.TeamsAddOrUpdateRepoPermissionsInOrgResponse>()\n  }\n\n  /**\n * If the authenticated user is an organization owner or a team maintainer, they can remove any repositories from the team. To remove a repository from a team as an organization member, the authenticated user must have admin access to the repository and must be able to see the team. This does not delete the repository, it just removes it from the team.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `DELETE /organizations/{org_id}/team/{team_id}/repos/{owner}/{repo}`.\n */\n  @aiFunction({\n    name: 'github_teams_remove_repo_in_org',\n    description: `If the authenticated user is an organization owner or a team maintainer, they can remove any repositories from the team. To remove a repository from a team as an organization member, the authenticated user must have admin access to the repository and must be able to see the team. This does not delete the repository, it just removes it from the team.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`DELETE /organizations/{org_id}/team/{team_id}/repos/{owner}/{repo}\\`.`,\n    inputSchema: github.TeamsRemoveRepoInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsRemoveRepoInOrg(\n    params: github.TeamsRemoveRepoInOrgParams\n  ): Promise<github.TeamsRemoveRepoInOrgResponse> {\n    return this.ky\n      .delete(\n        `/orgs/${params.org}/teams/${params.team_slug}/repos/${params.owner}/${params.repo}`,\n        {}\n      )\n      .json<github.TeamsRemoveRepoInOrgResponse>()\n  }\n\n  /**\n * Lists the child teams of the team specified by `{team_slug}`.\n\n> [!NOTE]\n> You can also specify a team by `org_id` and `team_id` using the route `GET /organizations/{org_id}/team/{team_id}/teams`.\n */\n  @aiFunction({\n    name: 'github_teams_list_child_in_org',\n    description: `Lists the child teams of the team specified by \\`{team_slug}\\`.\n\n> [!NOTE]\n> You can also specify a team by \\`org_id\\` and \\`team_id\\` using the route \\`GET /organizations/{org_id}/team/{team_id}/teams\\`.`,\n    inputSchema: github.TeamsListChildInOrgParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListChildInOrg(\n    params: github.TeamsListChildInOrgParams\n  ): Promise<github.TeamsListChildInOrgResponse> {\n    return this.ky\n      .get(`/orgs/${params.org}/teams/${params.team_slug}/teams`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListChildInOrgResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** The ability to enable or disable a security feature for all eligible repositories in an organization is closing down. Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead. For more information, see the [changelog](https://github.blog/changelog/2024-07-22-deprecation-of-api-endpoint-to-enable-or-disable-a-security-feature-for-an-organization/).\n\nEnables or disables the specified security feature for all eligible repositories in an organization. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nThe authenticated user must be an organization owner or be member of a team with the security manager role to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:org`, `write:org`, or `repo` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_orgs_enable_or_disable_security_product_on_all_org_repos',\n    description: `> [!WARNING]\n> **Closing down notice:** The ability to enable or disable a security feature for all eligible repositories in an organization is closing down. Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead. For more information, see the [changelog](https://github.blog/changelog/2024-07-22-deprecation-of-api-endpoint-to-enable-or-disable-a-security-feature-for-an-organization/).\n\nEnables or disables the specified security feature for all eligible repositories in an organization. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nThe authenticated user must be an organization owner or be member of a team with the security manager role to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:org\\`, \\`write:org\\`, or \\`repo\\` scopes to use this endpoint.`,\n    inputSchema:\n      github.OrgsEnableOrDisableSecurityProductOnAllOrgReposParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsEnableOrDisableSecurityProductOnAllOrgRepos(\n    params: github.OrgsEnableOrDisableSecurityProductOnAllOrgReposParams\n  ): Promise<github.OrgsEnableOrDisableSecurityProductOnAllOrgReposResponse> {\n    return this.ky\n      .post(\n        `/orgs/${params.org}/${params.security_product}/${params.enablement}`,\n        {\n          json: pick(params, 'query_suite')\n        }\n      )\n      .json<github.OrgsEnableOrDisableSecurityProductOnAllOrgReposResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_get_card',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsGetCardParamsSchema,\n    tags: ['projects']\n  })\n  async projectsGetCard(\n    params: github.ProjectsGetCardParams\n  ): Promise<github.ProjectsGetCardResponse> {\n    return this.ky\n      .get(`/projects/columns/cards/${params.card_id}`)\n      .json<github.ProjectsGetCardResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_delete_card',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsDeleteCardParamsSchema,\n    tags: ['projects']\n  })\n  async projectsDeleteCard(\n    params: github.ProjectsDeleteCardParams\n  ): Promise<github.ProjectsDeleteCardResponse> {\n    return this.ky\n      .delete(`/projects/columns/cards/${params.card_id}`)\n      .json<github.ProjectsDeleteCardResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_update_card',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsUpdateCardParamsSchema,\n    tags: ['projects']\n  })\n  async projectsUpdateCard(\n    params: github.ProjectsUpdateCardParams\n  ): Promise<github.ProjectsUpdateCardResponse> {\n    return this.ky\n      .patch(`/projects/columns/cards/${params.card_id}`, {\n        json: pick(params, 'note', 'archived')\n      })\n      .json<github.ProjectsUpdateCardResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_move_card',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsMoveCardParamsSchema,\n    tags: ['projects']\n  })\n  async projectsMoveCard(\n    params: github.ProjectsMoveCardParams\n  ): Promise<github.ProjectsMoveCardResponse> {\n    return this.ky\n      .post(`/projects/columns/cards/${params.card_id}/moves`, {\n        json: pick(params, 'position', 'column_id')\n      })\n      .json<github.ProjectsMoveCardResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_get_column',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsGetColumnParamsSchema,\n    tags: ['projects']\n  })\n  async projectsGetColumn(\n    params: github.ProjectsGetColumnParams\n  ): Promise<github.ProjectsGetColumnResponse> {\n    return this.ky\n      .get(`/projects/columns/${params.column_id}`)\n      .json<github.ProjectsGetColumnResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_delete_column',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsDeleteColumnParamsSchema,\n    tags: ['projects']\n  })\n  async projectsDeleteColumn(\n    params: github.ProjectsDeleteColumnParams\n  ): Promise<github.ProjectsDeleteColumnResponse> {\n    return this.ky\n      .delete(`/projects/columns/${params.column_id}`)\n      .json<github.ProjectsDeleteColumnResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_update_column',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsUpdateColumnParamsSchema,\n    tags: ['projects']\n  })\n  async projectsUpdateColumn(\n    params: github.ProjectsUpdateColumnParams\n  ): Promise<github.ProjectsUpdateColumnResponse> {\n    return this.ky\n      .patch(`/projects/columns/${params.column_id}`, {\n        json: pick(params, 'name')\n      })\n      .json<github.ProjectsUpdateColumnResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_list_cards',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsListCardsParamsSchema,\n    tags: ['projects']\n  })\n  async projectsListCards(\n    params: github.ProjectsListCardsParams\n  ): Promise<github.ProjectsListCardsResponse> {\n    return this.ky\n      .get(`/projects/columns/${params.column_id}/cards`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'archived_state', 'per_page', 'page')\n        )\n      })\n      .json<github.ProjectsListCardsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_create_card',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ProjectsCreateCardParamsSchema as any,\n    tags: ['projects']\n  })\n  async projectsCreateCard(\n    params: github.ProjectsCreateCardParams\n  ): Promise<github.ProjectsCreateCardResponse> {\n    return this.ky\n      .post(`/projects/columns/${params.column_id}/cards`, {\n        json: params\n      })\n      .json<github.ProjectsCreateCardResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_move_column',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsMoveColumnParamsSchema,\n    tags: ['projects']\n  })\n  async projectsMoveColumn(\n    params: github.ProjectsMoveColumnParams\n  ): Promise<github.ProjectsMoveColumnResponse> {\n    return this.ky\n      .post(`/projects/columns/${params.column_id}/moves`, {\n        json: pick(params, 'position')\n      })\n      .json<github.ProjectsMoveColumnResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_get',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsGetParamsSchema,\n    tags: ['projects']\n  })\n  async projectsGet(\n    params: github.ProjectsGetParams\n  ): Promise<github.ProjectsGetResponse> {\n    return this.ky\n      .get(`/projects/${params.project_id}`)\n      .json<github.ProjectsGetResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_delete',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsDeleteParamsSchema,\n    tags: ['projects']\n  })\n  async projectsDelete(\n    params: github.ProjectsDeleteParams\n  ): Promise<github.ProjectsDeleteResponse> {\n    return this.ky\n      .delete(`/projects/${params.project_id}`)\n      .json<github.ProjectsDeleteResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_update',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsUpdateParamsSchema,\n    tags: ['projects']\n  })\n  async projectsUpdate(\n    params: github.ProjectsUpdateParams\n  ): Promise<github.ProjectsUpdateResponse> {\n    return this.ky\n      .patch(`/projects/${params.project_id}`, {\n        json: pick(\n          params,\n          'name',\n          'body',\n          'state',\n          'organization_permission',\n          'private'\n        )\n      })\n      .json<github.ProjectsUpdateResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_list_collaborators',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsListCollaboratorsParamsSchema,\n    tags: ['projects']\n  })\n  async projectsListCollaborators(\n    params: github.ProjectsListCollaboratorsParams\n  ): Promise<github.ProjectsListCollaboratorsResponse> {\n    return this.ky\n      .get(`/projects/${params.project_id}/collaborators`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'affiliation', 'per_page', 'page')\n        )\n      })\n      .json<github.ProjectsListCollaboratorsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_add_collaborator',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsAddCollaboratorParamsSchema,\n    tags: ['projects']\n  })\n  async projectsAddCollaborator(\n    params: github.ProjectsAddCollaboratorParams\n  ): Promise<github.ProjectsAddCollaboratorResponse> {\n    return this.ky\n      .put(\n        `/projects/${params.project_id}/collaborators/${params.username}`,\n        {\n          json: pick(params, 'permission')\n        }\n      )\n      .json<github.ProjectsAddCollaboratorResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_remove_collaborator',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsRemoveCollaboratorParamsSchema,\n    tags: ['projects']\n  })\n  async projectsRemoveCollaborator(\n    params: github.ProjectsRemoveCollaboratorParams\n  ): Promise<github.ProjectsRemoveCollaboratorResponse> {\n    return this.ky\n      .delete(\n        `/projects/${params.project_id}/collaborators/${params.username}`,\n        {}\n      )\n      .json<github.ProjectsRemoveCollaboratorResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_get_permission_for_user',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsGetPermissionForUserParamsSchema,\n    tags: ['projects']\n  })\n  async projectsGetPermissionForUser(\n    params: github.ProjectsGetPermissionForUserParams\n  ): Promise<github.ProjectsGetPermissionForUserResponse> {\n    return this.ky\n      .get(\n        `/projects/${params.project_id}/collaborators/${params.username}/permission`,\n        {}\n      )\n      .json<github.ProjectsGetPermissionForUserResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_list_columns',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsListColumnsParamsSchema,\n    tags: ['projects']\n  })\n  async projectsListColumns(\n    params: github.ProjectsListColumnsParams\n  ): Promise<github.ProjectsListColumnsResponse> {\n    return this.ky\n      .get(`/projects/${params.project_id}/columns`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ProjectsListColumnsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_create_column',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsCreateColumnParamsSchema,\n    tags: ['projects']\n  })\n  async projectsCreateColumn(\n    params: github.ProjectsCreateColumnParams\n  ): Promise<github.ProjectsCreateColumnResponse> {\n    return this.ky\n      .post(`/projects/${params.project_id}/columns`, {\n        json: pick(params, 'name')\n      })\n      .json<github.ProjectsCreateColumnResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> Accessing this endpoint does not count against your REST API rate limit.\n\nSome categories of endpoints have custom rate limits that are separate from the rate limit governing the other REST API endpoints. For this reason, the API response categorizes your rate limit. Under `resources`, you'll see objects relating to different categories:\n* The `core` object provides your rate limit status for all non-search-related resources in the REST API.\n* The `search` object provides your rate limit status for the REST API for searching (excluding code searches). For more information, see \"[Search](https://docs.github.com/rest/search/search).\"\n* The `code_search` object provides your rate limit status for the REST API for searching code. For more information, see \"[Search code](https://docs.github.com/rest/search/search#search-code).\"\n* The `graphql` object provides your rate limit status for the GraphQL API. For more information, see \"[Resource limitations](https://docs.github.com/graphql/overview/resource-limitations#rate-limit).\"\n* The `integration_manifest` object provides your rate limit status for the `POST /app-manifests/{code}/conversions` operation. For more information, see \"[Creating a GitHub App from a manifest](https://docs.github.com/apps/creating-github-apps/setting-up-a-github-app/creating-a-github-app-from-a-manifest#3-you-exchange-the-temporary-code-to-retrieve-the-app-configuration).\"\n* The `dependency_snapshots` object provides your rate limit status for submitting snapshots to the dependency graph. For more information, see \"[Dependency graph](https://docs.github.com/rest/dependency-graph).\"\n* The `code_scanning_upload` object provides your rate limit status for uploading SARIF results to code scanning. For more information, see \"[Uploading a SARIF file to GitHub](https://docs.github.com/code-security/code-scanning/integrating-with-code-scanning/uploading-a-sarif-file-to-github).\"\n* The `actions_runner_registration` object provides your rate limit status for registering self-hosted runners in GitHub Actions. For more information, see \"[Self-hosted runners](https://docs.github.com/rest/actions/self-hosted-runners).\"\n* The `source_import` object is no longer in use for any API endpoints, and it will be removed in the next API version. For more information about API versions, see \"[API Versions](https://docs.github.com/rest/about-the-rest-api/api-versions).\"\n\n> [!NOTE]\n> The `rate` object is closing down. If you're writing new API client code or updating existing code, you should use the `core` object instead of the `rate` object. The `core` object contains the same information that is present in the `rate` object.\n */\n  @aiFunction({\n    name: 'github_rate_limit_get',\n    description: `> [!NOTE]\n> Accessing this endpoint does not count against your REST API rate limit.\n\nSome categories of endpoints have custom rate limits that are separate from the rate limit governing the other REST API endpoints. For this reason, the API response categorizes your rate limit. Under \\`resources\\`, you'll see objects relating to different categories:\n* The \\`core\\` object provides your rate limit status for all non-search-related resources in the REST API.\n* The \\`search\\` object provides your rate limit status for the REST API for searching (excluding code searches). For more information, see \"[Search](https://docs.github.com/rest/search/search).\"\n* The \\`code_search\\` object provides your rate limit status for the REST API for searching code. For more information, see \"[Search code](https://docs.github.com/rest/search/search#search-code).\"\n* The \\`graphql\\` object provides your rate limit status for the GraphQL API. For more information, see \"[Resource limitations](https://docs.github.com/graphql/overview/resource-limitations#rate-limit).\"\n* The \\`integration_manifest\\` object provides your rate limit status for the \\`POST /app-manifests/{code}/conversions\\` operation. For more information, see \"[Creating a GitHub App from a manifest](https://docs.github.com/apps/creating-github-apps/setting-up-a-github-app/creating-a-github-app-from-a-manifest#3-you-exchange-the-temporary-code-to-retrieve-the-app-configuration).\"\n* The \\`dependency_snapshots\\` object provides your rate limit status for submitting snapshots to the dependency graph. For more information, see \"[Dependency graph](https://docs.github.com/rest/dependency-graph).\"\n* The \\`code_scanning_upload\\` object provides your rate limit status for uploading SARIF results to code scanning. For more information, see \"[Uploading a SARIF file to GitHub](https://docs.github.com/code-security/code-scanning/integrating-with-code-scanning/uploading-a-sarif-file-to-github).\"\n* The \\`actions_runner_registration\\` object provides your rate limit status for registering self-hosted runners in GitHub Actions. For more information, see \"[Self-hosted runners](https://docs.github.com/rest/actions/self-hosted-runners).\"\n* The \\`source_import\\` object is no longer in use for any API endpoints, and it will be removed in the next API version. For more information about API versions, see \"[API Versions](https://docs.github.com/rest/about-the-rest-api/api-versions).\"\n\n> [!NOTE]\n> The \\`rate\\` object is closing down. If you're writing new API client code or updating existing code, you should use the \\`core\\` object instead of the \\`rate\\` object. The \\`core\\` object contains the same information that is present in the \\`rate\\` object.`,\n    inputSchema: github.RateLimitGetParamsSchema,\n    tags: ['rate-limit']\n  })\n  async rateLimitGet(\n    _params: github.RateLimitGetParams\n  ): Promise<github.RateLimitGetResponse> {\n    return this.ky.get('/rate_limit').json<github.RateLimitGetResponse>()\n  }\n\n  /**\n * The `parent` and `source` objects are present when the repository is a fork. `parent` is the repository this repository was forked from, `source` is the ultimate source for the network.\n\n> [!NOTE]\n> In order to see the `security_and_analysis` block for a repository you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\".\n */\n  @aiFunction({\n    name: 'github_repos_get',\n    description: `The \\`parent\\` and \\`source\\` objects are present when the repository is a fork. \\`parent\\` is the repository this repository was forked from, \\`source\\` is the ultimate source for the network.\n\n> [!NOTE]\n> In order to see the \\`security_and_analysis\\` block for a repository you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\".`,\n    inputSchema: github.ReposGetParamsSchema,\n    tags: ['repos']\n  })\n  async reposGet(\n    params: github.ReposGetParams\n  ): Promise<github.ReposGetResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}`, {})\n      .json<github.ReposGetResponse>()\n  }\n\n  /**\n * Deleting a repository requires admin access.\n\nIf an organization owner has configured the organization to prevent members from deleting organization-owned\nrepositories, you will get a `403 Forbidden` response.\n\nOAuth app tokens and personal access tokens (classic) need the `delete_repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_delete',\n    description: `Deleting a repository requires admin access.\n\nIf an organization owner has configured the organization to prevent members from deleting organization-owned\nrepositories, you will get a \\`403 Forbidden\\` response.\n\nOAuth app tokens and personal access tokens (classic) need the \\`delete_repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposDeleteParamsSchema,\n    tags: ['repos']\n  })\n  async reposDelete(\n    params: github.ReposDeleteParams\n  ): Promise<github.ReposDeleteResponse> {\n    return this.ky\n      .delete(`/repos/${params.owner}/${params.repo}`, {})\n      .json<github.ReposDeleteResponse>()\n  }\n\n  /**\n   * **Note**: To edit a repository's topics, use the [Replace all repository topics](https://docs.github.com/rest/repos/repos#replace-all-repository-topics) endpoint.\n   */\n  @aiFunction({\n    name: 'github_repos_update',\n    description: `**Note**: To edit a repository's topics, use the [Replace all repository topics](https://docs.github.com/rest/repos/repos#replace-all-repository-topics) endpoint.`,\n    inputSchema: github.ReposUpdateParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdate(\n    params: github.ReposUpdateParams\n  ): Promise<github.ReposUpdateResponse> {\n    return this.ky\n      .patch(`/repos/${params.owner}/${params.repo}`, {\n        json: pick(\n          params,\n          'name',\n          'description',\n          'homepage',\n          'private',\n          'visibility',\n          'security_and_analysis',\n          'has_issues',\n          'has_projects',\n          'has_wiki',\n          'is_template',\n          'default_branch',\n          'allow_squash_merge',\n          'allow_merge_commit',\n          'allow_rebase_merge',\n          'allow_auto_merge',\n          'delete_branch_on_merge',\n          'allow_update_branch',\n          'use_squash_pr_title_as_default',\n          'squash_merge_commit_title',\n          'squash_merge_commit_message',\n          'merge_commit_title',\n          'merge_commit_message',\n          'archived',\n          'allow_forking',\n          'web_commit_signoff_required'\n        )\n      })\n      .json<github.ReposUpdateResponse>()\n  }\n\n  /**\n * Lists all artifacts for a repository.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_list_artifacts_for_repo',\n    description: `Lists all artifacts for a repository.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsListArtifactsForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListArtifactsForRepo(\n    params: github.ActionsListArtifactsForRepoParams\n  ): Promise<github.ActionsListArtifactsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/actions/artifacts`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'name')\n        )\n      })\n      .json<github.ActionsListArtifactsForRepoResponse>()\n  }\n\n  /**\n * Gets a specific artifact for a workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_artifact',\n    description: `Gets a specific artifact for a workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetArtifactParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetArtifact(\n    params: github.ActionsGetArtifactParams\n  ): Promise<github.ActionsGetArtifactResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/artifacts/${params.artifact_id}`,\n        {}\n      )\n      .json<github.ActionsGetArtifactResponse>()\n  }\n\n  /**\n * Deletes an artifact for a workflow run.\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_artifact',\n    description: `Deletes an artifact for a workflow run.\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteArtifactParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteArtifact(\n    params: github.ActionsDeleteArtifactParams\n  ): Promise<github.ActionsDeleteArtifactResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/artifacts/${params.artifact_id}`,\n        {}\n      )\n      .json<github.ActionsDeleteArtifactResponse>()\n  }\n\n  /**\n * Gets a redirect URL to download an archive for a repository. This URL expires after 1 minute. Look for `Location:` in\nthe response header to find the URL for the download. The `:archive_format` must be `zip`.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_download_artifact',\n    description: `Gets a redirect URL to download an archive for a repository. This URL expires after 1 minute. Look for \\`Location:\\` in\nthe response header to find the URL for the download. The \\`:archive_format\\` must be \\`zip\\`.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDownloadArtifactParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDownloadArtifact(\n    params: github.ActionsDownloadArtifactParams\n  ): Promise<github.ActionsDownloadArtifactResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/artifacts/${params.artifact_id}/${params.archive_format}`,\n        {}\n      )\n      .json<github.ActionsDownloadArtifactResponse>()\n  }\n\n  /**\n * Gets GitHub Actions cache usage for a repository.\nThe data fetched using this API is refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_actions_cache_usage',\n    description: `Gets GitHub Actions cache usage for a repository.\nThe data fetched using this API is refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetActionsCacheUsageParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetActionsCacheUsage(\n    params: github.ActionsGetActionsCacheUsageParams\n  ): Promise<github.ActionsGetActionsCacheUsageResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/cache/usage`,\n        {}\n      )\n      .json<github.ActionsGetActionsCacheUsageResponse>()\n  }\n\n  /**\n * Lists the GitHub Actions caches for a repository.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_actions_cache_list',\n    description: `Lists the GitHub Actions caches for a repository.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetActionsCacheListParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetActionsCacheList(\n    params: github.ActionsGetActionsCacheListParams\n  ): Promise<github.ActionsGetActionsCacheListResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/actions/caches`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'ref', 'key', 'sort', 'direction')\n        )\n      })\n      .json<github.ActionsGetActionsCacheListResponse>()\n  }\n\n  /**\n * Deletes one or more GitHub Actions caches for a repository, using a complete cache key. By default, all caches that match the provided key are deleted, but you can optionally provide a Git ref to restrict deletions to caches that match both the provided key and the Git ref.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_actions_cache_by_key',\n    description: `Deletes one or more GitHub Actions caches for a repository, using a complete cache key. By default, all caches that match the provided key are deleted, but you can optionally provide a Git ref to restrict deletions to caches that match both the provided key and the Git ref.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteActionsCacheByKeyParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteActionsCacheByKey(\n    params: github.ActionsDeleteActionsCacheByKeyParams\n  ): Promise<github.ActionsDeleteActionsCacheByKeyResponse> {\n    return this.ky\n      .delete(`/repos/${params.owner}/${params.repo}/actions/caches`, {\n        searchParams: sanitizeSearchParams(pick(params, 'key', 'ref'))\n      })\n      .json<github.ActionsDeleteActionsCacheByKeyResponse>()\n  }\n\n  /**\n * Deletes a GitHub Actions cache for a repository, using a cache ID.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_actions_cache_by_id',\n    description: `Deletes a GitHub Actions cache for a repository, using a cache ID.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteActionsCacheByIdParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteActionsCacheById(\n    params: github.ActionsDeleteActionsCacheByIdParams\n  ): Promise<github.ActionsDeleteActionsCacheByIdResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/caches/${params.cache_id}`,\n        {}\n      )\n      .json<github.ActionsDeleteActionsCacheByIdResponse>()\n  }\n\n  /**\n * Gets a specific job in a workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_job_for_workflow_run',\n    description: `Gets a specific job in a workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetJobForWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetJobForWorkflowRun(\n    params: github.ActionsGetJobForWorkflowRunParams\n  ): Promise<github.ActionsGetJobForWorkflowRunResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/jobs/${params.job_id}`,\n        {}\n      )\n      .json<github.ActionsGetJobForWorkflowRunResponse>()\n  }\n\n  /**\n * Gets a redirect URL to download a plain text file of logs for a workflow job. This link expires after 1 minute. Look\nfor `Location:` in the response header to find the URL for the download.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_download_job_logs_for_workflow_run',\n    description: `Gets a redirect URL to download a plain text file of logs for a workflow job. This link expires after 1 minute. Look\nfor \\`Location:\\` in the response header to find the URL for the download.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDownloadJobLogsForWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDownloadJobLogsForWorkflowRun(\n    params: github.ActionsDownloadJobLogsForWorkflowRunParams\n  ): Promise<github.ActionsDownloadJobLogsForWorkflowRunResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/jobs/${params.job_id}/logs`,\n        {}\n      )\n      .json<github.ActionsDownloadJobLogsForWorkflowRunResponse>()\n  }\n\n  /**\n * Re-run a job and its dependent jobs in a workflow run.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_re_run_job_for_workflow_run',\n    description: `Re-run a job and its dependent jobs in a workflow run.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsReRunJobForWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsReRunJobForWorkflowRun(\n    params: github.ActionsReRunJobForWorkflowRunParams\n  ): Promise<github.ActionsReRunJobForWorkflowRunResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/jobs/${params.job_id}/rerun`,\n        {\n          json: pick(params, 'enable_debug_logging')\n        }\n      )\n      .json<github.ActionsReRunJobForWorkflowRunResponse>()\n  }\n\n  /**\n * Gets the customization template for an OpenID Connect (OIDC) subject claim.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_custom_oidc_sub_claim_for_repo',\n    description: `Gets the customization template for an OpenID Connect (OIDC) subject claim.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetCustomOidcSubClaimForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetCustomOidcSubClaimForRepo(\n    params: github.ActionsGetCustomOidcSubClaimForRepoParams\n  ): Promise<github.ActionsGetCustomOidcSubClaimForRepoResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/oidc/customization/sub`,\n        {}\n      )\n      .json<github.ActionsGetCustomOidcSubClaimForRepoResponse>()\n  }\n\n  /**\n * Sets the customization template and `opt-in` or `opt-out` flag for an OpenID Connect (OIDC) subject claim for a repository.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_custom_oidc_sub_claim_for_repo',\n    description: `Sets the customization template and \\`opt-in\\` or \\`opt-out\\` flag for an OpenID Connect (OIDC) subject claim for a repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsSetCustomOidcSubClaimForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetCustomOidcSubClaimForRepo(\n    params: github.ActionsSetCustomOidcSubClaimForRepoParams\n  ): Promise<github.ActionsSetCustomOidcSubClaimForRepoResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/oidc/customization/sub`,\n        {\n          json: pick(params, 'use_default', 'include_claim_keys')\n        }\n      )\n      .json<github.ActionsSetCustomOidcSubClaimForRepoResponse>()\n  }\n\n  /**\n * Lists all organization secrets shared with a repository without revealing their encrypted\nvalues.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_repo_organization_secrets',\n    description: `Lists all organization secrets shared with a repository without revealing their encrypted\nvalues.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListRepoOrganizationSecretsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRepoOrganizationSecrets(\n    params: github.ActionsListRepoOrganizationSecretsParams\n  ): Promise<github.ActionsListRepoOrganizationSecretsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/organization-secrets`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ActionsListRepoOrganizationSecretsResponse>()\n  }\n\n  /**\n * Lists all organization variables shared with a repository.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_repo_organization_variables',\n    description: `Lists all organization variables shared with a repository.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListRepoOrganizationVariablesParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRepoOrganizationVariables(\n    params: github.ActionsListRepoOrganizationVariablesParams\n  ): Promise<github.ActionsListRepoOrganizationVariablesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/organization-variables`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ActionsListRepoOrganizationVariablesResponse>()\n  }\n\n  /**\n * Gets the GitHub Actions permissions policy for a repository, including whether GitHub Actions is enabled and the actions and reusable workflows allowed to run in the repository.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_github_actions_permissions_repository',\n    description: `Gets the GitHub Actions permissions policy for a repository, including whether GitHub Actions is enabled and the actions and reusable workflows allowed to run in the repository.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsGetGithubActionsPermissionsRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetGithubActionsPermissionsRepository(\n    params: github.ActionsGetGithubActionsPermissionsRepositoryParams\n  ): Promise<github.ActionsGetGithubActionsPermissionsRepositoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/permissions`,\n        {}\n      )\n      .json<github.ActionsGetGithubActionsPermissionsRepositoryResponse>()\n  }\n\n  /**\n * Sets the GitHub Actions permissions policy for enabling GitHub Actions and allowed actions and reusable workflows in the repository.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_github_actions_permissions_repository',\n    description: `Sets the GitHub Actions permissions policy for enabling GitHub Actions and allowed actions and reusable workflows in the repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsSetGithubActionsPermissionsRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetGithubActionsPermissionsRepository(\n    params: github.ActionsSetGithubActionsPermissionsRepositoryParams\n  ): Promise<github.ActionsSetGithubActionsPermissionsRepositoryResponse> {\n    return this.ky\n      .put(`/repos/${params.owner}/${params.repo}/actions/permissions`, {\n        json: pick(params, 'enabled', 'allowed_actions')\n      })\n      .json<github.ActionsSetGithubActionsPermissionsRepositoryResponse>()\n  }\n\n  /**\n * Gets the level of access that workflows outside of the repository have to actions and reusable workflows in the repository.\nThis endpoint only applies to private repositories.\nFor more information, see \"[Allowing access to components in a private repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_workflow_access_to_repository',\n    description: `Gets the level of access that workflows outside of the repository have to actions and reusable workflows in the repository.\nThis endpoint only applies to private repositories.\nFor more information, see \"[Allowing access to components in a private repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetWorkflowAccessToRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetWorkflowAccessToRepository(\n    params: github.ActionsGetWorkflowAccessToRepositoryParams\n  ): Promise<github.ActionsGetWorkflowAccessToRepositoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/permissions/access`,\n        {}\n      )\n      .json<github.ActionsGetWorkflowAccessToRepositoryResponse>()\n  }\n\n  /**\n * Sets the level of access that workflows outside of the repository have to actions and reusable workflows in the repository.\nThis endpoint only applies to private repositories.\nFor more information, see \"[Allowing access to components in a private repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository)\".\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_workflow_access_to_repository',\n    description: `Sets the level of access that workflows outside of the repository have to actions and reusable workflows in the repository.\nThis endpoint only applies to private repositories.\nFor more information, see \"[Allowing access to components in a private repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository)\".\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsSetWorkflowAccessToRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetWorkflowAccessToRepository(\n    params: github.ActionsSetWorkflowAccessToRepositoryParams\n  ): Promise<github.ActionsSetWorkflowAccessToRepositoryResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/permissions/access`,\n        {\n          json: pick(params, 'access_level')\n        }\n      )\n      .json<github.ActionsSetWorkflowAccessToRepositoryResponse>()\n  }\n\n  /**\n * Gets the settings for selected actions and reusable workflows that are allowed in a repository. To use this endpoint, the repository policy for `allowed_actions` must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for a repository](#set-github-actions-permissions-for-a-repository).\"\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_allowed_actions_repository',\n    description: `Gets the settings for selected actions and reusable workflows that are allowed in a repository. To use this endpoint, the repository policy for \\`allowed_actions\\` must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for a repository](#set-github-actions-permissions-for-a-repository).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetAllowedActionsRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetAllowedActionsRepository(\n    params: github.ActionsGetAllowedActionsRepositoryParams\n  ): Promise<github.ActionsGetAllowedActionsRepositoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/permissions/selected-actions`,\n        {}\n      )\n      .json<github.ActionsGetAllowedActionsRepositoryResponse>()\n  }\n\n  /**\n * Sets the actions and reusable workflows that are allowed in a repository. To use this endpoint, the repository permission policy for `allowed_actions` must be configured to `selected`. For more information, see \"[Set GitHub Actions permissions for a repository](#set-github-actions-permissions-for-a-repository).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_allowed_actions_repository',\n    description: `Sets the actions and reusable workflows that are allowed in a repository. To use this endpoint, the repository permission policy for \\`allowed_actions\\` must be configured to \\`selected\\`. For more information, see \"[Set GitHub Actions permissions for a repository](#set-github-actions-permissions-for-a-repository).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsSetAllowedActionsRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetAllowedActionsRepository(\n    params: github.ActionsSetAllowedActionsRepositoryParams\n  ): Promise<github.ActionsSetAllowedActionsRepositoryResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/permissions/selected-actions`,\n        {\n          json: pick(\n            params,\n            'github_owned_allowed',\n            'verified_allowed',\n            'patterns_allowed'\n          )\n        }\n      )\n      .json<github.ActionsSetAllowedActionsRepositoryResponse>()\n  }\n\n  /**\n * Gets the default workflow permissions granted to the `GITHUB_TOKEN` when running workflows in a repository,\nas well as if GitHub Actions can submit approving pull request reviews.\nFor more information, see \"[Setting the permissions of the GITHUB_TOKEN for your repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#setting-the-permissions-of-the-github_token-for-your-repository).\"\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_github_actions_default_workflow_permissions_repository',\n    description: `Gets the default workflow permissions granted to the \\`GITHUB_TOKEN\\` when running workflows in a repository,\nas well as if GitHub Actions can submit approving pull request reviews.\nFor more information, see \"[Setting the permissions of the GITHUB_TOKEN for your repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#setting-the-permissions-of-the-github_token-for-your-repository).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetGithubActionsDefaultWorkflowPermissionsRepository(\n    params: github.ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryParams\n  ): Promise<github.ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/permissions/workflow`,\n        {}\n      )\n      .json<github.ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryResponse>()\n  }\n\n  /**\n * Sets the default workflow permissions granted to the `GITHUB_TOKEN` when running workflows in a repository, and sets if GitHub Actions\ncan submit approving pull request reviews.\nFor more information, see \"[Setting the permissions of the GITHUB_TOKEN for your repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#setting-the-permissions-of-the-github_token-for-your-repository).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_github_actions_default_workflow_permissions_repository',\n    description: `Sets the default workflow permissions granted to the \\`GITHUB_TOKEN\\` when running workflows in a repository, and sets if GitHub Actions\ncan submit approving pull request reviews.\nFor more information, see \"[Setting the permissions of the GITHUB_TOKEN for your repository](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#setting-the-permissions-of-the-github_token-for-your-repository).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetGithubActionsDefaultWorkflowPermissionsRepository(\n    params: github.ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryParams\n  ): Promise<github.ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/permissions/workflow`,\n        {\n          json: pick(\n            params,\n            'default_workflow_permissions',\n            'can_approve_pull_request_reviews'\n          )\n        }\n      )\n      .json<github.ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryResponse>()\n  }\n\n  /**\n * Lists all self-hosted runners configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_self_hosted_runners_for_repo',\n    description: `Lists all self-hosted runners configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListSelfHostedRunnersForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListSelfHostedRunnersForRepo(\n    params: github.ActionsListSelfHostedRunnersForRepoParams\n  ): Promise<github.ActionsListSelfHostedRunnersForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/actions/runners`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'name', 'per_page', 'page')\n        )\n      })\n      .json<github.ActionsListSelfHostedRunnersForRepoResponse>()\n  }\n\n  /**\n * Lists binaries for the runner application that you can download and run.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_runner_applications_for_repo',\n    description: `Lists binaries for the runner application that you can download and run.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListRunnerApplicationsForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRunnerApplicationsForRepo(\n    params: github.ActionsListRunnerApplicationsForRepoParams\n  ): Promise<github.ActionsListRunnerApplicationsForRepoResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runners/downloads`,\n        {}\n      )\n      .json<github.ActionsListRunnerApplicationsForRepoResponse>()\n  }\n\n  /**\n * Generates a configuration that can be passed to the runner application at startup.\n\nThe authenticated user must have admin access to the repository.\n\nOAuth tokens and personal access tokens (classic) need the`repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_generate_runner_jitconfig_for_repo',\n    description: `Generates a configuration that can be passed to the runner application at startup.\n\nThe authenticated user must have admin access to the repository.\n\nOAuth tokens and personal access tokens (classic) need the\\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGenerateRunnerJitconfigForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGenerateRunnerJitconfigForRepo(\n    params: github.ActionsGenerateRunnerJitconfigForRepoParams\n  ): Promise<github.ActionsGenerateRunnerJitconfigForRepoResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runners/generate-jitconfig`,\n        {\n          json: pick(params, 'name', 'runner_group_id', 'labels', 'work_folder')\n        }\n      )\n      .json<github.ActionsGenerateRunnerJitconfigForRepoResponse>()\n  }\n\n  /**\n * Returns a token that you can pass to the `config` script. The token expires after one hour.\n\nFor example, you can replace `TOKEN` in the following example with the registration token provided by this endpoint to configure your self-hosted runner:\n\n```\n./config.sh --url https://github.com/octo-org --token TOKEN\n```\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_registration_token_for_repo',\n    description: `Returns a token that you can pass to the \\`config\\` script. The token expires after one hour.\n\nFor example, you can replace \\`TOKEN\\` in the following example with the registration token provided by this endpoint to configure your self-hosted runner:\n\n\\`\\`\\`\n./config.sh --url https://github.com/octo-org --token TOKEN\n\\`\\`\\`\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateRegistrationTokenForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateRegistrationTokenForRepo(\n    params: github.ActionsCreateRegistrationTokenForRepoParams\n  ): Promise<github.ActionsCreateRegistrationTokenForRepoResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runners/registration-token`,\n        {}\n      )\n      .json<github.ActionsCreateRegistrationTokenForRepoResponse>()\n  }\n\n  /**\n * Returns a token that you can pass to the `config` script to remove a self-hosted runner from an repository. The token expires after one hour.\n\nFor example, you can replace `TOKEN` in the following example with the registration token provided by this endpoint to remove your self-hosted runner from an organization:\n\n```\n./config.sh remove --token TOKEN\n```\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_remove_token_for_repo',\n    description: `Returns a token that you can pass to the \\`config\\` script to remove a self-hosted runner from an repository. The token expires after one hour.\n\nFor example, you can replace \\`TOKEN\\` in the following example with the registration token provided by this endpoint to remove your self-hosted runner from an organization:\n\n\\`\\`\\`\n./config.sh remove --token TOKEN\n\\`\\`\\`\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateRemoveTokenForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateRemoveTokenForRepo(\n    params: github.ActionsCreateRemoveTokenForRepoParams\n  ): Promise<github.ActionsCreateRemoveTokenForRepoResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runners/remove-token`,\n        {}\n      )\n      .json<github.ActionsCreateRemoveTokenForRepoResponse>()\n  }\n\n  /**\n * Gets a specific self-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_self_hosted_runner_for_repo',\n    description: `Gets a specific self-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetSelfHostedRunnerForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetSelfHostedRunnerForRepo(\n    params: github.ActionsGetSelfHostedRunnerForRepoParams\n  ): Promise<github.ActionsGetSelfHostedRunnerForRepoResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runners/${params.runner_id}`,\n        {}\n      )\n      .json<github.ActionsGetSelfHostedRunnerForRepoResponse>()\n  }\n\n  /**\n * Forces the removal of a self-hosted runner from a repository. You can use this endpoint to completely remove the runner when the machine you were using no longer exists.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_self_hosted_runner_from_repo',\n    description: `Forces the removal of a self-hosted runner from a repository. You can use this endpoint to completely remove the runner when the machine you were using no longer exists.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteSelfHostedRunnerFromRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteSelfHostedRunnerFromRepo(\n    params: github.ActionsDeleteSelfHostedRunnerFromRepoParams\n  ): Promise<github.ActionsDeleteSelfHostedRunnerFromRepoResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/runners/${params.runner_id}`,\n        {}\n      )\n      .json<github.ActionsDeleteSelfHostedRunnerFromRepoResponse>()\n  }\n\n  /**\n * Lists all labels for a self-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_labels_for_self_hosted_runner_for_repo',\n    description: `Lists all labels for a self-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListLabelsForSelfHostedRunnerForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListLabelsForSelfHostedRunnerForRepo(\n    params: github.ActionsListLabelsForSelfHostedRunnerForRepoParams\n  ): Promise<github.ActionsListLabelsForSelfHostedRunnerForRepoResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runners/${params.runner_id}/labels`,\n        {}\n      )\n      .json<github.ActionsListLabelsForSelfHostedRunnerForRepoResponse>()\n  }\n\n  /**\n * Adds custom labels to a self-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_add_custom_labels_to_self_hosted_runner_for_repo',\n    description: `Adds custom labels to a self-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the organization to use this endpoint.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsAddCustomLabelsToSelfHostedRunnerForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsAddCustomLabelsToSelfHostedRunnerForRepo(\n    params: github.ActionsAddCustomLabelsToSelfHostedRunnerForRepoParams\n  ): Promise<github.ActionsAddCustomLabelsToSelfHostedRunnerForRepoResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runners/${params.runner_id}/labels`,\n        {\n          json: pick(params, 'labels')\n        }\n      )\n      .json<github.ActionsAddCustomLabelsToSelfHostedRunnerForRepoResponse>()\n  }\n\n  /**\n * Remove all previous custom labels and set the new custom labels for a specific\nself-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_set_custom_labels_for_self_hosted_runner_for_repo',\n    description: `Remove all previous custom labels and set the new custom labels for a specific\nself-hosted runner configured in a repository.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsSetCustomLabelsForSelfHostedRunnerForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsSetCustomLabelsForSelfHostedRunnerForRepo(\n    params: github.ActionsSetCustomLabelsForSelfHostedRunnerForRepoParams\n  ): Promise<github.ActionsSetCustomLabelsForSelfHostedRunnerForRepoResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/runners/${params.runner_id}/labels`,\n        {\n          json: pick(params, 'labels')\n        }\n      )\n      .json<github.ActionsSetCustomLabelsForSelfHostedRunnerForRepoResponse>()\n  }\n\n  /**\n * Remove all custom labels from a self-hosted runner configured in a\nrepository. Returns the remaining read-only labels from the runner.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_remove_all_custom_labels_from_self_hosted_runner_for_repo',\n    description: `Remove all custom labels from a self-hosted runner configured in a\nrepository. Returns the remaining read-only labels from the runner.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepo(\n    params: github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoParams\n  ): Promise<github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/runners/${params.runner_id}/labels`,\n        {}\n      )\n      .json<github.ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoResponse>()\n  }\n\n  /**\n * Remove a custom label from a self-hosted runner configured\nin a repository. Returns the remaining labels from the runner.\n\nThis endpoint returns a `404 Not Found` status if the custom label is not\npresent on the runner.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_remove_custom_label_from_self_hosted_runner_for_repo',\n    description: `Remove a custom label from a self-hosted runner configured\nin a repository. Returns the remaining labels from the runner.\n\nThis endpoint returns a \\`404 Not Found\\` status if the custom label is not\npresent on the runner.\n\nAuthenticated users must have admin access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsRemoveCustomLabelFromSelfHostedRunnerForRepo(\n    params: github.ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoParams\n  ): Promise<github.ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/runners/${params.runner_id}/labels/${params.name}`,\n        {}\n      )\n      .json<github.ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoResponse>()\n  }\n\n  /**\n * Lists all workflow runs for a repository. You can use parameters to narrow the list of results. For more information about using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n\nThis endpoint will return up to 1,000 results for each search when using the following parameters: `actor`, `branch`, `check_suite_id`, `created`, `event`, `head_sha`, `status`.\n */\n  @aiFunction({\n    name: 'github_actions_list_workflow_runs_for_repo',\n    description: `Lists all workflow runs for a repository. You can use parameters to narrow the list of results. For more information about using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.\n\nThis endpoint will return up to 1,000 results for each search when using the following parameters: \\`actor\\`, \\`branch\\`, \\`check_suite_id\\`, \\`created\\`, \\`event\\`, \\`head_sha\\`, \\`status\\`.`,\n    inputSchema: github.ActionsListWorkflowRunsForRepoParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListWorkflowRunsForRepo(\n    params: github.ActionsListWorkflowRunsForRepoParams\n  ): Promise<github.ActionsListWorkflowRunsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/actions/runs`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'actor',\n            'branch',\n            'event',\n            'status',\n            'per_page',\n            'page',\n            'created',\n            'exclude_pull_requests',\n            'check_suite_id',\n            'head_sha'\n          )\n        )\n      })\n      .json<github.ActionsListWorkflowRunsForRepoResponse>()\n  }\n\n  /**\n * Gets a specific workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_get_workflow_run',\n    description: `Gets a specific workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsGetWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetWorkflowRun(\n    params: github.ActionsGetWorkflowRunParams\n  ): Promise<github.ActionsGetWorkflowRunResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'exclude_pull_requests')\n          )\n        }\n      )\n      .json<github.ActionsGetWorkflowRunResponse>()\n  }\n\n  /**\n * Deletes a specific workflow run.\n\nAnyone with write access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_workflow_run',\n    description: `Deletes a specific workflow run.\n\nAnyone with write access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteWorkflowRun(\n    params: github.ActionsDeleteWorkflowRunParams\n  ): Promise<github.ActionsDeleteWorkflowRunResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}`,\n        {}\n      )\n      .json<github.ActionsDeleteWorkflowRunResponse>()\n  }\n\n  /**\n * Anyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_get_reviews_for_run',\n    description: `Anyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsGetReviewsForRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetReviewsForRun(\n    params: github.ActionsGetReviewsForRunParams\n  ): Promise<github.ActionsGetReviewsForRunResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/approvals`,\n        {}\n      )\n      .json<github.ActionsGetReviewsForRunResponse>()\n  }\n\n  /**\n * Approves a workflow run for a pull request from a public fork of a first time contributor. For more information, see [\"Approving workflow runs from public forks](https://docs.github.com/actions/managing-workflow-runs/approving-workflow-runs-from-public-forks).\"\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_approve_workflow_run',\n    description: `Approves a workflow run for a pull request from a public fork of a first time contributor. For more information, see [\"Approving workflow runs from public forks](https://docs.github.com/actions/managing-workflow-runs/approving-workflow-runs-from-public-forks).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsApproveWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsApproveWorkflowRun(\n    params: github.ActionsApproveWorkflowRunParams\n  ): Promise<github.ActionsApproveWorkflowRunResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/approve`,\n        {}\n      )\n      .json<github.ActionsApproveWorkflowRunResponse>()\n  }\n\n  /**\n * Lists artifacts for a workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_list_workflow_run_artifacts',\n    description: `Lists artifacts for a workflow run.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsListWorkflowRunArtifactsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListWorkflowRunArtifacts(\n    params: github.ActionsListWorkflowRunArtifactsParams\n  ): Promise<github.ActionsListWorkflowRunArtifactsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/artifacts`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'per_page', 'page', 'name')\n          )\n        }\n      )\n      .json<github.ActionsListWorkflowRunArtifactsResponse>()\n  }\n\n  /**\n * Gets a specific workflow run attempt.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_get_workflow_run_attempt',\n    description: `Gets a specific workflow run attempt.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsGetWorkflowRunAttemptParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetWorkflowRunAttempt(\n    params: github.ActionsGetWorkflowRunAttemptParams\n  ): Promise<github.ActionsGetWorkflowRunAttemptResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/attempts/${params.attempt_number}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'exclude_pull_requests')\n          )\n        }\n      )\n      .json<github.ActionsGetWorkflowRunAttemptResponse>()\n  }\n\n  /**\n * Lists jobs for a specific workflow run attempt. You can use parameters to narrow the list of results. For more information\nabout using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint  with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_list_jobs_for_workflow_run_attempt',\n    description: `Lists jobs for a specific workflow run attempt. You can use parameters to narrow the list of results. For more information\nabout using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint  with a private repository.`,\n    inputSchema: github.ActionsListJobsForWorkflowRunAttemptParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListJobsForWorkflowRunAttempt(\n    params: github.ActionsListJobsForWorkflowRunAttemptParams\n  ): Promise<github.ActionsListJobsForWorkflowRunAttemptResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/attempts/${params.attempt_number}/jobs`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ActionsListJobsForWorkflowRunAttemptResponse>()\n  }\n\n  /**\n * Gets a redirect URL to download an archive of log files for a specific workflow run attempt. This link expires after\n1 minute. Look for `Location:` in the response header to find the URL for the download.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_download_workflow_run_attempt_logs',\n    description: `Gets a redirect URL to download an archive of log files for a specific workflow run attempt. This link expires after\n1 minute. Look for \\`Location:\\` in the response header to find the URL for the download.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDownloadWorkflowRunAttemptLogsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDownloadWorkflowRunAttemptLogs(\n    params: github.ActionsDownloadWorkflowRunAttemptLogsParams\n  ): Promise<github.ActionsDownloadWorkflowRunAttemptLogsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/attempts/${params.attempt_number}/logs`,\n        {}\n      )\n      .json<github.ActionsDownloadWorkflowRunAttemptLogsResponse>()\n  }\n\n  /**\n * Cancels a workflow run using its `id`.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_cancel_workflow_run',\n    description: `Cancels a workflow run using its \\`id\\`.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCancelWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCancelWorkflowRun(\n    params: github.ActionsCancelWorkflowRunParams\n  ): Promise<github.ActionsCancelWorkflowRunResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/cancel`,\n        {}\n      )\n      .json<github.ActionsCancelWorkflowRunResponse>()\n  }\n\n  /**\n * Approve or reject custom deployment protection rules provided by a GitHub App for a workflow run. For more information, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\n> [!NOTE]\n> GitHub Apps can only review their own custom deployment protection rules. To approve or reject pending deployments that are waiting for review from a specific person or team, see [`POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments`](/rest/actions/workflow-runs#review-pending-deployments-for-a-workflow-run).\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_review_custom_gates_for_run',\n    description: `Approve or reject custom deployment protection rules provided by a GitHub App for a workflow run. For more information, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\n> [!NOTE]\n> GitHub Apps can only review their own custom deployment protection rules. To approve or reject pending deployments that are waiting for review from a specific person or team, see [\\`POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\\`](/rest/actions/workflow-runs#review-pending-deployments-for-a-workflow-run).\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ActionsReviewCustomGatesForRunParamsSchema as any,\n    tags: ['actions']\n  })\n  async actionsReviewCustomGatesForRun(\n    params: github.ActionsReviewCustomGatesForRunParams\n  ): Promise<github.ActionsReviewCustomGatesForRunResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/deployment_protection_rule`,\n        {\n          json: params\n        }\n      )\n      .json<github.ActionsReviewCustomGatesForRunResponse>()\n  }\n\n  /**\n * Cancels a workflow run and bypasses conditions that would otherwise cause a workflow execution to continue, such as an `always()` condition on a job.\nYou should only use this endpoint to cancel a workflow run when the workflow run is not responding to [`POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel`](/rest/actions/workflow-runs#cancel-a-workflow-run).\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_force_cancel_workflow_run',\n    description: `Cancels a workflow run and bypasses conditions that would otherwise cause a workflow execution to continue, such as an \\`always()\\` condition on a job.\nYou should only use this endpoint to cancel a workflow run when the workflow run is not responding to [\\`POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel\\`](/rest/actions/workflow-runs#cancel-a-workflow-run).\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsForceCancelWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsForceCancelWorkflowRun(\n    params: github.ActionsForceCancelWorkflowRunParams\n  ): Promise<github.ActionsForceCancelWorkflowRunResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/force-cancel`,\n        {}\n      )\n      .json<github.ActionsForceCancelWorkflowRunResponse>()\n  }\n\n  /**\n * Lists jobs for a workflow run. You can use parameters to narrow the list of results. For more information\nabout using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_list_jobs_for_workflow_run',\n    description: `Lists jobs for a workflow run. You can use parameters to narrow the list of results. For more information\nabout using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsListJobsForWorkflowRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListJobsForWorkflowRun(\n    params: github.ActionsListJobsForWorkflowRunParams\n  ): Promise<github.ActionsListJobsForWorkflowRunResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/jobs`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'filter', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ActionsListJobsForWorkflowRunResponse>()\n  }\n\n  /**\n * Gets a redirect URL to download an archive of log files for a workflow run. This link expires after 1 minute. Look for\n`Location:` in the response header to find the URL for the download.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_download_workflow_run_logs',\n    description: `Gets a redirect URL to download an archive of log files for a workflow run. This link expires after 1 minute. Look for\n\\`Location:\\` in the response header to find the URL for the download.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDownloadWorkflowRunLogsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDownloadWorkflowRunLogs(\n    params: github.ActionsDownloadWorkflowRunLogsParams\n  ): Promise<github.ActionsDownloadWorkflowRunLogsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/logs`,\n        {}\n      )\n      .json<github.ActionsDownloadWorkflowRunLogsResponse>()\n  }\n\n  /**\n * Deletes all logs for a workflow run.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_workflow_run_logs',\n    description: `Deletes all logs for a workflow run.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteWorkflowRunLogsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteWorkflowRunLogs(\n    params: github.ActionsDeleteWorkflowRunLogsParams\n  ): Promise<github.ActionsDeleteWorkflowRunLogsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/logs`,\n        {}\n      )\n      .json<github.ActionsDeleteWorkflowRunLogsResponse>()\n  }\n\n  /**\n * Get all deployment environments for a workflow run that are waiting for protection rules to pass.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_pending_deployments_for_run',\n    description: `Get all deployment environments for a workflow run that are waiting for protection rules to pass.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetPendingDeploymentsForRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetPendingDeploymentsForRun(\n    params: github.ActionsGetPendingDeploymentsForRunParams\n  ): Promise<github.ActionsGetPendingDeploymentsForRunResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/pending_deployments`,\n        {}\n      )\n      .json<github.ActionsGetPendingDeploymentsForRunResponse>()\n  }\n\n  /**\n * Approve or reject pending deployments that are waiting on approval by a required reviewer.\n\nRequired reviewers with read access to the repository contents and deployments can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_review_pending_deployments_for_run',\n    description: `Approve or reject pending deployments that are waiting on approval by a required reviewer.\n\nRequired reviewers with read access to the repository contents and deployments can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsReviewPendingDeploymentsForRunParamsSchema,\n    tags: ['actions']\n  })\n  async actionsReviewPendingDeploymentsForRun(\n    params: github.ActionsReviewPendingDeploymentsForRunParams\n  ): Promise<github.ActionsReviewPendingDeploymentsForRunResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/pending_deployments`,\n        {\n          json: pick(params, 'environment_ids', 'state', 'comment')\n        }\n      )\n      .json<github.ActionsReviewPendingDeploymentsForRunResponse>()\n  }\n\n  /**\n * Re-runs your workflow run using its `id`.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_re_run_workflow',\n    description: `Re-runs your workflow run using its \\`id\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsReRunWorkflowParamsSchema,\n    tags: ['actions']\n  })\n  async actionsReRunWorkflow(\n    params: github.ActionsReRunWorkflowParams\n  ): Promise<github.ActionsReRunWorkflowResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/rerun`,\n        {\n          json: pick(params, 'enable_debug_logging')\n        }\n      )\n      .json<github.ActionsReRunWorkflowResponse>()\n  }\n\n  /**\n * Re-run all of the failed jobs and their dependent jobs in a workflow run using the `id` of the workflow run.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_re_run_workflow_failed_jobs',\n    description: `Re-run all of the failed jobs and their dependent jobs in a workflow run using the \\`id\\` of the workflow run.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsReRunWorkflowFailedJobsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsReRunWorkflowFailedJobs(\n    params: github.ActionsReRunWorkflowFailedJobsParams\n  ): Promise<github.ActionsReRunWorkflowFailedJobsResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/rerun-failed-jobs`,\n        {\n          json: pick(params, 'enable_debug_logging')\n        }\n      )\n      .json<github.ActionsReRunWorkflowFailedJobsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> This endpoint is in the process of closing down. Refer to \"[Actions Get workflow usage and Get workflow run usage endpoints closing down](https://github.blog/changelog/2025-02-02-actions-get-workflow-usage-and-get-workflow-run-usage-endpoints-closing-down/)\" for more information.\n\nGets the number of billable minutes and total run time for a specific workflow run. Billable minutes only apply to workflows in private repositories that use GitHub-hosted runners. Usage is listed for each GitHub-hosted runner operating system in milliseconds. Any job re-runs are also included in the usage. The usage does not include the multiplier for macOS and Windows runners and is not rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_get_workflow_run_usage',\n    description: `> [!WARNING]\n> This endpoint is in the process of closing down. Refer to \"[Actions Get workflow usage and Get workflow run usage endpoints closing down](https://github.blog/changelog/2025-02-02-actions-get-workflow-usage-and-get-workflow-run-usage-endpoints-closing-down/)\" for more information.\n\nGets the number of billable minutes and total run time for a specific workflow run. Billable minutes only apply to workflows in private repositories that use GitHub-hosted runners. Usage is listed for each GitHub-hosted runner operating system in milliseconds. Any job re-runs are also included in the usage. The usage does not include the multiplier for macOS and Windows runners and is not rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsGetWorkflowRunUsageParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetWorkflowRunUsage(\n    params: github.ActionsGetWorkflowRunUsageParams\n  ): Promise<github.ActionsGetWorkflowRunUsageResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/runs/${params.run_id}/timing`,\n        {}\n      )\n      .json<github.ActionsGetWorkflowRunUsageResponse>()\n  }\n\n  /**\n * Lists all secrets available in a repository without revealing their encrypted\nvalues.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_repo_secrets',\n    description: `Lists all secrets available in a repository without revealing their encrypted\nvalues.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListRepoSecretsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRepoSecrets(\n    params: github.ActionsListRepoSecretsParams\n  ): Promise<github.ActionsListRepoSecretsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/actions/secrets`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsListRepoSecretsResponse>()\n  }\n\n  /**\n * Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_repo_public_key',\n    description: `Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetRepoPublicKeyParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetRepoPublicKey(\n    params: github.ActionsGetRepoPublicKeyParams\n  ): Promise<github.ActionsGetRepoPublicKeyResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/secrets/public-key`,\n        {}\n      )\n      .json<github.ActionsGetRepoPublicKeyResponse>()\n  }\n\n  /**\n * Gets a single repository secret without revealing its encrypted value.\n\nThe authenticated user must have collaborator access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_repo_secret',\n    description: `Gets a single repository secret without revealing its encrypted value.\n\nThe authenticated user must have collaborator access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetRepoSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetRepoSecret(\n    params: github.ActionsGetRepoSecretParams\n  ): Promise<github.ActionsGetRepoSecretResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.ActionsGetRepoSecretResponse>()\n  }\n\n  /**\n * Creates or updates a repository secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_or_update_repo_secret',\n    description: `Creates or updates a repository secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateOrUpdateRepoSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateOrUpdateRepoSecret(\n    params: github.ActionsCreateOrUpdateRepoSecretParams\n  ): Promise<github.ActionsCreateOrUpdateRepoSecretResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/secrets/${params.secret_name}`,\n        {\n          json: pick(params, 'encrypted_value', 'key_id')\n        }\n      )\n      .json<github.ActionsCreateOrUpdateRepoSecretResponse>()\n  }\n\n  /**\n * Deletes a secret in a repository using the secret name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_repo_secret',\n    description: `Deletes a secret in a repository using the secret name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteRepoSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteRepoSecret(\n    params: github.ActionsDeleteRepoSecretParams\n  ): Promise<github.ActionsDeleteRepoSecretResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.ActionsDeleteRepoSecretResponse>()\n  }\n\n  /**\n * Lists all repository variables.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_repo_variables',\n    description: `Lists all repository variables.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListRepoVariablesParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRepoVariables(\n    params: github.ActionsListRepoVariablesParams\n  ): Promise<github.ActionsListRepoVariablesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/actions/variables`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsListRepoVariablesResponse>()\n  }\n\n  /**\n * Creates a repository variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_repo_variable',\n    description: `Creates a repository variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateRepoVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateRepoVariable(\n    params: github.ActionsCreateRepoVariableParams\n  ): Promise<github.ActionsCreateRepoVariableResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/actions/variables`, {\n        json: pick(params, 'name', 'value')\n      })\n      .json<github.ActionsCreateRepoVariableResponse>()\n  }\n\n  /**\n * Gets a specific variable in a repository.\n\nThe authenticated user must have collaborator access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_repo_variable',\n    description: `Gets a specific variable in a repository.\n\nThe authenticated user must have collaborator access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetRepoVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetRepoVariable(\n    params: github.ActionsGetRepoVariableParams\n  ): Promise<github.ActionsGetRepoVariableResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/variables/${params.name}`,\n        {}\n      )\n      .json<github.ActionsGetRepoVariableResponse>()\n  }\n\n  /**\n * Deletes a repository variable using the variable name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_repo_variable',\n    description: `Deletes a repository variable using the variable name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteRepoVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteRepoVariable(\n    params: github.ActionsDeleteRepoVariableParams\n  ): Promise<github.ActionsDeleteRepoVariableResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/actions/variables/${params.name}`,\n        {}\n      )\n      .json<github.ActionsDeleteRepoVariableResponse>()\n  }\n\n  /**\n * Updates a repository variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_update_repo_variable',\n    description: `Updates a repository variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsUpdateRepoVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsUpdateRepoVariable(\n    params: github.ActionsUpdateRepoVariableParams\n  ): Promise<github.ActionsUpdateRepoVariableResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/actions/variables/${params.name}`,\n        {\n          json: pick(params, 'name', 'value')\n        }\n      )\n      .json<github.ActionsUpdateRepoVariableResponse>()\n  }\n\n  /**\n * Lists the workflows in a repository.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_list_repo_workflows',\n    description: `Lists the workflows in a repository.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsListRepoWorkflowsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListRepoWorkflows(\n    params: github.ActionsListRepoWorkflowsParams\n  ): Promise<github.ActionsListRepoWorkflowsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/actions/workflows`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActionsListRepoWorkflowsResponse>()\n  }\n\n  /**\n * Gets a specific workflow. You can replace `workflow_id` with the workflow\nfile name. For example, you could use `main.yaml`.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_get_workflow',\n    description: `Gets a specific workflow. You can replace \\`workflow_id\\` with the workflow\nfile name. For example, you could use \\`main.yaml\\`.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsGetWorkflowParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetWorkflow(\n    params: github.ActionsGetWorkflowParams\n  ): Promise<github.ActionsGetWorkflowResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/workflows/${params.workflow_id}`,\n        {}\n      )\n      .json<github.ActionsGetWorkflowResponse>()\n  }\n\n  /**\n * Disables a workflow and sets the `state` of the workflow to `disabled_manually`. You can replace `workflow_id` with the workflow file name. For example, you could use `main.yaml`.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_disable_workflow',\n    description: `Disables a workflow and sets the \\`state\\` of the workflow to \\`disabled_manually\\`. You can replace \\`workflow_id\\` with the workflow file name. For example, you could use \\`main.yaml\\`.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDisableWorkflowParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDisableWorkflow(\n    params: github.ActionsDisableWorkflowParams\n  ): Promise<github.ActionsDisableWorkflowResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/workflows/${params.workflow_id}/disable`,\n        {}\n      )\n      .json<github.ActionsDisableWorkflowResponse>()\n  }\n\n  /**\n * You can use this endpoint to manually trigger a GitHub Actions workflow run. You can replace `workflow_id` with the workflow file name. For example, you could use `main.yaml`.\n\nYou must configure your GitHub Actions workflow to run when the [`workflow_dispatch` webhook](/developers/webhooks-and-events/webhook-events-and-payloads#workflow_dispatch) event occurs. The `inputs` are configured in the workflow file. For more information about how to configure the `workflow_dispatch` event in the workflow file, see \"[Events that trigger workflows](/actions/reference/events-that-trigger-workflows#workflow_dispatch).\"\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_workflow_dispatch',\n    description: `You can use this endpoint to manually trigger a GitHub Actions workflow run. You can replace \\`workflow_id\\` with the workflow file name. For example, you could use \\`main.yaml\\`.\n\nYou must configure your GitHub Actions workflow to run when the [\\`workflow_dispatch\\` webhook](/developers/webhooks-and-events/webhook-events-and-payloads#workflow_dispatch) event occurs. The \\`inputs\\` are configured in the workflow file. For more information about how to configure the \\`workflow_dispatch\\` event in the workflow file, see \"[Events that trigger workflows](/actions/reference/events-that-trigger-workflows#workflow_dispatch).\"\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateWorkflowDispatchParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateWorkflowDispatch(\n    params: github.ActionsCreateWorkflowDispatchParams\n  ): Promise<github.ActionsCreateWorkflowDispatchResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/actions/workflows/${params.workflow_id}/dispatches`,\n        {\n          json: pick(params, 'ref', 'inputs')\n        }\n      )\n      .json<github.ActionsCreateWorkflowDispatchResponse>()\n  }\n\n  /**\n * Enables a workflow and sets the `state` of the workflow to `active`. You can replace `workflow_id` with the workflow file name. For example, you could use `main.yaml`.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_enable_workflow',\n    description: `Enables a workflow and sets the \\`state\\` of the workflow to \\`active\\`. You can replace \\`workflow_id\\` with the workflow file name. For example, you could use \\`main.yaml\\`.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsEnableWorkflowParamsSchema,\n    tags: ['actions']\n  })\n  async actionsEnableWorkflow(\n    params: github.ActionsEnableWorkflowParams\n  ): Promise<github.ActionsEnableWorkflowResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/actions/workflows/${params.workflow_id}/enable`,\n        {}\n      )\n      .json<github.ActionsEnableWorkflowResponse>()\n  }\n\n  /**\n * List all workflow runs for a workflow. You can replace `workflow_id` with the workflow file name. For example, you could use `main.yaml`. You can use parameters to narrow the list of results. For more information about using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n\nThis endpoint will return up to 1,000 results for each search when using the following parameters: `actor`, `branch`, `check_suite_id`, `created`, `event`, `head_sha`, `status`.\n */\n  @aiFunction({\n    name: 'github_actions_list_workflow_runs',\n    description: `List all workflow runs for a workflow. You can replace \\`workflow_id\\` with the workflow file name. For example, you could use \\`main.yaml\\`. You can use parameters to narrow the list of results. For more information about using parameters, see [Parameters](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#parameters).\n\nAnyone with read access to the repository can use this endpoint\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.\n\nThis endpoint will return up to 1,000 results for each search when using the following parameters: \\`actor\\`, \\`branch\\`, \\`check_suite_id\\`, \\`created\\`, \\`event\\`, \\`head_sha\\`, \\`status\\`.`,\n    inputSchema: github.ActionsListWorkflowRunsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListWorkflowRuns(\n    params: github.ActionsListWorkflowRunsParams\n  ): Promise<github.ActionsListWorkflowRunsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/workflows/${params.workflow_id}/runs`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'actor',\n              'branch',\n              'event',\n              'status',\n              'per_page',\n              'page',\n              'created',\n              'exclude_pull_requests',\n              'check_suite_id',\n              'head_sha'\n            )\n          )\n        }\n      )\n      .json<github.ActionsListWorkflowRunsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> This endpoint is in the process of closing down. Refer to \"[Actions Get workflow usage and Get workflow run usage endpoints closing down](https://github.blog/changelog/2025-02-02-actions-get-workflow-usage-and-get-workflow-run-usage-endpoints-closing-down/)\" for more information.\n\nGets the number of billable minutes used by a specific workflow during the current billing cycle. Billable minutes only apply to workflows in private repositories that use GitHub-hosted runners. Usage is listed for each GitHub-hosted runner operating system in milliseconds. Any job re-runs are also included in the usage. The usage does not include the multiplier for macOS and Windows runners and is not rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nYou can replace `workflow_id` with the workflow file name. For example, you could use `main.yaml`.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_actions_get_workflow_usage',\n    description: `> [!WARNING]\n> This endpoint is in the process of closing down. Refer to \"[Actions Get workflow usage and Get workflow run usage endpoints closing down](https://github.blog/changelog/2025-02-02-actions-get-workflow-usage-and-get-workflow-run-usage-endpoints-closing-down/)\" for more information.\n\nGets the number of billable minutes used by a specific workflow during the current billing cycle. Billable minutes only apply to workflows in private repositories that use GitHub-hosted runners. Usage is listed for each GitHub-hosted runner operating system in milliseconds. Any job re-runs are also included in the usage. The usage does not include the multiplier for macOS and Windows runners and is not rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nYou can replace \\`workflow_id\\` with the workflow file name. For example, you could use \\`main.yaml\\`.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ActionsGetWorkflowUsageParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetWorkflowUsage(\n    params: github.ActionsGetWorkflowUsageParams\n  ): Promise<github.ActionsGetWorkflowUsageResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/actions/workflows/${params.workflow_id}/timing`,\n        {}\n      )\n      .json<github.ActionsGetWorkflowUsageResponse>()\n  }\n\n  /**\n * Lists a detailed history of changes to a repository, such as pushes, merges, force pushes, and branch changes, and associates these changes with commits and users.\n\nFor more information about viewing repository activity,\nsee \"[Viewing activity and data for your repository](https://docs.github.com/repositories/viewing-activity-and-data-for-your-repository).\".\n */\n  @aiFunction({\n    name: 'github_repos_list_activities',\n    description: `Lists a detailed history of changes to a repository, such as pushes, merges, force pushes, and branch changes, and associates these changes with commits and users.\n\nFor more information about viewing repository activity,\nsee \"[Viewing activity and data for your repository](https://docs.github.com/repositories/viewing-activity-and-data-for-your-repository).\".`,\n    inputSchema: github.ReposListActivitiesParamsSchema,\n    tags: ['repos']\n  })\n  async reposListActivities(\n    params: github.ReposListActivitiesParams\n  ): Promise<github.ReposListActivitiesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/activity`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'direction',\n            'per_page',\n            'before',\n            'after',\n            'ref',\n            'actor',\n            'time_period',\n            'activity_type'\n          )\n        )\n      })\n      .json<github.ReposListActivitiesResponse>()\n  }\n\n  /**\n   * Lists the [available assignees](https://docs.github.com/articles/assigning-issues-and-pull-requests-to-other-github-users/) for issues in a repository.\n   */\n  @aiFunction({\n    name: 'github_issues_list_assignees',\n    description: `Lists the [available assignees](https://docs.github.com/articles/assigning-issues-and-pull-requests-to-other-github-users/) for issues in a repository.`,\n    inputSchema: github.IssuesListAssigneesParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListAssignees(\n    params: github.IssuesListAssigneesParams\n  ): Promise<github.IssuesListAssigneesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/assignees`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.IssuesListAssigneesResponse>()\n  }\n\n  /**\n * Checks if a user has permission to be assigned to an issue in this repository.\n\nIf the `assignee` can be assigned to issues in the repository, a `204` header with no content is returned.\n\nOtherwise a `404` status code is returned.\n */\n  @aiFunction({\n    name: 'github_issues_check_user_can_be_assigned',\n    description: `Checks if a user has permission to be assigned to an issue in this repository.\n\nIf the \\`assignee\\` can be assigned to issues in the repository, a \\`204\\` header with no content is returned.\n\nOtherwise a \\`404\\` status code is returned.`,\n    inputSchema: github.IssuesCheckUserCanBeAssignedParamsSchema,\n    tags: ['issues']\n  })\n  async issuesCheckUserCanBeAssigned(\n    params: github.IssuesCheckUserCanBeAssignedParams\n  ): Promise<github.IssuesCheckUserCanBeAssignedResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/assignees/${params.assignee}`,\n        {}\n      )\n      .json<github.IssuesCheckUserCanBeAssignedResponse>()\n  }\n\n  /**\n * Store an artifact attestation and associate it with a repository.\n\nThe authenticated user must have write permission to the repository and, if using a fine-grained access token, the `attestations:write` permission is required.\n\nArtifact attestations are meant to be created using the [attest action](https://github.com/actions/attest). For more information, see our guide on [using artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n */\n  @aiFunction({\n    name: 'github_repos_create_attestation',\n    description: `Store an artifact attestation and associate it with a repository.\n\nThe authenticated user must have write permission to the repository and, if using a fine-grained access token, the \\`attestations:write\\` permission is required.\n\nArtifact attestations are meant to be created using the [attest action](https://github.com/actions/attest). For more information, see our guide on [using artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).`,\n    inputSchema: github.ReposCreateAttestationParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateAttestation(\n    params: github.ReposCreateAttestationParams\n  ): Promise<github.ReposCreateAttestationResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/attestations`, {\n        json: pick(params, 'bundle')\n      })\n      .json<github.ReposCreateAttestationResponse>()\n  }\n\n  /**\n * List a collection of artifact attestations with a given subject digest that are associated with a repository.\n\nThe authenticated user making the request must have read access to the repository. In addition, when using a fine-grained access token the `attestations:read` permission is required.\n\n**Please note:** in order to offer meaningful security benefits, an attestation's signature and timestamps **must** be cryptographically verified, and the identity of the attestation signer **must** be validated. Attestations can be verified using the [GitHub CLI `attestation verify` command](https://cli.github.com/manual/gh_attestation_verify). For more information, see [our guide on how to use artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n */\n  @aiFunction({\n    name: 'github_repos_list_attestations',\n    description: `List a collection of artifact attestations with a given subject digest that are associated with a repository.\n\nThe authenticated user making the request must have read access to the repository. In addition, when using a fine-grained access token the \\`attestations:read\\` permission is required.\n\n**Please note:** in order to offer meaningful security benefits, an attestation's signature and timestamps **must** be cryptographically verified, and the identity of the attestation signer **must** be validated. Attestations can be verified using the [GitHub CLI \\`attestation verify\\` command](https://cli.github.com/manual/gh_attestation_verify). For more information, see [our guide on how to use artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).`,\n    inputSchema: github.ReposListAttestationsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListAttestations(\n    params: github.ReposListAttestationsParams\n  ): Promise<github.ReposListAttestationsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/attestations/${params.subject_digest}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'per_page', 'before', 'after', 'predicate_type')\n          )\n        }\n      )\n      .json<github.ReposListAttestationsResponse>()\n  }\n\n  /**\n * Gets all autolinks that are configured for a repository.\n\nInformation about autolinks are only available to repository administrators.\n */\n  @aiFunction({\n    name: 'github_repos_list_autolinks',\n    description: `Gets all autolinks that are configured for a repository.\n\nInformation about autolinks are only available to repository administrators.`,\n    inputSchema: github.ReposListAutolinksParamsSchema,\n    tags: ['repos']\n  })\n  async reposListAutolinks(\n    params: github.ReposListAutolinksParams\n  ): Promise<github.ReposListAutolinksResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/autolinks`, {})\n      .json<github.ReposListAutolinksResponse>()\n  }\n\n  /**\n   * Users with admin access to the repository can create an autolink.\n   */\n  @aiFunction({\n    name: 'github_repos_create_autolink',\n    description: `Users with admin access to the repository can create an autolink.`,\n    inputSchema: github.ReposCreateAutolinkParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateAutolink(\n    params: github.ReposCreateAutolinkParams\n  ): Promise<github.ReposCreateAutolinkResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/autolinks`, {\n        json: pick(params, 'key_prefix', 'url_template', 'is_alphanumeric')\n      })\n      .json<github.ReposCreateAutolinkResponse>()\n  }\n\n  /**\n * This returns a single autolink reference by ID that was configured for the given repository.\n\nInformation about autolinks are only available to repository administrators.\n */\n  @aiFunction({\n    name: 'github_repos_get_autolink',\n    description: `This returns a single autolink reference by ID that was configured for the given repository.\n\nInformation about autolinks are only available to repository administrators.`,\n    inputSchema: github.ReposGetAutolinkParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAutolink(\n    params: github.ReposGetAutolinkParams\n  ): Promise<github.ReposGetAutolinkResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/autolinks/${params.autolink_id}`,\n        {}\n      )\n      .json<github.ReposGetAutolinkResponse>()\n  }\n\n  /**\n * This deletes a single autolink reference by ID that was configured for the given repository.\n\nInformation about autolinks are only available to repository administrators.\n */\n  @aiFunction({\n    name: 'github_repos_delete_autolink',\n    description: `This deletes a single autolink reference by ID that was configured for the given repository.\n\nInformation about autolinks are only available to repository administrators.`,\n    inputSchema: github.ReposDeleteAutolinkParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteAutolink(\n    params: github.ReposDeleteAutolinkParams\n  ): Promise<github.ReposDeleteAutolinkResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/autolinks/${params.autolink_id}`,\n        {}\n      )\n      .json<github.ReposDeleteAutolinkResponse>()\n  }\n\n  /**\n   * Shows whether Dependabot security updates are enabled, disabled or paused for a repository. The authenticated user must have admin read access to the repository. For more information, see \"[Configuring Dependabot security updates](https://docs.github.com/articles/configuring-automated-security-fixes)\".\n   */\n  @aiFunction({\n    name: 'github_repos_check_automated_security_fixes',\n    description: `Shows whether Dependabot security updates are enabled, disabled or paused for a repository. The authenticated user must have admin read access to the repository. For more information, see \"[Configuring Dependabot security updates](https://docs.github.com/articles/configuring-automated-security-fixes)\".`,\n    inputSchema: github.ReposCheckAutomatedSecurityFixesParamsSchema,\n    tags: ['repos']\n  })\n  async reposCheckAutomatedSecurityFixes(\n    params: github.ReposCheckAutomatedSecurityFixesParams\n  ): Promise<github.ReposCheckAutomatedSecurityFixesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/automated-security-fixes`,\n        {}\n      )\n      .json<github.ReposCheckAutomatedSecurityFixesResponse>()\n  }\n\n  /**\n   * Enables Dependabot security updates for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Configuring Dependabot security updates](https://docs.github.com/articles/configuring-automated-security-fixes)\".\n   */\n  @aiFunction({\n    name: 'github_repos_enable_automated_security_fixes',\n    description: `Enables Dependabot security updates for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Configuring Dependabot security updates](https://docs.github.com/articles/configuring-automated-security-fixes)\".`,\n    inputSchema: github.ReposEnableAutomatedSecurityFixesParamsSchema,\n    tags: ['repos']\n  })\n  async reposEnableAutomatedSecurityFixes(\n    params: github.ReposEnableAutomatedSecurityFixesParams\n  ): Promise<github.ReposEnableAutomatedSecurityFixesResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/automated-security-fixes`,\n        {}\n      )\n      .json<github.ReposEnableAutomatedSecurityFixesResponse>()\n  }\n\n  /**\n   * Disables Dependabot security updates for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Configuring Dependabot security updates](https://docs.github.com/articles/configuring-automated-security-fixes)\".\n   */\n  @aiFunction({\n    name: 'github_repos_disable_automated_security_fixes',\n    description: `Disables Dependabot security updates for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Configuring Dependabot security updates](https://docs.github.com/articles/configuring-automated-security-fixes)\".`,\n    inputSchema: github.ReposDisableAutomatedSecurityFixesParamsSchema,\n    tags: ['repos']\n  })\n  async reposDisableAutomatedSecurityFixes(\n    params: github.ReposDisableAutomatedSecurityFixesParams\n  ): Promise<github.ReposDisableAutomatedSecurityFixesResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/automated-security-fixes`,\n        {}\n      )\n      .json<github.ReposDisableAutomatedSecurityFixesResponse>()\n  }\n\n  /**\n   * List branches.\n   */\n  @aiFunction({\n    name: 'github_repos_list_branches',\n    description: `List branches.`,\n    inputSchema: github.ReposListBranchesParamsSchema,\n    tags: ['repos']\n  })\n  async reposListBranches(\n    params: github.ReposListBranchesParams\n  ): Promise<github.ReposListBranchesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/branches`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'protected', 'per_page', 'page')\n        )\n      })\n      .json<github.ReposListBranchesResponse>()\n  }\n\n  /**\n   * Get a branch.\n   */\n  @aiFunction({\n    name: 'github_repos_get_branch',\n    description: `Get a branch.`,\n    inputSchema: github.ReposGetBranchParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetBranch(\n    params: github.ReposGetBranchParams\n  ): Promise<github.ReposGetBranchResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}`,\n        {}\n      )\n      .json<github.ReposGetBranchResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_get_branch_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposGetBranchProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetBranchProtection(\n    params: github.ReposGetBranchProtectionParams\n  ): Promise<github.ReposGetBranchProtectionResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection`,\n        {}\n      )\n      .json<github.ReposGetBranchProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nProtecting a branch requires admin or owner permissions to the repository.\n\n> [!NOTE]\n> Passing new arrays of `users` and `teams` replaces their previous values.\n\n> [!NOTE]\n> The list of users, apps, and teams in total is limited to 100 items.\n */\n  @aiFunction({\n    name: 'github_repos_update_branch_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nProtecting a branch requires admin or owner permissions to the repository.\n\n> [!NOTE]\n> Passing new arrays of \\`users\\` and \\`teams\\` replaces their previous values.\n\n> [!NOTE]\n> The list of users, apps, and teams in total is limited to 100 items.`,\n    inputSchema: github.ReposUpdateBranchProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateBranchProtection(\n    params: github.ReposUpdateBranchProtectionParams\n  ): Promise<github.ReposUpdateBranchProtectionResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection`,\n        {\n          json: pick(\n            params,\n            'required_status_checks',\n            'enforce_admins',\n            'required_pull_request_reviews',\n            'restrictions',\n            'required_linear_history',\n            'allow_force_pushes',\n            'allow_deletions',\n            'block_creations',\n            'required_conversation_resolution',\n            'lock_branch',\n            'allow_fork_syncing'\n          )\n        }\n      )\n      .json<github.ReposUpdateBranchProtectionResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_branch_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposDeleteBranchProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteBranchProtection(\n    params: github.ReposDeleteBranchProtectionParams\n  ): Promise<github.ReposDeleteBranchProtectionResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection`,\n        {}\n      )\n      .json<github.ReposDeleteBranchProtectionResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_get_admin_branch_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposGetAdminBranchProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAdminBranchProtection(\n    params: github.ReposGetAdminBranchProtectionParams\n  ): Promise<github.ReposGetAdminBranchProtectionResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/enforce_admins`,\n        {}\n      )\n      .json<github.ReposGetAdminBranchProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nAdding admin enforcement requires admin or owner permissions to the repository and branch protection to be enabled.\n */\n  @aiFunction({\n    name: 'github_repos_set_admin_branch_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nAdding admin enforcement requires admin or owner permissions to the repository and branch protection to be enabled.`,\n    inputSchema: github.ReposSetAdminBranchProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposSetAdminBranchProtection(\n    params: github.ReposSetAdminBranchProtectionParams\n  ): Promise<github.ReposSetAdminBranchProtectionResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/enforce_admins`,\n        {}\n      )\n      .json<github.ReposSetAdminBranchProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoving admin enforcement requires admin or owner permissions to the repository and branch protection to be enabled.\n */\n  @aiFunction({\n    name: 'github_repos_delete_admin_branch_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoving admin enforcement requires admin or owner permissions to the repository and branch protection to be enabled.`,\n    inputSchema: github.ReposDeleteAdminBranchProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteAdminBranchProtection(\n    params: github.ReposDeleteAdminBranchProtectionParams\n  ): Promise<github.ReposDeleteAdminBranchProtectionResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/enforce_admins`,\n        {}\n      )\n      .json<github.ReposDeleteAdminBranchProtectionResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_get_pull_request_review_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposGetPullRequestReviewProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetPullRequestReviewProtection(\n    params: github.ReposGetPullRequestReviewProtectionParams\n  ): Promise<github.ReposGetPullRequestReviewProtectionResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_pull_request_reviews`,\n        {}\n      )\n      .json<github.ReposGetPullRequestReviewProtectionResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_pull_request_review_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposDeletePullRequestReviewProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeletePullRequestReviewProtection(\n    params: github.ReposDeletePullRequestReviewProtectionParams\n  ): Promise<github.ReposDeletePullRequestReviewProtectionResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_pull_request_reviews`,\n        {}\n      )\n      .json<github.ReposDeletePullRequestReviewProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nUpdating pull request review enforcement requires admin or owner permissions to the repository and branch protection to be enabled.\n\n> [!NOTE]\n> Passing new arrays of `users` and `teams` replaces their previous values.\n */\n  @aiFunction({\n    name: 'github_repos_update_pull_request_review_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nUpdating pull request review enforcement requires admin or owner permissions to the repository and branch protection to be enabled.\n\n> [!NOTE]\n> Passing new arrays of \\`users\\` and \\`teams\\` replaces their previous values.`,\n    inputSchema: github.ReposUpdatePullRequestReviewProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdatePullRequestReviewProtection(\n    params: github.ReposUpdatePullRequestReviewProtectionParams\n  ): Promise<github.ReposUpdatePullRequestReviewProtectionResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_pull_request_reviews`,\n        {\n          json: pick(\n            params,\n            'dismissal_restrictions',\n            'dismiss_stale_reviews',\n            'require_code_owner_reviews',\n            'required_approving_review_count',\n            'require_last_push_approval',\n            'bypass_pull_request_allowances'\n          )\n        }\n      )\n      .json<github.ReposUpdatePullRequestReviewProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nWhen authenticated with admin or owner permissions to the repository, you can use this endpoint to check whether a branch requires signed commits. An enabled status of `true` indicates you must sign commits on this branch. For more information, see [Signing commits with GPG](https://docs.github.com/articles/signing-commits-with-gpg) in GitHub Help.\n\n> [!NOTE]\n> You must enable branch protection to require signed commits.\n */\n  @aiFunction({\n    name: 'github_repos_get_commit_signature_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nWhen authenticated with admin or owner permissions to the repository, you can use this endpoint to check whether a branch requires signed commits. An enabled status of \\`true\\` indicates you must sign commits on this branch. For more information, see [Signing commits with GPG](https://docs.github.com/articles/signing-commits-with-gpg) in GitHub Help.\n\n> [!NOTE]\n> You must enable branch protection to require signed commits.`,\n    inputSchema: github.ReposGetCommitSignatureProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCommitSignatureProtection(\n    params: github.ReposGetCommitSignatureProtectionParams\n  ): Promise<github.ReposGetCommitSignatureProtectionResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_signatures`,\n        {}\n      )\n      .json<github.ReposGetCommitSignatureProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nWhen authenticated with admin or owner permissions to the repository, you can use this endpoint to require signed commits on a branch. You must enable branch protection to require signed commits.\n */\n  @aiFunction({\n    name: 'github_repos_create_commit_signature_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nWhen authenticated with admin or owner permissions to the repository, you can use this endpoint to require signed commits on a branch. You must enable branch protection to require signed commits.`,\n    inputSchema: github.ReposCreateCommitSignatureProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateCommitSignatureProtection(\n    params: github.ReposCreateCommitSignatureProtectionParams\n  ): Promise<github.ReposCreateCommitSignatureProtectionResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_signatures`,\n        {}\n      )\n      .json<github.ReposCreateCommitSignatureProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nWhen authenticated with admin or owner permissions to the repository, you can use this endpoint to disable required signed commits on a branch. You must enable branch protection to require signed commits.\n */\n  @aiFunction({\n    name: 'github_repos_delete_commit_signature_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nWhen authenticated with admin or owner permissions to the repository, you can use this endpoint to disable required signed commits on a branch. You must enable branch protection to require signed commits.`,\n    inputSchema: github.ReposDeleteCommitSignatureProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteCommitSignatureProtection(\n    params: github.ReposDeleteCommitSignatureProtectionParams\n  ): Promise<github.ReposDeleteCommitSignatureProtectionResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_signatures`,\n        {}\n      )\n      .json<github.ReposDeleteCommitSignatureProtectionResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_get_status_checks_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposGetStatusChecksProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetStatusChecksProtection(\n    params: github.ReposGetStatusChecksProtectionParams\n  ): Promise<github.ReposGetStatusChecksProtectionResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_status_checks`,\n        {}\n      )\n      .json<github.ReposGetStatusChecksProtectionResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_remove_status_check_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposRemoveStatusCheckProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposRemoveStatusCheckProtection(\n    params: github.ReposRemoveStatusCheckProtectionParams\n  ): Promise<github.ReposRemoveStatusCheckProtectionResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_status_checks`,\n        {}\n      )\n      .json<github.ReposRemoveStatusCheckProtectionResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nUpdating required status checks requires admin or owner permissions to the repository and branch protection to be enabled.\n */\n  @aiFunction({\n    name: 'github_repos_update_status_check_protection',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nUpdating required status checks requires admin or owner permissions to the repository and branch protection to be enabled.`,\n    inputSchema: github.ReposUpdateStatusCheckProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateStatusCheckProtection(\n    params: github.ReposUpdateStatusCheckProtectionParams\n  ): Promise<github.ReposUpdateStatusCheckProtectionResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_status_checks`,\n        {\n          json: pick(params, 'strict', 'contexts', 'checks')\n        }\n      )\n      .json<github.ReposUpdateStatusCheckProtectionResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_get_all_status_check_contexts',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    inputSchema: github.ReposGetAllStatusCheckContextsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAllStatusCheckContexts(\n    params: github.ReposGetAllStatusCheckContextsParams\n  ): Promise<github.ReposGetAllStatusCheckContextsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_status_checks/contexts`,\n        {}\n      )\n      .json<github.ReposGetAllStatusCheckContextsResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_add_status_check_contexts',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposAddStatusCheckContextsParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposAddStatusCheckContexts(\n    params: github.ReposAddStatusCheckContextsParams\n  ): Promise<github.ReposAddStatusCheckContextsResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_status_checks/contexts`,\n        {\n          json: params\n        }\n      )\n      .json<github.ReposAddStatusCheckContextsResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_set_status_check_contexts',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposSetStatusCheckContextsParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposSetStatusCheckContexts(\n    params: github.ReposSetStatusCheckContextsParams\n  ): Promise<github.ReposSetStatusCheckContextsResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_status_checks/contexts`,\n        {\n          json: params\n        }\n      )\n      .json<github.ReposSetStatusCheckContextsResponse>()\n  }\n\n  /**\n   * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n   */\n  @aiFunction({\n    name: 'github_repos_remove_status_check_contexts',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposRemoveStatusCheckContextsParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposRemoveStatusCheckContexts(\n    params: github.ReposRemoveStatusCheckContextsParams\n  ): Promise<github.ReposRemoveStatusCheckContextsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/required_status_checks/contexts`,\n        {\n          json: params\n        }\n      )\n      .json<github.ReposRemoveStatusCheckContextsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists who has access to this protected branch.\n\n> [!NOTE]\n> Users, apps, and teams `restrictions` are only available for organization-owned repositories.\n */\n  @aiFunction({\n    name: 'github_repos_get_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists who has access to this protected branch.\n\n> [!NOTE]\n> Users, apps, and teams \\`restrictions\\` are only available for organization-owned repositories.`,\n    inputSchema: github.ReposGetAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAccessRestrictions(\n    params: github.ReposGetAccessRestrictionsParams\n  ): Promise<github.ReposGetAccessRestrictionsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions`,\n        {}\n      )\n      .json<github.ReposGetAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nDisables the ability to restrict who can push to this branch.\n */\n  @aiFunction({\n    name: 'github_repos_delete_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nDisables the ability to restrict who can push to this branch.`,\n    inputSchema: github.ReposDeleteAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteAccessRestrictions(\n    params: github.ReposDeleteAccessRestrictionsParams\n  ): Promise<github.ReposDeleteAccessRestrictionsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions`,\n        {}\n      )\n      .json<github.ReposDeleteAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists the GitHub Apps that have push access to this branch. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.\n */\n  @aiFunction({\n    name: 'github_repos_get_apps_with_access_to_protected_branch',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists the GitHub Apps that have push access to this branch. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.`,\n    inputSchema: github.ReposGetAppsWithAccessToProtectedBranchParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAppsWithAccessToProtectedBranch(\n    params: github.ReposGetAppsWithAccessToProtectedBranchParams\n  ): Promise<github.ReposGetAppsWithAccessToProtectedBranchResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/apps`,\n        {}\n      )\n      .json<github.ReposGetAppsWithAccessToProtectedBranchResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nGrants the specified apps push access for this branch. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.\n */\n  @aiFunction({\n    name: 'github_repos_add_app_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nGrants the specified apps push access for this branch. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.`,\n    inputSchema: github.ReposAddAppAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposAddAppAccessRestrictions(\n    params: github.ReposAddAppAccessRestrictionsParams\n  ): Promise<github.ReposAddAppAccessRestrictionsResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/apps`,\n        {\n          json: pick(params, 'apps')\n        }\n      )\n      .json<github.ReposAddAppAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReplaces the list of apps that have push access to this branch. This removes all apps that previously had push access and grants push access to the new list of apps. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.\n */\n  @aiFunction({\n    name: 'github_repos_set_app_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReplaces the list of apps that have push access to this branch. This removes all apps that previously had push access and grants push access to the new list of apps. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.`,\n    inputSchema: github.ReposSetAppAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposSetAppAccessRestrictions(\n    params: github.ReposSetAppAccessRestrictionsParams\n  ): Promise<github.ReposSetAppAccessRestrictionsResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/apps`,\n        {\n          json: pick(params, 'apps')\n        }\n      )\n      .json<github.ReposSetAppAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoves the ability of an app to push to this branch. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.\n */\n  @aiFunction({\n    name: 'github_repos_remove_app_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoves the ability of an app to push to this branch. Only GitHub Apps that are installed on the repository and that have been granted write access to the repository contents can be added as authorized actors on a protected branch.`,\n    inputSchema: github.ReposRemoveAppAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposRemoveAppAccessRestrictions(\n    params: github.ReposRemoveAppAccessRestrictionsParams\n  ): Promise<github.ReposRemoveAppAccessRestrictionsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/apps`,\n        {\n          json: pick(params, 'apps')\n        }\n      )\n      .json<github.ReposRemoveAppAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists the teams who have push access to this branch. The list includes child teams.\n */\n  @aiFunction({\n    name: 'github_repos_get_teams_with_access_to_protected_branch',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists the teams who have push access to this branch. The list includes child teams.`,\n    inputSchema: github.ReposGetTeamsWithAccessToProtectedBranchParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetTeamsWithAccessToProtectedBranch(\n    params: github.ReposGetTeamsWithAccessToProtectedBranchParams\n  ): Promise<github.ReposGetTeamsWithAccessToProtectedBranchResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/teams`,\n        {}\n      )\n      .json<github.ReposGetTeamsWithAccessToProtectedBranchResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nGrants the specified teams push access for this branch. You can also give push access to child teams.\n */\n  @aiFunction({\n    name: 'github_repos_add_team_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nGrants the specified teams push access for this branch. You can also give push access to child teams.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposAddTeamAccessRestrictionsParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposAddTeamAccessRestrictions(\n    params: github.ReposAddTeamAccessRestrictionsParams\n  ): Promise<github.ReposAddTeamAccessRestrictionsResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/teams`,\n        {\n          json: params\n        }\n      )\n      .json<github.ReposAddTeamAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReplaces the list of teams that have push access to this branch. This removes all teams that previously had push access and grants push access to the new list of teams. Team restrictions include child teams.\n */\n  @aiFunction({\n    name: 'github_repos_set_team_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReplaces the list of teams that have push access to this branch. This removes all teams that previously had push access and grants push access to the new list of teams. Team restrictions include child teams.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposSetTeamAccessRestrictionsParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposSetTeamAccessRestrictions(\n    params: github.ReposSetTeamAccessRestrictionsParams\n  ): Promise<github.ReposSetTeamAccessRestrictionsResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/teams`,\n        {\n          json: params\n        }\n      )\n      .json<github.ReposSetTeamAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoves the ability of a team to push to this branch. You can also remove push access for child teams.\n */\n  @aiFunction({\n    name: 'github_repos_remove_team_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoves the ability of a team to push to this branch. You can also remove push access for child teams.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposRemoveTeamAccessRestrictionsParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposRemoveTeamAccessRestrictions(\n    params: github.ReposRemoveTeamAccessRestrictionsParams\n  ): Promise<github.ReposRemoveTeamAccessRestrictionsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/teams`,\n        {\n          json: params\n        }\n      )\n      .json<github.ReposRemoveTeamAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists the people who have push access to this branch.\n */\n  @aiFunction({\n    name: 'github_repos_get_users_with_access_to_protected_branch',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists the people who have push access to this branch.`,\n    inputSchema: github.ReposGetUsersWithAccessToProtectedBranchParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetUsersWithAccessToProtectedBranch(\n    params: github.ReposGetUsersWithAccessToProtectedBranchParams\n  ): Promise<github.ReposGetUsersWithAccessToProtectedBranchResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/users`,\n        {}\n      )\n      .json<github.ReposGetUsersWithAccessToProtectedBranchResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nGrants the specified people push access for this branch.\n\n| Type    | Description                                                                                                                   |\n| ------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `array` | Usernames for people who can have push access. **Note**: The list of users, apps, and teams in total is limited to 100 items. |.\n */\n  @aiFunction({\n    name: 'github_repos_add_user_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nGrants the specified people push access for this branch.\n\n| Type    | Description                                                                                                                   |\n| ------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| \\`array\\` | Usernames for people who can have push access. **Note**: The list of users, apps, and teams in total is limited to 100 items. |.`,\n    inputSchema: github.ReposAddUserAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposAddUserAccessRestrictions(\n    params: github.ReposAddUserAccessRestrictionsParams\n  ): Promise<github.ReposAddUserAccessRestrictionsResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/users`,\n        {\n          json: pick(params, 'users')\n        }\n      )\n      .json<github.ReposAddUserAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReplaces the list of people that have push access to this branch. This removes all people that previously had push access and grants push access to the new list of people.\n\n| Type    | Description                                                                                                                   |\n| ------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| `array` | Usernames for people who can have push access. **Note**: The list of users, apps, and teams in total is limited to 100 items. |.\n */\n  @aiFunction({\n    name: 'github_repos_set_user_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReplaces the list of people that have push access to this branch. This removes all people that previously had push access and grants push access to the new list of people.\n\n| Type    | Description                                                                                                                   |\n| ------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| \\`array\\` | Usernames for people who can have push access. **Note**: The list of users, apps, and teams in total is limited to 100 items. |.`,\n    inputSchema: github.ReposSetUserAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposSetUserAccessRestrictions(\n    params: github.ReposSetUserAccessRestrictionsParams\n  ): Promise<github.ReposSetUserAccessRestrictionsResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/users`,\n        {\n          json: pick(params, 'users')\n        }\n      )\n      .json<github.ReposSetUserAccessRestrictionsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoves the ability of a user to push to this branch.\n\n| Type    | Description                                                                                                                                   |\n| ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| `array` | Usernames of the people who should no longer have push access. **Note**: The list of users, apps, and teams in total is limited to 100 items. |.\n */\n  @aiFunction({\n    name: 'github_repos_remove_user_access_restrictions',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nRemoves the ability of a user to push to this branch.\n\n| Type    | Description                                                                                                                                   |\n| ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| \\`array\\` | Usernames of the people who should no longer have push access. **Note**: The list of users, apps, and teams in total is limited to 100 items. |.`,\n    inputSchema: github.ReposRemoveUserAccessRestrictionsParamsSchema,\n    tags: ['repos']\n  })\n  async reposRemoveUserAccessRestrictions(\n    params: github.ReposRemoveUserAccessRestrictionsParams\n  ): Promise<github.ReposRemoveUserAccessRestrictionsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/protection/restrictions/users`,\n        {\n          json: pick(params, 'users')\n        }\n      )\n      .json<github.ReposRemoveUserAccessRestrictionsResponse>()\n  }\n\n  /**\n * Renames a branch in a repository.\n\n> [!NOTE]\n> Although the API responds immediately, the branch rename process might take some extra time to complete in the background. You won't be able to push to the old branch name while the rename process is in progress. For more information, see \"[Renaming a branch](https://docs.github.com/github/administering-a-repository/renaming-a-branch)\".\n\nThe authenticated user must have push access to the branch. If the branch is the default branch, the authenticated user must also have admin or owner permissions.\n\nIn order to rename the default branch, fine-grained access tokens also need the `administration:write` repository permission.\n */\n  @aiFunction({\n    name: 'github_repos_rename_branch',\n    description: `Renames a branch in a repository.\n\n> [!NOTE]\n> Although the API responds immediately, the branch rename process might take some extra time to complete in the background. You won't be able to push to the old branch name while the rename process is in progress. For more information, see \"[Renaming a branch](https://docs.github.com/github/administering-a-repository/renaming-a-branch)\".\n\nThe authenticated user must have push access to the branch. If the branch is the default branch, the authenticated user must also have admin or owner permissions.\n\nIn order to rename the default branch, fine-grained access tokens also need the \\`administration:write\\` repository permission.`,\n    inputSchema: github.ReposRenameBranchParamsSchema,\n    tags: ['repos']\n  })\n  async reposRenameBranch(\n    params: github.ReposRenameBranchParams\n  ): Promise<github.ReposRenameBranchResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/branches/${params.branch}/rename`,\n        {\n          json: pick(params, 'new_name')\n        }\n      )\n      .json<github.ReposRenameBranchResponse>()\n  }\n\n  /**\n * Creates a new check run for a specific commit in a repository.\n\nTo create a check run, you must use a GitHub App. OAuth apps and authenticated users are not able to create a check suite.\n\nIn a check suite, GitHub limits the number of check runs with the same name to 1000. Once these check runs exceed 1000, GitHub will start to automatically delete older check runs.\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array.\n */\n  @aiFunction({\n    name: 'github_checks_create',\n    description: `Creates a new check run for a specific commit in a repository.\n\nTo create a check run, you must use a GitHub App. OAuth apps and authenticated users are not able to create a check suite.\n\nIn a check suite, GitHub limits the number of check runs with the same name to 1000. Once these check runs exceed 1000, GitHub will start to automatically delete older check runs.\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ChecksCreateParamsSchema as any,\n    tags: ['checks']\n  })\n  async checksCreate(\n    params: github.ChecksCreateParams\n  ): Promise<github.ChecksCreateResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/check-runs`, {\n        json: params\n      })\n      .json<github.ChecksCreateResponse>()\n  }\n\n  /**\n * Gets a single check run using its `id`.\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint on a private repository.\n */\n  @aiFunction({\n    name: 'github_checks_get',\n    description: `Gets a single check run using its \\`id\\`.\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint on a private repository.`,\n    inputSchema: github.ChecksGetParamsSchema,\n    tags: ['checks']\n  })\n  async checksGet(\n    params: github.ChecksGetParams\n  ): Promise<github.ChecksGetResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/check-runs/${params.check_run_id}`,\n        {}\n      )\n      .json<github.ChecksGetResponse>()\n  }\n\n  /**\n * Updates a check run for a specific commit in a repository.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array.\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.\n */\n  @aiFunction({\n    name: 'github_checks_update',\n    description: `Updates a check run for a specific commit in a repository.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array.\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ChecksUpdateParamsSchema as any,\n    tags: ['checks']\n  })\n  async checksUpdate(\n    params: github.ChecksUpdateParams\n  ): Promise<github.ChecksUpdateResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/check-runs/${params.check_run_id}`,\n        {\n          json: params\n        }\n      )\n      .json<github.ChecksUpdateResponse>()\n  }\n\n  /**\n * Lists annotations for a check run using the annotation `id`.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint on a private repository.\n */\n  @aiFunction({\n    name: 'github_checks_list_annotations',\n    description: `Lists annotations for a check run using the annotation \\`id\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint on a private repository.`,\n    inputSchema: github.ChecksListAnnotationsParamsSchema,\n    tags: ['checks']\n  })\n  async checksListAnnotations(\n    params: github.ChecksListAnnotationsParams\n  ): Promise<github.ChecksListAnnotationsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/check-runs/${params.check_run_id}/annotations`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ChecksListAnnotationsResponse>()\n  }\n\n  /**\n * Triggers GitHub to rerequest an existing check run, without pushing new code to a repository. This endpoint will trigger the [`check_run` webhook](https://docs.github.com/webhooks/event-payloads/#check_run) event with the action `rerequested`. When a check run is `rerequested`, its `status` is reset to `queued` and the `conclusion` is cleared.\n\nFor more information about how to re-run GitHub Actions jobs, see \"[Re-run a job from a workflow run](https://docs.github.com/rest/actions/workflow-runs#re-run-a-job-from-a-workflow-run)\".\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.\n */\n  @aiFunction({\n    name: 'github_checks_rerequest_run',\n    description: `Triggers GitHub to rerequest an existing check run, without pushing new code to a repository. This endpoint will trigger the [\\`check_run\\` webhook](https://docs.github.com/webhooks/event-payloads/#check_run) event with the action \\`rerequested\\`. When a check run is \\`rerequested\\`, its \\`status\\` is reset to \\`queued\\` and the \\`conclusion\\` is cleared.\n\nFor more information about how to re-run GitHub Actions jobs, see \"[Re-run a job from a workflow run](https://docs.github.com/rest/actions/workflow-runs#re-run-a-job-from-a-workflow-run)\".\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.`,\n    inputSchema: github.ChecksRerequestRunParamsSchema,\n    tags: ['checks']\n  })\n  async checksRerequestRun(\n    params: github.ChecksRerequestRunParams\n  ): Promise<github.ChecksRerequestRunResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/check-runs/${params.check_run_id}/rerequest`,\n        {}\n      )\n      .json<github.ChecksRerequestRunResponse>()\n  }\n\n  /**\n * Creates a check suite manually. By default, check suites are automatically created when you create a [check run](https://docs.github.com/rest/checks/runs). You only need to use this endpoint for manually creating check suites when you've disabled automatic creation using \"[Update repository preferences for check suites](https://docs.github.com/rest/checks/suites#update-repository-preferences-for-check-suites)\".\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array and a `null` value for `head_branch`.\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.\n */\n  @aiFunction({\n    name: 'github_checks_create_suite',\n    description: `Creates a check suite manually. By default, check suites are automatically created when you create a [check run](https://docs.github.com/rest/checks/runs). You only need to use this endpoint for manually creating check suites when you've disabled automatic creation using \"[Update repository preferences for check suites](https://docs.github.com/rest/checks/suites#update-repository-preferences-for-check-suites)\".\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array and a \\`null\\` value for \\`head_branch\\`.\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.`,\n    inputSchema: github.ChecksCreateSuiteParamsSchema,\n    tags: ['checks']\n  })\n  async checksCreateSuite(\n    params: github.ChecksCreateSuiteParams\n  ): Promise<github.ChecksCreateSuiteResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/check-suites`, {\n        json: pick(params, 'head_sha')\n      })\n      .json<github.ChecksCreateSuiteResponse>()\n  }\n\n  /**\n * Changes the default automatic flow when creating check suites. By default, a check suite is automatically created each time code is pushed to a repository. When you disable the automatic creation of check suites, you can manually [Create a check suite](https://docs.github.com/rest/checks/suites#create-a-check-suite).\nYou must have admin permissions in the repository to set preferences for check suites.\n */\n  @aiFunction({\n    name: 'github_checks_set_suites_preferences',\n    description: `Changes the default automatic flow when creating check suites. By default, a check suite is automatically created each time code is pushed to a repository. When you disable the automatic creation of check suites, you can manually [Create a check suite](https://docs.github.com/rest/checks/suites#create-a-check-suite).\nYou must have admin permissions in the repository to set preferences for check suites.`,\n    inputSchema: github.ChecksSetSuitesPreferencesParamsSchema,\n    tags: ['checks']\n  })\n  async checksSetSuitesPreferences(\n    params: github.ChecksSetSuitesPreferencesParams\n  ): Promise<github.ChecksSetSuitesPreferencesResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/check-suites/preferences`,\n        {\n          json: pick(params, 'auto_trigger_checks')\n        }\n      )\n      .json<github.ChecksSetSuitesPreferencesResponse>()\n  }\n\n  /**\n * Gets a single check suite using its `id`.\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array and a `null` value for `head_branch`.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint on a private repository.\n */\n  @aiFunction({\n    name: 'github_checks_get_suite',\n    description: `Gets a single check suite using its \\`id\\`.\n\n> [!NOTE]\n> The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array and a \\`null\\` value for \\`head_branch\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint on a private repository.`,\n    inputSchema: github.ChecksGetSuiteParamsSchema,\n    tags: ['checks']\n  })\n  async checksGetSuite(\n    params: github.ChecksGetSuiteParams\n  ): Promise<github.ChecksGetSuiteResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/check-suites/${params.check_suite_id}`,\n        {}\n      )\n      .json<github.ChecksGetSuiteResponse>()\n  }\n\n  /**\n * Lists check runs for a check suite using its `id`.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint on a private repository.\n */\n  @aiFunction({\n    name: 'github_checks_list_for_suite',\n    description: `Lists check runs for a check suite using its \\`id\\`.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint on a private repository.`,\n    inputSchema: github.ChecksListForSuiteParamsSchema,\n    tags: ['checks']\n  })\n  async checksListForSuite(\n    params: github.ChecksListForSuiteParams\n  ): Promise<github.ChecksListForSuiteResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/check-suites/${params.check_suite_id}/check-runs`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'check_name', 'status', 'filter', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ChecksListForSuiteResponse>()\n  }\n\n  /**\n * Triggers GitHub to rerequest an existing check suite, without pushing new code to a repository. This endpoint will trigger the [`check_suite` webhook](https://docs.github.com/webhooks/event-payloads/#check_suite) event with the action `rerequested`. When a check suite is `rerequested`, its `status` is reset to `queued` and the `conclusion` is cleared.\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.\n */\n  @aiFunction({\n    name: 'github_checks_rerequest_suite',\n    description: `Triggers GitHub to rerequest an existing check suite, without pushing new code to a repository. This endpoint will trigger the [\\`check_suite\\` webhook](https://docs.github.com/webhooks/event-payloads/#check_suite) event with the action \\`rerequested\\`. When a check suite is \\`rerequested\\`, its \\`status\\` is reset to \\`queued\\` and the \\`conclusion\\` is cleared.\n\nOAuth apps and personal access tokens (classic) cannot use this endpoint.`,\n    inputSchema: github.ChecksRerequestSuiteParamsSchema,\n    tags: ['checks']\n  })\n  async checksRerequestSuite(\n    params: github.ChecksRerequestSuiteParams\n  ): Promise<github.ChecksRerequestSuiteResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/check-suites/${params.check_suite_id}/rerequest`,\n        {}\n      )\n      .json<github.ChecksRerequestSuiteResponse>()\n  }\n\n  /**\n * Lists code scanning alerts.\n\nThe response includes a `most_recent_instance` object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used `ref` in the request).\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_list_alerts_for_repo',\n    description: `Lists code scanning alerts.\n\nThe response includes a \\`most_recent_instance\\` object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used \\`ref\\` in the request).\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningListAlertsForRepoParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningListAlertsForRepo(\n    params: github.CodeScanningListAlertsForRepoParams\n  ): Promise<github.CodeScanningListAlertsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/code-scanning/alerts`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'tool_name',\n            'tool_guid',\n            'page',\n            'per_page',\n            'ref',\n            'pr',\n            'direction',\n            'before',\n            'after',\n            'sort',\n            'state',\n            'severity'\n          )\n        )\n      })\n      .json<github.CodeScanningListAlertsForRepoResponse>()\n  }\n\n  /**\n * Gets a single code scanning alert.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_alert',\n    description: `Gets a single code scanning alert.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetAlertParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetAlert(\n    params: github.CodeScanningGetAlertParams\n  ): Promise<github.CodeScanningGetAlertResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/alerts/${params.alert_number}`,\n        {}\n      )\n      .json<github.CodeScanningGetAlertResponse>()\n  }\n\n  /**\n * Updates the status of a single code scanning alert.\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_update_alert',\n    description: `Updates the status of a single code scanning alert.\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningUpdateAlertParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningUpdateAlert(\n    params: github.CodeScanningUpdateAlertParams\n  ): Promise<github.CodeScanningUpdateAlertResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/code-scanning/alerts/${params.alert_number}`,\n        {\n          json: pick(\n            params,\n            'state',\n            'dismissed_reason',\n            'dismissed_comment',\n            'create_request'\n          )\n        }\n      )\n      .json<github.CodeScanningUpdateAlertResponse>()\n  }\n\n  /**\n * Gets the status and description of an autofix for a code scanning alert.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_autofix',\n    description: `Gets the status and description of an autofix for a code scanning alert.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetAutofixParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetAutofix(\n    params: github.CodeScanningGetAutofixParams\n  ): Promise<github.CodeScanningGetAutofixResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/alerts/${params.alert_number}/autofix`,\n        {}\n      )\n      .json<github.CodeScanningGetAutofixResponse>()\n  }\n\n  /**\n * Creates an autofix for a code scanning alert.\n\nIf a new autofix is to be created as a result of this request or is currently being generated, then this endpoint will return a 202 Accepted response.\n\nIf an autofix already exists for a given alert, then this endpoint will return a 200 OK response.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_create_autofix',\n    description: `Creates an autofix for a code scanning alert.\n\nIf a new autofix is to be created as a result of this request or is currently being generated, then this endpoint will return a 202 Accepted response.\n\nIf an autofix already exists for a given alert, then this endpoint will return a 200 OK response.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningCreateAutofixParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningCreateAutofix(\n    params: github.CodeScanningCreateAutofixParams\n  ): Promise<github.CodeScanningCreateAutofixResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/code-scanning/alerts/${params.alert_number}/autofix`,\n        {}\n      )\n      .json<github.CodeScanningCreateAutofixResponse>()\n  }\n\n  /**\n * Commits an autofix for a code scanning alert.\n\nIf an autofix is committed as a result of this request, then this endpoint will return a 201 Created response.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_commit_autofix',\n    description: `Commits an autofix for a code scanning alert.\n\nIf an autofix is committed as a result of this request, then this endpoint will return a 201 Created response.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningCommitAutofixParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningCommitAutofix(\n    params: github.CodeScanningCommitAutofixParams\n  ): Promise<github.CodeScanningCommitAutofixResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/code-scanning/alerts/${params.alert_number}/autofix/commits`,\n        {\n          json: pick(params, 'target_ref', 'message')\n        }\n      )\n      .json<github.CodeScanningCommitAutofixResponse>()\n  }\n\n  /**\n * Lists all instances of the specified code scanning alert.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_list_alert_instances',\n    description: `Lists all instances of the specified code scanning alert.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningListAlertInstancesParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningListAlertInstances(\n    params: github.CodeScanningListAlertInstancesParams\n  ): Promise<github.CodeScanningListAlertInstancesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/alerts/${params.alert_number}/instances`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'page', 'per_page', 'ref', 'pr')\n          )\n        }\n      )\n      .json<github.CodeScanningListAlertInstancesResponse>()\n  }\n\n  /**\n * Lists the details of all code scanning analyses for a repository,\nstarting with the most recent.\nThe response is paginated and you can use the `page` and `per_page` parameters\nto list the analyses you're interested in.\nBy default 30 analyses are listed per page.\n\nThe `rules_count` field in the response give the number of rules\nthat were run in the analysis.\nFor very old analyses this data is not available,\nand `0` is returned in this field.\n\n> [!WARNING]\n> **Closing down notice:** The `tool_name` field is closing down and will, in future, not be included in the response for this endpoint. The example response reflects this change. The tool name can now be found inside the `tool` field.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_list_recent_analyses',\n    description: `Lists the details of all code scanning analyses for a repository,\nstarting with the most recent.\nThe response is paginated and you can use the \\`page\\` and \\`per_page\\` parameters\nto list the analyses you're interested in.\nBy default 30 analyses are listed per page.\n\nThe \\`rules_count\\` field in the response give the number of rules\nthat were run in the analysis.\nFor very old analyses this data is not available,\nand \\`0\\` is returned in this field.\n\n> [!WARNING]\n> **Closing down notice:** The \\`tool_name\\` field is closing down and will, in future, not be included in the response for this endpoint. The example response reflects this change. The tool name can now be found inside the \\`tool\\` field.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningListRecentAnalysesParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningListRecentAnalyses(\n    params: github.CodeScanningListRecentAnalysesParams\n  ): Promise<github.CodeScanningListRecentAnalysesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/analyses`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'tool_name',\n              'tool_guid',\n              'page',\n              'per_page',\n              'pr',\n              'ref',\n              'sarif_id',\n              'direction',\n              'sort'\n            )\n          )\n        }\n      )\n      .json<github.CodeScanningListRecentAnalysesResponse>()\n  }\n\n  /**\n * Gets a specified code scanning analysis for a repository.\n\nThe default JSON response contains fields that describe the analysis.\nThis includes the Git reference and commit SHA to which the analysis relates,\nthe datetime of the analysis, the name of the code scanning tool,\nand the number of alerts.\n\nThe `rules_count` field in the default response give the number of rules\nthat were run in the analysis.\nFor very old analyses this data is not available,\nand `0` is returned in this field.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/sarif+json`**: Instead of returning a summary of the analysis, this endpoint returns a subset of the analysis data that was uploaded. The data is formatted as [SARIF version 2.1.0](https://docs.oasis-open.org/sarif/sarif/v2.1.0/cs01/sarif-v2.1.0-cs01.html). It also returns additional data such as the `github/alertNumber` and `github/alertUrl` properties.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_analysis',\n    description: `Gets a specified code scanning analysis for a repository.\n\nThe default JSON response contains fields that describe the analysis.\nThis includes the Git reference and commit SHA to which the analysis relates,\nthe datetime of the analysis, the name of the code scanning tool,\nand the number of alerts.\n\nThe \\`rules_count\\` field in the default response give the number of rules\nthat were run in the analysis.\nFor very old analyses this data is not available,\nand \\`0\\` is returned in this field.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/sarif+json\\`**: Instead of returning a summary of the analysis, this endpoint returns a subset of the analysis data that was uploaded. The data is formatted as [SARIF version 2.1.0](https://docs.oasis-open.org/sarif/sarif/v2.1.0/cs01/sarif-v2.1.0-cs01.html). It also returns additional data such as the \\`github/alertNumber\\` and \\`github/alertUrl\\` properties.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetAnalysisParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetAnalysis(\n    params: github.CodeScanningGetAnalysisParams\n  ): Promise<github.CodeScanningGetAnalysisResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/analyses/${params.analysis_id}`,\n        {}\n      )\n      .json<github.CodeScanningGetAnalysisResponse>()\n  }\n\n  /**\n * Deletes a specified code scanning analysis from a repository.\n\nYou can delete one analysis at a time.\nTo delete a series of analyses, start with the most recent analysis and work backwards.\nConceptually, the process is similar to the undo function in a text editor.\n\nWhen you list the analyses for a repository,\none or more will be identified as deletable in the response:\n\n```\n\"deletable\": true\n```\n\nAn analysis is deletable when it's the most recent in a set of analyses.\nTypically, a repository will have multiple sets of analyses\nfor each enabled code scanning tool,\nwhere a set is determined by a unique combination of analysis values:\n\n* `ref`\n* `tool`\n* `category`\n\nIf you attempt to delete an analysis that is not the most recent in a set,\nyou'll get a 400 response with the message:\n\n```\nAnalysis specified is not deletable.\n```\n\nThe response from a successful `DELETE` operation provides you with\ntwo alternative URLs for deleting the next analysis in the set:\n`next_analysis_url` and `confirm_delete_url`.\nUse the `next_analysis_url` URL if you want to avoid accidentally deleting the final analysis\nin a set. This is a useful option if you want to preserve at least one analysis\nfor the specified tool in your repository.\nUse the `confirm_delete_url` URL if you are content to remove all analyses for a tool.\nWhen you delete the last analysis in a set, the value of `next_analysis_url` and `confirm_delete_url`\nin the 200 response is `null`.\n\nAs an example of the deletion process,\nlet's imagine that you added a workflow that configured a particular code scanning tool\nto analyze the code in a repository. This tool has added 15 analyses:\n10 on the default branch, and another 5 on a topic branch.\nYou therefore have two separate sets of analyses for this tool.\nYou've now decided that you want to remove all of the analyses for the tool.\nTo do this you must make 15 separate deletion requests.\nTo start, you must find an analysis that's identified as deletable.\nEach set of analyses always has one that's identified as deletable.\nHaving found the deletable analysis for one of the two sets,\ndelete this analysis and then continue deleting the next analysis in the set until they're all deleted.\nThen repeat the process for the second set.\nThe procedure therefore consists of a nested loop:\n\n**Outer loop**:\n* List the analyses for the repository, filtered by tool.\n* Parse this list to find a deletable analysis. If found:\n\n  **Inner loop**:\n  * Delete the identified analysis.\n  * Parse the response for the value of `confirm_delete_url` and, if found, use this in the next iteration.\n\nThe above process assumes that you want to remove all trace of the tool's analyses from the GitHub user interface, for the specified repository, and it therefore uses the `confirm_delete_url` value. Alternatively, you could use the `next_analysis_url` value, which would leave the last analysis in each set undeleted to avoid removing a tool's analysis entirely.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_delete_analysis',\n    description: `Deletes a specified code scanning analysis from a repository.\n\nYou can delete one analysis at a time.\nTo delete a series of analyses, start with the most recent analysis and work backwards.\nConceptually, the process is similar to the undo function in a text editor.\n\nWhen you list the analyses for a repository,\none or more will be identified as deletable in the response:\n\n\\`\\`\\`\n\"deletable\": true\n\\`\\`\\`\n\nAn analysis is deletable when it's the most recent in a set of analyses.\nTypically, a repository will have multiple sets of analyses\nfor each enabled code scanning tool,\nwhere a set is determined by a unique combination of analysis values:\n\n* \\`ref\\`\n* \\`tool\\`\n* \\`category\\`\n\nIf you attempt to delete an analysis that is not the most recent in a set,\nyou'll get a 400 response with the message:\n\n\\`\\`\\`\nAnalysis specified is not deletable.\n\\`\\`\\`\n\nThe response from a successful \\`DELETE\\` operation provides you with\ntwo alternative URLs for deleting the next analysis in the set:\n\\`next_analysis_url\\` and \\`confirm_delete_url\\`.\nUse the \\`next_analysis_url\\` URL if you want to avoid accidentally deleting the final analysis\nin a set. This is a useful option if you want to preserve at least one analysis\nfor the specified tool in your repository.\nUse the \\`confirm_delete_url\\` URL if you are content to remove all analyses for a tool.\nWhen you delete the last analysis in a set, the value of \\`next_analysis_url\\` and \\`confirm_delete_url\\`\nin the 200 response is \\`null\\`.\n\nAs an example of the deletion process,\nlet's imagine that you added a workflow that configured a particular code scanning tool\nto analyze the code in a repository. This tool has added 15 analyses:\n10 on the default branch, and another 5 on a topic branch.\nYou therefore have two separate sets of analyses for this tool.\nYou've now decided that you want to remove all of the analyses for the tool.\nTo do this you must make 15 separate deletion requests.\nTo start, you must find an analysis that's identified as deletable.\nEach set of analyses always has one that's identified as deletable.\nHaving found the deletable analysis for one of the two sets,\ndelete this analysis and then continue deleting the next analysis in the set until they're all deleted.\nThen repeat the process for the second set.\nThe procedure therefore consists of a nested loop:\n\n**Outer loop**:\n* List the analyses for the repository, filtered by tool.\n* Parse this list to find a deletable analysis. If found:\n\n  **Inner loop**:\n  * Delete the identified analysis.\n  * Parse the response for the value of \\`confirm_delete_url\\` and, if found, use this in the next iteration.\n\nThe above process assumes that you want to remove all trace of the tool's analyses from the GitHub user interface, for the specified repository, and it therefore uses the \\`confirm_delete_url\\` value. Alternatively, you could use the \\`next_analysis_url\\` value, which would leave the last analysis in each set undeleted to avoid removing a tool's analysis entirely.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningDeleteAnalysisParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningDeleteAnalysis(\n    params: github.CodeScanningDeleteAnalysisParams\n  ): Promise<github.CodeScanningDeleteAnalysisResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/code-scanning/analyses/${params.analysis_id}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'confirm_delete'))\n        }\n      )\n      .json<github.CodeScanningDeleteAnalysisResponse>()\n  }\n\n  /**\n * Lists the CodeQL databases that are available in a repository.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_list_codeql_databases',\n    description: `Lists the CodeQL databases that are available in a repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningListCodeqlDatabasesParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningListCodeqlDatabases(\n    params: github.CodeScanningListCodeqlDatabasesParams\n  ): Promise<github.CodeScanningListCodeqlDatabasesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/codeql/databases`,\n        {}\n      )\n      .json<github.CodeScanningListCodeqlDatabasesResponse>()\n  }\n\n  /**\n * Gets a CodeQL database for a language in a repository.\n\nBy default this endpoint returns JSON metadata about the CodeQL database. To\ndownload the CodeQL database binary content, set the `Accept` header of the request\nto [`application/zip`](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types), and make sure\nyour HTTP client is configured to follow redirects or use the `Location` header\nto make a second request to get the redirect URL.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_codeql_database',\n    description: `Gets a CodeQL database for a language in a repository.\n\nBy default this endpoint returns JSON metadata about the CodeQL database. To\ndownload the CodeQL database binary content, set the \\`Accept\\` header of the request\nto [\\`application/zip\\`](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types), and make sure\nyour HTTP client is configured to follow redirects or use the \\`Location\\` header\nto make a second request to get the redirect URL.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetCodeqlDatabaseParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetCodeqlDatabase(\n    params: github.CodeScanningGetCodeqlDatabaseParams\n  ): Promise<github.CodeScanningGetCodeqlDatabaseResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/codeql/databases/${params.language}`,\n        {}\n      )\n      .json<github.CodeScanningGetCodeqlDatabaseResponse>()\n  }\n\n  /**\n * Deletes a CodeQL database for a language in a repository.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_delete_codeql_database',\n    description: `Deletes a CodeQL database for a language in a repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningDeleteCodeqlDatabaseParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningDeleteCodeqlDatabase(\n    params: github.CodeScanningDeleteCodeqlDatabaseParams\n  ): Promise<github.CodeScanningDeleteCodeqlDatabaseResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/code-scanning/codeql/databases/${params.language}`,\n        {}\n      )\n      .json<github.CodeScanningDeleteCodeqlDatabaseResponse>()\n  }\n\n  /**\n * Creates a new CodeQL variant analysis, which will run a CodeQL query against one or more repositories.\n\nGet started by learning more about [running CodeQL queries at scale with Multi-Repository Variant Analysis](https://docs.github.com/code-security/codeql-for-vs-code/getting-started-with-codeql-for-vs-code/running-codeql-queries-at-scale-with-multi-repository-variant-analysis).\n\nUse the `owner` and `repo` parameters in the URL to specify the controller repository that\nwill be used for running GitHub Actions workflows and storing the results of the CodeQL variant analysis.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_scanning_create_variant_analysis',\n    description: `Creates a new CodeQL variant analysis, which will run a CodeQL query against one or more repositories.\n\nGet started by learning more about [running CodeQL queries at scale with Multi-Repository Variant Analysis](https://docs.github.com/code-security/codeql-for-vs-code/getting-started-with-codeql-for-vs-code/running-codeql-queries-at-scale-with-multi-repository-variant-analysis).\n\nUse the \\`owner\\` and \\`repo\\` parameters in the URL to specify the controller repository that\nwill be used for running GitHub Actions workflows and storing the results of the CodeQL variant analysis.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.CodeScanningCreateVariantAnalysisParamsSchema as any,\n    tags: ['code-scanning']\n  })\n  async codeScanningCreateVariantAnalysis(\n    params: github.CodeScanningCreateVariantAnalysisParams\n  ): Promise<github.CodeScanningCreateVariantAnalysisResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/code-scanning/codeql/variant-analyses`,\n        {\n          json: params\n        }\n      )\n      .json<github.CodeScanningCreateVariantAnalysisResponse>()\n  }\n\n  /**\n * Gets the summary of a CodeQL variant analysis.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_variant_analysis',\n    description: `Gets the summary of a CodeQL variant analysis.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetVariantAnalysisParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetVariantAnalysis(\n    params: github.CodeScanningGetVariantAnalysisParams\n  ): Promise<github.CodeScanningGetVariantAnalysisResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/codeql/variant-analyses/${params.codeql_variant_analysis_id}`,\n        {}\n      )\n      .json<github.CodeScanningGetVariantAnalysisResponse>()\n  }\n\n  /**\n * Gets the analysis status of a repository in a CodeQL variant analysis.\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_variant_analysis_repo_task',\n    description: `Gets the analysis status of a repository in a CodeQL variant analysis.\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetVariantAnalysisRepoTaskParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetVariantAnalysisRepoTask(\n    params: github.CodeScanningGetVariantAnalysisRepoTaskParams\n  ): Promise<github.CodeScanningGetVariantAnalysisRepoTaskResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/codeql/variant-analyses/${params.codeql_variant_analysis_id}/repos/${params.repo_owner}/${params.repo_name}`,\n        {}\n      )\n      .json<github.CodeScanningGetVariantAnalysisRepoTaskResponse>()\n  }\n\n  /**\n * Gets a code scanning default setup configuration.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_default_setup',\n    description: `Gets a code scanning default setup configuration.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetDefaultSetupParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetDefaultSetup(\n    params: github.CodeScanningGetDefaultSetupParams\n  ): Promise<github.CodeScanningGetDefaultSetupResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/default-setup`,\n        {}\n      )\n      .json<github.CodeScanningGetDefaultSetupResponse>()\n  }\n\n  /**\n * Updates a code scanning default setup configuration.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_update_default_setup',\n    description: `Updates a code scanning default setup configuration.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningUpdateDefaultSetupParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningUpdateDefaultSetup(\n    params: github.CodeScanningUpdateDefaultSetupParams\n  ): Promise<github.CodeScanningUpdateDefaultSetupResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/code-scanning/default-setup`,\n        {\n          json: pick(\n            params,\n            'state',\n            'runner_type',\n            'runner_label',\n            'query_suite',\n            'languages'\n          )\n        }\n      )\n      .json<github.CodeScanningUpdateDefaultSetupResponse>()\n  }\n\n  /**\n * Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. For troubleshooting information, see \"[Troubleshooting SARIF uploads](https://docs.github.com/code-security/code-scanning/troubleshooting-sarif).\"\n\nThere are two places where you can upload code scanning results.\n - If you upload to a pull request, for example `--ref refs/pull/42/merge` or `--ref refs/pull/42/head`, then the results appear as alerts in a pull request check. For more information, see \"[Triaging code scanning alerts in pull requests](/code-security/secure-coding/triaging-code-scanning-alerts-in-pull-requests).\"\n - If you upload to a branch, for example `--ref refs/heads/my-branch`, then the results appear in the **Security** tab for your repository. For more information, see \"[Managing code scanning alerts for your repository](/code-security/secure-coding/managing-code-scanning-alerts-for-your-repository#viewing-the-alerts-for-a-repository).\"\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using `gzip`, and then encode it as a Base64 format string. For example:\n\n```\ngzip -c analysis-data.sarif | base64 -w0\n```\n\nSARIF upload supports a maximum number of entries per the following data objects, and an analysis will be rejected if any of these objects is above its maximum value. For some objects, there are additional values over which the entries will be ignored while keeping the most important entries whenever applicable.\nTo get the most out of your analysis when it includes data above the supported limits, try to optimize the analysis configuration. For example, for the CodeQL tool, identify and remove the most noisy queries. For more information, see \"[SARIF results exceed one or more limits](https://docs.github.com/code-security/code-scanning/troubleshooting-sarif/results-exceed-limit).\"\n\n\n| **SARIF data**                   | **Maximum values** | **Additional limits**                                                            |\n|----------------------------------|:------------------:|----------------------------------------------------------------------------------|\n| Runs per file                    |         20         |                                                                                  |\n| Results per run                  |       25,000       | Only the top 5,000 results will be included, prioritized by severity.            |\n| Rules per run                    |       25,000       |                                                                                  |\n| Tool extensions per run          |        100         |                                                                                  |\n| Thread Flow Locations per result |       10,000       | Only the top 1,000 Thread Flow Locations will be included, using prioritization. |\n| Location per result\t             |       1,000        | Only 100 locations will be included.                                             |\n| Tags per rule\t                   |         20         | Only 10 tags will be included.                                                   |\n\n\nThe `202 Accepted` response includes an `id` value.\nYou can use this ID to check the status of the upload by using it in the `/sarifs/{sarif_id}` endpoint.\nFor more information, see \"[Get information about a SARIF upload](/rest/code-scanning/code-scanning#get-information-about-a-sarif-upload).\"\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n\nThis endpoint is limited to 1,000 requests per hour for each user or app installation calling it.\n */\n  @aiFunction({\n    name: 'github_code_scanning_upload_sarif',\n    description: `Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. For troubleshooting information, see \"[Troubleshooting SARIF uploads](https://docs.github.com/code-security/code-scanning/troubleshooting-sarif).\"\n\nThere are two places where you can upload code scanning results.\n - If you upload to a pull request, for example \\`--ref refs/pull/42/merge\\` or \\`--ref refs/pull/42/head\\`, then the results appear as alerts in a pull request check. For more information, see \"[Triaging code scanning alerts in pull requests](/code-security/secure-coding/triaging-code-scanning-alerts-in-pull-requests).\"\n - If you upload to a branch, for example \\`--ref refs/heads/my-branch\\`, then the results appear in the **Security** tab for your repository. For more information, see \"[Managing code scanning alerts for your repository](/code-security/secure-coding/managing-code-scanning-alerts-for-your-repository#viewing-the-alerts-for-a-repository).\"\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using \\`gzip\\`, and then encode it as a Base64 format string. For example:\n\n\\`\\`\\`\ngzip -c analysis-data.sarif | base64 -w0\n\\`\\`\\`\n\nSARIF upload supports a maximum number of entries per the following data objects, and an analysis will be rejected if any of these objects is above its maximum value. For some objects, there are additional values over which the entries will be ignored while keeping the most important entries whenever applicable.\nTo get the most out of your analysis when it includes data above the supported limits, try to optimize the analysis configuration. For example, for the CodeQL tool, identify and remove the most noisy queries. For more information, see \"[SARIF results exceed one or more limits](https://docs.github.com/code-security/code-scanning/troubleshooting-sarif/results-exceed-limit).\"\n\n\n| **SARIF data**                   | **Maximum values** | **Additional limits**                                                            |\n|----------------------------------|:------------------:|----------------------------------------------------------------------------------|\n| Runs per file                    |         20         |                                                                                  |\n| Results per run                  |       25,000       | Only the top 5,000 results will be included, prioritized by severity.            |\n| Rules per run                    |       25,000       |                                                                                  |\n| Tool extensions per run          |        100         |                                                                                  |\n| Thread Flow Locations per result |       10,000       | Only the top 1,000 Thread Flow Locations will be included, using prioritization. |\n| Location per result\t             |       1,000        | Only 100 locations will be included.                                             |\n| Tags per rule\t                   |         20         | Only 10 tags will be included.                                                   |\n\n\nThe \\`202 Accepted\\` response includes an \\`id\\` value.\nYou can use this ID to check the status of the upload by using it in the \\`/sarifs/{sarif_id}\\` endpoint.\nFor more information, see \"[Get information about a SARIF upload](/rest/code-scanning/code-scanning#get-information-about-a-sarif-upload).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.\n\nThis endpoint is limited to 1,000 requests per hour for each user or app installation calling it.`,\n    inputSchema: github.CodeScanningUploadSarifParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningUploadSarif(\n    params: github.CodeScanningUploadSarifParams\n  ): Promise<github.CodeScanningUploadSarifResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/code-scanning/sarifs`,\n        {\n          json: pick(\n            params,\n            'commit_sha',\n            'ref',\n            'sarif',\n            'checkout_uri',\n            'started_at',\n            'tool_name',\n            'validate'\n          )\n        }\n      )\n      .json<github.CodeScanningUploadSarifResponse>()\n  }\n\n  /**\n * Gets information about a SARIF upload, including the status and the URL of the analysis that was uploaded so that you can retrieve details of the analysis. For more information, see \"[Get a code scanning analysis for a repository](/rest/code-scanning/code-scanning#get-a-code-scanning-analysis-for-a-repository).\"\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint with private or public repositories, or the `public_repo` scope to use this endpoint with only public repositories.\n */\n  @aiFunction({\n    name: 'github_code_scanning_get_sarif',\n    description: `Gets information about a SARIF upload, including the status and the URL of the analysis that was uploaded so that you can retrieve details of the analysis. For more information, see \"[Get a code scanning analysis for a repository](/rest/code-scanning/code-scanning#get-a-code-scanning-analysis-for-a-repository).\"\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint with private or public repositories, or the \\`public_repo\\` scope to use this endpoint with only public repositories.`,\n    inputSchema: github.CodeScanningGetSarifParamsSchema,\n    tags: ['code-scanning']\n  })\n  async codeScanningGetSarif(\n    params: github.CodeScanningGetSarifParams\n  ): Promise<github.CodeScanningGetSarifResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-scanning/sarifs/${params.sarif_id}`,\n        {}\n      )\n      .json<github.CodeScanningGetSarifResponse>()\n  }\n\n  /**\n * Get the code security configuration that manages a repository's code security settings.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_code_security_get_configuration_for_repository',\n    description: `Get the code security configuration that manages a repository's code security settings.\n\nThe authenticated user must be an administrator or security manager for the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.CodeSecurityGetConfigurationForRepositoryParamsSchema,\n    tags: ['code-security']\n  })\n  async codeSecurityGetConfigurationForRepository(\n    params: github.CodeSecurityGetConfigurationForRepositoryParams\n  ): Promise<github.CodeSecurityGetConfigurationForRepositoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/code-security-configuration`,\n        {}\n      )\n      .json<github.CodeSecurityGetConfigurationForRepositoryResponse>()\n  }\n\n  /**\n * List any syntax errors that are detected in the CODEOWNERS\nfile.\n\nFor more information about the correct CODEOWNERS syntax,\nsee \"[About code owners](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners).\".\n */\n  @aiFunction({\n    name: 'github_repos_codeowners_errors',\n    description: `List any syntax errors that are detected in the CODEOWNERS\nfile.\n\nFor more information about the correct CODEOWNERS syntax,\nsee \"[About code owners](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners).\".`,\n    inputSchema: github.ReposCodeownersErrorsParamsSchema,\n    tags: ['repos']\n  })\n  async reposCodeownersErrors(\n    params: github.ReposCodeownersErrorsParams\n  ): Promise<github.ReposCodeownersErrorsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/codeowners/errors`, {\n        searchParams: sanitizeSearchParams(pick(params, 'ref'))\n      })\n      .json<github.ReposCodeownersErrorsResponse>()\n  }\n\n  /**\n * Lists the codespaces associated to a specified repository and the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_in_repository_for_authenticated_user',\n    description: `Lists the codespaces associated to a specified repository and the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesListInRepositoryForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListInRepositoryForAuthenticatedUser(\n    params: github.CodespacesListInRepositoryForAuthenticatedUserParams\n  ): Promise<github.CodespacesListInRepositoryForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/codespaces`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.CodespacesListInRepositoryForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Creates a codespace owned by the authenticated user in the specified repository.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_create_with_repo_for_authenticated_user',\n    description: `Creates a codespace owned by the authenticated user in the specified repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesCreateWithRepoForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesCreateWithRepoForAuthenticatedUser(\n    params: github.CodespacesCreateWithRepoForAuthenticatedUserParams\n  ): Promise<github.CodespacesCreateWithRepoForAuthenticatedUserResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/codespaces`, {\n        json: pick(\n          params,\n          'ref',\n          'location',\n          'geo',\n          'client_ip',\n          'machine',\n          'devcontainer_path',\n          'multi_repo_permissions_opt_out',\n          'working_directory',\n          'idle_timeout_minutes',\n          'display_name',\n          'retention_period_minutes'\n        )\n      })\n      .json<github.CodespacesCreateWithRepoForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists the devcontainer.json files associated with a specified repository and the authenticated user. These files\nspecify launchpoint configurations for codespaces created within the repository.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_devcontainers_in_repository_for_authenticated_user',\n    description: `Lists the devcontainer.json files associated with a specified repository and the authenticated user. These files\nspecify launchpoint configurations for codespaces created within the repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesListDevcontainersInRepositoryForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListDevcontainersInRepositoryForAuthenticatedUser(\n    params: github.CodespacesListDevcontainersInRepositoryForAuthenticatedUserParams\n  ): Promise<github.CodespacesListDevcontainersInRepositoryForAuthenticatedUserResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/codespaces/devcontainers`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.CodespacesListDevcontainersInRepositoryForAuthenticatedUserResponse>()\n  }\n\n  /**\n * List the machine types available for a given repository based on its configuration.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_repo_machines_for_authenticated_user',\n    description: `List the machine types available for a given repository based on its configuration.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesRepoMachinesForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesRepoMachinesForAuthenticatedUser(\n    params: github.CodespacesRepoMachinesForAuthenticatedUserParams\n  ): Promise<github.CodespacesRepoMachinesForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/codespaces/machines`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'location', 'client_ip', 'ref')\n        )\n      })\n      .json<github.CodespacesRepoMachinesForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets the default attributes for codespaces created by the user with the repository.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_pre_flight_with_repo_for_authenticated_user',\n    description: `Gets the default attributes for codespaces created by the user with the repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesPreFlightWithRepoForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesPreFlightWithRepoForAuthenticatedUser(\n    params: github.CodespacesPreFlightWithRepoForAuthenticatedUserParams\n  ): Promise<github.CodespacesPreFlightWithRepoForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/codespaces/new`, {\n        searchParams: sanitizeSearchParams(pick(params, 'ref', 'client_ip'))\n      })\n      .json<github.CodespacesPreFlightWithRepoForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Checks whether the permissions defined by a given devcontainer configuration have been accepted by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_check_permissions_for_devcontainer',\n    description: `Checks whether the permissions defined by a given devcontainer configuration have been accepted by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesCheckPermissionsForDevcontainerParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesCheckPermissionsForDevcontainer(\n    params: github.CodespacesCheckPermissionsForDevcontainerParams\n  ): Promise<github.CodespacesCheckPermissionsForDevcontainerResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/codespaces/permissions_check`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'ref', 'devcontainer_path')\n          )\n        }\n      )\n      .json<github.CodespacesCheckPermissionsForDevcontainerResponse>()\n  }\n\n  /**\n * Lists all development environment secrets available in a repository without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_repo_secrets',\n    description: `Lists all development environment secrets available in a repository without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesListRepoSecretsParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListRepoSecrets(\n    params: github.CodespacesListRepoSecretsParams\n  ): Promise<github.CodespacesListRepoSecretsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/codespaces/secrets`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.CodespacesListRepoSecretsResponse>()\n  }\n\n  /**\n * Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nIf the repository is private, OAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_repo_public_key',\n    description: `Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets.\n\nIf the repository is private, OAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetRepoPublicKeyParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetRepoPublicKey(\n    params: github.CodespacesGetRepoPublicKeyParams\n  ): Promise<github.CodespacesGetRepoPublicKeyResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/codespaces/secrets/public-key`,\n        {}\n      )\n      .json<github.CodespacesGetRepoPublicKeyResponse>()\n  }\n\n  /**\n * Gets a single repository development environment secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_repo_secret',\n    description: `Gets a single repository development environment secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetRepoSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetRepoSecret(\n    params: github.CodespacesGetRepoSecretParams\n  ): Promise<github.CodespacesGetRepoSecretResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/codespaces/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.CodespacesGetRepoSecretResponse>()\n  }\n\n  /**\n * Creates or updates a repository development environment secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint. The associated user must be a repository admin.\n */\n  @aiFunction({\n    name: 'github_codespaces_create_or_update_repo_secret',\n    description: `Creates or updates a repository development environment secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint. The associated user must be a repository admin.`,\n    inputSchema: github.CodespacesCreateOrUpdateRepoSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesCreateOrUpdateRepoSecret(\n    params: github.CodespacesCreateOrUpdateRepoSecretParams\n  ): Promise<github.CodespacesCreateOrUpdateRepoSecretResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/codespaces/secrets/${params.secret_name}`,\n        {\n          json: pick(params, 'encrypted_value', 'key_id')\n        }\n      )\n      .json<github.CodespacesCreateOrUpdateRepoSecretResponse>()\n  }\n\n  /**\n * Deletes a development environment secret in a repository using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint. The associated user must be a repository admin.\n */\n  @aiFunction({\n    name: 'github_codespaces_delete_repo_secret',\n    description: `Deletes a development environment secret in a repository using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint. The associated user must be a repository admin.`,\n    inputSchema: github.CodespacesDeleteRepoSecretParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesDeleteRepoSecret(\n    params: github.CodespacesDeleteRepoSecretParams\n  ): Promise<github.CodespacesDeleteRepoSecretResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/codespaces/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.CodespacesDeleteRepoSecretResponse>()\n  }\n\n  /**\n * For organization-owned repositories, the list of collaborators includes outside collaborators, organization members that are direct collaborators, organization members with access through team memberships, organization members with access through default organization permissions, and organization owners.\nOrganization members with write, maintain, or admin privileges on the organization-owned repository can use this endpoint.\n\nTeam members will include the members of child teams.\n\nThe authenticated user must have push access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `read:org` and `repo` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_list_collaborators',\n    description: `For organization-owned repositories, the list of collaborators includes outside collaborators, organization members that are direct collaborators, organization members with access through team memberships, organization members with access through default organization permissions, and organization owners.\nOrganization members with write, maintain, or admin privileges on the organization-owned repository can use this endpoint.\n\nTeam members will include the members of child teams.\n\nThe authenticated user must have push access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:org\\` and \\`repo\\` scopes to use this endpoint.`,\n    inputSchema: github.ReposListCollaboratorsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListCollaborators(\n    params: github.ReposListCollaboratorsParams\n  ): Promise<github.ReposListCollaboratorsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/collaborators`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'affiliation', 'permission', 'per_page', 'page')\n        )\n      })\n      .json<github.ReposListCollaboratorsResponse>()\n  }\n\n  /**\n * For organization-owned repositories, the list of collaborators includes outside collaborators, organization members that are direct collaborators, organization members with access through team memberships, organization members with access through default organization permissions, and organization owners.\n\nTeam members will include the members of child teams.\n\nThe authenticated user must have push access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `read:org` and `repo` scopes to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_check_collaborator',\n    description: `For organization-owned repositories, the list of collaborators includes outside collaborators, organization members that are direct collaborators, organization members with access through team memberships, organization members with access through default organization permissions, and organization owners.\n\nTeam members will include the members of child teams.\n\nThe authenticated user must have push access to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:org\\` and \\`repo\\` scopes to use this endpoint.`,\n    inputSchema: github.ReposCheckCollaboratorParamsSchema,\n    tags: ['repos']\n  })\n  async reposCheckCollaborator(\n    params: github.ReposCheckCollaboratorParams\n  ): Promise<github.ReposCheckCollaboratorResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/collaborators/${params.username}`,\n        {}\n      )\n      .json<github.ReposCheckCollaboratorResponse>()\n  }\n\n  /**\n * This endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nAdding an outside collaborator may be restricted by enterprise administrators. For more information, see \"[Enforcing repository management policies in your enterprise](https://docs.github.com/admin/policies/enforcing-policies-for-your-enterprise/enforcing-repository-management-policies-in-your-enterprise#enforcing-a-policy-for-inviting-outside-collaborators-to-repositories).\"\n\nFor more information on permission levels, see \"[Repository permission levels for an organization](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization#permission-levels-for-repositories-owned-by-an-organization)\". There are restrictions on which permissions can be granted to organization members when an organization base role is in place. In this case, the permission being given must be equal to or higher than the org base permission. Otherwise, the request will fail with:\n\n```\nCannot assign {member} permission of {role name}\n```\n\nNote that, if you choose not to pass any parameters, you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"\n\nThe invitee will receive a notification that they have been invited to the repository, which they must accept or decline. They may do this via the notifications page, the email they receive, or by using the [API](https://docs.github.com/rest/collaborators/invitations).\n\n**Updating an existing collaborator's permission level**\n\nThe endpoint can also be used to change the permissions of an existing collaborator without first removing and re-adding the collaborator. To change the permissions, use the same endpoint and pass a different `permission` parameter. The response will be a `204`, with no other indication that the permission level changed.\n\n**Rate limits**\n\nYou are limited to sending 50 invitations to a repository per 24 hour period. Note there is no limit if you are inviting organization members to an organization repository.\n */\n  @aiFunction({\n    name: 'github_repos_add_collaborator',\n    description: `This endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nAdding an outside collaborator may be restricted by enterprise administrators. For more information, see \"[Enforcing repository management policies in your enterprise](https://docs.github.com/admin/policies/enforcing-policies-for-your-enterprise/enforcing-repository-management-policies-in-your-enterprise#enforcing-a-policy-for-inviting-outside-collaborators-to-repositories).\"\n\nFor more information on permission levels, see \"[Repository permission levels for an organization](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization#permission-levels-for-repositories-owned-by-an-organization)\". There are restrictions on which permissions can be granted to organization members when an organization base role is in place. In this case, the permission being given must be equal to or higher than the org base permission. Otherwise, the request will fail with:\n\n\\`\\`\\`\nCannot assign {member} permission of {role name}\n\\`\\`\\`\n\nNote that, if you choose not to pass any parameters, you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"\n\nThe invitee will receive a notification that they have been invited to the repository, which they must accept or decline. They may do this via the notifications page, the email they receive, or by using the [API](https://docs.github.com/rest/collaborators/invitations).\n\n**Updating an existing collaborator's permission level**\n\nThe endpoint can also be used to change the permissions of an existing collaborator without first removing and re-adding the collaborator. To change the permissions, use the same endpoint and pass a different \\`permission\\` parameter. The response will be a \\`204\\`, with no other indication that the permission level changed.\n\n**Rate limits**\n\nYou are limited to sending 50 invitations to a repository per 24 hour period. Note there is no limit if you are inviting organization members to an organization repository.`,\n    inputSchema: github.ReposAddCollaboratorParamsSchema,\n    tags: ['repos']\n  })\n  async reposAddCollaborator(\n    params: github.ReposAddCollaboratorParams\n  ): Promise<github.ReposAddCollaboratorResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/collaborators/${params.username}`,\n        {\n          json: pick(params, 'permission')\n        }\n      )\n      .json<github.ReposAddCollaboratorResponse>()\n  }\n\n  /**\n * Removes a collaborator from a repository.\n\nTo use this endpoint, the authenticated user must either be an administrator of the repository or target themselves for removal.\n\nThis endpoint also:\n- Cancels any outstanding invitations\n- Unasigns the user from any issues\n- Removes access to organization projects if the user is not an organization member and is not a collaborator on any other organization repositories.\n- Unstars the repository\n- Updates access permissions to packages\n\nRemoving a user as a collaborator has the following effects on forks:\n - If the user had access to a fork through their membership to this repository, the user will also be removed from the fork.\n - If the user had their own fork of the repository, the fork will be deleted.\n - If the user still has read access to the repository, open pull requests by this user from a fork will be denied.\n\n> [!NOTE]\n> A user can still have access to the repository through organization permissions like base repository permissions.\n\nAlthough the API responds immediately, the additional permission updates might take some extra time to complete in the background.\n\nFor more information on fork permissions, see \"[About permissions and visibility of forks](https://docs.github.com/pull-requests/collaborating-with-pull-requests/working-with-forks/about-permissions-and-visibility-of-forks)\".\n */\n  @aiFunction({\n    name: 'github_repos_remove_collaborator',\n    description: `Removes a collaborator from a repository.\n\nTo use this endpoint, the authenticated user must either be an administrator of the repository or target themselves for removal.\n\nThis endpoint also:\n- Cancels any outstanding invitations\n- Unasigns the user from any issues\n- Removes access to organization projects if the user is not an organization member and is not a collaborator on any other organization repositories.\n- Unstars the repository\n- Updates access permissions to packages\n\nRemoving a user as a collaborator has the following effects on forks:\n - If the user had access to a fork through their membership to this repository, the user will also be removed from the fork.\n - If the user had their own fork of the repository, the fork will be deleted.\n - If the user still has read access to the repository, open pull requests by this user from a fork will be denied.\n\n> [!NOTE]\n> A user can still have access to the repository through organization permissions like base repository permissions.\n\nAlthough the API responds immediately, the additional permission updates might take some extra time to complete in the background.\n\nFor more information on fork permissions, see \"[About permissions and visibility of forks](https://docs.github.com/pull-requests/collaborating-with-pull-requests/working-with-forks/about-permissions-and-visibility-of-forks)\".`,\n    inputSchema: github.ReposRemoveCollaboratorParamsSchema,\n    tags: ['repos']\n  })\n  async reposRemoveCollaborator(\n    params: github.ReposRemoveCollaboratorParams\n  ): Promise<github.ReposRemoveCollaboratorResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/collaborators/${params.username}`,\n        {}\n      )\n      .json<github.ReposRemoveCollaboratorResponse>()\n  }\n\n  /**\n * Checks the repository permission of a collaborator. The possible repository\npermissions are `admin`, `write`, `read`, and `none`.\n\n*Note*: The `permission` attribute provides the legacy base roles of `admin`, `write`, `read`, and `none`, where the\n`maintain` role is mapped to `write` and the `triage` role is mapped to `read`. To determine the role assigned to the\ncollaborator, see the `role_name` attribute, which will provide the full role name, including custom roles. The\n`permissions` hash can also be used to determine which base level of access the collaborator has to the repository.\n */\n  @aiFunction({\n    name: 'github_repos_get_collaborator_permission_level',\n    description: `Checks the repository permission of a collaborator. The possible repository\npermissions are \\`admin\\`, \\`write\\`, \\`read\\`, and \\`none\\`.\n\n*Note*: The \\`permission\\` attribute provides the legacy base roles of \\`admin\\`, \\`write\\`, \\`read\\`, and \\`none\\`, where the\n\\`maintain\\` role is mapped to \\`write\\` and the \\`triage\\` role is mapped to \\`read\\`. To determine the role assigned to the\ncollaborator, see the \\`role_name\\` attribute, which will provide the full role name, including custom roles. The\n\\`permissions\\` hash can also be used to determine which base level of access the collaborator has to the repository.`,\n    inputSchema: github.ReposGetCollaboratorPermissionLevelParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCollaboratorPermissionLevel(\n    params: github.ReposGetCollaboratorPermissionLevelParams\n  ): Promise<github.ReposGetCollaboratorPermissionLevelResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/collaborators/${params.username}/permission`,\n        {}\n      )\n      .json<github.ReposGetCollaboratorPermissionLevelResponse>()\n  }\n\n  /**\n * Lists the commit comments for a specified repository. Comments are ordered by ascending ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_repos_list_commit_comments_for_repo',\n    description: `Lists the commit comments for a specified repository. Comments are ordered by ascending ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.ReposListCommitCommentsForRepoParamsSchema,\n    tags: ['repos']\n  })\n  async reposListCommitCommentsForRepo(\n    params: github.ReposListCommitCommentsForRepoParams\n  ): Promise<github.ReposListCommitCommentsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/comments`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListCommitCommentsForRepoResponse>()\n  }\n\n  /**\n * Gets a specified commit comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_repos_get_commit_comment',\n    description: `Gets a specified commit comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.ReposGetCommitCommentParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCommitComment(\n    params: github.ReposGetCommitCommentParams\n  ): Promise<github.ReposGetCommitCommentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/comments/${params.comment_id}`,\n        {}\n      )\n      .json<github.ReposGetCommitCommentResponse>()\n  }\n\n  /**\n   * Delete a commit comment.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_commit_comment',\n    description: `Delete a commit comment.`,\n    inputSchema: github.ReposDeleteCommitCommentParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteCommitComment(\n    params: github.ReposDeleteCommitCommentParams\n  ): Promise<github.ReposDeleteCommitCommentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/comments/${params.comment_id}`,\n        {}\n      )\n      .json<github.ReposDeleteCommitCommentResponse>()\n  }\n\n  /**\n * Updates the contents of a specified commit comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_repos_update_commit_comment',\n    description: `Updates the contents of a specified commit comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.ReposUpdateCommitCommentParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateCommitComment(\n    params: github.ReposUpdateCommitCommentParams\n  ): Promise<github.ReposUpdateCommitCommentResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/comments/${params.comment_id}`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.ReposUpdateCommitCommentResponse>()\n  }\n\n  /**\n   * List the reactions to a [commit comment](https://docs.github.com/rest/commits/comments#get-a-commit-comment).\n   */\n  @aiFunction({\n    name: 'github_reactions_list_for_commit_comment',\n    description: `List the reactions to a [commit comment](https://docs.github.com/rest/commits/comments#get-a-commit-comment).`,\n    inputSchema: github.ReactionsListForCommitCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForCommitComment(\n    params: github.ReactionsListForCommitCommentParams\n  ): Promise<github.ReactionsListForCommitCommentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/comments/${params.comment_id}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForCommitCommentResponse>()\n  }\n\n  /**\n   * Create a reaction to a [commit comment](https://docs.github.com/rest/commits/comments#get-a-commit-comment). A response with an HTTP `200` status means that you already added the reaction type to this commit comment.\n   */\n  @aiFunction({\n    name: 'github_reactions_create_for_commit_comment',\n    description: `Create a reaction to a [commit comment](https://docs.github.com/rest/commits/comments#get-a-commit-comment). A response with an HTTP \\`200\\` status means that you already added the reaction type to this commit comment.`,\n    inputSchema: github.ReactionsCreateForCommitCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForCommitComment(\n    params: github.ReactionsCreateForCommitCommentParams\n  ): Promise<github.ReactionsCreateForCommitCommentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/comments/${params.comment_id}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForCommitCommentResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> You can also specify a repository by `repository_id` using the route `DELETE /repositories/:repository_id/comments/:comment_id/reactions/:reaction_id`.\n\nDelete a reaction to a [commit comment](https://docs.github.com/rest/commits/comments#get-a-commit-comment).\n */\n  @aiFunction({\n    name: 'github_reactions_delete_for_commit_comment',\n    description: `> [!NOTE]\n> You can also specify a repository by \\`repository_id\\` using the route \\`DELETE /repositories/:repository_id/comments/:comment_id/reactions/:reaction_id\\`.\n\nDelete a reaction to a [commit comment](https://docs.github.com/rest/commits/comments#get-a-commit-comment).`,\n    inputSchema: github.ReactionsDeleteForCommitCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsDeleteForCommitComment(\n    params: github.ReactionsDeleteForCommitCommentParams\n  ): Promise<github.ReactionsDeleteForCommitCommentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/comments/${params.comment_id}/reactions/${params.reaction_id}`,\n        {}\n      )\n      .json<github.ReactionsDeleteForCommitCommentResponse>()\n  }\n\n  /**\n * **Signature verification object**\n\nThe response will include a `verification` object that describes the result of verifying the commit's signature. The following fields are included in the `verification` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| `verified` | `boolean` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| `reason` | `string` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| `signature` | `string` | The signature that was extracted from the commit. |\n| `payload` | `string` | The value that was signed. |\n| `verified_at` | `string` | The date the signature was verified by GitHub. |\n\nThese are the possible values for `reason` in the `verification` object:\n\n| Value | Description |\n| ----- | ----------- |\n| `expired_key` | The key that made the signature is expired. |\n| `not_signing_key` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| `gpgverify_error` | There was an error communicating with the signature verification service. |\n| `gpgverify_unavailable` | The signature verification service is currently unavailable. |\n| `unsigned` | The object does not include a signature. |\n| `unknown_signature_type` | A non-PGP signature was found in the commit. |\n| `no_user` | No user was associated with the `committer` email address in the commit. |\n| `unverified_email` | The `committer` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| `bad_email` | The `committer` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| `unknown_key` | The key that made the signature has not been registered with any user's account. |\n| `malformed_signature` | There was an error parsing the signature. |\n| `invalid` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| `valid` | None of the above errors applied, so the signature is considered to be verified. |.\n */\n  @aiFunction({\n    name: 'github_repos_list_commits',\n    description: `**Signature verification object**\n\nThe response will include a \\`verification\\` object that describes the result of verifying the commit's signature. The following fields are included in the \\`verification\\` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| \\`verified\\` | \\`boolean\\` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| \\`reason\\` | \\`string\\` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| \\`signature\\` | \\`string\\` | The signature that was extracted from the commit. |\n| \\`payload\\` | \\`string\\` | The value that was signed. |\n| \\`verified_at\\` | \\`string\\` | The date the signature was verified by GitHub. |\n\nThese are the possible values for \\`reason\\` in the \\`verification\\` object:\n\n| Value | Description |\n| ----- | ----------- |\n| \\`expired_key\\` | The key that made the signature is expired. |\n| \\`not_signing_key\\` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| \\`gpgverify_error\\` | There was an error communicating with the signature verification service. |\n| \\`gpgverify_unavailable\\` | The signature verification service is currently unavailable. |\n| \\`unsigned\\` | The object does not include a signature. |\n| \\`unknown_signature_type\\` | A non-PGP signature was found in the commit. |\n| \\`no_user\\` | No user was associated with the \\`committer\\` email address in the commit. |\n| \\`unverified_email\\` | The \\`committer\\` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| \\`bad_email\\` | The \\`committer\\` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| \\`unknown_key\\` | The key that made the signature has not been registered with any user's account. |\n| \\`malformed_signature\\` | There was an error parsing the signature. |\n| \\`invalid\\` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| \\`valid\\` | None of the above errors applied, so the signature is considered to be verified. |.`,\n    inputSchema: github.ReposListCommitsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListCommits(\n    params: github.ReposListCommitsParams\n  ): Promise<github.ReposListCommitsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/commits`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'sha',\n            'path',\n            'author',\n            'committer',\n            'since',\n            'until',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.ReposListCommitsResponse>()\n  }\n\n  /**\n * Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReturns all branches where the given commit SHA is the HEAD, or latest commit for the branch.\n */\n  @aiFunction({\n    name: 'github_repos_list_branches_for_head_commit',\n    description: `Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nReturns all branches where the given commit SHA is the HEAD, or latest commit for the branch.`,\n    inputSchema: github.ReposListBranchesForHeadCommitParamsSchema,\n    tags: ['repos']\n  })\n  async reposListBranchesForHeadCommit(\n    params: github.ReposListBranchesForHeadCommitParams\n  ): Promise<github.ReposListBranchesForHeadCommitResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.commit_sha}/branches-where-head`,\n        {}\n      )\n      .json<github.ReposListBranchesForHeadCommitResponse>()\n  }\n\n  /**\n * Lists the comments for a specified commit.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_repos_list_comments_for_commit',\n    description: `Lists the comments for a specified commit.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.ReposListCommentsForCommitParamsSchema,\n    tags: ['repos']\n  })\n  async reposListCommentsForCommit(\n    params: github.ReposListCommentsForCommitParams\n  ): Promise<github.ReposListCommentsForCommitResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.commit_sha}/comments`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposListCommentsForCommitResponse>()\n  }\n\n  /**\n * Create a comment for a commit using its `:commit_sha`.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_repos_create_commit_comment',\n    description: `Create a comment for a commit using its \\`:commit_sha\\`.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.ReposCreateCommitCommentParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateCommitComment(\n    params: github.ReposCreateCommitCommentParams\n  ): Promise<github.ReposCreateCommitCommentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/commits/${params.commit_sha}/comments`,\n        {\n          json: pick(params, 'body', 'path', 'position', 'line')\n        }\n      )\n      .json<github.ReposCreateCommitCommentResponse>()\n  }\n\n  /**\n * Lists the merged pull request that introduced the commit to the repository. If the commit is not present in the default branch, will only return open pull requests associated with the commit.\n\nTo list the open or merged pull requests associated with a branch, you can set the `commit_sha` parameter to the branch name.\n */\n  @aiFunction({\n    name: 'github_repos_list_pull_requests_associated_with_commit',\n    description: `Lists the merged pull request that introduced the commit to the repository. If the commit is not present in the default branch, will only return open pull requests associated with the commit.\n\nTo list the open or merged pull requests associated with a branch, you can set the \\`commit_sha\\` parameter to the branch name.`,\n    inputSchema: github.ReposListPullRequestsAssociatedWithCommitParamsSchema,\n    tags: ['repos']\n  })\n  async reposListPullRequestsAssociatedWithCommit(\n    params: github.ReposListPullRequestsAssociatedWithCommitParams\n  ): Promise<github.ReposListPullRequestsAssociatedWithCommitResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.commit_sha}/pulls`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposListPullRequestsAssociatedWithCommitResponse>()\n  }\n\n  /**\n * Returns the contents of a single commit reference. You must have `read` access for the repository to use this endpoint.\n\n> [!NOTE]\n> If there are more than 300 files in the commit diff and the default JSON media type is requested, the response will include pagination link headers for the remaining files, up to a limit of 3000 files. Each page contains the static commit information, and the only changes are to the file listing.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\" Pagination query parameters are not supported for these media types.\n\n- **`application/vnd.github.diff`**: Returns the diff of the commit. Larger diffs may time out and return a 5xx status code.\n- **`application/vnd.github.patch`**: Returns the patch of the commit. Diffs with binary data will have no `patch` property. Larger diffs may time out and return a 5xx status code.\n- **`application/vnd.github.sha`**: Returns the commit's SHA-1 hash. You can use this endpoint to check if a remote reference's SHA-1 hash is the same as your local reference's SHA-1 hash by providing the local SHA-1 reference as the ETag.\n\n**Signature verification object**\n\nThe response will include a `verification` object that describes the result of verifying the commit's signature. The following fields are included in the `verification` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| `verified` | `boolean` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| `reason` | `string` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| `signature` | `string` | The signature that was extracted from the commit. |\n| `payload` | `string` | The value that was signed. |\n| `verified_at` | `string` | The date the signature was verified by GitHub. |\n\nThese are the possible values for `reason` in the `verification` object:\n\n| Value | Description |\n| ----- | ----------- |\n| `expired_key` | The key that made the signature is expired. |\n| `not_signing_key` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| `gpgverify_error` | There was an error communicating with the signature verification service. |\n| `gpgverify_unavailable` | The signature verification service is currently unavailable. |\n| `unsigned` | The object does not include a signature. |\n| `unknown_signature_type` | A non-PGP signature was found in the commit. |\n| `no_user` | No user was associated with the `committer` email address in the commit. |\n| `unverified_email` | The `committer` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| `bad_email` | The `committer` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| `unknown_key` | The key that made the signature has not been registered with any user's account. |\n| `malformed_signature` | There was an error parsing the signature. |\n| `invalid` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| `valid` | None of the above errors applied, so the signature is considered to be verified. |.\n */\n  @aiFunction({\n    name: 'github_repos_get_commit',\n    description: `Returns the contents of a single commit reference. You must have \\`read\\` access for the repository to use this endpoint.\n\n> [!NOTE]\n> If there are more than 300 files in the commit diff and the default JSON media type is requested, the response will include pagination link headers for the remaining files, up to a limit of 3000 files. Each page contains the static commit information, and the only changes are to the file listing.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\" Pagination query parameters are not supported for these media types.\n\n- **\\`application/vnd.github.diff\\`**: Returns the diff of the commit. Larger diffs may time out and return a 5xx status code.\n- **\\`application/vnd.github.patch\\`**: Returns the patch of the commit. Diffs with binary data will have no \\`patch\\` property. Larger diffs may time out and return a 5xx status code.\n- **\\`application/vnd.github.sha\\`**: Returns the commit's SHA-1 hash. You can use this endpoint to check if a remote reference's SHA-1 hash is the same as your local reference's SHA-1 hash by providing the local SHA-1 reference as the ETag.\n\n**Signature verification object**\n\nThe response will include a \\`verification\\` object that describes the result of verifying the commit's signature. The following fields are included in the \\`verification\\` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| \\`verified\\` | \\`boolean\\` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| \\`reason\\` | \\`string\\` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| \\`signature\\` | \\`string\\` | The signature that was extracted from the commit. |\n| \\`payload\\` | \\`string\\` | The value that was signed. |\n| \\`verified_at\\` | \\`string\\` | The date the signature was verified by GitHub. |\n\nThese are the possible values for \\`reason\\` in the \\`verification\\` object:\n\n| Value | Description |\n| ----- | ----------- |\n| \\`expired_key\\` | The key that made the signature is expired. |\n| \\`not_signing_key\\` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| \\`gpgverify_error\\` | There was an error communicating with the signature verification service. |\n| \\`gpgverify_unavailable\\` | The signature verification service is currently unavailable. |\n| \\`unsigned\\` | The object does not include a signature. |\n| \\`unknown_signature_type\\` | A non-PGP signature was found in the commit. |\n| \\`no_user\\` | No user was associated with the \\`committer\\` email address in the commit. |\n| \\`unverified_email\\` | The \\`committer\\` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| \\`bad_email\\` | The \\`committer\\` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| \\`unknown_key\\` | The key that made the signature has not been registered with any user's account. |\n| \\`malformed_signature\\` | There was an error parsing the signature. |\n| \\`invalid\\` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| \\`valid\\` | None of the above errors applied, so the signature is considered to be verified. |.`,\n    inputSchema: github.ReposGetCommitParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCommit(\n    params: github.ReposGetCommitParams\n  ): Promise<github.ReposGetCommitResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.ref}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.ReposGetCommitResponse>()\n  }\n\n  /**\n * Lists check runs for a commit ref. The `ref` can be a SHA, branch name, or a tag name.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array.\n\nIf there are more than 1000 check suites on a single git reference, this endpoint will limit check runs to the 1000 most recent check suites. To iterate over all possible check runs, use the [List check suites for a Git reference](https://docs.github.com/rest/reference/checks#list-check-suites-for-a-git-reference) endpoint and provide the `check_suite_id` parameter to the [List check runs in a check suite](https://docs.github.com/rest/reference/checks#list-check-runs-in-a-check-suite) endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint on a private repository.\n */\n  @aiFunction({\n    name: 'github_checks_list_for_ref',\n    description: `Lists check runs for a commit ref. The \\`ref\\` can be a SHA, branch name, or a tag name.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array.\n\nIf there are more than 1000 check suites on a single git reference, this endpoint will limit check runs to the 1000 most recent check suites. To iterate over all possible check runs, use the [List check suites for a Git reference](https://docs.github.com/rest/reference/checks#list-check-suites-for-a-git-reference) endpoint and provide the \\`check_suite_id\\` parameter to the [List check runs in a check suite](https://docs.github.com/rest/reference/checks#list-check-runs-in-a-check-suite) endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint on a private repository.`,\n    inputSchema: github.ChecksListForRefParamsSchema,\n    tags: ['checks']\n  })\n  async checksListForRef(\n    params: github.ChecksListForRefParams\n  ): Promise<github.ChecksListForRefResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.ref}/check-runs`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'check_name',\n              'status',\n              'filter',\n              'per_page',\n              'page',\n              'app_id'\n            )\n          )\n        }\n      )\n      .json<github.ChecksListForRefResponse>()\n  }\n\n  /**\n * Lists check suites for a commit `ref`. The `ref` can be a SHA, branch name, or a tag name.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty `pull_requests` array and a `null` value for `head_branch`.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint on a private repository.\n */\n  @aiFunction({\n    name: 'github_checks_list_suites_for_ref',\n    description: `Lists check suites for a commit \\`ref\\`. The \\`ref\\` can be a SHA, branch name, or a tag name.\n\n> [!NOTE]\n> The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty \\`pull_requests\\` array and a \\`null\\` value for \\`head_branch\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint on a private repository.`,\n    inputSchema: github.ChecksListSuitesForRefParamsSchema,\n    tags: ['checks']\n  })\n  async checksListSuitesForRef(\n    params: github.ChecksListSuitesForRefParams\n  ): Promise<github.ChecksListSuitesForRefResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.ref}/check-suites`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'app_id', 'check_name', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ChecksListSuitesForRefResponse>()\n  }\n\n  /**\n * Users with pull access in a repository can access a combined view of commit statuses for a given ref. The ref can be a SHA, a branch name, or a tag name.\n\n\nAdditionally, a combined `state` is returned. The `state` is one of:\n\n*   **failure** if any of the contexts report as `error` or `failure`\n*   **pending** if there are no statuses or a context is `pending`\n*   **success** if the latest status for all contexts is `success`.\n */\n  @aiFunction({\n    name: 'github_repos_get_combined_status_for_ref',\n    description: `Users with pull access in a repository can access a combined view of commit statuses for a given ref. The ref can be a SHA, a branch name, or a tag name.\n\n\nAdditionally, a combined \\`state\\` is returned. The \\`state\\` is one of:\n\n*   **failure** if any of the contexts report as \\`error\\` or \\`failure\\`\n*   **pending** if there are no statuses or a context is \\`pending\\`\n*   **success** if the latest status for all contexts is \\`success\\`.`,\n    inputSchema: github.ReposGetCombinedStatusForRefParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCombinedStatusForRef(\n    params: github.ReposGetCombinedStatusForRefParams\n  ): Promise<github.ReposGetCombinedStatusForRefResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.ref}/status`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposGetCombinedStatusForRefResponse>()\n  }\n\n  /**\n * Users with pull access in a repository can view commit statuses for a given ref. The ref can be a SHA, a branch name, or a tag name. Statuses are returned in reverse chronological order. The first status in the list will be the latest one.\n\nThis resource is also available via a legacy route: `GET /repos/:owner/:repo/statuses/:ref`.\n */\n  @aiFunction({\n    name: 'github_repos_list_commit_statuses_for_ref',\n    description: `Users with pull access in a repository can view commit statuses for a given ref. The ref can be a SHA, a branch name, or a tag name. Statuses are returned in reverse chronological order. The first status in the list will be the latest one.\n\nThis resource is also available via a legacy route: \\`GET /repos/:owner/:repo/statuses/:ref\\`.`,\n    inputSchema: github.ReposListCommitStatusesForRefParamsSchema,\n    tags: ['repos']\n  })\n  async reposListCommitStatusesForRef(\n    params: github.ReposListCommitStatusesForRefParams\n  ): Promise<github.ReposListCommitStatusesForRefResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/commits/${params.ref}/statuses`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposListCommitStatusesForRefResponse>()\n  }\n\n  /**\n * Returns all community profile metrics for a repository. The repository cannot be a fork.\n\nThe returned metrics include an overall health score, the repository description, the presence of documentation, the\ndetected code of conduct, the detected license, and the presence of ISSUE\\_TEMPLATE, PULL\\_REQUEST\\_TEMPLATE,\nREADME, and CONTRIBUTING files.\n\nThe `health_percentage` score is defined as a percentage of how many of\nthe recommended community health files are present. For more information, see\n\"[About community profiles for public repositories](https://docs.github.com/communities/setting-up-your-project-for-healthy-contributions/about-community-profiles-for-public-repositories).\"\n\n`content_reports_enabled` is only returned for organization-owned repositories.\n */\n  @aiFunction({\n    name: 'github_repos_get_community_profile_metrics',\n    description: `Returns all community profile metrics for a repository. The repository cannot be a fork.\n\nThe returned metrics include an overall health score, the repository description, the presence of documentation, the\ndetected code of conduct, the detected license, and the presence of ISSUE\\_TEMPLATE, PULL\\_REQUEST\\_TEMPLATE,\nREADME, and CONTRIBUTING files.\n\nThe \\`health_percentage\\` score is defined as a percentage of how many of\nthe recommended community health files are present. For more information, see\n\"[About community profiles for public repositories](https://docs.github.com/communities/setting-up-your-project-for-healthy-contributions/about-community-profiles-for-public-repositories).\"\n\n\\`content_reports_enabled\\` is only returned for organization-owned repositories.`,\n    inputSchema: github.ReposGetCommunityProfileMetricsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCommunityProfileMetrics(\n    params: github.ReposGetCommunityProfileMetricsParams\n  ): Promise<github.ReposGetCommunityProfileMetricsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/community/profile`, {})\n      .json<github.ReposGetCommunityProfileMetricsResponse>()\n  }\n\n  /**\n * Compares two commits against one another. You can compare refs (branches or tags) and commit SHAs in the same repository, or you can compare refs and commit SHAs that exist in different repositories within the same repository network, including fork branches. For more information about how to view a repository's network, see \"[Understanding connections between repositories](https://docs.github.com/repositories/viewing-activity-and-data-for-your-repository/understanding-connections-between-repositories).\"\n\nThis endpoint is equivalent to running the `git log BASE..HEAD` command, but it returns commits in a different order. The `git log BASE..HEAD` command returns commits in reverse chronological order, whereas the API returns commits in chronological order.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.diff`**: Returns the diff of the commit.\n- **`application/vnd.github.patch`**: Returns the patch of the commit. Diffs with binary data will have no `patch` property.\n\nThe API response includes details about the files that were changed between the two commits. This includes the status of the change (if a file was added, removed, modified, or renamed), and details of the change itself. For example, files with a `renamed` status have a `previous_filename` field showing the previous filename of the file, and files with a `modified` status have a `patch` field showing the changes made to the file.\n\nWhen calling this endpoint without any paging parameter (`per_page` or `page`), the returned list is limited to 250 commits, and the last commit in the list is the most recent of the entire comparison.\n\n**Working with large comparisons**\n\nTo process a response with a large number of commits, use a query parameter (`per_page` or `page`) to paginate the results. When using pagination:\n\n- The list of changed files is only shown on the first page of results, and it includes up to 300 changed files for the entire comparison.\n- The results are returned in chronological order, but the last commit in the returned list may not be the most recent one in the entire set if there are more pages of results.\n\nFor more information on working with pagination, see \"[Using pagination in the REST API](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\"\n\n**Signature verification object**\n\nThe response will include a `verification` object that describes the result of verifying the commit's signature. The `verification` object includes the following fields:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| `verified` | `boolean` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| `reason` | `string` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| `signature` | `string` | The signature that was extracted from the commit. |\n| `payload` | `string` | The value that was signed. |\n| `verified_at` | `string` | The date the signature was verified by GitHub. |\n\nThese are the possible values for `reason` in the `verification` object:\n\n| Value | Description |\n| ----- | ----------- |\n| `expired_key` | The key that made the signature is expired. |\n| `not_signing_key` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| `gpgverify_error` | There was an error communicating with the signature verification service. |\n| `gpgverify_unavailable` | The signature verification service is currently unavailable. |\n| `unsigned` | The object does not include a signature. |\n| `unknown_signature_type` | A non-PGP signature was found in the commit. |\n| `no_user` | No user was associated with the `committer` email address in the commit. |\n| `unverified_email` | The `committer` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| `bad_email` | The `committer` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| `unknown_key` | The key that made the signature has not been registered with any user's account. |\n| `malformed_signature` | There was an error parsing the signature. |\n| `invalid` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| `valid` | None of the above errors applied, so the signature is considered to be verified. |.\n */\n  @aiFunction({\n    name: 'github_repos_compare_commits',\n    description: `Compares two commits against one another. You can compare refs (branches or tags) and commit SHAs in the same repository, or you can compare refs and commit SHAs that exist in different repositories within the same repository network, including fork branches. For more information about how to view a repository's network, see \"[Understanding connections between repositories](https://docs.github.com/repositories/viewing-activity-and-data-for-your-repository/understanding-connections-between-repositories).\"\n\nThis endpoint is equivalent to running the \\`git log BASE..HEAD\\` command, but it returns commits in a different order. The \\`git log BASE..HEAD\\` command returns commits in reverse chronological order, whereas the API returns commits in chronological order.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.diff\\`**: Returns the diff of the commit.\n- **\\`application/vnd.github.patch\\`**: Returns the patch of the commit. Diffs with binary data will have no \\`patch\\` property.\n\nThe API response includes details about the files that were changed between the two commits. This includes the status of the change (if a file was added, removed, modified, or renamed), and details of the change itself. For example, files with a \\`renamed\\` status have a \\`previous_filename\\` field showing the previous filename of the file, and files with a \\`modified\\` status have a \\`patch\\` field showing the changes made to the file.\n\nWhen calling this endpoint without any paging parameter (\\`per_page\\` or \\`page\\`), the returned list is limited to 250 commits, and the last commit in the list is the most recent of the entire comparison.\n\n**Working with large comparisons**\n\nTo process a response with a large number of commits, use a query parameter (\\`per_page\\` or \\`page\\`) to paginate the results. When using pagination:\n\n- The list of changed files is only shown on the first page of results, and it includes up to 300 changed files for the entire comparison.\n- The results are returned in chronological order, but the last commit in the returned list may not be the most recent one in the entire set if there are more pages of results.\n\nFor more information on working with pagination, see \"[Using pagination in the REST API](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\"\n\n**Signature verification object**\n\nThe response will include a \\`verification\\` object that describes the result of verifying the commit's signature. The \\`verification\\` object includes the following fields:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| \\`verified\\` | \\`boolean\\` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| \\`reason\\` | \\`string\\` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| \\`signature\\` | \\`string\\` | The signature that was extracted from the commit. |\n| \\`payload\\` | \\`string\\` | The value that was signed. |\n| \\`verified_at\\` | \\`string\\` | The date the signature was verified by GitHub. |\n\nThese are the possible values for \\`reason\\` in the \\`verification\\` object:\n\n| Value | Description |\n| ----- | ----------- |\n| \\`expired_key\\` | The key that made the signature is expired. |\n| \\`not_signing_key\\` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| \\`gpgverify_error\\` | There was an error communicating with the signature verification service. |\n| \\`gpgverify_unavailable\\` | The signature verification service is currently unavailable. |\n| \\`unsigned\\` | The object does not include a signature. |\n| \\`unknown_signature_type\\` | A non-PGP signature was found in the commit. |\n| \\`no_user\\` | No user was associated with the \\`committer\\` email address in the commit. |\n| \\`unverified_email\\` | The \\`committer\\` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| \\`bad_email\\` | The \\`committer\\` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| \\`unknown_key\\` | The key that made the signature has not been registered with any user's account. |\n| \\`malformed_signature\\` | There was an error parsing the signature. |\n| \\`invalid\\` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| \\`valid\\` | None of the above errors applied, so the signature is considered to be verified. |.`,\n    inputSchema: github.ReposCompareCommitsParamsSchema,\n    tags: ['repos']\n  })\n  async reposCompareCommits(\n    params: github.ReposCompareCommitsParams\n  ): Promise<github.ReposCompareCommitsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/compare/${params.basehead}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.ReposCompareCommitsResponse>()\n  }\n\n  /**\n * Gets the contents of a file or directory in a repository. Specify the file path or directory with the `path` parameter. If you omit the `path` parameter, you will receive the contents of the repository's root directory.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw file contents for files and symlinks.\n- **`application/vnd.github.html+json`**: Returns the file contents in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).\n- **`application/vnd.github.object+json`**: Returns the contents in a consistent object format regardless of the content type. For example, instead of an array of objects for a directory, the response will be an object with an `entries` attribute containing the array of objects.\n\nIf the content is a directory, the response will be an array of objects, one object for each item in the directory. When listing the contents of a directory, submodules have their \"type\" specified as \"file\". Logically, the value _should_ be \"submodule\". This behavior exists [for backwards compatibility purposes](https://git.io/v1YCW). In the next major version of the API, the type will be returned as \"submodule\".\n\nIf the content is a symlink and the symlink's target is a normal file in the repository, then the API responds with the content of the file. Otherwise, the API responds with an object describing the symlink itself.\n\nIf the content is a submodule, the `submodule_git_url` field identifies the location of the submodule repository, and the `sha` identifies a specific commit within the submodule repository. Git uses the given URL when cloning the submodule repository, and checks out the submodule at that specific commit. If the submodule repository is not hosted on github.com, the Git URLs (`git_url` and `_links[\"git\"]`) and the github.com URLs (`html_url` and `_links[\"html\"]`) will have null values.\n\n**Notes**:\n\n- To get a repository's contents recursively, you can [recursively get the tree](https://docs.github.com/rest/git/trees#get-a-tree).\n- This API has an upper limit of 1,000 files for a directory. If you need to retrieve\nmore files, use the [Git Trees API](https://docs.github.com/rest/git/trees#get-a-tree).\n- Download URLs expire and are meant to be used just once. To ensure the download URL does not expire, please use the contents API to obtain a fresh download URL for each download.\n- If the requested file's size is:\n  - 1 MB or smaller: All features of this endpoint are supported.\n  - Between 1-100 MB: Only the `raw` or `object` custom media types are supported. Both will work as normal, except that when using the `object` media type, the `content` field will be an empty\nstring and the `encoding` field will be `\"none\"`. To get the contents of these larger files, use the `raw` media type.\n  - Greater than 100 MB: This endpoint is not supported.\n */\n  @aiFunction({\n    name: 'github_repos_get_content',\n    description: `Gets the contents of a file or directory in a repository. Specify the file path or directory with the \\`path\\` parameter. If you omit the \\`path\\` parameter, you will receive the contents of the repository's root directory.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw file contents for files and symlinks.\n- **\\`application/vnd.github.html+json\\`**: Returns the file contents in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).\n- **\\`application/vnd.github.object+json\\`**: Returns the contents in a consistent object format regardless of the content type. For example, instead of an array of objects for a directory, the response will be an object with an \\`entries\\` attribute containing the array of objects.\n\nIf the content is a directory, the response will be an array of objects, one object for each item in the directory. When listing the contents of a directory, submodules have their \"type\" specified as \"file\". Logically, the value _should_ be \"submodule\". This behavior exists [for backwards compatibility purposes](https://git.io/v1YCW). In the next major version of the API, the type will be returned as \"submodule\".\n\nIf the content is a symlink and the symlink's target is a normal file in the repository, then the API responds with the content of the file. Otherwise, the API responds with an object describing the symlink itself.\n\nIf the content is a submodule, the \\`submodule_git_url\\` field identifies the location of the submodule repository, and the \\`sha\\` identifies a specific commit within the submodule repository. Git uses the given URL when cloning the submodule repository, and checks out the submodule at that specific commit. If the submodule repository is not hosted on github.com, the Git URLs (\\`git_url\\` and \\`_links[\"git\"]\\`) and the github.com URLs (\\`html_url\\` and \\`_links[\"html\"]\\`) will have null values.\n\n**Notes**:\n\n- To get a repository's contents recursively, you can [recursively get the tree](https://docs.github.com/rest/git/trees#get-a-tree).\n- This API has an upper limit of 1,000 files for a directory. If you need to retrieve\nmore files, use the [Git Trees API](https://docs.github.com/rest/git/trees#get-a-tree).\n- Download URLs expire and are meant to be used just once. To ensure the download URL does not expire, please use the contents API to obtain a fresh download URL for each download.\n- If the requested file's size is:\n  - 1 MB or smaller: All features of this endpoint are supported.\n  - Between 1-100 MB: Only the \\`raw\\` or \\`object\\` custom media types are supported. Both will work as normal, except that when using the \\`object\\` media type, the \\`content\\` field will be an empty\nstring and the \\`encoding\\` field will be \\`\"none\"\\`. To get the contents of these larger files, use the \\`raw\\` media type.\n  - Greater than 100 MB: This endpoint is not supported.`,\n    inputSchema: github.ReposGetContentParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetContent(\n    params: github.ReposGetContentParams\n  ): Promise<github.ReposGetContentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/contents/${params.path}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'ref'))\n        }\n      )\n      .json<github.ReposGetContentResponse>()\n  }\n\n  /**\n * Creates a new file or replaces an existing file in a repository.\n\n> [!NOTE]\n> If you use this endpoint and the \"[Delete a file](https://docs.github.com/rest/repos/contents/#delete-a-file)\" endpoint in parallel, the concurrent requests will conflict and you will receive errors. You must use these endpoints serially instead.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint. The `workflow` scope is also required in order to modify files in the `.github/workflows` directory.\n */\n  @aiFunction({\n    name: 'github_repos_create_or_update_file_contents',\n    description: `Creates a new file or replaces an existing file in a repository.\n\n> [!NOTE]\n> If you use this endpoint and the \"[Delete a file](https://docs.github.com/rest/repos/contents/#delete-a-file)\" endpoint in parallel, the concurrent requests will conflict and you will receive errors. You must use these endpoints serially instead.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint. The \\`workflow\\` scope is also required in order to modify files in the \\`.github/workflows\\` directory.`,\n    inputSchema: github.ReposCreateOrUpdateFileContentsParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateOrUpdateFileContents(\n    params: github.ReposCreateOrUpdateFileContentsParams\n  ): Promise<github.ReposCreateOrUpdateFileContentsResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/contents/${params.path}`,\n        {\n          json: pick(\n            params,\n            'message',\n            'content',\n            'sha',\n            'branch',\n            'committer',\n            'author'\n          )\n        }\n      )\n      .json<github.ReposCreateOrUpdateFileContentsResponse>()\n  }\n\n  /**\n * Deletes a file in a repository.\n\nYou can provide an additional `committer` parameter, which is an object containing information about the committer. Or, you can provide an `author` parameter, which is an object containing information about the author.\n\nThe `author` section is optional and is filled in with the `committer` information if omitted. If the `committer` information is omitted, the authenticated user's information is used.\n\nYou must provide values for both `name` and `email`, whether you choose to use `author` or `committer`. Otherwise, you'll receive a `422` status code.\n\n> [!NOTE]\n> If you use this endpoint and the \"[Create or update file contents](https://docs.github.com/rest/repos/contents/#create-or-update-file-contents)\" endpoint in parallel, the concurrent requests will conflict and you will receive errors. You must use these endpoints serially instead.\n */\n  @aiFunction({\n    name: 'github_repos_delete_file',\n    description: `Deletes a file in a repository.\n\nYou can provide an additional \\`committer\\` parameter, which is an object containing information about the committer. Or, you can provide an \\`author\\` parameter, which is an object containing information about the author.\n\nThe \\`author\\` section is optional and is filled in with the \\`committer\\` information if omitted. If the \\`committer\\` information is omitted, the authenticated user's information is used.\n\nYou must provide values for both \\`name\\` and \\`email\\`, whether you choose to use \\`author\\` or \\`committer\\`. Otherwise, you'll receive a \\`422\\` status code.\n\n> [!NOTE]\n> If you use this endpoint and the \"[Create or update file contents](https://docs.github.com/rest/repos/contents/#create-or-update-file-contents)\" endpoint in parallel, the concurrent requests will conflict and you will receive errors. You must use these endpoints serially instead.`,\n    inputSchema: github.ReposDeleteFileParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteFile(\n    params: github.ReposDeleteFileParams\n  ): Promise<github.ReposDeleteFileResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/contents/${params.path}`,\n        {\n          json: pick(params, 'message', 'sha', 'branch', 'committer', 'author')\n        }\n      )\n      .json<github.ReposDeleteFileResponse>()\n  }\n\n  /**\n * Lists contributors to the specified repository and sorts them by the number of commits per contributor in descending order. This endpoint may return information that is a few hours old because the GitHub REST API caches contributor data to improve performance.\n\nGitHub identifies contributors by author email address. This endpoint groups contribution counts by GitHub user, which includes all associated email addresses. To improve performance, only the first 500 author email addresses in the repository link to GitHub users. The rest will appear as anonymous contributors without associated GitHub user information.\n */\n  @aiFunction({\n    name: 'github_repos_list_contributors',\n    description: `Lists contributors to the specified repository and sorts them by the number of commits per contributor in descending order. This endpoint may return information that is a few hours old because the GitHub REST API caches contributor data to improve performance.\n\nGitHub identifies contributors by author email address. This endpoint groups contribution counts by GitHub user, which includes all associated email addresses. To improve performance, only the first 500 author email addresses in the repository link to GitHub users. The rest will appear as anonymous contributors without associated GitHub user information.`,\n    inputSchema: github.ReposListContributorsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListContributors(\n    params: github.ReposListContributorsParams\n  ): Promise<github.ReposListContributorsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/contributors`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'anon', 'per_page', 'page')\n        )\n      })\n      .json<github.ReposListContributorsResponse>()\n  }\n\n  /**\n   * OAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n   */\n  @aiFunction({\n    name: 'github_dependabot_list_alerts_for_repo',\n    description: `OAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.DependabotListAlertsForRepoParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotListAlertsForRepo(\n    params: github.DependabotListAlertsForRepoParams\n  ): Promise<github.DependabotListAlertsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/dependabot/alerts`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'state',\n            'severity',\n            'ecosystem',\n            'package',\n            'manifest',\n            'epss_percentage',\n            'scope',\n            'sort',\n            'direction',\n            'page',\n            'per_page',\n            'before',\n            'after',\n            'first',\n            'last'\n          )\n        )\n      })\n      .json<github.DependabotListAlertsForRepoResponse>()\n  }\n\n  /**\n   * OAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n   */\n  @aiFunction({\n    name: 'github_dependabot_get_alert',\n    description: `OAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.DependabotGetAlertParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotGetAlert(\n    params: github.DependabotGetAlertParams\n  ): Promise<github.DependabotGetAlertResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/dependabot/alerts/${params.alert_number}`,\n        {}\n      )\n      .json<github.DependabotGetAlertResponse>()\n  }\n\n  /**\n * The authenticated user must have access to security alerts for the repository to use this endpoint. For more information, see \"[Granting access to security alerts](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-security-and-analysis-settings-for-your-repository#granting-access-to-security-alerts).\"\n\nOAuth app tokens and personal access tokens (classic) need the `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_dependabot_update_alert',\n    description: `The authenticated user must have access to security alerts for the repository to use this endpoint. For more information, see \"[Granting access to security alerts](https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-security-and-analysis-settings-for-your-repository#granting-access-to-security-alerts).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.DependabotUpdateAlertParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotUpdateAlert(\n    params: github.DependabotUpdateAlertParams\n  ): Promise<github.DependabotUpdateAlertResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/dependabot/alerts/${params.alert_number}`,\n        {\n          json: pick(params, 'state', 'dismissed_reason', 'dismissed_comment')\n        }\n      )\n      .json<github.DependabotUpdateAlertResponse>()\n  }\n\n  /**\n * Lists all secrets available in a repository without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_list_repo_secrets',\n    description: `Lists all secrets available in a repository without revealing their encrypted\nvalues.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotListRepoSecretsParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotListRepoSecrets(\n    params: github.DependabotListRepoSecretsParams\n  ): Promise<github.DependabotListRepoSecretsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/dependabot/secrets`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.DependabotListRepoSecretsResponse>()\n  }\n\n  /**\n * Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets. Anyone with read access\nto the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint if the repository is private.\n */\n  @aiFunction({\n    name: 'github_dependabot_get_repo_public_key',\n    description: `Gets your public key, which you need to encrypt secrets. You need to\nencrypt a secret before you can create or update secrets. Anyone with read access\nto the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint if the repository is private.`,\n    inputSchema: github.DependabotGetRepoPublicKeyParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotGetRepoPublicKey(\n    params: github.DependabotGetRepoPublicKeyParams\n  ): Promise<github.DependabotGetRepoPublicKeyResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/dependabot/secrets/public-key`,\n        {}\n      )\n      .json<github.DependabotGetRepoPublicKeyResponse>()\n  }\n\n  /**\n * Gets a single repository secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_get_repo_secret',\n    description: `Gets a single repository secret without revealing its encrypted value.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotGetRepoSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotGetRepoSecret(\n    params: github.DependabotGetRepoSecretParams\n  ): Promise<github.DependabotGetRepoSecretResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/dependabot/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.DependabotGetRepoSecretResponse>()\n  }\n\n  /**\n * Creates or updates a repository secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_create_or_update_repo_secret',\n    description: `Creates or updates a repository secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotCreateOrUpdateRepoSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotCreateOrUpdateRepoSecret(\n    params: github.DependabotCreateOrUpdateRepoSecretParams\n  ): Promise<github.DependabotCreateOrUpdateRepoSecretResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/dependabot/secrets/${params.secret_name}`,\n        {\n          json: pick(params, 'encrypted_value', 'key_id')\n        }\n      )\n      .json<github.DependabotCreateOrUpdateRepoSecretResponse>()\n  }\n\n  /**\n * Deletes a secret in a repository using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependabot_delete_repo_secret',\n    description: `Deletes a secret in a repository using the secret name.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.DependabotDeleteRepoSecretParamsSchema,\n    tags: ['dependabot']\n  })\n  async dependabotDeleteRepoSecret(\n    params: github.DependabotDeleteRepoSecretParams\n  ): Promise<github.DependabotDeleteRepoSecretResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/dependabot/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.DependabotDeleteRepoSecretResponse>()\n  }\n\n  /**\n   * Gets the diff of the dependency changes between two commits of a repository, based on the changes to the dependency manifests made in those commits.\n   */\n  @aiFunction({\n    name: 'github_dependency_graph_diff_range',\n    description: `Gets the diff of the dependency changes between two commits of a repository, based on the changes to the dependency manifests made in those commits.`,\n    inputSchema: github.DependencyGraphDiffRangeParamsSchema,\n    tags: ['dependency-graph']\n  })\n  async dependencyGraphDiffRange(\n    params: github.DependencyGraphDiffRangeParams\n  ): Promise<github.DependencyGraphDiffRangeResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/dependency-graph/compare/${params.basehead}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'name'))\n        }\n      )\n      .json<github.DependencyGraphDiffRangeResponse>()\n  }\n\n  /**\n   * Exports the software bill of materials (SBOM) for a repository in SPDX JSON format.\n   */\n  @aiFunction({\n    name: 'github_dependency_graph_export_sbom',\n    description: `Exports the software bill of materials (SBOM) for a repository in SPDX JSON format.`,\n    inputSchema: github.DependencyGraphExportSbomParamsSchema,\n    tags: ['dependency-graph']\n  })\n  async dependencyGraphExportSbom(\n    params: github.DependencyGraphExportSbomParams\n  ): Promise<github.DependencyGraphExportSbomResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/dependency-graph/sbom`,\n        {}\n      )\n      .json<github.DependencyGraphExportSbomResponse>()\n  }\n\n  /**\n * Create a new snapshot of a repository's dependencies.\n\nThe authenticated user must have access to the repository.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_dependency_graph_create_repository_snapshot',\n    description: `Create a new snapshot of a repository's dependencies.\n\nThe authenticated user must have access to the repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.DependencyGraphCreateRepositorySnapshotParamsSchema,\n    tags: ['dependency-graph']\n  })\n  async dependencyGraphCreateRepositorySnapshot(\n    params: github.DependencyGraphCreateRepositorySnapshotParams\n  ): Promise<github.DependencyGraphCreateRepositorySnapshotResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/dependency-graph/snapshots`,\n        {\n          json: pick(\n            params,\n            'version',\n            'job',\n            'sha',\n            'ref',\n            'detector',\n            'metadata',\n            'manifests',\n            'scanned'\n          )\n        }\n      )\n      .json<github.DependencyGraphCreateRepositorySnapshotResponse>()\n  }\n\n  /**\n   * Simple filtering of deployments is available via query parameters:.\n   */\n  @aiFunction({\n    name: 'github_repos_list_deployments',\n    description: `Simple filtering of deployments is available via query parameters:.`,\n    inputSchema: github.ReposListDeploymentsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListDeployments(\n    params: github.ReposListDeploymentsParams\n  ): Promise<github.ReposListDeploymentsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/deployments`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sha', 'ref', 'task', 'environment', 'per_page', 'page')\n        )\n      })\n      .json<github.ReposListDeploymentsResponse>()\n  }\n\n  /**\n * Deployments offer a few configurable parameters with certain defaults.\n\nThe `ref` parameter can be any named branch, tag, or SHA. At GitHub we often deploy branches and verify them\nbefore we merge a pull request.\n\nThe `environment` parameter allows deployments to be issued to different runtime environments. Teams often have\nmultiple environments for verifying their applications, such as `production`, `staging`, and `qa`. This parameter\nmakes it easier to track which environments have requested deployments. The default environment is `production`.\n\nThe `auto_merge` parameter is used to ensure that the requested ref is not behind the repository's default branch. If\nthe ref _is_ behind the default branch for the repository, we will attempt to merge it for you. If the merge succeeds,\nthe API will return a successful merge commit. If merge conflicts prevent the merge from succeeding, the API will\nreturn a failure response.\n\nBy default, [commit statuses](https://docs.github.com/rest/commits/statuses) for every submitted context must be in a `success`\nstate. The `required_contexts` parameter allows you to specify a subset of contexts that must be `success`, or to\nspecify contexts that have not yet been submitted. You are not required to use commit statuses to deploy. If you do\nnot require any contexts or create any commit statuses, the deployment will always succeed.\n\nThe `payload` parameter is available for any extra information that a deployment system might need. It is a JSON text\nfield that will be passed on when a deployment event is dispatched.\n\nThe `task` parameter is used by the deployment system to allow different execution paths. In the web world this might\nbe `deploy:migrations` to run schema changes on the system. In the compiled world this could be a flag to compile an\napplication with debugging enabled.\n\nMerged branch response:\n\nYou will see this response when GitHub automatically merges the base branch into the topic branch instead of creating\na deployment. This auto-merge happens when:\n*   Auto-merge option is enabled in the repository\n*   Topic branch does not include the latest changes on the base branch, which is `master` in the response example\n*   There are no merge conflicts\n\nIf there are no new commits in the base branch, a new request to create a deployment should give a successful\nresponse.\n\nMerge conflict response:\n\nThis error happens when the `auto_merge` option is enabled and when the default branch (in this case `master`), can't\nbe merged into the branch that's being deployed (in this case `topic-branch`), due to merge conflicts.\n\nFailed commit status checks:\n\nThis error happens when the `required_contexts` parameter indicates that one or more contexts need to have a `success`\nstatus for the commit to be deployed, but one or more of the required contexts do not have a state of `success`.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repo_deployment` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_deployment',\n    description: `Deployments offer a few configurable parameters with certain defaults.\n\nThe \\`ref\\` parameter can be any named branch, tag, or SHA. At GitHub we often deploy branches and verify them\nbefore we merge a pull request.\n\nThe \\`environment\\` parameter allows deployments to be issued to different runtime environments. Teams often have\nmultiple environments for verifying their applications, such as \\`production\\`, \\`staging\\`, and \\`qa\\`. This parameter\nmakes it easier to track which environments have requested deployments. The default environment is \\`production\\`.\n\nThe \\`auto_merge\\` parameter is used to ensure that the requested ref is not behind the repository's default branch. If\nthe ref _is_ behind the default branch for the repository, we will attempt to merge it for you. If the merge succeeds,\nthe API will return a successful merge commit. If merge conflicts prevent the merge from succeeding, the API will\nreturn a failure response.\n\nBy default, [commit statuses](https://docs.github.com/rest/commits/statuses) for every submitted context must be in a \\`success\\`\nstate. The \\`required_contexts\\` parameter allows you to specify a subset of contexts that must be \\`success\\`, or to\nspecify contexts that have not yet been submitted. You are not required to use commit statuses to deploy. If you do\nnot require any contexts or create any commit statuses, the deployment will always succeed.\n\nThe \\`payload\\` parameter is available for any extra information that a deployment system might need. It is a JSON text\nfield that will be passed on when a deployment event is dispatched.\n\nThe \\`task\\` parameter is used by the deployment system to allow different execution paths. In the web world this might\nbe \\`deploy:migrations\\` to run schema changes on the system. In the compiled world this could be a flag to compile an\napplication with debugging enabled.\n\nMerged branch response:\n\nYou will see this response when GitHub automatically merges the base branch into the topic branch instead of creating\na deployment. This auto-merge happens when:\n*   Auto-merge option is enabled in the repository\n*   Topic branch does not include the latest changes on the base branch, which is \\`master\\` in the response example\n*   There are no merge conflicts\n\nIf there are no new commits in the base branch, a new request to create a deployment should give a successful\nresponse.\n\nMerge conflict response:\n\nThis error happens when the \\`auto_merge\\` option is enabled and when the default branch (in this case \\`master\\`), can't\nbe merged into the branch that's being deployed (in this case \\`topic-branch\\`), due to merge conflicts.\n\nFailed commit status checks:\n\nThis error happens when the \\`required_contexts\\` parameter indicates that one or more contexts need to have a \\`success\\`\nstatus for the commit to be deployed, but one or more of the required contexts do not have a state of \\`success\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repo_deployment\\` scope to use this endpoint.`,\n    inputSchema: github.ReposCreateDeploymentParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateDeployment(\n    params: github.ReposCreateDeploymentParams\n  ): Promise<github.ReposCreateDeploymentResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/deployments`, {\n        json: pick(\n          params,\n          'ref',\n          'task',\n          'auto_merge',\n          'required_contexts',\n          'payload',\n          'environment',\n          'description',\n          'transient_environment',\n          'production_environment'\n        )\n      })\n      .json<github.ReposCreateDeploymentResponse>()\n  }\n\n  /**\n   * Get a deployment.\n   */\n  @aiFunction({\n    name: 'github_repos_get_deployment',\n    description: `Get a deployment.`,\n    inputSchema: github.ReposGetDeploymentParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetDeployment(\n    params: github.ReposGetDeploymentParams\n  ): Promise<github.ReposGetDeploymentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/deployments/${params.deployment_id}`,\n        {}\n      )\n      .json<github.ReposGetDeploymentResponse>()\n  }\n\n  /**\n * If the repository only has one deployment, you can delete the deployment regardless of its status. If the repository has more than one deployment, you can only delete inactive deployments. This ensures that repositories with multiple deployments will always have an active deployment.\n\nTo set a deployment as inactive, you must:\n\n*   Create a new deployment that is active so that the system has a record of the current state, then delete the previously active deployment.\n*   Mark the active deployment as inactive by adding any non-successful deployment status.\n\nFor more information, see \"[Create a deployment](https://docs.github.com/rest/deployments/deployments/#create-a-deployment)\" and \"[Create a deployment status](https://docs.github.com/rest/deployments/statuses#create-a-deployment-status).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repo_deployment` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_delete_deployment',\n    description: `If the repository only has one deployment, you can delete the deployment regardless of its status. If the repository has more than one deployment, you can only delete inactive deployments. This ensures that repositories with multiple deployments will always have an active deployment.\n\nTo set a deployment as inactive, you must:\n\n*   Create a new deployment that is active so that the system has a record of the current state, then delete the previously active deployment.\n*   Mark the active deployment as inactive by adding any non-successful deployment status.\n\nFor more information, see \"[Create a deployment](https://docs.github.com/rest/deployments/deployments/#create-a-deployment)\" and \"[Create a deployment status](https://docs.github.com/rest/deployments/statuses#create-a-deployment-status).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repo_deployment\\` scope to use this endpoint.`,\n    inputSchema: github.ReposDeleteDeploymentParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteDeployment(\n    params: github.ReposDeleteDeploymentParams\n  ): Promise<github.ReposDeleteDeploymentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/deployments/${params.deployment_id}`,\n        {}\n      )\n      .json<github.ReposDeleteDeploymentResponse>()\n  }\n\n  /**\n   * Users with pull access can view deployment statuses for a deployment:.\n   */\n  @aiFunction({\n    name: 'github_repos_list_deployment_statuses',\n    description: `Users with pull access can view deployment statuses for a deployment:.`,\n    inputSchema: github.ReposListDeploymentStatusesParamsSchema,\n    tags: ['repos']\n  })\n  async reposListDeploymentStatuses(\n    params: github.ReposListDeploymentStatusesParams\n  ): Promise<github.ReposListDeploymentStatusesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/deployments/${params.deployment_id}/statuses`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposListDeploymentStatusesResponse>()\n  }\n\n  /**\n * Users with `push` access can create deployment statuses for a given deployment.\n\nOAuth app tokens and personal access tokens (classic) need the `repo_deployment` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_deployment_status',\n    description: `Users with \\`push\\` access can create deployment statuses for a given deployment.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo_deployment\\` scope to use this endpoint.`,\n    inputSchema: github.ReposCreateDeploymentStatusParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateDeploymentStatus(\n    params: github.ReposCreateDeploymentStatusParams\n  ): Promise<github.ReposCreateDeploymentStatusResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/deployments/${params.deployment_id}/statuses`,\n        {\n          json: pick(\n            params,\n            'state',\n            'target_url',\n            'log_url',\n            'description',\n            'environment',\n            'environment_url',\n            'auto_inactive'\n          )\n        }\n      )\n      .json<github.ReposCreateDeploymentStatusResponse>()\n  }\n\n  /**\n   * Users with pull access can view a deployment status for a deployment:.\n   */\n  @aiFunction({\n    name: 'github_repos_get_deployment_status',\n    description: `Users with pull access can view a deployment status for a deployment:.`,\n    inputSchema: github.ReposGetDeploymentStatusParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetDeploymentStatus(\n    params: github.ReposGetDeploymentStatusParams\n  ): Promise<github.ReposGetDeploymentStatusResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/deployments/${params.deployment_id}/statuses/${params.status_id}`,\n        {}\n      )\n      .json<github.ReposGetDeploymentStatusResponse>()\n  }\n\n  /**\n * You can use this endpoint to trigger a webhook event called `repository_dispatch` when you want activity that happens outside of GitHub to trigger a GitHub Actions workflow or GitHub App webhook. You must configure your GitHub Actions workflow or GitHub App to run when the `repository_dispatch` event occurs. For an example `repository_dispatch` webhook payload, see \"[RepositoryDispatchEvent](https://docs.github.com/webhooks/event-payloads/#repository_dispatch).\"\n\nThe `client_payload` parameter is available for any extra information that your workflow might need. This parameter is a JSON payload that will be passed on when the webhook event is dispatched. For example, the `client_payload` can include a message that a user would like to send using a GitHub Actions workflow. Or the `client_payload` can be used as a test to debug your workflow.\n\nThis input example shows how you can use the `client_payload` as a test to debug your workflow.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_dispatch_event',\n    description: `You can use this endpoint to trigger a webhook event called \\`repository_dispatch\\` when you want activity that happens outside of GitHub to trigger a GitHub Actions workflow or GitHub App webhook. You must configure your GitHub Actions workflow or GitHub App to run when the \\`repository_dispatch\\` event occurs. For an example \\`repository_dispatch\\` webhook payload, see \"[RepositoryDispatchEvent](https://docs.github.com/webhooks/event-payloads/#repository_dispatch).\"\n\nThe \\`client_payload\\` parameter is available for any extra information that your workflow might need. This parameter is a JSON payload that will be passed on when the webhook event is dispatched. For example, the \\`client_payload\\` can include a message that a user would like to send using a GitHub Actions workflow. Or the \\`client_payload\\` can be used as a test to debug your workflow.\n\nThis input example shows how you can use the \\`client_payload\\` as a test to debug your workflow.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposCreateDispatchEventParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateDispatchEvent(\n    params: github.ReposCreateDispatchEventParams\n  ): Promise<github.ReposCreateDispatchEventResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/dispatches`, {\n        json: pick(params, 'event_type', 'client_payload')\n      })\n      .json<github.ReposCreateDispatchEventResponse>()\n  }\n\n  /**\n * Lists the environments for a repository.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_get_all_environments',\n    description: `Lists the environments for a repository.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposGetAllEnvironmentsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAllEnvironments(\n    params: github.ReposGetAllEnvironmentsParams\n  ): Promise<github.ReposGetAllEnvironmentsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/environments`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposGetAllEnvironmentsResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> To get information about name patterns that branches must match in order to deploy to this environment, see \"[Get a deployment branch policy](/rest/deployments/branch-policies#get-a-deployment-branch-policy).\"\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_get_environment',\n    description: `> [!NOTE]\n> To get information about name patterns that branches must match in order to deploy to this environment, see \"[Get a deployment branch policy](/rest/deployments/branch-policies#get-a-deployment-branch-policy).\"\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposGetEnvironmentParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetEnvironment(\n    params: github.ReposGetEnvironmentParams\n  ): Promise<github.ReposGetEnvironmentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}`,\n        {}\n      )\n      .json<github.ReposGetEnvironmentResponse>()\n  }\n\n  /**\n * Create or update an environment with protection rules, such as required reviewers. For more information about environment protection rules, see \"[Environments](/actions/reference/environments#environment-protection-rules).\"\n\n> [!NOTE]\n> To create or update name patterns that branches must match in order to deploy to this environment, see \"[Deployment branch policies](/rest/deployments/branch-policies).\"\n\n> [!NOTE]\n> To create or update secrets for an environment, see \"[GitHub Actions secrets](/rest/actions/secrets).\"\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_or_update_environment',\n    description: `Create or update an environment with protection rules, such as required reviewers. For more information about environment protection rules, see \"[Environments](/actions/reference/environments#environment-protection-rules).\"\n\n> [!NOTE]\n> To create or update name patterns that branches must match in order to deploy to this environment, see \"[Deployment branch policies](/rest/deployments/branch-policies).\"\n\n> [!NOTE]\n> To create or update secrets for an environment, see \"[GitHub Actions secrets](/rest/actions/secrets).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposCreateOrUpdateEnvironmentParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateOrUpdateEnvironment(\n    params: github.ReposCreateOrUpdateEnvironmentParams\n  ): Promise<github.ReposCreateOrUpdateEnvironmentResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}`,\n        {\n          json: pick(\n            params,\n            'wait_timer',\n            'prevent_self_review',\n            'reviewers',\n            'deployment_branch_policy'\n          )\n        }\n      )\n      .json<github.ReposCreateOrUpdateEnvironmentResponse>()\n  }\n\n  /**\n   * OAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_an_environment',\n    description: `OAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposDeleteAnEnvironmentParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteAnEnvironment(\n    params: github.ReposDeleteAnEnvironmentParams\n  ): Promise<github.ReposDeleteAnEnvironmentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}`,\n        {}\n      )\n      .json<github.ReposDeleteAnEnvironmentResponse>()\n  }\n\n  /**\n * Lists the deployment branch policies for an environment.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_list_deployment_branch_policies',\n    description: `Lists the deployment branch policies for an environment.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposListDeploymentBranchPoliciesParamsSchema,\n    tags: ['repos']\n  })\n  async reposListDeploymentBranchPolicies(\n    params: github.ReposListDeploymentBranchPoliciesParams\n  ): Promise<github.ReposListDeploymentBranchPoliciesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment-branch-policies`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposListDeploymentBranchPoliciesResponse>()\n  }\n\n  /**\n * Creates a deployment branch or tag policy for an environment.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_deployment_branch_policy',\n    description: `Creates a deployment branch or tag policy for an environment.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposCreateDeploymentBranchPolicyParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateDeploymentBranchPolicy(\n    params: github.ReposCreateDeploymentBranchPolicyParams\n  ): Promise<github.ReposCreateDeploymentBranchPolicyResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment-branch-policies`,\n        {\n          json: pick(params, 'name', 'type')\n        }\n      )\n      .json<github.ReposCreateDeploymentBranchPolicyResponse>()\n  }\n\n  /**\n * Gets a deployment branch or tag policy for an environment.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_get_deployment_branch_policy',\n    description: `Gets a deployment branch or tag policy for an environment.\n\nAnyone with read access to the repository can use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposGetDeploymentBranchPolicyParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetDeploymentBranchPolicy(\n    params: github.ReposGetDeploymentBranchPolicyParams\n  ): Promise<github.ReposGetDeploymentBranchPolicyResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment-branch-policies/${params.branch_policy_id}`,\n        {}\n      )\n      .json<github.ReposGetDeploymentBranchPolicyResponse>()\n  }\n\n  /**\n * Updates a deployment branch or tag policy for an environment.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_update_deployment_branch_policy',\n    description: `Updates a deployment branch or tag policy for an environment.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposUpdateDeploymentBranchPolicyParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateDeploymentBranchPolicy(\n    params: github.ReposUpdateDeploymentBranchPolicyParams\n  ): Promise<github.ReposUpdateDeploymentBranchPolicyResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment-branch-policies/${params.branch_policy_id}`,\n        {\n          json: pick(params, 'name')\n        }\n      )\n      .json<github.ReposUpdateDeploymentBranchPolicyResponse>()\n  }\n\n  /**\n * Deletes a deployment branch or tag policy for an environment.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_delete_deployment_branch_policy',\n    description: `Deletes a deployment branch or tag policy for an environment.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposDeleteDeploymentBranchPolicyParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteDeploymentBranchPolicy(\n    params: github.ReposDeleteDeploymentBranchPolicyParams\n  ): Promise<github.ReposDeleteDeploymentBranchPolicyResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment-branch-policies/${params.branch_policy_id}`,\n        {}\n      )\n      .json<github.ReposDeleteDeploymentBranchPolicyResponse>()\n  }\n\n  /**\n * Gets all custom deployment protection rules that are enabled for an environment. Anyone with read access to the repository can use this endpoint. For more information about environments, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\nFor more information about the app that is providing this custom deployment rule, see the [documentation for the `GET /apps/{app_slug}` endpoint](https://docs.github.com/rest/apps/apps#get-an-app).\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_get_all_deployment_protection_rules',\n    description: `Gets all custom deployment protection rules that are enabled for an environment. Anyone with read access to the repository can use this endpoint. For more information about environments, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\nFor more information about the app that is providing this custom deployment rule, see the [documentation for the \\`GET /apps/{app_slug}\\` endpoint](https://docs.github.com/rest/apps/apps#get-an-app).\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposGetAllDeploymentProtectionRulesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAllDeploymentProtectionRules(\n    params: github.ReposGetAllDeploymentProtectionRulesParams\n  ): Promise<github.ReposGetAllDeploymentProtectionRulesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment_protection_rules`,\n        {}\n      )\n      .json<github.ReposGetAllDeploymentProtectionRulesResponse>()\n  }\n\n  /**\n * Enable a custom deployment protection rule for an environment.\n\nThe authenticated user must have admin or owner permissions to the repository to use this endpoint.\n\nFor more information about the app that is providing this custom deployment rule, see the [documentation for the `GET /apps/{app_slug}` endpoint](https://docs.github.com/rest/apps/apps#get-an-app), as well as the [guide to creating custom deployment protection rules](https://docs.github.com/actions/managing-workflow-runs-and-deployments/managing-deployments/creating-custom-deployment-protection-rules).\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_deployment_protection_rule',\n    description: `Enable a custom deployment protection rule for an environment.\n\nThe authenticated user must have admin or owner permissions to the repository to use this endpoint.\n\nFor more information about the app that is providing this custom deployment rule, see the [documentation for the \\`GET /apps/{app_slug}\\` endpoint](https://docs.github.com/rest/apps/apps#get-an-app), as well as the [guide to creating custom deployment protection rules](https://docs.github.com/actions/managing-workflow-runs-and-deployments/managing-deployments/creating-custom-deployment-protection-rules).\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposCreateDeploymentProtectionRuleParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateDeploymentProtectionRule(\n    params: github.ReposCreateDeploymentProtectionRuleParams\n  ): Promise<github.ReposCreateDeploymentProtectionRuleResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment_protection_rules`,\n        {\n          json: pick(params, 'integration_id')\n        }\n      )\n      .json<github.ReposCreateDeploymentProtectionRuleResponse>()\n  }\n\n  /**\n * Gets all custom deployment protection rule integrations that are available for an environment.\n\nThe authenticated user must have admin or owner permissions to the repository to use this endpoint.\n\nFor more information about environments, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\nFor more information about the app that is providing this custom deployment rule, see \"[GET an app](https://docs.github.com/rest/apps/apps#get-an-app)\".\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_list_custom_deployment_rule_integrations',\n    description: `Gets all custom deployment protection rule integrations that are available for an environment.\n\nThe authenticated user must have admin or owner permissions to the repository to use this endpoint.\n\nFor more information about environments, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\nFor more information about the app that is providing this custom deployment rule, see \"[GET an app](https://docs.github.com/rest/apps/apps#get-an-app)\".\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposListCustomDeploymentRuleIntegrationsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListCustomDeploymentRuleIntegrations(\n    params: github.ReposListCustomDeploymentRuleIntegrationsParams\n  ): Promise<github.ReposListCustomDeploymentRuleIntegrationsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment_protection_rules/apps`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.ReposListCustomDeploymentRuleIntegrationsResponse>()\n  }\n\n  /**\n * Gets an enabled custom deployment protection rule for an environment. Anyone with read access to the repository can use this endpoint. For more information about environments, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\nFor more information about the app that is providing this custom deployment rule, see [`GET /apps/{app_slug}`](https://docs.github.com/rest/apps/apps#get-an-app).\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_get_custom_deployment_protection_rule',\n    description: `Gets an enabled custom deployment protection rule for an environment. Anyone with read access to the repository can use this endpoint. For more information about environments, see \"[Using environments for deployment](https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment).\"\n\nFor more information about the app that is providing this custom deployment rule, see [\\`GET /apps/{app_slug}\\`](https://docs.github.com/rest/apps/apps#get-an-app).\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposGetCustomDeploymentProtectionRuleParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCustomDeploymentProtectionRule(\n    params: github.ReposGetCustomDeploymentProtectionRuleParams\n  ): Promise<github.ReposGetCustomDeploymentProtectionRuleResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment_protection_rules/${params.protection_rule_id}`,\n        {}\n      )\n      .json<github.ReposGetCustomDeploymentProtectionRuleResponse>()\n  }\n\n  /**\n * Disables a custom deployment protection rule for an environment.\n\nThe authenticated user must have admin or owner permissions to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_disable_deployment_protection_rule',\n    description: `Disables a custom deployment protection rule for an environment.\n\nThe authenticated user must have admin or owner permissions to the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposDisableDeploymentProtectionRuleParamsSchema,\n    tags: ['repos']\n  })\n  async reposDisableDeploymentProtectionRule(\n    params: github.ReposDisableDeploymentProtectionRuleParams\n  ): Promise<github.ReposDisableDeploymentProtectionRuleResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/deployment_protection_rules/${params.protection_rule_id}`,\n        {}\n      )\n      .json<github.ReposDisableDeploymentProtectionRuleResponse>()\n  }\n\n  /**\n * Lists all secrets available in an environment without revealing their\nencrypted values.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_environment_secrets',\n    description: `Lists all secrets available in an environment without revealing their\nencrypted values.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListEnvironmentSecretsParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListEnvironmentSecrets(\n    params: github.ActionsListEnvironmentSecretsParams\n  ): Promise<github.ActionsListEnvironmentSecretsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/secrets`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ActionsListEnvironmentSecretsResponse>()\n  }\n\n  /**\n * Get the public key for an environment, which you need to encrypt environment\nsecrets. You need to encrypt a secret before you can create or update secrets.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_environment_public_key',\n    description: `Get the public key for an environment, which you need to encrypt environment\nsecrets. You need to encrypt a secret before you can create or update secrets.\n\nAnyone with read access to the repository can use this endpoint.\n\nIf the repository is private, OAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetEnvironmentPublicKeyParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetEnvironmentPublicKey(\n    params: github.ActionsGetEnvironmentPublicKeyParams\n  ): Promise<github.ActionsGetEnvironmentPublicKeyResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/secrets/public-key`,\n        {}\n      )\n      .json<github.ActionsGetEnvironmentPublicKeyResponse>()\n  }\n\n  /**\n * Gets a single environment secret without revealing its encrypted value.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_environment_secret',\n    description: `Gets a single environment secret without revealing its encrypted value.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetEnvironmentSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetEnvironmentSecret(\n    params: github.ActionsGetEnvironmentSecretParams\n  ): Promise<github.ActionsGetEnvironmentSecretResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.ActionsGetEnvironmentSecretResponse>()\n  }\n\n  /**\n * Creates or updates an environment secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_or_update_environment_secret',\n    description: `Creates or updates an environment secret with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateOrUpdateEnvironmentSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateOrUpdateEnvironmentSecret(\n    params: github.ActionsCreateOrUpdateEnvironmentSecretParams\n  ): Promise<github.ActionsCreateOrUpdateEnvironmentSecretResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/secrets/${params.secret_name}`,\n        {\n          json: pick(params, 'encrypted_value', 'key_id')\n        }\n      )\n      .json<github.ActionsCreateOrUpdateEnvironmentSecretResponse>()\n  }\n\n  /**\n * Deletes a secret in an environment using the secret name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_environment_secret',\n    description: `Deletes a secret in an environment using the secret name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read secrets.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteEnvironmentSecretParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteEnvironmentSecret(\n    params: github.ActionsDeleteEnvironmentSecretParams\n  ): Promise<github.ActionsDeleteEnvironmentSecretResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/secrets/${params.secret_name}`,\n        {}\n      )\n      .json<github.ActionsDeleteEnvironmentSecretResponse>()\n  }\n\n  /**\n * Lists all environment variables.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_list_environment_variables',\n    description: `Lists all environment variables.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsListEnvironmentVariablesParamsSchema,\n    tags: ['actions']\n  })\n  async actionsListEnvironmentVariables(\n    params: github.ActionsListEnvironmentVariablesParams\n  ): Promise<github.ActionsListEnvironmentVariablesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/variables`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ActionsListEnvironmentVariablesResponse>()\n  }\n\n  /**\n * Create an environment variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_create_environment_variable',\n    description: `Create an environment variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsCreateEnvironmentVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsCreateEnvironmentVariable(\n    params: github.ActionsCreateEnvironmentVariableParams\n  ): Promise<github.ActionsCreateEnvironmentVariableResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/variables`,\n        {\n          json: pick(params, 'name', 'value')\n        }\n      )\n      .json<github.ActionsCreateEnvironmentVariableResponse>()\n  }\n\n  /**\n * Gets a specific variable in an environment.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_get_environment_variable',\n    description: `Gets a specific variable in an environment.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsGetEnvironmentVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsGetEnvironmentVariable(\n    params: github.ActionsGetEnvironmentVariableParams\n  ): Promise<github.ActionsGetEnvironmentVariableResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/variables/${params.name}`,\n        {}\n      )\n      .json<github.ActionsGetEnvironmentVariableResponse>()\n  }\n\n  /**\n * Deletes an environment variable using the variable name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_delete_environment_variable',\n    description: `Deletes an environment variable using the variable name.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsDeleteEnvironmentVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsDeleteEnvironmentVariable(\n    params: github.ActionsDeleteEnvironmentVariableParams\n  ): Promise<github.ActionsDeleteEnvironmentVariableResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/variables/${params.name}`,\n        {}\n      )\n      .json<github.ActionsDeleteEnvironmentVariableResponse>()\n  }\n\n  /**\n * Updates an environment variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_actions_update_environment_variable',\n    description: `Updates an environment variable that you can reference in a GitHub Actions workflow.\n\nAuthenticated users must have collaborator access to a repository to create, update, or read variables.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ActionsUpdateEnvironmentVariableParamsSchema,\n    tags: ['actions']\n  })\n  async actionsUpdateEnvironmentVariable(\n    params: github.ActionsUpdateEnvironmentVariableParams\n  ): Promise<github.ActionsUpdateEnvironmentVariableResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/environments/${params.environment_name}/variables/${params.name}`,\n        {\n          json: pick(params, 'name', 'value')\n        }\n      )\n      .json<github.ActionsUpdateEnvironmentVariableResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_repo_events',\n    description: `> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListRepoEventsParamsSchema,\n    tags: ['activity']\n  })\n  async activityListRepoEvents(\n    params: github.ActivityListRepoEventsParams\n  ): Promise<github.ActivityListRepoEventsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/events`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListRepoEventsResponse>()\n  }\n\n  /**\n   * List forks.\n   */\n  @aiFunction({\n    name: 'github_repos_list_forks',\n    description: `List forks.`,\n    inputSchema: github.ReposListForksParamsSchema,\n    tags: ['repos']\n  })\n  async reposListForks(\n    params: github.ReposListForksParams\n  ): Promise<github.ReposListForksResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/forks`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sort', 'per_page', 'page')\n        )\n      })\n      .json<github.ReposListForksResponse>()\n  }\n\n  /**\n * Create a fork for the authenticated user.\n\n> [!NOTE]\n> Forking a Repository happens asynchronously. You may have to wait a short period of time before you can access the git objects. If this takes longer than 5 minutes, be sure to contact [GitHub Support](https://support.github.com/contact?tags=dotcom-rest-api).\n\n> [!NOTE]\n> Although this endpoint works with GitHub Apps, the GitHub App must be installed on the destination account with access to all repositories and on the source account with access to the source repository.\n */\n  @aiFunction({\n    name: 'github_repos_create_fork',\n    description: `Create a fork for the authenticated user.\n\n> [!NOTE]\n> Forking a Repository happens asynchronously. You may have to wait a short period of time before you can access the git objects. If this takes longer than 5 minutes, be sure to contact [GitHub Support](https://support.github.com/contact?tags=dotcom-rest-api).\n\n> [!NOTE]\n> Although this endpoint works with GitHub Apps, the GitHub App must be installed on the destination account with access to all repositories and on the source account with access to the source repository.`,\n    inputSchema: github.ReposCreateForkParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateFork(\n    params: github.ReposCreateForkParams\n  ): Promise<github.ReposCreateForkResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/forks`, {\n        json: pick(params, 'organization', 'name', 'default_branch_only')\n      })\n      .json<github.ReposCreateForkResponse>()\n  }\n\n  /**\n   * Create a blob.\n   */\n  @aiFunction({\n    name: 'github_git_create_blob',\n    description: `Create a blob.`,\n    inputSchema: github.GitCreateBlobParamsSchema,\n    tags: ['git']\n  })\n  async gitCreateBlob(\n    params: github.GitCreateBlobParams\n  ): Promise<github.GitCreateBlobResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/git/blobs`, {\n        json: pick(params, 'content', 'encoding')\n      })\n      .json<github.GitCreateBlobResponse>()\n  }\n\n  /**\n * The `content` in the response will always be Base64 encoded.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw blob data.\n- **`application/vnd.github+json`**: Returns a JSON representation of the blob with `content` as a base64 encoded string. This is the default if no media type is specified.\n\n**Note** This endpoint supports blobs up to 100 megabytes in size.\n */\n  @aiFunction({\n    name: 'github_git_get_blob',\n    description: `The \\`content\\` in the response will always be Base64 encoded.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw blob data.\n- **\\`application/vnd.github+json\\`**: Returns a JSON representation of the blob with \\`content\\` as a base64 encoded string. This is the default if no media type is specified.\n\n**Note** This endpoint supports blobs up to 100 megabytes in size.`,\n    inputSchema: github.GitGetBlobParamsSchema,\n    tags: ['git']\n  })\n  async gitGetBlob(\n    params: github.GitGetBlobParams\n  ): Promise<github.GitGetBlobResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/git/blobs/${params.file_sha}`,\n        {}\n      )\n      .json<github.GitGetBlobResponse>()\n  }\n\n  /**\n * Creates a new Git [commit object](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects).\n\n**Signature verification object**\n\nThe response will include a `verification` object that describes the result of verifying the commit's signature. The following fields are included in the `verification` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| `verified` | `boolean` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| `reason` | `string` | The reason for verified value. Possible values and their meanings are enumerated in the table below. |\n| `signature` | `string` | The signature that was extracted from the commit. |\n| `payload` | `string` | The value that was signed. |\n| `verified_at` | `string` | The date the signature was verified by GitHub. |\n\nThese are the possible values for `reason` in the `verification` object:\n\n| Value | Description |\n| ----- | ----------- |\n| `expired_key` | The key that made the signature is expired. |\n| `not_signing_key` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| `gpgverify_error` | There was an error communicating with the signature verification service. |\n| `gpgverify_unavailable` | The signature verification service is currently unavailable. |\n| `unsigned` | The object does not include a signature. |\n| `unknown_signature_type` | A non-PGP signature was found in the commit. |\n| `no_user` | No user was associated with the `committer` email address in the commit. |\n| `unverified_email` | The `committer` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| `bad_email` | The `committer` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| `unknown_key` | The key that made the signature has not been registered with any user's account. |\n| `malformed_signature` | There was an error parsing the signature. |\n| `invalid` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| `valid` | None of the above errors applied, so the signature is considered to be verified. |.\n */\n  @aiFunction({\n    name: 'github_git_create_commit',\n    description: `Creates a new Git [commit object](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects).\n\n**Signature verification object**\n\nThe response will include a \\`verification\\` object that describes the result of verifying the commit's signature. The following fields are included in the \\`verification\\` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| \\`verified\\` | \\`boolean\\` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| \\`reason\\` | \\`string\\` | The reason for verified value. Possible values and their meanings are enumerated in the table below. |\n| \\`signature\\` | \\`string\\` | The signature that was extracted from the commit. |\n| \\`payload\\` | \\`string\\` | The value that was signed. |\n| \\`verified_at\\` | \\`string\\` | The date the signature was verified by GitHub. |\n\nThese are the possible values for \\`reason\\` in the \\`verification\\` object:\n\n| Value | Description |\n| ----- | ----------- |\n| \\`expired_key\\` | The key that made the signature is expired. |\n| \\`not_signing_key\\` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| \\`gpgverify_error\\` | There was an error communicating with the signature verification service. |\n| \\`gpgverify_unavailable\\` | The signature verification service is currently unavailable. |\n| \\`unsigned\\` | The object does not include a signature. |\n| \\`unknown_signature_type\\` | A non-PGP signature was found in the commit. |\n| \\`no_user\\` | No user was associated with the \\`committer\\` email address in the commit. |\n| \\`unverified_email\\` | The \\`committer\\` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| \\`bad_email\\` | The \\`committer\\` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| \\`unknown_key\\` | The key that made the signature has not been registered with any user's account. |\n| \\`malformed_signature\\` | There was an error parsing the signature. |\n| \\`invalid\\` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| \\`valid\\` | None of the above errors applied, so the signature is considered to be verified. |.`,\n    inputSchema: github.GitCreateCommitParamsSchema,\n    tags: ['git']\n  })\n  async gitCreateCommit(\n    params: github.GitCreateCommitParams\n  ): Promise<github.GitCreateCommitResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/git/commits`, {\n        json: pick(\n          params,\n          'message',\n          'tree',\n          'parents',\n          'author',\n          'committer',\n          'signature'\n        )\n      })\n      .json<github.GitCreateCommitResponse>()\n  }\n\n  /**\n * Gets a Git [commit object](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects).\n\nTo get the contents of a commit, see \"[Get a commit](/rest/commits/commits#get-a-commit).\"\n\n**Signature verification object**\n\nThe response will include a `verification` object that describes the result of verifying the commit's signature. The following fields are included in the `verification` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| `verified` | `boolean` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| `reason` | `string` | The reason for verified value. Possible values and their meanings are enumerated in the table below. |\n| `signature` | `string` | The signature that was extracted from the commit. |\n| `payload` | `string` | The value that was signed. |\n| `verified_at` | `string` | The date the signature was verified by GitHub. |\n\nThese are the possible values for `reason` in the `verification` object:\n\n| Value | Description |\n| ----- | ----------- |\n| `expired_key` | The key that made the signature is expired. |\n| `not_signing_key` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| `gpgverify_error` | There was an error communicating with the signature verification service. |\n| `gpgverify_unavailable` | The signature verification service is currently unavailable. |\n| `unsigned` | The object does not include a signature. |\n| `unknown_signature_type` | A non-PGP signature was found in the commit. |\n| `no_user` | No user was associated with the `committer` email address in the commit. |\n| `unverified_email` | The `committer` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| `bad_email` | The `committer` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| `unknown_key` | The key that made the signature has not been registered with any user's account. |\n| `malformed_signature` | There was an error parsing the signature. |\n| `invalid` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| `valid` | None of the above errors applied, so the signature is considered to be verified. |.\n */\n  @aiFunction({\n    name: 'github_git_get_commit',\n    description: `Gets a Git [commit object](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects).\n\nTo get the contents of a commit, see \"[Get a commit](/rest/commits/commits#get-a-commit).\"\n\n**Signature verification object**\n\nThe response will include a \\`verification\\` object that describes the result of verifying the commit's signature. The following fields are included in the \\`verification\\` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| \\`verified\\` | \\`boolean\\` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| \\`reason\\` | \\`string\\` | The reason for verified value. Possible values and their meanings are enumerated in the table below. |\n| \\`signature\\` | \\`string\\` | The signature that was extracted from the commit. |\n| \\`payload\\` | \\`string\\` | The value that was signed. |\n| \\`verified_at\\` | \\`string\\` | The date the signature was verified by GitHub. |\n\nThese are the possible values for \\`reason\\` in the \\`verification\\` object:\n\n| Value | Description |\n| ----- | ----------- |\n| \\`expired_key\\` | The key that made the signature is expired. |\n| \\`not_signing_key\\` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| \\`gpgverify_error\\` | There was an error communicating with the signature verification service. |\n| \\`gpgverify_unavailable\\` | The signature verification service is currently unavailable. |\n| \\`unsigned\\` | The object does not include a signature. |\n| \\`unknown_signature_type\\` | A non-PGP signature was found in the commit. |\n| \\`no_user\\` | No user was associated with the \\`committer\\` email address in the commit. |\n| \\`unverified_email\\` | The \\`committer\\` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| \\`bad_email\\` | The \\`committer\\` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| \\`unknown_key\\` | The key that made the signature has not been registered with any user's account. |\n| \\`malformed_signature\\` | There was an error parsing the signature. |\n| \\`invalid\\` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| \\`valid\\` | None of the above errors applied, so the signature is considered to be verified. |.`,\n    inputSchema: github.GitGetCommitParamsSchema,\n    tags: ['git']\n  })\n  async gitGetCommit(\n    params: github.GitGetCommitParams\n  ): Promise<github.GitGetCommitResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/git/commits/${params.commit_sha}`,\n        {}\n      )\n      .json<github.GitGetCommitResponse>()\n  }\n\n  /**\n * Returns an array of references from your Git database that match the supplied name. The `:ref` in the URL must be formatted as `heads/<branch name>` for branches and `tags/<tag name>` for tags. If the `:ref` doesn't exist in the repository, but existing refs start with `:ref`, they will be returned as an array.\n\nWhen you use this endpoint without providing a `:ref`, it will return an array of all the references from your Git database, including notes and stashes if they exist on the server. Anything in the namespace is returned, not just `heads` and `tags`.\n\n> [!NOTE]\n> You need to explicitly [request a pull request](https://docs.github.com/rest/pulls/pulls#get-a-pull-request) to trigger a test merge commit, which checks the mergeability of pull requests. For more information, see \"[Checking mergeability of pull requests](https://docs.github.com/rest/guides/getting-started-with-the-git-database-api#checking-mergeability-of-pull-requests)\".\n\nIf you request matching references for a branch named `feature` but the branch `feature` doesn't exist, the response can still include other matching head refs that start with the word `feature`, such as `featureA` and `featureB`.\n */\n  @aiFunction({\n    name: 'github_git_list_matching_refs',\n    description: `Returns an array of references from your Git database that match the supplied name. The \\`:ref\\` in the URL must be formatted as \\`heads/<branch name>\\` for branches and \\`tags/<tag name>\\` for tags. If the \\`:ref\\` doesn't exist in the repository, but existing refs start with \\`:ref\\`, they will be returned as an array.\n\nWhen you use this endpoint without providing a \\`:ref\\`, it will return an array of all the references from your Git database, including notes and stashes if they exist on the server. Anything in the namespace is returned, not just \\`heads\\` and \\`tags\\`.\n\n> [!NOTE]\n> You need to explicitly [request a pull request](https://docs.github.com/rest/pulls/pulls#get-a-pull-request) to trigger a test merge commit, which checks the mergeability of pull requests. For more information, see \"[Checking mergeability of pull requests](https://docs.github.com/rest/guides/getting-started-with-the-git-database-api#checking-mergeability-of-pull-requests)\".\n\nIf you request matching references for a branch named \\`feature\\` but the branch \\`feature\\` doesn't exist, the response can still include other matching head refs that start with the word \\`feature\\`, such as \\`featureA\\` and \\`featureB\\`.`,\n    inputSchema: github.GitListMatchingRefsParamsSchema,\n    tags: ['git']\n  })\n  async gitListMatchingRefs(\n    params: github.GitListMatchingRefsParams\n  ): Promise<github.GitListMatchingRefsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/git/matching-refs/${params.ref}`,\n        {}\n      )\n      .json<github.GitListMatchingRefsResponse>()\n  }\n\n  /**\n * Returns a single reference from your Git database. The `:ref` in the URL must be formatted as `heads/<branch name>` for branches and `tags/<tag name>` for tags. If the `:ref` doesn't match an existing ref, a `404` is returned.\n\n> [!NOTE]\n> You need to explicitly [request a pull request](https://docs.github.com/rest/pulls/pulls#get-a-pull-request) to trigger a test merge commit, which checks the mergeability of pull requests. For more information, see \"[Checking mergeability of pull requests](https://docs.github.com/rest/guides/getting-started-with-the-git-database-api#checking-mergeability-of-pull-requests)\".\n */\n  @aiFunction({\n    name: 'github_git_get_ref',\n    description: `Returns a single reference from your Git database. The \\`:ref\\` in the URL must be formatted as \\`heads/<branch name>\\` for branches and \\`tags/<tag name>\\` for tags. If the \\`:ref\\` doesn't match an existing ref, a \\`404\\` is returned.\n\n> [!NOTE]\n> You need to explicitly [request a pull request](https://docs.github.com/rest/pulls/pulls#get-a-pull-request) to trigger a test merge commit, which checks the mergeability of pull requests. For more information, see \"[Checking mergeability of pull requests](https://docs.github.com/rest/guides/getting-started-with-the-git-database-api#checking-mergeability-of-pull-requests)\".`,\n    inputSchema: github.GitGetRefParamsSchema,\n    tags: ['git']\n  })\n  async gitGetRef(\n    params: github.GitGetRefParams\n  ): Promise<github.GitGetRefResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/git/ref/${params.ref}`,\n        {}\n      )\n      .json<github.GitGetRefResponse>()\n  }\n\n  /**\n   * Creates a reference for your repository. You are unable to create new references for empty repositories, even if the commit SHA-1 hash used exists. Empty repositories are repositories without branches.\n   */\n  @aiFunction({\n    name: 'github_git_create_ref',\n    description: `Creates a reference for your repository. You are unable to create new references for empty repositories, even if the commit SHA-1 hash used exists. Empty repositories are repositories without branches.`,\n    inputSchema: github.GitCreateRefParamsSchema,\n    tags: ['git']\n  })\n  async gitCreateRef(\n    params: github.GitCreateRefParams\n  ): Promise<github.GitCreateRefResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/git/refs`, {\n        json: pick(params, 'ref', 'sha')\n      })\n      .json<github.GitCreateRefResponse>()\n  }\n\n  /**\n   * Deletes the provided reference.\n   */\n  @aiFunction({\n    name: 'github_git_delete_ref',\n    description: `Deletes the provided reference.`,\n    inputSchema: github.GitDeleteRefParamsSchema,\n    tags: ['git']\n  })\n  async gitDeleteRef(\n    params: github.GitDeleteRefParams\n  ): Promise<github.GitDeleteRefResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/git/refs/${params.ref}`,\n        {}\n      )\n      .json<github.GitDeleteRefResponse>()\n  }\n\n  /**\n   * Updates the provided reference to point to a new SHA. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.\n   */\n  @aiFunction({\n    name: 'github_git_update_ref',\n    description: `Updates the provided reference to point to a new SHA. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.`,\n    inputSchema: github.GitUpdateRefParamsSchema,\n    tags: ['git']\n  })\n  async gitUpdateRef(\n    params: github.GitUpdateRefParams\n  ): Promise<github.GitUpdateRefResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/git/refs/${params.ref}`,\n        {\n          json: pick(params, 'sha', 'force')\n        }\n      )\n      .json<github.GitUpdateRefResponse>()\n  }\n\n  /**\n * Note that creating a tag object does not create the reference that makes a tag in Git. If you want to create an annotated tag in Git, you have to do this call to create the tag object, and then [create](https://docs.github.com/rest/git/refs#create-a-reference) the `refs/tags/[tag]` reference. If you want to create a lightweight tag, you only have to [create](https://docs.github.com/rest/git/refs#create-a-reference) the tag reference - this call would be unnecessary.\n\n**Signature verification object**\n\nThe response will include a `verification` object that describes the result of verifying the commit's signature. The following fields are included in the `verification` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| `verified` | `boolean` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| `reason` | `string` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| `signature` | `string` | The signature that was extracted from the commit. |\n| `payload` | `string` | The value that was signed. |\n| `verified_at` | `string` | The date the signature was verified by GitHub. |\n\nThese are the possible values for `reason` in the `verification` object:\n\n| Value | Description |\n| ----- | ----------- |\n| `expired_key` | The key that made the signature is expired. |\n| `not_signing_key` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| `gpgverify_error` | There was an error communicating with the signature verification service. |\n| `gpgverify_unavailable` | The signature verification service is currently unavailable. |\n| `unsigned` | The object does not include a signature. |\n| `unknown_signature_type` | A non-PGP signature was found in the commit. |\n| `no_user` | No user was associated with the `committer` email address in the commit. |\n| `unverified_email` | The `committer` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| `bad_email` | The `committer` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| `unknown_key` | The key that made the signature has not been registered with any user's account. |\n| `malformed_signature` | There was an error parsing the signature. |\n| `invalid` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| `valid` | None of the above errors applied, so the signature is considered to be verified. |.\n */\n  @aiFunction({\n    name: 'github_git_create_tag',\n    description: `Note that creating a tag object does not create the reference that makes a tag in Git. If you want to create an annotated tag in Git, you have to do this call to create the tag object, and then [create](https://docs.github.com/rest/git/refs#create-a-reference) the \\`refs/tags/[tag]\\` reference. If you want to create a lightweight tag, you only have to [create](https://docs.github.com/rest/git/refs#create-a-reference) the tag reference - this call would be unnecessary.\n\n**Signature verification object**\n\nThe response will include a \\`verification\\` object that describes the result of verifying the commit's signature. The following fields are included in the \\`verification\\` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| \\`verified\\` | \\`boolean\\` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| \\`reason\\` | \\`string\\` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| \\`signature\\` | \\`string\\` | The signature that was extracted from the commit. |\n| \\`payload\\` | \\`string\\` | The value that was signed. |\n| \\`verified_at\\` | \\`string\\` | The date the signature was verified by GitHub. |\n\nThese are the possible values for \\`reason\\` in the \\`verification\\` object:\n\n| Value | Description |\n| ----- | ----------- |\n| \\`expired_key\\` | The key that made the signature is expired. |\n| \\`not_signing_key\\` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| \\`gpgverify_error\\` | There was an error communicating with the signature verification service. |\n| \\`gpgverify_unavailable\\` | The signature verification service is currently unavailable. |\n| \\`unsigned\\` | The object does not include a signature. |\n| \\`unknown_signature_type\\` | A non-PGP signature was found in the commit. |\n| \\`no_user\\` | No user was associated with the \\`committer\\` email address in the commit. |\n| \\`unverified_email\\` | The \\`committer\\` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| \\`bad_email\\` | The \\`committer\\` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| \\`unknown_key\\` | The key that made the signature has not been registered with any user's account. |\n| \\`malformed_signature\\` | There was an error parsing the signature. |\n| \\`invalid\\` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| \\`valid\\` | None of the above errors applied, so the signature is considered to be verified. |.`,\n    inputSchema: github.GitCreateTagParamsSchema,\n    tags: ['git']\n  })\n  async gitCreateTag(\n    params: github.GitCreateTagParams\n  ): Promise<github.GitCreateTagResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/git/tags`, {\n        json: pick(params, 'tag', 'message', 'object', 'type', 'tagger')\n      })\n      .json<github.GitCreateTagResponse>()\n  }\n\n  /**\n * **Signature verification object**\n\nThe response will include a `verification` object that describes the result of verifying the commit's signature. The following fields are included in the `verification` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| `verified` | `boolean` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| `reason` | `string` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| `signature` | `string` | The signature that was extracted from the commit. |\n| `payload` | `string` | The value that was signed. |\n| `verified_at` | `string` | The date the signature was verified by GitHub. |\n\nThese are the possible values for `reason` in the `verification` object:\n\n| Value | Description |\n| ----- | ----------- |\n| `expired_key` | The key that made the signature is expired. |\n| `not_signing_key` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| `gpgverify_error` | There was an error communicating with the signature verification service. |\n| `gpgverify_unavailable` | The signature verification service is currently unavailable. |\n| `unsigned` | The object does not include a signature. |\n| `unknown_signature_type` | A non-PGP signature was found in the commit. |\n| `no_user` | No user was associated with the `committer` email address in the commit. |\n| `unverified_email` | The `committer` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| `bad_email` | The `committer` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| `unknown_key` | The key that made the signature has not been registered with any user's account. |\n| `malformed_signature` | There was an error parsing the signature. |\n| `invalid` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| `valid` | None of the above errors applied, so the signature is considered to be verified. |.\n */\n  @aiFunction({\n    name: 'github_git_get_tag',\n    description: `**Signature verification object**\n\nThe response will include a \\`verification\\` object that describes the result of verifying the commit's signature. The following fields are included in the \\`verification\\` object:\n\n| Name | Type | Description |\n| ---- | ---- | ----------- |\n| \\`verified\\` | \\`boolean\\` | Indicates whether GitHub considers the signature in this commit to be verified. |\n| \\`reason\\` | \\`string\\` | The reason for verified value. Possible values and their meanings are enumerated in table below. |\n| \\`signature\\` | \\`string\\` | The signature that was extracted from the commit. |\n| \\`payload\\` | \\`string\\` | The value that was signed. |\n| \\`verified_at\\` | \\`string\\` | The date the signature was verified by GitHub. |\n\nThese are the possible values for \\`reason\\` in the \\`verification\\` object:\n\n| Value | Description |\n| ----- | ----------- |\n| \\`expired_key\\` | The key that made the signature is expired. |\n| \\`not_signing_key\\` | The \"signing\" flag is not among the usage flags in the GPG key that made the signature. |\n| \\`gpgverify_error\\` | There was an error communicating with the signature verification service. |\n| \\`gpgverify_unavailable\\` | The signature verification service is currently unavailable. |\n| \\`unsigned\\` | The object does not include a signature. |\n| \\`unknown_signature_type\\` | A non-PGP signature was found in the commit. |\n| \\`no_user\\` | No user was associated with the \\`committer\\` email address in the commit. |\n| \\`unverified_email\\` | The \\`committer\\` email address in the commit was associated with a user, but the email address is not verified on their account. |\n| \\`bad_email\\` | The \\`committer\\` email address in the commit is not included in the identities of the PGP key that made the signature. |\n| \\`unknown_key\\` | The key that made the signature has not been registered with any user's account. |\n| \\`malformed_signature\\` | There was an error parsing the signature. |\n| \\`invalid\\` | The signature could not be cryptographically verified using the key whose key-id was found in the signature. |\n| \\`valid\\` | None of the above errors applied, so the signature is considered to be verified. |.`,\n    inputSchema: github.GitGetTagParamsSchema,\n    tags: ['git']\n  })\n  async gitGetTag(\n    params: github.GitGetTagParams\n  ): Promise<github.GitGetTagResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/git/tags/${params.tag_sha}`,\n        {}\n      )\n      .json<github.GitGetTagResponse>()\n  }\n\n  /**\n * The tree creation API accepts nested entries. If you specify both a tree and a nested path modifying that tree, this endpoint will overwrite the contents of the tree with the new path contents, and create a new tree structure.\n\nIf you use this endpoint to add, delete, or modify the file contents in a tree, you will need to commit the tree and then update a branch to point to the commit. For more information see \"[Create a commit](https://docs.github.com/rest/git/commits#create-a-commit)\" and \"[Update a reference](https://docs.github.com/rest/git/refs#update-a-reference).\"\n\nReturns an error if you try to delete a file that does not exist.\n */\n  @aiFunction({\n    name: 'github_git_create_tree',\n    description: `The tree creation API accepts nested entries. If you specify both a tree and a nested path modifying that tree, this endpoint will overwrite the contents of the tree with the new path contents, and create a new tree structure.\n\nIf you use this endpoint to add, delete, or modify the file contents in a tree, you will need to commit the tree and then update a branch to point to the commit. For more information see \"[Create a commit](https://docs.github.com/rest/git/commits#create-a-commit)\" and \"[Update a reference](https://docs.github.com/rest/git/refs#update-a-reference).\"\n\nReturns an error if you try to delete a file that does not exist.`,\n    inputSchema: github.GitCreateTreeParamsSchema,\n    tags: ['git']\n  })\n  async gitCreateTree(\n    params: github.GitCreateTreeParams\n  ): Promise<github.GitCreateTreeResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/git/trees`, {\n        json: pick(params, 'tree', 'base_tree')\n      })\n      .json<github.GitCreateTreeResponse>()\n  }\n\n  /**\n * Returns a single tree using the SHA1 value or ref name for that tree.\n\nIf `truncated` is `true` in the response then the number of items in the `tree` array exceeded our maximum limit. If you need to fetch more items, use the non-recursive method of fetching trees, and fetch one sub-tree at a time.\n\n> [!NOTE]\n> The limit for the `tree` array is 100,000 entries with a maximum size of 7 MB when using the `recursive` parameter.\n */\n  @aiFunction({\n    name: 'github_git_get_tree',\n    description: `Returns a single tree using the SHA1 value or ref name for that tree.\n\nIf \\`truncated\\` is \\`true\\` in the response then the number of items in the \\`tree\\` array exceeded our maximum limit. If you need to fetch more items, use the non-recursive method of fetching trees, and fetch one sub-tree at a time.\n\n> [!NOTE]\n> The limit for the \\`tree\\` array is 100,000 entries with a maximum size of 7 MB when using the \\`recursive\\` parameter.`,\n    inputSchema: github.GitGetTreeParamsSchema,\n    tags: ['git']\n  })\n  async gitGetTree(\n    params: github.GitGetTreeParams\n  ): Promise<github.GitGetTreeResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/git/trees/${params.tree_sha}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'recursive'))\n        }\n      )\n      .json<github.GitGetTreeResponse>()\n  }\n\n  /**\n   * Lists webhooks for a repository. `last response` may return null if there have not been any deliveries within 30 days.\n   */\n  @aiFunction({\n    name: 'github_repos_list_webhooks',\n    description: `Lists webhooks for a repository. \\`last response\\` may return null if there have not been any deliveries within 30 days.`,\n    inputSchema: github.ReposListWebhooksParamsSchema,\n    tags: ['repos']\n  })\n  async reposListWebhooks(\n    params: github.ReposListWebhooksParams\n  ): Promise<github.ReposListWebhooksResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/hooks`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListWebhooksResponse>()\n  }\n\n  /**\n * Repositories can have multiple webhooks installed. Each webhook should have a unique `config`. Multiple webhooks can\nshare the same `config` as long as those webhooks do not have any `events` that overlap.\n */\n  @aiFunction({\n    name: 'github_repos_create_webhook',\n    description: `Repositories can have multiple webhooks installed. Each webhook should have a unique \\`config\\`. Multiple webhooks can\nshare the same \\`config\\` as long as those webhooks do not have any \\`events\\` that overlap.`,\n    inputSchema: github.ReposCreateWebhookParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateWebhook(\n    params: github.ReposCreateWebhookParams\n  ): Promise<github.ReposCreateWebhookResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/hooks`, {\n        json: pick(params, 'name', 'config', 'events', 'active')\n      })\n      .json<github.ReposCreateWebhookResponse>()\n  }\n\n  /**\n   * Returns a webhook configured in a repository. To get only the webhook `config` properties, see \"[Get a webhook configuration for a repository](/rest/webhooks/repo-config#get-a-webhook-configuration-for-a-repository).\".\n   */\n  @aiFunction({\n    name: 'github_repos_get_webhook',\n    description: `Returns a webhook configured in a repository. To get only the webhook \\`config\\` properties, see \"[Get a webhook configuration for a repository](/rest/webhooks/repo-config#get-a-webhook-configuration-for-a-repository).\".`,\n    inputSchema: github.ReposGetWebhookParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetWebhook(\n    params: github.ReposGetWebhookParams\n  ): Promise<github.ReposGetWebhookResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}`,\n        {}\n      )\n      .json<github.ReposGetWebhookResponse>()\n  }\n\n  /**\n * Delete a webhook for an organization.\n\nThe authenticated user must be a repository owner, or have admin access in the repository, to delete the webhook.\n */\n  @aiFunction({\n    name: 'github_repos_delete_webhook',\n    description: `Delete a webhook for an organization.\n\nThe authenticated user must be a repository owner, or have admin access in the repository, to delete the webhook.`,\n    inputSchema: github.ReposDeleteWebhookParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteWebhook(\n    params: github.ReposDeleteWebhookParams\n  ): Promise<github.ReposDeleteWebhookResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}`,\n        {}\n      )\n      .json<github.ReposDeleteWebhookResponse>()\n  }\n\n  /**\n   * Updates a webhook configured in a repository. If you previously had a `secret` set, you must provide the same `secret` or set a new `secret` or the secret will be removed. If you are only updating individual webhook `config` properties, use \"[Update a webhook configuration for a repository](/rest/webhooks/repo-config#update-a-webhook-configuration-for-a-repository).\".\n   */\n  @aiFunction({\n    name: 'github_repos_update_webhook',\n    description: `Updates a webhook configured in a repository. If you previously had a \\`secret\\` set, you must provide the same \\`secret\\` or set a new \\`secret\\` or the secret will be removed. If you are only updating individual webhook \\`config\\` properties, use \"[Update a webhook configuration for a repository](/rest/webhooks/repo-config#update-a-webhook-configuration-for-a-repository).\".`,\n    inputSchema: github.ReposUpdateWebhookParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateWebhook(\n    params: github.ReposUpdateWebhookParams\n  ): Promise<github.ReposUpdateWebhookResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}`,\n        {\n          json: pick(\n            params,\n            'config',\n            'events',\n            'add_events',\n            'remove_events',\n            'active'\n          )\n        }\n      )\n      .json<github.ReposUpdateWebhookResponse>()\n  }\n\n  /**\n * Returns the webhook configuration for a repository. To get more information about the webhook, including the `active` state and `events`, use \"[Get a repository webhook](/rest/webhooks/repos#get-a-repository-webhook).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:repo_hook` or `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_get_webhook_config_for_repo',\n    description: `Returns the webhook configuration for a repository. To get more information about the webhook, including the \\`active\\` state and \\`events\\`, use \"[Get a repository webhook](/rest/webhooks/repos#get-a-repository-webhook).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:repo_hook\\` or \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposGetWebhookConfigForRepoParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetWebhookConfigForRepo(\n    params: github.ReposGetWebhookConfigForRepoParams\n  ): Promise<github.ReposGetWebhookConfigForRepoResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}/config`,\n        {}\n      )\n      .json<github.ReposGetWebhookConfigForRepoResponse>()\n  }\n\n  /**\n * Updates the webhook configuration for a repository. To update more information about the webhook, including the `active` state and `events`, use \"[Update a repository webhook](/rest/webhooks/repos#update-a-repository-webhook).\"\n\nOAuth app tokens and personal access tokens (classic) need the `write:repo_hook` or `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_update_webhook_config_for_repo',\n    description: `Updates the webhook configuration for a repository. To update more information about the webhook, including the \\`active\\` state and \\`events\\`, use \"[Update a repository webhook](/rest/webhooks/repos#update-a-repository-webhook).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:repo_hook\\` or \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposUpdateWebhookConfigForRepoParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateWebhookConfigForRepo(\n    params: github.ReposUpdateWebhookConfigForRepoParams\n  ): Promise<github.ReposUpdateWebhookConfigForRepoResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}/config`,\n        {\n          json: pick(params, 'url', 'content_type', 'secret', 'insecure_ssl')\n        }\n      )\n      .json<github.ReposUpdateWebhookConfigForRepoResponse>()\n  }\n\n  /**\n   * Returns a list of webhook deliveries for a webhook configured in a repository.\n   */\n  @aiFunction({\n    name: 'github_repos_list_webhook_deliveries',\n    description: `Returns a list of webhook deliveries for a webhook configured in a repository.`,\n    inputSchema: github.ReposListWebhookDeliveriesParamsSchema,\n    tags: ['repos']\n  })\n  async reposListWebhookDeliveries(\n    params: github.ReposListWebhookDeliveriesParams\n  ): Promise<github.ReposListWebhookDeliveriesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}/deliveries`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'cursor'))\n        }\n      )\n      .json<github.ReposListWebhookDeliveriesResponse>()\n  }\n\n  /**\n   * Returns a delivery for a webhook configured in a repository.\n   */\n  @aiFunction({\n    name: 'github_repos_get_webhook_delivery',\n    description: `Returns a delivery for a webhook configured in a repository.`,\n    inputSchema: github.ReposGetWebhookDeliveryParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetWebhookDelivery(\n    params: github.ReposGetWebhookDeliveryParams\n  ): Promise<github.ReposGetWebhookDeliveryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}/deliveries/${params.delivery_id}`,\n        {}\n      )\n      .json<github.ReposGetWebhookDeliveryResponse>()\n  }\n\n  /**\n   * Redeliver a webhook delivery for a webhook configured in a repository.\n   */\n  @aiFunction({\n    name: 'github_repos_redeliver_webhook_delivery',\n    description: `Redeliver a webhook delivery for a webhook configured in a repository.`,\n    inputSchema: github.ReposRedeliverWebhookDeliveryParamsSchema,\n    tags: ['repos']\n  })\n  async reposRedeliverWebhookDelivery(\n    params: github.ReposRedeliverWebhookDeliveryParams\n  ): Promise<github.ReposRedeliverWebhookDeliveryResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}/deliveries/${params.delivery_id}/attempts`,\n        {}\n      )\n      .json<github.ReposRedeliverWebhookDeliveryResponse>()\n  }\n\n  /**\n   * This will trigger a [ping event](https://docs.github.com/webhooks/#ping-event) to be sent to the hook.\n   */\n  @aiFunction({\n    name: 'github_repos_ping_webhook',\n    description: `This will trigger a [ping event](https://docs.github.com/webhooks/#ping-event) to be sent to the hook.`,\n    inputSchema: github.ReposPingWebhookParamsSchema,\n    tags: ['repos']\n  })\n  async reposPingWebhook(\n    params: github.ReposPingWebhookParams\n  ): Promise<github.ReposPingWebhookResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}/pings`,\n        {}\n      )\n      .json<github.ReposPingWebhookResponse>()\n  }\n\n  /**\n * This will trigger the hook with the latest push to the current repository if the hook is subscribed to `push` events. If the hook is not subscribed to `push` events, the server will respond with 204 but no test POST will be generated.\n\n> [!NOTE]\n> Previously `/repos/:owner/:repo/hooks/:hook_id/test`.\n */\n  @aiFunction({\n    name: 'github_repos_test_push_webhook',\n    description: `This will trigger the hook with the latest push to the current repository if the hook is subscribed to \\`push\\` events. If the hook is not subscribed to \\`push\\` events, the server will respond with 204 but no test POST will be generated.\n\n> [!NOTE]\n> Previously \\`/repos/:owner/:repo/hooks/:hook_id/test\\`.`,\n    inputSchema: github.ReposTestPushWebhookParamsSchema,\n    tags: ['repos']\n  })\n  async reposTestPushWebhook(\n    params: github.ReposTestPushWebhookParams\n  ): Promise<github.ReposTestPushWebhookResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/hooks/${params.hook_id}/tests`,\n        {}\n      )\n      .json<github.ReposTestPushWebhookResponse>()\n  }\n\n  /**\n * View the progress of an import.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n\n**Import status**\n\nThis section includes details about the possible values of the `status` field of the Import Progress response.\n\nAn import that does not have errors will progress through these steps:\n\n*   `detecting` - the \"detection\" step of the import is in progress because the request did not include a `vcs` parameter. The import is identifying the type of source control present at the URL.\n*   `importing` - the \"raw\" step of the import is in progress. This is where commit data is fetched from the original repository. The import progress response will include `commit_count` (the total number of raw commits that will be imported) and `percent` (0 - 100, the current progress through the import).\n*   `mapping` - the \"rewrite\" step of the import is in progress. This is where SVN branches are converted to Git branches, and where author updates are applied. The import progress response does not include progress information.\n*   `pushing` - the \"push\" step of the import is in progress. This is where the importer updates the repository on GitHub. The import progress response will include `push_percent`, which is the percent value reported by `git push` when it is \"Writing objects\".\n*   `complete` - the import is complete, and the repository is ready on GitHub.\n\nIf there are problems, you will see one of these in the `status` field:\n\n*   `auth_failed` - the import requires authentication in order to connect to the original repository. To update authentication for the import, please see the [Update an import](https://docs.github.com/rest/migrations/source-imports#update-an-import) section.\n*   `error` - the import encountered an error. The import progress response will include the `failed_step` and an error message. Contact [GitHub Support](https://support.github.com/contact?tags=dotcom-rest-api) for more information.\n*   `detection_needs_auth` - the importer requires authentication for the originating repository to continue detection. To update authentication for the import, please see the [Update an import](https://docs.github.com/rest/migrations/source-imports#update-an-import) section.\n*   `detection_found_nothing` - the importer didn't recognize any source control at the URL. To resolve, [Cancel the import](https://docs.github.com/rest/migrations/source-imports#cancel-an-import) and [retry](https://docs.github.com/rest/migrations/source-imports#start-an-import) with the correct URL.\n*   `detection_found_multiple` - the importer found several projects or repositories at the provided URL. When this is the case, the Import Progress response will also include a `project_choices` field with the possible project choices as values. To update project choice, please see the [Update an import](https://docs.github.com/rest/migrations/source-imports#update-an-import) section.\n\n**The project_choices field**\n\nWhen multiple projects are found at the provided URL, the response hash will include a `project_choices` field, the value of which is an array of hashes each representing a project choice. The exact key/value pairs of the project hashes will differ depending on the version control type.\n\n**Git LFS related fields**\n\nThis section includes details about Git LFS related fields that may be present in the Import Progress response.\n\n*   `use_lfs` - describes whether the import has been opted in or out of using Git LFS. The value can be `opt_in`, `opt_out`, or `undecided` if no action has been taken.\n*   `has_large_files` - the boolean value describing whether files larger than 100MB were found during the `importing` step.\n*   `large_files_size` - the total size in gigabytes of files larger than 100MB found in the originating repository.\n*   `large_files_count` - the total number of files larger than 100MB found in the originating repository. To see a list of these files, make a \"Get Large Files\" request.\n */\n  @aiFunction({\n    name: 'github_migrations_get_import_status',\n    description: `View the progress of an import.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n\n**Import status**\n\nThis section includes details about the possible values of the \\`status\\` field of the Import Progress response.\n\nAn import that does not have errors will progress through these steps:\n\n*   \\`detecting\\` - the \"detection\" step of the import is in progress because the request did not include a \\`vcs\\` parameter. The import is identifying the type of source control present at the URL.\n*   \\`importing\\` - the \"raw\" step of the import is in progress. This is where commit data is fetched from the original repository. The import progress response will include \\`commit_count\\` (the total number of raw commits that will be imported) and \\`percent\\` (0 - 100, the current progress through the import).\n*   \\`mapping\\` - the \"rewrite\" step of the import is in progress. This is where SVN branches are converted to Git branches, and where author updates are applied. The import progress response does not include progress information.\n*   \\`pushing\\` - the \"push\" step of the import is in progress. This is where the importer updates the repository on GitHub. The import progress response will include \\`push_percent\\`, which is the percent value reported by \\`git push\\` when it is \"Writing objects\".\n*   \\`complete\\` - the import is complete, and the repository is ready on GitHub.\n\nIf there are problems, you will see one of these in the \\`status\\` field:\n\n*   \\`auth_failed\\` - the import requires authentication in order to connect to the original repository. To update authentication for the import, please see the [Update an import](https://docs.github.com/rest/migrations/source-imports#update-an-import) section.\n*   \\`error\\` - the import encountered an error. The import progress response will include the \\`failed_step\\` and an error message. Contact [GitHub Support](https://support.github.com/contact?tags=dotcom-rest-api) for more information.\n*   \\`detection_needs_auth\\` - the importer requires authentication for the originating repository to continue detection. To update authentication for the import, please see the [Update an import](https://docs.github.com/rest/migrations/source-imports#update-an-import) section.\n*   \\`detection_found_nothing\\` - the importer didn't recognize any source control at the URL. To resolve, [Cancel the import](https://docs.github.com/rest/migrations/source-imports#cancel-an-import) and [retry](https://docs.github.com/rest/migrations/source-imports#start-an-import) with the correct URL.\n*   \\`detection_found_multiple\\` - the importer found several projects or repositories at the provided URL. When this is the case, the Import Progress response will also include a \\`project_choices\\` field with the possible project choices as values. To update project choice, please see the [Update an import](https://docs.github.com/rest/migrations/source-imports#update-an-import) section.\n\n**The project_choices field**\n\nWhen multiple projects are found at the provided URL, the response hash will include a \\`project_choices\\` field, the value of which is an array of hashes each representing a project choice. The exact key/value pairs of the project hashes will differ depending on the version control type.\n\n**Git LFS related fields**\n\nThis section includes details about Git LFS related fields that may be present in the Import Progress response.\n\n*   \\`use_lfs\\` - describes whether the import has been opted in or out of using Git LFS. The value can be \\`opt_in\\`, \\`opt_out\\`, or \\`undecided\\` if no action has been taken.\n*   \\`has_large_files\\` - the boolean value describing whether files larger than 100MB were found during the \\`importing\\` step.\n*   \\`large_files_size\\` - the total size in gigabytes of files larger than 100MB found in the originating repository.\n*   \\`large_files_count\\` - the total number of files larger than 100MB found in the originating repository. To see a list of these files, make a \"Get Large Files\" request.`,\n    inputSchema: github.MigrationsGetImportStatusParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsGetImportStatus(\n    params: github.MigrationsGetImportStatusParams\n  ): Promise<github.MigrationsGetImportStatusResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/import`, {})\n      .json<github.MigrationsGetImportStatusResponse>()\n  }\n\n  /**\n * Start a source import to a GitHub repository using GitHub Importer.\nImporting into a GitHub repository with GitHub Actions enabled is not supported and will\nreturn a status `422 Unprocessable Entity` response.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n */\n  @aiFunction({\n    name: 'github_migrations_start_import',\n    description: `Start a source import to a GitHub repository using GitHub Importer.\nImporting into a GitHub repository with GitHub Actions enabled is not supported and will\nreturn a status \\`422 Unprocessable Entity\\` response.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).`,\n    inputSchema: github.MigrationsStartImportParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsStartImport(\n    params: github.MigrationsStartImportParams\n  ): Promise<github.MigrationsStartImportResponse> {\n    return this.ky\n      .put(`/repos/${params.owner}/${params.repo}/import`, {\n        json: pick(\n          params,\n          'vcs_url',\n          'vcs',\n          'vcs_username',\n          'vcs_password',\n          'tfvc_project'\n        )\n      })\n      .json<github.MigrationsStartImportResponse>()\n  }\n\n  /**\n * Stop an import for a repository.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n */\n  @aiFunction({\n    name: 'github_migrations_cancel_import',\n    description: `Stop an import for a repository.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).`,\n    inputSchema: github.MigrationsCancelImportParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsCancelImport(\n    params: github.MigrationsCancelImportParams\n  ): Promise<github.MigrationsCancelImportResponse> {\n    return this.ky\n      .delete(`/repos/${params.owner}/${params.repo}/import`, {})\n      .json<github.MigrationsCancelImportResponse>()\n  }\n\n  /**\n * An import can be updated with credentials or a project choice by passing in the appropriate parameters in this API\nrequest. If no parameters are provided, the import will be restarted.\n\nSome servers (e.g. TFS servers) can have several projects at a single URL. In those cases the import progress will\nhave the status `detection_found_multiple` and the Import Progress response will include a `project_choices` array.\nYou can select the project to import by providing one of the objects in the `project_choices` array in the update request.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n */\n  @aiFunction({\n    name: 'github_migrations_update_import',\n    description: `An import can be updated with credentials or a project choice by passing in the appropriate parameters in this API\nrequest. If no parameters are provided, the import will be restarted.\n\nSome servers (e.g. TFS servers) can have several projects at a single URL. In those cases the import progress will\nhave the status \\`detection_found_multiple\\` and the Import Progress response will include a \\`project_choices\\` array.\nYou can select the project to import by providing one of the objects in the \\`project_choices\\` array in the update request.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).`,\n    inputSchema: github.MigrationsUpdateImportParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsUpdateImport(\n    params: github.MigrationsUpdateImportParams\n  ): Promise<github.MigrationsUpdateImportResponse> {\n    return this.ky\n      .patch(`/repos/${params.owner}/${params.repo}/import`, {\n        json: pick(\n          params,\n          'vcs_username',\n          'vcs_password',\n          'vcs',\n          'tfvc_project'\n        )\n      })\n      .json<github.MigrationsUpdateImportResponse>()\n  }\n\n  /**\n * Each type of source control system represents authors in a different way. For example, a Git commit author has a display name and an email address, but a Subversion commit author just has a username. The GitHub Importer will make the author information valid, but the author might not be correct. For example, it will change the bare Subversion username `hubot` into something like `hubot <hubot@12341234-abab-fefe-8787-fedcba987654>`.\n\nThis endpoint and the [Map a commit author](https://docs.github.com/rest/migrations/source-imports#map-a-commit-author) endpoint allow you to provide correct Git author information.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n */\n  @aiFunction({\n    name: 'github_migrations_get_commit_authors',\n    description: `Each type of source control system represents authors in a different way. For example, a Git commit author has a display name and an email address, but a Subversion commit author just has a username. The GitHub Importer will make the author information valid, but the author might not be correct. For example, it will change the bare Subversion username \\`hubot\\` into something like \\`hubot <hubot@12341234-abab-fefe-8787-fedcba987654>\\`.\n\nThis endpoint and the [Map a commit author](https://docs.github.com/rest/migrations/source-imports#map-a-commit-author) endpoint allow you to provide correct Git author information.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).`,\n    inputSchema: github.MigrationsGetCommitAuthorsParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsGetCommitAuthors(\n    params: github.MigrationsGetCommitAuthorsParams\n  ): Promise<github.MigrationsGetCommitAuthorsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/import/authors`, {\n        searchParams: sanitizeSearchParams(pick(params, 'since'))\n      })\n      .json<github.MigrationsGetCommitAuthorsResponse>()\n  }\n\n  /**\n * Update an author's identity for the import. Your application can continue updating authors any time before you push\nnew commits to the repository.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n */\n  @aiFunction({\n    name: 'github_migrations_map_commit_author',\n    description: `Update an author's identity for the import. Your application can continue updating authors any time before you push\nnew commits to the repository.\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).`,\n    inputSchema: github.MigrationsMapCommitAuthorParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsMapCommitAuthor(\n    params: github.MigrationsMapCommitAuthorParams\n  ): Promise<github.MigrationsMapCommitAuthorResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/import/authors/${params.author_id}`,\n        {\n          json: pick(params, 'email', 'name')\n        }\n      )\n      .json<github.MigrationsMapCommitAuthorResponse>()\n  }\n\n  /**\n * List files larger than 100MB found during the import\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n */\n  @aiFunction({\n    name: 'github_migrations_get_large_files',\n    description: `List files larger than 100MB found during the import\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).`,\n    inputSchema: github.MigrationsGetLargeFilesParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsGetLargeFiles(\n    params: github.MigrationsGetLargeFilesParams\n  ): Promise<github.MigrationsGetLargeFilesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/import/large_files`, {})\n      .json<github.MigrationsGetLargeFilesResponse>()\n  }\n\n  /**\n * You can import repositories from Subversion, Mercurial, and TFS that include files larger than 100MB. This ability\nis powered by [Git LFS](https://git-lfs.com).\n\nYou can learn more about our LFS feature and working with large files [on our help\nsite](https://docs.github.com/repositories/working-with-files/managing-large-files).\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).\n */\n  @aiFunction({\n    name: 'github_migrations_set_lfs_preference',\n    description: `You can import repositories from Subversion, Mercurial, and TFS that include files larger than 100MB. This ability\nis powered by [Git LFS](https://git-lfs.com).\n\nYou can learn more about our LFS feature and working with large files [on our help\nsite](https://docs.github.com/repositories/working-with-files/managing-large-files).\n\n> [!WARNING]\n> **Endpoint closing down notice:** Due to very low levels of usage and available alternatives, this endpoint is closing down and will no longer be available from 00:00 UTC on April 12, 2024. For more details and alternatives, see the [changelog](https://gh.io/source-imports-api-deprecation).`,\n    inputSchema: github.MigrationsSetLfsPreferenceParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsSetLfsPreference(\n    params: github.MigrationsSetLfsPreferenceParams\n  ): Promise<github.MigrationsSetLfsPreferenceResponse> {\n    return this.ky\n      .patch(`/repos/${params.owner}/${params.repo}/import/lfs`, {\n        json: pick(params, 'use_lfs')\n      })\n      .json<github.MigrationsSetLfsPreferenceResponse>()\n  }\n\n  /**\n * Enables an authenticated GitHub App to find the repository's installation information. The installation's account type will be either an organization or a user account, depending which account the repository belongs to.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_repo_installation',\n    description: `Enables an authenticated GitHub App to find the repository's installation information. The installation's account type will be either an organization or a user account, depending which account the repository belongs to.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsGetRepoInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetRepoInstallation(\n    params: github.AppsGetRepoInstallationParams\n  ): Promise<github.AppsGetRepoInstallationResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/installation`, {})\n      .json<github.AppsGetRepoInstallationResponse>()\n  }\n\n  /**\n   * Shows which type of GitHub user can interact with this repository and when the restriction expires. If there are no restrictions, you will see an empty response.\n   */\n  @aiFunction({\n    name: 'github_interactions_get_restrictions_for_repo',\n    description: `Shows which type of GitHub user can interact with this repository and when the restriction expires. If there are no restrictions, you will see an empty response.`,\n    inputSchema: github.InteractionsGetRestrictionsForRepoParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsGetRestrictionsForRepo(\n    params: github.InteractionsGetRestrictionsForRepoParams\n  ): Promise<github.InteractionsGetRestrictionsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/interaction-limits`, {})\n      .json<github.InteractionsGetRestrictionsForRepoResponse>()\n  }\n\n  /**\n   * Temporarily restricts interactions to a certain type of GitHub user within the given repository. You must have owner or admin access to set these restrictions. If an interaction limit is set for the user or organization that owns this repository, you will receive a `409 Conflict` response and will not be able to use this endpoint to change the interaction limit for a single repository.\n   */\n  @aiFunction({\n    name: 'github_interactions_set_restrictions_for_repo',\n    description: `Temporarily restricts interactions to a certain type of GitHub user within the given repository. You must have owner or admin access to set these restrictions. If an interaction limit is set for the user or organization that owns this repository, you will receive a \\`409 Conflict\\` response and will not be able to use this endpoint to change the interaction limit for a single repository.`,\n    inputSchema: github.InteractionsSetRestrictionsForRepoParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsSetRestrictionsForRepo(\n    params: github.InteractionsSetRestrictionsForRepoParams\n  ): Promise<github.InteractionsSetRestrictionsForRepoResponse> {\n    return this.ky\n      .put(`/repos/${params.owner}/${params.repo}/interaction-limits`, {\n        json: pick(params, 'limit', 'expiry')\n      })\n      .json<github.InteractionsSetRestrictionsForRepoResponse>()\n  }\n\n  /**\n   * Removes all interaction restrictions from the given repository. You must have owner or admin access to remove restrictions. If the interaction limit is set for the user or organization that owns this repository, you will receive a `409 Conflict` response and will not be able to use this endpoint to change the interaction limit for a single repository.\n   */\n  @aiFunction({\n    name: 'github_interactions_remove_restrictions_for_repo',\n    description: `Removes all interaction restrictions from the given repository. You must have owner or admin access to remove restrictions. If the interaction limit is set for the user or organization that owns this repository, you will receive a \\`409 Conflict\\` response and will not be able to use this endpoint to change the interaction limit for a single repository.`,\n    inputSchema: github.InteractionsRemoveRestrictionsForRepoParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsRemoveRestrictionsForRepo(\n    params: github.InteractionsRemoveRestrictionsForRepoParams\n  ): Promise<github.InteractionsRemoveRestrictionsForRepoResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/interaction-limits`,\n        {}\n      )\n      .json<github.InteractionsRemoveRestrictionsForRepoResponse>()\n  }\n\n  /**\n   * When authenticating as a user with admin rights to a repository, this endpoint will list all currently open repository invitations.\n   */\n  @aiFunction({\n    name: 'github_repos_list_invitations',\n    description: `When authenticating as a user with admin rights to a repository, this endpoint will list all currently open repository invitations.`,\n    inputSchema: github.ReposListInvitationsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListInvitations(\n    params: github.ReposListInvitationsParams\n  ): Promise<github.ReposListInvitationsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/invitations`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListInvitationsResponse>()\n  }\n\n  /**\n   * Delete a repository invitation.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_invitation',\n    description: `Delete a repository invitation.`,\n    inputSchema: github.ReposDeleteInvitationParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteInvitation(\n    params: github.ReposDeleteInvitationParams\n  ): Promise<github.ReposDeleteInvitationResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/invitations/${params.invitation_id}`,\n        {}\n      )\n      .json<github.ReposDeleteInvitationResponse>()\n  }\n\n  /**\n   * Update a repository invitation.\n   */\n  @aiFunction({\n    name: 'github_repos_update_invitation',\n    description: `Update a repository invitation.`,\n    inputSchema: github.ReposUpdateInvitationParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateInvitation(\n    params: github.ReposUpdateInvitationParams\n  ): Promise<github.ReposUpdateInvitationResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/invitations/${params.invitation_id}`,\n        {\n          json: pick(params, 'permissions')\n        }\n      )\n      .json<github.ReposUpdateInvitationResponse>()\n  }\n\n  /**\n * List issues in a repository. Only open issues will be listed.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the `pull_request` key. Be aware that the `id` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_list_for_repo',\n    description: `List issues in a repository. Only open issues will be listed.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the \\`pull_request\\` key. Be aware that the \\`id\\` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesListForRepoParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListForRepo(\n    params: github.IssuesListForRepoParams\n  ): Promise<github.IssuesListForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/issues`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'milestone',\n            'state',\n            'assignee',\n            'type',\n            'creator',\n            'mentioned',\n            'labels',\n            'sort',\n            'direction',\n            'since',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.IssuesListForRepoResponse>()\n  }\n\n  /**\n * Any user with pull access to a repository can create an issue. If [issues are disabled in the repository](https://docs.github.com/articles/disabling-issues/), the API returns a `410 Gone` status.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_create',\n    description: `Any user with pull access to a repository can create an issue. If [issues are disabled in the repository](https://docs.github.com/articles/disabling-issues/), the API returns a \\`410 Gone\\` status.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesCreateParamsSchema,\n    tags: ['issues']\n  })\n  async issuesCreate(\n    params: github.IssuesCreateParams\n  ): Promise<github.IssuesCreateResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/issues`, {\n        json: pick(\n          params,\n          'title',\n          'body',\n          'assignee',\n          'milestone',\n          'labels',\n          'assignees',\n          'type'\n        )\n      })\n      .json<github.IssuesCreateResponse>()\n  }\n\n  /**\n * You can use the REST API to list comments on issues and pull requests for a repository. Every pull request is an issue, but not every issue is a pull request.\n\nBy default, issue comments are ordered by ascending ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_list_comments_for_repo',\n    description: `You can use the REST API to list comments on issues and pull requests for a repository. Every pull request is an issue, but not every issue is a pull request.\n\nBy default, issue comments are ordered by ascending ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesListCommentsForRepoParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListCommentsForRepo(\n    params: github.IssuesListCommentsForRepoParams\n  ): Promise<github.IssuesListCommentsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/issues/comments`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sort', 'direction', 'since', 'per_page', 'page')\n        )\n      })\n      .json<github.IssuesListCommentsForRepoResponse>()\n  }\n\n  /**\n * You can use the REST API to get comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_get_comment',\n    description: `You can use the REST API to get comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesGetCommentParamsSchema,\n    tags: ['issues']\n  })\n  async issuesGetComment(\n    params: github.IssuesGetCommentParams\n  ): Promise<github.IssuesGetCommentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/comments/${params.comment_id}`,\n        {}\n      )\n      .json<github.IssuesGetCommentResponse>()\n  }\n\n  /**\n   * You can use the REST API to delete comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n   */\n  @aiFunction({\n    name: 'github_issues_delete_comment',\n    description: `You can use the REST API to delete comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.`,\n    inputSchema: github.IssuesDeleteCommentParamsSchema,\n    tags: ['issues']\n  })\n  async issuesDeleteComment(\n    params: github.IssuesDeleteCommentParams\n  ): Promise<github.IssuesDeleteCommentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/comments/${params.comment_id}`,\n        {}\n      )\n      .json<github.IssuesDeleteCommentResponse>()\n  }\n\n  /**\n * You can use the REST API to update comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_update_comment',\n    description: `You can use the REST API to update comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesUpdateCommentParamsSchema,\n    tags: ['issues']\n  })\n  async issuesUpdateComment(\n    params: github.IssuesUpdateCommentParams\n  ): Promise<github.IssuesUpdateCommentResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/issues/comments/${params.comment_id}`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.IssuesUpdateCommentResponse>()\n  }\n\n  /**\n   * List the reactions to an [issue comment](https://docs.github.com/rest/issues/comments#get-an-issue-comment).\n   */\n  @aiFunction({\n    name: 'github_reactions_list_for_issue_comment',\n    description: `List the reactions to an [issue comment](https://docs.github.com/rest/issues/comments#get-an-issue-comment).`,\n    inputSchema: github.ReactionsListForIssueCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForIssueComment(\n    params: github.ReactionsListForIssueCommentParams\n  ): Promise<github.ReactionsListForIssueCommentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/comments/${params.comment_id}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForIssueCommentResponse>()\n  }\n\n  /**\n   * Create a reaction to an [issue comment](https://docs.github.com/rest/issues/comments#get-an-issue-comment). A response with an HTTP `200` status means that you already added the reaction type to this issue comment.\n   */\n  @aiFunction({\n    name: 'github_reactions_create_for_issue_comment',\n    description: `Create a reaction to an [issue comment](https://docs.github.com/rest/issues/comments#get-an-issue-comment). A response with an HTTP \\`200\\` status means that you already added the reaction type to this issue comment.`,\n    inputSchema: github.ReactionsCreateForIssueCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForIssueComment(\n    params: github.ReactionsCreateForIssueCommentParams\n  ): Promise<github.ReactionsCreateForIssueCommentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/issues/comments/${params.comment_id}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForIssueCommentResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> You can also specify a repository by `repository_id` using the route `DELETE delete /repositories/:repository_id/issues/comments/:comment_id/reactions/:reaction_id`.\n\nDelete a reaction to an [issue comment](https://docs.github.com/rest/issues/comments#get-an-issue-comment).\n */\n  @aiFunction({\n    name: 'github_reactions_delete_for_issue_comment',\n    description: `> [!NOTE]\n> You can also specify a repository by \\`repository_id\\` using the route \\`DELETE delete /repositories/:repository_id/issues/comments/:comment_id/reactions/:reaction_id\\`.\n\nDelete a reaction to an [issue comment](https://docs.github.com/rest/issues/comments#get-an-issue-comment).`,\n    inputSchema: github.ReactionsDeleteForIssueCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsDeleteForIssueComment(\n    params: github.ReactionsDeleteForIssueCommentParams\n  ): Promise<github.ReactionsDeleteForIssueCommentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/comments/${params.comment_id}/reactions/${params.reaction_id}`,\n        {}\n      )\n      .json<github.ReactionsDeleteForIssueCommentResponse>()\n  }\n\n  /**\n   * Lists events for a repository.\n   */\n  @aiFunction({\n    name: 'github_issues_list_events_for_repo',\n    description: `Lists events for a repository.`,\n    inputSchema: github.IssuesListEventsForRepoParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListEventsForRepo(\n    params: github.IssuesListEventsForRepoParams\n  ): Promise<github.IssuesListEventsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/issues/events`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.IssuesListEventsForRepoResponse>()\n  }\n\n  /**\n   * Gets a single event by the event id.\n   */\n  @aiFunction({\n    name: 'github_issues_get_event',\n    description: `Gets a single event by the event id.`,\n    inputSchema: github.IssuesGetEventParamsSchema,\n    tags: ['issues']\n  })\n  async issuesGetEvent(\n    params: github.IssuesGetEventParams\n  ): Promise<github.IssuesGetEventResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/events/${params.event_id}`,\n        {}\n      )\n      .json<github.IssuesGetEventResponse>()\n  }\n\n  /**\n * The API returns a [`301 Moved Permanently` status](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api#follow-redirects) if the issue was\n[transferred](https://docs.github.com/articles/transferring-an-issue-to-another-repository/) to another repository. If\nthe issue was transferred to or deleted from a repository where the authenticated user lacks read access, the API\nreturns a `404 Not Found` status. If the issue was deleted from a repository where the authenticated user has read\naccess, the API returns a `410 Gone` status. To receive webhook events for transferred and deleted issues, subscribe\nto the [`issues`](https://docs.github.com/webhooks/event-payloads/#issues) webhook.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the `pull_request` key. Be aware that the `id` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_get',\n    description: `The API returns a [\\`301 Moved Permanently\\` status](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api#follow-redirects) if the issue was\n[transferred](https://docs.github.com/articles/transferring-an-issue-to-another-repository/) to another repository. If\nthe issue was transferred to or deleted from a repository where the authenticated user lacks read access, the API\nreturns a \\`404 Not Found\\` status. If the issue was deleted from a repository where the authenticated user has read\naccess, the API returns a \\`410 Gone\\` status. To receive webhook events for transferred and deleted issues, subscribe\nto the [\\`issues\\`](https://docs.github.com/webhooks/event-payloads/#issues) webhook.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the \\`pull_request\\` key. Be aware that the \\`id\\` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesGetParamsSchema,\n    tags: ['issues']\n  })\n  async issuesGet(\n    params: github.IssuesGetParams\n  ): Promise<github.IssuesGetResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}`,\n        {}\n      )\n      .json<github.IssuesGetResponse>()\n  }\n\n  /**\n * Issue owners and users with push access or Triage role can edit an issue.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_update',\n    description: `Issue owners and users with push access or Triage role can edit an issue.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesUpdateParamsSchema,\n    tags: ['issues']\n  })\n  async issuesUpdate(\n    params: github.IssuesUpdateParams\n  ): Promise<github.IssuesUpdateResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}`,\n        {\n          json: pick(\n            params,\n            'title',\n            'body',\n            'assignee',\n            'state',\n            'state_reason',\n            'milestone',\n            'labels',\n            'assignees',\n            'type'\n          )\n        }\n      )\n      .json<github.IssuesUpdateResponse>()\n  }\n\n  /**\n   * Adds up to 10 assignees to an issue. Users already assigned to an issue are not replaced.\n   */\n  @aiFunction({\n    name: 'github_issues_add_assignees',\n    description: `Adds up to 10 assignees to an issue. Users already assigned to an issue are not replaced.`,\n    inputSchema: github.IssuesAddAssigneesParamsSchema,\n    tags: ['issues']\n  })\n  async issuesAddAssignees(\n    params: github.IssuesAddAssigneesParams\n  ): Promise<github.IssuesAddAssigneesResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/assignees`,\n        {\n          json: pick(params, 'assignees')\n        }\n      )\n      .json<github.IssuesAddAssigneesResponse>()\n  }\n\n  /**\n   * Removes one or more assignees from an issue.\n   */\n  @aiFunction({\n    name: 'github_issues_remove_assignees',\n    description: `Removes one or more assignees from an issue.`,\n    inputSchema: github.IssuesRemoveAssigneesParamsSchema,\n    tags: ['issues']\n  })\n  async issuesRemoveAssignees(\n    params: github.IssuesRemoveAssigneesParams\n  ): Promise<github.IssuesRemoveAssigneesResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/assignees`,\n        {\n          json: pick(params, 'assignees')\n        }\n      )\n      .json<github.IssuesRemoveAssigneesResponse>()\n  }\n\n  /**\n * Checks if a user has permission to be assigned to a specific issue.\n\nIf the `assignee` can be assigned to this issue, a `204` status code with no content is returned.\n\nOtherwise a `404` status code is returned.\n */\n  @aiFunction({\n    name: 'github_issues_check_user_can_be_assigned_to_issue',\n    description: `Checks if a user has permission to be assigned to a specific issue.\n\nIf the \\`assignee\\` can be assigned to this issue, a \\`204\\` status code with no content is returned.\n\nOtherwise a \\`404\\` status code is returned.`,\n    inputSchema: github.IssuesCheckUserCanBeAssignedToIssueParamsSchema,\n    tags: ['issues']\n  })\n  async issuesCheckUserCanBeAssignedToIssue(\n    params: github.IssuesCheckUserCanBeAssignedToIssueParams\n  ): Promise<github.IssuesCheckUserCanBeAssignedToIssueResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/assignees/${params.assignee}`,\n        {}\n      )\n      .json<github.IssuesCheckUserCanBeAssignedToIssueResponse>()\n  }\n\n  /**\n * You can use the REST API to list comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nIssue comments are ordered by ascending ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_list_comments',\n    description: `You can use the REST API to list comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nIssue comments are ordered by ascending ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesListCommentsParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListComments(\n    params: github.IssuesListCommentsParams\n  ): Promise<github.IssuesListCommentsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/comments`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'since', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.IssuesListCommentsResponse>()\n  }\n\n  /**\n * You can use the REST API to create comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications).\nCreating content too quickly using this endpoint may result in secondary rate limiting.\nFor more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_create_comment',\n    description: `You can use the REST API to create comments on issues and pull requests. Every pull request is an issue, but not every issue is a pull request.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications).\nCreating content too quickly using this endpoint may result in secondary rate limiting.\nFor more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesCreateCommentParamsSchema,\n    tags: ['issues']\n  })\n  async issuesCreateComment(\n    params: github.IssuesCreateCommentParams\n  ): Promise<github.IssuesCreateCommentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/comments`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.IssuesCreateCommentResponse>()\n  }\n\n  /**\n   * Lists all events for an issue.\n   */\n  @aiFunction({\n    name: 'github_issues_list_events',\n    description: `Lists all events for an issue.`,\n    inputSchema: github.IssuesListEventsParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListEvents(\n    params: github.IssuesListEventsParams\n  ): Promise<github.IssuesListEventsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/events`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.IssuesListEventsResponse>()\n  }\n\n  /**\n   * Lists all labels for an issue.\n   */\n  @aiFunction({\n    name: 'github_issues_list_labels_on_issue',\n    description: `Lists all labels for an issue.`,\n    inputSchema: github.IssuesListLabelsOnIssueParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListLabelsOnIssue(\n    params: github.IssuesListLabelsOnIssueParams\n  ): Promise<github.IssuesListLabelsOnIssueResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/labels`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.IssuesListLabelsOnIssueResponse>()\n  }\n\n  /**\n   * Adds labels to an issue. If you provide an empty array of labels, all labels are removed from the issue. .\n   */\n  @aiFunction({\n    name: 'github_issues_add_labels',\n    description: `Adds labels to an issue. If you provide an empty array of labels, all labels are removed from the issue. .`,\n    // TODO: Improve handling of union params\n    inputSchema: github.IssuesAddLabelsParamsSchema as any,\n    tags: ['issues']\n  })\n  async issuesAddLabels(\n    params: github.IssuesAddLabelsParams\n  ): Promise<github.IssuesAddLabelsResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/labels`,\n        {\n          json: params\n        }\n      )\n      .json<github.IssuesAddLabelsResponse>()\n  }\n\n  /**\n   * Removes any previous labels and sets the new labels for an issue.\n   */\n  @aiFunction({\n    name: 'github_issues_set_labels',\n    description: `Removes any previous labels and sets the new labels for an issue.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.IssuesSetLabelsParamsSchema as any,\n    tags: ['issues']\n  })\n  async issuesSetLabels(\n    params: github.IssuesSetLabelsParams\n  ): Promise<github.IssuesSetLabelsResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/labels`,\n        {\n          json: params\n        }\n      )\n      .json<github.IssuesSetLabelsResponse>()\n  }\n\n  /**\n   * Removes all labels from an issue.\n   */\n  @aiFunction({\n    name: 'github_issues_remove_all_labels',\n    description: `Removes all labels from an issue.`,\n    inputSchema: github.IssuesRemoveAllLabelsParamsSchema,\n    tags: ['issues']\n  })\n  async issuesRemoveAllLabels(\n    params: github.IssuesRemoveAllLabelsParams\n  ): Promise<github.IssuesRemoveAllLabelsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/labels`,\n        {}\n      )\n      .json<github.IssuesRemoveAllLabelsResponse>()\n  }\n\n  /**\n   * Removes the specified label from the issue, and returns the remaining labels on the issue. This endpoint returns a `404 Not Found` status if the label does not exist.\n   */\n  @aiFunction({\n    name: 'github_issues_remove_label',\n    description: `Removes the specified label from the issue, and returns the remaining labels on the issue. This endpoint returns a \\`404 Not Found\\` status if the label does not exist.`,\n    inputSchema: github.IssuesRemoveLabelParamsSchema,\n    tags: ['issues']\n  })\n  async issuesRemoveLabel(\n    params: github.IssuesRemoveLabelParams\n  ): Promise<github.IssuesRemoveLabelResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/labels/${params.name}`,\n        {}\n      )\n      .json<github.IssuesRemoveLabelResponse>()\n  }\n\n  /**\n * Users with push access can lock an issue or pull request's conversation.\n\nNote that, if you choose not to pass any parameters, you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".\n */\n  @aiFunction({\n    name: 'github_issues_lock',\n    description: `Users with push access can lock an issue or pull request's conversation.\n\nNote that, if you choose not to pass any parameters, you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".`,\n    inputSchema: github.IssuesLockParamsSchema,\n    tags: ['issues']\n  })\n  async issuesLock(\n    params: github.IssuesLockParams\n  ): Promise<github.IssuesLockResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/lock`,\n        {\n          json: pick(params, 'lock_reason')\n        }\n      )\n      .json<github.IssuesLockResponse>()\n  }\n\n  /**\n   * Users with push access can unlock an issue's conversation.\n   */\n  @aiFunction({\n    name: 'github_issues_unlock',\n    description: `Users with push access can unlock an issue's conversation.`,\n    inputSchema: github.IssuesUnlockParamsSchema,\n    tags: ['issues']\n  })\n  async issuesUnlock(\n    params: github.IssuesUnlockParams\n  ): Promise<github.IssuesUnlockResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/lock`,\n        {}\n      )\n      .json<github.IssuesUnlockResponse>()\n  }\n\n  /**\n   * List the reactions to an [issue](https://docs.github.com/rest/issues/issues#get-an-issue).\n   */\n  @aiFunction({\n    name: 'github_reactions_list_for_issue',\n    description: `List the reactions to an [issue](https://docs.github.com/rest/issues/issues#get-an-issue).`,\n    inputSchema: github.ReactionsListForIssueParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForIssue(\n    params: github.ReactionsListForIssueParams\n  ): Promise<github.ReactionsListForIssueResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForIssueResponse>()\n  }\n\n  /**\n   * Create a reaction to an [issue](https://docs.github.com/rest/issues/issues#get-an-issue). A response with an HTTP `200` status means that you already added the reaction type to this issue.\n   */\n  @aiFunction({\n    name: 'github_reactions_create_for_issue',\n    description: `Create a reaction to an [issue](https://docs.github.com/rest/issues/issues#get-an-issue). A response with an HTTP \\`200\\` status means that you already added the reaction type to this issue.`,\n    inputSchema: github.ReactionsCreateForIssueParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForIssue(\n    params: github.ReactionsCreateForIssueParams\n  ): Promise<github.ReactionsCreateForIssueResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForIssueResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> You can also specify a repository by `repository_id` using the route `DELETE /repositories/:repository_id/issues/:issue_number/reactions/:reaction_id`.\n\nDelete a reaction to an [issue](https://docs.github.com/rest/issues/issues#get-an-issue).\n */\n  @aiFunction({\n    name: 'github_reactions_delete_for_issue',\n    description: `> [!NOTE]\n> You can also specify a repository by \\`repository_id\\` using the route \\`DELETE /repositories/:repository_id/issues/:issue_number/reactions/:reaction_id\\`.\n\nDelete a reaction to an [issue](https://docs.github.com/rest/issues/issues#get-an-issue).`,\n    inputSchema: github.ReactionsDeleteForIssueParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsDeleteForIssue(\n    params: github.ReactionsDeleteForIssueParams\n  ): Promise<github.ReactionsDeleteForIssueResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/reactions/${params.reaction_id}`,\n        {}\n      )\n      .json<github.ReactionsDeleteForIssueResponse>()\n  }\n\n  /**\n * You can use the REST API to remove a sub-issue from an issue.\nRemoving content too quickly using this endpoint may result in secondary rate limiting.\nFor more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass a specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_remove_sub_issue',\n    description: `You can use the REST API to remove a sub-issue from an issue.\nRemoving content too quickly using this endpoint may result in secondary rate limiting.\nFor more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass a specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesRemoveSubIssueParamsSchema,\n    tags: ['issues']\n  })\n  async issuesRemoveSubIssue(\n    params: github.IssuesRemoveSubIssueParams\n  ): Promise<github.IssuesRemoveSubIssueResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/sub_issue`,\n        {\n          json: pick(params, 'sub_issue_id')\n        }\n      )\n      .json<github.IssuesRemoveSubIssueResponse>()\n  }\n\n  /**\n * You can use the REST API to list the sub-issues on an issue.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_list_sub_issues',\n    description: `You can use the REST API to list the sub-issues on an issue.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesListSubIssuesParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListSubIssues(\n    params: github.IssuesListSubIssuesParams\n  ): Promise<github.IssuesListSubIssuesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/sub_issues`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.IssuesListSubIssuesResponse>()\n  }\n\n  /**\n * You can use the REST API to add sub-issues to issues.\n\nCreating content too quickly using this endpoint may result in secondary rate limiting.\nFor more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_add_sub_issue',\n    description: `You can use the REST API to add sub-issues to issues.\n\nCreating content too quickly using this endpoint may result in secondary rate limiting.\nFor more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesAddSubIssueParamsSchema,\n    tags: ['issues']\n  })\n  async issuesAddSubIssue(\n    params: github.IssuesAddSubIssueParams\n  ): Promise<github.IssuesAddSubIssueResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/sub_issues`,\n        {\n          json: pick(params, 'sub_issue_id', 'replace_parent')\n        }\n      )\n      .json<github.IssuesAddSubIssueResponse>()\n  }\n\n  /**\n   * You can use the REST API to reprioritize a sub-issue to a different position in the parent list.\n   */\n  @aiFunction({\n    name: 'github_issues_reprioritize_sub_issue',\n    description: `You can use the REST API to reprioritize a sub-issue to a different position in the parent list.`,\n    inputSchema: github.IssuesReprioritizeSubIssueParamsSchema,\n    tags: ['issues']\n  })\n  async issuesReprioritizeSubIssue(\n    params: github.IssuesReprioritizeSubIssueParams\n  ): Promise<github.IssuesReprioritizeSubIssueResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/sub_issues/priority`,\n        {\n          json: pick(params, 'sub_issue_id', 'after_id', 'before_id')\n        }\n      )\n      .json<github.IssuesReprioritizeSubIssueResponse>()\n  }\n\n  /**\n   * List all timeline events for an issue.\n   */\n  @aiFunction({\n    name: 'github_issues_list_events_for_timeline',\n    description: `List all timeline events for an issue.`,\n    inputSchema: github.IssuesListEventsForTimelineParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListEventsForTimeline(\n    params: github.IssuesListEventsForTimelineParams\n  ): Promise<github.IssuesListEventsForTimelineResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/issues/${params.issue_number}/timeline`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.IssuesListEventsForTimelineResponse>()\n  }\n\n  /**\n   * List deploy keys.\n   */\n  @aiFunction({\n    name: 'github_repos_list_deploy_keys',\n    description: `List deploy keys.`,\n    inputSchema: github.ReposListDeployKeysParamsSchema,\n    tags: ['repos']\n  })\n  async reposListDeployKeys(\n    params: github.ReposListDeployKeysParams\n  ): Promise<github.ReposListDeployKeysResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/keys`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListDeployKeysResponse>()\n  }\n\n  /**\n   * You can create a read-only deploy key.\n   */\n  @aiFunction({\n    name: 'github_repos_create_deploy_key',\n    description: `You can create a read-only deploy key.`,\n    inputSchema: github.ReposCreateDeployKeyParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateDeployKey(\n    params: github.ReposCreateDeployKeyParams\n  ): Promise<github.ReposCreateDeployKeyResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/keys`, {\n        json: pick(params, 'title', 'key', 'read_only')\n      })\n      .json<github.ReposCreateDeployKeyResponse>()\n  }\n\n  /**\n   * Get a deploy key.\n   */\n  @aiFunction({\n    name: 'github_repos_get_deploy_key',\n    description: `Get a deploy key.`,\n    inputSchema: github.ReposGetDeployKeyParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetDeployKey(\n    params: github.ReposGetDeployKeyParams\n  ): Promise<github.ReposGetDeployKeyResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/keys/${params.key_id}`,\n        {}\n      )\n      .json<github.ReposGetDeployKeyResponse>()\n  }\n\n  /**\n   * Deploy keys are immutable. If you need to update a key, remove the key and create a new one instead.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_deploy_key',\n    description: `Deploy keys are immutable. If you need to update a key, remove the key and create a new one instead.`,\n    inputSchema: github.ReposDeleteDeployKeyParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteDeployKey(\n    params: github.ReposDeleteDeployKeyParams\n  ): Promise<github.ReposDeleteDeployKeyResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/keys/${params.key_id}`,\n        {}\n      )\n      .json<github.ReposDeleteDeployKeyResponse>()\n  }\n\n  /**\n   * Lists all labels for a repository.\n   */\n  @aiFunction({\n    name: 'github_issues_list_labels_for_repo',\n    description: `Lists all labels for a repository.`,\n    inputSchema: github.IssuesListLabelsForRepoParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListLabelsForRepo(\n    params: github.IssuesListLabelsForRepoParams\n  ): Promise<github.IssuesListLabelsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/labels`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.IssuesListLabelsForRepoResponse>()\n  }\n\n  /**\n   * Creates a label for the specified repository with the given name and color. The name and color parameters are required. The color must be a valid [hexadecimal color code](http://www.color-hex.com/).\n   */\n  @aiFunction({\n    name: 'github_issues_create_label',\n    description: `Creates a label for the specified repository with the given name and color. The name and color parameters are required. The color must be a valid [hexadecimal color code](http://www.color-hex.com/).`,\n    inputSchema: github.IssuesCreateLabelParamsSchema,\n    tags: ['issues']\n  })\n  async issuesCreateLabel(\n    params: github.IssuesCreateLabelParams\n  ): Promise<github.IssuesCreateLabelResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/labels`, {\n        json: pick(params, 'name', 'color', 'description')\n      })\n      .json<github.IssuesCreateLabelResponse>()\n  }\n\n  /**\n   * Gets a label using the given name.\n   */\n  @aiFunction({\n    name: 'github_issues_get_label',\n    description: `Gets a label using the given name.`,\n    inputSchema: github.IssuesGetLabelParamsSchema,\n    tags: ['issues']\n  })\n  async issuesGetLabel(\n    params: github.IssuesGetLabelParams\n  ): Promise<github.IssuesGetLabelResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/labels/${params.name}`,\n        {}\n      )\n      .json<github.IssuesGetLabelResponse>()\n  }\n\n  /**\n   * Deletes a label using the given label name.\n   */\n  @aiFunction({\n    name: 'github_issues_delete_label',\n    description: `Deletes a label using the given label name.`,\n    inputSchema: github.IssuesDeleteLabelParamsSchema,\n    tags: ['issues']\n  })\n  async issuesDeleteLabel(\n    params: github.IssuesDeleteLabelParams\n  ): Promise<github.IssuesDeleteLabelResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/labels/${params.name}`,\n        {}\n      )\n      .json<github.IssuesDeleteLabelResponse>()\n  }\n\n  /**\n   * Updates a label using the given label name.\n   */\n  @aiFunction({\n    name: 'github_issues_update_label',\n    description: `Updates a label using the given label name.`,\n    inputSchema: github.IssuesUpdateLabelParamsSchema,\n    tags: ['issues']\n  })\n  async issuesUpdateLabel(\n    params: github.IssuesUpdateLabelParams\n  ): Promise<github.IssuesUpdateLabelResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/labels/${params.name}`,\n        {\n          json: pick(params, 'new_name', 'color', 'description')\n        }\n      )\n      .json<github.IssuesUpdateLabelResponse>()\n  }\n\n  /**\n   * Lists languages for the specified repository. The value shown for each language is the number of bytes of code written in that language.\n   */\n  @aiFunction({\n    name: 'github_repos_list_languages',\n    description: `Lists languages for the specified repository. The value shown for each language is the number of bytes of code written in that language.`,\n    inputSchema: github.ReposListLanguagesParamsSchema,\n    tags: ['repos']\n  })\n  async reposListLanguages(\n    params: github.ReposListLanguagesParams\n  ): Promise<github.ReposListLanguagesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/languages`, {})\n      .json<github.ReposListLanguagesResponse>()\n  }\n\n  /**\n * This method returns the contents of the repository's license file, if one is detected.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw contents of the license.\n- **`application/vnd.github.html+json`**: Returns the license contents in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).\n */\n  @aiFunction({\n    name: 'github_licenses_get_for_repo',\n    description: `This method returns the contents of the repository's license file, if one is detected.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw contents of the license.\n- **\\`application/vnd.github.html+json\\`**: Returns the license contents in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).`,\n    inputSchema: github.LicensesGetForRepoParamsSchema,\n    tags: ['licenses']\n  })\n  async licensesGetForRepo(\n    params: github.LicensesGetForRepoParams\n  ): Promise<github.LicensesGetForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/license`, {\n        searchParams: sanitizeSearchParams(pick(params, 'ref'))\n      })\n      .json<github.LicensesGetForRepoResponse>()\n  }\n\n  /**\n   * Sync a branch of a forked repository to keep it up-to-date with the upstream repository.\n   */\n  @aiFunction({\n    name: 'github_repos_merge_upstream',\n    description: `Sync a branch of a forked repository to keep it up-to-date with the upstream repository.`,\n    inputSchema: github.ReposMergeUpstreamParamsSchema,\n    tags: ['repos']\n  })\n  async reposMergeUpstream(\n    params: github.ReposMergeUpstreamParams\n  ): Promise<github.ReposMergeUpstreamResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/merge-upstream`, {\n        json: pick(params, 'branch')\n      })\n      .json<github.ReposMergeUpstreamResponse>()\n  }\n\n  /**\n   * Merge a branch.\n   */\n  @aiFunction({\n    name: 'github_repos_merge',\n    description: `Merge a branch.`,\n    inputSchema: github.ReposMergeParamsSchema,\n    tags: ['repos']\n  })\n  async reposMerge(\n    params: github.ReposMergeParams\n  ): Promise<github.ReposMergeResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/merges`, {\n        json: pick(params, 'base', 'head', 'commit_message')\n      })\n      .json<github.ReposMergeResponse>()\n  }\n\n  /**\n   * Lists milestones for a repository.\n   */\n  @aiFunction({\n    name: 'github_issues_list_milestones',\n    description: `Lists milestones for a repository.`,\n    inputSchema: github.IssuesListMilestonesParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListMilestones(\n    params: github.IssuesListMilestonesParams\n  ): Promise<github.IssuesListMilestonesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/milestones`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'state', 'sort', 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.IssuesListMilestonesResponse>()\n  }\n\n  /**\n   * Creates a milestone.\n   */\n  @aiFunction({\n    name: 'github_issues_create_milestone',\n    description: `Creates a milestone.`,\n    inputSchema: github.IssuesCreateMilestoneParamsSchema,\n    tags: ['issues']\n  })\n  async issuesCreateMilestone(\n    params: github.IssuesCreateMilestoneParams\n  ): Promise<github.IssuesCreateMilestoneResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/milestones`, {\n        json: pick(params, 'title', 'state', 'description', 'due_on')\n      })\n      .json<github.IssuesCreateMilestoneResponse>()\n  }\n\n  /**\n   * Gets a milestone using the given milestone number.\n   */\n  @aiFunction({\n    name: 'github_issues_get_milestone',\n    description: `Gets a milestone using the given milestone number.`,\n    inputSchema: github.IssuesGetMilestoneParamsSchema,\n    tags: ['issues']\n  })\n  async issuesGetMilestone(\n    params: github.IssuesGetMilestoneParams\n  ): Promise<github.IssuesGetMilestoneResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/milestones/${params.milestone_number}`,\n        {}\n      )\n      .json<github.IssuesGetMilestoneResponse>()\n  }\n\n  /**\n   * Deletes a milestone using the given milestone number.\n   */\n  @aiFunction({\n    name: 'github_issues_delete_milestone',\n    description: `Deletes a milestone using the given milestone number.`,\n    inputSchema: github.IssuesDeleteMilestoneParamsSchema,\n    tags: ['issues']\n  })\n  async issuesDeleteMilestone(\n    params: github.IssuesDeleteMilestoneParams\n  ): Promise<github.IssuesDeleteMilestoneResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/milestones/${params.milestone_number}`,\n        {}\n      )\n      .json<github.IssuesDeleteMilestoneResponse>()\n  }\n\n  /**\n   * Update a milestone.\n   */\n  @aiFunction({\n    name: 'github_issues_update_milestone',\n    description: `Update a milestone.`,\n    inputSchema: github.IssuesUpdateMilestoneParamsSchema,\n    tags: ['issues']\n  })\n  async issuesUpdateMilestone(\n    params: github.IssuesUpdateMilestoneParams\n  ): Promise<github.IssuesUpdateMilestoneResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/milestones/${params.milestone_number}`,\n        {\n          json: pick(params, 'title', 'state', 'description', 'due_on')\n        }\n      )\n      .json<github.IssuesUpdateMilestoneResponse>()\n  }\n\n  /**\n   * Lists labels for issues in a milestone.\n   */\n  @aiFunction({\n    name: 'github_issues_list_labels_for_milestone',\n    description: `Lists labels for issues in a milestone.`,\n    inputSchema: github.IssuesListLabelsForMilestoneParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListLabelsForMilestone(\n    params: github.IssuesListLabelsForMilestoneParams\n  ): Promise<github.IssuesListLabelsForMilestoneResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/milestones/${params.milestone_number}/labels`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.IssuesListLabelsForMilestoneResponse>()\n  }\n\n  /**\n   * Lists all notifications for the current user in the specified repository.\n   */\n  @aiFunction({\n    name: 'github_activity_list_repo_notifications_for_authenticated_user',\n    description: `Lists all notifications for the current user in the specified repository.`,\n    inputSchema:\n      github.ActivityListRepoNotificationsForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListRepoNotificationsForAuthenticatedUser(\n    params: github.ActivityListRepoNotificationsForAuthenticatedUserParams\n  ): Promise<github.ActivityListRepoNotificationsForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/notifications`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'all',\n            'participating',\n            'since',\n            'before',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.ActivityListRepoNotificationsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Marks all notifications in a repository as \"read\" for the current user. If the number of notifications is too large to complete in one request, you will receive a `202 Accepted` status and GitHub will run an asynchronous process to mark notifications as \"read.\" To check whether any \"unread\" notifications remain, you can use the [List repository notifications for the authenticated user](https://docs.github.com/rest/activity/notifications#list-repository-notifications-for-the-authenticated-user) endpoint and pass the query parameter `all=false`.\n   */\n  @aiFunction({\n    name: 'github_activity_mark_repo_notifications_as_read',\n    description: `Marks all notifications in a repository as \"read\" for the current user. If the number of notifications is too large to complete in one request, you will receive a \\`202 Accepted\\` status and GitHub will run an asynchronous process to mark notifications as \"read.\" To check whether any \"unread\" notifications remain, you can use the [List repository notifications for the authenticated user](https://docs.github.com/rest/activity/notifications#list-repository-notifications-for-the-authenticated-user) endpoint and pass the query parameter \\`all=false\\`.`,\n    inputSchema: github.ActivityMarkRepoNotificationsAsReadParamsSchema,\n    tags: ['activity']\n  })\n  async activityMarkRepoNotificationsAsRead(\n    params: github.ActivityMarkRepoNotificationsAsReadParams\n  ): Promise<github.ActivityMarkRepoNotificationsAsReadResponse> {\n    return this.ky\n      .put(`/repos/${params.owner}/${params.repo}/notifications`, {\n        json: pick(params, 'last_read_at')\n      })\n      .json<github.ActivityMarkRepoNotificationsAsReadResponse>()\n  }\n\n  /**\n * Gets information about a GitHub Pages site.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_get_pages',\n    description: `Gets information about a GitHub Pages site.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposGetPagesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetPages(\n    params: github.ReposGetPagesParams\n  ): Promise<github.ReposGetPagesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/pages`, {})\n      .json<github.ReposGetPagesResponse>()\n  }\n\n  /**\n * Configures a GitHub Pages site. For more information, see \"[About GitHub Pages](/github/working-with-github-pages/about-github-pages).\"\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_pages_site',\n    description: `Configures a GitHub Pages site. For more information, see \"[About GitHub Pages](/github/working-with-github-pages/about-github-pages).\"\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposCreatePagesSiteParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposCreatePagesSite(\n    params: github.ReposCreatePagesSiteParams\n  ): Promise<github.ReposCreatePagesSiteResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/pages`, {\n        json: params\n      })\n      .json<github.ReposCreatePagesSiteResponse>()\n  }\n\n  /**\n * Updates information for a GitHub Pages site. For more information, see \"[About GitHub Pages](/github/working-with-github-pages/about-github-pages).\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_update_information_about_pages_site',\n    description: `Updates information for a GitHub Pages site. For more information, see \"[About GitHub Pages](/github/working-with-github-pages/about-github-pages).\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.ReposUpdateInformationAboutPagesSiteParamsSchema as any,\n    tags: ['repos']\n  })\n  async reposUpdateInformationAboutPagesSite(\n    params: github.ReposUpdateInformationAboutPagesSiteParams\n  ): Promise<github.ReposUpdateInformationAboutPagesSiteResponse> {\n    return this.ky\n      .put(`/repos/${params.owner}/${params.repo}/pages`, {\n        json: params\n      })\n      .json<github.ReposUpdateInformationAboutPagesSiteResponse>()\n  }\n\n  /**\n * Deletes a GitHub Pages site. For more information, see \"[About GitHub Pages](/github/working-with-github-pages/about-github-pages).\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_delete_pages_site',\n    description: `Deletes a GitHub Pages site. For more information, see \"[About GitHub Pages](/github/working-with-github-pages/about-github-pages).\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposDeletePagesSiteParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeletePagesSite(\n    params: github.ReposDeletePagesSiteParams\n  ): Promise<github.ReposDeletePagesSiteResponse> {\n    return this.ky\n      .delete(`/repos/${params.owner}/${params.repo}/pages`, {})\n      .json<github.ReposDeletePagesSiteResponse>()\n  }\n\n  /**\n * Lists builts of a GitHub Pages site.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_list_pages_builds',\n    description: `Lists builts of a GitHub Pages site.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposListPagesBuildsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListPagesBuilds(\n    params: github.ReposListPagesBuildsParams\n  ): Promise<github.ReposListPagesBuildsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/pages/builds`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListPagesBuildsResponse>()\n  }\n\n  /**\n * You can request that your site be built from the latest revision on the default branch. This has the same effect as pushing a commit to your default branch, but does not require an additional commit. Manually triggering page builds can be helpful when diagnosing build warnings and failures.\n\nBuild requests are limited to one concurrent build per repository and one concurrent build per requester. If you request a build while another is still in progress, the second request will be queued until the first completes.\n */\n  @aiFunction({\n    name: 'github_repos_request_pages_build',\n    description: `You can request that your site be built from the latest revision on the default branch. This has the same effect as pushing a commit to your default branch, but does not require an additional commit. Manually triggering page builds can be helpful when diagnosing build warnings and failures.\n\nBuild requests are limited to one concurrent build per repository and one concurrent build per requester. If you request a build while another is still in progress, the second request will be queued until the first completes.`,\n    inputSchema: github.ReposRequestPagesBuildParamsSchema,\n    tags: ['repos']\n  })\n  async reposRequestPagesBuild(\n    params: github.ReposRequestPagesBuildParams\n  ): Promise<github.ReposRequestPagesBuildResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/pages/builds`, {})\n      .json<github.ReposRequestPagesBuildResponse>()\n  }\n\n  /**\n * Gets information about the single most recent build of a GitHub Pages site.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_get_latest_pages_build',\n    description: `Gets information about the single most recent build of a GitHub Pages site.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposGetLatestPagesBuildParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetLatestPagesBuild(\n    params: github.ReposGetLatestPagesBuildParams\n  ): Promise<github.ReposGetLatestPagesBuildResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pages/builds/latest`,\n        {}\n      )\n      .json<github.ReposGetLatestPagesBuildResponse>()\n  }\n\n  /**\n * Gets information about a GitHub Pages build.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_get_pages_build',\n    description: `Gets information about a GitHub Pages build.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposGetPagesBuildParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetPagesBuild(\n    params: github.ReposGetPagesBuildParams\n  ): Promise<github.ReposGetPagesBuildResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pages/builds/${params.build_id}`,\n        {}\n      )\n      .json<github.ReposGetPagesBuildResponse>()\n  }\n\n  /**\n * Create a GitHub Pages deployment for a repository.\n\nThe authenticated user must have write permission to the repository.\n */\n  @aiFunction({\n    name: 'github_repos_create_pages_deployment',\n    description: `Create a GitHub Pages deployment for a repository.\n\nThe authenticated user must have write permission to the repository.`,\n    inputSchema: github.ReposCreatePagesDeploymentParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreatePagesDeployment(\n    params: github.ReposCreatePagesDeploymentParams\n  ): Promise<github.ReposCreatePagesDeploymentResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/pages/deployments`, {\n        json: pick(\n          params,\n          'artifact_id',\n          'artifact_url',\n          'environment',\n          'pages_build_version',\n          'oidc_token'\n        )\n      })\n      .json<github.ReposCreatePagesDeploymentResponse>()\n  }\n\n  /**\n * Gets the current status of a GitHub Pages deployment.\n\nThe authenticated user must have read permission for the GitHub Pages site.\n */\n  @aiFunction({\n    name: 'github_repos_get_pages_deployment',\n    description: `Gets the current status of a GitHub Pages deployment.\n\nThe authenticated user must have read permission for the GitHub Pages site.`,\n    inputSchema: github.ReposGetPagesDeploymentParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetPagesDeployment(\n    params: github.ReposGetPagesDeploymentParams\n  ): Promise<github.ReposGetPagesDeploymentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pages/deployments/${params.pages_deployment_id}`,\n        {}\n      )\n      .json<github.ReposGetPagesDeploymentResponse>()\n  }\n\n  /**\n * Cancels a GitHub Pages deployment.\n\nThe authenticated user must have write permissions for the GitHub Pages site.\n */\n  @aiFunction({\n    name: 'github_repos_cancel_pages_deployment',\n    description: `Cancels a GitHub Pages deployment.\n\nThe authenticated user must have write permissions for the GitHub Pages site.`,\n    inputSchema: github.ReposCancelPagesDeploymentParamsSchema,\n    tags: ['repos']\n  })\n  async reposCancelPagesDeployment(\n    params: github.ReposCancelPagesDeploymentParams\n  ): Promise<github.ReposCancelPagesDeploymentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pages/deployments/${params.pages_deployment_id}/cancel`,\n        {}\n      )\n      .json<github.ReposCancelPagesDeploymentResponse>()\n  }\n\n  /**\n * Gets a health check of the DNS settings for the `CNAME` record configured for a repository's GitHub Pages.\n\nThe first request to this endpoint returns a `202 Accepted` status and starts an asynchronous background task to get the results for the domain. After the background task completes, subsequent requests to this endpoint return a `200 OK` status with the health check results in the response.\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_get_pages_health_check',\n    description: `Gets a health check of the DNS settings for the \\`CNAME\\` record configured for a repository's GitHub Pages.\n\nThe first request to this endpoint returns a \\`202 Accepted\\` status and starts an asynchronous background task to get the results for the domain. After the background task completes, subsequent requests to this endpoint return a \\`200 OK\\` status with the health check results in the response.\n\nThe authenticated user must be a repository administrator, maintainer, or have the 'manage GitHub Pages settings' permission to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.ReposGetPagesHealthCheckParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetPagesHealthCheck(\n    params: github.ReposGetPagesHealthCheckParams\n  ): Promise<github.ReposGetPagesHealthCheckResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/pages/health`, {})\n      .json<github.ReposGetPagesHealthCheckResponse>()\n  }\n\n  /**\n   * Returns a boolean indicating whether or not private vulnerability reporting is enabled for the repository. For more information, see \"[Evaluating the security settings of a repository](https://docs.github.com/code-security/security-advisories/working-with-repository-security-advisories/evaluating-the-security-settings-of-a-repository)\".\n   */\n  @aiFunction({\n    name: 'github_repos_check_private_vulnerability_reporting',\n    description: `Returns a boolean indicating whether or not private vulnerability reporting is enabled for the repository. For more information, see \"[Evaluating the security settings of a repository](https://docs.github.com/code-security/security-advisories/working-with-repository-security-advisories/evaluating-the-security-settings-of-a-repository)\".`,\n    inputSchema: github.ReposCheckPrivateVulnerabilityReportingParamsSchema,\n    tags: ['repos']\n  })\n  async reposCheckPrivateVulnerabilityReporting(\n    params: github.ReposCheckPrivateVulnerabilityReportingParams\n  ): Promise<github.ReposCheckPrivateVulnerabilityReportingResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/private-vulnerability-reporting`,\n        {}\n      )\n      .json<github.ReposCheckPrivateVulnerabilityReportingResponse>()\n  }\n\n  /**\n   * Enables private vulnerability reporting for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Privately reporting a security vulnerability](https://docs.github.com/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability).\".\n   */\n  @aiFunction({\n    name: 'github_repos_enable_private_vulnerability_reporting',\n    description: `Enables private vulnerability reporting for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Privately reporting a security vulnerability](https://docs.github.com/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability).\".`,\n    inputSchema: github.ReposEnablePrivateVulnerabilityReportingParamsSchema,\n    tags: ['repos']\n  })\n  async reposEnablePrivateVulnerabilityReporting(\n    params: github.ReposEnablePrivateVulnerabilityReportingParams\n  ): Promise<github.ReposEnablePrivateVulnerabilityReportingResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/private-vulnerability-reporting`,\n        {}\n      )\n      .json<github.ReposEnablePrivateVulnerabilityReportingResponse>()\n  }\n\n  /**\n   * Disables private vulnerability reporting for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Privately reporting a security vulnerability](https://docs.github.com/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability)\".\n   */\n  @aiFunction({\n    name: 'github_repos_disable_private_vulnerability_reporting',\n    description: `Disables private vulnerability reporting for a repository. The authenticated user must have admin access to the repository. For more information, see \"[Privately reporting a security vulnerability](https://docs.github.com/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability)\".`,\n    inputSchema: github.ReposDisablePrivateVulnerabilityReportingParamsSchema,\n    tags: ['repos']\n  })\n  async reposDisablePrivateVulnerabilityReporting(\n    params: github.ReposDisablePrivateVulnerabilityReportingParams\n  ): Promise<github.ReposDisablePrivateVulnerabilityReportingResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/private-vulnerability-reporting`,\n        {}\n      )\n      .json<github.ReposDisablePrivateVulnerabilityReportingResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_list_for_repo',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsListForRepoParamsSchema,\n    tags: ['projects']\n  })\n  async projectsListForRepo(\n    params: github.ProjectsListForRepoParams\n  ): Promise<github.ProjectsListForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/projects`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'state', 'per_page', 'page')\n        )\n      })\n      .json<github.ProjectsListForRepoResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_create_for_repo',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsCreateForRepoParamsSchema,\n    tags: ['projects']\n  })\n  async projectsCreateForRepo(\n    params: github.ProjectsCreateForRepoParams\n  ): Promise<github.ProjectsCreateForRepoResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/projects`, {\n        json: pick(params, 'name', 'body')\n      })\n      .json<github.ProjectsCreateForRepoResponse>()\n  }\n\n  /**\n * Gets all custom property values that are set for a repository.\nUsers with read access to the repository can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_get_custom_properties_values',\n    description: `Gets all custom property values that are set for a repository.\nUsers with read access to the repository can use this endpoint.`,\n    inputSchema: github.ReposGetCustomPropertiesValuesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCustomPropertiesValues(\n    params: github.ReposGetCustomPropertiesValuesParams\n  ): Promise<github.ReposGetCustomPropertiesValuesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/properties/values`, {})\n      .json<github.ReposGetCustomPropertiesValuesResponse>()\n  }\n\n  /**\n * Create new or update existing custom property values for a repository.\nUsing a value of `null` for a custom property will remove or 'unset' the property value from the repository.\n\nRepository admins and other users with the repository-level \"edit custom property values\" fine-grained permission can use this endpoint.\n */\n  @aiFunction({\n    name: 'github_repos_create_or_update_custom_properties_values',\n    description: `Create new or update existing custom property values for a repository.\nUsing a value of \\`null\\` for a custom property will remove or 'unset' the property value from the repository.\n\nRepository admins and other users with the repository-level \"edit custom property values\" fine-grained permission can use this endpoint.`,\n    inputSchema: github.ReposCreateOrUpdateCustomPropertiesValuesParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateOrUpdateCustomPropertiesValues(\n    params: github.ReposCreateOrUpdateCustomPropertiesValuesParams\n  ): Promise<github.ReposCreateOrUpdateCustomPropertiesValuesResponse> {\n    return this.ky\n      .patch(`/repos/${params.owner}/${params.repo}/properties/values`, {\n        json: pick(params, 'properties')\n      })\n      .json<github.ReposCreateOrUpdateCustomPropertiesValuesResponse>()\n  }\n\n  /**\n * Lists pull requests in a specified repository.\n\nDraft pull requests are available in public repositories with GitHub\nFree and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing\nplans, and in public and private repositories with GitHub Team and GitHub Enterprise\nCloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products)\nin the GitHub Help documentation.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_list',\n    description: `Lists pull requests in a specified repository.\n\nDraft pull requests are available in public repositories with GitHub\nFree and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing\nplans, and in public and private repositories with GitHub Team and GitHub Enterprise\nCloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products)\nin the GitHub Help documentation.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsListParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsList(\n    params: github.PullsListParams\n  ): Promise<github.PullsListResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/pulls`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'state',\n            'head',\n            'base',\n            'sort',\n            'direction',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.PullsListResponse>()\n  }\n\n  /**\n * Draft pull requests are available in public repositories with GitHub Free and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing plans, and in public and private repositories with GitHub Team and GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo open or update a pull request in a public repository, you must have write access to the head or the source branch. For organization-owned repositories, you must be a member of the organization that owns the repository to open or update a pull request.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_create',\n    description: `Draft pull requests are available in public repositories with GitHub Free and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing plans, and in public and private repositories with GitHub Team and GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo open or update a pull request in a public repository, you must have write access to the head or the source branch. For organization-owned repositories, you must be a member of the organization that owns the repository to open or update a pull request.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsCreateParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsCreate(\n    params: github.PullsCreateParams\n  ): Promise<github.PullsCreateResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/pulls`, {\n        json: pick(\n          params,\n          'title',\n          'head',\n          'head_repo',\n          'base',\n          'body',\n          'maintainer_can_modify',\n          'draft',\n          'issue'\n        )\n      })\n      .json<github.PullsCreateResponse>()\n  }\n\n  /**\n * Lists review comments for all pull requests in a repository. By default,\nreview comments are in ascending order by ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_list_review_comments_for_repo',\n    description: `Lists review comments for all pull requests in a repository. By default,\nreview comments are in ascending order by ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsListReviewCommentsForRepoParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsListReviewCommentsForRepo(\n    params: github.PullsListReviewCommentsForRepoParams\n  ): Promise<github.PullsListReviewCommentsForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/pulls/comments`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sort', 'direction', 'since', 'per_page', 'page')\n        )\n      })\n      .json<github.PullsListReviewCommentsForRepoResponse>()\n  }\n\n  /**\n * Provides details for a specified review comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_get_review_comment',\n    description: `Provides details for a specified review comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsGetReviewCommentParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsGetReviewComment(\n    params: github.PullsGetReviewCommentParams\n  ): Promise<github.PullsGetReviewCommentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/comments/${params.comment_id}`,\n        {}\n      )\n      .json<github.PullsGetReviewCommentResponse>()\n  }\n\n  /**\n   * Deletes a review comment.\n   */\n  @aiFunction({\n    name: 'github_pulls_delete_review_comment',\n    description: `Deletes a review comment.`,\n    inputSchema: github.PullsDeleteReviewCommentParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsDeleteReviewComment(\n    params: github.PullsDeleteReviewCommentParams\n  ): Promise<github.PullsDeleteReviewCommentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/pulls/comments/${params.comment_id}`,\n        {}\n      )\n      .json<github.PullsDeleteReviewCommentResponse>()\n  }\n\n  /**\n * Edits the content of a specified review comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_update_review_comment',\n    description: `Edits the content of a specified review comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsUpdateReviewCommentParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsUpdateReviewComment(\n    params: github.PullsUpdateReviewCommentParams\n  ): Promise<github.PullsUpdateReviewCommentResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/pulls/comments/${params.comment_id}`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.PullsUpdateReviewCommentResponse>()\n  }\n\n  /**\n   * List the reactions to a [pull request review comment](https://docs.github.com/rest/pulls/comments#get-a-review-comment-for-a-pull-request).\n   */\n  @aiFunction({\n    name: 'github_reactions_list_for_pull_request_review_comment',\n    description: `List the reactions to a [pull request review comment](https://docs.github.com/rest/pulls/comments#get-a-review-comment-for-a-pull-request).`,\n    inputSchema: github.ReactionsListForPullRequestReviewCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForPullRequestReviewComment(\n    params: github.ReactionsListForPullRequestReviewCommentParams\n  ): Promise<github.ReactionsListForPullRequestReviewCommentResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/comments/${params.comment_id}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForPullRequestReviewCommentResponse>()\n  }\n\n  /**\n   * Create a reaction to a [pull request review comment](https://docs.github.com/rest/pulls/comments#get-a-review-comment-for-a-pull-request). A response with an HTTP `200` status means that you already added the reaction type to this pull request review comment.\n   */\n  @aiFunction({\n    name: 'github_reactions_create_for_pull_request_review_comment',\n    description: `Create a reaction to a [pull request review comment](https://docs.github.com/rest/pulls/comments#get-a-review-comment-for-a-pull-request). A response with an HTTP \\`200\\` status means that you already added the reaction type to this pull request review comment.`,\n    inputSchema: github.ReactionsCreateForPullRequestReviewCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForPullRequestReviewComment(\n    params: github.ReactionsCreateForPullRequestReviewCommentParams\n  ): Promise<github.ReactionsCreateForPullRequestReviewCommentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pulls/comments/${params.comment_id}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForPullRequestReviewCommentResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> You can also specify a repository by `repository_id` using the route `DELETE /repositories/:repository_id/pulls/comments/:comment_id/reactions/:reaction_id.`\n\nDelete a reaction to a [pull request review comment](https://docs.github.com/rest/pulls/comments#get-a-review-comment-for-a-pull-request).\n */\n  @aiFunction({\n    name: 'github_reactions_delete_for_pull_request_comment',\n    description: `> [!NOTE]\n> You can also specify a repository by \\`repository_id\\` using the route \\`DELETE /repositories/:repository_id/pulls/comments/:comment_id/reactions/:reaction_id.\\`\n\nDelete a reaction to a [pull request review comment](https://docs.github.com/rest/pulls/comments#get-a-review-comment-for-a-pull-request).`,\n    inputSchema: github.ReactionsDeleteForPullRequestCommentParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsDeleteForPullRequestComment(\n    params: github.ReactionsDeleteForPullRequestCommentParams\n  ): Promise<github.ReactionsDeleteForPullRequestCommentResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/pulls/comments/${params.comment_id}/reactions/${params.reaction_id}`,\n        {}\n      )\n      .json<github.ReactionsDeleteForPullRequestCommentResponse>()\n  }\n\n  /**\n * Draft pull requests are available in public repositories with GitHub Free and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing plans, and in public and private repositories with GitHub Team and GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists details of a pull request by providing its number.\n\nWhen you get, [create](https://docs.github.com/rest/pulls/pulls/#create-a-pull-request), or [edit](https://docs.github.com/rest/pulls/pulls#update-a-pull-request) a pull request, GitHub creates a merge commit to test whether the pull request can be automatically merged into the base branch. This test commit is not added to the base branch or the head branch. You can review the status of the test commit using the `mergeable` key. For more information, see \"[Checking mergeability of pull requests](https://docs.github.com/rest/guides/getting-started-with-the-git-database-api#checking-mergeability-of-pull-requests)\".\n\nThe value of the `mergeable` attribute can be `true`, `false`, or `null`. If the value is `null`, then GitHub has started a background job to compute the mergeability. After giving the job time to complete, resubmit the request. When the job finishes, you will see a non-`null` value for the `mergeable` attribute in the response. If `mergeable` is `true`, then `merge_commit_sha` will be the SHA of the _test_ merge commit.\n\nThe value of the `merge_commit_sha` attribute changes depending on the state of the pull request. Before merging a pull request, the `merge_commit_sha` attribute holds the SHA of the _test_ merge commit. After merging a pull request, the `merge_commit_sha` attribute changes depending on how you merged the pull request:\n\n*   If merged as a [merge commit](https://docs.github.com/articles/about-merge-methods-on-github/), `merge_commit_sha` represents the SHA of the merge commit.\n*   If merged via a [squash](https://docs.github.com/articles/about-merge-methods-on-github/#squashing-your-merge-commits), `merge_commit_sha` represents the SHA of the squashed commit on the base branch.\n*   If [rebased](https://docs.github.com/articles/about-merge-methods-on-github/#rebasing-and-merging-your-commits), `merge_commit_sha` represents the commit that the base branch was updated to.\n\nPass the appropriate [media type](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types) to fetch diff and patch formats.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n- **`application/vnd.github.diff`**: For more information, see \"[git-diff](https://git-scm.com/docs/git-diff)\" in the Git documentation. If a diff is corrupt, contact us through the [GitHub Support portal](https://support.github.com/). Include the repository name and pull request ID in your message.\n */\n  @aiFunction({\n    name: 'github_pulls_get',\n    description: `Draft pull requests are available in public repositories with GitHub Free and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing plans, and in public and private repositories with GitHub Team and GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nLists details of a pull request by providing its number.\n\nWhen you get, [create](https://docs.github.com/rest/pulls/pulls/#create-a-pull-request), or [edit](https://docs.github.com/rest/pulls/pulls#update-a-pull-request) a pull request, GitHub creates a merge commit to test whether the pull request can be automatically merged into the base branch. This test commit is not added to the base branch or the head branch. You can review the status of the test commit using the \\`mergeable\\` key. For more information, see \"[Checking mergeability of pull requests](https://docs.github.com/rest/guides/getting-started-with-the-git-database-api#checking-mergeability-of-pull-requests)\".\n\nThe value of the \\`mergeable\\` attribute can be \\`true\\`, \\`false\\`, or \\`null\\`. If the value is \\`null\\`, then GitHub has started a background job to compute the mergeability. After giving the job time to complete, resubmit the request. When the job finishes, you will see a non-\\`null\\` value for the \\`mergeable\\` attribute in the response. If \\`mergeable\\` is \\`true\\`, then \\`merge_commit_sha\\` will be the SHA of the _test_ merge commit.\n\nThe value of the \\`merge_commit_sha\\` attribute changes depending on the state of the pull request. Before merging a pull request, the \\`merge_commit_sha\\` attribute holds the SHA of the _test_ merge commit. After merging a pull request, the \\`merge_commit_sha\\` attribute changes depending on how you merged the pull request:\n\n*   If merged as a [merge commit](https://docs.github.com/articles/about-merge-methods-on-github/), \\`merge_commit_sha\\` represents the SHA of the merge commit.\n*   If merged via a [squash](https://docs.github.com/articles/about-merge-methods-on-github/#squashing-your-merge-commits), \\`merge_commit_sha\\` represents the SHA of the squashed commit on the base branch.\n*   If [rebased](https://docs.github.com/articles/about-merge-methods-on-github/#rebasing-and-merging-your-commits), \\`merge_commit_sha\\` represents the commit that the base branch was updated to.\n\nPass the appropriate [media type](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types) to fetch diff and patch formats.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.\n- **\\`application/vnd.github.diff\\`**: For more information, see \"[git-diff](https://git-scm.com/docs/git-diff)\" in the Git documentation. If a diff is corrupt, contact us through the [GitHub Support portal](https://support.github.com/). Include the repository name and pull request ID in your message.`,\n    inputSchema: github.PullsGetParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsGet(\n    params: github.PullsGetParams\n  ): Promise<github.PullsGetResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}`,\n        {}\n      )\n      .json<github.PullsGetResponse>()\n  }\n\n  /**\n * Draft pull requests are available in public repositories with GitHub Free and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing plans, and in public and private repositories with GitHub Team and GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo open or update a pull request in a public repository, you must have write access to the head or the source branch. For organization-owned repositories, you must be a member of the organization that owns the repository to open or update a pull request.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_update',\n    description: `Draft pull requests are available in public repositories with GitHub Free and GitHub Free for organizations, GitHub Pro, and legacy per-repository billing plans, and in public and private repositories with GitHub Team and GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo open or update a pull request in a public repository, you must have write access to the head or the source branch. For organization-owned repositories, you must be a member of the organization that owns the repository to open or update a pull request.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsUpdateParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsUpdate(\n    params: github.PullsUpdateParams\n  ): Promise<github.PullsUpdateResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}`,\n        {\n          json: pick(\n            params,\n            'title',\n            'body',\n            'state',\n            'base',\n            'maintainer_can_modify'\n          )\n        }\n      )\n      .json<github.PullsUpdateResponse>()\n  }\n\n  /**\n * Creates a codespace owned by the authenticated user for the specified pull request.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_create_with_pr_for_authenticated_user',\n    description: `Creates a codespace owned by the authenticated user for the specified pull request.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesCreateWithPrForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesCreateWithPrForAuthenticatedUser(\n    params: github.CodespacesCreateWithPrForAuthenticatedUserParams\n  ): Promise<github.CodespacesCreateWithPrForAuthenticatedUserResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/codespaces`,\n        {\n          json: pick(\n            params,\n            'location',\n            'geo',\n            'client_ip',\n            'machine',\n            'devcontainer_path',\n            'multi_repo_permissions_opt_out',\n            'working_directory',\n            'idle_timeout_minutes',\n            'display_name',\n            'retention_period_minutes'\n          )\n        }\n      )\n      .json<github.CodespacesCreateWithPrForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists all review comments for a specified pull request. By default, review comments\nare in ascending order by ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_list_review_comments',\n    description: `Lists all review comments for a specified pull request. By default, review comments\nare in ascending order by ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsListReviewCommentsParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsListReviewComments(\n    params: github.PullsListReviewCommentsParams\n  ): Promise<github.PullsListReviewCommentsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/comments`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'sort', 'direction', 'since', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.PullsListReviewCommentsResponse>()\n  }\n\n  /**\n * Creates a review comment on the diff of a specified pull request. To add a regular comment to a pull request timeline, see \"[Create an issue comment](https://docs.github.com/rest/issues/comments#create-an-issue-comment).\"\n\nIf your comment applies to more than one line in the pull request diff, you should use the parameters `line`, `side`, and optionally `start_line` and `start_side` in your request.\n\nThe `position` parameter is closing down. If you use `position`, the `line`, `side`, `start_line`, and `start_side` parameters are not required.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_create_review_comment',\n    description: `Creates a review comment on the diff of a specified pull request. To add a regular comment to a pull request timeline, see \"[Create an issue comment](https://docs.github.com/rest/issues/comments#create-an-issue-comment).\"\n\nIf your comment applies to more than one line in the pull request diff, you should use the parameters \\`line\\`, \\`side\\`, and optionally \\`start_line\\` and \\`start_side\\` in your request.\n\nThe \\`position\\` parameter is closing down. If you use \\`position\\`, the \\`line\\`, \\`side\\`, \\`start_line\\`, and \\`start_side\\` parameters are not required.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsCreateReviewCommentParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsCreateReviewComment(\n    params: github.PullsCreateReviewCommentParams\n  ): Promise<github.PullsCreateReviewCommentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/comments`,\n        {\n          json: pick(\n            params,\n            'body',\n            'commit_id',\n            'path',\n            'position',\n            'side',\n            'line',\n            'start_line',\n            'start_side',\n            'in_reply_to',\n            'subject_type'\n          )\n        }\n      )\n      .json<github.PullsCreateReviewCommentResponse>()\n  }\n\n  /**\n * Creates a reply to a review comment for a pull request. For the `comment_id`, provide the ID of the review comment you are replying to. This must be the ID of a _top-level review comment_, not a reply to that comment. Replies to replies are not supported.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_create_reply_for_review_comment',\n    description: `Creates a reply to a review comment for a pull request. For the \\`comment_id\\`, provide the ID of the review comment you are replying to. This must be the ID of a _top-level review comment_, not a reply to that comment. Replies to replies are not supported.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\"\nand \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsCreateReplyForReviewCommentParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsCreateReplyForReviewComment(\n    params: github.PullsCreateReplyForReviewCommentParams\n  ): Promise<github.PullsCreateReplyForReviewCommentResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/comments/${params.comment_id}/replies`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.PullsCreateReplyForReviewCommentResponse>()\n  }\n\n  /**\n * Lists a maximum of 250 commits for a pull request. To receive a complete\ncommit list for pull requests with more than 250 commits, use the [List commits](https://docs.github.com/rest/commits/commits#list-commits)\nendpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_list_commits',\n    description: `Lists a maximum of 250 commits for a pull request. To receive a complete\ncommit list for pull requests with more than 250 commits, use the [List commits](https://docs.github.com/rest/commits/commits#list-commits)\nendpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsListCommitsParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsListCommits(\n    params: github.PullsListCommitsParams\n  ): Promise<github.PullsListCommitsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/commits`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.PullsListCommitsResponse>()\n  }\n\n  /**\n * Lists the files in a specified pull request.\n\n> [!NOTE]\n> Responses include a maximum of 3000 files. The paginated response returns 30 files per page by default.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_list_files',\n    description: `Lists the files in a specified pull request.\n\n> [!NOTE]\n> Responses include a maximum of 3000 files. The paginated response returns 30 files per page by default.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsListFilesParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsListFiles(\n    params: github.PullsListFilesParams\n  ): Promise<github.PullsListFilesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/files`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.PullsListFilesResponse>()\n  }\n\n  /**\n   * Checks if a pull request has been merged into the base branch. The HTTP status of the response indicates whether or not the pull request has been merged; the response body is empty.\n   */\n  @aiFunction({\n    name: 'github_pulls_check_if_merged',\n    description: `Checks if a pull request has been merged into the base branch. The HTTP status of the response indicates whether or not the pull request has been merged; the response body is empty.`,\n    inputSchema: github.PullsCheckIfMergedParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsCheckIfMerged(\n    params: github.PullsCheckIfMergedParams\n  ): Promise<github.PullsCheckIfMergedResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/merge`,\n        {}\n      )\n      .json<github.PullsCheckIfMergedResponse>()\n  }\n\n  /**\n * Merges a pull request into the base branch.\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".\n */\n  @aiFunction({\n    name: 'github_pulls_merge',\n    description: `Merges a pull request into the base branch.\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".`,\n    inputSchema: github.PullsMergeParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsMerge(\n    params: github.PullsMergeParams\n  ): Promise<github.PullsMergeResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/merge`,\n        {\n          json: pick(\n            params,\n            'commit_title',\n            'commit_message',\n            'sha',\n            'merge_method'\n          )\n        }\n      )\n      .json<github.PullsMergeResponse>()\n  }\n\n  /**\n   * Gets the users or teams whose review is requested for a pull request. Once a requested reviewer submits a review, they are no longer considered a requested reviewer. Their review will instead be returned by the [List reviews for a pull request](https://docs.github.com/rest/pulls/reviews#list-reviews-for-a-pull-request) operation.\n   */\n  @aiFunction({\n    name: 'github_pulls_list_requested_reviewers',\n    description: `Gets the users or teams whose review is requested for a pull request. Once a requested reviewer submits a review, they are no longer considered a requested reviewer. Their review will instead be returned by the [List reviews for a pull request](https://docs.github.com/rest/pulls/reviews#list-reviews-for-a-pull-request) operation.`,\n    inputSchema: github.PullsListRequestedReviewersParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsListRequestedReviewers(\n    params: github.PullsListRequestedReviewersParams\n  ): Promise<github.PullsListRequestedReviewersResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/requested_reviewers`,\n        {}\n      )\n      .json<github.PullsListRequestedReviewersResponse>()\n  }\n\n  /**\n * Requests reviews for a pull request from a given set of users and/or teams.\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".\n */\n  @aiFunction({\n    name: 'github_pulls_request_reviewers',\n    description: `Requests reviews for a pull request from a given set of users and/or teams.\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".`,\n    // TODO: Improve handling of union params\n    inputSchema: github.PullsRequestReviewersParamsSchema as any,\n    tags: ['pulls']\n  })\n  async pullsRequestReviewers(\n    params: github.PullsRequestReviewersParams\n  ): Promise<github.PullsRequestReviewersResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/requested_reviewers`,\n        {\n          json: params\n        }\n      )\n      .json<github.PullsRequestReviewersResponse>()\n  }\n\n  /**\n   * Removes review requests from a pull request for a given set of users and/or teams.\n   */\n  @aiFunction({\n    name: 'github_pulls_remove_requested_reviewers',\n    description: `Removes review requests from a pull request for a given set of users and/or teams.`,\n    inputSchema: github.PullsRemoveRequestedReviewersParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsRemoveRequestedReviewers(\n    params: github.PullsRemoveRequestedReviewersParams\n  ): Promise<github.PullsRemoveRequestedReviewersResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/requested_reviewers`,\n        {\n          json: pick(params, 'reviewers', 'team_reviewers')\n        }\n      )\n      .json<github.PullsRemoveRequestedReviewersResponse>()\n  }\n\n  /**\n * Lists all reviews for a specified pull request. The list of reviews returns in chronological order.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_list_reviews',\n    description: `Lists all reviews for a specified pull request. The list of reviews returns in chronological order.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsListReviewsParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsListReviews(\n    params: github.PullsListReviewsParams\n  ): Promise<github.PullsListReviewsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.PullsListReviewsResponse>()\n  }\n\n  /**\n * Creates a review on a specified pull request.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nPull request reviews created in the `PENDING` state are not submitted and therefore do not include the `submitted_at` property in the response. To create a pending review for a pull request, leave the `event` parameter blank. For more information about submitting a `PENDING` review, see \"[Submit a review for a pull request](https://docs.github.com/rest/pulls/reviews#submit-a-review-for-a-pull-request).\"\n\n> [!NOTE]\n> To comment on a specific line in a file, you need to first determine the position of that line in the diff. To see a pull request diff, add the `application/vnd.github.v3.diff` media type to the `Accept` header of a call to the [Get a pull request](https://docs.github.com/rest/pulls/pulls#get-a-pull-request) endpoint.\n\nThe `position` value equals the number of lines down from the first \"@@\" hunk header in the file you want to add a comment. The line just below the \"@@\" line is position 1, the next line is position 2, and so on. The position in the diff continues to increase through lines of whitespace and additional hunks until the beginning of a new file.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_create_review',\n    description: `Creates a review on a specified pull request.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nPull request reviews created in the \\`PENDING\\` state are not submitted and therefore do not include the \\`submitted_at\\` property in the response. To create a pending review for a pull request, leave the \\`event\\` parameter blank. For more information about submitting a \\`PENDING\\` review, see \"[Submit a review for a pull request](https://docs.github.com/rest/pulls/reviews#submit-a-review-for-a-pull-request).\"\n\n> [!NOTE]\n> To comment on a specific line in a file, you need to first determine the position of that line in the diff. To see a pull request diff, add the \\`application/vnd.github.v3.diff\\` media type to the \\`Accept\\` header of a call to the [Get a pull request](https://docs.github.com/rest/pulls/pulls#get-a-pull-request) endpoint.\n\nThe \\`position\\` value equals the number of lines down from the first \"@@\" hunk header in the file you want to add a comment. The line just below the \"@@\" line is position 1, the next line is position 2, and so on. The position in the diff continues to increase through lines of whitespace and additional hunks until the beginning of a new file.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsCreateReviewParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsCreateReview(\n    params: github.PullsCreateReviewParams\n  ): Promise<github.PullsCreateReviewResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews`,\n        {\n          json: pick(params, 'commit_id', 'body', 'event', 'comments')\n        }\n      )\n      .json<github.PullsCreateReviewResponse>()\n  }\n\n  /**\n * Retrieves a pull request review by its ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_get_review',\n    description: `Retrieves a pull request review by its ID.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsGetReviewParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsGetReview(\n    params: github.PullsGetReviewParams\n  ): Promise<github.PullsGetReviewResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews/${params.review_id}`,\n        {}\n      )\n      .json<github.PullsGetReviewResponse>()\n  }\n\n  /**\n * Updates the contents of a specified review summary comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_update_review',\n    description: `Updates the contents of a specified review summary comment.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsUpdateReviewParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsUpdateReview(\n    params: github.PullsUpdateReviewParams\n  ): Promise<github.PullsUpdateReviewResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews/${params.review_id}`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.PullsUpdateReviewResponse>()\n  }\n\n  /**\n * Deletes a pull request review that has not been submitted. Submitted reviews cannot be deleted.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_delete_pending_review',\n    description: `Deletes a pull request review that has not been submitted. Submitted reviews cannot be deleted.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsDeletePendingReviewParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsDeletePendingReview(\n    params: github.PullsDeletePendingReviewParams\n  ): Promise<github.PullsDeletePendingReviewResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews/${params.review_id}`,\n        {}\n      )\n      .json<github.PullsDeletePendingReviewResponse>()\n  }\n\n  /**\n * Lists comments for a specific pull request review.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_list_comments_for_review',\n    description: `Lists comments for a specific pull request review.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsListCommentsForReviewParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsListCommentsForReview(\n    params: github.PullsListCommentsForReviewParams\n  ): Promise<github.PullsListCommentsForReviewResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews/${params.review_id}/comments`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.PullsListCommentsForReviewResponse>()\n  }\n\n  /**\n * Dismisses a specified review on a pull request.\n\n> [!NOTE]\n> To dismiss a pull request review on a [protected branch](https://docs.github.com/rest/branches/branch-protection), you must be a repository administrator or be included in the list of people or teams who can dismiss pull request reviews.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_dismiss_review',\n    description: `Dismisses a specified review on a pull request.\n\n> [!NOTE]\n> To dismiss a pull request review on a [protected branch](https://docs.github.com/rest/branches/branch-protection), you must be a repository administrator or be included in the list of people or teams who can dismiss pull request reviews.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsDismissReviewParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsDismissReview(\n    params: github.PullsDismissReviewParams\n  ): Promise<github.PullsDismissReviewResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews/${params.review_id}/dismissals`,\n        {\n          json: pick(params, 'message', 'event')\n        }\n      )\n      .json<github.PullsDismissReviewResponse>()\n  }\n\n  /**\n * Submits a pending review for a pull request. For more information about creating a pending review for a pull request, see \"[Create a review for a pull request](https://docs.github.com/rest/pulls/reviews#create-a-review-for-a-pull-request).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github-commitcomment.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github-commitcomment.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github-commitcomment.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github-commitcomment.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_pulls_submit_review',\n    description: `Submits a pending review for a pull request. For more information about creating a pending review for a pull request, see \"[Create a review for a pull request](https://docs.github.com/rest/pulls/reviews#create-a-review-for-a-pull-request).\"\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github-commitcomment.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github-commitcomment.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github-commitcomment.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github-commitcomment.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.PullsSubmitReviewParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsSubmitReview(\n    params: github.PullsSubmitReviewParams\n  ): Promise<github.PullsSubmitReviewResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/reviews/${params.review_id}/events`,\n        {\n          json: pick(params, 'body', 'event')\n        }\n      )\n      .json<github.PullsSubmitReviewResponse>()\n  }\n\n  /**\n * Updates the pull request branch with the latest upstream changes by merging HEAD from the base branch into the pull request branch.\nNote: If making a request on behalf of a GitHub App you must also have permissions to write the contents of the head repository.\n */\n  @aiFunction({\n    name: 'github_pulls_update_branch',\n    description: `Updates the pull request branch with the latest upstream changes by merging HEAD from the base branch into the pull request branch.\nNote: If making a request on behalf of a GitHub App you must also have permissions to write the contents of the head repository.`,\n    inputSchema: github.PullsUpdateBranchParamsSchema,\n    tags: ['pulls']\n  })\n  async pullsUpdateBranch(\n    params: github.PullsUpdateBranchParams\n  ): Promise<github.PullsUpdateBranchResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/pulls/${params.pull_number}/update-branch`,\n        {\n          json: pick(params, 'expected_head_sha')\n        }\n      )\n      .json<github.PullsUpdateBranchResponse>()\n  }\n\n  /**\n * Gets the preferred README for a repository.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw file contents. This is the default if you do not specify a media type.\n- **`application/vnd.github.html+json`**: Returns the README in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).\n */\n  @aiFunction({\n    name: 'github_repos_get_readme',\n    description: `Gets the preferred README for a repository.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw file contents. This is the default if you do not specify a media type.\n- **\\`application/vnd.github.html+json\\`**: Returns the README in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).`,\n    inputSchema: github.ReposGetReadmeParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetReadme(\n    params: github.ReposGetReadmeParams\n  ): Promise<github.ReposGetReadmeResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/readme`, {\n        searchParams: sanitizeSearchParams(pick(params, 'ref'))\n      })\n      .json<github.ReposGetReadmeResponse>()\n  }\n\n  /**\n * Gets the README from a repository directory.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw file contents. This is the default if you do not specify a media type.\n- **`application/vnd.github.html+json`**: Returns the README in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).\n */\n  @aiFunction({\n    name: 'github_repos_get_readme_in_directory',\n    description: `Gets the README from a repository directory.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw file contents. This is the default if you do not specify a media type.\n- **\\`application/vnd.github.html+json\\`**: Returns the README in HTML. Markup languages are rendered to HTML using GitHub's open-source [Markup library](https://github.com/github/markup).`,\n    inputSchema: github.ReposGetReadmeInDirectoryParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetReadmeInDirectory(\n    params: github.ReposGetReadmeInDirectoryParams\n  ): Promise<github.ReposGetReadmeInDirectoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/readme/${params.dir}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'ref'))\n        }\n      )\n      .json<github.ReposGetReadmeInDirectoryResponse>()\n  }\n\n  /**\n * This returns a list of releases, which does not include regular Git tags that have not been associated with a release. To get a list of Git tags, use the [Repository Tags API](https://docs.github.com/rest/repos/repos#list-repository-tags).\n\nInformation about published releases are available to everyone. Only users with push access will receive listings for draft releases.\n */\n  @aiFunction({\n    name: 'github_repos_list_releases',\n    description: `This returns a list of releases, which does not include regular Git tags that have not been associated with a release. To get a list of Git tags, use the [Repository Tags API](https://docs.github.com/rest/repos/repos#list-repository-tags).\n\nInformation about published releases are available to everyone. Only users with push access will receive listings for draft releases.`,\n    inputSchema: github.ReposListReleasesParamsSchema,\n    tags: ['repos']\n  })\n  async reposListReleases(\n    params: github.ReposListReleasesParams\n  ): Promise<github.ReposListReleasesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/releases`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListReleasesResponse>()\n  }\n\n  /**\n * Users with push access to the repository can create a release.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".\n */\n  @aiFunction({\n    name: 'github_repos_create_release',\n    description: `Users with push access to the repository can create a release.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\".`,\n    inputSchema: github.ReposCreateReleaseParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateRelease(\n    params: github.ReposCreateReleaseParams\n  ): Promise<github.ReposCreateReleaseResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/releases`, {\n        json: pick(\n          params,\n          'tag_name',\n          'target_commitish',\n          'name',\n          'body',\n          'draft',\n          'prerelease',\n          'discussion_category_name',\n          'generate_release_notes',\n          'make_latest'\n        )\n      })\n      .json<github.ReposCreateReleaseResponse>()\n  }\n\n  /**\n * To download the asset's binary content:\n\n- If within a browser, fetch the location specified in the `browser_download_url` key provided in the response.\n- Alternatively, set the `Accept` header of the request to\n  [`application/octet-stream`](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\n  The API will either redirect the client to the location, or stream it directly if possible.\n  API clients should handle both a `200` or `302` response.\n */\n  @aiFunction({\n    name: 'github_repos_get_release_asset',\n    description: `To download the asset's binary content:\n\n- If within a browser, fetch the location specified in the \\`browser_download_url\\` key provided in the response.\n- Alternatively, set the \\`Accept\\` header of the request to\n  [\\`application/octet-stream\\`](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\n  The API will either redirect the client to the location, or stream it directly if possible.\n  API clients should handle both a \\`200\\` or \\`302\\` response.`,\n    inputSchema: github.ReposGetReleaseAssetParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetReleaseAsset(\n    params: github.ReposGetReleaseAssetParams\n  ): Promise<github.ReposGetReleaseAssetResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/releases/assets/${params.asset_id}`,\n        {}\n      )\n      .json<github.ReposGetReleaseAssetResponse>()\n  }\n\n  /**\n   * Delete a release asset.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_release_asset',\n    description: `Delete a release asset.`,\n    inputSchema: github.ReposDeleteReleaseAssetParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteReleaseAsset(\n    params: github.ReposDeleteReleaseAssetParams\n  ): Promise<github.ReposDeleteReleaseAssetResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/releases/assets/${params.asset_id}`,\n        {}\n      )\n      .json<github.ReposDeleteReleaseAssetResponse>()\n  }\n\n  /**\n   * Users with push access to the repository can edit a release asset.\n   */\n  @aiFunction({\n    name: 'github_repos_update_release_asset',\n    description: `Users with push access to the repository can edit a release asset.`,\n    inputSchema: github.ReposUpdateReleaseAssetParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateReleaseAsset(\n    params: github.ReposUpdateReleaseAssetParams\n  ): Promise<github.ReposUpdateReleaseAssetResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/releases/assets/${params.asset_id}`,\n        {\n          json: pick(params, 'name', 'label', 'state')\n        }\n      )\n      .json<github.ReposUpdateReleaseAssetResponse>()\n  }\n\n  /**\n   * Generate a name and body describing a [release](https://docs.github.com/rest/releases/releases#get-a-release). The body content will be markdown formatted and contain information like the changes since last release and users who contributed. The generated release notes are not saved anywhere. They are intended to be generated and used when creating a new release.\n   */\n  @aiFunction({\n    name: 'github_repos_generate_release_notes',\n    description: `Generate a name and body describing a [release](https://docs.github.com/rest/releases/releases#get-a-release). The body content will be markdown formatted and contain information like the changes since last release and users who contributed. The generated release notes are not saved anywhere. They are intended to be generated and used when creating a new release.`,\n    inputSchema: github.ReposGenerateReleaseNotesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGenerateReleaseNotes(\n    params: github.ReposGenerateReleaseNotesParams\n  ): Promise<github.ReposGenerateReleaseNotesResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/releases/generate-notes`,\n        {\n          json: pick(\n            params,\n            'tag_name',\n            'target_commitish',\n            'previous_tag_name',\n            'configuration_file_path'\n          )\n        }\n      )\n      .json<github.ReposGenerateReleaseNotesResponse>()\n  }\n\n  /**\n * View the latest published full release for the repository.\n\nThe latest release is the most recent non-prerelease, non-draft release, sorted by the `created_at` attribute. The `created_at` attribute is the date of the commit used for the release, and not the date when the release was drafted or published.\n */\n  @aiFunction({\n    name: 'github_repos_get_latest_release',\n    description: `View the latest published full release for the repository.\n\nThe latest release is the most recent non-prerelease, non-draft release, sorted by the \\`created_at\\` attribute. The \\`created_at\\` attribute is the date of the commit used for the release, and not the date when the release was drafted or published.`,\n    inputSchema: github.ReposGetLatestReleaseParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetLatestRelease(\n    params: github.ReposGetLatestReleaseParams\n  ): Promise<github.ReposGetLatestReleaseResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/releases/latest`, {})\n      .json<github.ReposGetLatestReleaseResponse>()\n  }\n\n  /**\n   * Get a published release with the specified tag.\n   */\n  @aiFunction({\n    name: 'github_repos_get_release_by_tag',\n    description: `Get a published release with the specified tag.`,\n    inputSchema: github.ReposGetReleaseByTagParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetReleaseByTag(\n    params: github.ReposGetReleaseByTagParams\n  ): Promise<github.ReposGetReleaseByTagResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/releases/tags/${params.tag}`,\n        {}\n      )\n      .json<github.ReposGetReleaseByTagResponse>()\n  }\n\n  /**\n * Gets a public release with the specified release ID.\n\n> [!NOTE]\n> This returns an `upload_url` key corresponding to the endpoint for uploading release assets. This key is a hypermedia resource. For more information, see \"[Getting started with the REST API](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#hypermedia).\".\n */\n  @aiFunction({\n    name: 'github_repos_get_release',\n    description: `Gets a public release with the specified release ID.\n\n> [!NOTE]\n> This returns an \\`upload_url\\` key corresponding to the endpoint for uploading release assets. This key is a hypermedia resource. For more information, see \"[Getting started with the REST API](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#hypermedia).\".`,\n    inputSchema: github.ReposGetReleaseParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetRelease(\n    params: github.ReposGetReleaseParams\n  ): Promise<github.ReposGetReleaseResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}`,\n        {}\n      )\n      .json<github.ReposGetReleaseResponse>()\n  }\n\n  /**\n   * Users with push access to the repository can delete a release.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_release',\n    description: `Users with push access to the repository can delete a release.`,\n    inputSchema: github.ReposDeleteReleaseParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteRelease(\n    params: github.ReposDeleteReleaseParams\n  ): Promise<github.ReposDeleteReleaseResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}`,\n        {}\n      )\n      .json<github.ReposDeleteReleaseResponse>()\n  }\n\n  /**\n   * Users with push access to the repository can edit a release.\n   */\n  @aiFunction({\n    name: 'github_repos_update_release',\n    description: `Users with push access to the repository can edit a release.`,\n    inputSchema: github.ReposUpdateReleaseParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateRelease(\n    params: github.ReposUpdateReleaseParams\n  ): Promise<github.ReposUpdateReleaseResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}`,\n        {\n          json: pick(\n            params,\n            'tag_name',\n            'target_commitish',\n            'name',\n            'body',\n            'draft',\n            'prerelease',\n            'make_latest',\n            'discussion_category_name'\n          )\n        }\n      )\n      .json<github.ReposUpdateReleaseResponse>()\n  }\n\n  /**\n   * List release assets.\n   */\n  @aiFunction({\n    name: 'github_repos_list_release_assets',\n    description: `List release assets.`,\n    inputSchema: github.ReposListReleaseAssetsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListReleaseAssets(\n    params: github.ReposListReleaseAssetsParams\n  ): Promise<github.ReposListReleaseAssetsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}/assets`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposListReleaseAssetsResponse>()\n  }\n\n  /**\n * This endpoint makes use of a [Hypermedia relation](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#hypermedia) to determine which URL to access. The endpoint you call to upload release assets is specific to your release. Use the `upload_url` returned in\nthe response of the [Create a release endpoint](https://docs.github.com/rest/releases/releases#create-a-release) to upload a release asset.\n\nYou need to use an HTTP client which supports [SNI](http://en.wikipedia.org/wiki/Server_Name_Indication) to make calls to this endpoint.\n\nMost libraries will set the required `Content-Length` header automatically. Use the required `Content-Type` header to provide the media type of the asset. For a list of media types, see [Media Types](https://www.iana.org/assignments/media-types/media-types.xhtml). For example:\n\n`application/zip`\n\nGitHub expects the asset data in its raw binary form, rather than JSON. You will send the raw binary content of the asset as the request body. Everything else about the endpoint is the same as the rest of the API. For example,\nyou'll still need to pass your authentication to be able to upload an asset.\n\nWhen an upstream failure occurs, you will receive a `502 Bad Gateway` status. This may leave an empty asset with a state of `starter`. It can be safely deleted.\n\n**Notes:**\n*   GitHub renames asset filenames that have special characters, non-alphanumeric characters, and leading or trailing periods. The \"[List release assets](https://docs.github.com/rest/releases/assets#list-release-assets)\"\nendpoint lists the renamed filenames. For more information and help, contact [GitHub Support](https://support.github.com/contact?tags=dotcom-rest-api).\n*   To find the `release_id` query the [`GET /repos/{owner}/{repo}/releases/latest` endpoint](https://docs.github.com/rest/releases/releases#get-the-latest-release).\n*   If you upload an asset with the same filename as another uploaded asset, you'll receive an error and must delete the old file before you can re-upload the new asset.\n */\n  @aiFunction({\n    name: 'github_repos_upload_release_asset',\n    description: `This endpoint makes use of a [Hypermedia relation](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#hypermedia) to determine which URL to access. The endpoint you call to upload release assets is specific to your release. Use the \\`upload_url\\` returned in\nthe response of the [Create a release endpoint](https://docs.github.com/rest/releases/releases#create-a-release) to upload a release asset.\n\nYou need to use an HTTP client which supports [SNI](http://en.wikipedia.org/wiki/Server_Name_Indication) to make calls to this endpoint.\n\nMost libraries will set the required \\`Content-Length\\` header automatically. Use the required \\`Content-Type\\` header to provide the media type of the asset. For a list of media types, see [Media Types](https://www.iana.org/assignments/media-types/media-types.xhtml). For example:\n\n\\`application/zip\\`\n\nGitHub expects the asset data in its raw binary form, rather than JSON. You will send the raw binary content of the asset as the request body. Everything else about the endpoint is the same as the rest of the API. For example,\nyou'll still need to pass your authentication to be able to upload an asset.\n\nWhen an upstream failure occurs, you will receive a \\`502 Bad Gateway\\` status. This may leave an empty asset with a state of \\`starter\\`. It can be safely deleted.\n\n**Notes:**\n*   GitHub renames asset filenames that have special characters, non-alphanumeric characters, and leading or trailing periods. The \"[List release assets](https://docs.github.com/rest/releases/assets#list-release-assets)\"\nendpoint lists the renamed filenames. For more information and help, contact [GitHub Support](https://support.github.com/contact?tags=dotcom-rest-api).\n*   To find the \\`release_id\\` query the [\\`GET /repos/{owner}/{repo}/releases/latest\\` endpoint](https://docs.github.com/rest/releases/releases#get-the-latest-release).\n*   If you upload an asset with the same filename as another uploaded asset, you'll receive an error and must delete the old file before you can re-upload the new asset.`,\n    inputSchema: github.ReposUploadReleaseAssetParamsSchema,\n    tags: ['repos']\n  })\n  async reposUploadReleaseAsset(\n    params: github.ReposUploadReleaseAssetParams\n  ): Promise<github.ReposUploadReleaseAssetResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}/assets`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'name', 'label'))\n        }\n      )\n      .json<github.ReposUploadReleaseAssetResponse>()\n  }\n\n  /**\n   * List the reactions to a [release](https://docs.github.com/rest/releases/releases#get-a-release).\n   */\n  @aiFunction({\n    name: 'github_reactions_list_for_release',\n    description: `List the reactions to a [release](https://docs.github.com/rest/releases/releases#get-a-release).`,\n    inputSchema: github.ReactionsListForReleaseParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForRelease(\n    params: github.ReactionsListForReleaseParams\n  ): Promise<github.ReactionsListForReleaseResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForReleaseResponse>()\n  }\n\n  /**\n   * Create a reaction to a [release](https://docs.github.com/rest/releases/releases#get-a-release). A response with a `Status: 200 OK` means that you already added the reaction type to this release.\n   */\n  @aiFunction({\n    name: 'github_reactions_create_for_release',\n    description: `Create a reaction to a [release](https://docs.github.com/rest/releases/releases#get-a-release). A response with a \\`Status: 200 OK\\` means that you already added the reaction type to this release.`,\n    inputSchema: github.ReactionsCreateForReleaseParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForRelease(\n    params: github.ReactionsCreateForReleaseParams\n  ): Promise<github.ReactionsCreateForReleaseResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForReleaseResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> You can also specify a repository by `repository_id` using the route `DELETE delete /repositories/:repository_id/releases/:release_id/reactions/:reaction_id`.\n\nDelete a reaction to a [release](https://docs.github.com/rest/releases/releases#get-a-release).\n */\n  @aiFunction({\n    name: 'github_reactions_delete_for_release',\n    description: `> [!NOTE]\n> You can also specify a repository by \\`repository_id\\` using the route \\`DELETE delete /repositories/:repository_id/releases/:release_id/reactions/:reaction_id\\`.\n\nDelete a reaction to a [release](https://docs.github.com/rest/releases/releases#get-a-release).`,\n    inputSchema: github.ReactionsDeleteForReleaseParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsDeleteForRelease(\n    params: github.ReactionsDeleteForReleaseParams\n  ): Promise<github.ReactionsDeleteForReleaseResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/releases/${params.release_id}/reactions/${params.reaction_id}`,\n        {}\n      )\n      .json<github.ReactionsDeleteForReleaseResponse>()\n  }\n\n  /**\n * Returns all active rules that apply to the specified branch. The branch does not need to exist; rules that would apply\nto a branch with that name will be returned. All active rules that apply will be returned, regardless of the level\nat which they are configured (e.g. repository or organization). Rules in rulesets with \"evaluate\" or \"disabled\"\nenforcement statuses are not returned.\n */\n  @aiFunction({\n    name: 'github_repos_get_branch_rules',\n    description: `Returns all active rules that apply to the specified branch. The branch does not need to exist; rules that would apply\nto a branch with that name will be returned. All active rules that apply will be returned, regardless of the level\nat which they are configured (e.g. repository or organization). Rules in rulesets with \"evaluate\" or \"disabled\"\nenforcement statuses are not returned.`,\n    inputSchema: github.ReposGetBranchRulesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetBranchRules(\n    params: github.ReposGetBranchRulesParams\n  ): Promise<github.ReposGetBranchRulesResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/rules/branches/${params.branch}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposGetBranchRulesResponse>()\n  }\n\n  /**\n   * Get all the rulesets for a repository.\n   */\n  @aiFunction({\n    name: 'github_repos_get_repo_rulesets',\n    description: `Get all the rulesets for a repository.`,\n    inputSchema: github.ReposGetRepoRulesetsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetRepoRulesets(\n    params: github.ReposGetRepoRulesetsParams\n  ): Promise<github.ReposGetRepoRulesetsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/rulesets`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'includes_parents', 'targets')\n        )\n      })\n      .json<github.ReposGetRepoRulesetsResponse>()\n  }\n\n  /**\n   * Create a ruleset for a repository.\n   */\n  @aiFunction({\n    name: 'github_repos_create_repo_ruleset',\n    description: `Create a ruleset for a repository.`,\n    inputSchema: github.ReposCreateRepoRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateRepoRuleset(\n    params: github.ReposCreateRepoRulesetParams\n  ): Promise<github.ReposCreateRepoRulesetResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/rulesets`, {\n        json: pick(\n          params,\n          'name',\n          'target',\n          'enforcement',\n          'bypass_actors',\n          'conditions',\n          'rules'\n        )\n      })\n      .json<github.ReposCreateRepoRulesetResponse>()\n  }\n\n  /**\n * Lists suites of rule evaluations at the repository level.\nFor more information, see \"[Managing rulesets for a repository](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/managing-rulesets-for-a-repository#viewing-insights-for-rulesets).\".\n */\n  @aiFunction({\n    name: 'github_repos_get_repo_rule_suites',\n    description: `Lists suites of rule evaluations at the repository level.\nFor more information, see \"[Managing rulesets for a repository](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/managing-rulesets-for-a-repository#viewing-insights-for-rulesets).\".`,\n    inputSchema: github.ReposGetRepoRuleSuitesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetRepoRuleSuites(\n    params: github.ReposGetRepoRuleSuitesParams\n  ): Promise<github.ReposGetRepoRuleSuitesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/rulesets/rule-suites`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'ref',\n            'time_period',\n            'actor_name',\n            'rule_suite_result',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.ReposGetRepoRuleSuitesResponse>()\n  }\n\n  /**\n * Gets information about a suite of rule evaluations from within a repository.\nFor more information, see \"[Managing rulesets for a repository](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/managing-rulesets-for-a-repository#viewing-insights-for-rulesets).\".\n */\n  @aiFunction({\n    name: 'github_repos_get_repo_rule_suite',\n    description: `Gets information about a suite of rule evaluations from within a repository.\nFor more information, see \"[Managing rulesets for a repository](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/managing-rulesets-for-a-repository#viewing-insights-for-rulesets).\".`,\n    inputSchema: github.ReposGetRepoRuleSuiteParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetRepoRuleSuite(\n    params: github.ReposGetRepoRuleSuiteParams\n  ): Promise<github.ReposGetRepoRuleSuiteResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/rulesets/rule-suites/${params.rule_suite_id}`,\n        {}\n      )\n      .json<github.ReposGetRepoRuleSuiteResponse>()\n  }\n\n  /**\n * Get a ruleset for a repository.\n\n**Note:** To prevent leaking sensitive information, the `bypass_actors` property is only returned if the user\nmaking the API request has write access to the ruleset.\n */\n  @aiFunction({\n    name: 'github_repos_get_repo_ruleset',\n    description: `Get a ruleset for a repository.\n\n**Note:** To prevent leaking sensitive information, the \\`bypass_actors\\` property is only returned if the user\nmaking the API request has write access to the ruleset.`,\n    inputSchema: github.ReposGetRepoRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetRepoRuleset(\n    params: github.ReposGetRepoRulesetParams\n  ): Promise<github.ReposGetRepoRulesetResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/rulesets/${params.ruleset_id}`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'includes_parents'))\n        }\n      )\n      .json<github.ReposGetRepoRulesetResponse>()\n  }\n\n  /**\n   * Update a ruleset for a repository.\n   */\n  @aiFunction({\n    name: 'github_repos_update_repo_ruleset',\n    description: `Update a ruleset for a repository.`,\n    inputSchema: github.ReposUpdateRepoRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposUpdateRepoRuleset(\n    params: github.ReposUpdateRepoRulesetParams\n  ): Promise<github.ReposUpdateRepoRulesetResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/rulesets/${params.ruleset_id}`,\n        {\n          json: pick(\n            params,\n            'name',\n            'target',\n            'enforcement',\n            'bypass_actors',\n            'conditions',\n            'rules'\n          )\n        }\n      )\n      .json<github.ReposUpdateRepoRulesetResponse>()\n  }\n\n  /**\n   * Delete a ruleset for a repository.\n   */\n  @aiFunction({\n    name: 'github_repos_delete_repo_ruleset',\n    description: `Delete a ruleset for a repository.`,\n    inputSchema: github.ReposDeleteRepoRulesetParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteRepoRuleset(\n    params: github.ReposDeleteRepoRulesetParams\n  ): Promise<github.ReposDeleteRepoRulesetResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/rulesets/${params.ruleset_id}`,\n        {}\n      )\n      .json<github.ReposDeleteRepoRulesetResponse>()\n  }\n\n  /**\n   * Get the history of a repository ruleset.\n   */\n  @aiFunction({\n    name: 'github_repos_get_repo_ruleset_history',\n    description: `Get the history of a repository ruleset.`,\n    inputSchema: github.ReposGetRepoRulesetHistoryParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetRepoRulesetHistory(\n    params: github.ReposGetRepoRulesetHistoryParams\n  ): Promise<github.ReposGetRepoRulesetHistoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/rulesets/${params.ruleset_id}/history`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n        }\n      )\n      .json<github.ReposGetRepoRulesetHistoryResponse>()\n  }\n\n  /**\n   * Get a version of a repository ruleset.\n   */\n  @aiFunction({\n    name: 'github_repos_get_repo_ruleset_version',\n    description: `Get a version of a repository ruleset.`,\n    inputSchema: github.ReposGetRepoRulesetVersionParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetRepoRulesetVersion(\n    params: github.ReposGetRepoRulesetVersionParams\n  ): Promise<github.ReposGetRepoRulesetVersionResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/rulesets/${params.ruleset_id}/history/${params.version_id}`,\n        {}\n      )\n      .json<github.ReposGetRepoRulesetVersionResponse>()\n  }\n\n  /**\n * Lists secret scanning alerts for an eligible repository, from newest to oldest.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_list_alerts_for_repo',\n    description: `Lists secret scanning alerts for an eligible repository, from newest to oldest.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.SecretScanningListAlertsForRepoParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningListAlertsForRepo(\n    params: github.SecretScanningListAlertsForRepoParams\n  ): Promise<github.SecretScanningListAlertsForRepoResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/secret-scanning/alerts`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(\n              params,\n              'state',\n              'secret_type',\n              'resolution',\n              'sort',\n              'direction',\n              'page',\n              'per_page',\n              'before',\n              'after',\n              'validity',\n              'is_publicly_leaked',\n              'is_multi_repo'\n            )\n          )\n        }\n      )\n      .json<github.SecretScanningListAlertsForRepoResponse>()\n  }\n\n  /**\n * Gets a single secret scanning alert detected in an eligible repository.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_get_alert',\n    description: `Gets a single secret scanning alert detected in an eligible repository.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.SecretScanningGetAlertParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningGetAlert(\n    params: github.SecretScanningGetAlertParams\n  ): Promise<github.SecretScanningGetAlertResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/secret-scanning/alerts/${params.alert_number}`,\n        {}\n      )\n      .json<github.SecretScanningGetAlertResponse>()\n  }\n\n  /**\n * Updates the status of a secret scanning alert in an eligible repository.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_update_alert',\n    description: `Updates the status of a secret scanning alert in an eligible repository.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.SecretScanningUpdateAlertParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningUpdateAlert(\n    params: github.SecretScanningUpdateAlertParams\n  ): Promise<github.SecretScanningUpdateAlertResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/secret-scanning/alerts/${params.alert_number}`,\n        {\n          json: pick(params, 'state', 'resolution', 'resolution_comment')\n        }\n      )\n      .json<github.SecretScanningUpdateAlertResponse>()\n  }\n\n  /**\n * Lists all locations for a given secret scanning alert for an eligible repository.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_list_locations_for_alert',\n    description: `Lists all locations for a given secret scanning alert for an eligible repository.\n\nThe authenticated user must be an administrator for the repository or for the organization that owns the repository to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.SecretScanningListLocationsForAlertParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningListLocationsForAlert(\n    params: github.SecretScanningListLocationsForAlertParams\n  ): Promise<github.SecretScanningListLocationsForAlertResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/secret-scanning/alerts/${params.alert_number}/locations`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n        }\n      )\n      .json<github.SecretScanningListLocationsForAlertResponse>()\n  }\n\n  /**\n * Creates a bypass for a previously push protected secret.\n\nThe authenticated user must be the original author of the committed secret.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_create_push_protection_bypass',\n    description: `Creates a bypass for a previously push protected secret.\n\nThe authenticated user must be the original author of the committed secret.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.SecretScanningCreatePushProtectionBypassParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningCreatePushProtectionBypass(\n    params: github.SecretScanningCreatePushProtectionBypassParams\n  ): Promise<github.SecretScanningCreatePushProtectionBypassResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/secret-scanning/push-protection-bypasses`,\n        {\n          json: pick(params, 'reason', 'placeholder_id')\n        }\n      )\n      .json<github.SecretScanningCreatePushProtectionBypassResponse>()\n  }\n\n  /**\n * Lists the latest default incremental and backfill scans by type for a repository. Scans from Copilot Secret Scanning are not included.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `security_events` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the `public_repo` scope instead.\n */\n  @aiFunction({\n    name: 'github_secret_scanning_get_scan_history',\n    description: `Lists the latest default incremental and backfill scans by type for a repository. Scans from Copilot Secret Scanning are not included.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`security_events\\` scope to use this endpoint. If this endpoint is only used with public repositories, the token can use the \\`public_repo\\` scope instead.`,\n    inputSchema: github.SecretScanningGetScanHistoryParamsSchema,\n    tags: ['secret-scanning']\n  })\n  async secretScanningGetScanHistory(\n    params: github.SecretScanningGetScanHistoryParams\n  ): Promise<github.SecretScanningGetScanHistoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/secret-scanning/scan-history`,\n        {}\n      )\n      .json<github.SecretScanningGetScanHistoryResponse>()\n  }\n\n  /**\n * Lists security advisories in a repository.\n\nThe authenticated user can access unpublished security advisories from a repository if they are a security manager or administrator of that repository, or if they are a collaborator on any security advisory.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repository_advisories:read` scope to to get a published security advisory in a private repository, or any unpublished security advisory that the authenticated user has access to.\n */\n  @aiFunction({\n    name: 'github_security_advisories_list_repository_advisories',\n    description: `Lists security advisories in a repository.\n\nThe authenticated user can access unpublished security advisories from a repository if they are a security manager or administrator of that repository, or if they are a collaborator on any security advisory.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repository_advisories:read\\` scope to to get a published security advisory in a private repository, or any unpublished security advisory that the authenticated user has access to.`,\n    inputSchema: github.SecurityAdvisoriesListRepositoryAdvisoriesParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesListRepositoryAdvisories(\n    params: github.SecurityAdvisoriesListRepositoryAdvisoriesParams\n  ): Promise<github.SecurityAdvisoriesListRepositoryAdvisoriesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/security-advisories`, {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'direction',\n            'sort',\n            'before',\n            'after',\n            'per_page',\n            'state'\n          )\n        )\n      })\n      .json<github.SecurityAdvisoriesListRepositoryAdvisoriesResponse>()\n  }\n\n  /**\n * Creates a new repository security advisory.\n\nIn order to create a draft repository security advisory, the authenticated user must be a security manager or administrator of that repository.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repository_advisories:write` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_security_advisories_create_repository_advisory',\n    description: `Creates a new repository security advisory.\n\nIn order to create a draft repository security advisory, the authenticated user must be a security manager or administrator of that repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repository_advisories:write\\` scope to use this endpoint.`,\n    inputSchema: github.SecurityAdvisoriesCreateRepositoryAdvisoryParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesCreateRepositoryAdvisory(\n    params: github.SecurityAdvisoriesCreateRepositoryAdvisoryParams\n  ): Promise<github.SecurityAdvisoriesCreateRepositoryAdvisoryResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/security-advisories`, {\n        json: pick(\n          params,\n          'summary',\n          'description',\n          'cve_id',\n          'vulnerabilities',\n          'cwe_ids',\n          'credits',\n          'severity',\n          'cvss_vector_string',\n          'start_private_fork'\n        )\n      })\n      .json<github.SecurityAdvisoriesCreateRepositoryAdvisoryResponse>()\n  }\n\n  /**\n * Report a security vulnerability to the maintainers of the repository.\nSee \"[Privately reporting a security vulnerability](https://docs.github.com/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability)\" for more information about private vulnerability reporting.\n */\n  @aiFunction({\n    name: 'github_security_advisories_create_private_vulnerability_report',\n    description: `Report a security vulnerability to the maintainers of the repository.\nSee \"[Privately reporting a security vulnerability](https://docs.github.com/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability)\" for more information about private vulnerability reporting.`,\n    inputSchema:\n      github.SecurityAdvisoriesCreatePrivateVulnerabilityReportParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesCreatePrivateVulnerabilityReport(\n    params: github.SecurityAdvisoriesCreatePrivateVulnerabilityReportParams\n  ): Promise<github.SecurityAdvisoriesCreatePrivateVulnerabilityReportResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/security-advisories/reports`,\n        {\n          json: pick(\n            params,\n            'summary',\n            'description',\n            'vulnerabilities',\n            'cwe_ids',\n            'severity',\n            'cvss_vector_string',\n            'start_private_fork'\n          )\n        }\n      )\n      .json<github.SecurityAdvisoriesCreatePrivateVulnerabilityReportResponse>()\n  }\n\n  /**\n * Get a repository security advisory using its GitHub Security Advisory (GHSA) identifier.\n\nAnyone can access any published security advisory on a public repository.\n\nThe authenticated user can access an unpublished security advisory from a repository if they are a security manager or administrator of that repository, or if they are a\ncollaborator on the security advisory.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repository_advisories:read` scope to to get a published security advisory in a private repository, or any unpublished security advisory that the authenticated user has access to.\n */\n  @aiFunction({\n    name: 'github_security_advisories_get_repository_advisory',\n    description: `Get a repository security advisory using its GitHub Security Advisory (GHSA) identifier.\n\nAnyone can access any published security advisory on a public repository.\n\nThe authenticated user can access an unpublished security advisory from a repository if they are a security manager or administrator of that repository, or if they are a\ncollaborator on the security advisory.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repository_advisories:read\\` scope to to get a published security advisory in a private repository, or any unpublished security advisory that the authenticated user has access to.`,\n    inputSchema: github.SecurityAdvisoriesGetRepositoryAdvisoryParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesGetRepositoryAdvisory(\n    params: github.SecurityAdvisoriesGetRepositoryAdvisoryParams\n  ): Promise<github.SecurityAdvisoriesGetRepositoryAdvisoryResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/security-advisories/${params.ghsa_id}`,\n        {}\n      )\n      .json<github.SecurityAdvisoriesGetRepositoryAdvisoryResponse>()\n  }\n\n  /**\n * Update a repository security advisory using its GitHub Security Advisory (GHSA) identifier.\n\nIn order to update any security advisory, the authenticated user must be a security manager or administrator of that repository,\nor a collaborator on the repository security advisory.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repository_advisories:write` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_security_advisories_update_repository_advisory',\n    description: `Update a repository security advisory using its GitHub Security Advisory (GHSA) identifier.\n\nIn order to update any security advisory, the authenticated user must be a security manager or administrator of that repository,\nor a collaborator on the repository security advisory.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repository_advisories:write\\` scope to use this endpoint.`,\n    inputSchema: github.SecurityAdvisoriesUpdateRepositoryAdvisoryParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesUpdateRepositoryAdvisory(\n    params: github.SecurityAdvisoriesUpdateRepositoryAdvisoryParams\n  ): Promise<github.SecurityAdvisoriesUpdateRepositoryAdvisoryResponse> {\n    return this.ky\n      .patch(\n        `/repos/${params.owner}/${params.repo}/security-advisories/${params.ghsa_id}`,\n        {\n          json: pick(\n            params,\n            'summary',\n            'description',\n            'cve_id',\n            'vulnerabilities',\n            'cwe_ids',\n            'credits',\n            'severity',\n            'cvss_vector_string',\n            'state',\n            'collaborating_users',\n            'collaborating_teams'\n          )\n        }\n      )\n      .json<github.SecurityAdvisoriesUpdateRepositoryAdvisoryResponse>()\n  }\n\n  /**\n * If you want a CVE identification number for the security vulnerability in your project, and don't already have one, you can request a CVE identification number from GitHub. For more information see \"[Requesting a CVE identification number](https://docs.github.com/code-security/security-advisories/repository-security-advisories/publishing-a-repository-security-advisory#requesting-a-cve-identification-number-optional).\"\n\nYou may request a CVE for public repositories, but cannot do so for private repositories.\n\nIn order to request a CVE for a repository security advisory, the authenticated user must be a security manager or administrator of that repository.\n\nOAuth app tokens and personal access tokens (classic) need the `repo` or `repository_advisories:write` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_security_advisories_create_repository_advisory_cve_request',\n    description: `If you want a CVE identification number for the security vulnerability in your project, and don't already have one, you can request a CVE identification number from GitHub. For more information see \"[Requesting a CVE identification number](https://docs.github.com/code-security/security-advisories/repository-security-advisories/publishing-a-repository-security-advisory#requesting-a-cve-identification-number-optional).\"\n\nYou may request a CVE for public repositories, but cannot do so for private repositories.\n\nIn order to request a CVE for a repository security advisory, the authenticated user must be a security manager or administrator of that repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` or \\`repository_advisories:write\\` scope to use this endpoint.`,\n    inputSchema:\n      github.SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesCreateRepositoryAdvisoryCveRequest(\n    params: github.SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestParams\n  ): Promise<github.SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/security-advisories/${params.ghsa_id}/cve`,\n        {}\n      )\n      .json<github.SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestResponse>()\n  }\n\n  /**\n * Create a temporary private fork to collaborate on fixing a security vulnerability in your repository.\n\n> [!NOTE]\n> Forking a repository happens asynchronously. You may have to wait up to 5 minutes before you can access the fork.\n */\n  @aiFunction({\n    name: 'github_security_advisories_create_fork',\n    description: `Create a temporary private fork to collaborate on fixing a security vulnerability in your repository.\n\n> [!NOTE]\n> Forking a repository happens asynchronously. You may have to wait up to 5 minutes before you can access the fork.`,\n    inputSchema: github.SecurityAdvisoriesCreateForkParamsSchema,\n    tags: ['security-advisories']\n  })\n  async securityAdvisoriesCreateFork(\n    params: github.SecurityAdvisoriesCreateForkParams\n  ): Promise<github.SecurityAdvisoriesCreateForkResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/security-advisories/${params.ghsa_id}/forks`,\n        {}\n      )\n      .json<github.SecurityAdvisoriesCreateForkResponse>()\n  }\n\n  /**\n * Lists the people that have starred the repository.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.star+json`**: Includes a timestamp of when the star was created.\n */\n  @aiFunction({\n    name: 'github_activity_list_stargazers_for_repo',\n    description: `Lists the people that have starred the repository.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.star+json\\`**: Includes a timestamp of when the star was created.`,\n    inputSchema: github.ActivityListStargazersForRepoParamsSchema,\n    tags: ['activity']\n  })\n  async activityListStargazersForRepo(\n    params: github.ActivityListStargazersForRepoParams\n  ): Promise<github.ActivityListStargazersForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/stargazers`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListStargazersForRepoResponse>()\n  }\n\n  /**\n * Returns a weekly aggregate of the number of additions and deletions pushed to a repository.\n\n> [!NOTE]\n> This endpoint can only be used for repositories with fewer than 10,000 commits. If the repository contains 10,000 or more commits, a 422 status code will be returned.\n */\n  @aiFunction({\n    name: 'github_repos_get_code_frequency_stats',\n    description: `Returns a weekly aggregate of the number of additions and deletions pushed to a repository.\n\n> [!NOTE]\n> This endpoint can only be used for repositories with fewer than 10,000 commits. If the repository contains 10,000 or more commits, a 422 status code will be returned.`,\n    inputSchema: github.ReposGetCodeFrequencyStatsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCodeFrequencyStats(\n    params: github.ReposGetCodeFrequencyStatsParams\n  ): Promise<github.ReposGetCodeFrequencyStatsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/stats/code_frequency`,\n        {}\n      )\n      .json<github.ReposGetCodeFrequencyStatsResponse>()\n  }\n\n  /**\n   * Returns the last year of commit activity grouped by week. The `days` array is a group of commits per day, starting on `Sunday`.\n   */\n  @aiFunction({\n    name: 'github_repos_get_commit_activity_stats',\n    description: `Returns the last year of commit activity grouped by week. The \\`days\\` array is a group of commits per day, starting on \\`Sunday\\`.`,\n    inputSchema: github.ReposGetCommitActivityStatsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetCommitActivityStats(\n    params: github.ReposGetCommitActivityStatsParams\n  ): Promise<github.ReposGetCommitActivityStatsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/stats/commit_activity`,\n        {}\n      )\n      .json<github.ReposGetCommitActivityStatsResponse>()\n  }\n\n  /**\n *\nReturns the `total` number of commits authored by the contributor. In addition, the response includes a Weekly Hash (`weeks` array) with the following information:\n\n*   `w` - Start of the week, given as a [Unix timestamp](https://en.wikipedia.org/wiki/Unix_time).\n*   `a` - Number of additions\n*   `d` - Number of deletions\n*   `c` - Number of commits\n\n> [!NOTE]\n> This endpoint will return `0` values for all addition and deletion counts in repositories with 10,000 or more commits.\n */\n  @aiFunction({\n    name: 'github_repos_get_contributors_stats',\n    description: `\nReturns the \\`total\\` number of commits authored by the contributor. In addition, the response includes a Weekly Hash (\\`weeks\\` array) with the following information:\n\n*   \\`w\\` - Start of the week, given as a [Unix timestamp](https://en.wikipedia.org/wiki/Unix_time).\n*   \\`a\\` - Number of additions\n*   \\`d\\` - Number of deletions\n*   \\`c\\` - Number of commits\n\n> [!NOTE]\n> This endpoint will return \\`0\\` values for all addition and deletion counts in repositories with 10,000 or more commits.`,\n    inputSchema: github.ReposGetContributorsStatsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetContributorsStats(\n    params: github.ReposGetContributorsStatsParams\n  ): Promise<github.ReposGetContributorsStatsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/stats/contributors`, {})\n      .json<github.ReposGetContributorsStatsResponse>()\n  }\n\n  /**\n * Returns the total commit counts for the `owner` and total commit counts in `all`. `all` is everyone combined, including the `owner` in the last 52 weeks. If you'd like to get the commit counts for non-owners, you can subtract `owner` from `all`.\n\nThe array order is oldest week (index 0) to most recent week.\n\nThe most recent week is seven days ago at UTC midnight to today at UTC midnight.\n */\n  @aiFunction({\n    name: 'github_repos_get_participation_stats',\n    description: `Returns the total commit counts for the \\`owner\\` and total commit counts in \\`all\\`. \\`all\\` is everyone combined, including the \\`owner\\` in the last 52 weeks. If you'd like to get the commit counts for non-owners, you can subtract \\`owner\\` from \\`all\\`.\n\nThe array order is oldest week (index 0) to most recent week.\n\nThe most recent week is seven days ago at UTC midnight to today at UTC midnight.`,\n    inputSchema: github.ReposGetParticipationStatsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetParticipationStats(\n    params: github.ReposGetParticipationStatsParams\n  ): Promise<github.ReposGetParticipationStatsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/stats/participation`,\n        {}\n      )\n      .json<github.ReposGetParticipationStatsResponse>()\n  }\n\n  /**\n * Each array contains the day number, hour number, and number of commits:\n\n*   `0-6`: Sunday - Saturday\n*   `0-23`: Hour of day\n*   Number of commits\n\nFor example, `[2, 14, 25]` indicates that there were 25 total commits, during the 2:00pm hour on Tuesdays. All times are based on the time zone of individual commits.\n */\n  @aiFunction({\n    name: 'github_repos_get_punch_card_stats',\n    description: `Each array contains the day number, hour number, and number of commits:\n\n*   \\`0-6\\`: Sunday - Saturday\n*   \\`0-23\\`: Hour of day\n*   Number of commits\n\nFor example, \\`[2, 14, 25]\\` indicates that there were 25 total commits, during the 2:00pm hour on Tuesdays. All times are based on the time zone of individual commits.`,\n    inputSchema: github.ReposGetPunchCardStatsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetPunchCardStats(\n    params: github.ReposGetPunchCardStatsParams\n  ): Promise<github.ReposGetPunchCardStatsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/stats/punch_card`, {})\n      .json<github.ReposGetPunchCardStatsResponse>()\n  }\n\n  /**\n * Users with push access in a repository can create commit statuses for a given SHA.\n\nNote: there is a limit of 1000 statuses per `sha` and `context` within a repository. Attempts to create more than 1000 statuses will result in a validation error.\n */\n  @aiFunction({\n    name: 'github_repos_create_commit_status',\n    description: `Users with push access in a repository can create commit statuses for a given SHA.\n\nNote: there is a limit of 1000 statuses per \\`sha\\` and \\`context\\` within a repository. Attempts to create more than 1000 statuses will result in a validation error.`,\n    inputSchema: github.ReposCreateCommitStatusParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateCommitStatus(\n    params: github.ReposCreateCommitStatusParams\n  ): Promise<github.ReposCreateCommitStatusResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.owner}/${params.repo}/statuses/${params.sha}`,\n        {\n          json: pick(params, 'state', 'target_url', 'description', 'context')\n        }\n      )\n      .json<github.ReposCreateCommitStatusResponse>()\n  }\n\n  /**\n   * Lists the people watching the specified repository.\n   */\n  @aiFunction({\n    name: 'github_activity_list_watchers_for_repo',\n    description: `Lists the people watching the specified repository.`,\n    inputSchema: github.ActivityListWatchersForRepoParamsSchema,\n    tags: ['activity']\n  })\n  async activityListWatchersForRepo(\n    params: github.ActivityListWatchersForRepoParams\n  ): Promise<github.ActivityListWatchersForRepoResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/subscribers`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListWatchersForRepoResponse>()\n  }\n\n  /**\n   * Gets information about whether the authenticated user is subscribed to the repository.\n   */\n  @aiFunction({\n    name: 'github_activity_get_repo_subscription',\n    description: `Gets information about whether the authenticated user is subscribed to the repository.`,\n    inputSchema: github.ActivityGetRepoSubscriptionParamsSchema,\n    tags: ['activity']\n  })\n  async activityGetRepoSubscription(\n    params: github.ActivityGetRepoSubscriptionParams\n  ): Promise<github.ActivityGetRepoSubscriptionResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/subscription`, {})\n      .json<github.ActivityGetRepoSubscriptionResponse>()\n  }\n\n  /**\n   * If you would like to watch a repository, set `subscribed` to `true`. If you would like to ignore notifications made within a repository, set `ignored` to `true`. If you would like to stop watching a repository, [delete the repository's subscription](https://docs.github.com/rest/activity/watching#delete-a-repository-subscription) completely.\n   */\n  @aiFunction({\n    name: 'github_activity_set_repo_subscription',\n    description: `If you would like to watch a repository, set \\`subscribed\\` to \\`true\\`. If you would like to ignore notifications made within a repository, set \\`ignored\\` to \\`true\\`. If you would like to stop watching a repository, [delete the repository's subscription](https://docs.github.com/rest/activity/watching#delete-a-repository-subscription) completely.`,\n    inputSchema: github.ActivitySetRepoSubscriptionParamsSchema,\n    tags: ['activity']\n  })\n  async activitySetRepoSubscription(\n    params: github.ActivitySetRepoSubscriptionParams\n  ): Promise<github.ActivitySetRepoSubscriptionResponse> {\n    return this.ky\n      .put(`/repos/${params.owner}/${params.repo}/subscription`, {\n        json: pick(params, 'subscribed', 'ignored')\n      })\n      .json<github.ActivitySetRepoSubscriptionResponse>()\n  }\n\n  /**\n   * This endpoint should only be used to stop watching a repository. To control whether or not you wish to receive notifications from a repository, [set the repository's subscription manually](https://docs.github.com/rest/activity/watching#set-a-repository-subscription).\n   */\n  @aiFunction({\n    name: 'github_activity_delete_repo_subscription',\n    description: `This endpoint should only be used to stop watching a repository. To control whether or not you wish to receive notifications from a repository, [set the repository's subscription manually](https://docs.github.com/rest/activity/watching#set-a-repository-subscription).`,\n    inputSchema: github.ActivityDeleteRepoSubscriptionParamsSchema,\n    tags: ['activity']\n  })\n  async activityDeleteRepoSubscription(\n    params: github.ActivityDeleteRepoSubscriptionParams\n  ): Promise<github.ActivityDeleteRepoSubscriptionResponse> {\n    return this.ky\n      .delete(`/repos/${params.owner}/${params.repo}/subscription`, {})\n      .json<github.ActivityDeleteRepoSubscriptionResponse>()\n  }\n\n  /**\n   * List repository tags.\n   */\n  @aiFunction({\n    name: 'github_repos_list_tags',\n    description: `List repository tags.`,\n    inputSchema: github.ReposListTagsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListTags(\n    params: github.ReposListTagsParams\n  ): Promise<github.ReposListTagsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/tags`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListTagsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed after August 30, 2024. Use the \"[Repository Rulesets](https://docs.github.com/rest/repos/rules#get-all-repository-rulesets)\" endpoint instead.\n\nThis returns the tag protection states of a repository.\n\nThis information is only available to repository administrators.\n */\n  @aiFunction({\n    name: 'github_repos_list_tag_protection',\n    description: `> [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed after August 30, 2024. Use the \"[Repository Rulesets](https://docs.github.com/rest/repos/rules#get-all-repository-rulesets)\" endpoint instead.\n\nThis returns the tag protection states of a repository.\n\nThis information is only available to repository administrators.`,\n    inputSchema: github.ReposListTagProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposListTagProtection(\n    params: github.ReposListTagProtectionParams\n  ): Promise<github.ReposListTagProtectionResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/tags/protection`, {})\n      .json<github.ReposListTagProtectionResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed after August 30, 2024. Use the \"[Repository Rulesets](https://docs.github.com/rest/repos/rules#create-a-repository-ruleset)\" endpoint instead.\n\nThis creates a tag protection state for a repository.\nThis endpoint is only available to repository administrators.\n */\n  @aiFunction({\n    name: 'github_repos_create_tag_protection',\n    description: `> [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed after August 30, 2024. Use the \"[Repository Rulesets](https://docs.github.com/rest/repos/rules#create-a-repository-ruleset)\" endpoint instead.\n\nThis creates a tag protection state for a repository.\nThis endpoint is only available to repository administrators.`,\n    inputSchema: github.ReposCreateTagProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateTagProtection(\n    params: github.ReposCreateTagProtectionParams\n  ): Promise<github.ReposCreateTagProtectionResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/tags/protection`, {\n        json: pick(params, 'pattern')\n      })\n      .json<github.ReposCreateTagProtectionResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed after August 30, 2024. Use the \"[Repository Rulesets](https://docs.github.com/rest/repos/rules#delete-a-repository-ruleset)\" endpoint instead.\n\nThis deletes a tag protection state for a repository.\nThis endpoint is only available to repository administrators.\n */\n  @aiFunction({\n    name: 'github_repos_delete_tag_protection',\n    description: `> [!WARNING]\n> **Closing down notice:** This operation is closing down and will be removed after August 30, 2024. Use the \"[Repository Rulesets](https://docs.github.com/rest/repos/rules#delete-a-repository-ruleset)\" endpoint instead.\n\nThis deletes a tag protection state for a repository.\nThis endpoint is only available to repository administrators.`,\n    inputSchema: github.ReposDeleteTagProtectionParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeleteTagProtection(\n    params: github.ReposDeleteTagProtectionParams\n  ): Promise<github.ReposDeleteTagProtectionResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/tags/protection/${params.tag_protection_id}`,\n        {}\n      )\n      .json<github.ReposDeleteTagProtectionResponse>()\n  }\n\n  /**\n * Gets a redirect URL to download a tar archive for a repository. If you omit `:ref`, the repository’s default branch (usually\n`main`) will be used. Please make sure your HTTP framework is configured to follow redirects or you will need to use\nthe `Location` header to make a second `GET` request.\n\n> [!NOTE]\n> For private repositories, these links are temporary and expire after five minutes.\n */\n  @aiFunction({\n    name: 'github_repos_download_tarball_archive',\n    description: `Gets a redirect URL to download a tar archive for a repository. If you omit \\`:ref\\`, the repository’s default branch (usually\n\\`main\\`) will be used. Please make sure your HTTP framework is configured to follow redirects or you will need to use\nthe \\`Location\\` header to make a second \\`GET\\` request.\n\n> [!NOTE]\n> For private repositories, these links are temporary and expire after five minutes.`,\n    inputSchema: github.ReposDownloadTarballArchiveParamsSchema,\n    tags: ['repos']\n  })\n  async reposDownloadTarballArchive(\n    params: github.ReposDownloadTarballArchiveParams\n  ): Promise<github.ReposDownloadTarballArchiveResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/tarball/${params.ref}`,\n        {}\n      )\n      .json<github.ReposDownloadTarballArchiveResponse>()\n  }\n\n  /**\n * Lists the teams that have access to the specified repository and that are also visible to the authenticated user.\n\nFor a public repository, a team is listed only if that team added the public repository explicitly.\n\nOAuth app tokens and personal access tokens (classic) need the `public_repo` or `repo` scope to use this endpoint with a public repository, and `repo` scope to use this endpoint with a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_list_teams',\n    description: `Lists the teams that have access to the specified repository and that are also visible to the authenticated user.\n\nFor a public repository, a team is listed only if that team added the public repository explicitly.\n\nOAuth app tokens and personal access tokens (classic) need the \\`public_repo\\` or \\`repo\\` scope to use this endpoint with a public repository, and \\`repo\\` scope to use this endpoint with a private repository.`,\n    inputSchema: github.ReposListTeamsParamsSchema,\n    tags: ['repos']\n  })\n  async reposListTeams(\n    params: github.ReposListTeamsParams\n  ): Promise<github.ReposListTeamsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/teams`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListTeamsResponse>()\n  }\n\n  /**\n   * Get all repository topics.\n   */\n  @aiFunction({\n    name: 'github_repos_get_all_topics',\n    description: `Get all repository topics.`,\n    inputSchema: github.ReposGetAllTopicsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetAllTopics(\n    params: github.ReposGetAllTopicsParams\n  ): Promise<github.ReposGetAllTopicsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/topics`, {\n        searchParams: sanitizeSearchParams(pick(params, 'page', 'per_page'))\n      })\n      .json<github.ReposGetAllTopicsResponse>()\n  }\n\n  /**\n   * Replace all repository topics.\n   */\n  @aiFunction({\n    name: 'github_repos_replace_all_topics',\n    description: `Replace all repository topics.`,\n    inputSchema: github.ReposReplaceAllTopicsParamsSchema,\n    tags: ['repos']\n  })\n  async reposReplaceAllTopics(\n    params: github.ReposReplaceAllTopicsParams\n  ): Promise<github.ReposReplaceAllTopicsResponse> {\n    return this.ky\n      .put(`/repos/${params.owner}/${params.repo}/topics`, {\n        json: pick(params, 'names')\n      })\n      .json<github.ReposReplaceAllTopicsResponse>()\n  }\n\n  /**\n   * Get the total number of clones and breakdown per day or week for the last 14 days. Timestamps are aligned to UTC midnight of the beginning of the day or week. Week begins on Monday.\n   */\n  @aiFunction({\n    name: 'github_repos_get_clones',\n    description: `Get the total number of clones and breakdown per day or week for the last 14 days. Timestamps are aligned to UTC midnight of the beginning of the day or week. Week begins on Monday.`,\n    inputSchema: github.ReposGetClonesParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetClones(\n    params: github.ReposGetClonesParams\n  ): Promise<github.ReposGetClonesResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/traffic/clones`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per'))\n      })\n      .json<github.ReposGetClonesResponse>()\n  }\n\n  /**\n   * Get the top 10 popular contents over the last 14 days.\n   */\n  @aiFunction({\n    name: 'github_repos_get_top_paths',\n    description: `Get the top 10 popular contents over the last 14 days.`,\n    inputSchema: github.ReposGetTopPathsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetTopPaths(\n    params: github.ReposGetTopPathsParams\n  ): Promise<github.ReposGetTopPathsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/traffic/popular/paths`,\n        {}\n      )\n      .json<github.ReposGetTopPathsResponse>()\n  }\n\n  /**\n   * Get the top 10 referrers over the last 14 days.\n   */\n  @aiFunction({\n    name: 'github_repos_get_top_referrers',\n    description: `Get the top 10 referrers over the last 14 days.`,\n    inputSchema: github.ReposGetTopReferrersParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetTopReferrers(\n    params: github.ReposGetTopReferrersParams\n  ): Promise<github.ReposGetTopReferrersResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/traffic/popular/referrers`,\n        {}\n      )\n      .json<github.ReposGetTopReferrersResponse>()\n  }\n\n  /**\n   * Get the total number of views and breakdown per day or week for the last 14 days. Timestamps are aligned to UTC midnight of the beginning of the day or week. Week begins on Monday.\n   */\n  @aiFunction({\n    name: 'github_repos_get_views',\n    description: `Get the total number of views and breakdown per day or week for the last 14 days. Timestamps are aligned to UTC midnight of the beginning of the day or week. Week begins on Monday.`,\n    inputSchema: github.ReposGetViewsParamsSchema,\n    tags: ['repos']\n  })\n  async reposGetViews(\n    params: github.ReposGetViewsParams\n  ): Promise<github.ReposGetViewsResponse> {\n    return this.ky\n      .get(`/repos/${params.owner}/${params.repo}/traffic/views`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per'))\n      })\n      .json<github.ReposGetViewsResponse>()\n  }\n\n  /**\n   * A transfer request will need to be accepted by the new owner when transferring a personal repository to another user. The response will contain the original `owner`, and the transfer will continue asynchronously. For more details on the requirements to transfer personal and organization-owned repositories, see [about repository transfers](https://docs.github.com/articles/about-repository-transfers/).\n   */\n  @aiFunction({\n    name: 'github_repos_transfer',\n    description: `A transfer request will need to be accepted by the new owner when transferring a personal repository to another user. The response will contain the original \\`owner\\`, and the transfer will continue asynchronously. For more details on the requirements to transfer personal and organization-owned repositories, see [about repository transfers](https://docs.github.com/articles/about-repository-transfers/).`,\n    inputSchema: github.ReposTransferParamsSchema,\n    tags: ['repos']\n  })\n  async reposTransfer(\n    params: github.ReposTransferParams\n  ): Promise<github.ReposTransferResponse> {\n    return this.ky\n      .post(`/repos/${params.owner}/${params.repo}/transfer`, {\n        json: pick(params, 'new_owner', 'new_name', 'team_ids')\n      })\n      .json<github.ReposTransferResponse>()\n  }\n\n  /**\n   * Shows whether dependency alerts are enabled or disabled for a repository. The authenticated user must have admin read access to the repository. For more information, see \"[About security alerts for vulnerable dependencies](https://docs.github.com/articles/about-security-alerts-for-vulnerable-dependencies)\".\n   */\n  @aiFunction({\n    name: 'github_repos_check_vulnerability_alerts',\n    description: `Shows whether dependency alerts are enabled or disabled for a repository. The authenticated user must have admin read access to the repository. For more information, see \"[About security alerts for vulnerable dependencies](https://docs.github.com/articles/about-security-alerts-for-vulnerable-dependencies)\".`,\n    inputSchema: github.ReposCheckVulnerabilityAlertsParamsSchema,\n    tags: ['repos']\n  })\n  async reposCheckVulnerabilityAlerts(\n    params: github.ReposCheckVulnerabilityAlertsParams\n  ): Promise<github.ReposCheckVulnerabilityAlertsResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/vulnerability-alerts`,\n        {}\n      )\n      .json<github.ReposCheckVulnerabilityAlertsResponse>()\n  }\n\n  /**\n   * Enables dependency alerts and the dependency graph for a repository. The authenticated user must have admin access to the repository. For more information, see \"[About security alerts for vulnerable dependencies](https://docs.github.com/articles/about-security-alerts-for-vulnerable-dependencies)\".\n   */\n  @aiFunction({\n    name: 'github_repos_enable_vulnerability_alerts',\n    description: `Enables dependency alerts and the dependency graph for a repository. The authenticated user must have admin access to the repository. For more information, see \"[About security alerts for vulnerable dependencies](https://docs.github.com/articles/about-security-alerts-for-vulnerable-dependencies)\".`,\n    inputSchema: github.ReposEnableVulnerabilityAlertsParamsSchema,\n    tags: ['repos']\n  })\n  async reposEnableVulnerabilityAlerts(\n    params: github.ReposEnableVulnerabilityAlertsParams\n  ): Promise<github.ReposEnableVulnerabilityAlertsResponse> {\n    return this.ky\n      .put(\n        `/repos/${params.owner}/${params.repo}/vulnerability-alerts`,\n        {}\n      )\n      .json<github.ReposEnableVulnerabilityAlertsResponse>()\n  }\n\n  /**\n * Disables dependency alerts and the dependency graph for a repository.\nThe authenticated user must have admin access to the repository. For more information,\nsee \"[About security alerts for vulnerable dependencies](https://docs.github.com/articles/about-security-alerts-for-vulnerable-dependencies)\".\n */\n  @aiFunction({\n    name: 'github_repos_disable_vulnerability_alerts',\n    description: `Disables dependency alerts and the dependency graph for a repository.\nThe authenticated user must have admin access to the repository. For more information,\nsee \"[About security alerts for vulnerable dependencies](https://docs.github.com/articles/about-security-alerts-for-vulnerable-dependencies)\".`,\n    inputSchema: github.ReposDisableVulnerabilityAlertsParamsSchema,\n    tags: ['repos']\n  })\n  async reposDisableVulnerabilityAlerts(\n    params: github.ReposDisableVulnerabilityAlertsParams\n  ): Promise<github.ReposDisableVulnerabilityAlertsResponse> {\n    return this.ky\n      .delete(\n        `/repos/${params.owner}/${params.repo}/vulnerability-alerts`,\n        {}\n      )\n      .json<github.ReposDisableVulnerabilityAlertsResponse>()\n  }\n\n  /**\n * Gets a redirect URL to download a zip archive for a repository. If you omit `:ref`, the repository’s default branch (usually\n`main`) will be used. Please make sure your HTTP framework is configured to follow redirects or you will need to use\nthe `Location` header to make a second `GET` request.\n\n> [!NOTE]\n> For private repositories, these links are temporary and expire after five minutes. If the repository is empty, you will receive a 404 when you follow the redirect.\n */\n  @aiFunction({\n    name: 'github_repos_download_zipball_archive',\n    description: `Gets a redirect URL to download a zip archive for a repository. If you omit \\`:ref\\`, the repository’s default branch (usually\n\\`main\\`) will be used. Please make sure your HTTP framework is configured to follow redirects or you will need to use\nthe \\`Location\\` header to make a second \\`GET\\` request.\n\n> [!NOTE]\n> For private repositories, these links are temporary and expire after five minutes. If the repository is empty, you will receive a 404 when you follow the redirect.`,\n    inputSchema: github.ReposDownloadZipballArchiveParamsSchema,\n    tags: ['repos']\n  })\n  async reposDownloadZipballArchive(\n    params: github.ReposDownloadZipballArchiveParams\n  ): Promise<github.ReposDownloadZipballArchiveResponse> {\n    return this.ky\n      .get(\n        `/repos/${params.owner}/${params.repo}/zipball/${params.ref}`,\n        {}\n      )\n      .json<github.ReposDownloadZipballArchiveResponse>()\n  }\n\n  /**\n * Creates a new repository using a repository template. Use the `template_owner` and `template_repo` route parameters to specify the repository to use as the template. If the repository is not public, the authenticated user must own or be a member of an organization that owns the repository. To check if a repository is available to use as a template, get the repository's information using the [Get a repository](https://docs.github.com/rest/repos/repos#get-a-repository) endpoint and check that the `is_template` key is `true`.\n\nOAuth app tokens and personal access tokens (classic) need the `public_repo` or `repo` scope to create a public repository, and `repo` scope to create a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_create_using_template',\n    description: `Creates a new repository using a repository template. Use the \\`template_owner\\` and \\`template_repo\\` route parameters to specify the repository to use as the template. If the repository is not public, the authenticated user must own or be a member of an organization that owns the repository. To check if a repository is available to use as a template, get the repository's information using the [Get a repository](https://docs.github.com/rest/repos/repos#get-a-repository) endpoint and check that the \\`is_template\\` key is \\`true\\`.\n\nOAuth app tokens and personal access tokens (classic) need the \\`public_repo\\` or \\`repo\\` scope to create a public repository, and \\`repo\\` scope to create a private repository.`,\n    inputSchema: github.ReposCreateUsingTemplateParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateUsingTemplate(\n    params: github.ReposCreateUsingTemplateParams\n  ): Promise<github.ReposCreateUsingTemplateResponse> {\n    return this.ky\n      .post(\n        `/repos/${params.template_owner}/${params.template_repo}/generate`,\n        {\n          json: pick(\n            params,\n            'owner',\n            'name',\n            'description',\n            'include_all_branches',\n            'private'\n          )\n        }\n      )\n      .json<github.ReposCreateUsingTemplateResponse>()\n  }\n\n  /**\n * Lists all public repositories in the order that they were created.\n\nNote:\n- For GitHub Enterprise Server, this endpoint will only list repositories available to all users on the enterprise.\n- Pagination is powered exclusively by the `since` parameter. Use the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers) to get the URL for the next page of repositories.\n */\n  @aiFunction({\n    name: 'github_repos_list_public',\n    description: `Lists all public repositories in the order that they were created.\n\nNote:\n- For GitHub Enterprise Server, this endpoint will only list repositories available to all users on the enterprise.\n- Pagination is powered exclusively by the \\`since\\` parameter. Use the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers) to get the URL for the next page of repositories.`,\n    inputSchema: github.ReposListPublicParamsSchema,\n    tags: ['repos']\n  })\n  async reposListPublic(\n    params: github.ReposListPublicParams\n  ): Promise<github.ReposListPublicResponse> {\n    return this.ky\n      .get('/repositories', {\n        searchParams: sanitizeSearchParams(params)\n      })\n      .json<github.ReposListPublicResponse>()\n  }\n\n  /**\n * Searches for query terms inside of a file. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for code, you can get text match metadata for the file **content** and file **path** fields when you pass the `text-match` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to find the definition of the `addClass` function inside [jQuery](https://github.com/jquery/jquery) repository, your query would look something like this:\n\n`q=addClass+in:file+language:js+repo:jquery/jquery`\n\nThis query searches for the keyword `addClass` within a file's contents. The query limits the search to files where the language is JavaScript in the `jquery/jquery` repository.\n\nConsiderations for code search:\n\nDue to the complexity of searching code, there are a few restrictions on how searches are performed:\n\n*   Only the _default branch_ is considered. In most cases, this will be the `master` branch.\n*   Only files smaller than 384 KB are searchable.\n*   You must always include at least one search term when searching source code. For example, searching for [`language:go`](https://github.com/search?utf8=%E2%9C%93&q=language%3Ago&type=Code) is not valid, while [`amazing\nlanguage:go`](https://github.com/search?utf8=%E2%9C%93&q=amazing+language%3Ago&type=Code) is.\n\nThis endpoint requires you to authenticate and limits you to 10 requests per minute.\n */\n  @aiFunction({\n    name: 'github_search_code',\n    description: `Searches for query terms inside of a file. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for code, you can get text match metadata for the file **content** and file **path** fields when you pass the \\`text-match\\` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to find the definition of the \\`addClass\\` function inside [jQuery](https://github.com/jquery/jquery) repository, your query would look something like this:\n\n\\`q=addClass+in:file+language:js+repo:jquery/jquery\\`\n\nThis query searches for the keyword \\`addClass\\` within a file's contents. The query limits the search to files where the language is JavaScript in the \\`jquery/jquery\\` repository.\n\nConsiderations for code search:\n\nDue to the complexity of searching code, there are a few restrictions on how searches are performed:\n\n*   Only the _default branch_ is considered. In most cases, this will be the \\`master\\` branch.\n*   Only files smaller than 384 KB are searchable.\n*   You must always include at least one search term when searching source code. For example, searching for [\\`language:go\\`](https://github.com/search?utf8=%E2%9C%93&q=language%3Ago&type=Code) is not valid, while [\\`amazing\nlanguage:go\\`](https://github.com/search?utf8=%E2%9C%93&q=amazing+language%3Ago&type=Code) is.\n\nThis endpoint requires you to authenticate and limits you to 10 requests per minute.`,\n    inputSchema: github.SearchCodeParamsSchema,\n    tags: ['search']\n  })\n  async searchCode(\n    params: github.SearchCodeParams\n  ): Promise<github.SearchCodeResponse> {\n    return this.ky\n      .get('/search/code', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'q', 'sort', 'order', 'per_page', 'page')\n        )\n      })\n      .json<github.SearchCodeResponse>()\n  }\n\n  /**\n * Find commits via various criteria on the default branch (usually `main`). This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for commits, you can get text match metadata for the **message** field when you provide the `text-match` media type. For more details about how to receive highlighted search results, see [Text match\nmetadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to find commits related to CSS in the [octocat/Spoon-Knife](https://github.com/octocat/Spoon-Knife) repository. Your query would look something like this:\n\n`q=repo:octocat/Spoon-Knife+css`.\n */\n  @aiFunction({\n    name: 'github_search_commits',\n    description: `Find commits via various criteria on the default branch (usually \\`main\\`). This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for commits, you can get text match metadata for the **message** field when you provide the \\`text-match\\` media type. For more details about how to receive highlighted search results, see [Text match\nmetadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to find commits related to CSS in the [octocat/Spoon-Knife](https://github.com/octocat/Spoon-Knife) repository. Your query would look something like this:\n\n\\`q=repo:octocat/Spoon-Knife+css\\`.`,\n    inputSchema: github.SearchCommitsParamsSchema,\n    tags: ['search']\n  })\n  async searchCommits(\n    params: github.SearchCommitsParams\n  ): Promise<github.SearchCommitsResponse> {\n    return this.ky\n      .get('/search/commits', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'q', 'sort', 'order', 'per_page', 'page')\n        )\n      })\n      .json<github.SearchCommitsResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Notice:** Search for issues and pull requests will be overridden by advanced search on September 4, 2025.\n> You can read more about this change on [the GitHub blog](https://github.blog/changelog/2025-03-06-github-issues-projects-api-support-for-issues-advanced-search-and-more/).\n */\n  @aiFunction({\n    name: 'github_search_issues_and_pull_requests',\n    description: `> [!WARNING]\n> **Notice:** Search for issues and pull requests will be overridden by advanced search on September 4, 2025.\n> You can read more about this change on [the GitHub blog](https://github.blog/changelog/2025-03-06-github-issues-projects-api-support-for-issues-advanced-search-and-more/).`,\n    inputSchema: github.SearchIssuesAndPullRequestsParamsSchema,\n    tags: ['search']\n  })\n  async searchIssuesAndPullRequests(\n    params: github.SearchIssuesAndPullRequestsParams\n  ): Promise<github.SearchIssuesAndPullRequestsResponse> {\n    return this.ky\n      .get('/search/issues', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'q',\n            'sort',\n            'order',\n            'per_page',\n            'page',\n            'advanced_search'\n          )\n        )\n      })\n      .json<github.SearchIssuesAndPullRequestsResponse>()\n  }\n\n  /**\n * Find labels in a repository with names or descriptions that match search keywords. Returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for labels, you can get text match metadata for the label **name** and **description** fields when you pass the `text-match` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to find labels in the `linguist` repository that match `bug`, `defect`, or `enhancement`. Your query might look like this:\n\n`q=bug+defect+enhancement&repository_id=64778136`\n\nThe labels that best match the query appear first in the search results.\n */\n  @aiFunction({\n    name: 'github_search_labels',\n    description: `Find labels in a repository with names or descriptions that match search keywords. Returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for labels, you can get text match metadata for the label **name** and **description** fields when you pass the \\`text-match\\` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to find labels in the \\`linguist\\` repository that match \\`bug\\`, \\`defect\\`, or \\`enhancement\\`. Your query might look like this:\n\n\\`q=bug+defect+enhancement&repository_id=64778136\\`\n\nThe labels that best match the query appear first in the search results.`,\n    inputSchema: github.SearchLabelsParamsSchema,\n    tags: ['search']\n  })\n  async searchLabels(\n    params: github.SearchLabelsParams\n  ): Promise<github.SearchLabelsResponse> {\n    return this.ky\n      .get('/search/labels', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'repository_id',\n            'q',\n            'sort',\n            'order',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.SearchLabelsResponse>()\n  }\n\n  /**\n * Find repositories via various criteria. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for repositories, you can get text match metadata for the **name** and **description** fields when you pass the `text-match` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to search for popular Tetris repositories written in assembly code, your query might look like this:\n\n`q=tetris+language:assembly&sort=stars&order=desc`\n\nThis query searches for repositories with the word `tetris` in the name, the description, or the README. The results are limited to repositories where the primary language is assembly. The results are sorted by stars in descending order, so that the most popular repositories appear first in the search results.\n */\n  @aiFunction({\n    name: 'github_search_repos',\n    description: `Find repositories via various criteria. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for repositories, you can get text match metadata for the **name** and **description** fields when you pass the \\`text-match\\` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to search for popular Tetris repositories written in assembly code, your query might look like this:\n\n\\`q=tetris+language:assembly&sort=stars&order=desc\\`\n\nThis query searches for repositories with the word \\`tetris\\` in the name, the description, or the README. The results are limited to repositories where the primary language is assembly. The results are sorted by stars in descending order, so that the most popular repositories appear first in the search results.`,\n    inputSchema: github.SearchReposParamsSchema,\n    tags: ['search']\n  })\n  async searchRepos(\n    params: github.SearchReposParams\n  ): Promise<github.SearchReposResponse> {\n    return this.ky\n      .get('/search/repositories', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'q', 'sort', 'order', 'per_page', 'page')\n        )\n      })\n      .json<github.SearchReposResponse>()\n  }\n\n  /**\n * Find topics via various criteria. Results are sorted by best match. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api). See \"[Searching topics](https://docs.github.com/articles/searching-topics/)\" for a detailed list of qualifiers.\n\nWhen searching for topics, you can get text match metadata for the topic's **short\\_description**, **description**, **name**, or **display\\_name** field when you pass the `text-match` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to search for topics related to Ruby that are featured on https://github.com/topics. Your query might look like this:\n\n`q=ruby+is:featured`\n\nThis query searches for topics with the keyword `ruby` and limits the results to find only topics that are featured. The topics that are the best match for the query appear first in the search results.\n */\n  @aiFunction({\n    name: 'github_search_topics',\n    description: `Find topics via various criteria. Results are sorted by best match. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api). See \"[Searching topics](https://docs.github.com/articles/searching-topics/)\" for a detailed list of qualifiers.\n\nWhen searching for topics, you can get text match metadata for the topic's **short\\_description**, **description**, **name**, or **display\\_name** field when you pass the \\`text-match\\` media type. For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you want to search for topics related to Ruby that are featured on https://github.com/topics. Your query might look like this:\n\n\\`q=ruby+is:featured\\`\n\nThis query searches for topics with the keyword \\`ruby\\` and limits the results to find only topics that are featured. The topics that are the best match for the query appear first in the search results.`,\n    inputSchema: github.SearchTopicsParamsSchema,\n    tags: ['search']\n  })\n  async searchTopics(\n    params: github.SearchTopicsParams\n  ): Promise<github.SearchTopicsResponse> {\n    return this.ky\n      .get('/search/topics', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'q', 'per_page', 'page')\n        )\n      })\n      .json<github.SearchTopicsResponse>()\n  }\n\n  /**\n * Find users via various criteria. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for users, you can get text match metadata for the issue **login**, public **email**, and **name** fields when you pass the `text-match` media type. For more details about highlighting search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata). For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you're looking for a list of popular users, you might try this query:\n\n`q=tom+repos:%3E42+followers:%3E1000`\n\nThis query searches for users with the name `tom`. The results are restricted to users with more than 42 repositories and over 1,000 followers.\n\nThis endpoint does not accept authentication and will only include publicly visible users. As an alternative, you can use the GraphQL API. The GraphQL API requires authentication and will return private users, including Enterprise Managed Users (EMUs), that you are authorized to view. For more information, see \"[GraphQL Queries](https://docs.github.com/graphql/reference/queries#search).\".\n */\n  @aiFunction({\n    name: 'github_search_users',\n    description: `Find users via various criteria. This method returns up to 100 results [per page](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api).\n\nWhen searching for users, you can get text match metadata for the issue **login**, public **email**, and **name** fields when you pass the \\`text-match\\` media type. For more details about highlighting search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata). For more details about how to receive highlighted search results, see [Text match metadata](https://docs.github.com/rest/search/search#text-match-metadata).\n\nFor example, if you're looking for a list of popular users, you might try this query:\n\n\\`q=tom+repos:%3E42+followers:%3E1000\\`\n\nThis query searches for users with the name \\`tom\\`. The results are restricted to users with more than 42 repositories and over 1,000 followers.\n\nThis endpoint does not accept authentication and will only include publicly visible users. As an alternative, you can use the GraphQL API. The GraphQL API requires authentication and will return private users, including Enterprise Managed Users (EMUs), that you are authorized to view. For more information, see \"[GraphQL Queries](https://docs.github.com/graphql/reference/queries#search).\".`,\n    inputSchema: github.SearchUsersParamsSchema,\n    tags: ['search']\n  })\n  async searchUsers(\n    params: github.SearchUsersParams\n  ): Promise<github.SearchUsersResponse> {\n    return this.ky\n      .get('/search/users', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'q', 'sort', 'order', 'per_page', 'page')\n        )\n      })\n      .json<github.SearchUsersResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the [Get a team by name](https://docs.github.com/rest/teams/teams#get-a-team-by-name) endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_get_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the [Get a team by name](https://docs.github.com/rest/teams/teams#get-a-team-by-name) endpoint.`,\n    inputSchema: github.TeamsGetLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetLegacy(\n    params: github.TeamsGetLegacyParams\n  ): Promise<github.TeamsGetLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}`)\n      .json<github.TeamsGetLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Delete a team](https://docs.github.com/rest/teams/teams#delete-a-team) endpoint.\n\nTo delete a team, the authenticated user must be an organization owner or team maintainer.\n\nIf you are an organization owner, deleting a parent team will delete all of its child teams as well.\n */\n  @aiFunction({\n    name: 'github_teams_delete_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Delete a team](https://docs.github.com/rest/teams/teams#delete-a-team) endpoint.\n\nTo delete a team, the authenticated user must be an organization owner or team maintainer.\n\nIf you are an organization owner, deleting a parent team will delete all of its child teams as well.`,\n    inputSchema: github.TeamsDeleteLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsDeleteLegacy(\n    params: github.TeamsDeleteLegacyParams\n  ): Promise<github.TeamsDeleteLegacyResponse> {\n    return this.ky\n      .delete(`/teams/${params.team_id}`)\n      .json<github.TeamsDeleteLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Update a team](https://docs.github.com/rest/teams/teams#update-a-team) endpoint.\n\nTo edit a team, the authenticated user must either be an organization owner or a team maintainer.\n\n> [!NOTE]\n> With nested teams, the `privacy` for parent teams cannot be `secret`.\n */\n  @aiFunction({\n    name: 'github_teams_update_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Update a team](https://docs.github.com/rest/teams/teams#update-a-team) endpoint.\n\nTo edit a team, the authenticated user must either be an organization owner or a team maintainer.\n\n> [!NOTE]\n> With nested teams, the \\`privacy\\` for parent teams cannot be \\`secret\\`.`,\n    inputSchema: github.TeamsUpdateLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsUpdateLegacy(\n    params: github.TeamsUpdateLegacyParams\n  ): Promise<github.TeamsUpdateLegacyResponse> {\n    return this.ky\n      .patch(`/teams/${params.team_id}`, {\n        json: pick(\n          params,\n          'name',\n          'description',\n          'privacy',\n          'notification_setting',\n          'permission',\n          'parent_team_id'\n        )\n      })\n      .json<github.TeamsUpdateLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`List discussions`](https://docs.github.com/rest/teams/discussions#list-discussions) endpoint.\n\nList all discussions on a team's page.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_list_discussions_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`List discussions\\`](https://docs.github.com/rest/teams/discussions#list-discussions) endpoint.\n\nList all discussions on a team's page.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsListDiscussionsLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListDiscussionsLegacy(\n    params: github.TeamsListDiscussionsLegacyParams\n  ): Promise<github.TeamsListDiscussionsLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/discussions`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.TeamsListDiscussionsLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`Create a discussion`](https://docs.github.com/rest/teams/discussions#create-a-discussion) endpoint.\n\nCreates a new discussion post on a team's page.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_create_discussion_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`Create a discussion\\`](https://docs.github.com/rest/teams/discussions#create-a-discussion) endpoint.\n\nCreates a new discussion post on a team's page.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsCreateDiscussionLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCreateDiscussionLegacy(\n    params: github.TeamsCreateDiscussionLegacyParams\n  ): Promise<github.TeamsCreateDiscussionLegacyResponse> {\n    return this.ky\n      .post(`/teams/${params.team_id}/discussions`, {\n        json: pick(params, 'title', 'body', 'private')\n      })\n      .json<github.TeamsCreateDiscussionLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Get a discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion) endpoint.\n\nGet a specific discussion on a team's page.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_get_discussion_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Get a discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion) endpoint.\n\nGet a specific discussion on a team's page.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsGetDiscussionLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetDiscussionLegacy(\n    params: github.TeamsGetDiscussionLegacyParams\n  ): Promise<github.TeamsGetDiscussionLegacyResponse> {\n    return this.ky\n      .get(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}`,\n        {}\n      )\n      .json<github.TeamsGetDiscussionLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`Delete a discussion`](https://docs.github.com/rest/teams/discussions#delete-a-discussion) endpoint.\n\nDelete a discussion from a team's page.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_delete_discussion_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`Delete a discussion\\`](https://docs.github.com/rest/teams/discussions#delete-a-discussion) endpoint.\n\nDelete a discussion from a team's page.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsDeleteDiscussionLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsDeleteDiscussionLegacy(\n    params: github.TeamsDeleteDiscussionLegacyParams\n  ): Promise<github.TeamsDeleteDiscussionLegacyResponse> {\n    return this.ky\n      .delete(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}`,\n        {}\n      )\n      .json<github.TeamsDeleteDiscussionLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Update a discussion](https://docs.github.com/rest/teams/discussions#update-a-discussion) endpoint.\n\nEdits the title and body text of a discussion post. Only the parameters you provide are updated.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_update_discussion_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Update a discussion](https://docs.github.com/rest/teams/discussions#update-a-discussion) endpoint.\n\nEdits the title and body text of a discussion post. Only the parameters you provide are updated.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsUpdateDiscussionLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsUpdateDiscussionLegacy(\n    params: github.TeamsUpdateDiscussionLegacyParams\n  ): Promise<github.TeamsUpdateDiscussionLegacyResponse> {\n    return this.ky\n      .patch(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}`,\n        {\n          json: pick(params, 'title', 'body')\n        }\n      )\n      .json<github.TeamsUpdateDiscussionLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [List discussion comments](https://docs.github.com/rest/teams/discussion-comments#list-discussion-comments) endpoint.\n\nList all comments on a team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_list_discussion_comments_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [List discussion comments](https://docs.github.com/rest/teams/discussion-comments#list-discussion-comments) endpoint.\n\nList all comments on a team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsListDiscussionCommentsLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListDiscussionCommentsLegacy(\n    params: github.TeamsListDiscussionCommentsLegacyParams\n  ): Promise<github.TeamsListDiscussionCommentsLegacyResponse> {\n    return this.ky\n      .get(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/comments`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'direction', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.TeamsListDiscussionCommentsLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Create a discussion comment](https://docs.github.com/rest/teams/discussion-comments#create-a-discussion-comment) endpoint.\n\nCreates a new comment on a team discussion.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_create_discussion_comment_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Create a discussion comment](https://docs.github.com/rest/teams/discussion-comments#create-a-discussion-comment) endpoint.\n\nCreates a new comment on a team discussion.\n\nThis endpoint triggers [notifications](https://docs.github.com/github/managing-subscriptions-and-notifications-on-github/about-notifications). Creating content too quickly using this endpoint may result in secondary rate limiting. For more information, see \"[Rate limits for the API](https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api#about-secondary-rate-limits)\" and \"[Best practices for using the REST API](https://docs.github.com/rest/guides/best-practices-for-using-the-rest-api).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsCreateDiscussionCommentLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCreateDiscussionCommentLegacy(\n    params: github.TeamsCreateDiscussionCommentLegacyParams\n  ): Promise<github.TeamsCreateDiscussionCommentLegacyResponse> {\n    return this.ky\n      .post(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/comments`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.TeamsCreateDiscussionCommentLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Get a discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment) endpoint.\n\nGet a specific comment on a team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_get_discussion_comment_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Get a discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment) endpoint.\n\nGet a specific comment on a team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsGetDiscussionCommentLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetDiscussionCommentLegacy(\n    params: github.TeamsGetDiscussionCommentLegacyParams\n  ): Promise<github.TeamsGetDiscussionCommentLegacyResponse> {\n    return this.ky\n      .get(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/comments/${params.comment_number}`,\n        {}\n      )\n      .json<github.TeamsGetDiscussionCommentLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Delete a discussion comment](https://docs.github.com/rest/teams/discussion-comments#delete-a-discussion-comment) endpoint.\n\nDeletes a comment on a team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_delete_discussion_comment_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Delete a discussion comment](https://docs.github.com/rest/teams/discussion-comments#delete-a-discussion-comment) endpoint.\n\nDeletes a comment on a team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsDeleteDiscussionCommentLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsDeleteDiscussionCommentLegacy(\n    params: github.TeamsDeleteDiscussionCommentLegacyParams\n  ): Promise<github.TeamsDeleteDiscussionCommentLegacyResponse> {\n    return this.ky\n      .delete(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/comments/${params.comment_number}`,\n        {}\n      )\n      .json<github.TeamsDeleteDiscussionCommentLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Update a discussion comment](https://docs.github.com/rest/teams/discussion-comments#update-a-discussion-comment) endpoint.\n\nEdits the body text of a discussion comment.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_update_discussion_comment_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Update a discussion comment](https://docs.github.com/rest/teams/discussion-comments#update-a-discussion-comment) endpoint.\n\nEdits the body text of a discussion comment.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.TeamsUpdateDiscussionCommentLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsUpdateDiscussionCommentLegacy(\n    params: github.TeamsUpdateDiscussionCommentLegacyParams\n  ): Promise<github.TeamsUpdateDiscussionCommentLegacyResponse> {\n    return this.ky\n      .patch(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/comments/${params.comment_number}`,\n        {\n          json: pick(params, 'body')\n        }\n      )\n      .json<github.TeamsUpdateDiscussionCommentLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`List reactions for a team discussion comment`](https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion-comment) endpoint.\n\nList the reactions to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_list_for_team_discussion_comment_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`List reactions for a team discussion comment\\`](https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion-comment) endpoint.\n\nList the reactions to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsListForTeamDiscussionCommentLegacyParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForTeamDiscussionCommentLegacy(\n    params: github.ReactionsListForTeamDiscussionCommentLegacyParams\n  ): Promise<github.ReactionsListForTeamDiscussionCommentLegacyResponse> {\n    return this.ky\n      .get(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/comments/${params.comment_number}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForTeamDiscussionCommentLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new \"[Create reaction for a team discussion comment](https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion-comment)\" endpoint.\n\nCreate a reaction to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nA response with an HTTP `200` status means that you already added the reaction type to this team discussion comment.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_create_for_team_discussion_comment_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new \"[Create reaction for a team discussion comment](https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion-comment)\" endpoint.\n\nCreate a reaction to a [team discussion comment](https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment).\n\nA response with an HTTP \\`200\\` status means that you already added the reaction type to this team discussion comment.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema:\n      github.ReactionsCreateForTeamDiscussionCommentLegacyParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForTeamDiscussionCommentLegacy(\n    params: github.ReactionsCreateForTeamDiscussionCommentLegacyParams\n  ): Promise<github.ReactionsCreateForTeamDiscussionCommentLegacyResponse> {\n    return this.ky\n      .post(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/comments/${params.comment_number}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForTeamDiscussionCommentLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`List reactions for a team discussion`](https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion) endpoint.\n\nList the reactions to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nOAuth app tokens and personal access tokens (classic) need the `read:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_list_for_team_discussion_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`List reactions for a team discussion\\`](https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion) endpoint.\n\nList the reactions to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsListForTeamDiscussionLegacyParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsListForTeamDiscussionLegacy(\n    params: github.ReactionsListForTeamDiscussionLegacyParams\n  ): Promise<github.ReactionsListForTeamDiscussionLegacyResponse> {\n    return this.ky\n      .get(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/reactions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'content', 'per_page', 'page')\n          )\n        }\n      )\n      .json<github.ReactionsListForTeamDiscussionLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`Create reaction for a team discussion`](https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion) endpoint.\n\nCreate a reaction to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nA response with an HTTP `200` status means that you already added the reaction type to this team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the `write:discussion` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_reactions_create_for_team_discussion_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`Create reaction for a team discussion\\`](https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion) endpoint.\n\nCreate a reaction to a [team discussion](https://docs.github.com/rest/teams/discussions#get-a-discussion).\n\nA response with an HTTP \\`200\\` status means that you already added the reaction type to this team discussion.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:discussion\\` scope to use this endpoint.`,\n    inputSchema: github.ReactionsCreateForTeamDiscussionLegacyParamsSchema,\n    tags: ['reactions']\n  })\n  async reactionsCreateForTeamDiscussionLegacy(\n    params: github.ReactionsCreateForTeamDiscussionLegacyParams\n  ): Promise<github.ReactionsCreateForTeamDiscussionLegacyResponse> {\n    return this.ky\n      .post(\n        `/teams/${params.team_id}/discussions/${params.discussion_number}/reactions`,\n        {\n          json: pick(params, 'content')\n        }\n      )\n      .json<github.ReactionsCreateForTeamDiscussionLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`List pending team invitations`](https://docs.github.com/rest/teams/members#list-pending-team-invitations) endpoint.\n\nThe return hash contains a `role` field which refers to the Organization Invitation role and will be one of the following values: `direct_member`, `admin`, `billing_manager`, `hiring_manager`, or `reinstate`. If the invitee is not a GitHub member, the `login` field in the return hash will be `null`.\n */\n  @aiFunction({\n    name: 'github_teams_list_pending_invitations_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`List pending team invitations\\`](https://docs.github.com/rest/teams/members#list-pending-team-invitations) endpoint.\n\nThe return hash contains a \\`role\\` field which refers to the Organization Invitation role and will be one of the following values: \\`direct_member\\`, \\`admin\\`, \\`billing_manager\\`, \\`hiring_manager\\`, or \\`reinstate\\`. If the invitee is not a GitHub member, the \\`login\\` field in the return hash will be \\`null\\`.`,\n    inputSchema: github.TeamsListPendingInvitationsLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListPendingInvitationsLegacy(\n    params: github.TeamsListPendingInvitationsLegacyParams\n  ): Promise<github.TeamsListPendingInvitationsLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/invitations`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListPendingInvitationsLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`List team members`](https://docs.github.com/rest/teams/members#list-team-members) endpoint.\n\nTeam members will include the members of child teams.\n */\n  @aiFunction({\n    name: 'github_teams_list_members_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`List team members\\`](https://docs.github.com/rest/teams/members#list-team-members) endpoint.\n\nTeam members will include the members of child teams.`,\n    inputSchema: github.TeamsListMembersLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListMembersLegacy(\n    params: github.TeamsListMembersLegacyParams\n  ): Promise<github.TeamsListMembersLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/members`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'role', 'per_page', 'page')\n        )\n      })\n      .json<github.TeamsListMembersLegacyResponse>()\n  }\n\n  /**\n * The \"Get team member\" endpoint (described below) is closing down.\n\nWe recommend using the [Get team membership for a user](https://docs.github.com/rest/teams/members#get-team-membership-for-a-user) endpoint instead. It allows you to get both active and pending memberships.\n\nTo list members in a team, the team must be visible to the authenticated user.\n */\n  @aiFunction({\n    name: 'github_teams_get_member_legacy',\n    description: `The \"Get team member\" endpoint (described below) is closing down.\n\nWe recommend using the [Get team membership for a user](https://docs.github.com/rest/teams/members#get-team-membership-for-a-user) endpoint instead. It allows you to get both active and pending memberships.\n\nTo list members in a team, the team must be visible to the authenticated user.`,\n    inputSchema: github.TeamsGetMemberLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetMemberLegacy(\n    params: github.TeamsGetMemberLegacyParams\n  ): Promise<github.TeamsGetMemberLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/members/${params.username}`, {})\n      .json<github.TeamsGetMemberLegacyResponse>()\n  }\n\n  /**\n * The \"Add team member\" endpoint (described below) is closing down.\n\nWe recommend using the [Add or update team membership for a user](https://docs.github.com/rest/teams/members#add-or-update-team-membership-for-a-user) endpoint instead. It allows you to invite new organization members to your teams.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo add someone to a team, the authenticated user must be an organization owner or a team maintainer in the team they're changing. The person being added to the team must be a member of the team's organization.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\nNote that you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".\n */\n  @aiFunction({\n    name: 'github_teams_add_member_legacy',\n    description: `The \"Add team member\" endpoint (described below) is closing down.\n\nWe recommend using the [Add or update team membership for a user](https://docs.github.com/rest/teams/members#add-or-update-team-membership-for-a-user) endpoint instead. It allows you to invite new organization members to your teams.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo add someone to a team, the authenticated user must be an organization owner or a team maintainer in the team they're changing. The person being added to the team must be a member of the team's organization.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\nNote that you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".`,\n    inputSchema: github.TeamsAddMemberLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsAddMemberLegacy(\n    params: github.TeamsAddMemberLegacyParams\n  ): Promise<github.TeamsAddMemberLegacyResponse> {\n    return this.ky\n      .put(`/teams/${params.team_id}/members/${params.username}`, {})\n      .json<github.TeamsAddMemberLegacyResponse>()\n  }\n\n  /**\n * The \"Remove team member\" endpoint (described below) is closing down.\n\nWe recommend using the [Remove team membership for a user](https://docs.github.com/rest/teams/members#remove-team-membership-for-a-user) endpoint instead. It allows you to remove both active and pending memberships.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo remove a team member, the authenticated user must have 'admin' permissions to the team or be an owner of the org that the team is associated with. Removing a team member does not delete the user, it just removes them from the team.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\".\n */\n  @aiFunction({\n    name: 'github_teams_remove_member_legacy',\n    description: `The \"Remove team member\" endpoint (described below) is closing down.\n\nWe recommend using the [Remove team membership for a user](https://docs.github.com/rest/teams/members#remove-team-membership-for-a-user) endpoint instead. It allows you to remove both active and pending memberships.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo remove a team member, the authenticated user must have 'admin' permissions to the team or be an owner of the org that the team is associated with. Removing a team member does not delete the user, it just removes them from the team.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\".`,\n    inputSchema: github.TeamsRemoveMemberLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsRemoveMemberLegacy(\n    params: github.TeamsRemoveMemberLegacyParams\n  ): Promise<github.TeamsRemoveMemberLegacyResponse> {\n    return this.ky\n      .delete(`/teams/${params.team_id}/members/${params.username}`, {})\n      .json<github.TeamsRemoveMemberLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Get team membership for a user](https://docs.github.com/rest/teams/members#get-team-membership-for-a-user) endpoint.\n\nTeam members will include the members of child teams.\n\nTo get a user's membership with a team, the team must be visible to the authenticated user.\n\n**Note:**\nThe response contains the `state` of the membership and the member's `role`.\n\nThe `role` for organization owners is set to `maintainer`. For more information about `maintainer` roles, see [Create a team](https://docs.github.com/rest/teams/teams#create-a-team).\n */\n  @aiFunction({\n    name: 'github_teams_get_membership_for_user_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Get team membership for a user](https://docs.github.com/rest/teams/members#get-team-membership-for-a-user) endpoint.\n\nTeam members will include the members of child teams.\n\nTo get a user's membership with a team, the team must be visible to the authenticated user.\n\n**Note:**\nThe response contains the \\`state\\` of the membership and the member's \\`role\\`.\n\nThe \\`role\\` for organization owners is set to \\`maintainer\\`. For more information about \\`maintainer\\` roles, see [Create a team](https://docs.github.com/rest/teams/teams#create-a-team).`,\n    inputSchema: github.TeamsGetMembershipForUserLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsGetMembershipForUserLegacy(\n    params: github.TeamsGetMembershipForUserLegacyParams\n  ): Promise<github.TeamsGetMembershipForUserLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/memberships/${params.username}`, {})\n      .json<github.TeamsGetMembershipForUserLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Add or update team membership for a user](https://docs.github.com/rest/teams/members#add-or-update-team-membership-for-a-user) endpoint.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nIf the user is already a member of the team's organization, this endpoint will add the user to the team. To add a membership between an organization member and a team, the authenticated user must be an organization owner or a team maintainer.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\nIf the user is unaffiliated with the team's organization, this endpoint will send an invitation to the user via email. This newly-created membership will be in the \"pending\" state until the user accepts the invitation, at which point the membership will transition to the \"active\" state and the user will be added as a member of the team. To add a membership between an unaffiliated user and a team, the authenticated user must be an organization owner.\n\nIf the user is already a member of the team, this endpoint will update the role of the team member's role. To update the membership of a team member, the authenticated user must be an organization owner or a team maintainer.\n */\n  @aiFunction({\n    name: 'github_teams_add_or_update_membership_for_user_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Add or update team membership for a user](https://docs.github.com/rest/teams/members#add-or-update-team-membership-for-a-user) endpoint.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nIf the user is already a member of the team's organization, this endpoint will add the user to the team. To add a membership between an organization member and a team, the authenticated user must be an organization owner or a team maintainer.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\"\n\nIf the user is unaffiliated with the team's organization, this endpoint will send an invitation to the user via email. This newly-created membership will be in the \"pending\" state until the user accepts the invitation, at which point the membership will transition to the \"active\" state and the user will be added as a member of the team. To add a membership between an unaffiliated user and a team, the authenticated user must be an organization owner.\n\nIf the user is already a member of the team, this endpoint will update the role of the team member's role. To update the membership of a team member, the authenticated user must be an organization owner or a team maintainer.`,\n    inputSchema: github.TeamsAddOrUpdateMembershipForUserLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsAddOrUpdateMembershipForUserLegacy(\n    params: github.TeamsAddOrUpdateMembershipForUserLegacyParams\n  ): Promise<github.TeamsAddOrUpdateMembershipForUserLegacyResponse> {\n    return this.ky\n      .put(`/teams/${params.team_id}/memberships/${params.username}`, {\n        json: pick(params, 'role')\n      })\n      .json<github.TeamsAddOrUpdateMembershipForUserLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Remove team membership for a user](https://docs.github.com/rest/teams/members#remove-team-membership-for-a-user) endpoint.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo remove a membership between a user and a team, the authenticated user must have 'admin' permissions to the team or be an owner of the organization that the team is associated with. Removing team membership does not delete the user, it just removes their membership from the team.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\".\n */\n  @aiFunction({\n    name: 'github_teams_remove_membership_for_user_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Remove team membership for a user](https://docs.github.com/rest/teams/members#remove-team-membership-for-a-user) endpoint.\n\nTeam synchronization is available for organizations using GitHub Enterprise Cloud. For more information, see [GitHub's products](https://docs.github.com/github/getting-started-with-github/githubs-products) in the GitHub Help documentation.\n\nTo remove a membership between a user and a team, the authenticated user must have 'admin' permissions to the team or be an owner of the organization that the team is associated with. Removing team membership does not delete the user, it just removes their membership from the team.\n\n> [!NOTE]\n> When you have team synchronization set up for a team with your organization's identity provider (IdP), you will see an error if you attempt to use the API for making changes to the team's membership. If you have access to manage group membership in your IdP, you can manage GitHub team membership through your identity provider, which automatically adds and removes team members in an organization. For more information, see \"[Synchronizing teams between your identity provider and GitHub](https://docs.github.com/articles/synchronizing-teams-between-your-identity-provider-and-github/).\".`,\n    inputSchema: github.TeamsRemoveMembershipForUserLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsRemoveMembershipForUserLegacy(\n    params: github.TeamsRemoveMembershipForUserLegacyParams\n  ): Promise<github.TeamsRemoveMembershipForUserLegacyResponse> {\n    return this.ky\n      .delete(\n        `/teams/${params.team_id}/memberships/${params.username}`,\n        {}\n      )\n      .json<github.TeamsRemoveMembershipForUserLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_list_projects_legacy',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsListProjectsLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListProjectsLegacy(\n    params: github.TeamsListProjectsLegacyParams\n  ): Promise<github.TeamsListProjectsLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/projects`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListProjectsLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_check_permissions_for_project_legacy',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsCheckPermissionsForProjectLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCheckPermissionsForProjectLegacy(\n    params: github.TeamsCheckPermissionsForProjectLegacyParams\n  ): Promise<github.TeamsCheckPermissionsForProjectLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/projects/${params.project_id}`, {})\n      .json<github.TeamsCheckPermissionsForProjectLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_add_or_update_project_permissions_legacy',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsAddOrUpdateProjectPermissionsLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsAddOrUpdateProjectPermissionsLegacy(\n    params: github.TeamsAddOrUpdateProjectPermissionsLegacyParams\n  ): Promise<github.TeamsAddOrUpdateProjectPermissionsLegacyResponse> {\n    return this.ky\n      .put(`/teams/${params.team_id}/projects/${params.project_id}`, {\n        json: pick(params, 'permission')\n      })\n      .json<github.TeamsAddOrUpdateProjectPermissionsLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_teams_remove_project_legacy',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.TeamsRemoveProjectLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsRemoveProjectLegacy(\n    params: github.TeamsRemoveProjectLegacyParams\n  ): Promise<github.TeamsRemoveProjectLegacyResponse> {\n    return this.ky\n      .delete(\n        `/teams/${params.team_id}/projects/${params.project_id}`,\n        {}\n      )\n      .json<github.TeamsRemoveProjectLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [List team repositories](https://docs.github.com/rest/teams/teams#list-team-repositories) endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_list_repos_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [List team repositories](https://docs.github.com/rest/teams/teams#list-team-repositories) endpoint.`,\n    inputSchema: github.TeamsListReposLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListReposLegacy(\n    params: github.TeamsListReposLegacyParams\n  ): Promise<github.TeamsListReposLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/repos`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListReposLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Check team permissions for a repository](https://docs.github.com/rest/teams/teams#check-team-permissions-for-a-repository) endpoint.\n\n> [!NOTE]\n> Repositories inherited through a parent team will also be checked.\n\nYou can also get information about the specified repository, including what permissions the team grants on it, by passing the following custom [media type](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types/) via the `Accept` header:.\n */\n  @aiFunction({\n    name: 'github_teams_check_permissions_for_repo_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Check team permissions for a repository](https://docs.github.com/rest/teams/teams#check-team-permissions-for-a-repository) endpoint.\n\n> [!NOTE]\n> Repositories inherited through a parent team will also be checked.\n\nYou can also get information about the specified repository, including what permissions the team grants on it, by passing the following custom [media type](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types/) via the \\`Accept\\` header:.`,\n    inputSchema: github.TeamsCheckPermissionsForRepoLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsCheckPermissionsForRepoLegacy(\n    params: github.TeamsCheckPermissionsForRepoLegacyParams\n  ): Promise<github.TeamsCheckPermissionsForRepoLegacyResponse> {\n    return this.ky\n      .get(\n        `/teams/${params.team_id}/repos/${params.owner}/${params.repo}`,\n        {}\n      )\n      .json<github.TeamsCheckPermissionsForRepoLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new \"[Add or update team repository permissions](https://docs.github.com/rest/teams/teams#add-or-update-team-repository-permissions)\" endpoint.\n\nTo add a repository to a team or update the team's permission on a repository, the authenticated user must have admin access to the repository, and must be able to see the team. The repository must be owned by the organization, or a direct fork of a repository owned by the organization. You will get a `422 Unprocessable Entity` status if you attempt to add a repository to a team that is not owned by the organization.\n\nNote that, if you choose not to pass any parameters, you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".\n */\n  @aiFunction({\n    name: 'github_teams_add_or_update_repo_permissions_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new \"[Add or update team repository permissions](https://docs.github.com/rest/teams/teams#add-or-update-team-repository-permissions)\" endpoint.\n\nTo add a repository to a team or update the team's permission on a repository, the authenticated user must have admin access to the repository, and must be able to see the team. The repository must be owned by the organization, or a direct fork of a repository owned by the organization. You will get a \\`422 Unprocessable Entity\\` status if you attempt to add a repository to a team that is not owned by the organization.\n\nNote that, if you choose not to pass any parameters, you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".`,\n    inputSchema: github.TeamsAddOrUpdateRepoPermissionsLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsAddOrUpdateRepoPermissionsLegacy(\n    params: github.TeamsAddOrUpdateRepoPermissionsLegacyParams\n  ): Promise<github.TeamsAddOrUpdateRepoPermissionsLegacyResponse> {\n    return this.ky\n      .put(\n        `/teams/${params.team_id}/repos/${params.owner}/${params.repo}`,\n        {\n          json: pick(params, 'permission')\n        }\n      )\n      .json<github.TeamsAddOrUpdateRepoPermissionsLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Remove a repository from a team](https://docs.github.com/rest/teams/teams#remove-a-repository-from-a-team) endpoint.\n\nIf the authenticated user is an organization owner or a team maintainer, they can remove any repositories from the team. To remove a repository from a team as an organization member, the authenticated user must have admin access to the repository and must be able to see the team. NOTE: This does not delete the repository, it just removes it from the team.\n */\n  @aiFunction({\n    name: 'github_teams_remove_repo_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [Remove a repository from a team](https://docs.github.com/rest/teams/teams#remove-a-repository-from-a-team) endpoint.\n\nIf the authenticated user is an organization owner or a team maintainer, they can remove any repositories from the team. To remove a repository from a team as an organization member, the authenticated user must have admin access to the repository and must be able to see the team. NOTE: This does not delete the repository, it just removes it from the team.`,\n    inputSchema: github.TeamsRemoveRepoLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsRemoveRepoLegacy(\n    params: github.TeamsRemoveRepoLegacyParams\n  ): Promise<github.TeamsRemoveRepoLegacyResponse> {\n    return this.ky\n      .delete(\n        `/teams/${params.team_id}/repos/${params.owner}/${params.repo}`,\n        {}\n      )\n      .json<github.TeamsRemoveRepoLegacyResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [`List child teams`](https://docs.github.com/rest/teams/teams#list-child-teams) endpoint.\n */\n  @aiFunction({\n    name: 'github_teams_list_child_legacy',\n    description: `> [!WARNING]\n> **Endpoint closing down notice:** This endpoint route is closing down and will be removed from the Teams API. We recommend migrating your existing code to use the new [\\`List child teams\\`](https://docs.github.com/rest/teams/teams#list-child-teams) endpoint.`,\n    inputSchema: github.TeamsListChildLegacyParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListChildLegacy(\n    params: github.TeamsListChildLegacyParams\n  ): Promise<github.TeamsListChildLegacyResponse> {\n    return this.ky\n      .get(`/teams/${params.team_id}/teams`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListChildLegacyResponse>()\n  }\n\n  /**\n   * OAuth app tokens and personal access tokens (classic) need the `user` scope in order for the response to include private profile information.\n   */\n  @aiFunction({\n    name: 'github_users_get_authenticated',\n    description: `OAuth app tokens and personal access tokens (classic) need the \\`user\\` scope in order for the response to include private profile information.`,\n    inputSchema: github.UsersGetAuthenticatedParamsSchema,\n    tags: ['users']\n  })\n  async usersGetAuthenticated(\n    _params: github.UsersGetAuthenticatedParams\n  ): Promise<github.UsersGetAuthenticatedResponse> {\n    return this.ky.get('/user').json<github.UsersGetAuthenticatedResponse>()\n  }\n\n  /**\n   * **Note:** If your email is set to private and you send an `email` parameter as part of this request to update your profile, your privacy settings are still enforced: the email address will not be displayed on your public profile or via the API.\n   */\n  @aiFunction({\n    name: 'github_users_update_authenticated',\n    description: `**Note:** If your email is set to private and you send an \\`email\\` parameter as part of this request to update your profile, your privacy settings are still enforced: the email address will not be displayed on your public profile or via the API.`,\n    inputSchema: github.UsersUpdateAuthenticatedParamsSchema,\n    tags: ['users']\n  })\n  async usersUpdateAuthenticated(\n    params: github.UsersUpdateAuthenticatedParams\n  ): Promise<github.UsersUpdateAuthenticatedResponse> {\n    return this.ky\n      .patch('/user', {\n        json: pick(\n          params,\n          'name',\n          'email',\n          'blog',\n          'twitter_username',\n          'company',\n          'location',\n          'hireable',\n          'bio'\n        )\n      })\n      .json<github.UsersUpdateAuthenticatedResponse>()\n  }\n\n  /**\n   * List the users you've blocked on your personal account.\n   */\n  @aiFunction({\n    name: 'github_users_list_blocked_by_authenticated_user',\n    description: `List the users you've blocked on your personal account.`,\n    inputSchema: github.UsersListBlockedByAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListBlockedByAuthenticatedUser(\n    params: github.UsersListBlockedByAuthenticatedUserParams\n  ): Promise<github.UsersListBlockedByAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/blocks', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListBlockedByAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Returns a 204 if the given user is blocked by the authenticated user. Returns a 404 if the given user is not blocked by the authenticated user, or if the given user account has been identified as spam by GitHub.\n   */\n  @aiFunction({\n    name: 'github_users_check_blocked',\n    description: `Returns a 204 if the given user is blocked by the authenticated user. Returns a 404 if the given user is not blocked by the authenticated user, or if the given user account has been identified as spam by GitHub.`,\n    inputSchema: github.UsersCheckBlockedParamsSchema,\n    tags: ['users']\n  })\n  async usersCheckBlocked(\n    params: github.UsersCheckBlockedParams\n  ): Promise<github.UsersCheckBlockedResponse> {\n    return this.ky\n      .get(`/user/blocks/${params.username}`)\n      .json<github.UsersCheckBlockedResponse>()\n  }\n\n  /**\n   * Blocks the given user and returns a 204. If the authenticated user cannot block the given user a 422 is returned.\n   */\n  @aiFunction({\n    name: 'github_users_block',\n    description: `Blocks the given user and returns a 204. If the authenticated user cannot block the given user a 422 is returned.`,\n    inputSchema: github.UsersBlockParamsSchema,\n    tags: ['users']\n  })\n  async usersBlock(\n    params: github.UsersBlockParams\n  ): Promise<github.UsersBlockResponse> {\n    return this.ky\n      .put(`/user/blocks/${params.username}`)\n      .json<github.UsersBlockResponse>()\n  }\n\n  /**\n   * Unblocks the given user and returns a 204.\n   */\n  @aiFunction({\n    name: 'github_users_unblock',\n    description: `Unblocks the given user and returns a 204.`,\n    inputSchema: github.UsersUnblockParamsSchema,\n    tags: ['users']\n  })\n  async usersUnblock(\n    params: github.UsersUnblockParams\n  ): Promise<github.UsersUnblockResponse> {\n    return this.ky\n      .delete(`/user/blocks/${params.username}`)\n      .json<github.UsersUnblockResponse>()\n  }\n\n  /**\n * Lists the authenticated user's codespaces.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_for_authenticated_user',\n    description: `Lists the authenticated user's codespaces.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesListForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListForAuthenticatedUser(\n    params: github.CodespacesListForAuthenticatedUserParams\n  ): Promise<github.CodespacesListForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/codespaces', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'per_page', 'page', 'repository_id')\n        )\n      })\n      .json<github.CodespacesListForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Creates a new codespace, owned by the authenticated user.\n\nThis endpoint requires either a `repository_id` OR a `pull_request` but not both.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_create_for_authenticated_user',\n    description: `Creates a new codespace, owned by the authenticated user.\n\nThis endpoint requires either a \\`repository_id\\` OR a \\`pull_request\\` but not both.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.CodespacesCreateForAuthenticatedUserParamsSchema as any,\n    tags: ['codespaces']\n  })\n  async codespacesCreateForAuthenticatedUser(\n    params: github.CodespacesCreateForAuthenticatedUserParams\n  ): Promise<github.CodespacesCreateForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/codespaces', {\n        json: params\n      })\n      .json<github.CodespacesCreateForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists all development environment secrets available for a user's codespaces without revealing their\nencrypted values.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_secrets_for_authenticated_user',\n    description: `Lists all development environment secrets available for a user's codespaces without revealing their\nencrypted values.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesListSecretsForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListSecretsForAuthenticatedUser(\n    params: github.CodespacesListSecretsForAuthenticatedUserParams\n  ): Promise<github.CodespacesListSecretsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/codespaces/secrets', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.CodespacesListSecretsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets your public key, which you need to encrypt secrets. You need to encrypt a secret before you can create or update secrets.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_public_key_for_authenticated_user',\n    description: `Gets your public key, which you need to encrypt secrets. You need to encrypt a secret before you can create or update secrets.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetPublicKeyForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetPublicKeyForAuthenticatedUser(\n    _params: github.CodespacesGetPublicKeyForAuthenticatedUserParams\n  ): Promise<github.CodespacesGetPublicKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/codespaces/secrets/public-key')\n      .json<github.CodespacesGetPublicKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets a development environment secret available to a user's codespaces without revealing its encrypted value.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_secret_for_authenticated_user',\n    description: `Gets a development environment secret available to a user's codespaces without revealing its encrypted value.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetSecretForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetSecretForAuthenticatedUser(\n    params: github.CodespacesGetSecretForAuthenticatedUserParams\n  ): Promise<github.CodespacesGetSecretForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/codespaces/secrets/${params.secret_name}`)\n      .json<github.CodespacesGetSecretForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Creates or updates a development environment secret for a user's codespace with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_create_or_update_secret_for_authenticated_user',\n    description: `Creates or updates a development environment secret for a user's codespace with an encrypted value. Encrypt your secret using\n[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages). For more information, see \"[Encrypting secrets for the REST API](https://docs.github.com/rest/guides/encrypting-secrets-for-the-rest-api).\"\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesCreateOrUpdateSecretForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesCreateOrUpdateSecretForAuthenticatedUser(\n    params: github.CodespacesCreateOrUpdateSecretForAuthenticatedUserParams\n  ): Promise<github.CodespacesCreateOrUpdateSecretForAuthenticatedUserResponse> {\n    return this.ky\n      .put(`/user/codespaces/secrets/${params.secret_name}`, {\n        json: pick(\n          params,\n          'encrypted_value',\n          'key_id',\n          'selected_repository_ids'\n        )\n      })\n      .json<github.CodespacesCreateOrUpdateSecretForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Deletes a development environment secret from a user's codespaces using the secret name. Deleting the secret will remove access from all codespaces that were allowed to access the secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_delete_secret_for_authenticated_user',\n    description: `Deletes a development environment secret from a user's codespaces using the secret name. Deleting the secret will remove access from all codespaces that were allowed to access the secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesDeleteSecretForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesDeleteSecretForAuthenticatedUser(\n    params: github.CodespacesDeleteSecretForAuthenticatedUserParams\n  ): Promise<github.CodespacesDeleteSecretForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/codespaces/secrets/${params.secret_name}`)\n      .json<github.CodespacesDeleteSecretForAuthenticatedUserResponse>()\n  }\n\n  /**\n * List the repositories that have been granted the ability to use a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_list_repositories_for_secret_for_authenticated_user',\n    description: `List the repositories that have been granted the ability to use a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesListRepositoriesForSecretForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesListRepositoriesForSecretForAuthenticatedUser(\n    params: github.CodespacesListRepositoriesForSecretForAuthenticatedUserParams\n  ): Promise<github.CodespacesListRepositoriesForSecretForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/codespaces/secrets/${params.secret_name}/repositories`)\n      .json<github.CodespacesListRepositoriesForSecretForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Select the repositories that will use a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_set_repositories_for_secret_for_authenticated_user',\n    description: `Select the repositories that will use a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesSetRepositoriesForSecretForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesSetRepositoriesForSecretForAuthenticatedUser(\n    params: github.CodespacesSetRepositoriesForSecretForAuthenticatedUserParams\n  ): Promise<github.CodespacesSetRepositoriesForSecretForAuthenticatedUserResponse> {\n    return this.ky\n      .put(`/user/codespaces/secrets/${params.secret_name}/repositories`, {\n        json: pick(params, 'selected_repository_ids')\n      })\n      .json<github.CodespacesSetRepositoriesForSecretForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Adds a repository to the selected repositories for a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_add_repository_for_secret_for_authenticated_user',\n    description: `Adds a repository to the selected repositories for a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesAddRepositoryForSecretForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesAddRepositoryForSecretForAuthenticatedUser(\n    params: github.CodespacesAddRepositoryForSecretForAuthenticatedUserParams\n  ): Promise<github.CodespacesAddRepositoryForSecretForAuthenticatedUserResponse> {\n    return this.ky\n      .put(\n        `/user/codespaces/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.CodespacesAddRepositoryForSecretForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Removes a repository from the selected repositories for a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` or `codespace:secrets` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_remove_repository_for_secret_for_authenticated_user',\n    description: `Removes a repository from the selected repositories for a user's development environment secret.\n\nThe authenticated user must have Codespaces access to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` or \\`codespace:secrets\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesRemoveRepositoryForSecretForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesRemoveRepositoryForSecretForAuthenticatedUser(\n    params: github.CodespacesRemoveRepositoryForSecretForAuthenticatedUserParams\n  ): Promise<github.CodespacesRemoveRepositoryForSecretForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(\n        `/user/codespaces/secrets/${params.secret_name}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.CodespacesRemoveRepositoryForSecretForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets information about a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_for_authenticated_user',\n    description: `Gets information about a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesGetForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetForAuthenticatedUser(\n    params: github.CodespacesGetForAuthenticatedUserParams\n  ): Promise<github.CodespacesGetForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/codespaces/${params.codespace_name}`)\n      .json<github.CodespacesGetForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Deletes a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_delete_for_authenticated_user',\n    description: `Deletes a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesDeleteForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesDeleteForAuthenticatedUser(\n    params: github.CodespacesDeleteForAuthenticatedUserParams\n  ): Promise<github.CodespacesDeleteForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/codespaces/${params.codespace_name}`)\n      .json<github.CodespacesDeleteForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Updates a codespace owned by the authenticated user. Currently only the codespace's machine type and recent folders can be modified using this endpoint.\n\nIf you specify a new machine type it will be applied the next time your codespace is started.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_update_for_authenticated_user',\n    description: `Updates a codespace owned by the authenticated user. Currently only the codespace's machine type and recent folders can be modified using this endpoint.\n\nIf you specify a new machine type it will be applied the next time your codespace is started.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesUpdateForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesUpdateForAuthenticatedUser(\n    params: github.CodespacesUpdateForAuthenticatedUserParams\n  ): Promise<github.CodespacesUpdateForAuthenticatedUserResponse> {\n    return this.ky\n      .patch(`/user/codespaces/${params.codespace_name}`, {\n        json: pick(params, 'machine', 'display_name', 'recent_folders')\n      })\n      .json<github.CodespacesUpdateForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Triggers an export of the specified codespace and returns a URL and ID where the status of the export can be monitored.\n\nIf changes cannot be pushed to the codespace's repository, they will be pushed to a new or previously-existing fork instead.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_export_for_authenticated_user',\n    description: `Triggers an export of the specified codespace and returns a URL and ID where the status of the export can be monitored.\n\nIf changes cannot be pushed to the codespace's repository, they will be pushed to a new or previously-existing fork instead.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesExportForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesExportForAuthenticatedUser(\n    params: github.CodespacesExportForAuthenticatedUserParams\n  ): Promise<github.CodespacesExportForAuthenticatedUserResponse> {\n    return this.ky\n      .post(`/user/codespaces/${params.codespace_name}/exports`)\n      .json<github.CodespacesExportForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets information about an export of a codespace.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_get_export_details_for_authenticated_user',\n    description: `Gets information about an export of a codespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesGetExportDetailsForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesGetExportDetailsForAuthenticatedUser(\n    params: github.CodespacesGetExportDetailsForAuthenticatedUserParams\n  ): Promise<github.CodespacesGetExportDetailsForAuthenticatedUserResponse> {\n    return this.ky\n      .get(\n        `/user/codespaces/${params.codespace_name}/exports/${params.export_id}`,\n        {}\n      )\n      .json<github.CodespacesGetExportDetailsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * List the machine types a codespace can transition to use.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_codespace_machines_for_authenticated_user',\n    description: `List the machine types a codespace can transition to use.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema:\n      github.CodespacesCodespaceMachinesForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesCodespaceMachinesForAuthenticatedUser(\n    params: github.CodespacesCodespaceMachinesForAuthenticatedUserParams\n  ): Promise<github.CodespacesCodespaceMachinesForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/codespaces/${params.codespace_name}/machines`)\n      .json<github.CodespacesCodespaceMachinesForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Publishes an unpublished codespace, creating a new repository and assigning it to the codespace.\n\nThe codespace's token is granted write permissions to the repository, allowing the user to push their changes.\n\nThis will fail for a codespace that is already published, meaning it has an associated repository.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_publish_for_authenticated_user',\n    description: `Publishes an unpublished codespace, creating a new repository and assigning it to the codespace.\n\nThe codespace's token is granted write permissions to the repository, allowing the user to push their changes.\n\nThis will fail for a codespace that is already published, meaning it has an associated repository.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesPublishForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesPublishForAuthenticatedUser(\n    params: github.CodespacesPublishForAuthenticatedUserParams\n  ): Promise<github.CodespacesPublishForAuthenticatedUserResponse> {\n    return this.ky\n      .post(`/user/codespaces/${params.codespace_name}/publish`, {\n        json: pick(params, 'name', 'private')\n      })\n      .json<github.CodespacesPublishForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Starts a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_start_for_authenticated_user',\n    description: `Starts a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesStartForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesStartForAuthenticatedUser(\n    params: github.CodespacesStartForAuthenticatedUserParams\n  ): Promise<github.CodespacesStartForAuthenticatedUserResponse> {\n    return this.ky\n      .post(`/user/codespaces/${params.codespace_name}/start`)\n      .json<github.CodespacesStartForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Stops a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the `codespace` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_codespaces_stop_for_authenticated_user',\n    description: `Stops a user's codespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`codespace\\` scope to use this endpoint.`,\n    inputSchema: github.CodespacesStopForAuthenticatedUserParamsSchema,\n    tags: ['codespaces']\n  })\n  async codespacesStopForAuthenticatedUser(\n    params: github.CodespacesStopForAuthenticatedUserParams\n  ): Promise<github.CodespacesStopForAuthenticatedUserResponse> {\n    return this.ky\n      .post(`/user/codespaces/${params.codespace_name}/stop`)\n      .json<github.CodespacesStopForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists all packages that are owned by the authenticated user within the user's namespace, and that encountered a conflict during a Docker migration.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_packages_list_docker_migration_conflicting_packages_for_authenticated_user',\n    description: `Lists all packages that are owned by the authenticated user within the user's namespace, and that encountered a conflict during a Docker migration.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint.`,\n    inputSchema:\n      github.PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesListDockerMigrationConflictingPackagesForAuthenticatedUser(\n    _params: github.PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserParams\n  ): Promise<github.PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/docker/conflicts')\n      .json<github.PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Sets the visibility for your primary email addresses.\n   */\n  @aiFunction({\n    name: 'github_users_set_primary_email_visibility_for_authenticated_user',\n    description: `Sets the visibility for your primary email addresses.`,\n    inputSchema:\n      github.UsersSetPrimaryEmailVisibilityForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersSetPrimaryEmailVisibilityForAuthenticatedUser(\n    params: github.UsersSetPrimaryEmailVisibilityForAuthenticatedUserParams\n  ): Promise<github.UsersSetPrimaryEmailVisibilityForAuthenticatedUserResponse> {\n    return this.ky\n      .patch('/user/email/visibility', {\n        json: params\n      })\n      .json<github.UsersSetPrimaryEmailVisibilityForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists all of your email addresses, and specifies which one is visible\nto the public.\n\nOAuth app tokens and personal access tokens (classic) need the `user:email` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_list_emails_for_authenticated_user',\n    description: `Lists all of your email addresses, and specifies which one is visible\nto the public.\n\nOAuth app tokens and personal access tokens (classic) need the \\`user:email\\` scope to use this endpoint.`,\n    inputSchema: github.UsersListEmailsForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListEmailsForAuthenticatedUser(\n    params: github.UsersListEmailsForAuthenticatedUserParams\n  ): Promise<github.UsersListEmailsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/emails', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListEmailsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * OAuth app tokens and personal access tokens (classic) need the `user` scope to use this endpoint.\n   */\n  @aiFunction({\n    name: 'github_users_add_email_for_authenticated_user',\n    description: `OAuth app tokens and personal access tokens (classic) need the \\`user\\` scope to use this endpoint.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.UsersAddEmailForAuthenticatedUserParamsSchema as any,\n    tags: ['users']\n  })\n  async usersAddEmailForAuthenticatedUser(\n    params: github.UsersAddEmailForAuthenticatedUserParams\n  ): Promise<github.UsersAddEmailForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/emails', {\n        json: params\n      })\n      .json<github.UsersAddEmailForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * OAuth app tokens and personal access tokens (classic) need the `user` scope to use this endpoint.\n   */\n  @aiFunction({\n    name: 'github_users_delete_email_for_authenticated_user',\n    description: `OAuth app tokens and personal access tokens (classic) need the \\`user\\` scope to use this endpoint.`,\n    // TODO: Improve handling of union params\n    inputSchema: github.UsersDeleteEmailForAuthenticatedUserParamsSchema as any,\n    tags: ['users']\n  })\n  async usersDeleteEmailForAuthenticatedUser(\n    params: github.UsersDeleteEmailForAuthenticatedUserParams\n  ): Promise<github.UsersDeleteEmailForAuthenticatedUserResponse> {\n    return this.ky\n      .delete('/user/emails', {\n        json: params\n      })\n      .json<github.UsersDeleteEmailForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists the people following the authenticated user.\n   */\n  @aiFunction({\n    name: 'github_users_list_followers_for_authenticated_user',\n    description: `Lists the people following the authenticated user.`,\n    inputSchema: github.UsersListFollowersForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListFollowersForAuthenticatedUser(\n    params: github.UsersListFollowersForAuthenticatedUserParams\n  ): Promise<github.UsersListFollowersForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/followers', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListFollowersForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists the people who the authenticated user follows.\n   */\n  @aiFunction({\n    name: 'github_users_list_followed_by_authenticated_user',\n    description: `Lists the people who the authenticated user follows.`,\n    inputSchema: github.UsersListFollowedByAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListFollowedByAuthenticatedUser(\n    params: github.UsersListFollowedByAuthenticatedUserParams\n  ): Promise<github.UsersListFollowedByAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/following', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListFollowedByAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Check if a person is followed by the authenticated user.\n   */\n  @aiFunction({\n    name: 'github_users_check_person_is_followed_by_authenticated',\n    description: `Check if a person is followed by the authenticated user.`,\n    inputSchema: github.UsersCheckPersonIsFollowedByAuthenticatedParamsSchema,\n    tags: ['users']\n  })\n  async usersCheckPersonIsFollowedByAuthenticated(\n    params: github.UsersCheckPersonIsFollowedByAuthenticatedParams\n  ): Promise<github.UsersCheckPersonIsFollowedByAuthenticatedResponse> {\n    return this.ky\n      .get(`/user/following/${params.username}`)\n      .json<github.UsersCheckPersonIsFollowedByAuthenticatedResponse>()\n  }\n\n  /**\n * Note that you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP verbs](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"\n\nOAuth app tokens and personal access tokens (classic) need the `user:follow` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_follow',\n    description: `Note that you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP verbs](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`user:follow\\` scope to use this endpoint.`,\n    inputSchema: github.UsersFollowParamsSchema,\n    tags: ['users']\n  })\n  async usersFollow(\n    params: github.UsersFollowParams\n  ): Promise<github.UsersFollowResponse> {\n    return this.ky\n      .put(`/user/following/${params.username}`)\n      .json<github.UsersFollowResponse>()\n  }\n\n  /**\n   * OAuth app tokens and personal access tokens (classic) need the `user:follow` scope to use this endpoint.\n   */\n  @aiFunction({\n    name: 'github_users_unfollow',\n    description: `OAuth app tokens and personal access tokens (classic) need the \\`user:follow\\` scope to use this endpoint.`,\n    inputSchema: github.UsersUnfollowParamsSchema,\n    tags: ['users']\n  })\n  async usersUnfollow(\n    params: github.UsersUnfollowParams\n  ): Promise<github.UsersUnfollowResponse> {\n    return this.ky\n      .delete(`/user/following/${params.username}`)\n      .json<github.UsersUnfollowResponse>()\n  }\n\n  /**\n * Lists the current user's GPG keys.\n\nOAuth app tokens and personal access tokens (classic) need the `read:gpg_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_list_gpg_keys_for_authenticated_user',\n    description: `Lists the current user's GPG keys.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:gpg_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersListGpgKeysForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListGpgKeysForAuthenticatedUser(\n    params: github.UsersListGpgKeysForAuthenticatedUserParams\n  ): Promise<github.UsersListGpgKeysForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/gpg_keys', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListGpgKeysForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Adds a GPG key to the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `write:gpg_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_create_gpg_key_for_authenticated_user',\n    description: `Adds a GPG key to the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:gpg_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersCreateGpgKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersCreateGpgKeyForAuthenticatedUser(\n    params: github.UsersCreateGpgKeyForAuthenticatedUserParams\n  ): Promise<github.UsersCreateGpgKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/gpg_keys', {\n        json: pick(params, 'name', 'armored_public_key')\n      })\n      .json<github.UsersCreateGpgKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * View extended details for a single GPG key.\n\nOAuth app tokens and personal access tokens (classic) need the `read:gpg_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_get_gpg_key_for_authenticated_user',\n    description: `View extended details for a single GPG key.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:gpg_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersGetGpgKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersGetGpgKeyForAuthenticatedUser(\n    params: github.UsersGetGpgKeyForAuthenticatedUserParams\n  ): Promise<github.UsersGetGpgKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/gpg_keys/${params.gpg_key_id}`)\n      .json<github.UsersGetGpgKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Removes a GPG key from the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:gpg_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_delete_gpg_key_for_authenticated_user',\n    description: `Removes a GPG key from the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:gpg_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersDeleteGpgKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersDeleteGpgKeyForAuthenticatedUser(\n    params: github.UsersDeleteGpgKeyForAuthenticatedUserParams\n  ): Promise<github.UsersDeleteGpgKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/gpg_keys/${params.gpg_key_id}`)\n      .json<github.UsersDeleteGpgKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists installations of your GitHub App that the authenticated user has explicit permission (`:read`, `:write`, or `:admin`) to access.\n\nThe authenticated user has explicit permission to access repositories they own, repositories where they are a collaborator, and repositories that they can access through an organization membership.\n\nYou can find the permissions for the installation under the `permissions` key.\n */\n  @aiFunction({\n    name: 'github_apps_list_installations_for_authenticated_user',\n    description: `Lists installations of your GitHub App that the authenticated user has explicit permission (\\`:read\\`, \\`:write\\`, or \\`:admin\\`) to access.\n\nThe authenticated user has explicit permission to access repositories they own, repositories where they are a collaborator, and repositories that they can access through an organization membership.\n\nYou can find the permissions for the installation under the \\`permissions\\` key.`,\n    inputSchema: github.AppsListInstallationsForAuthenticatedUserParamsSchema,\n    tags: ['apps']\n  })\n  async appsListInstallationsForAuthenticatedUser(\n    params: github.AppsListInstallationsForAuthenticatedUserParams\n  ): Promise<github.AppsListInstallationsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/installations', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListInstallationsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * List repositories that the authenticated user has explicit permission (`:read`, `:write`, or `:admin`) to access for an installation.\n\nThe authenticated user has explicit permission to access repositories they own, repositories where they are a collaborator, and repositories that they can access through an organization membership.\n\nThe access the user has to each repository is included in the hash under the `permissions` key.\n */\n  @aiFunction({\n    name: 'github_apps_list_installation_repos_for_authenticated_user',\n    description: `List repositories that the authenticated user has explicit permission (\\`:read\\`, \\`:write\\`, or \\`:admin\\`) to access for an installation.\n\nThe authenticated user has explicit permission to access repositories they own, repositories where they are a collaborator, and repositories that they can access through an organization membership.\n\nThe access the user has to each repository is included in the hash under the \\`permissions\\` key.`,\n    inputSchema:\n      github.AppsListInstallationReposForAuthenticatedUserParamsSchema,\n    tags: ['apps']\n  })\n  async appsListInstallationReposForAuthenticatedUser(\n    params: github.AppsListInstallationReposForAuthenticatedUserParams\n  ): Promise<github.AppsListInstallationReposForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/installations/${params.installation_id}/repositories`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListInstallationReposForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Add a single repository to an installation. The authenticated user must have admin access to the repository.\n\nThis endpoint only works for PATs (classic) with the `repo` scope.\n */\n  @aiFunction({\n    name: 'github_apps_add_repo_to_installation_for_authenticated_user',\n    description: `Add a single repository to an installation. The authenticated user must have admin access to the repository.\n\nThis endpoint only works for PATs (classic) with the \\`repo\\` scope.`,\n    inputSchema:\n      github.AppsAddRepoToInstallationForAuthenticatedUserParamsSchema,\n    tags: ['apps']\n  })\n  async appsAddRepoToInstallationForAuthenticatedUser(\n    params: github.AppsAddRepoToInstallationForAuthenticatedUserParams\n  ): Promise<github.AppsAddRepoToInstallationForAuthenticatedUserResponse> {\n    return this.ky\n      .put(\n        `/user/installations/${params.installation_id}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.AppsAddRepoToInstallationForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Remove a single repository from an installation. The authenticated user must have admin access to the repository. The installation must have the `repository_selection` of `selected`.\n\nThis endpoint only works for PATs (classic) with the `repo` scope.\n */\n  @aiFunction({\n    name: 'github_apps_remove_repo_from_installation_for_authenticated_user',\n    description: `Remove a single repository from an installation. The authenticated user must have admin access to the repository. The installation must have the \\`repository_selection\\` of \\`selected\\`.\n\nThis endpoint only works for PATs (classic) with the \\`repo\\` scope.`,\n    inputSchema:\n      github.AppsRemoveRepoFromInstallationForAuthenticatedUserParamsSchema,\n    tags: ['apps']\n  })\n  async appsRemoveRepoFromInstallationForAuthenticatedUser(\n    params: github.AppsRemoveRepoFromInstallationForAuthenticatedUserParams\n  ): Promise<github.AppsRemoveRepoFromInstallationForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(\n        `/user/installations/${params.installation_id}/repositories/${params.repository_id}`,\n        {}\n      )\n      .json<github.AppsRemoveRepoFromInstallationForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Shows which type of GitHub user can interact with your public repositories and when the restriction expires.\n   */\n  @aiFunction({\n    name: 'github_interactions_get_restrictions_for_authenticated_user',\n    description: `Shows which type of GitHub user can interact with your public repositories and when the restriction expires.`,\n    inputSchema:\n      github.InteractionsGetRestrictionsForAuthenticatedUserParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsGetRestrictionsForAuthenticatedUser(\n    _params: github.InteractionsGetRestrictionsForAuthenticatedUserParams\n  ): Promise<github.InteractionsGetRestrictionsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/interaction-limits')\n      .json<github.InteractionsGetRestrictionsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Temporarily restricts which type of GitHub user can interact with your public repositories. Setting the interaction limit at the user level will overwrite any interaction limits that are set for individual repositories owned by the user.\n   */\n  @aiFunction({\n    name: 'github_interactions_set_restrictions_for_authenticated_user',\n    description: `Temporarily restricts which type of GitHub user can interact with your public repositories. Setting the interaction limit at the user level will overwrite any interaction limits that are set for individual repositories owned by the user.`,\n    inputSchema:\n      github.InteractionsSetRestrictionsForAuthenticatedUserParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsSetRestrictionsForAuthenticatedUser(\n    params: github.InteractionsSetRestrictionsForAuthenticatedUserParams\n  ): Promise<github.InteractionsSetRestrictionsForAuthenticatedUserResponse> {\n    return this.ky\n      .put('/user/interaction-limits', {\n        json: pick(params, 'limit', 'expiry')\n      })\n      .json<github.InteractionsSetRestrictionsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Removes any interaction restrictions from your public repositories.\n   */\n  @aiFunction({\n    name: 'github_interactions_remove_restrictions_for_authenticated_user',\n    description: `Removes any interaction restrictions from your public repositories.`,\n    inputSchema:\n      github.InteractionsRemoveRestrictionsForAuthenticatedUserParamsSchema,\n    tags: ['interactions']\n  })\n  async interactionsRemoveRestrictionsForAuthenticatedUser(\n    _params: github.InteractionsRemoveRestrictionsForAuthenticatedUserParams\n  ): Promise<github.InteractionsRemoveRestrictionsForAuthenticatedUserResponse> {\n    return this.ky\n      .delete('/user/interaction-limits')\n      .json<github.InteractionsRemoveRestrictionsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * List issues across owned and member repositories assigned to the authenticated user.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the `pull_request` key. Be aware that the `id` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.raw+json`**: Returns the raw markdown body. Response will include `body`. This is the default if you do not pass any specific media type.\n- **`application/vnd.github.text+json`**: Returns a text only representation of the markdown body. Response will include `body_text`.\n- **`application/vnd.github.html+json`**: Returns HTML rendered from the body's markdown. Response will include `body_html`.\n- **`application/vnd.github.full+json`**: Returns raw, text, and HTML representations. Response will include `body`, `body_text`, and `body_html`.\n */\n  @aiFunction({\n    name: 'github_issues_list_for_authenticated_user',\n    description: `List issues across owned and member repositories assigned to the authenticated user.\n\n> [!NOTE]\n> GitHub's REST API considers every pull request an issue, but not every issue is a pull request. For this reason, \"Issues\" endpoints may return both issues and pull requests in the response. You can identify pull requests by the \\`pull_request\\` key. Be aware that the \\`id\\` of a pull request returned from \"Issues\" endpoints will be an _issue id_. To find out the pull request id, use the \"[List pull requests](https://docs.github.com/rest/pulls/pulls#list-pull-requests)\" endpoint.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.raw+json\\`**: Returns the raw markdown body. Response will include \\`body\\`. This is the default if you do not pass any specific media type.\n- **\\`application/vnd.github.text+json\\`**: Returns a text only representation of the markdown body. Response will include \\`body_text\\`.\n- **\\`application/vnd.github.html+json\\`**: Returns HTML rendered from the body's markdown. Response will include \\`body_html\\`.\n- **\\`application/vnd.github.full+json\\`**: Returns raw, text, and HTML representations. Response will include \\`body\\`, \\`body_text\\`, and \\`body_html\\`.`,\n    inputSchema: github.IssuesListForAuthenticatedUserParamsSchema,\n    tags: ['issues']\n  })\n  async issuesListForAuthenticatedUser(\n    params: github.IssuesListForAuthenticatedUserParams\n  ): Promise<github.IssuesListForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/issues', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'filter',\n            'state',\n            'labels',\n            'sort',\n            'direction',\n            'since',\n            'per_page',\n            'page'\n          )\n        )\n      })\n      .json<github.IssuesListForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists the public SSH keys for the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `read:public_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_list_public_ssh_keys_for_authenticated_user',\n    description: `Lists the public SSH keys for the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:public_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersListPublicSshKeysForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListPublicSshKeysForAuthenticatedUser(\n    params: github.UsersListPublicSshKeysForAuthenticatedUserParams\n  ): Promise<github.UsersListPublicSshKeysForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/keys', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListPublicSshKeysForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Adds a public SSH key to the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `write:gpg_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_create_public_ssh_key_for_authenticated_user',\n    description: `Adds a public SSH key to the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:gpg_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersCreatePublicSshKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersCreatePublicSshKeyForAuthenticatedUser(\n    params: github.UsersCreatePublicSshKeyForAuthenticatedUserParams\n  ): Promise<github.UsersCreatePublicSshKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/keys', {\n        json: pick(params, 'title', 'key')\n      })\n      .json<github.UsersCreatePublicSshKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * View extended details for a single public SSH key.\n\nOAuth app tokens and personal access tokens (classic) need the `read:public_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_get_public_ssh_key_for_authenticated_user',\n    description: `View extended details for a single public SSH key.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:public_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersGetPublicSshKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersGetPublicSshKeyForAuthenticatedUser(\n    params: github.UsersGetPublicSshKeyForAuthenticatedUserParams\n  ): Promise<github.UsersGetPublicSshKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/keys/${params.key_id}`)\n      .json<github.UsersGetPublicSshKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Removes a public SSH key from the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:public_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_delete_public_ssh_key_for_authenticated_user',\n    description: `Removes a public SSH key from the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:public_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersDeletePublicSshKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersDeletePublicSshKeyForAuthenticatedUser(\n    params: github.UsersDeletePublicSshKeyForAuthenticatedUserParams\n  ): Promise<github.UsersDeletePublicSshKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/keys/${params.key_id}`)\n      .json<github.UsersDeletePublicSshKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists the active subscriptions for the authenticated user.\n   */\n  @aiFunction({\n    name: 'github_apps_list_subscriptions_for_authenticated_user',\n    description: `Lists the active subscriptions for the authenticated user.`,\n    inputSchema: github.AppsListSubscriptionsForAuthenticatedUserParamsSchema,\n    tags: ['apps']\n  })\n  async appsListSubscriptionsForAuthenticatedUser(\n    params: github.AppsListSubscriptionsForAuthenticatedUserParams\n  ): Promise<github.AppsListSubscriptionsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/marketplace_purchases', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListSubscriptionsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists the active subscriptions for the authenticated user.\n   */\n  @aiFunction({\n    name: 'github_apps_list_subscriptions_for_authenticated_user_stubbed',\n    description: `Lists the active subscriptions for the authenticated user.`,\n    inputSchema:\n      github.AppsListSubscriptionsForAuthenticatedUserStubbedParamsSchema,\n    tags: ['apps']\n  })\n  async appsListSubscriptionsForAuthenticatedUserStubbed(\n    params: github.AppsListSubscriptionsForAuthenticatedUserStubbedParams\n  ): Promise<github.AppsListSubscriptionsForAuthenticatedUserStubbedResponse> {\n    return this.ky\n      .get('/user/marketplace_purchases/stubbed', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.AppsListSubscriptionsForAuthenticatedUserStubbedResponse>()\n  }\n\n  /**\n   * Lists all of the authenticated user's organization memberships.\n   */\n  @aiFunction({\n    name: 'github_orgs_list_memberships_for_authenticated_user',\n    description: `Lists all of the authenticated user's organization memberships.`,\n    inputSchema: github.OrgsListMembershipsForAuthenticatedUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListMembershipsForAuthenticatedUser(\n    params: github.OrgsListMembershipsForAuthenticatedUserParams\n  ): Promise<github.OrgsListMembershipsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/memberships/orgs', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'state', 'per_page', 'page')\n        )\n      })\n      .json<github.OrgsListMembershipsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * If the authenticated user is an active or pending member of the organization, this endpoint will return the user's membership. If the authenticated user is not affiliated with the organization, a `404` is returned. This endpoint will return a `403` if the request is made by a GitHub App that is blocked by the organization.\n   */\n  @aiFunction({\n    name: 'github_orgs_get_membership_for_authenticated_user',\n    description: `If the authenticated user is an active or pending member of the organization, this endpoint will return the user's membership. If the authenticated user is not affiliated with the organization, a \\`404\\` is returned. This endpoint will return a \\`403\\` if the request is made by a GitHub App that is blocked by the organization.`,\n    inputSchema: github.OrgsGetMembershipForAuthenticatedUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsGetMembershipForAuthenticatedUser(\n    params: github.OrgsGetMembershipForAuthenticatedUserParams\n  ): Promise<github.OrgsGetMembershipForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/memberships/orgs/${params.org}`)\n      .json<github.OrgsGetMembershipForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Converts the authenticated user to an active member of the organization, if that user has a pending invitation from the organization.\n   */\n  @aiFunction({\n    name: 'github_orgs_update_membership_for_authenticated_user',\n    description: `Converts the authenticated user to an active member of the organization, if that user has a pending invitation from the organization.`,\n    inputSchema: github.OrgsUpdateMembershipForAuthenticatedUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsUpdateMembershipForAuthenticatedUser(\n    params: github.OrgsUpdateMembershipForAuthenticatedUserParams\n  ): Promise<github.OrgsUpdateMembershipForAuthenticatedUserResponse> {\n    return this.ky\n      .patch(`/user/memberships/orgs/${params.org}`, {\n        json: pick(params, 'state')\n      })\n      .json<github.OrgsUpdateMembershipForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists all migrations a user has started.\n   */\n  @aiFunction({\n    name: 'github_migrations_list_for_authenticated_user',\n    description: `Lists all migrations a user has started.`,\n    inputSchema: github.MigrationsListForAuthenticatedUserParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsListForAuthenticatedUser(\n    params: github.MigrationsListForAuthenticatedUserParams\n  ): Promise<github.MigrationsListForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/migrations', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.MigrationsListForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Initiates the generation of a user migration archive.\n   */\n  @aiFunction({\n    name: 'github_migrations_start_for_authenticated_user',\n    description: `Initiates the generation of a user migration archive.`,\n    inputSchema: github.MigrationsStartForAuthenticatedUserParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsStartForAuthenticatedUser(\n    params: github.MigrationsStartForAuthenticatedUserParams\n  ): Promise<github.MigrationsStartForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/migrations', {\n        json: pick(\n          params,\n          'lock_repositories',\n          'exclude_metadata',\n          'exclude_git_data',\n          'exclude_attachments',\n          'exclude_releases',\n          'exclude_owner_projects',\n          'org_metadata_only',\n          'exclude',\n          'repositories'\n        )\n      })\n      .json<github.MigrationsStartForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Fetches a single user migration. The response includes the `state` of the migration, which can be one of the following values:\n\n*   `pending` - the migration hasn't started yet.\n*   `exporting` - the migration is in progress.\n*   `exported` - the migration finished successfully.\n*   `failed` - the migration failed.\n\nOnce the migration has been `exported` you can [download the migration archive](https://docs.github.com/rest/migrations/users#download-a-user-migration-archive).\n */\n  @aiFunction({\n    name: 'github_migrations_get_status_for_authenticated_user',\n    description: `Fetches a single user migration. The response includes the \\`state\\` of the migration, which can be one of the following values:\n\n*   \\`pending\\` - the migration hasn't started yet.\n*   \\`exporting\\` - the migration is in progress.\n*   \\`exported\\` - the migration finished successfully.\n*   \\`failed\\` - the migration failed.\n\nOnce the migration has been \\`exported\\` you can [download the migration archive](https://docs.github.com/rest/migrations/users#download-a-user-migration-archive).`,\n    inputSchema: github.MigrationsGetStatusForAuthenticatedUserParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsGetStatusForAuthenticatedUser(\n    params: github.MigrationsGetStatusForAuthenticatedUserParams\n  ): Promise<github.MigrationsGetStatusForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/migrations/${params.migration_id}`, {\n        searchParams: sanitizeSearchParams(pick(params, 'exclude'))\n      })\n      .json<github.MigrationsGetStatusForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Fetches the URL to download the migration archive as a `tar.gz` file. Depending on the resources your repository uses, the migration archive can contain JSON files with data for these objects:\n\n*   attachments\n*   bases\n*   commit\\_comments\n*   issue\\_comments\n*   issue\\_events\n*   issues\n*   milestones\n*   organizations\n*   projects\n*   protected\\_branches\n*   pull\\_request\\_reviews\n*   pull\\_requests\n*   releases\n*   repositories\n*   review\\_comments\n*   schema\n*   users\n\nThe archive will also contain an `attachments` directory that includes all attachment files uploaded to GitHub.com and a `repositories` directory that contains the repository's Git data.\n */\n  @aiFunction({\n    name: 'github_migrations_get_archive_for_authenticated_user',\n    description: `Fetches the URL to download the migration archive as a \\`tar.gz\\` file. Depending on the resources your repository uses, the migration archive can contain JSON files with data for these objects:\n\n*   attachments\n*   bases\n*   commit\\_comments\n*   issue\\_comments\n*   issue\\_events\n*   issues\n*   milestones\n*   organizations\n*   projects\n*   protected\\_branches\n*   pull\\_request\\_reviews\n*   pull\\_requests\n*   releases\n*   repositories\n*   review\\_comments\n*   schema\n*   users\n\nThe archive will also contain an \\`attachments\\` directory that includes all attachment files uploaded to GitHub.com and a \\`repositories\\` directory that contains the repository's Git data.`,\n    inputSchema: github.MigrationsGetArchiveForAuthenticatedUserParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsGetArchiveForAuthenticatedUser(\n    params: github.MigrationsGetArchiveForAuthenticatedUserParams\n  ): Promise<github.MigrationsGetArchiveForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/migrations/${params.migration_id}/archive`)\n      .json<github.MigrationsGetArchiveForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Deletes a previous migration archive. Downloadable migration archives are automatically deleted after seven days. Migration metadata, which is returned in the [List user migrations](https://docs.github.com/rest/migrations/users#list-user-migrations) and [Get a user migration status](https://docs.github.com/rest/migrations/users#get-a-user-migration-status) endpoints, will continue to be available even after an archive is deleted.\n   */\n  @aiFunction({\n    name: 'github_migrations_delete_archive_for_authenticated_user',\n    description: `Deletes a previous migration archive. Downloadable migration archives are automatically deleted after seven days. Migration metadata, which is returned in the [List user migrations](https://docs.github.com/rest/migrations/users#list-user-migrations) and [Get a user migration status](https://docs.github.com/rest/migrations/users#get-a-user-migration-status) endpoints, will continue to be available even after an archive is deleted.`,\n    inputSchema: github.MigrationsDeleteArchiveForAuthenticatedUserParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsDeleteArchiveForAuthenticatedUser(\n    params: github.MigrationsDeleteArchiveForAuthenticatedUserParams\n  ): Promise<github.MigrationsDeleteArchiveForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/migrations/${params.migration_id}/archive`)\n      .json<github.MigrationsDeleteArchiveForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Unlocks a repository. You can lock repositories when you [start a user migration](https://docs.github.com/rest/migrations/users#start-a-user-migration). Once the migration is complete you can unlock each repository to begin using it again or [delete the repository](https://docs.github.com/rest/repos/repos#delete-a-repository) if you no longer need the source data. Returns a status of `404 Not Found` if the repository is not locked.\n   */\n  @aiFunction({\n    name: 'github_migrations_unlock_repo_for_authenticated_user',\n    description: `Unlocks a repository. You can lock repositories when you [start a user migration](https://docs.github.com/rest/migrations/users#start-a-user-migration). Once the migration is complete you can unlock each repository to begin using it again or [delete the repository](https://docs.github.com/rest/repos/repos#delete-a-repository) if you no longer need the source data. Returns a status of \\`404 Not Found\\` if the repository is not locked.`,\n    inputSchema: github.MigrationsUnlockRepoForAuthenticatedUserParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsUnlockRepoForAuthenticatedUser(\n    params: github.MigrationsUnlockRepoForAuthenticatedUserParams\n  ): Promise<github.MigrationsUnlockRepoForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(\n        `/user/migrations/${params.migration_id}/repos/${params.repo_name}/lock`,\n        {}\n      )\n      .json<github.MigrationsUnlockRepoForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists all the repositories for this user migration.\n   */\n  @aiFunction({\n    name: 'github_migrations_list_repos_for_authenticated_user',\n    description: `Lists all the repositories for this user migration.`,\n    inputSchema: github.MigrationsListReposForAuthenticatedUserParamsSchema,\n    tags: ['migrations']\n  })\n  async migrationsListReposForAuthenticatedUser(\n    params: github.MigrationsListReposForAuthenticatedUserParams\n  ): Promise<github.MigrationsListReposForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/migrations/${params.migration_id}/repositories`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.MigrationsListReposForAuthenticatedUserResponse>()\n  }\n\n  /**\n * List organizations for the authenticated user.\n\nFor OAuth app tokens and personal access tokens (classic), this endpoint only lists organizations that your authorization allows you to operate on in some way (e.g., you can list teams with `read:org` scope, you can publicize your organization membership with `user` scope, etc.). Therefore, this API requires at least `user` or `read:org` scope for OAuth app tokens and personal access tokens (classic). Requests with insufficient scope will receive a `403 Forbidden` response.\n\n> [!NOTE]\n> Requests using a fine-grained access token will receive a `200 Success` response with an empty list.\n */\n  @aiFunction({\n    name: 'github_orgs_list_for_authenticated_user',\n    description: `List organizations for the authenticated user.\n\nFor OAuth app tokens and personal access tokens (classic), this endpoint only lists organizations that your authorization allows you to operate on in some way (e.g., you can list teams with \\`read:org\\` scope, you can publicize your organization membership with \\`user\\` scope, etc.). Therefore, this API requires at least \\`user\\` or \\`read:org\\` scope for OAuth app tokens and personal access tokens (classic). Requests with insufficient scope will receive a \\`403 Forbidden\\` response.\n\n> [!NOTE]\n> Requests using a fine-grained access token will receive a \\`200 Success\\` response with an empty list.`,\n    inputSchema: github.OrgsListForAuthenticatedUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListForAuthenticatedUser(\n    params: github.OrgsListForAuthenticatedUserParams\n  ): Promise<github.OrgsListForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/orgs', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsListForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists packages owned by the authenticated user within the user's namespace.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_list_packages_for_authenticated_user',\n    description: `Lists packages owned by the authenticated user within the user's namespace.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesListPackagesForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesListPackagesForAuthenticatedUser(\n    params: github.PackagesListPackagesForAuthenticatedUserParams\n  ): Promise<github.PackagesListPackagesForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/packages', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'package_type', 'visibility', 'page', 'per_page')\n        )\n      })\n      .json<github.PackagesListPackagesForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets a specific package for a package owned by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_package_for_authenticated_user',\n    description: `Gets a specific package for a package owned by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesGetPackageForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetPackageForAuthenticatedUser(\n    params: github.PackagesGetPackageForAuthenticatedUserParams\n  ): Promise<github.PackagesGetPackageForAuthenticatedUserResponse> {\n    return this.ky\n      .get(\n        `/user/packages/${params.package_type}/${params.package_name}`,\n        {}\n      )\n      .json<github.PackagesGetPackageForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Deletes a package owned by the authenticated user. You cannot delete a public package if any version of the package has more than 5,000 downloads. In this scenario, contact GitHub support for further assistance.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `delete:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_delete_package_for_authenticated_user',\n    description: `Deletes a package owned by the authenticated user. You cannot delete a public package if any version of the package has more than 5,000 downloads. In this scenario, contact GitHub support for further assistance.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`delete:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesDeletePackageForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesDeletePackageForAuthenticatedUser(\n    params: github.PackagesDeletePackageForAuthenticatedUserParams\n  ): Promise<github.PackagesDeletePackageForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(\n        `/user/packages/${params.package_type}/${params.package_name}`,\n        {}\n      )\n      .json<github.PackagesDeletePackageForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Restores a package owned by the authenticated user.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `write:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_restore_package_for_authenticated_user',\n    description: `Restores a package owned by the authenticated user.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`write:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesRestorePackageForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesRestorePackageForAuthenticatedUser(\n    params: github.PackagesRestorePackageForAuthenticatedUserParams\n  ): Promise<github.PackagesRestorePackageForAuthenticatedUserResponse> {\n    return this.ky\n      .post(\n        `/user/packages/${params.package_type}/${params.package_name}/restore`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'token'))\n        }\n      )\n      .json<github.PackagesRestorePackageForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists package versions for a package owned by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_all_package_versions_for_package_owned_by_authenticated_user',\n    description: `Lists package versions for a package owned by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema:\n      github.PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUser(\n    params: github.PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserParams\n  ): Promise<github.PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserResponse> {\n    return this.ky\n      .get(\n        `/user/packages/${params.package_type}/${params.package_name}/versions`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'page', 'per_page', 'state')\n          )\n        }\n      )\n      .json<github.PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets a specific package version for a package owned by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_package_version_for_authenticated_user',\n    description: `Gets a specific package version for a package owned by the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema:\n      github.PackagesGetPackageVersionForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetPackageVersionForAuthenticatedUser(\n    params: github.PackagesGetPackageVersionForAuthenticatedUserParams\n  ): Promise<github.PackagesGetPackageVersionForAuthenticatedUserResponse> {\n    return this.ky\n      .get(\n        `/user/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}`,\n        {}\n      )\n      .json<github.PackagesGetPackageVersionForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Deletes a specific package version for a package owned by the authenticated user.  If the package is public and the package version has more than 5,000 downloads, you cannot delete the package version. In this scenario, contact GitHub support for further assistance.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `delete:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_delete_package_version_for_authenticated_user',\n    description: `Deletes a specific package version for a package owned by the authenticated user.  If the package is public and the package version has more than 5,000 downloads, you cannot delete the package version. In this scenario, contact GitHub support for further assistance.\n\nThe authenticated user must have admin permissions in the organization to use this endpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`delete:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema:\n      github.PackagesDeletePackageVersionForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesDeletePackageVersionForAuthenticatedUser(\n    params: github.PackagesDeletePackageVersionForAuthenticatedUserParams\n  ): Promise<github.PackagesDeletePackageVersionForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(\n        `/user/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}`,\n        {}\n      )\n      .json<github.PackagesDeletePackageVersionForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Restores a package version owned by the authenticated user.\n\nYou can restore a deleted package version under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `write:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_restore_package_version_for_authenticated_user',\n    description: `Restores a package version owned by the authenticated user.\n\nYou can restore a deleted package version under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`write:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema:\n      github.PackagesRestorePackageVersionForAuthenticatedUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesRestorePackageVersionForAuthenticatedUser(\n    params: github.PackagesRestorePackageVersionForAuthenticatedUserParams\n  ): Promise<github.PackagesRestorePackageVersionForAuthenticatedUserResponse> {\n    return this.ky\n      .post(\n        `/user/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}/restore`,\n        {}\n      )\n      .json<github.PackagesRestorePackageVersionForAuthenticatedUserResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_create_for_authenticated_user',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsCreateForAuthenticatedUserParamsSchema,\n    tags: ['projects']\n  })\n  async projectsCreateForAuthenticatedUser(\n    params: github.ProjectsCreateForAuthenticatedUserParams\n  ): Promise<github.ProjectsCreateForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/projects', {\n        json: pick(params, 'name', 'body')\n      })\n      .json<github.ProjectsCreateForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists your publicly visible email address, which you can set with the\n[Set primary email visibility for the authenticated user](https://docs.github.com/rest/users/emails#set-primary-email-visibility-for-the-authenticated-user)\nendpoint.\n\nOAuth app tokens and personal access tokens (classic) need the `user:email` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_list_public_emails_for_authenticated_user',\n    description: `Lists your publicly visible email address, which you can set with the\n[Set primary email visibility for the authenticated user](https://docs.github.com/rest/users/emails#set-primary-email-visibility-for-the-authenticated-user)\nendpoint.\n\nOAuth app tokens and personal access tokens (classic) need the \\`user:email\\` scope to use this endpoint.`,\n    inputSchema: github.UsersListPublicEmailsForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListPublicEmailsForAuthenticatedUser(\n    params: github.UsersListPublicEmailsForAuthenticatedUserParams\n  ): Promise<github.UsersListPublicEmailsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/public_emails', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListPublicEmailsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists repositories that the authenticated user has explicit permission (`:read`, `:write`, or `:admin`) to access.\n\nThe authenticated user has explicit permission to access repositories they own, repositories where they are a collaborator, and repositories that they can access through an organization membership.\n */\n  @aiFunction({\n    name: 'github_repos_list_for_authenticated_user',\n    description: `Lists repositories that the authenticated user has explicit permission (\\`:read\\`, \\`:write\\`, or \\`:admin\\`) to access.\n\nThe authenticated user has explicit permission to access repositories they own, repositories where they are a collaborator, and repositories that they can access through an organization membership.`,\n    inputSchema: github.ReposListForAuthenticatedUserParamsSchema,\n    tags: ['repos']\n  })\n  async reposListForAuthenticatedUser(\n    params: github.ReposListForAuthenticatedUserParams\n  ): Promise<github.ReposListForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/repos', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'visibility',\n            'affiliation',\n            'type',\n            'sort',\n            'direction',\n            'per_page',\n            'page',\n            'since',\n            'before'\n          )\n        )\n      })\n      .json<github.ReposListForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Creates a new repository for the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the `public_repo` or `repo` scope to create a public repository, and `repo` scope to create a private repository.\n */\n  @aiFunction({\n    name: 'github_repos_create_for_authenticated_user',\n    description: `Creates a new repository for the authenticated user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`public_repo\\` or \\`repo\\` scope to create a public repository, and \\`repo\\` scope to create a private repository.`,\n    inputSchema: github.ReposCreateForAuthenticatedUserParamsSchema,\n    tags: ['repos']\n  })\n  async reposCreateForAuthenticatedUser(\n    params: github.ReposCreateForAuthenticatedUserParams\n  ): Promise<github.ReposCreateForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/repos', {\n        json: pick(\n          params,\n          'name',\n          'description',\n          'homepage',\n          'private',\n          'has_issues',\n          'has_projects',\n          'has_wiki',\n          'has_discussions',\n          'team_id',\n          'auto_init',\n          'gitignore_template',\n          'license_template',\n          'allow_squash_merge',\n          'allow_merge_commit',\n          'allow_rebase_merge',\n          'allow_auto_merge',\n          'delete_branch_on_merge',\n          'squash_merge_commit_title',\n          'squash_merge_commit_message',\n          'merge_commit_title',\n          'merge_commit_message',\n          'has_downloads',\n          'is_template'\n        )\n      })\n      .json<github.ReposCreateForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * When authenticating as a user, this endpoint will list all currently open repository invitations for that user.\n   */\n  @aiFunction({\n    name: 'github_repos_list_invitations_for_authenticated_user',\n    description: `When authenticating as a user, this endpoint will list all currently open repository invitations for that user.`,\n    inputSchema: github.ReposListInvitationsForAuthenticatedUserParamsSchema,\n    tags: ['repos']\n  })\n  async reposListInvitationsForAuthenticatedUser(\n    params: github.ReposListInvitationsForAuthenticatedUserParams\n  ): Promise<github.ReposListInvitationsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/repository_invitations', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ReposListInvitationsForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Decline a repository invitation.\n   */\n  @aiFunction({\n    name: 'github_repos_decline_invitation_for_authenticated_user',\n    description: `Decline a repository invitation.`,\n    inputSchema: github.ReposDeclineInvitationForAuthenticatedUserParamsSchema,\n    tags: ['repos']\n  })\n  async reposDeclineInvitationForAuthenticatedUser(\n    params: github.ReposDeclineInvitationForAuthenticatedUserParams\n  ): Promise<github.ReposDeclineInvitationForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/repository_invitations/${params.invitation_id}`)\n      .json<github.ReposDeclineInvitationForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Accept a repository invitation.\n   */\n  @aiFunction({\n    name: 'github_repos_accept_invitation_for_authenticated_user',\n    description: `Accept a repository invitation.`,\n    inputSchema: github.ReposAcceptInvitationForAuthenticatedUserParamsSchema,\n    tags: ['repos']\n  })\n  async reposAcceptInvitationForAuthenticatedUser(\n    params: github.ReposAcceptInvitationForAuthenticatedUserParams\n  ): Promise<github.ReposAcceptInvitationForAuthenticatedUserResponse> {\n    return this.ky\n      .patch(`/user/repository_invitations/${params.invitation_id}`)\n      .json<github.ReposAcceptInvitationForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists all of your social accounts.\n   */\n  @aiFunction({\n    name: 'github_users_list_social_accounts_for_authenticated_user',\n    description: `Lists all of your social accounts.`,\n    inputSchema: github.UsersListSocialAccountsForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListSocialAccountsForAuthenticatedUser(\n    params: github.UsersListSocialAccountsForAuthenticatedUserParams\n  ): Promise<github.UsersListSocialAccountsForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/social_accounts', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListSocialAccountsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Add one or more social accounts to the authenticated user's profile.\n\nOAuth app tokens and personal access tokens (classic) need the `user` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_add_social_account_for_authenticated_user',\n    description: `Add one or more social accounts to the authenticated user's profile.\n\nOAuth app tokens and personal access tokens (classic) need the \\`user\\` scope to use this endpoint.`,\n    inputSchema: github.UsersAddSocialAccountForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersAddSocialAccountForAuthenticatedUser(\n    params: github.UsersAddSocialAccountForAuthenticatedUserParams\n  ): Promise<github.UsersAddSocialAccountForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/social_accounts', {\n        json: params\n      })\n      .json<github.UsersAddSocialAccountForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Deletes one or more social accounts from the authenticated user's profile.\n\nOAuth app tokens and personal access tokens (classic) need the `user` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_delete_social_account_for_authenticated_user',\n    description: `Deletes one or more social accounts from the authenticated user's profile.\n\nOAuth app tokens and personal access tokens (classic) need the \\`user\\` scope to use this endpoint.`,\n    inputSchema:\n      github.UsersDeleteSocialAccountForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersDeleteSocialAccountForAuthenticatedUser(\n    params: github.UsersDeleteSocialAccountForAuthenticatedUserParams\n  ): Promise<github.UsersDeleteSocialAccountForAuthenticatedUserResponse> {\n    return this.ky\n      .delete('/user/social_accounts', {\n        json: params\n      })\n      .json<github.UsersDeleteSocialAccountForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists the SSH signing keys for the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `read:ssh_signing_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_list_ssh_signing_keys_for_authenticated_user',\n    description: `Lists the SSH signing keys for the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:ssh_signing_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersListSshSigningKeysForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListSshSigningKeysForAuthenticatedUser(\n    params: github.UsersListSshSigningKeysForAuthenticatedUserParams\n  ): Promise<github.UsersListSshSigningKeysForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/ssh_signing_keys', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListSshSigningKeysForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Creates an SSH signing key for the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `write:ssh_signing_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_create_ssh_signing_key_for_authenticated_user',\n    description: `Creates an SSH signing key for the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`write:ssh_signing_key\\` scope to use this endpoint.`,\n    inputSchema:\n      github.UsersCreateSshSigningKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersCreateSshSigningKeyForAuthenticatedUser(\n    params: github.UsersCreateSshSigningKeyForAuthenticatedUserParams\n  ): Promise<github.UsersCreateSshSigningKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .post('/user/ssh_signing_keys', {\n        json: pick(params, 'title', 'key')\n      })\n      .json<github.UsersCreateSshSigningKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Gets extended details for an SSH signing key.\n\nOAuth app tokens and personal access tokens (classic) need the `read:ssh_signing_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_get_ssh_signing_key_for_authenticated_user',\n    description: `Gets extended details for an SSH signing key.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:ssh_signing_key\\` scope to use this endpoint.`,\n    inputSchema: github.UsersGetSshSigningKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersGetSshSigningKeyForAuthenticatedUser(\n    params: github.UsersGetSshSigningKeyForAuthenticatedUserParams\n  ): Promise<github.UsersGetSshSigningKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/ssh_signing_keys/${params.ssh_signing_key_id}`)\n      .json<github.UsersGetSshSigningKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Deletes an SSH signing key from the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the `admin:ssh_signing_key` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_delete_ssh_signing_key_for_authenticated_user',\n    description: `Deletes an SSH signing key from the authenticated user's GitHub account.\n\nOAuth app tokens and personal access tokens (classic) need the \\`admin:ssh_signing_key\\` scope to use this endpoint.`,\n    inputSchema:\n      github.UsersDeleteSshSigningKeyForAuthenticatedUserParamsSchema,\n    tags: ['users']\n  })\n  async usersDeleteSshSigningKeyForAuthenticatedUser(\n    params: github.UsersDeleteSshSigningKeyForAuthenticatedUserParams\n  ): Promise<github.UsersDeleteSshSigningKeyForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/ssh_signing_keys/${params.ssh_signing_key_id}`)\n      .json<github.UsersDeleteSshSigningKeyForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Lists repositories the authenticated user has starred.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.star+json`**: Includes a timestamp of when the star was created.\n */\n  @aiFunction({\n    name: 'github_activity_list_repos_starred_by_authenticated_user',\n    description: `Lists repositories the authenticated user has starred.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.star+json\\`**: Includes a timestamp of when the star was created.`,\n    inputSchema: github.ActivityListReposStarredByAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListReposStarredByAuthenticatedUser(\n    params: github.ActivityListReposStarredByAuthenticatedUserParams\n  ): Promise<github.ActivityListReposStarredByAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/starred', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sort', 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.ActivityListReposStarredByAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Whether the authenticated user has starred the repository.\n   */\n  @aiFunction({\n    name: 'github_activity_check_repo_is_starred_by_authenticated_user',\n    description: `Whether the authenticated user has starred the repository.`,\n    inputSchema:\n      github.ActivityCheckRepoIsStarredByAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityCheckRepoIsStarredByAuthenticatedUser(\n    params: github.ActivityCheckRepoIsStarredByAuthenticatedUserParams\n  ): Promise<github.ActivityCheckRepoIsStarredByAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/user/starred/${params.owner}/${params.repo}`, {})\n      .json<github.ActivityCheckRepoIsStarredByAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Note that you'll need to set `Content-Length` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".\n   */\n  @aiFunction({\n    name: 'github_activity_star_repo_for_authenticated_user',\n    description: `Note that you'll need to set \\`Content-Length\\` to zero when calling out to this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\".`,\n    inputSchema: github.ActivityStarRepoForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityStarRepoForAuthenticatedUser(\n    params: github.ActivityStarRepoForAuthenticatedUserParams\n  ): Promise<github.ActivityStarRepoForAuthenticatedUserResponse> {\n    return this.ky\n      .put(`/user/starred/${params.owner}/${params.repo}`, {})\n      .json<github.ActivityStarRepoForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Unstar a repository that the authenticated user has previously starred.\n   */\n  @aiFunction({\n    name: 'github_activity_unstar_repo_for_authenticated_user',\n    description: `Unstar a repository that the authenticated user has previously starred.`,\n    inputSchema: github.ActivityUnstarRepoForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityUnstarRepoForAuthenticatedUser(\n    params: github.ActivityUnstarRepoForAuthenticatedUserParams\n  ): Promise<github.ActivityUnstarRepoForAuthenticatedUserResponse> {\n    return this.ky\n      .delete(`/user/starred/${params.owner}/${params.repo}`, {})\n      .json<github.ActivityUnstarRepoForAuthenticatedUserResponse>()\n  }\n\n  /**\n   * Lists repositories the authenticated user is watching.\n   */\n  @aiFunction({\n    name: 'github_activity_list_watched_repos_for_authenticated_user',\n    description: `Lists repositories the authenticated user is watching.`,\n    inputSchema:\n      github.ActivityListWatchedReposForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListWatchedReposForAuthenticatedUser(\n    params: github.ActivityListWatchedReposForAuthenticatedUserParams\n  ): Promise<github.ActivityListWatchedReposForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/subscriptions', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListWatchedReposForAuthenticatedUserResponse>()\n  }\n\n  /**\n * List all of the teams across all of the organizations to which the authenticated\nuser belongs.\n\nOAuth app tokens and personal access tokens (classic) need the `user`, `repo`, or `read:org` scope to use this endpoint.\n\nWhen using a fine-grained personal access token, the resource owner of the token must be a single organization, and the response will only include the teams from that organization.\n */\n  @aiFunction({\n    name: 'github_teams_list_for_authenticated_user',\n    description: `List all of the teams across all of the organizations to which the authenticated\nuser belongs.\n\nOAuth app tokens and personal access tokens (classic) need the \\`user\\`, \\`repo\\`, or \\`read:org\\` scope to use this endpoint.\n\nWhen using a fine-grained personal access token, the resource owner of the token must be a single organization, and the response will only include the teams from that organization.`,\n    inputSchema: github.TeamsListForAuthenticatedUserParamsSchema,\n    tags: ['teams']\n  })\n  async teamsListForAuthenticatedUser(\n    params: github.TeamsListForAuthenticatedUserParams\n  ): Promise<github.TeamsListForAuthenticatedUserResponse> {\n    return this.ky\n      .get('/user/teams', {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.TeamsListForAuthenticatedUserResponse>()\n  }\n\n  /**\n * Provides publicly available information about someone with a GitHub account. This method takes their durable user `ID` instead of their `login`, which can change over time.\n\nIf you are requesting information about an [Enterprise Managed User](https://docs.github.com/enterprise-cloud@latest/admin/managing-iam/understanding-iam-for-enterprises/about-enterprise-managed-users), or a GitHub App bot that is installed in an organization that uses Enterprise Managed Users, your requests must be authenticated as a user or GitHub App that has access to the organization to view that account's information. If you are not authorized, the request will return a `404 Not Found` status.\n\nThe `email` key in the following response is the publicly visible email address from your GitHub [profile page](https://github.com/settings/profile). When setting up your profile, you can select a primary email address to be public which provides an email entry for this endpoint. If you do not set a public email address for `email`, then it will have a value of `null`. You only see publicly visible email addresses when authenticated with GitHub. For more information, see [Authentication](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#authentication).\n\nThe Emails API enables you to list all of your email addresses, and toggle a primary email to be visible publicly. For more information, see [Emails API](https://docs.github.com/rest/users/emails).\n */\n  @aiFunction({\n    name: 'github_users_get_by_id',\n    description: `Provides publicly available information about someone with a GitHub account. This method takes their durable user \\`ID\\` instead of their \\`login\\`, which can change over time.\n\nIf you are requesting information about an [Enterprise Managed User](https://docs.github.com/enterprise-cloud@latest/admin/managing-iam/understanding-iam-for-enterprises/about-enterprise-managed-users), or a GitHub App bot that is installed in an organization that uses Enterprise Managed Users, your requests must be authenticated as a user or GitHub App that has access to the organization to view that account's information. If you are not authorized, the request will return a \\`404 Not Found\\` status.\n\nThe \\`email\\` key in the following response is the publicly visible email address from your GitHub [profile page](https://github.com/settings/profile). When setting up your profile, you can select a primary email address to be public which provides an email entry for this endpoint. If you do not set a public email address for \\`email\\`, then it will have a value of \\`null\\`. You only see publicly visible email addresses when authenticated with GitHub. For more information, see [Authentication](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#authentication).\n\nThe Emails API enables you to list all of your email addresses, and toggle a primary email to be visible publicly. For more information, see [Emails API](https://docs.github.com/rest/users/emails).`,\n    inputSchema: github.UsersGetByIdParamsSchema,\n    tags: ['users']\n  })\n  async usersGetById(\n    params: github.UsersGetByIdParams\n  ): Promise<github.UsersGetByIdResponse> {\n    return this.ky\n      .get(`/user/${params.account_id}`)\n      .json<github.UsersGetByIdResponse>()\n  }\n\n  /**\n * Lists all users, in the order that they signed up on GitHub. This list includes personal user accounts and organization accounts.\n\nNote: Pagination is powered exclusively by the `since` parameter. Use the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers) to get the URL for the next page of users.\n */\n  @aiFunction({\n    name: 'github_users_list',\n    description: `Lists all users, in the order that they signed up on GitHub. This list includes personal user accounts and organization accounts.\n\nNote: Pagination is powered exclusively by the \\`since\\` parameter. Use the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers) to get the URL for the next page of users.`,\n    inputSchema: github.UsersListParamsSchema,\n    tags: ['users']\n  })\n  async usersList(\n    params: github.UsersListParams\n  ): Promise<github.UsersListResponse> {\n    return this.ky\n      .get('/users', {\n        searchParams: sanitizeSearchParams(pick(params, 'since', 'per_page'))\n      })\n      .json<github.UsersListResponse>()\n  }\n\n  /**\n * Provides publicly available information about someone with a GitHub account.\n\nIf you are requesting information about an [Enterprise Managed User](https://docs.github.com/enterprise-cloud@latest/admin/managing-iam/understanding-iam-for-enterprises/about-enterprise-managed-users), or a GitHub App bot that is installed in an organization that uses Enterprise Managed Users, your requests must be authenticated as a user or GitHub App that has access to the organization to view that account's information. If you are not authorized, the request will return a `404 Not Found` status.\n\nThe `email` key in the following response is the publicly visible email address from your GitHub [profile page](https://github.com/settings/profile). When setting up your profile, you can select a primary email address to be public which provides an email entry for this endpoint. If you do not set a public email address for `email`, then it will have a value of `null`. You only see publicly visible email addresses when authenticated with GitHub. For more information, see [Authentication](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#authentication).\n\nThe Emails API enables you to list all of your email addresses, and toggle a primary email to be visible publicly. For more information, see [Emails API](https://docs.github.com/rest/users/emails).\n */\n  @aiFunction({\n    name: 'github_users_get_by_username',\n    description: `Provides publicly available information about someone with a GitHub account.\n\nIf you are requesting information about an [Enterprise Managed User](https://docs.github.com/enterprise-cloud@latest/admin/managing-iam/understanding-iam-for-enterprises/about-enterprise-managed-users), or a GitHub App bot that is installed in an organization that uses Enterprise Managed Users, your requests must be authenticated as a user or GitHub App that has access to the organization to view that account's information. If you are not authorized, the request will return a \\`404 Not Found\\` status.\n\nThe \\`email\\` key in the following response is the publicly visible email address from your GitHub [profile page](https://github.com/settings/profile). When setting up your profile, you can select a primary email address to be public which provides an email entry for this endpoint. If you do not set a public email address for \\`email\\`, then it will have a value of \\`null\\`. You only see publicly visible email addresses when authenticated with GitHub. For more information, see [Authentication](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#authentication).\n\nThe Emails API enables you to list all of your email addresses, and toggle a primary email to be visible publicly. For more information, see [Emails API](https://docs.github.com/rest/users/emails).`,\n    inputSchema: github.UsersGetByUsernameParamsSchema,\n    tags: ['users']\n  })\n  async usersGetByUsername(\n    params: github.UsersGetByUsernameParams\n  ): Promise<github.UsersGetByUsernameResponse> {\n    return this.ky\n      .get(`/users/${params.username}`)\n      .json<github.UsersGetByUsernameResponse>()\n  }\n\n  /**\n * List a collection of artifact attestations with a given subject digest that are associated with repositories owned by a user.\n\nThe collection of attestations returned by this endpoint is filtered according to the authenticated user's permissions; if the authenticated user cannot read a repository, the attestations associated with that repository will not be included in the response. In addition, when using a fine-grained access token the `attestations:read` permission is required.\n\n**Please note:** in order to offer meaningful security benefits, an attestation's signature and timestamps **must** be cryptographically verified, and the identity of the attestation signer **must** be validated. Attestations can be verified using the [GitHub CLI `attestation verify` command](https://cli.github.com/manual/gh_attestation_verify). For more information, see [our guide on how to use artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n */\n  @aiFunction({\n    name: 'github_users_list_attestations',\n    description: `List a collection of artifact attestations with a given subject digest that are associated with repositories owned by a user.\n\nThe collection of attestations returned by this endpoint is filtered according to the authenticated user's permissions; if the authenticated user cannot read a repository, the attestations associated with that repository will not be included in the response. In addition, when using a fine-grained access token the \\`attestations:read\\` permission is required.\n\n**Please note:** in order to offer meaningful security benefits, an attestation's signature and timestamps **must** be cryptographically verified, and the identity of the attestation signer **must** be validated. Attestations can be verified using the [GitHub CLI \\`attestation verify\\` command](https://cli.github.com/manual/gh_attestation_verify). For more information, see [our guide on how to use artifact attestations to establish a build's provenance](https://docs.github.com/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).`,\n    inputSchema: github.UsersListAttestationsParamsSchema,\n    tags: ['users']\n  })\n  async usersListAttestations(\n    params: github.UsersListAttestationsParams\n  ): Promise<github.UsersListAttestationsResponse> {\n    return this.ky\n      .get(\n        `/users/${params.username}/attestations/${params.subject_digest}`,\n        {\n          searchParams: sanitizeSearchParams(\n            pick(params, 'per_page', 'before', 'after', 'predicate_type')\n          )\n        }\n      )\n      .json<github.UsersListAttestationsResponse>()\n  }\n\n  /**\n * Lists all packages that are in a specific user's namespace, that the requesting user has access to, and that encountered a conflict during Docker migration.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_packages_list_docker_migration_conflicting_packages_for_user',\n    description: `Lists all packages that are in a specific user's namespace, that the requesting user has access to, and that encountered a conflict during Docker migration.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint.`,\n    inputSchema:\n      github.PackagesListDockerMigrationConflictingPackagesForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesListDockerMigrationConflictingPackagesForUser(\n    params: github.PackagesListDockerMigrationConflictingPackagesForUserParams\n  ): Promise<github.PackagesListDockerMigrationConflictingPackagesForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/docker/conflicts`)\n      .json<github.PackagesListDockerMigrationConflictingPackagesForUserResponse>()\n  }\n\n  /**\n * If you are authenticated as the given user, you will see your private events. Otherwise, you'll only see public events. _Optional_: use the fine-grained token with following permission set to view private events: \"Events\" user permissions (read).\n\n> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_events_for_authenticated_user',\n    description: `If you are authenticated as the given user, you will see your private events. Otherwise, you'll only see public events. _Optional_: use the fine-grained token with following permission set to view private events: \"Events\" user permissions (read).\n\n> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListEventsForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListEventsForAuthenticatedUser(\n    params: github.ActivityListEventsForAuthenticatedUserParams\n  ): Promise<github.ActivityListEventsForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/events`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListEventsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * This is the user's organization dashboard. You must be authenticated as the user to view this.\n\n> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_org_events_for_authenticated_user',\n    description: `This is the user's organization dashboard. You must be authenticated as the user to view this.\n\n> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListOrgEventsForAuthenticatedUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListOrgEventsForAuthenticatedUser(\n    params: github.ActivityListOrgEventsForAuthenticatedUserParams\n  ): Promise<github.ActivityListOrgEventsForAuthenticatedUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/events/orgs/${params.org}`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListOrgEventsForAuthenticatedUserResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_public_events_for_user',\n    description: `> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListPublicEventsForUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListPublicEventsForUser(\n    params: github.ActivityListPublicEventsForUserParams\n  ): Promise<github.ActivityListPublicEventsForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/events/public`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListPublicEventsForUserResponse>()\n  }\n\n  /**\n   * Lists the people following the specified user.\n   */\n  @aiFunction({\n    name: 'github_users_list_followers_for_user',\n    description: `Lists the people following the specified user.`,\n    inputSchema: github.UsersListFollowersForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListFollowersForUser(\n    params: github.UsersListFollowersForUserParams\n  ): Promise<github.UsersListFollowersForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/followers`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListFollowersForUserResponse>()\n  }\n\n  /**\n   * Lists the people who the specified user follows.\n   */\n  @aiFunction({\n    name: 'github_users_list_following_for_user',\n    description: `Lists the people who the specified user follows.`,\n    inputSchema: github.UsersListFollowingForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListFollowingForUser(\n    params: github.UsersListFollowingForUserParams\n  ): Promise<github.UsersListFollowingForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/following`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListFollowingForUserResponse>()\n  }\n\n  /**\n   * Check if a user follows another user.\n   */\n  @aiFunction({\n    name: 'github_users_check_following_for_user',\n    description: `Check if a user follows another user.`,\n    inputSchema: github.UsersCheckFollowingForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersCheckFollowingForUser(\n    params: github.UsersCheckFollowingForUserParams\n  ): Promise<github.UsersCheckFollowingForUserResponse> {\n    return this.ky\n      .get(\n        `/users/${params.username}/following/${params.target_user}`,\n        {}\n      )\n      .json<github.UsersCheckFollowingForUserResponse>()\n  }\n\n  /**\n   * Lists public gists for the specified user:.\n   */\n  @aiFunction({\n    name: 'github_gists_list_for_user',\n    description: `Lists public gists for the specified user:.`,\n    inputSchema: github.GistsListForUserParamsSchema,\n    tags: ['gists']\n  })\n  async gistsListForUser(\n    params: github.GistsListForUserParams\n  ): Promise<github.GistsListForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/gists`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'since', 'per_page', 'page')\n        )\n      })\n      .json<github.GistsListForUserResponse>()\n  }\n\n  /**\n   * Lists the GPG keys for a user. This information is accessible by anyone.\n   */\n  @aiFunction({\n    name: 'github_users_list_gpg_keys_for_user',\n    description: `Lists the GPG keys for a user. This information is accessible by anyone.`,\n    inputSchema: github.UsersListGpgKeysForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListGpgKeysForUser(\n    params: github.UsersListGpgKeysForUserParams\n  ): Promise<github.UsersListGpgKeysForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/gpg_keys`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListGpgKeysForUserResponse>()\n  }\n\n  /**\n * Provides hovercard information. You can find out more about someone in relation to their pull requests, issues, repositories, and organizations.\n\n  The `subject_type` and `subject_id` parameters provide context for the person's hovercard, which returns more information than without the parameters. For example, if you wanted to find out more about `octocat` who owns the `Spoon-Knife` repository, you would use a `subject_type` value of `repository` and a `subject_id` value of `1300192` (the ID of the `Spoon-Knife` repository).\n\nOAuth app tokens and personal access tokens (classic) need the `repo` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_users_get_context_for_user',\n    description: `Provides hovercard information. You can find out more about someone in relation to their pull requests, issues, repositories, and organizations.\n\n  The \\`subject_type\\` and \\`subject_id\\` parameters provide context for the person's hovercard, which returns more information than without the parameters. For example, if you wanted to find out more about \\`octocat\\` who owns the \\`Spoon-Knife\\` repository, you would use a \\`subject_type\\` value of \\`repository\\` and a \\`subject_id\\` value of \\`1300192\\` (the ID of the \\`Spoon-Knife\\` repository).\n\nOAuth app tokens and personal access tokens (classic) need the \\`repo\\` scope to use this endpoint.`,\n    inputSchema: github.UsersGetContextForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersGetContextForUser(\n    params: github.UsersGetContextForUserParams\n  ): Promise<github.UsersGetContextForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/hovercard`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'subject_type', 'subject_id')\n        )\n      })\n      .json<github.UsersGetContextForUserResponse>()\n  }\n\n  /**\n * Enables an authenticated GitHub App to find the user’s installation information.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.\n */\n  @aiFunction({\n    name: 'github_apps_get_user_installation',\n    description: `Enables an authenticated GitHub App to find the user’s installation information.\n\nYou must use a [JWT](https://docs.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app) to access this endpoint.`,\n    inputSchema: github.AppsGetUserInstallationParamsSchema,\n    tags: ['apps']\n  })\n  async appsGetUserInstallation(\n    params: github.AppsGetUserInstallationParams\n  ): Promise<github.AppsGetUserInstallationResponse> {\n    return this.ky\n      .get(`/users/${params.username}/installation`)\n      .json<github.AppsGetUserInstallationResponse>()\n  }\n\n  /**\n   * Lists the _verified_ public SSH keys for a user. This is accessible by anyone.\n   */\n  @aiFunction({\n    name: 'github_users_list_public_keys_for_user',\n    description: `Lists the _verified_ public SSH keys for a user. This is accessible by anyone.`,\n    inputSchema: github.UsersListPublicKeysForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListPublicKeysForUser(\n    params: github.UsersListPublicKeysForUserParams\n  ): Promise<github.UsersListPublicKeysForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/keys`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListPublicKeysForUserResponse>()\n  }\n\n  /**\n * List [public organization memberships](https://docs.github.com/articles/publicizing-or-concealing-organization-membership) for the specified user.\n\nThis method only lists _public_ memberships, regardless of authentication. If you need to fetch all of the organization memberships (public and private) for the authenticated user, use the [List organizations for the authenticated user](https://docs.github.com/rest/orgs/orgs#list-organizations-for-the-authenticated-user) API instead.\n */\n  @aiFunction({\n    name: 'github_orgs_list_for_user',\n    description: `List [public organization memberships](https://docs.github.com/articles/publicizing-or-concealing-organization-membership) for the specified user.\n\nThis method only lists _public_ memberships, regardless of authentication. If you need to fetch all of the organization memberships (public and private) for the authenticated user, use the [List organizations for the authenticated user](https://docs.github.com/rest/orgs/orgs#list-organizations-for-the-authenticated-user) API instead.`,\n    inputSchema: github.OrgsListForUserParamsSchema,\n    tags: ['orgs']\n  })\n  async orgsListForUser(\n    params: github.OrgsListForUserParams\n  ): Promise<github.OrgsListForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/orgs`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.OrgsListForUserResponse>()\n  }\n\n  /**\n * Lists all packages in a user's namespace for which the requesting user has access.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_list_packages_for_user',\n    description: `Lists all packages in a user's namespace for which the requesting user has access.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesListPackagesForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesListPackagesForUser(\n    params: github.PackagesListPackagesForUserParams\n  ): Promise<github.PackagesListPackagesForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/packages`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'package_type', 'visibility', 'page', 'per_page')\n        )\n      })\n      .json<github.PackagesListPackagesForUserResponse>()\n  }\n\n  /**\n * Gets a specific package metadata for a public package owned by a user.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_package_for_user',\n    description: `Gets a specific package metadata for a public package owned by a user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesGetPackageForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetPackageForUser(\n    params: github.PackagesGetPackageForUserParams\n  ): Promise<github.PackagesGetPackageForUserResponse> {\n    return this.ky\n      .get(\n        `/users/${params.username}/packages/${params.package_type}/${params.package_name}`,\n        {}\n      )\n      .json<github.PackagesGetPackageForUserResponse>()\n  }\n\n  /**\n * Deletes an entire package for a user. You cannot delete a public package if any version of the package has more than 5,000 downloads. In this scenario, contact GitHub support for further assistance.\n\nIf the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `delete:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_delete_package_for_user',\n    description: `Deletes an entire package for a user. You cannot delete a public package if any version of the package has more than 5,000 downloads. In this scenario, contact GitHub support for further assistance.\n\nIf the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`delete:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesDeletePackageForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesDeletePackageForUser(\n    params: github.PackagesDeletePackageForUserParams\n  ): Promise<github.PackagesDeletePackageForUserResponse> {\n    return this.ky\n      .delete(\n        `/users/${params.username}/packages/${params.package_type}/${params.package_name}`,\n        {}\n      )\n      .json<github.PackagesDeletePackageForUserResponse>()\n  }\n\n  /**\n * Restores an entire package for a user.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nIf the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `write:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_restore_package_for_user',\n    description: `Restores an entire package for a user.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nIf the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`write:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesRestorePackageForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesRestorePackageForUser(\n    params: github.PackagesRestorePackageForUserParams\n  ): Promise<github.PackagesRestorePackageForUserResponse> {\n    return this.ky\n      .post(\n        `/users/${params.username}/packages/${params.package_type}/${params.package_name}/restore`,\n        {\n          searchParams: sanitizeSearchParams(pick(params, 'token'))\n        }\n      )\n      .json<github.PackagesRestorePackageForUserResponse>()\n  }\n\n  /**\n * Lists package versions for a public package owned by a specified user.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_all_package_versions_for_package_owned_by_user',\n    description: `Lists package versions for a public package owned by a specified user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema:\n      github.PackagesGetAllPackageVersionsForPackageOwnedByUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetAllPackageVersionsForPackageOwnedByUser(\n    params: github.PackagesGetAllPackageVersionsForPackageOwnedByUserParams\n  ): Promise<github.PackagesGetAllPackageVersionsForPackageOwnedByUserResponse> {\n    return this.ky\n      .get(\n        `/users/${params.username}/packages/${params.package_type}/${params.package_name}/versions`,\n        {}\n      )\n      .json<github.PackagesGetAllPackageVersionsForPackageOwnedByUserResponse>()\n  }\n\n  /**\n * Gets a specific package version for a public package owned by a specified user.\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_get_package_version_for_user',\n    description: `Gets a specific package version for a public package owned by a specified user.\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` scope to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesGetPackageVersionForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesGetPackageVersionForUser(\n    params: github.PackagesGetPackageVersionForUserParams\n  ): Promise<github.PackagesGetPackageVersionForUserResponse> {\n    return this.ky\n      .get(\n        `/users/${params.username}/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}`,\n        {}\n      )\n      .json<github.PackagesGetPackageVersionForUserResponse>()\n  }\n\n  /**\n * Deletes a specific package version for a user. If the package is public and the package version has more than 5,000 downloads, you cannot delete the package version. In this scenario, contact GitHub support for further assistance.\n\nIf the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `delete:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_delete_package_version_for_user',\n    description: `Deletes a specific package version for a user. If the package is public and the package version has more than 5,000 downloads, you cannot delete the package version. In this scenario, contact GitHub support for further assistance.\n\nIf the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`delete:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesDeletePackageVersionForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesDeletePackageVersionForUser(\n    params: github.PackagesDeletePackageVersionForUserParams\n  ): Promise<github.PackagesDeletePackageVersionForUserResponse> {\n    return this.ky\n      .delete(\n        `/users/${params.username}/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}`,\n        {}\n      )\n      .json<github.PackagesDeletePackageVersionForUserResponse>()\n  }\n\n  /**\n * Restores a specific package version for a user.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nIf the `package_type` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `read:packages` and `write:packages` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".\n */\n  @aiFunction({\n    name: 'github_packages_restore_package_version_for_user',\n    description: `Restores a specific package version for a user.\n\nYou can restore a deleted package under the following conditions:\n  - The package was deleted within the last 30 days.\n  - The same package namespace and version is still available and not reused for a new package. If the same package namespace is not available, you will not be able to restore your package. In this scenario, to restore the deleted package, you must delete the new package that uses the deleted package's namespace first.\n\nIf the \\`package_type\\` belongs to a GitHub Packages registry that supports granular permissions, the authenticated user must have admin permissions to the package. For the list of these registries, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`read:packages\\` and \\`write:packages\\` scopes to use this endpoint. For more information, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages).\".`,\n    inputSchema: github.PackagesRestorePackageVersionForUserParamsSchema,\n    tags: ['packages']\n  })\n  async packagesRestorePackageVersionForUser(\n    params: github.PackagesRestorePackageVersionForUserParams\n  ): Promise<github.PackagesRestorePackageVersionForUserResponse> {\n    return this.ky\n      .post(\n        `/users/${params.username}/packages/${params.package_type}/${params.package_name}/versions/${params.package_version_id}/restore`,\n        {}\n      )\n      .json<github.PackagesRestorePackageVersionForUserResponse>()\n  }\n\n  /**\n * > [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.\n */\n  @aiFunction({\n    name: 'github_projects_list_for_user',\n    description: `> [!WARNING]\n> **Closing down notice:** Projects (classic) is being deprecated in favor of the new Projects experience.\n> See the [changelog](https://github.blog/changelog/2024-05-23-sunset-notice-projects-classic/) for more information.`,\n    inputSchema: github.ProjectsListForUserParamsSchema,\n    tags: ['projects']\n  })\n  async projectsListForUser(\n    params: github.ProjectsListForUserParams\n  ): Promise<github.ProjectsListForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/projects`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'state', 'per_page', 'page')\n        )\n      })\n      .json<github.ProjectsListForUserResponse>()\n  }\n\n  /**\n * These are events that you've received by watching repositories and following users. If you are authenticated as the\ngiven user, you will see private events. Otherwise, you'll only see public events.\n\n> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_received_events_for_user',\n    description: `These are events that you've received by watching repositories and following users. If you are authenticated as the\ngiven user, you will see private events. Otherwise, you'll only see public events.\n\n> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListReceivedEventsForUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListReceivedEventsForUser(\n    params: github.ActivityListReceivedEventsForUserParams\n  ): Promise<github.ActivityListReceivedEventsForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/received_events`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListReceivedEventsForUserResponse>()\n  }\n\n  /**\n * > [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.\n */\n  @aiFunction({\n    name: 'github_activity_list_received_public_events_for_user',\n    description: `> [!NOTE]\n> This API is not built to serve real-time use cases. Depending on the time of day, event latency can be anywhere from 30s to 6h.`,\n    inputSchema: github.ActivityListReceivedPublicEventsForUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListReceivedPublicEventsForUser(\n    params: github.ActivityListReceivedPublicEventsForUserParams\n  ): Promise<github.ActivityListReceivedPublicEventsForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/received_events/public`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListReceivedPublicEventsForUserResponse>()\n  }\n\n  /**\n   * Lists public repositories for the specified user.\n   */\n  @aiFunction({\n    name: 'github_repos_list_for_user',\n    description: `Lists public repositories for the specified user.`,\n    inputSchema: github.ReposListForUserParamsSchema,\n    tags: ['repos']\n  })\n  async reposListForUser(\n    params: github.ReposListForUserParams\n  ): Promise<github.ReposListForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/repos`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'type', 'sort', 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.ReposListForUserResponse>()\n  }\n\n  /**\n * Gets the summary of the free and paid GitHub Actions minutes used.\n\nPaid minutes only apply to workflows in private repositories that use GitHub-hosted runners. Minutes used is listed for each GitHub-hosted runner operating system. Any job re-runs are also included in the usage. The usage returned includes any minute multipliers for macOS and Windows runners, and is rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nOAuth app tokens and personal access tokens (classic) need the `user` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_billing_get_github_actions_billing_user',\n    description: `Gets the summary of the free and paid GitHub Actions minutes used.\n\nPaid minutes only apply to workflows in private repositories that use GitHub-hosted runners. Minutes used is listed for each GitHub-hosted runner operating system. Any job re-runs are also included in the usage. The usage returned includes any minute multipliers for macOS and Windows runners, and is rounded up to the nearest whole minute. For more information, see \"[Managing billing for GitHub Actions](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-actions)\".\n\nOAuth app tokens and personal access tokens (classic) need the \\`user\\` scope to use this endpoint.`,\n    inputSchema: github.BillingGetGithubActionsBillingUserParamsSchema,\n    tags: ['billing']\n  })\n  async billingGetGithubActionsBillingUser(\n    params: github.BillingGetGithubActionsBillingUserParams\n  ): Promise<github.BillingGetGithubActionsBillingUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/settings/billing/actions`)\n      .json<github.BillingGetGithubActionsBillingUserResponse>()\n  }\n\n  /**\n * Gets the free and paid storage used for GitHub Packages in gigabytes.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `user` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_billing_get_github_packages_billing_user',\n    description: `Gets the free and paid storage used for GitHub Packages in gigabytes.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`user\\` scope to use this endpoint.`,\n    inputSchema: github.BillingGetGithubPackagesBillingUserParamsSchema,\n    tags: ['billing']\n  })\n  async billingGetGithubPackagesBillingUser(\n    params: github.BillingGetGithubPackagesBillingUserParams\n  ): Promise<github.BillingGetGithubPackagesBillingUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/settings/billing/packages`)\n      .json<github.BillingGetGithubPackagesBillingUserResponse>()\n  }\n\n  /**\n * Gets the estimated paid and estimated total storage used for GitHub Actions and GitHub Packages.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the `user` scope to use this endpoint.\n */\n  @aiFunction({\n    name: 'github_billing_get_shared_storage_billing_user',\n    description: `Gets the estimated paid and estimated total storage used for GitHub Actions and GitHub Packages.\n\nPaid minutes only apply to packages stored for private repositories. For more information, see \"[Managing billing for GitHub Packages](https://docs.github.com/github/setting-up-and-managing-billing-and-payments-on-github/managing-billing-for-github-packages).\"\n\nOAuth app tokens and personal access tokens (classic) need the \\`user\\` scope to use this endpoint.`,\n    inputSchema: github.BillingGetSharedStorageBillingUserParamsSchema,\n    tags: ['billing']\n  })\n  async billingGetSharedStorageBillingUser(\n    params: github.BillingGetSharedStorageBillingUserParams\n  ): Promise<github.BillingGetSharedStorageBillingUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/settings/billing/shared-storage`)\n      .json<github.BillingGetSharedStorageBillingUserResponse>()\n  }\n\n  /**\n   * Lists social media accounts for a user. This endpoint is accessible by anyone.\n   */\n  @aiFunction({\n    name: 'github_users_list_social_accounts_for_user',\n    description: `Lists social media accounts for a user. This endpoint is accessible by anyone.`,\n    inputSchema: github.UsersListSocialAccountsForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListSocialAccountsForUser(\n    params: github.UsersListSocialAccountsForUserParams\n  ): Promise<github.UsersListSocialAccountsForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/social_accounts`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListSocialAccountsForUserResponse>()\n  }\n\n  /**\n   * Lists the SSH signing keys for a user. This operation is accessible by anyone.\n   */\n  @aiFunction({\n    name: 'github_users_list_ssh_signing_keys_for_user',\n    description: `Lists the SSH signing keys for a user. This operation is accessible by anyone.`,\n    inputSchema: github.UsersListSshSigningKeysForUserParamsSchema,\n    tags: ['users']\n  })\n  async usersListSshSigningKeysForUser(\n    params: github.UsersListSshSigningKeysForUserParams\n  ): Promise<github.UsersListSshSigningKeysForUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/ssh_signing_keys`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.UsersListSshSigningKeysForUserResponse>()\n  }\n\n  /**\n * Lists repositories a user has starred.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **`application/vnd.github.star+json`**: Includes a timestamp of when the star was created.\n */\n  @aiFunction({\n    name: 'github_activity_list_repos_starred_by_user',\n    description: `Lists repositories a user has starred.\n\nThis endpoint supports the following custom media types. For more information, see \"[Media types](https://docs.github.com/rest/using-the-rest-api/getting-started-with-the-rest-api#media-types).\"\n\n- **\\`application/vnd.github.star+json\\`**: Includes a timestamp of when the star was created.`,\n    inputSchema: github.ActivityListReposStarredByUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListReposStarredByUser(\n    params: github.ActivityListReposStarredByUserParams\n  ): Promise<github.ActivityListReposStarredByUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/starred`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'sort', 'direction', 'per_page', 'page')\n        )\n      })\n      .json<github.ActivityListReposStarredByUserResponse>()\n  }\n\n  /**\n   * Lists repositories a user is watching.\n   */\n  @aiFunction({\n    name: 'github_activity_list_repos_watched_by_user',\n    description: `Lists repositories a user is watching.`,\n    inputSchema: github.ActivityListReposWatchedByUserParamsSchema,\n    tags: ['activity']\n  })\n  async activityListReposWatchedByUser(\n    params: github.ActivityListReposWatchedByUserParams\n  ): Promise<github.ActivityListReposWatchedByUserResponse> {\n    return this.ky\n      .get(`/users/${params.username}/subscriptions`, {\n        searchParams: sanitizeSearchParams(pick(params, 'per_page', 'page'))\n      })\n      .json<github.ActivityListReposWatchedByUserResponse>()\n  }\n\n  /**\n   * Get all supported GitHub API versions.\n   */\n  @aiFunction({\n    name: 'github_meta_get_all_versions',\n    description: `Get all supported GitHub API versions.`,\n    inputSchema: github.MetaGetAllVersionsParamsSchema,\n    tags: ['meta']\n  })\n  async metaGetAllVersions(\n    _params: github.MetaGetAllVersionsParams\n  ): Promise<github.MetaGetAllVersionsResponse> {\n    return this.ky.get('/versions').json<github.MetaGetAllVersionsResponse>()\n  }\n\n  /**\n   * Get a random sentence from the Zen of GitHub.\n   */\n  @aiFunction({\n    name: 'github_meta_get_zen',\n    description: `Get a random sentence from the Zen of GitHub.`,\n    inputSchema: github.MetaGetZenParamsSchema,\n    tags: ['meta']\n  })\n  async metaGetZen(\n    _params: github.MetaGetZenParams\n  ): Promise<github.MetaGetZenResponse> {\n    return this.ky.get('/zen').json<github.MetaGetZenResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/github.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace github {\n  export const apiBaseUrl = 'https://api.github.com'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const RootSchema = z.object({\n    current_user_url: z.string(),\n    current_user_authorizations_html_url: z.string(),\n    authorizations_url: z.string(),\n    code_search_url: z.string(),\n    commit_search_url: z.string(),\n    emails_url: z.string(),\n    emojis_url: z.string(),\n    events_url: z.string(),\n    feeds_url: z.string(),\n    followers_url: z.string(),\n    following_url: z.string(),\n    gists_url: z.string(),\n    hub_url: z.string().optional(),\n    issue_search_url: z.string(),\n    issues_url: z.string(),\n    keys_url: z.string(),\n    label_search_url: z.string(),\n    notifications_url: z.string(),\n    organization_url: z.string(),\n    organization_repositories_url: z.string(),\n    organization_teams_url: z.string(),\n    public_gists_url: z.string(),\n    rate_limit_url: z.string(),\n    repository_url: z.string(),\n    repository_search_url: z.string(),\n    current_user_repositories_url: z.string(),\n    starred_url: z.string(),\n    starred_gists_url: z.string(),\n    topic_search_url: z.string().optional(),\n    user_url: z.string(),\n    user_organizations_url: z.string(),\n    user_repositories_url: z.string(),\n    user_search_url: z.string()\n  })\n  export type Root = z.infer<typeof RootSchema>\n\n  export const SecurityAdvisoryEcosystemsSchema = z\n    .enum([\n      'rubygems',\n      'npm',\n      'pip',\n      'maven',\n      'nuget',\n      'composer',\n      'go',\n      'rust',\n      'erlang',\n      'actions',\n      'pub',\n      'other',\n      'swift'\n    ])\n    .describe(\"The package's language or package management ecosystem.\")\n  export type SecurityAdvisoryEcosystems = z.infer<\n    typeof SecurityAdvisoryEcosystemsSchema\n  >\n\n  export const CvssSeveritiesSchema = z.object({\n    cvss_v3: z\n      .object({\n        vector_string: z.string().describe('The CVSS 3 vector string.'),\n        score: z\n          .number()\n          .gte(0)\n          .lte(10)\n          .describe('The CVSS 3 score.')\n          .readonly()\n      })\n      .optional(),\n    cvss_v4: z\n      .object({\n        vector_string: z.string().describe('The CVSS 4 vector string.'),\n        score: z\n          .number()\n          .gte(0)\n          .lte(10)\n          .describe('The CVSS 4 score.')\n          .readonly()\n      })\n      .optional()\n  })\n  export type CvssSeverities = z.infer<typeof CvssSeveritiesSchema>\n\n  export const SecurityAdvisoryEpssSchema = z\n    .object({\n      percentage: z.number().gte(0).lte(100).optional(),\n      percentile: z.number().gte(0).lte(100).optional()\n    })\n    .describe(\n      'The EPSS scores as calculated by the [Exploit Prediction Scoring System](https://www.first.org/epss).'\n    )\n    .readonly()\n  export type SecurityAdvisoryEpss = z.infer<typeof SecurityAdvisoryEpssSchema>\n\n  export const SimpleUserSchema = z\n    .object({\n      name: z.string().optional(),\n      email: z.string().optional(),\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      site_admin: z.boolean(),\n      starred_at: z.string().optional(),\n      user_view_type: z.string().optional()\n    })\n    .describe('A GitHub user.')\n  export type SimpleUser = z.infer<typeof SimpleUserSchema>\n\n  export const SecurityAdvisoryCreditTypesSchema = z\n    .enum([\n      'analyst',\n      'finder',\n      'reporter',\n      'coordinator',\n      'remediation_developer',\n      'remediation_reviewer',\n      'remediation_verifier',\n      'tool',\n      'sponsor',\n      'other'\n    ])\n    .describe('The type of credit the user is receiving.')\n  export type SecurityAdvisoryCreditTypes = z.infer<\n    typeof SecurityAdvisoryCreditTypesSchema\n  >\n\n  export const PaginationBeforeSchema = z\n    .any()\n    .describe(\n      'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n    )\n  export type PaginationBefore = z.infer<typeof PaginationBeforeSchema>\n\n  export const PaginationAfterSchema = z\n    .any()\n    .describe(\n      'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n    )\n  export type PaginationAfter = z.infer<typeof PaginationAfterSchema>\n\n  export const DirectionSchema = z\n    .any()\n    .describe('The direction to sort the results by.')\n  export type Direction = z.infer<typeof DirectionSchema>\n\n  export const GhsaIdSchema = z\n    .any()\n    .describe('The GHSA (GitHub Security Advisory) identifier of the advisory.')\n  export type GhsaId = z.infer<typeof GhsaIdSchema>\n\n  export const EnterpriseSchema = z\n    .any()\n    .describe(\n      'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n    )\n  export type Enterprise = z.infer<typeof EnterpriseSchema>\n\n  export const WebhookConfigUrlSchema = z\n    .string()\n    .url()\n    .describe('The URL to which the payloads will be delivered.')\n  export type WebhookConfigUrl = z.infer<typeof WebhookConfigUrlSchema>\n\n  export const WebhookConfigContentTypeSchema = z\n    .string()\n    .describe(\n      'The media type used to serialize the payloads. Supported values include `json` and `form`. The default is `form`.'\n    )\n  export type WebhookConfigContentType = z.infer<\n    typeof WebhookConfigContentTypeSchema\n  >\n\n  export const WebhookConfigSecretSchema = z\n    .string()\n    .describe(\n      'If provided, the `secret` will be used as the `key` to generate the HMAC hex digest value for [delivery signature headers](https://docs.github.com/webhooks/event-payloads/#delivery-headers).'\n    )\n  export type WebhookConfigSecret = z.infer<typeof WebhookConfigSecretSchema>\n\n  export const WebhookConfigInsecureSslSchema = z.union([\n    z\n      .string()\n      .describe(\n        'Determines whether the SSL certificate of the host for `url` will be verified when delivering payloads. Supported values include `0` (verification is performed) and `1` (verification is not performed). The default is `0`. **We strongly recommend not setting this to `1` as you are subject to man-in-the-middle and other attacks.**'\n      ),\n    z.number()\n  ])\n  export type WebhookConfigInsecureSsl = z.infer<\n    typeof WebhookConfigInsecureSslSchema\n  >\n\n  export const HookDeliveryItemSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the webhook delivery.'),\n      guid: z\n        .string()\n        .describe(\n          'Unique identifier for the event (shared with all deliveries for all webhooks that subscribe to this event).'\n        ),\n      delivered_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Time when the webhook delivery occurred.'),\n      redelivery: z\n        .boolean()\n        .describe('Whether the webhook delivery is a redelivery.'),\n      duration: z.number().describe('Time spent delivering.'),\n      status: z\n        .string()\n        .describe(\n          'Describes the response returned after attempting the delivery.'\n        ),\n      status_code: z\n        .number()\n        .int()\n        .describe('Status code received when delivery was made.'),\n      event: z.string().describe('The event that triggered the delivery.'),\n      action: z\n        .string()\n        .describe(\n          'The type of activity for the event that triggered the delivery.'\n        ),\n      installation_id: z\n        .number()\n        .int()\n        .describe(\n          'The id of the GitHub App installation associated with this event.'\n        ),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The id of the repository associated with this event.'),\n      throttled_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Time when the webhook delivery was throttled.')\n        .optional()\n    })\n    .describe(\n      'Delivery made by a webhook, without request and response information.'\n    )\n  export type HookDeliveryItem = z.infer<typeof HookDeliveryItemSchema>\n\n  export const PerPageSchema = z\n    .any()\n    .describe(\n      'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n    )\n  export type PerPage = z.infer<typeof PerPageSchema>\n\n  export const CursorSchema = z\n    .any()\n    .describe(\n      'Used for pagination: the starting delivery from which the page of deliveries is fetched. Refer to the `link` header for the next and previous page cursors.'\n    )\n  export type Cursor = z.infer<typeof CursorSchema>\n\n  export const HookDeliverySchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the delivery.'),\n      guid: z\n        .string()\n        .describe(\n          'Unique identifier for the event (shared with all deliveries for all webhooks that subscribe to this event).'\n        ),\n      delivered_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Time when the delivery was delivered.'),\n      redelivery: z.boolean().describe('Whether the delivery is a redelivery.'),\n      duration: z.number().describe('Time spent delivering.'),\n      status: z\n        .string()\n        .describe('Description of the status of the attempted delivery'),\n      status_code: z\n        .number()\n        .int()\n        .describe('Status code received when delivery was made.'),\n      event: z.string().describe('The event that triggered the delivery.'),\n      action: z\n        .string()\n        .describe(\n          'The type of activity for the event that triggered the delivery.'\n        ),\n      installation_id: z\n        .number()\n        .int()\n        .describe(\n          'The id of the GitHub App installation associated with this event.'\n        ),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The id of the repository associated with this event.'),\n      throttled_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Time when the webhook delivery was throttled.')\n        .optional(),\n      url: z.string().describe('The URL target of the delivery.').optional(),\n      request: z.object({\n        headers: z\n          .record(z.any())\n          .describe('The request headers sent with the webhook delivery.'),\n        payload: z.record(z.any()).describe('The webhook payload.')\n      }),\n      response: z.object({\n        headers: z\n          .record(z.any())\n          .describe(\n            'The response headers received when the delivery was made.'\n          ),\n        payload: z.string().describe('The response payload received.')\n      })\n    })\n    .describe('Delivery made by a webhook.')\n  export type HookDelivery = z.infer<typeof HookDeliverySchema>\n\n  export const DeliveryIdSchema = z.any()\n  export type DeliveryId = z.infer<typeof DeliveryIdSchema>\n\n  export const PageSchema = z\n    .object({\n      url: z\n        .string()\n        .url()\n        .describe('The API address for accessing this Page resource.'),\n      status: z\n        .enum(['built', 'building', 'errored'])\n        .describe('The status of the most recent build of the Page.'),\n      cname: z.string().describe(\"The Pages site's custom domain\"),\n      protected_domain_state: z\n        .enum(['pending', 'verified', 'unverified'])\n        .describe('The state if the domain is verified')\n        .optional(),\n      pending_domain_unverified_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The timestamp when a pending domain becomes unverified.')\n        .optional(),\n      custom_404: z\n        .boolean()\n        .describe('Whether the Page has a custom 404 page.')\n        .default(false),\n      html_url: z\n        .string()\n        .url()\n        .describe('The web address the Page can be accessed from.')\n        .optional(),\n      build_type: z\n        .enum(['legacy', 'workflow'])\n        .describe('The process in which the Page will be built.')\n        .optional(),\n      source: PagesSourceHashSchema.optional(),\n      public: z\n        .boolean()\n        .describe(\n          'Whether the GitHub Pages site is publicly visible. If set to `true`, the site is accessible to anyone on the internet. If set to `false`, the site will only be accessible to users who have at least `read` access to the repository that published the site.'\n        ),\n      https_certificate: PagesHttpsCertificateSchema.optional(),\n      https_enforced: z\n        .boolean()\n        .describe('Whether https is enabled on the domain')\n        .optional()\n    })\n    .describe('The configuration for GitHub Pages for a repository.')\n  export type Page = z.infer<typeof PageSchema>\n\n  export const AppPermissionsSchema = z\n    .object({\n      actions: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for GitHub Actions workflows, workflow runs, and artifacts.'\n        )\n        .optional(),\n      administration: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for repository creation, deletion, settings, teams, and collaborators creation.'\n        )\n        .optional(),\n      checks: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for checks on code.'\n        )\n        .optional(),\n      codespaces: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to create, edit, delete, and list Codespaces.'\n        )\n        .optional(),\n      contents: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for repository contents, commits, branches, downloads, releases, and merges.'\n        )\n        .optional(),\n      dependabot_secrets: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage Dependabot secrets.'\n        )\n        .optional(),\n      deployments: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for deployments and deployment statuses.'\n        )\n        .optional(),\n      environments: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for managing repository environments.'\n        )\n        .optional(),\n      issues: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for issues and related comments, assignees, labels, and milestones.'\n        )\n        .optional(),\n      metadata: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to search repositories, list collaborators, and access repository metadata.'\n        )\n        .optional(),\n      packages: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for packages published to GitHub Packages.'\n        )\n        .optional(),\n      pages: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to retrieve Pages statuses, configuration, and builds, as well as create new builds.'\n        )\n        .optional(),\n      pull_requests: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for pull requests and related comments, assignees, labels, milestones, and merges.'\n        )\n        .optional(),\n      repository_custom_properties: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and edit custom properties for a repository, when allowed by the property.'\n        )\n        .optional(),\n      repository_hooks: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage the post-receive hooks for a repository.'\n        )\n        .optional(),\n      repository_projects: z\n        .enum(['read', 'write', 'admin'])\n        .describe(\n          'The level of permission to grant the access token to manage repository projects, columns, and cards.'\n        )\n        .optional(),\n      secret_scanning_alerts: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and manage secret scanning alerts.'\n        )\n        .optional(),\n      secrets: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage repository secrets.'\n        )\n        .optional(),\n      security_events: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and manage security events like code scanning alerts.'\n        )\n        .optional(),\n      single_file: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage just a single file.'\n        )\n        .optional(),\n      statuses: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for commit statuses.'\n        )\n        .optional(),\n      vulnerability_alerts: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage Dependabot alerts.'\n        )\n        .optional(),\n      workflows: z\n        .literal('write')\n        .describe(\n          'The level of permission to grant the access token to update GitHub Actions workflow files.'\n        )\n        .optional(),\n      members: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for organization teams and members.'\n        )\n        .optional(),\n      organization_administration: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage access to an organization.'\n        )\n        .optional(),\n      organization_custom_roles: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for custom repository roles management.'\n        )\n        .optional(),\n      organization_custom_org_roles: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for custom organization roles management.'\n        )\n        .optional(),\n      organization_custom_properties: z\n        .enum(['read', 'write', 'admin'])\n        .describe(\n          'The level of permission to grant the access token for custom property management.'\n        )\n        .optional(),\n      organization_copilot_seat_management: z\n        .literal('write')\n        .describe(\n          'The level of permission to grant the access token for managing access to GitHub Copilot for members of an organization with a Copilot Business subscription. This property is in public preview and is subject to change.'\n        )\n        .optional(),\n      organization_announcement_banners: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and manage announcement banners for an organization.'\n        )\n        .optional(),\n      organization_events: z\n        .literal('read')\n        .describe(\n          'The level of permission to grant the access token to view events triggered by an activity in an organization.'\n        )\n        .optional(),\n      organization_hooks: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage the post-receive hooks for an organization.'\n        )\n        .optional(),\n      organization_personal_access_tokens: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for viewing and managing fine-grained personal access token requests to an organization.'\n        )\n        .optional(),\n      organization_personal_access_token_requests: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for viewing and managing fine-grained personal access tokens that have been approved by an organization.'\n        )\n        .optional(),\n      organization_plan: z\n        .literal('read')\n        .describe(\n          \"The level of permission to grant the access token for viewing an organization's plan.\"\n        )\n        .optional(),\n      organization_projects: z\n        .enum(['read', 'write', 'admin'])\n        .describe(\n          'The level of permission to grant the access token to manage organization projects and projects public preview (where available).'\n        )\n        .optional(),\n      organization_packages: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token for organization packages published to GitHub Packages.'\n        )\n        .optional(),\n      organization_secrets: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage organization secrets.'\n        )\n        .optional(),\n      organization_self_hosted_runners: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and manage GitHub Actions self-hosted runners available to an organization.'\n        )\n        .optional(),\n      organization_user_blocking: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and manage users blocked by the organization.'\n        )\n        .optional(),\n      team_discussions: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage team discussions and related comments.'\n        )\n        .optional(),\n      email_addresses: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage the email addresses belonging to a user.'\n        )\n        .optional(),\n      followers: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage the followers belonging to a user.'\n        )\n        .optional(),\n      git_ssh_keys: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to manage git SSH keys.'\n        )\n        .optional(),\n      gpg_keys: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and manage GPG keys belonging to a user.'\n        )\n        .optional(),\n      interaction_limits: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to view and manage interaction limits on a repository.'\n        )\n        .optional(),\n      profile: z\n        .literal('write')\n        .describe(\n          'The level of permission to grant the access token to manage the profile settings belonging to a user.'\n        )\n        .optional(),\n      starring: z\n        .enum(['read', 'write'])\n        .describe(\n          'The level of permission to grant the access token to list and manage repositories a user is starring.'\n        )\n        .optional()\n    })\n    .describe('The permissions granted to the user access token.')\n  export type AppPermissions = z.infer<typeof AppPermissionsSchema>\n\n  export const NullableSimpleUserSchema = z\n    .object({\n      name: z.string().optional(),\n      email: z.string().optional(),\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      site_admin: z.boolean(),\n      starred_at: z.string().optional(),\n      user_view_type: z.string().optional()\n    })\n    .describe('A GitHub user.')\n  export type NullableSimpleUser = z.infer<typeof NullableSimpleUserSchema>\n\n  export const SinceSchema = z\n    .any()\n    .describe(\n      'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type Since = z.infer<typeof SinceSchema>\n\n  export const InstallationIdSchema = z\n    .any()\n    .describe('The unique identifier of the installation.')\n  export type InstallationId = z.infer<typeof InstallationIdSchema>\n\n  export const NullableLicenseSimpleSchema = z\n    .object({\n      key: z.string(),\n      name: z.string(),\n      url: z.string().url(),\n      spdx_id: z.string(),\n      node_id: z.string(),\n      html_url: z.string().url().optional()\n    })\n    .describe('License Simple')\n  export type NullableLicenseSimple = z.infer<\n    typeof NullableLicenseSimpleSchema\n  >\n\n  export const ClientIdSchema = z\n    .any()\n    .describe('The client ID of the GitHub app.')\n  export type ClientId = z.infer<typeof ClientIdSchema>\n\n  export const AppSlugSchema = z.any()\n  export type AppSlug = z.infer<typeof AppSlugSchema>\n\n  export const SimpleClassroomRepositorySchema = z\n    .object({\n      id: z.number().int().describe('A unique identifier of the repository.'),\n      full_name: z\n        .string()\n        .describe('The full, globally unique name of the repository.'),\n      html_url: z\n        .string()\n        .url()\n        .describe('The URL to view the repository on GitHub.com.'),\n      node_id: z.string().describe('The GraphQL identifier of the repository.'),\n      private: z.boolean().describe('Whether the repository is private.'),\n      default_branch: z\n        .string()\n        .describe('The default branch for the repository.')\n    })\n    .describe('A GitHub repository view for Classroom')\n  export type SimpleClassroomRepository = z.infer<\n    typeof SimpleClassroomRepositorySchema\n  >\n\n  export const SimpleClassroomOrganizationSchema = z\n    .object({\n      id: z.number().int(),\n      login: z.string(),\n      node_id: z.string(),\n      html_url: z.string().url(),\n      name: z.string(),\n      avatar_url: z.string()\n    })\n    .describe('A GitHub organization.')\n  export type SimpleClassroomOrganization = z.infer<\n    typeof SimpleClassroomOrganizationSchema\n  >\n\n  export const AssignmentIdSchema = z\n    .any()\n    .describe('The unique identifier of the classroom assignment.')\n  export type AssignmentId = z.infer<typeof AssignmentIdSchema>\n\n  export const SimpleClassroomUserSchema = z\n    .object({\n      id: z.number().int(),\n      login: z.string(),\n      avatar_url: z.string().url(),\n      html_url: z.string().url()\n    })\n    .describe('A GitHub user simplified for Classroom.')\n  export type SimpleClassroomUser = z.infer<typeof SimpleClassroomUserSchema>\n\n  export const SimpleClassroomSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the classroom.'),\n      name: z.string().describe('The name of the classroom.'),\n      archived: z\n        .boolean()\n        .describe('Returns whether classroom is archived or not.'),\n      url: z.string().describe('The url of the classroom on GitHub Classroom.')\n    })\n    .describe('A GitHub Classroom classroom')\n  export type SimpleClassroom = z.infer<typeof SimpleClassroomSchema>\n\n  export const ClassroomAssignmentGradeSchema = z\n    .object({\n      assignment_name: z.string().describe('Name of the assignment'),\n      assignment_url: z.string().describe('URL of the assignment'),\n      starter_code_url: z\n        .string()\n        .describe('URL of the starter code for the assignment'),\n      github_username: z.string().describe('GitHub username of the student'),\n      roster_identifier: z\n        .string()\n        .describe('Roster identifier of the student'),\n      student_repository_name: z\n        .string()\n        .describe(\"Name of the student's assignment repository\"),\n      student_repository_url: z\n        .string()\n        .describe(\"URL of the student's assignment repository\"),\n      submission_timestamp: z\n        .string()\n        .describe(\"Timestamp of the student's assignment submission\"),\n      points_awarded: z\n        .number()\n        .int()\n        .describe('Number of points awarded to the student'),\n      points_available: z\n        .number()\n        .int()\n        .describe('Number of points available for the assignment'),\n      group_name: z\n        .string()\n        .describe('If a group assignment, name of the group the student is in')\n        .optional()\n    })\n    .describe('Grade for a student or groups GitHub Classroom assignment')\n  export type ClassroomAssignmentGrade = z.infer<\n    typeof ClassroomAssignmentGradeSchema\n  >\n\n  export const ClassroomIdSchema = z\n    .any()\n    .describe('The unique identifier of the classroom.')\n  export type ClassroomId = z.infer<typeof ClassroomIdSchema>\n\n  export const CodeOfConductSchema = z\n    .object({\n      key: z.string(),\n      name: z.string(),\n      url: z.string().url(),\n      body: z.string().optional(),\n      html_url: z.string().url()\n    })\n    .describe('Code Of Conduct')\n  export type CodeOfConduct = z.infer<typeof CodeOfConductSchema>\n\n  export const CodeSecurityConfigurationSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('The ID of the code security configuration')\n        .optional(),\n      name: z\n        .string()\n        .describe(\n          'The name of the code security configuration. Must be unique within the organization.'\n        )\n        .optional(),\n      target_type: z\n        .enum(['global', 'organization', 'enterprise'])\n        .describe('The type of the code security configuration.')\n        .optional(),\n      description: z\n        .string()\n        .describe('A description of the code security configuration')\n        .optional(),\n      advanced_security: z\n        .enum(['enabled', 'disabled'])\n        .describe('The enablement status of GitHub Advanced Security')\n        .optional(),\n      dependency_graph: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependency Graph')\n        .optional(),\n      dependency_graph_autosubmit_action: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Automatic dependency submission')\n        .optional(),\n      dependency_graph_autosubmit_action_options: z\n        .object({\n          labeled_runners: z\n            .boolean()\n            .describe(\n              \"Whether to use runners labeled with 'dependency-submission' or standard GitHub runners.\"\n            )\n            .optional()\n        })\n        .describe('Feature options for Automatic dependency submission')\n        .optional(),\n      dependabot_alerts: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependabot alerts')\n        .optional(),\n      dependabot_security_updates: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependabot security updates')\n        .optional(),\n      code_scanning_default_setup: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of code scanning default setup')\n        .optional(),\n      code_scanning_default_setup_options: z\n        .object({\n          runner_type: z\n            .enum(['standard', 'labeled', 'not_set'])\n            .describe(\n              'Whether to use labeled runners or standard GitHub runners.'\n            )\n            .optional(),\n          runner_label: z\n            .string()\n            .describe(\n              \"The label of the runner to use for code scanning when runner_type is 'labeled'.\"\n            )\n            .optional()\n        })\n        .describe('Feature options for code scanning default setup')\n        .optional(),\n      code_scanning_delegated_alert_dismissal: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of code scanning delegated alert dismissal'\n        )\n        .optional(),\n      secret_scanning: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning')\n        .optional(),\n      secret_scanning_push_protection: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning push protection')\n        .optional(),\n      secret_scanning_delegated_bypass: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning delegated bypass')\n        .optional(),\n      secret_scanning_delegated_bypass_options: z\n        .object({\n          reviewers: z\n            .array(\n              z.object({\n                reviewer_id: z\n                  .number()\n                  .int()\n                  .describe(\n                    'The ID of the team or role selected as a bypass reviewer'\n                  ),\n                reviewer_type: z\n                  .enum(['TEAM', 'ROLE'])\n                  .describe('The type of the bypass reviewer')\n              })\n            )\n            .describe(\n              'The bypass reviewers for secret scanning delegated bypass'\n            )\n            .optional()\n        })\n        .describe('Feature options for secret scanning delegated bypass')\n        .optional(),\n      secret_scanning_validity_checks: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning validity checks')\n        .optional(),\n      secret_scanning_non_provider_patterns: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of secret scanning non-provider patterns'\n        )\n        .optional(),\n      secret_scanning_generic_secrets: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Copilot secret scanning')\n        .optional(),\n      secret_scanning_delegated_alert_dismissal: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of secret scanning delegated alert dismissal'\n        )\n        .optional(),\n      private_vulnerability_reporting: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of private vulnerability reporting')\n        .optional(),\n      enforcement: z\n        .enum(['enforced', 'unenforced'])\n        .describe('The enforcement status for a security configuration')\n        .optional(),\n      url: z.string().url().describe('The URL of the configuration').optional(),\n      html_url: z\n        .string()\n        .url()\n        .describe('The URL of the configuration')\n        .optional(),\n      created_at: z.string().datetime({ offset: true }).optional(),\n      updated_at: z.string().datetime({ offset: true }).optional()\n    })\n    .describe('A code security configuration')\n  export type CodeSecurityConfiguration = z.infer<\n    typeof CodeSecurityConfigurationSchema\n  >\n\n  export const CodeScanningDefaultSetupOptionsSchema = z\n    .object({\n      runner_type: z\n        .enum(['standard', 'labeled', 'not_set'])\n        .describe('Whether to use labeled runners or standard GitHub runners.')\n        .optional(),\n      runner_label: z\n        .string()\n        .describe(\n          \"The label of the runner to use for code scanning default setup when runner_type is 'labeled'.\"\n        )\n        .optional()\n    })\n    .describe('Feature options for code scanning default setup')\n  export type CodeScanningDefaultSetupOptions = z.infer<\n    typeof CodeScanningDefaultSetupOptionsSchema\n  >\n\n  export const ConfigurationIdSchema = z\n    .any()\n    .describe('The unique identifier of the code security configuration.')\n  export type ConfigurationId = z.infer<typeof ConfigurationIdSchema>\n\n  export const AlertNumberSchema = z\n    .any()\n    .describe(\n      'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n    )\n  export type AlertNumber = z.infer<typeof AlertNumberSchema>\n\n  export const DependabotAlertPackageSchema = z\n    .object({\n      ecosystem: z\n        .string()\n        .describe(\"The package's language or package management ecosystem.\")\n        .readonly(),\n      name: z\n        .string()\n        .describe('The unique package name within its ecosystem.')\n        .readonly()\n    })\n    .strict()\n    .describe('Details for the vulnerable package.')\n    .readonly()\n  export type DependabotAlertPackage = z.infer<\n    typeof DependabotAlertPackageSchema\n  >\n\n  export const AlertUrlSchema = z\n    .string()\n    .url()\n    .describe('The REST API URL of the alert resource.')\n    .readonly()\n  export type AlertUrl = z.infer<typeof AlertUrlSchema>\n\n  export const AlertHtmlUrlSchema = z\n    .string()\n    .url()\n    .describe('The GitHub URL of the alert resource.')\n    .readonly()\n  export type AlertHtmlUrl = z.infer<typeof AlertHtmlUrlSchema>\n\n  export const AlertCreatedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The time that the alert was created in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type AlertCreatedAt = z.infer<typeof AlertCreatedAtSchema>\n\n  export const AlertUpdatedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The time that the alert was last updated in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type AlertUpdatedAt = z.infer<typeof AlertUpdatedAtSchema>\n\n  export const AlertDismissedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The time that the alert was dismissed in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type AlertDismissedAt = z.infer<typeof AlertDismissedAtSchema>\n\n  export const AlertFixedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The time that the alert was no longer detected and was considered fixed in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type AlertFixedAt = z.infer<typeof AlertFixedAtSchema>\n\n  export const AlertAutoDismissedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The time that the alert was auto-dismissed in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type AlertAutoDismissedAt = z.infer<typeof AlertAutoDismissedAtSchema>\n\n  export const DependabotAlertCommaSeparatedStatesSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of states. If specified, only alerts with these states will be returned.\\n\\nCan be: `auto_dismissed`, `dismissed`, `fixed`, `open`'\n    )\n  export type DependabotAlertCommaSeparatedStates = z.infer<\n    typeof DependabotAlertCommaSeparatedStatesSchema\n  >\n\n  export const DependabotAlertCommaSeparatedSeveritiesSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of severities. If specified, only alerts with these severities will be returned.\\n\\nCan be: `low`, `medium`, `high`, `critical`'\n    )\n  export type DependabotAlertCommaSeparatedSeverities = z.infer<\n    typeof DependabotAlertCommaSeparatedSeveritiesSchema\n  >\n\n  export const DependabotAlertCommaSeparatedEcosystemsSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of ecosystems. If specified, only alerts for these ecosystems will be returned.\\n\\nCan be: `composer`, `go`, `maven`, `npm`, `nuget`, `pip`, `pub`, `rubygems`, `rust`'\n    )\n  export type DependabotAlertCommaSeparatedEcosystems = z.infer<\n    typeof DependabotAlertCommaSeparatedEcosystemsSchema\n  >\n\n  export const DependabotAlertCommaSeparatedPackagesSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of package names. If specified, only alerts for these packages will be returned.'\n    )\n  export type DependabotAlertCommaSeparatedPackages = z.infer<\n    typeof DependabotAlertCommaSeparatedPackagesSchema\n  >\n\n  export const DependabotAlertCommaSeparatedEpssSchema = z\n    .any()\n    .describe(\n      'CVE Exploit Prediction Scoring System (EPSS) percentage. Can be specified as:\\n- An exact number (`n`)\\n- Comparators such as `>n`, `<n`, `>=n`, `<=n`\\n- A range like `n..n`, where `n` is a number from 0.0 to 1.0\\n\\nFilters the list of alerts based on EPSS percentages. If specified, only alerts with the provided EPSS percentages will be returned.'\n    )\n  export type DependabotAlertCommaSeparatedEpss = z.infer<\n    typeof DependabotAlertCommaSeparatedEpssSchema\n  >\n\n  export const DependabotAlertScopeSchema = z\n    .any()\n    .describe(\n      'The scope of the vulnerable dependency. If specified, only alerts with this scope will be returned.'\n    )\n  export type DependabotAlertScope = z.infer<typeof DependabotAlertScopeSchema>\n\n  export const DependabotAlertSortSchema = z\n    .any()\n    .describe(\n      \"The property by which to sort the results.\\n`created` means when the alert was created.\\n`updated` means when the alert's state last changed.\\n`epss_percentage` sorts alerts by the Exploit Prediction Scoring System (EPSS) percentage.\"\n    )\n  export type DependabotAlertSort = z.infer<typeof DependabotAlertSortSchema>\n\n  export const PaginationFirstSchema = z\n    .any()\n    .describe(\n      '**Deprecated**. The number of results per page (max 100), starting from the first matching result.\\nThis parameter must not be used in combination with `last`.\\nInstead, use `per_page` in combination with `after` to fetch the first page of results.'\n    )\n  export type PaginationFirst = z.infer<typeof PaginationFirstSchema>\n\n  export const PaginationLastSchema = z\n    .any()\n    .describe(\n      '**Deprecated**. The number of results per page (max 100), starting from the last matching result.\\nThis parameter must not be used in combination with `first`.\\nInstead, use `per_page` in combination with `before` to fetch the last page of results.'\n    )\n  export type PaginationLast = z.infer<typeof PaginationLastSchema>\n\n  export const NullableAlertUpdatedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The time that the alert was last updated in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type NullableAlertUpdatedAt = z.infer<\n    typeof NullableAlertUpdatedAtSchema\n  >\n\n  export const SecretScanningAlertStateSchema = z\n    .any()\n    .describe(\n      'Set to `open` or `resolved` to only list secret scanning alerts in a specific state.'\n    )\n  export type SecretScanningAlertState = z.infer<\n    typeof SecretScanningAlertStateSchema\n  >\n\n  export const SecretScanningAlertResolutionSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of resolutions. Only secret scanning alerts with one of these resolutions are listed. Valid resolutions are `false_positive`, `wont_fix`, `revoked`, `pattern_edited`, `pattern_deleted` or `used_in_tests`.'\n    )\n  export type SecretScanningAlertResolution = z.infer<\n    typeof SecretScanningAlertResolutionSchema\n  >\n\n  export const SecretScanningAlertSecretTypeSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of secret types to return. All default secret patterns are returned. To return generic patterns, pass the token name(s) in the parameter. See \"[Supported secret scanning patterns](https://docs.github.com/enterprise-cloud@latest/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets)\" for a complete list of secret types.'\n    )\n  export type SecretScanningAlertSecretType = z.infer<\n    typeof SecretScanningAlertSecretTypeSchema\n  >\n\n  export const SecretScanningAlertSortSchema = z\n    .any()\n    .describe(\n      'The property to sort the results by. `created` means when the alert was created. `updated` means when the alert was updated or resolved.'\n    )\n  export type SecretScanningAlertSort = z.infer<\n    typeof SecretScanningAlertSortSchema\n  >\n\n  export const SecretScanningAlertValiditySchema = z\n    .any()\n    .describe(\n      'A comma-separated list of validities that, when present, will return alerts that match the validities in this list. Valid options are `active`, `inactive`, and `unknown`.'\n    )\n  export type SecretScanningAlertValidity = z.infer<\n    typeof SecretScanningAlertValiditySchema\n  >\n\n  export const SecretScanningAlertPubliclyLeakedSchema = z\n    .any()\n    .describe(\n      'A boolean value representing whether or not to filter alerts by the publicly-leaked tag being present.'\n    )\n  export type SecretScanningAlertPubliclyLeaked = z.infer<\n    typeof SecretScanningAlertPubliclyLeakedSchema\n  >\n\n  export const SecretScanningAlertMultiRepoSchema = z\n    .any()\n    .describe(\n      'A boolean value representing whether or not to filter alerts by the multi-repo tag being present.'\n    )\n  export type SecretScanningAlertMultiRepo = z.infer<\n    typeof SecretScanningAlertMultiRepoSchema\n  >\n\n  export const ActorSchema = z\n    .any()\n    .describe(\n      \"Returns someone's workflow runs. Use the login for the user who created the `push` associated with the check suite or workflow run.\"\n    )\n  export type Actor = z.infer<typeof ActorSchema>\n\n  export const IssueTypeSchema = z\n    .object({\n      id: z.number().int().describe('The unique identifier of the issue type.'),\n      node_id: z.string().describe('The node identifier of the issue type.'),\n      name: z.string().describe('The name of the issue type.'),\n      description: z.string().describe('The description of the issue type.'),\n      color: z\n        .enum([\n          'gray',\n          'blue',\n          'green',\n          'yellow',\n          'orange',\n          'red',\n          'pink',\n          'purple'\n        ])\n        .describe('The color of the issue type.')\n        .optional(),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time the issue type created.')\n        .optional(),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time the issue type last updated.')\n        .optional(),\n      is_enabled: z\n        .boolean()\n        .describe('The enabled state of the issue type.')\n        .optional()\n    })\n    .describe('The type of issue.')\n  export type IssueType = z.infer<typeof IssueTypeSchema>\n\n  export const AuthorAssociationSchema = z\n    .enum([\n      'COLLABORATOR',\n      'CONTRIBUTOR',\n      'FIRST_TIMER',\n      'FIRST_TIME_CONTRIBUTOR',\n      'MANNEQUIN',\n      'MEMBER',\n      'NONE',\n      'OWNER'\n    ])\n    .describe('How the author is associated with the repository.')\n  export type AuthorAssociation = z.infer<typeof AuthorAssociationSchema>\n\n  export const ReactionRollupSchema = z.object({\n    url: z.string().url(),\n    total_count: z.number().int(),\n    '+1': z.number().int(),\n    '-1': z.number().int(),\n    laugh: z.number().int(),\n    confused: z.number().int(),\n    heart: z.number().int(),\n    hooray: z.number().int(),\n    eyes: z.number().int(),\n    rocket: z.number().int()\n  })\n  export type ReactionRollup = z.infer<typeof ReactionRollupSchema>\n\n  export const SubIssuesSummarySchema = z.object({\n    total: z.number().int(),\n    completed: z.number().int(),\n    percent_completed: z.number().int()\n  })\n  export type SubIssuesSummary = z.infer<typeof SubIssuesSummarySchema>\n\n  export const LinkWithTypeSchema = z\n    .object({ href: z.string(), type: z.string() })\n    .describe('Hypermedia Link with Type')\n  export type LinkWithType = z.infer<typeof LinkWithTypeSchema>\n\n  export const PublicUserSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      user_view_type: z.string().optional(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      site_admin: z.boolean(),\n      name: z.string(),\n      company: z.string(),\n      blog: z.string(),\n      location: z.string(),\n      email: z.string().email(),\n      notification_email: z.string().email().optional(),\n      hireable: z.boolean(),\n      bio: z.string(),\n      twitter_username: z.string().optional(),\n      public_repos: z.number().int(),\n      public_gists: z.number().int(),\n      followers: z.number().int(),\n      following: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      plan: z\n        .object({\n          collaborators: z.number().int(),\n          name: z.string(),\n          space: z.number().int(),\n          private_repos: z.number().int()\n        })\n        .optional(),\n      private_gists: z.number().int().optional(),\n      total_private_repos: z.number().int().optional(),\n      owned_private_repos: z.number().int().optional(),\n      disk_usage: z.number().int().optional(),\n      collaborators: z.number().int().optional()\n    })\n    .strict()\n    .describe('Public User')\n  export type PublicUser = z.infer<typeof PublicUserSchema>\n\n  export const GistIdSchema = z\n    .any()\n    .describe('The unique identifier of the gist.')\n  export type GistId = z.infer<typeof GistIdSchema>\n\n  export const CommentIdSchema = z\n    .any()\n    .describe('The unique identifier of the comment.')\n  export type CommentId = z.infer<typeof CommentIdSchema>\n\n  export const GitignoreTemplateSchema = z\n    .object({ name: z.string(), source: z.string() })\n    .describe('Gitignore Template')\n  export type GitignoreTemplate = z.infer<typeof GitignoreTemplateSchema>\n\n  export const LabelsSchema = z\n    .any()\n    .describe('A list of comma separated label names. Example: `bug,ui,@high`')\n  export type Labels = z.infer<typeof LabelsSchema>\n\n  export const LicenseSimpleSchema = z\n    .object({\n      key: z.string(),\n      name: z.string(),\n      url: z.string().url(),\n      spdx_id: z.string(),\n      node_id: z.string(),\n      html_url: z.string().url().optional()\n    })\n    .describe('License Simple')\n  export type LicenseSimple = z.infer<typeof LicenseSimpleSchema>\n\n  export const LicenseSchema = z\n    .object({\n      key: z.string(),\n      name: z.string(),\n      spdx_id: z.string(),\n      url: z.string().url(),\n      node_id: z.string(),\n      html_url: z.string().url(),\n      description: z.string(),\n      implementation: z.string(),\n      permissions: z.array(z.string()),\n      conditions: z.array(z.string()),\n      limitations: z.array(z.string()),\n      body: z.string(),\n      featured: z.boolean()\n    })\n    .describe('License')\n  export type License = z.infer<typeof LicenseSchema>\n\n  export const MarketplaceListingPlanSchema = z\n    .object({\n      url: z.string().url(),\n      accounts_url: z.string().url(),\n      id: z.number().int(),\n      number: z.number().int(),\n      name: z.string(),\n      description: z.string(),\n      monthly_price_in_cents: z.number().int(),\n      yearly_price_in_cents: z.number().int(),\n      price_model: z.enum(['FREE', 'FLAT_RATE', 'PER_UNIT']),\n      has_free_trial: z.boolean(),\n      unit_name: z.string(),\n      state: z.string(),\n      bullets: z.array(z.string())\n    })\n    .describe('Marketplace Listing Plan')\n  export type MarketplaceListingPlan = z.infer<\n    typeof MarketplaceListingPlanSchema\n  >\n\n  export const AccountIdSchema = z.any().describe('account_id parameter')\n  export type AccountId = z.infer<typeof AccountIdSchema>\n\n  export const PlanIdSchema = z\n    .any()\n    .describe('The unique identifier of the plan.')\n  export type PlanId = z.infer<typeof PlanIdSchema>\n\n  export const SortSchema = z\n    .any()\n    .describe('The property to sort the results by.')\n  export type Sort = z.infer<typeof SortSchema>\n\n  export const ApiOverviewSchema = z\n    .object({\n      verifiable_password_authentication: z.boolean(),\n      ssh_key_fingerprints: z\n        .object({\n          SHA256_RSA: z.string().optional(),\n          SHA256_DSA: z.string().optional(),\n          SHA256_ECDSA: z.string().optional(),\n          SHA256_ED25519: z.string().optional()\n        })\n        .optional(),\n      ssh_keys: z.array(z.string()).optional(),\n      hooks: z.array(z.string()).optional(),\n      github_enterprise_importer: z.array(z.string()).optional(),\n      web: z.array(z.string()).optional(),\n      api: z.array(z.string()).optional(),\n      git: z.array(z.string()).optional(),\n      packages: z.array(z.string()).optional(),\n      pages: z.array(z.string()).optional(),\n      importer: z.array(z.string()).optional(),\n      actions: z.array(z.string()).optional(),\n      actions_macos: z.array(z.string()).optional(),\n      codespaces: z.array(z.string()).optional(),\n      dependabot: z.array(z.string()).optional(),\n      copilot: z.array(z.string()).optional(),\n      domains: z\n        .object({\n          website: z.array(z.string()).optional(),\n          codespaces: z.array(z.string()).optional(),\n          copilot: z.array(z.string()).optional(),\n          packages: z.array(z.string()).optional(),\n          actions: z.array(z.string()).optional(),\n          actions_inbound: z\n            .object({\n              full_domains: z.array(z.string()).optional(),\n              wildcard_domains: z.array(z.string()).optional()\n            })\n            .optional(),\n          artifact_attestations: z\n            .object({\n              trust_domain: z.string().optional(),\n              services: z.array(z.string()).optional()\n            })\n            .optional()\n        })\n        .optional()\n    })\n    .describe('Api Overview')\n  export type ApiOverview = z.infer<typeof ApiOverviewSchema>\n\n  export const OwnerSchema = z\n    .any()\n    .describe(\n      'The account owner of the repository. The name is not case sensitive.'\n    )\n  export type Owner = z.infer<typeof OwnerSchema>\n\n  export const RepoSchema = z\n    .any()\n    .describe(\n      'The name of the repository without the `.git` extension. The name is not case sensitive.'\n    )\n  export type Repo = z.infer<typeof RepoSchema>\n\n  export const SecurityAndAnalysisSchema = z.object({\n    advanced_security: z\n      .object({ status: z.enum(['enabled', 'disabled']).optional() })\n      .optional(),\n    dependabot_security_updates: z\n      .object({\n        status: z\n          .enum(['enabled', 'disabled'])\n          .describe(\n            'The enablement status of Dependabot security updates for the repository.'\n          )\n          .optional()\n      })\n      .describe(\n        'Enable or disable Dependabot security updates for the repository.'\n      )\n      .optional(),\n    secret_scanning: z\n      .object({ status: z.enum(['enabled', 'disabled']).optional() })\n      .optional(),\n    secret_scanning_push_protection: z\n      .object({ status: z.enum(['enabled', 'disabled']).optional() })\n      .optional(),\n    secret_scanning_non_provider_patterns: z\n      .object({ status: z.enum(['enabled', 'disabled']).optional() })\n      .optional(),\n    secret_scanning_ai_detection: z\n      .object({ status: z.enum(['enabled', 'disabled']).optional() })\n      .optional()\n  })\n  export type SecurityAndAnalysis = z.infer<typeof SecurityAndAnalysisSchema>\n\n  export const AllSchema = z\n    .any()\n    .describe('If `true`, show notifications marked as read.')\n  export type All = z.infer<typeof AllSchema>\n\n  export const ParticipatingSchema = z\n    .any()\n    .describe(\n      'If `true`, only shows notifications in which the user is directly participating or mentioned.'\n    )\n  export type Participating = z.infer<typeof ParticipatingSchema>\n\n  export const BeforeSchema = z\n    .any()\n    .describe(\n      'Only show notifications updated before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type Before = z.infer<typeof BeforeSchema>\n\n  export const ThreadIdSchema = z\n    .any()\n    .describe(\n      'The unique identifier of the notification thread. This corresponds to the value returned in the `id` field when you retrieve notifications (for example with the [`GET /notifications` operation](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user)).'\n    )\n  export type ThreadId = z.infer<typeof ThreadIdSchema>\n\n  export const ThreadSubscriptionSchema = z\n    .object({\n      subscribed: z.boolean(),\n      ignored: z.boolean(),\n      reason: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      url: z.string().url(),\n      thread_url: z.string().url().optional(),\n      repository_url: z.string().url().optional()\n    })\n    .describe('Thread Subscription')\n  export type ThreadSubscription = z.infer<typeof ThreadSubscriptionSchema>\n\n  export const OrganizationSimpleSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string().url(),\n      hooks_url: z.string(),\n      issues_url: z.string(),\n      members_url: z.string(),\n      public_members_url: z.string(),\n      avatar_url: z.string(),\n      description: z.string()\n    })\n    .describe('A GitHub organization.')\n  export type OrganizationSimple = z.infer<typeof OrganizationSimpleSchema>\n\n  export const SinceOrgSchema = z\n    .any()\n    .describe(\n      'An organization ID. Only return organizations with an ID greater than this ID.'\n    )\n  export type SinceOrg = z.infer<typeof SinceOrgSchema>\n\n  export const BillingUsageReportSchema = z.object({\n    usageItems: z\n      .array(\n        z.object({\n          date: z.string().describe('Date of the usage line item.'),\n          product: z.string().describe('Product name.'),\n          sku: z.string().describe('SKU name.'),\n          quantity: z\n            .number()\n            .int()\n            .describe('Quantity of the usage line item.'),\n          unitType: z.string().describe('Unit type of the usage line item.'),\n          pricePerUnit: z\n            .number()\n            .describe('Price per unit of the usage line item.'),\n          grossAmount: z\n            .number()\n            .describe('Gross amount of the usage line item.'),\n          discountAmount: z\n            .number()\n            .describe('Discount amount of the usage line item.'),\n          netAmount: z.number().describe('Net amount of the usage line item.'),\n          organizationName: z.string().describe('Name of the organization.'),\n          repositoryName: z\n            .string()\n            .describe('Name of the repository.')\n            .optional()\n        })\n      )\n      .optional()\n  })\n  export type BillingUsageReport = z.infer<typeof BillingUsageReportSchema>\n\n  export const OrgSchema = z\n    .any()\n    .describe('The organization name. The name is not case sensitive.')\n  export type Org = z.infer<typeof OrgSchema>\n\n  export const BillingUsageReportYearSchema = z\n    .any()\n    .describe(\n      'If specified, only return results for a single year. The value of `year` is an integer with four digits representing a year. For example, `2025`. Default value is the current year.'\n    )\n  export type BillingUsageReportYear = z.infer<\n    typeof BillingUsageReportYearSchema\n  >\n\n  export const BillingUsageReportMonthSchema = z\n    .any()\n    .describe(\n      'If specified, only return results for a single month. The value of `month` is an integer between `1` and `12`. If no year is specified the default `year` is used.'\n    )\n  export type BillingUsageReportMonth = z.infer<\n    typeof BillingUsageReportMonthSchema\n  >\n\n  export const BillingUsageReportDaySchema = z\n    .any()\n    .describe(\n      'If specified, only return results for a single day. The value of `day` is an integer between `1` and `31`. If no `year` or `month` is specified, the default `year` and `month` are used.'\n    )\n  export type BillingUsageReportDay = z.infer<\n    typeof BillingUsageReportDaySchema\n  >\n\n  export const BillingUsageReportHourSchema = z\n    .any()\n    .describe(\n      'If specified, only return results for a single hour. The value of `hour` is an integer between `0` and `23`. If no `year`, `month`, or `day` is specified, the default `year`, `month`, and `day` are used.'\n    )\n  export type BillingUsageReportHour = z.infer<\n    typeof BillingUsageReportHourSchema\n  >\n\n  export const OrganizationFullSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string().url(),\n      hooks_url: z.string(),\n      issues_url: z.string(),\n      members_url: z.string(),\n      public_members_url: z.string(),\n      avatar_url: z.string(),\n      description: z.string(),\n      name: z.string().optional(),\n      company: z.string().optional(),\n      blog: z.string().url().optional(),\n      location: z.string().optional(),\n      email: z.string().email().optional(),\n      twitter_username: z.string().optional(),\n      is_verified: z.boolean().optional(),\n      has_organization_projects: z.boolean(),\n      has_repository_projects: z.boolean(),\n      public_repos: z.number().int(),\n      public_gists: z.number().int(),\n      followers: z.number().int(),\n      following: z.number().int(),\n      html_url: z.string().url(),\n      type: z.string(),\n      total_private_repos: z.number().int().optional(),\n      owned_private_repos: z.number().int().optional(),\n      private_gists: z.number().int().optional(),\n      disk_usage: z.number().int().optional(),\n      collaborators: z\n        .number()\n        .int()\n        .describe(\n          'The number of collaborators on private repositories.\\n\\nThis field may be null if the number of private repositories is over 50,000.'\n        )\n        .optional(),\n      billing_email: z.string().email().optional(),\n      plan: z\n        .object({\n          name: z.string(),\n          space: z.number().int(),\n          private_repos: z.number().int(),\n          filled_seats: z.number().int().optional(),\n          seats: z.number().int().optional()\n        })\n        .optional(),\n      default_repository_permission: z.string().optional(),\n      members_can_create_repositories: z.boolean().optional(),\n      two_factor_requirement_enabled: z.boolean().optional(),\n      members_allowed_repository_creation_type: z.string().optional(),\n      members_can_create_public_repositories: z.boolean().optional(),\n      members_can_create_private_repositories: z.boolean().optional(),\n      members_can_create_internal_repositories: z.boolean().optional(),\n      members_can_create_pages: z.boolean().optional(),\n      members_can_create_public_pages: z.boolean().optional(),\n      members_can_create_private_pages: z.boolean().optional(),\n      members_can_fork_private_repositories: z.boolean().optional(),\n      web_commit_signoff_required: z.boolean().optional(),\n      advanced_security_enabled_for_new_repositories: z\n        .boolean()\n        .describe(\n          '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether GitHub Advanced Security is enabled for new repositories and repositories transferred to this organization.\\n\\nThis field is only visible to organization owners or members of a team with the security manager role.'\n        )\n        .optional(),\n      dependabot_alerts_enabled_for_new_repositories: z\n        .boolean()\n        .describe(\n          '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether Dependabot alerts are automatically enabled for new repositories and repositories transferred to this organization.\\n\\nThis field is only visible to organization owners or members of a team with the security manager role.'\n        )\n        .optional(),\n      dependabot_security_updates_enabled_for_new_repositories: z\n        .boolean()\n        .describe(\n          '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether Dependabot security updates are automatically enabled for new repositories and repositories transferred to this organization.\\n\\nThis field is only visible to organization owners or members of a team with the security manager role.'\n        )\n        .optional(),\n      dependency_graph_enabled_for_new_repositories: z\n        .boolean()\n        .describe(\n          '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether dependency graph is automatically enabled for new repositories and repositories transferred to this organization.\\n\\nThis field is only visible to organization owners or members of a team with the security manager role.'\n        )\n        .optional(),\n      secret_scanning_enabled_for_new_repositories: z\n        .boolean()\n        .describe(\n          '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether secret scanning is automatically enabled for new repositories and repositories transferred to this organization.\\n\\nThis field is only visible to organization owners or members of a team with the security manager role.'\n        )\n        .optional(),\n      secret_scanning_push_protection_enabled_for_new_repositories: z\n        .boolean()\n        .describe(\n          '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether secret scanning push protection is automatically enabled for new repositories and repositories transferred to this organization.\\n\\nThis field is only visible to organization owners or members of a team with the security manager role.'\n        )\n        .optional(),\n      secret_scanning_push_protection_custom_link_enabled: z\n        .boolean()\n        .describe(\n          'Whether a custom link is shown to contributors who are blocked from pushing a secret by push protection.'\n        )\n        .optional(),\n      secret_scanning_push_protection_custom_link: z\n        .string()\n        .describe(\n          'An optional URL string to display to contributors who are blocked from pushing a secret.'\n        )\n        .optional(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      archived_at: z.string().datetime({ offset: true }),\n      deploy_keys_enabled_for_repositories: z\n        .boolean()\n        .describe(\n          'Controls whether or not deploy keys may be added and used for repositories in the organization.'\n        )\n        .optional()\n    })\n    .describe('Organization Full')\n  export type OrganizationFull = z.infer<typeof OrganizationFullSchema>\n\n  export const ActionsCacheUsageOrgEnterpriseSchema = z.object({\n    total_active_caches_count: z\n      .number()\n      .int()\n      .describe(\n        'The count of active caches across all repositories of an enterprise or an organization.'\n      ),\n    total_active_caches_size_in_bytes: z\n      .number()\n      .int()\n      .describe(\n        'The total size in bytes of all active cache items across all repositories of an enterprise or an organization.'\n      )\n  })\n  export type ActionsCacheUsageOrgEnterprise = z.infer<\n    typeof ActionsCacheUsageOrgEnterpriseSchema\n  >\n\n  export const ActionsCacheUsageByRepositorySchema = z\n    .object({\n      full_name: z\n        .string()\n        .describe(\n          'The repository owner and name for the cache usage being shown.'\n        ),\n      active_caches_size_in_bytes: z\n        .number()\n        .int()\n        .describe(\n          'The sum of the size in bytes of all the active cache items in the repository.'\n        ),\n      active_caches_count: z\n        .number()\n        .int()\n        .describe('The number of active caches in the repository.')\n    })\n    .describe('GitHub Actions Cache Usage by repository.')\n  export type ActionsCacheUsageByRepository = z.infer<\n    typeof ActionsCacheUsageByRepositorySchema\n  >\n\n  export const NullableActionsHostedRunnerPoolImageSchema = z\n    .object({\n      id: z\n        .string()\n        .describe(\n          'The ID of the image. Use this ID for the `image` parameter when creating a new larger runner.'\n        ),\n      size_gb: z.number().int().describe('Image size in GB.'),\n      display_name: z.string().describe('Display name for this image.'),\n      source: z\n        .enum(['github', 'partner', 'custom'])\n        .describe('The image provider.')\n    })\n    .describe('Provides details of a hosted runner image')\n  export type NullableActionsHostedRunnerPoolImage = z.infer<\n    typeof NullableActionsHostedRunnerPoolImageSchema\n  >\n\n  export const ActionsHostedRunnerMachineSpecSchema = z\n    .object({\n      id: z\n        .string()\n        .describe(\n          'The ID used for the `size` parameter when creating a new runner.'\n        ),\n      cpu_cores: z.number().int().describe('The number of cores.'),\n      memory_gb: z\n        .number()\n        .int()\n        .describe('The available RAM for the machine spec.'),\n      storage_gb: z\n        .number()\n        .int()\n        .describe('The available SSD storage for the machine spec.')\n    })\n    .describe('Provides details of a particular machine spec.')\n  export type ActionsHostedRunnerMachineSpec = z.infer<\n    typeof ActionsHostedRunnerMachineSpecSchema\n  >\n\n  export const PublicIpSchema = z\n    .object({\n      enabled: z.boolean().describe('Whether public IP is enabled.').optional(),\n      prefix: z.string().describe('The prefix for the public IP.').optional(),\n      length: z\n        .number()\n        .int()\n        .describe('The length of the IP prefix.')\n        .optional()\n    })\n    .describe(\n      'Provides details of Public IP for a GitHub-hosted larger runners'\n    )\n  export type PublicIp = z.infer<typeof PublicIpSchema>\n\n  export const ActionsHostedRunnerImageSchema = z\n    .object({\n      id: z\n        .string()\n        .describe(\n          'The ID of the image. Use this ID for the `image` parameter when creating a new larger runner.'\n        ),\n      platform: z.string().describe('The operating system of the image.'),\n      size_gb: z.number().int().describe('Image size in GB.'),\n      display_name: z.string().describe('Display name for this image.'),\n      source: z\n        .enum(['github', 'partner', 'custom'])\n        .describe('The image provider.')\n    })\n    .describe('Provides details of a hosted runner image')\n  export type ActionsHostedRunnerImage = z.infer<\n    typeof ActionsHostedRunnerImageSchema\n  >\n\n  export const ActionsHostedRunnerLimitsSchema = z.object({\n    public_ips: z\n      .object({\n        maximum: z\n          .number()\n          .int()\n          .describe(\n            'The maximum number of static public IP addresses that can be used for Hosted Runners.'\n          ),\n        current_usage: z\n          .number()\n          .int()\n          .describe(\n            'The current number of static public IP addresses in use by Hosted Runners.'\n          )\n      })\n      .describe(\n        'Provides details of static public IP limits for GitHub-hosted Hosted Runners'\n      )\n  })\n  export type ActionsHostedRunnerLimits = z.infer<\n    typeof ActionsHostedRunnerLimitsSchema\n  >\n\n  export const HostedRunnerIdSchema = z\n    .any()\n    .describe('Unique identifier of the GitHub-hosted runner.')\n  export type HostedRunnerId = z.infer<typeof HostedRunnerIdSchema>\n\n  export const OidcCustomSubSchema = z\n    .object({\n      include_claim_keys: z\n        .array(z.string())\n        .describe(\n          'Array of unique strings. Each claim key can only contain alphanumeric characters and underscores.'\n        )\n    })\n    .describe('Actions OIDC Subject customization')\n  export type OidcCustomSub = z.infer<typeof OidcCustomSubSchema>\n\n  export const EmptyObjectSchema = z\n    .object({})\n    .strict()\n    .describe('An object without any properties.')\n  export type EmptyObject = z.infer<typeof EmptyObjectSchema>\n\n  export const EnabledRepositoriesSchema = z\n    .enum(['all', 'none', 'selected'])\n    .describe(\n      'The policy that controls the repositories in the organization that are allowed to run GitHub Actions.'\n    )\n  export type EnabledRepositories = z.infer<typeof EnabledRepositoriesSchema>\n\n  export const AllowedActionsSchema = z\n    .enum(['all', 'local_only', 'selected'])\n    .describe(\n      'The permissions policy that controls the actions and reusable workflows that are allowed to run.'\n    )\n  export type AllowedActions = z.infer<typeof AllowedActionsSchema>\n\n  export const SelectedActionsUrlSchema = z\n    .string()\n    .describe(\n      'The API URL to use to get or set the actions and reusable workflows that are allowed to run, when `allowed_actions` is set to `selected`.'\n    )\n  export type SelectedActionsUrl = z.infer<typeof SelectedActionsUrlSchema>\n\n  export const RepositoryIdSchema = z\n    .any()\n    .describe('The unique identifier of the repository.')\n  export type RepositoryId = z.infer<typeof RepositoryIdSchema>\n\n  export const SelectedActionsSchema = z.object({\n    github_owned_allowed: z\n      .boolean()\n      .describe(\n        'Whether GitHub-owned actions are allowed. For example, this includes the actions in the `actions` organization.'\n      )\n      .optional(),\n    verified_allowed: z\n      .boolean()\n      .describe(\n        'Whether actions from GitHub Marketplace verified creators are allowed. Set to `true` to allow all actions by GitHub Marketplace verified creators.'\n      )\n      .optional(),\n    patterns_allowed: z\n      .array(z.string())\n      .describe(\n        'Specifies a list of string-matching patterns to allow specific action(s) and reusable workflow(s). Wildcards, tags, and SHAs are allowed. For example, `monalisa/octocat@*`, `monalisa/octocat@v2`, `monalisa/*`.\\n\\n> [!NOTE]\\n> The `patterns_allowed` setting only applies to public repositories.'\n      )\n      .optional()\n  })\n  export type SelectedActions = z.infer<typeof SelectedActionsSchema>\n\n  export const ActionsDefaultWorkflowPermissionsSchema = z\n    .enum(['read', 'write'])\n    .describe(\n      'The default workflow permissions granted to the GITHUB_TOKEN when running workflows.'\n    )\n  export type ActionsDefaultWorkflowPermissions = z.infer<\n    typeof ActionsDefaultWorkflowPermissionsSchema\n  >\n\n  export const ActionsCanApprovePullRequestReviewsSchema = z\n    .boolean()\n    .describe(\n      'Whether GitHub Actions can approve pull requests. Enabling this can be a security risk.'\n    )\n  export type ActionsCanApprovePullRequestReviews = z.infer<\n    typeof ActionsCanApprovePullRequestReviewsSchema\n  >\n\n  export const RunnerGroupsOrgSchema = z.object({\n    id: z.number(),\n    name: z.string(),\n    visibility: z.string(),\n    default: z.boolean(),\n    selected_repositories_url: z\n      .string()\n      .describe(\n        'Link to the selected repositories resource for this runner group. Not present unless visibility was set to `selected`'\n      )\n      .optional(),\n    runners_url: z.string(),\n    hosted_runners_url: z.string().optional(),\n    network_configuration_id: z\n      .string()\n      .describe('The identifier of a hosted compute network configuration.')\n      .optional(),\n    inherited: z.boolean(),\n    inherited_allows_public_repositories: z.boolean().optional(),\n    allows_public_repositories: z.boolean(),\n    workflow_restrictions_read_only: z\n      .boolean()\n      .describe(\n        'If `true`, the `restricted_to_workflows` and `selected_workflows` fields cannot be modified.'\n      )\n      .default(false),\n    restricted_to_workflows: z\n      .boolean()\n      .describe(\n        'If `true`, the runner group will be restricted to running only the workflows specified in the `selected_workflows` array.'\n      )\n      .default(false),\n    selected_workflows: z\n      .array(\n        z\n          .string()\n          .describe(\n            'Name of workflow the runner group should be allowed to run. Note that a ref, tag, or long SHA is required.'\n          )\n      )\n      .describe(\n        'List of workflows the runner group should be allowed to run. This setting will be ignored unless `restricted_to_workflows` is set to `true`.'\n      )\n      .optional()\n  })\n  export type RunnerGroupsOrg = z.infer<typeof RunnerGroupsOrgSchema>\n\n  export const VisibleToRepositorySchema = z\n    .any()\n    .describe(\n      'Only return runner groups that are allowed to be used by this repository.'\n    )\n  export type VisibleToRepository = z.infer<typeof VisibleToRepositorySchema>\n\n  export const RunnerGroupIdSchema = z\n    .any()\n    .describe('Unique identifier of the self-hosted runner group.')\n  export type RunnerGroupId = z.infer<typeof RunnerGroupIdSchema>\n\n  export const RunnerLabelSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the label.')\n        .optional(),\n      name: z.string().describe('Name of the label.'),\n      type: z\n        .enum(['read-only', 'custom'])\n        .describe(\n          'The type of label. Read-only labels are applied automatically when the runner is configured.'\n        )\n        .optional()\n    })\n    .describe('A label for a self hosted runner')\n  export type RunnerLabel = z.infer<typeof RunnerLabelSchema>\n\n  export const RunnerIdSchema = z\n    .any()\n    .describe('Unique identifier of the self-hosted runner.')\n  export type RunnerId = z.infer<typeof RunnerIdSchema>\n\n  export const RunnerApplicationSchema = z\n    .object({\n      os: z.string(),\n      architecture: z.string(),\n      download_url: z.string(),\n      filename: z.string(),\n      temp_download_token: z\n        .string()\n        .describe(\n          'A short lived bearer token used to download the runner, if needed.'\n        )\n        .optional(),\n      sha256_checksum: z.string().optional()\n    })\n    .describe('Runner Application')\n  export type RunnerApplication = z.infer<typeof RunnerApplicationSchema>\n\n  export const RunnerLabelNameSchema = z\n    .any()\n    .describe(\"The name of a self-hosted runner's custom label.\")\n  export type RunnerLabelName = z.infer<typeof RunnerLabelNameSchema>\n\n  export const OrganizationActionsSecretSchema = z\n    .object({\n      name: z.string().describe('The name of the secret.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe('Visibility of a secret'),\n      selected_repositories_url: z.string().url().optional()\n    })\n    .describe('Secrets for GitHub Actions for an organization.')\n  export type OrganizationActionsSecret = z.infer<\n    typeof OrganizationActionsSecretSchema\n  >\n\n  export const ActionsPublicKeySchema = z\n    .object({\n      key_id: z.string().describe('The identifier for the key.'),\n      key: z.string().describe('The Base64 encoded public key.'),\n      id: z.number().int().optional(),\n      url: z.string().optional(),\n      title: z.string().optional(),\n      created_at: z.string().optional()\n    })\n    .describe('The public key used for setting Actions Secrets.')\n  export type ActionsPublicKey = z.infer<typeof ActionsPublicKeySchema>\n\n  export const SecretNameSchema = z.any().describe('The name of the secret.')\n  export type SecretName = z.infer<typeof SecretNameSchema>\n\n  export const OrganizationActionsVariableSchema = z\n    .object({\n      name: z.string().describe('The name of the variable.'),\n      value: z.string().describe('The value of the variable.'),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the variable was created, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the variable was last updated, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe('Visibility of a variable'),\n      selected_repositories_url: z.string().url().optional()\n    })\n    .describe('Organization variable for GitHub Actions.')\n  export type OrganizationActionsVariable = z.infer<\n    typeof OrganizationActionsVariableSchema\n  >\n\n  export const VariablesPerPageSchema = z\n    .any()\n    .describe(\n      'The number of results per page (max 30). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n    )\n  export type VariablesPerPage = z.infer<typeof VariablesPerPageSchema>\n\n  export const VariableNameSchema = z\n    .any()\n    .describe('The name of the variable.')\n  export type VariableName = z.infer<typeof VariableNameSchema>\n\n  export const UsernameSchema = z\n    .any()\n    .describe('The handle for the GitHub user account.')\n  export type Username = z.infer<typeof UsernameSchema>\n\n  export const AlertInstancesUrlSchema = z\n    .string()\n    .url()\n    .describe(\n      'The REST API URL for fetching the list of instances for an alert.'\n    )\n    .readonly()\n  export type AlertInstancesUrl = z.infer<typeof AlertInstancesUrlSchema>\n\n  export const CodeScanningAlertStateSchema = z\n    .enum(['open', 'dismissed', 'fixed'])\n    .describe('State of a code scanning alert.')\n  export type CodeScanningAlertState = z.infer<\n    typeof CodeScanningAlertStateSchema\n  >\n\n  export const CodeScanningAlertDismissedReasonSchema = z\n    .enum(['false positive', \"won't fix\", 'used in tests'])\n    .describe(\n      '**Required when the state is dismissed.** The reason for dismissing or closing the alert.'\n    )\n  export type CodeScanningAlertDismissedReason = z.infer<\n    typeof CodeScanningAlertDismissedReasonSchema\n  >\n\n  export const CodeScanningAlertDismissedCommentSchema = z\n    .string()\n    .max(280)\n    .describe(\n      'The dismissal comment associated with the dismissal of the alert.'\n    )\n  export type CodeScanningAlertDismissedComment = z.infer<\n    typeof CodeScanningAlertDismissedCommentSchema\n  >\n\n  export const CodeScanningAlertRuleSummarySchema = z.object({\n    id: z\n      .string()\n      .describe('A unique identifier for the rule used to detect the alert.')\n      .optional(),\n    name: z\n      .string()\n      .describe('The name of the rule used to detect the alert.')\n      .optional(),\n    severity: z\n      .enum(['none', 'note', 'warning', 'error'])\n      .describe('The severity of the alert.')\n      .optional(),\n    security_severity_level: z\n      .enum(['low', 'medium', 'high', 'critical'])\n      .describe('The security severity of the alert.')\n      .optional(),\n    description: z\n      .string()\n      .describe('A short description of the rule used to detect the alert.')\n      .optional(),\n    full_description: z\n      .string()\n      .describe('A description of the rule used to detect the alert.')\n      .optional(),\n    tags: z\n      .array(z.string())\n      .describe('A set of tags applicable for the rule.')\n      .optional(),\n    help: z\n      .string()\n      .describe(\n        'Detailed documentation for the rule as GitHub Flavored Markdown.'\n      )\n      .optional(),\n    help_uri: z\n      .string()\n      .describe(\n        'A link to the documentation for the rule used to detect the alert.'\n      )\n      .optional()\n  })\n  export type CodeScanningAlertRuleSummary = z.infer<\n    typeof CodeScanningAlertRuleSummarySchema\n  >\n\n  export const CodeScanningAnalysisToolNameSchema = z\n    .string()\n    .describe(\n      'The name of the tool used to generate the code scanning analysis.'\n    )\n  export type CodeScanningAnalysisToolName = z.infer<\n    typeof CodeScanningAnalysisToolNameSchema\n  >\n\n  export const CodeScanningAnalysisToolVersionSchema = z\n    .string()\n    .describe(\n      'The version of the tool used to generate the code scanning analysis.'\n    )\n  export type CodeScanningAnalysisToolVersion = z.infer<\n    typeof CodeScanningAnalysisToolVersionSchema\n  >\n\n  export const CodeScanningAnalysisToolGuidSchema = z\n    .string()\n    .describe(\n      'The GUID of the tool used to generate the code scanning analysis, if provided in the uploaded SARIF data.'\n    )\n  export type CodeScanningAnalysisToolGuid = z.infer<\n    typeof CodeScanningAnalysisToolGuidSchema\n  >\n\n  export const CodeScanningRefSchema = z\n    .string()\n    .describe(\n      'The Git reference, formatted as `refs/pull/<number>/merge`, `refs/pull/<number>/head`,\\n`refs/heads/<branch name>` or simply `<branch name>`.'\n    )\n  export type CodeScanningRef = z.infer<typeof CodeScanningRefSchema>\n\n  export const CodeScanningAnalysisAnalysisKeySchema = z\n    .string()\n    .describe(\n      'Identifies the configuration under which the analysis was executed. For example, in GitHub Actions this includes the workflow filename and job name.'\n    )\n  export type CodeScanningAnalysisAnalysisKey = z.infer<\n    typeof CodeScanningAnalysisAnalysisKeySchema\n  >\n\n  export const CodeScanningAlertEnvironmentSchema = z\n    .string()\n    .describe(\n      'Identifies the variable values associated with the environment in which the analysis that generated this alert instance was performed, such as the language that was analyzed.'\n    )\n  export type CodeScanningAlertEnvironment = z.infer<\n    typeof CodeScanningAlertEnvironmentSchema\n  >\n\n  export const CodeScanningAnalysisCategorySchema = z\n    .string()\n    .describe(\n      'Identifies the configuration under which the analysis was executed. Used to distinguish between multiple analyses for the same tool and commit, but performed on different languages or different parts of the code.'\n    )\n  export type CodeScanningAnalysisCategory = z.infer<\n    typeof CodeScanningAnalysisCategorySchema\n  >\n\n  export const CodeScanningAlertLocationSchema = z\n    .object({\n      path: z.string().optional(),\n      start_line: z.number().int().optional(),\n      end_line: z.number().int().optional(),\n      start_column: z.number().int().optional(),\n      end_column: z.number().int().optional()\n    })\n    .describe('Describe a region within a file for the alert.')\n  export type CodeScanningAlertLocation = z.infer<\n    typeof CodeScanningAlertLocationSchema\n  >\n\n  export const CodeScanningAlertClassificationSchema = z\n    .enum(['source', 'generated', 'test', 'library'])\n    .describe(\n      'A classification of the file. For example to identify it as generated.'\n    )\n  export type CodeScanningAlertClassification = z.infer<\n    typeof CodeScanningAlertClassificationSchema\n  >\n\n  export const NullableCodespaceMachineSchema = z\n    .object({\n      name: z.string().describe('The name of the machine.'),\n      display_name: z\n        .string()\n        .describe(\n          'The display name of the machine includes cores, memory, and storage.'\n        ),\n      operating_system: z\n        .string()\n        .describe('The operating system of the machine.'),\n      storage_in_bytes: z\n        .number()\n        .int()\n        .describe('How much storage is available to the codespace.'),\n      memory_in_bytes: z\n        .number()\n        .int()\n        .describe('How much memory is available to the codespace.'),\n      cpus: z\n        .number()\n        .int()\n        .describe('How many cores are available to the codespace.'),\n      prebuild_availability: z\n        .enum(['none', 'ready', 'in_progress'])\n        .describe(\n          'Whether a prebuild is currently available when creating a codespace for this machine and repository. If a branch was not specified as a ref, the default branch will be assumed. Value will be \"null\" if prebuilds are not supported or prebuild availability could not be determined. Value will be \"none\" if no prebuild is available. Latest values \"ready\" and \"in_progress\" indicate the prebuild availability status.'\n        )\n    })\n    .describe('A description of the machine powering a codespace.')\n  export type NullableCodespaceMachine = z.infer<\n    typeof NullableCodespaceMachineSchema\n  >\n\n  export const CodespacesOrgSecretSchema = z\n    .object({\n      name: z.string().describe('The name of the secret'),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the secret was created, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the secret was created, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe(\n          'The type of repositories in the organization that the secret is visible to'\n        ),\n      selected_repositories_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL at which the list of repositories this secret is visible to can be retrieved'\n        )\n        .optional()\n    })\n    .describe('Secrets for a GitHub Codespace.')\n  export type CodespacesOrgSecret = z.infer<typeof CodespacesOrgSecretSchema>\n\n  export const CodespacesPublicKeySchema = z\n    .object({\n      key_id: z.string().describe('The identifier for the key.'),\n      key: z.string().describe('The Base64 encoded public key.'),\n      id: z.number().int().optional(),\n      url: z.string().optional(),\n      title: z.string().optional(),\n      created_at: z.string().optional()\n    })\n    .describe('The public key used for setting Codespaces secrets.')\n  export type CodespacesPublicKey = z.infer<typeof CodespacesPublicKeySchema>\n\n  export const CopilotOrganizationSeatBreakdownSchema = z\n    .object({\n      total: z\n        .number()\n        .int()\n        .describe(\n          'The total number of seats being billed for the organization as of the current billing cycle.'\n        )\n        .optional(),\n      added_this_cycle: z\n        .number()\n        .int()\n        .describe('Seats added during the current billing cycle.')\n        .optional(),\n      pending_cancellation: z\n        .number()\n        .int()\n        .describe(\n          'The number of seats that are pending cancellation at the end of the current billing cycle.'\n        )\n        .optional(),\n      pending_invitation: z\n        .number()\n        .int()\n        .describe(\n          'The number of users who have been invited to receive a Copilot seat through this organization.'\n        )\n        .optional(),\n      active_this_cycle: z\n        .number()\n        .int()\n        .describe(\n          'The number of seats that have used Copilot during the current billing cycle.'\n        )\n        .optional(),\n      inactive_this_cycle: z\n        .number()\n        .int()\n        .describe(\n          'The number of seats that have not used Copilot during the current billing cycle.'\n        )\n        .optional()\n    })\n    .describe('The breakdown of Copilot Business seats for the organization.')\n  export type CopilotOrganizationSeatBreakdown = z.infer<\n    typeof CopilotOrganizationSeatBreakdownSchema\n  >\n\n  export const NullableOrganizationSimpleSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string().url(),\n      hooks_url: z.string(),\n      issues_url: z.string(),\n      members_url: z.string(),\n      public_members_url: z.string(),\n      avatar_url: z.string(),\n      description: z.string()\n    })\n    .describe('A GitHub organization.')\n  export type NullableOrganizationSimple = z.infer<\n    typeof NullableOrganizationSimpleSchema\n  >\n\n  export const NullableTeamSimpleSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the team'),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the team'),\n      members_url: z.string(),\n      name: z.string().describe('Name of the team'),\n      description: z.string().describe('Description of the team'),\n      permission: z\n        .string()\n        .describe('Permission that the team will have for its repositories'),\n      privacy: z\n        .string()\n        .describe('The level of privacy this team should have')\n        .optional(),\n      notification_setting: z\n        .string()\n        .describe('The notification setting the team has set')\n        .optional(),\n      html_url: z.string().url(),\n      repositories_url: z.string().url(),\n      slug: z.string(),\n      ldap_dn: z\n        .string()\n        .describe(\n          'Distinguished Name (DN) that team maps to within LDAP environment'\n        )\n        .optional()\n    })\n    .describe(\n      'Groups of organization members that gives permissions on specified repositories.'\n    )\n  export type NullableTeamSimple = z.infer<typeof NullableTeamSimpleSchema>\n\n  export const EnterpriseTeamSchema = z\n    .object({\n      id: z.number().int(),\n      name: z.string(),\n      slug: z.string(),\n      url: z.string().url(),\n      sync_to_organizations: z.string(),\n      group_id: z.string().optional(),\n      group_name: z.string().optional(),\n      html_url: z.string().url(),\n      members_url: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Group of enterprise owners and/or members')\n  export type EnterpriseTeam = z.infer<typeof EnterpriseTeamSchema>\n\n  export const CopilotIdeCodeCompletionsSchema = z\n    .object({\n      total_engaged_users: z\n        .number()\n        .int()\n        .describe(\n          'Number of users who accepted at least one Copilot code suggestion, across all active editors. Includes both full and partial acceptances.'\n        )\n        .optional(),\n      languages: z\n        .array(\n          z\n            .object({\n              name: z\n                .string()\n                .describe(\n                  'Name of the language used for Copilot code completion suggestions.'\n                )\n                .optional(),\n              total_engaged_users: z\n                .number()\n                .int()\n                .describe(\n                  'Number of users who accepted at least one Copilot code completion suggestion for the given language. Includes both full and partial acceptances.'\n                )\n                .optional()\n            })\n            .describe(\n              'Usage metrics for a given language for the given editor for Copilot code completions.'\n            )\n        )\n        .describe('Code completion metrics for active languages.')\n        .optional(),\n      editors: z\n        .array(\n          z\n            .object({\n              name: z.string().describe('Name of the given editor.').optional(),\n              total_engaged_users: z\n                .number()\n                .int()\n                .describe(\n                  'Number of users who accepted at least one Copilot code completion suggestion for the given editor. Includes both full and partial acceptances.'\n                )\n                .optional(),\n              models: z\n                .array(\n                  z.object({\n                    name: z\n                      .string()\n                      .describe(\n                        \"Name of the model used for Copilot code completion suggestions. If the default model is used will appear as 'default'.\"\n                      )\n                      .optional(),\n                    is_custom_model: z\n                      .boolean()\n                      .describe(\n                        'Indicates whether a model is custom or default.'\n                      )\n                      .optional(),\n                    custom_model_training_date: z\n                      .string()\n                      .describe('The training date for the custom model.')\n                      .optional(),\n                    total_engaged_users: z\n                      .number()\n                      .int()\n                      .describe(\n                        'Number of users who accepted at least one Copilot code completion suggestion for the given editor, for the given language and model. Includes both full and partial acceptances.'\n                      )\n                      .optional(),\n                    languages: z\n                      .array(\n                        z\n                          .object({\n                            name: z\n                              .string()\n                              .describe(\n                                'Name of the language used for Copilot code completion suggestions, for the given editor.'\n                              )\n                              .optional(),\n                            total_engaged_users: z\n                              .number()\n                              .int()\n                              .describe(\n                                'Number of users who accepted at least one Copilot code completion suggestion for the given editor, for the given language. Includes both full and partial acceptances.'\n                              )\n                              .optional(),\n                            total_code_suggestions: z\n                              .number()\n                              .int()\n                              .describe(\n                                'The number of Copilot code suggestions generated for the given editor, for the given language.'\n                              )\n                              .optional(),\n                            total_code_acceptances: z\n                              .number()\n                              .int()\n                              .describe(\n                                'The number of Copilot code suggestions accepted for the given editor, for the given language. Includes both full and partial acceptances.'\n                              )\n                              .optional(),\n                            total_code_lines_suggested: z\n                              .number()\n                              .int()\n                              .describe(\n                                'The number of lines of code suggested by Copilot code completions for the given editor, for the given language.'\n                              )\n                              .optional(),\n                            total_code_lines_accepted: z\n                              .number()\n                              .int()\n                              .describe(\n                                'The number of lines of code accepted from Copilot code suggestions for the given editor, for the given language.'\n                              )\n                              .optional()\n                          })\n                          .describe(\n                            'Usage metrics for a given language for the given editor for Copilot code completions.'\n                          )\n                      )\n                      .describe(\n                        'Code completion metrics for active languages, for the given editor.'\n                      )\n                      .optional()\n                  })\n                )\n                .describe(\n                  'List of model metrics for custom models and the default model.'\n                )\n                .optional()\n            })\n            .catchall(z.any())\n            .describe('Copilot code completion metrics for active editors.')\n        )\n        .optional()\n    })\n    .catchall(z.any())\n    .describe('Usage metrics for Copilot editor code completions in the IDE.')\n  export type CopilotIdeCodeCompletions = z.infer<\n    typeof CopilotIdeCodeCompletionsSchema\n  >\n\n  export const CopilotIdeChatSchema = z\n    .object({\n      total_engaged_users: z\n        .number()\n        .int()\n        .describe('Total number of users who prompted Copilot Chat in the IDE.')\n        .optional(),\n      editors: z\n        .array(\n          z\n            .object({\n              name: z.string().describe('Name of the given editor.').optional(),\n              total_engaged_users: z\n                .number()\n                .int()\n                .describe(\n                  'The number of users who prompted Copilot Chat in the specified editor.'\n                )\n                .optional(),\n              models: z\n                .array(\n                  z.object({\n                    name: z\n                      .string()\n                      .describe(\n                        \"Name of the model used for Copilot Chat. If the default model is used will appear as 'default'.\"\n                      )\n                      .optional(),\n                    is_custom_model: z\n                      .boolean()\n                      .describe(\n                        'Indicates whether a model is custom or default.'\n                      )\n                      .optional(),\n                    custom_model_training_date: z\n                      .string()\n                      .describe('The training date for the custom model.')\n                      .optional(),\n                    total_engaged_users: z\n                      .number()\n                      .int()\n                      .describe(\n                        'The number of users who prompted Copilot Chat in the given editor and model.'\n                      )\n                      .optional(),\n                    total_chats: z\n                      .number()\n                      .int()\n                      .describe(\n                        'The total number of chats initiated by users in the given editor and model.'\n                      )\n                      .optional(),\n                    total_chat_insertion_events: z\n                      .number()\n                      .int()\n                      .describe(\n                        \"The number of times users accepted a code suggestion from Copilot Chat using the 'Insert Code' UI element, for the given editor.\"\n                      )\n                      .optional(),\n                    total_chat_copy_events: z\n                      .number()\n                      .int()\n                      .describe(\n                        \"The number of times users copied a code suggestion from Copilot Chat using the keyboard, or the 'Copy' UI element, for the given editor.\"\n                      )\n                      .optional()\n                  })\n                )\n                .describe(\n                  'List of model metrics for custom models and the default model.'\n                )\n                .optional()\n            })\n            .describe('Copilot Chat metrics, for active editors.')\n        )\n        .optional()\n    })\n    .catchall(z.any())\n    .describe('Usage metrics for Copilot Chat in the IDE.')\n  export type CopilotIdeChat = z.infer<typeof CopilotIdeChatSchema>\n\n  export const CopilotDotcomChatSchema = z\n    .object({\n      total_engaged_users: z\n        .number()\n        .int()\n        .describe(\n          'Total number of users who prompted Copilot Chat on github.com at least once.'\n        )\n        .optional(),\n      models: z\n        .array(\n          z.object({\n            name: z\n              .string()\n              .describe(\n                \"Name of the model used for Copilot Chat. If the default model is used will appear as 'default'.\"\n              )\n              .optional(),\n            is_custom_model: z\n              .boolean()\n              .describe('Indicates whether a model is custom or default.')\n              .optional(),\n            custom_model_training_date: z\n              .string()\n              .describe(\n                'The training date for the custom model (if applicable).'\n              )\n              .optional(),\n            total_engaged_users: z\n              .number()\n              .int()\n              .describe(\n                'Total number of users who prompted Copilot Chat on github.com at least once for each model.'\n              )\n              .optional(),\n            total_chats: z\n              .number()\n              .int()\n              .describe(\n                'Total number of chats initiated by users on github.com.'\n              )\n              .optional()\n          })\n        )\n        .describe(\n          'List of model metrics for a custom models and the default model.'\n        )\n        .optional()\n    })\n    .catchall(z.any())\n    .describe('Usage metrics for Copilot Chat in GitHub.com')\n  export type CopilotDotcomChat = z.infer<typeof CopilotDotcomChatSchema>\n\n  export const CopilotDotcomPullRequestsSchema = z\n    .object({\n      total_engaged_users: z\n        .number()\n        .int()\n        .describe(\n          'The number of users who used Copilot for Pull Requests on github.com to generate a pull request summary at least once.'\n        )\n        .optional(),\n      repositories: z\n        .array(\n          z.object({\n            name: z.string().describe('Repository name').optional(),\n            total_engaged_users: z\n              .number()\n              .int()\n              .describe(\n                'The number of users who generated pull request summaries using Copilot for Pull Requests in the given repository.'\n              )\n              .optional(),\n            models: z\n              .array(\n                z.object({\n                  name: z\n                    .string()\n                    .describe(\n                      \"Name of the model used for Copilot pull request summaries. If the default model is used will appear as 'default'.\"\n                    )\n                    .optional(),\n                  is_custom_model: z\n                    .boolean()\n                    .describe('Indicates whether a model is custom or default.')\n                    .optional(),\n                  custom_model_training_date: z\n                    .string()\n                    .describe('The training date for the custom model.')\n                    .optional(),\n                  total_pr_summaries_created: z\n                    .number()\n                    .int()\n                    .describe(\n                      'The number of pull request summaries generated using Copilot for Pull Requests in the given repository.'\n                    )\n                    .optional(),\n                  total_engaged_users: z\n                    .number()\n                    .int()\n                    .describe(\n                      'The number of users who generated pull request summaries using Copilot for Pull Requests in the given repository and model.'\n                    )\n                    .optional()\n                })\n              )\n              .describe(\n                'List of model metrics for custom models and the default model.'\n              )\n              .optional()\n          })\n        )\n        .describe(\n          'Repositories in which users used Copilot for Pull Requests to generate pull request summaries'\n        )\n        .optional()\n    })\n    .catchall(z.any())\n    .describe('Usage metrics for Copilot for pull requests.')\n  export type CopilotDotcomPullRequests = z.infer<\n    typeof CopilotDotcomPullRequestsSchema\n  >\n\n  export const CopilotUsageMetricsSchema = z\n    .object({\n      day: z\n        .string()\n        .date()\n        .describe(\n          'The date for which the usage metrics are reported, in `YYYY-MM-DD` format.'\n        ),\n      total_suggestions_count: z\n        .number()\n        .int()\n        .describe(\n          'The total number of Copilot code completion suggestions shown to users.'\n        )\n        .optional(),\n      total_acceptances_count: z\n        .number()\n        .int()\n        .describe(\n          'The total number of Copilot code completion suggestions accepted by users.'\n        )\n        .optional(),\n      total_lines_suggested: z\n        .number()\n        .int()\n        .describe(\n          'The total number of lines of code completions suggested by Copilot.'\n        )\n        .optional(),\n      total_lines_accepted: z\n        .number()\n        .int()\n        .describe(\n          'The total number of lines of code completions accepted by users.'\n        )\n        .optional(),\n      total_active_users: z\n        .number()\n        .int()\n        .describe(\n          'The total number of users who were shown Copilot code completion suggestions during the day specified.'\n        )\n        .optional(),\n      total_chat_acceptances: z\n        .number()\n        .int()\n        .describe(\n          'The total instances of users who accepted code suggested by Copilot Chat in the IDE (panel and inline).'\n        )\n        .optional(),\n      total_chat_turns: z\n        .number()\n        .int()\n        .describe(\n          'The total number of chat turns (prompt and response pairs) sent between users and Copilot Chat in the IDE.'\n        )\n        .optional(),\n      total_active_chat_users: z\n        .number()\n        .int()\n        .describe(\n          'The total number of users who interacted with Copilot Chat in the IDE during the day specified.'\n        )\n        .optional(),\n      breakdown: z\n        .array(\n          z\n            .object({\n              language: z\n                .string()\n                .describe(\n                  'The language in which Copilot suggestions were shown to users in the specified editor.'\n                )\n                .optional(),\n              editor: z\n                .string()\n                .describe(\n                  'The editor in which Copilot suggestions were shown to users for the specified language.'\n                )\n                .optional(),\n              suggestions_count: z\n                .number()\n                .int()\n                .describe(\n                  'The number of Copilot suggestions shown to users in the editor specified during the day specified.'\n                )\n                .optional(),\n              acceptances_count: z\n                .number()\n                .int()\n                .describe(\n                  'The number of Copilot suggestions accepted by users in the editor specified during the day specified.'\n                )\n                .optional(),\n              lines_suggested: z\n                .number()\n                .int()\n                .describe(\n                  'The number of lines of code suggested by Copilot in the editor specified during the day specified.'\n                )\n                .optional(),\n              lines_accepted: z\n                .number()\n                .int()\n                .describe(\n                  'The number of lines of code accepted by users in the editor specified during the day specified.'\n                )\n                .optional(),\n              active_users: z\n                .number()\n                .int()\n                .describe(\n                  'The number of users who were shown Copilot completion suggestions in the editor specified during the day specified.'\n                )\n                .optional()\n            })\n            .catchall(z.any())\n            .describe('Breakdown of Copilot usage by editor for this language')\n        )\n        .describe(\n          'Breakdown of Copilot code completions usage by language and editor'\n        )\n    })\n    .strict()\n    .describe('Summary of Copilot usage.')\n  export type CopilotUsageMetrics = z.infer<typeof CopilotUsageMetricsSchema>\n\n  export const OrganizationDependabotSecretSchema = z\n    .object({\n      name: z.string().describe('The name of the secret.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe('Visibility of a secret'),\n      selected_repositories_url: z.string().url().optional()\n    })\n    .describe('Secrets for GitHub Dependabot for an organization.')\n  export type OrganizationDependabotSecret = z.infer<\n    typeof OrganizationDependabotSecretSchema\n  >\n\n  export const DependabotPublicKeySchema = z\n    .object({\n      key_id: z.string().describe('The identifier for the key.'),\n      key: z.string().describe('The Base64 encoded public key.')\n    })\n    .describe('The public key used for setting Dependabot Secrets.')\n  export type DependabotPublicKey = z.infer<typeof DependabotPublicKeySchema>\n\n  export const OrgHookSchema = z\n    .object({\n      id: z.number().int(),\n      url: z.string().url(),\n      ping_url: z.string().url(),\n      deliveries_url: z.string().url().optional(),\n      name: z.string(),\n      events: z.array(z.string()),\n      active: z.boolean(),\n      config: z.object({\n        url: z.string().optional(),\n        insecure_ssl: z.string().optional(),\n        content_type: z.string().optional(),\n        secret: z.string().optional()\n      }),\n      updated_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      type: z.string()\n    })\n    .describe('Org Hook')\n  export type OrgHook = z.infer<typeof OrgHookSchema>\n\n  export const HookIdSchema = z\n    .any()\n    .describe(\n      'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n    )\n  export type HookId = z.infer<typeof HookIdSchema>\n\n  export const ApiInsightsRouteStatsSchema = z\n    .array(\n      z.object({\n        http_method: z.string().describe('The HTTP method').optional(),\n        api_route: z\n          .string()\n          .describe(\"The API path's route template\")\n          .optional(),\n        total_request_count: z\n          .number()\n          .int()\n          .describe(\n            'The total number of requests within the queried time period'\n          )\n          .optional(),\n        rate_limited_request_count: z\n          .number()\n          .int()\n          .describe(\n            'The total number of requests that were rate limited within the queried time period'\n          )\n          .optional(),\n        last_rate_limited_timestamp: z.string().optional(),\n        last_request_timestamp: z.string().optional()\n      })\n    )\n    .describe('API Insights usage route stats for an actor')\n  export type ApiInsightsRouteStats = z.infer<\n    typeof ApiInsightsRouteStatsSchema\n  >\n\n  export const ApiInsightsActorTypeSchema = z\n    .any()\n    .describe('The type of the actor')\n  export type ApiInsightsActorType = z.infer<typeof ApiInsightsActorTypeSchema>\n\n  export const ApiInsightsActorIdSchema = z\n    .any()\n    .describe('The ID of the actor')\n  export type ApiInsightsActorId = z.infer<typeof ApiInsightsActorIdSchema>\n\n  export const ApiInsightsMinTimestampSchema = z\n    .any()\n    .describe(\n      'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type ApiInsightsMinTimestamp = z.infer<\n    typeof ApiInsightsMinTimestampSchema\n  >\n\n  export const ApiInsightsMaxTimestampSchema = z\n    .any()\n    .describe(\n      'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type ApiInsightsMaxTimestamp = z.infer<\n    typeof ApiInsightsMaxTimestampSchema\n  >\n\n  export const ApiInsightsRouteStatsSortSchema = z\n    .any()\n    .describe('The property to sort the results by.')\n  export type ApiInsightsRouteStatsSort = z.infer<\n    typeof ApiInsightsRouteStatsSortSchema\n  >\n\n  export const ApiInsightsApiRouteSubstringSchema = z\n    .any()\n    .describe(\n      'Providing a substring will filter results where the API route contains the substring. This is a case-insensitive search.'\n    )\n  export type ApiInsightsApiRouteSubstring = z.infer<\n    typeof ApiInsightsApiRouteSubstringSchema\n  >\n\n  export const ApiInsightsSubjectStatsSchema = z\n    .array(\n      z.object({\n        subject_type: z.string().optional(),\n        subject_name: z.string().optional(),\n        subject_id: z.number().int().optional(),\n        total_request_count: z.number().int().optional(),\n        rate_limited_request_count: z.number().int().optional(),\n        last_rate_limited_timestamp: z.string().optional(),\n        last_request_timestamp: z.string().optional()\n      })\n    )\n    .describe('API Insights usage subject stats for an organization')\n  export type ApiInsightsSubjectStats = z.infer<\n    typeof ApiInsightsSubjectStatsSchema\n  >\n\n  export const ApiInsightsSortSchema = z\n    .any()\n    .describe('The property to sort the results by.')\n  export type ApiInsightsSort = z.infer<typeof ApiInsightsSortSchema>\n\n  export const ApiInsightsSubjectNameSubstringSchema = z\n    .any()\n    .describe(\n      'Providing a substring will filter results where the subject name contains the substring. This is a case-insensitive search.'\n    )\n  export type ApiInsightsSubjectNameSubstring = z.infer<\n    typeof ApiInsightsSubjectNameSubstringSchema\n  >\n\n  export const ApiInsightsSummaryStatsSchema = z\n    .object({\n      total_request_count: z\n        .number()\n        .int()\n        .describe('The total number of requests within the queried time period')\n        .optional(),\n      rate_limited_request_count: z\n        .number()\n        .int()\n        .describe(\n          'The total number of requests that were rate limited within the queried time period'\n        )\n        .optional()\n    })\n    .describe('API Insights usage summary stats for an organization')\n  export type ApiInsightsSummaryStats = z.infer<\n    typeof ApiInsightsSummaryStatsSchema\n  >\n\n  export const ApiInsightsUserIdSchema = z\n    .any()\n    .describe('The ID of the user to query for stats')\n  export type ApiInsightsUserId = z.infer<typeof ApiInsightsUserIdSchema>\n\n  export const ApiInsightsTimeStatsSchema = z\n    .array(\n      z.object({\n        timestamp: z.string().optional(),\n        total_request_count: z.number().int().optional(),\n        rate_limited_request_count: z.number().int().optional()\n      })\n    )\n    .describe('API Insights usage time stats for an organization')\n  export type ApiInsightsTimeStats = z.infer<typeof ApiInsightsTimeStatsSchema>\n\n  export const ApiInsightsTimestampIncrementSchema = z\n    .any()\n    .describe(\n      'The increment of time used to breakdown the query results (5m, 10m, 1h, etc.)'\n    )\n  export type ApiInsightsTimestampIncrement = z.infer<\n    typeof ApiInsightsTimestampIncrementSchema\n  >\n\n  export const ApiInsightsUserStatsSchema = z\n    .array(\n      z.object({\n        actor_type: z.string().optional(),\n        actor_name: z.string().optional(),\n        actor_id: z.number().int().optional(),\n        integration_id: z.number().int().optional(),\n        oauth_application_id: z.number().int().optional(),\n        total_request_count: z.number().int().optional(),\n        rate_limited_request_count: z.number().int().optional(),\n        last_rate_limited_timestamp: z.string().optional(),\n        last_request_timestamp: z.string().optional()\n      })\n    )\n    .describe('API Insights usage stats for a user')\n  export type ApiInsightsUserStats = z.infer<typeof ApiInsightsUserStatsSchema>\n\n  export const ApiInsightsActorNameSubstringSchema = z\n    .any()\n    .describe(\n      'Providing a substring will filter results where the actor name contains the substring. This is a case-insensitive search.'\n    )\n  export type ApiInsightsActorNameSubstring = z.infer<\n    typeof ApiInsightsActorNameSubstringSchema\n  >\n\n  export const InteractionGroupSchema = z\n    .enum(['existing_users', 'contributors_only', 'collaborators_only'])\n    .describe(\n      'The type of GitHub user that can comment, open issues, or create pull requests while the interaction limit is in effect.'\n    )\n  export type InteractionGroup = z.infer<typeof InteractionGroupSchema>\n\n  export const InteractionExpirySchema = z\n    .enum(['one_day', 'three_days', 'one_week', 'one_month', 'six_months'])\n    .describe(\n      'The duration of the interaction restriction. Default: `one_day`.'\n    )\n  export type InteractionExpiry = z.infer<typeof InteractionExpirySchema>\n\n  export const InvitationIdSchema = z\n    .any()\n    .describe('The unique identifier of the invitation.')\n  export type InvitationId = z.infer<typeof InvitationIdSchema>\n\n  export const OrganizationCreateIssueTypeSchema = z.object({\n    name: z.string().describe('Name of the issue type.'),\n    is_enabled: z\n      .boolean()\n      .describe(\n        'Whether or not the issue type is enabled at the organization level.'\n      ),\n    is_private: z\n      .boolean()\n      .describe(\n        'Whether or not the issue type is restricted to issues in private repositories.'\n      )\n      .optional(),\n    description: z\n      .string()\n      .describe('Description of the issue type.')\n      .optional(),\n    color: z\n      .enum([\n        'gray',\n        'blue',\n        'green',\n        'yellow',\n        'orange',\n        'red',\n        'pink',\n        'purple'\n      ])\n      .describe('Color for the issue type.')\n      .optional()\n  })\n  export type OrganizationCreateIssueType = z.infer<\n    typeof OrganizationCreateIssueTypeSchema\n  >\n\n  export const OrganizationUpdateIssueTypeSchema = z.object({\n    name: z.string().describe('Name of the issue type.'),\n    is_enabled: z\n      .boolean()\n      .describe(\n        'Whether or not the issue type is enabled at the organization level.'\n      ),\n    is_private: z\n      .boolean()\n      .describe(\n        'Whether or not the issue type is restricted to issues in private repositories.'\n      )\n      .optional(),\n    description: z\n      .string()\n      .describe('Description of the issue type.')\n      .optional(),\n    color: z\n      .enum([\n        'gray',\n        'blue',\n        'green',\n        'yellow',\n        'orange',\n        'red',\n        'pink',\n        'purple'\n      ])\n      .describe('Color for the issue type.')\n      .optional()\n  })\n  export type OrganizationUpdateIssueType = z.infer<\n    typeof OrganizationUpdateIssueTypeSchema\n  >\n\n  export const IssueTypeIdSchema = z\n    .any()\n    .describe('The unique identifier of the issue type.')\n  export type IssueTypeId = z.infer<typeof IssueTypeIdSchema>\n\n  export const CodespaceNameSchema = z\n    .any()\n    .describe('The name of the codespace.')\n  export type CodespaceName = z.infer<typeof CodespaceNameSchema>\n\n  export const MigrationIdSchema = z\n    .any()\n    .describe('The unique identifier of the migration.')\n  export type MigrationId = z.infer<typeof MigrationIdSchema>\n\n  export const RepoNameSchema = z.any().describe('repo_name parameter')\n  export type RepoName = z.infer<typeof RepoNameSchema>\n\n  export const TeamSlugSchema = z.any().describe('The slug of the team name.')\n  export type TeamSlug = z.infer<typeof TeamSlugSchema>\n\n  export const RoleIdSchema = z\n    .any()\n    .describe('The unique identifier of the role.')\n  export type RoleId = z.infer<typeof RoleIdSchema>\n\n  export const TeamSimpleSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the team'),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the team'),\n      members_url: z.string(),\n      name: z.string().describe('Name of the team'),\n      description: z.string().describe('Description of the team'),\n      permission: z\n        .string()\n        .describe('Permission that the team will have for its repositories'),\n      privacy: z\n        .string()\n        .describe('The level of privacy this team should have')\n        .optional(),\n      notification_setting: z\n        .string()\n        .describe('The notification setting the team has set')\n        .optional(),\n      html_url: z.string().url(),\n      repositories_url: z.string().url(),\n      slug: z.string(),\n      ldap_dn: z\n        .string()\n        .describe(\n          'Distinguished Name (DN) that team maps to within LDAP environment'\n        )\n        .optional()\n    })\n    .describe(\n      'Groups of organization members that gives permissions on specified repositories.'\n    )\n  export type TeamSimple = z.infer<typeof TeamSimpleSchema>\n\n  export const PackageVisibilitySchema = z\n    .any()\n    .describe(\n      'The selected visibility of the packages.  This parameter is optional and only filters an existing result set.\\n\\nThe `internal` visibility is only supported for GitHub Packages registries that allow for granular permissions. For other ecosystems `internal` is synonymous with `private`.\\nFor the list of GitHub Packages registries that support granular permissions, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"'\n    )\n  export type PackageVisibility = z.infer<typeof PackageVisibilitySchema>\n\n  export const PackageTypeSchema = z\n    .any()\n    .describe(\n      \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n    )\n  export type PackageType = z.infer<typeof PackageTypeSchema>\n\n  export const PackageNameSchema = z.any().describe('The name of the package.')\n  export type PackageName = z.infer<typeof PackageNameSchema>\n\n  export const PackageVersionSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the package version.'),\n      name: z.string().describe('The name of the package version.'),\n      url: z.string(),\n      package_html_url: z.string(),\n      html_url: z.string().optional(),\n      license: z.string().optional(),\n      description: z.string().optional(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      deleted_at: z.string().datetime({ offset: true }).optional(),\n      metadata: z\n        .object({\n          package_type: z.enum([\n            'npm',\n            'maven',\n            'rubygems',\n            'docker',\n            'nuget',\n            'container'\n          ]),\n          container: z.object({ tags: z.array(z.string()) }).optional(),\n          docker: z.object({ tag: z.array(z.string()).optional() }).optional()\n        })\n        .optional()\n    })\n    .describe('A version of a software package')\n  export type PackageVersion = z.infer<typeof PackageVersionSchema>\n\n  export const PackageVersionIdSchema = z\n    .any()\n    .describe('Unique identifier of the package version.')\n  export type PackageVersionId = z.infer<typeof PackageVersionIdSchema>\n\n  export const PersonalAccessTokenSortSchema = z\n    .any()\n    .describe('The property by which to sort the results.')\n  export type PersonalAccessTokenSort = z.infer<\n    typeof PersonalAccessTokenSortSchema\n  >\n\n  export const PersonalAccessTokenOwnerSchema = z\n    .any()\n    .describe('A list of owner usernames to use to filter the results.')\n  export type PersonalAccessTokenOwner = z.infer<\n    typeof PersonalAccessTokenOwnerSchema\n  >\n\n  export const PersonalAccessTokenRepositorySchema = z\n    .any()\n    .describe('The name of the repository to use to filter the results.')\n  export type PersonalAccessTokenRepository = z.infer<\n    typeof PersonalAccessTokenRepositorySchema\n  >\n\n  export const PersonalAccessTokenPermissionSchema = z\n    .any()\n    .describe('The permission to use to filter the results.')\n  export type PersonalAccessTokenPermission = z.infer<\n    typeof PersonalAccessTokenPermissionSchema\n  >\n\n  export const PersonalAccessTokenBeforeSchema = z\n    .any()\n    .describe(\n      'Only show fine-grained personal access tokens used before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type PersonalAccessTokenBefore = z.infer<\n    typeof PersonalAccessTokenBeforeSchema\n  >\n\n  export const PersonalAccessTokenAfterSchema = z\n    .any()\n    .describe(\n      'Only show fine-grained personal access tokens used after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type PersonalAccessTokenAfter = z.infer<\n    typeof PersonalAccessTokenAfterSchema\n  >\n\n  export const PersonalAccessTokenTokenIdSchema = z\n    .any()\n    .describe('The ID of the token')\n  export type PersonalAccessTokenTokenId = z.infer<\n    typeof PersonalAccessTokenTokenIdSchema\n  >\n\n  export const FineGrainedPersonalAccessTokenIdSchema = z\n    .any()\n    .describe(\n      'The unique identifier of the fine-grained personal access token.'\n    )\n  export type FineGrainedPersonalAccessTokenId = z.infer<\n    typeof FineGrainedPersonalAccessTokenIdSchema\n  >\n\n  export const OrgPrivateRegistryConfigurationSchema = z\n    .object({\n      name: z\n        .string()\n        .describe('The name of the private registry configuration.'),\n      registry_type: z\n        .literal('maven_repository')\n        .describe('The registry type.'),\n      username: z\n        .string()\n        .describe(\n          'The username to use when authenticating with the private registry.'\n        )\n        .optional(),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe(\n          'Which type of organization repositories have access to the private registry.'\n        ),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Private registry configuration for an organization')\n  export type OrgPrivateRegistryConfiguration = z.infer<\n    typeof OrgPrivateRegistryConfigurationSchema\n  >\n\n  export const OrgPrivateRegistryConfigurationWithSelectedRepositoriesSchema = z\n    .object({\n      name: z\n        .string()\n        .describe('The name of the private registry configuration.'),\n      registry_type: z\n        .literal('maven_repository')\n        .describe('The registry type.'),\n      username: z\n        .string()\n        .describe(\n          'The username to use when authenticating with the private registry.'\n        )\n        .optional(),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe(\n          'Which type of organization repositories have access to the private registry. `selected` means only the repositories specified by `selected_repository_ids` can access the private registry.'\n        ),\n      selected_repository_ids: z\n        .array(z.number().int())\n        .describe(\n          'An array of repository IDs that can access the organization private registry when `visibility` is set to `selected`.'\n        )\n        .optional(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Private registry configuration for an organization')\n  export type OrgPrivateRegistryConfigurationWithSelectedRepositories = z.infer<\n    typeof OrgPrivateRegistryConfigurationWithSelectedRepositoriesSchema\n  >\n\n  export const CustomPropertySchema = z\n    .object({\n      property_name: z.string().describe('The name of the property'),\n      url: z\n        .string()\n        .url()\n        .describe(\n          'The URL that can be used to fetch, update, or delete info about this property via the API.'\n        )\n        .optional(),\n      source_type: z\n        .enum(['organization', 'enterprise'])\n        .describe('The source type of the property')\n        .optional(),\n      value_type: z\n        .enum(['string', 'single_select', 'multi_select', 'true_false'])\n        .describe('The type of the value for the property'),\n      required: z\n        .boolean()\n        .describe('Whether the property is required.')\n        .optional(),\n      default_value: z\n        .union([z.string(), z.array(z.string())])\n        .describe('Default value of the property')\n        .optional(),\n      description: z\n        .string()\n        .describe('Short description of the property')\n        .optional(),\n      allowed_values: z\n        .array(z.string().max(75))\n        .max(200)\n        .describe(\n          'An ordered list of the allowed values of the property.\\nThe property can have up to 200 allowed values.'\n        )\n        .optional(),\n      values_editable_by: z\n        .enum(['org_actors', 'org_and_repo_actors'])\n        .describe('Who can edit the values of the property')\n        .optional()\n    })\n    .describe('Custom property defined on an organization')\n  export type CustomProperty = z.infer<typeof CustomPropertySchema>\n\n  export const CustomPropertyNameSchema = z\n    .any()\n    .describe('The custom property name')\n  export type CustomPropertyName = z.infer<typeof CustomPropertyNameSchema>\n\n  export const CustomPropertySetPayloadSchema = z\n    .object({\n      value_type: z\n        .enum(['string', 'single_select', 'multi_select', 'true_false'])\n        .describe('The type of the value for the property'),\n      required: z\n        .boolean()\n        .describe('Whether the property is required.')\n        .optional(),\n      default_value: z\n        .union([z.string(), z.array(z.string())])\n        .describe('Default value of the property')\n        .optional(),\n      description: z\n        .string()\n        .describe('Short description of the property')\n        .optional(),\n      allowed_values: z\n        .array(z.string().max(75))\n        .max(200)\n        .describe(\n          'An ordered list of the allowed values of the property.\\nThe property can have up to 200 allowed values.'\n        )\n        .optional(),\n      values_editable_by: z\n        .enum(['org_actors', 'org_and_repo_actors'])\n        .describe('Who can edit the values of the property')\n        .optional()\n    })\n    .describe('Custom property set payload')\n  export type CustomPropertySetPayload = z.infer<\n    typeof CustomPropertySetPayloadSchema\n  >\n\n  export const CustomPropertyValueSchema = z\n    .object({\n      property_name: z.string().describe('The name of the property'),\n      value: z\n        .union([z.string(), z.array(z.string())])\n        .describe('The value assigned to the property')\n    })\n    .describe('Custom property name and associated value')\n  export type CustomPropertyValue = z.infer<typeof CustomPropertyValueSchema>\n\n  export const CodeOfConductSimpleSchema = z\n    .object({\n      url: z.string().url(),\n      key: z.string(),\n      name: z.string(),\n      html_url: z.string().url()\n    })\n    .describe('Code of Conduct Simple')\n  export type CodeOfConductSimple = z.infer<typeof CodeOfConductSimpleSchema>\n\n  export const RepositoryRuleEnforcementSchema = z\n    .enum(['disabled', 'active', 'evaluate'])\n    .describe(\n      'The enforcement level of the ruleset. `evaluate` allows admins to test rules before enforcing them. Admins can view insights on the Rule Insights page (`evaluate` is only available with GitHub Enterprise).'\n    )\n  export type RepositoryRuleEnforcement = z.infer<\n    typeof RepositoryRuleEnforcementSchema\n  >\n\n  export const RepositoryRulesetBypassActorSchema = z\n    .object({\n      actor_id: z\n        .number()\n        .int()\n        .describe(\n          'The ID of the actor that can bypass a ruleset. If `actor_type` is `OrganizationAdmin`, this should be `1`. If `actor_type` is `DeployKey`, this should be null. `OrganizationAdmin` is not applicable for personal repositories.'\n        )\n        .optional(),\n      actor_type: z\n        .enum([\n          'Integration',\n          'OrganizationAdmin',\n          'RepositoryRole',\n          'Team',\n          'DeployKey'\n        ])\n        .describe('The type of actor that can bypass a ruleset.'),\n      bypass_mode: z\n        .enum(['always', 'pull_request'])\n        .describe(\n          'When the specified actor can bypass the ruleset. `pull_request` means that an actor can only bypass rules on pull requests. `pull_request` is not applicable for the `DeployKey` actor type. Also, `pull_request` is only applicable to branch rulesets.'\n        )\n        .default('always')\n    })\n    .describe('An actor that can bypass rules in a ruleset')\n  export type RepositoryRulesetBypassActor = z.infer<\n    typeof RepositoryRulesetBypassActorSchema\n  >\n\n  export const RepositoryRulesetConditionsSchema = z\n    .object({\n      ref_name: z\n        .object({\n          include: z\n            .array(z.string())\n            .describe(\n              'Array of ref names or patterns to include. One of these patterns must match for the condition to pass. Also accepts `~DEFAULT_BRANCH` to include the default branch or `~ALL` to include all branches.'\n            )\n            .optional(),\n          exclude: z\n            .array(z.string())\n            .describe(\n              'Array of ref names or patterns to exclude. The condition will not pass if any of these patterns match.'\n            )\n            .optional()\n        })\n        .optional()\n    })\n    .describe('Parameters for a repository ruleset ref name condition')\n  export type RepositoryRulesetConditions = z.infer<\n    typeof RepositoryRulesetConditionsSchema\n  >\n\n  export const RepositoryRulesetConditionsRepositoryNameTargetSchema = z\n    .object({\n      repository_name: z.object({\n        include: z\n          .array(z.string())\n          .describe(\n            'Array of repository names or patterns to include. One of these patterns must match for the condition to pass. Also accepts `~ALL` to include all repositories.'\n          )\n          .optional(),\n        exclude: z\n          .array(z.string())\n          .describe(\n            'Array of repository names or patterns to exclude. The condition will not pass if any of these patterns match.'\n          )\n          .optional(),\n        protected: z\n          .boolean()\n          .describe('Whether renaming of target repositories is prevented.')\n          .optional()\n      })\n    })\n    .describe('Parameters for a repository name condition')\n  export type RepositoryRulesetConditionsRepositoryNameTarget = z.infer<\n    typeof RepositoryRulesetConditionsRepositoryNameTargetSchema\n  >\n\n  export const RepositoryRulesetConditionsRepositoryIdTargetSchema = z\n    .object({\n      repository_id: z.object({\n        repository_ids: z\n          .array(z.number().int())\n          .describe(\n            'The repository IDs that the ruleset applies to. One of these IDs must match for the condition to pass.'\n          )\n          .optional()\n      })\n    })\n    .describe('Parameters for a repository ID condition')\n  export type RepositoryRulesetConditionsRepositoryIdTarget = z.infer<\n    typeof RepositoryRulesetConditionsRepositoryIdTargetSchema\n  >\n\n  export const RepositoryRulesetConditionsRepositoryPropertySpecSchema = z\n    .object({\n      name: z\n        .string()\n        .describe('The name of the repository property to target'),\n      property_values: z\n        .array(z.string())\n        .describe('The values to match for the repository property'),\n      source: z\n        .enum(['custom', 'system'])\n        .describe(\n          \"The source of the repository property. Defaults to 'custom' if not specified.\"\n        )\n        .optional()\n    })\n    .describe('Parameters for a targeting a repository property')\n  export type RepositoryRulesetConditionsRepositoryPropertySpec = z.infer<\n    typeof RepositoryRulesetConditionsRepositoryPropertySpecSchema\n  >\n\n  export const RepositoryRuleCreationSchema = z\n    .object({ type: z.literal('creation') })\n    .describe(\n      'Only allow users with bypass permission to create matching refs.'\n    )\n  export type RepositoryRuleCreation = z.infer<\n    typeof RepositoryRuleCreationSchema\n  >\n\n  export const RepositoryRuleUpdateSchema = z\n    .object({\n      type: z.literal('update'),\n      parameters: z\n        .object({\n          update_allows_fetch_and_merge: z\n            .boolean()\n            .describe('Branch can pull changes from its upstream repository')\n        })\n        .optional()\n    })\n    .describe(\n      'Only allow users with bypass permission to update matching refs.'\n    )\n  export type RepositoryRuleUpdate = z.infer<typeof RepositoryRuleUpdateSchema>\n\n  export const RepositoryRuleDeletionSchema = z\n    .object({ type: z.literal('deletion') })\n    .describe(\n      'Only allow users with bypass permissions to delete matching refs.'\n    )\n  export type RepositoryRuleDeletion = z.infer<\n    typeof RepositoryRuleDeletionSchema\n  >\n\n  export const RepositoryRuleRequiredLinearHistorySchema = z\n    .object({ type: z.literal('required_linear_history') })\n    .describe('Prevent merge commits from being pushed to matching refs.')\n  export type RepositoryRuleRequiredLinearHistory = z.infer<\n    typeof RepositoryRuleRequiredLinearHistorySchema\n  >\n\n  export const RepositoryRuleMergeQueueSchema = z\n    .object({\n      type: z.literal('merge_queue'),\n      parameters: z\n        .object({\n          check_response_timeout_minutes: z\n            .number()\n            .int()\n            .gte(1)\n            .lte(360)\n            .describe(\n              'Maximum time for a required status check to report a conclusion. After this much time has elapsed, checks that have not reported a conclusion will be assumed to have failed'\n            ),\n          grouping_strategy: z\n            .enum(['ALLGREEN', 'HEADGREEN'])\n            .describe(\n              'When set to ALLGREEN, the merge commit created by merge queue for each PR in the group must pass all required checks to merge. When set to HEADGREEN, only the commit at the head of the merge group, i.e. the commit containing changes from all of the PRs in the group, must pass its required checks to merge.'\n            ),\n          max_entries_to_build: z\n            .number()\n            .int()\n            .gte(0)\n            .lte(100)\n            .describe(\n              'Limit the number of queued pull requests requesting checks and workflow runs at the same time.'\n            ),\n          max_entries_to_merge: z\n            .number()\n            .int()\n            .gte(0)\n            .lte(100)\n            .describe(\n              'The maximum number of PRs that will be merged together in a group.'\n            ),\n          merge_method: z\n            .enum(['MERGE', 'SQUASH', 'REBASE'])\n            .describe(\n              'Method to use when merging changes from queued pull requests.'\n            ),\n          min_entries_to_merge: z\n            .number()\n            .int()\n            .gte(0)\n            .lte(100)\n            .describe(\n              'The minimum number of PRs that will be merged together in a group.'\n            ),\n          min_entries_to_merge_wait_minutes: z\n            .number()\n            .int()\n            .gte(0)\n            .lte(360)\n            .describe(\n              'The time merge queue should wait after the first PR is added to the queue for the minimum group size to be met. After this time has elapsed, the minimum group size will be ignored and a smaller group will be merged.'\n            )\n        })\n        .optional()\n    })\n    .describe('Merges must be performed via a merge queue.')\n  export type RepositoryRuleMergeQueue = z.infer<\n    typeof RepositoryRuleMergeQueueSchema\n  >\n\n  export const RepositoryRuleRequiredDeploymentsSchema = z\n    .object({\n      type: z.literal('required_deployments'),\n      parameters: z\n        .object({\n          required_deployment_environments: z\n            .array(z.string())\n            .describe(\n              'The environments that must be successfully deployed to before branches can be merged.'\n            )\n        })\n        .optional()\n    })\n    .describe(\n      'Choose which environments must be successfully deployed to before refs can be pushed into a ref that matches this rule.'\n    )\n  export type RepositoryRuleRequiredDeployments = z.infer<\n    typeof RepositoryRuleRequiredDeploymentsSchema\n  >\n\n  export const RepositoryRuleRequiredSignaturesSchema = z\n    .object({ type: z.literal('required_signatures') })\n    .describe('Commits pushed to matching refs must have verified signatures.')\n  export type RepositoryRuleRequiredSignatures = z.infer<\n    typeof RepositoryRuleRequiredSignaturesSchema\n  >\n\n  export const RepositoryRulePullRequestSchema = z\n    .object({\n      type: z.literal('pull_request'),\n      parameters: z\n        .object({\n          allowed_merge_methods: z\n            .array(z.enum(['merge', 'squash', 'rebase']))\n            .describe(\n              'Array of allowed merge methods. Allowed values include `merge`, `squash`, and `rebase`. At least one option must be enabled.'\n            )\n            .optional(),\n          automatic_copilot_code_review_enabled: z\n            .boolean()\n            .describe(\n              '> [!NOTE]\\n> `automatic_copilot_code_review_enabled` is in beta and subject to change.\\n\\nAutomatically request review from Copilot for new pull requests, if the author has access to Copilot code review.'\n            )\n            .optional(),\n          dismiss_stale_reviews_on_push: z\n            .boolean()\n            .describe(\n              'New, reviewable commits pushed will dismiss previous pull request review approvals.'\n            ),\n          require_code_owner_review: z\n            .boolean()\n            .describe(\n              'Require an approving review in pull requests that modify files that have a designated code owner.'\n            ),\n          require_last_push_approval: z\n            .boolean()\n            .describe(\n              'Whether the most recent reviewable push must be approved by someone other than the person who pushed it.'\n            ),\n          required_approving_review_count: z\n            .number()\n            .int()\n            .gte(0)\n            .lte(10)\n            .describe(\n              'The number of approving reviews that are required before a pull request can be merged.'\n            ),\n          required_review_thread_resolution: z\n            .boolean()\n            .describe(\n              'All conversations on code must be resolved before a pull request can be merged.'\n            )\n        })\n        .optional()\n    })\n    .describe(\n      'Require all commits be made to a non-target branch and submitted via a pull request before they can be merged.'\n    )\n  export type RepositoryRulePullRequest = z.infer<\n    typeof RepositoryRulePullRequestSchema\n  >\n\n  export const RepositoryRuleParamsStatusCheckConfigurationSchema = z\n    .object({\n      context: z\n        .string()\n        .describe(\n          'The status check context name that must be present on the commit.'\n        ),\n      integration_id: z\n        .number()\n        .int()\n        .describe(\n          'The optional integration ID that this status check must originate from.'\n        )\n        .optional()\n    })\n    .describe('Required status check')\n  export type RepositoryRuleParamsStatusCheckConfiguration = z.infer<\n    typeof RepositoryRuleParamsStatusCheckConfigurationSchema\n  >\n\n  export const RepositoryRuleNonFastForwardSchema = z\n    .object({ type: z.literal('non_fast_forward') })\n    .describe('Prevent users with push access from force pushing to refs.')\n  export type RepositoryRuleNonFastForward = z.infer<\n    typeof RepositoryRuleNonFastForwardSchema\n  >\n\n  export const RepositoryRuleCommitMessagePatternSchema = z\n    .object({\n      type: z.literal('commit_message_pattern'),\n      parameters: z\n        .object({\n          name: z\n            .string()\n            .describe('How this rule will appear to users.')\n            .optional(),\n          negate: z\n            .boolean()\n            .describe('If true, the rule will fail if the pattern matches.')\n            .optional(),\n          operator: z\n            .enum(['starts_with', 'ends_with', 'contains', 'regex'])\n            .describe('The operator to use for matching.'),\n          pattern: z.string().describe('The pattern to match with.')\n        })\n        .optional()\n    })\n    .describe('Parameters to be used for the commit_message_pattern rule')\n  export type RepositoryRuleCommitMessagePattern = z.infer<\n    typeof RepositoryRuleCommitMessagePatternSchema\n  >\n\n  export const RepositoryRuleCommitAuthorEmailPatternSchema = z\n    .object({\n      type: z.literal('commit_author_email_pattern'),\n      parameters: z\n        .object({\n          name: z\n            .string()\n            .describe('How this rule will appear to users.')\n            .optional(),\n          negate: z\n            .boolean()\n            .describe('If true, the rule will fail if the pattern matches.')\n            .optional(),\n          operator: z\n            .enum(['starts_with', 'ends_with', 'contains', 'regex'])\n            .describe('The operator to use for matching.'),\n          pattern: z.string().describe('The pattern to match with.')\n        })\n        .optional()\n    })\n    .describe('Parameters to be used for the commit_author_email_pattern rule')\n  export type RepositoryRuleCommitAuthorEmailPattern = z.infer<\n    typeof RepositoryRuleCommitAuthorEmailPatternSchema\n  >\n\n  export const RepositoryRuleCommitterEmailPatternSchema = z\n    .object({\n      type: z.literal('committer_email_pattern'),\n      parameters: z\n        .object({\n          name: z\n            .string()\n            .describe('How this rule will appear to users.')\n            .optional(),\n          negate: z\n            .boolean()\n            .describe('If true, the rule will fail if the pattern matches.')\n            .optional(),\n          operator: z\n            .enum(['starts_with', 'ends_with', 'contains', 'regex'])\n            .describe('The operator to use for matching.'),\n          pattern: z.string().describe('The pattern to match with.')\n        })\n        .optional()\n    })\n    .describe('Parameters to be used for the committer_email_pattern rule')\n  export type RepositoryRuleCommitterEmailPattern = z.infer<\n    typeof RepositoryRuleCommitterEmailPatternSchema\n  >\n\n  export const RepositoryRuleBranchNamePatternSchema = z\n    .object({\n      type: z.literal('branch_name_pattern'),\n      parameters: z\n        .object({\n          name: z\n            .string()\n            .describe('How this rule will appear to users.')\n            .optional(),\n          negate: z\n            .boolean()\n            .describe('If true, the rule will fail if the pattern matches.')\n            .optional(),\n          operator: z\n            .enum(['starts_with', 'ends_with', 'contains', 'regex'])\n            .describe('The operator to use for matching.'),\n          pattern: z.string().describe('The pattern to match with.')\n        })\n        .optional()\n    })\n    .describe('Parameters to be used for the branch_name_pattern rule')\n  export type RepositoryRuleBranchNamePattern = z.infer<\n    typeof RepositoryRuleBranchNamePatternSchema\n  >\n\n  export const RepositoryRuleTagNamePatternSchema = z\n    .object({\n      type: z.literal('tag_name_pattern'),\n      parameters: z\n        .object({\n          name: z\n            .string()\n            .describe('How this rule will appear to users.')\n            .optional(),\n          negate: z\n            .boolean()\n            .describe('If true, the rule will fail if the pattern matches.')\n            .optional(),\n          operator: z\n            .enum(['starts_with', 'ends_with', 'contains', 'regex'])\n            .describe('The operator to use for matching.'),\n          pattern: z.string().describe('The pattern to match with.')\n        })\n        .optional()\n    })\n    .describe('Parameters to be used for the tag_name_pattern rule')\n  export type RepositoryRuleTagNamePattern = z.infer<\n    typeof RepositoryRuleTagNamePatternSchema\n  >\n\n  export const RepositoryRuleFilePathRestrictionSchema = z\n    .object({\n      type: z.literal('file_path_restriction'),\n      parameters: z\n        .object({\n          restricted_file_paths: z\n            .array(z.string())\n            .describe(\n              'The file paths that are restricted from being pushed to the commit graph.'\n            )\n        })\n        .optional()\n    })\n    .describe(\n      'Prevent commits that include changes in specified file and folder paths from being pushed to the commit graph. This includes absolute paths that contain file names.'\n    )\n  export type RepositoryRuleFilePathRestriction = z.infer<\n    typeof RepositoryRuleFilePathRestrictionSchema\n  >\n\n  export const RepositoryRuleMaxFilePathLengthSchema = z\n    .object({\n      type: z.literal('max_file_path_length'),\n      parameters: z\n        .object({\n          max_file_path_length: z\n            .number()\n            .int()\n            .gte(1)\n            .lte(256)\n            .describe('The maximum amount of characters allowed in file paths.')\n        })\n        .optional()\n    })\n    .describe(\n      'Prevent commits that include file paths that exceed the specified character limit from being pushed to the commit graph.'\n    )\n  export type RepositoryRuleMaxFilePathLength = z.infer<\n    typeof RepositoryRuleMaxFilePathLengthSchema\n  >\n\n  export const RepositoryRuleFileExtensionRestrictionSchema = z\n    .object({\n      type: z.literal('file_extension_restriction'),\n      parameters: z\n        .object({\n          restricted_file_extensions: z\n            .array(z.string())\n            .describe(\n              'The file extensions that are restricted from being pushed to the commit graph.'\n            )\n        })\n        .optional()\n    })\n    .describe(\n      'Prevent commits that include files with specified file extensions from being pushed to the commit graph.'\n    )\n  export type RepositoryRuleFileExtensionRestriction = z.infer<\n    typeof RepositoryRuleFileExtensionRestrictionSchema\n  >\n\n  export const RepositoryRuleMaxFileSizeSchema = z\n    .object({\n      type: z.literal('max_file_size'),\n      parameters: z\n        .object({\n          max_file_size: z\n            .number()\n            .int()\n            .gte(1)\n            .lte(100)\n            .describe(\n              'The maximum file size allowed in megabytes. This limit does not apply to Git Large File Storage (Git LFS).'\n            )\n        })\n        .optional()\n    })\n    .describe(\n      'Prevent commits with individual files that exceed the specified limit from being pushed to the commit graph.'\n    )\n  export type RepositoryRuleMaxFileSize = z.infer<\n    typeof RepositoryRuleMaxFileSizeSchema\n  >\n\n  export const RepositoryRuleParamsWorkflowFileReferenceSchema = z\n    .object({\n      path: z.string().describe('The path to the workflow file'),\n      ref: z\n        .string()\n        .describe('The ref (branch or tag) of the workflow file to use')\n        .optional(),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The ID of the repository where the workflow is defined'),\n      sha: z\n        .string()\n        .describe('The commit SHA of the workflow file to use')\n        .optional()\n    })\n    .describe('A workflow that must run for this rule to pass')\n  export type RepositoryRuleParamsWorkflowFileReference = z.infer<\n    typeof RepositoryRuleParamsWorkflowFileReferenceSchema\n  >\n\n  export const RepositoryRuleParamsCodeScanningToolSchema = z\n    .object({\n      alerts_threshold: z\n        .enum(['none', 'errors', 'errors_and_warnings', 'all'])\n        .describe(\n          'The severity level at which code scanning results that raise alerts block a reference update. For more information on alert severity levels, see \"[About code scanning alerts](https://docs.github.com/code-security/code-scanning/managing-code-scanning-alerts/about-code-scanning-alerts#about-alert-severity-and-security-severity-levels).\"'\n        ),\n      security_alerts_threshold: z\n        .enum(['none', 'critical', 'high_or_higher', 'medium_or_higher', 'all'])\n        .describe(\n          'The severity level at which code scanning results that raise security alerts block a reference update. For more information on security severity levels, see \"[About code scanning alerts](https://docs.github.com/code-security/code-scanning/managing-code-scanning-alerts/about-code-scanning-alerts#about-alert-severity-and-security-severity-levels).\"'\n        ),\n      tool: z.string().describe('The name of a code scanning tool')\n    })\n    .describe(\n      'A tool that must provide code scanning results for this rule to pass.'\n    )\n  export type RepositoryRuleParamsCodeScanningTool = z.infer<\n    typeof RepositoryRuleParamsCodeScanningToolSchema\n  >\n\n  export const RulesetTargetsSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of rule targets to filter by.\\nIf provided, only rulesets that apply to the specified targets will be returned.\\nFor example, `branch,tag,push`.\\n'\n    )\n  export type RulesetTargets = z.infer<typeof RulesetTargetsSchema>\n\n  export const RuleSuitesSchema = z\n    .array(\n      z.object({\n        id: z\n          .number()\n          .int()\n          .describe('The unique identifier of the rule insight.')\n          .optional(),\n        actor_id: z\n          .number()\n          .int()\n          .describe('The number that identifies the user.')\n          .optional(),\n        actor_name: z\n          .string()\n          .describe('The handle for the GitHub user account.')\n          .optional(),\n        before_sha: z\n          .string()\n          .describe('The first commit sha before the push evaluation.')\n          .optional(),\n        after_sha: z\n          .string()\n          .describe('The last commit sha in the push evaluation.')\n          .optional(),\n        ref: z\n          .string()\n          .describe('The ref name that the evaluation ran on.')\n          .optional(),\n        repository_id: z\n          .number()\n          .int()\n          .describe(\n            'The ID of the repository associated with the rule evaluation.'\n          )\n          .optional(),\n        repository_name: z\n          .string()\n          .describe('The name of the repository without the `.git` extension.')\n          .optional(),\n        pushed_at: z.string().datetime({ offset: true }).optional(),\n        result: z\n          .enum(['pass', 'fail', 'bypass'])\n          .describe(\n            'The result of the rule evaluations for rules with the `active` enforcement status.'\n          )\n          .optional(),\n        evaluation_result: z\n          .enum(['pass', 'fail', 'bypass'])\n          .describe(\n            'The result of the rule evaluations for rules with the `active` and `evaluate` enforcement statuses, demonstrating whether rules would pass or fail if all rules in the rule suite were `active`.'\n          )\n          .optional()\n      })\n    )\n    .describe('Response')\n  export type RuleSuites = z.infer<typeof RuleSuitesSchema>\n\n  export const RefInQuerySchema = z\n    .any()\n    .describe(\n      'The name of the ref. Cannot contain wildcard characters. Optionally prefix with `refs/heads/` to limit to branches or `refs/tags/` to limit to tags. Omit the prefix to search across all refs. When specified, only rule evaluations triggered for this ref will be returned.'\n    )\n  export type RefInQuery = z.infer<typeof RefInQuerySchema>\n\n  export const RepositoryNameInQuerySchema = z\n    .any()\n    .describe('The name of the repository to filter on.')\n  export type RepositoryNameInQuery = z.infer<\n    typeof RepositoryNameInQuerySchema\n  >\n\n  export const TimePeriodSchema = z\n    .any()\n    .describe(\n      'The time period to filter by.\\n\\nFor example, `day` will filter for rule suites that occurred in the past 24 hours, and `week` will filter for insights that occurred in the past 7 days (168 hours).'\n    )\n  export type TimePeriod = z.infer<typeof TimePeriodSchema>\n\n  export const ActorNameInQuerySchema = z\n    .any()\n    .describe(\n      'The handle for the GitHub user account to filter on. When specified, only rule evaluations triggered by this actor will be returned.'\n    )\n  export type ActorNameInQuery = z.infer<typeof ActorNameInQuerySchema>\n\n  export const RuleSuiteResultSchema = z\n    .any()\n    .describe(\n      'The rule results to filter on. When specified, only suites with this result will be returned.'\n    )\n  export type RuleSuiteResult = z.infer<typeof RuleSuiteResultSchema>\n\n  export const RuleSuiteSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the rule insight.')\n        .optional(),\n      actor_id: z\n        .number()\n        .int()\n        .describe('The number that identifies the user.')\n        .optional(),\n      actor_name: z\n        .string()\n        .describe('The handle for the GitHub user account.')\n        .optional(),\n      before_sha: z\n        .string()\n        .describe('The first commit sha before the push evaluation.')\n        .optional(),\n      after_sha: z\n        .string()\n        .describe('The last commit sha in the push evaluation.')\n        .optional(),\n      ref: z\n        .string()\n        .describe('The ref name that the evaluation ran on.')\n        .optional(),\n      repository_id: z\n        .number()\n        .int()\n        .describe(\n          'The ID of the repository associated with the rule evaluation.'\n        )\n        .optional(),\n      repository_name: z\n        .string()\n        .describe('The name of the repository without the `.git` extension.')\n        .optional(),\n      pushed_at: z.string().datetime({ offset: true }).optional(),\n      result: z\n        .enum(['pass', 'fail', 'bypass'])\n        .describe(\n          'The result of the rule evaluations for rules with the `active` enforcement status.'\n        )\n        .optional(),\n      evaluation_result: z\n        .enum(['pass', 'fail', 'bypass'])\n        .describe(\n          'The result of the rule evaluations for rules with the `active` and `evaluate` enforcement statuses, demonstrating whether rules would pass or fail if all rules in the rule suite were `active`. Null if no rules with `evaluate` enforcement status were run.'\n        )\n        .optional(),\n      rule_evaluations: z\n        .array(\n          z.object({\n            rule_source: z\n              .object({\n                type: z\n                  .string()\n                  .describe('The type of rule source.')\n                  .optional(),\n                id: z\n                  .number()\n                  .int()\n                  .describe('The ID of the rule source.')\n                  .optional(),\n                name: z\n                  .string()\n                  .describe('The name of the rule source.')\n                  .optional()\n              })\n              .optional(),\n            enforcement: z\n              .enum(['active', 'evaluate', 'deleted ruleset'])\n              .describe('The enforcement level of this rule source.')\n              .optional(),\n            result: z\n              .enum(['pass', 'fail'])\n              .describe('The result of the evaluation of the individual rule.')\n              .optional(),\n            rule_type: z.string().describe('The type of rule.').optional(),\n            details: z\n              .string()\n              .describe(\n                'The detailed failure message for the rule. Null if the rule passed.'\n              )\n              .optional()\n          })\n        )\n        .describe('Details on the evaluated rules.')\n        .optional()\n    })\n    .describe('Response')\n  export type RuleSuite = z.infer<typeof RuleSuiteSchema>\n\n  export const RuleSuiteIdSchema = z\n    .any()\n    .describe(\n      'The unique identifier of the rule suite result.\\nTo get this ID, you can use [GET /repos/{owner}/{repo}/rulesets/rule-suites](https://docs.github.com/rest/repos/rule-suites#list-repository-rule-suites)\\nfor repositories and [GET /orgs/{org}/rulesets/rule-suites](https://docs.github.com/rest/orgs/rule-suites#list-organization-rule-suites)\\nfor organizations.'\n    )\n  export type RuleSuiteId = z.infer<typeof RuleSuiteIdSchema>\n\n  export const RulesetVersionSchema = z\n    .object({\n      version_id: z\n        .number()\n        .int()\n        .describe('The ID of the previous version of the ruleset'),\n      actor: z\n        .object({\n          id: z.number().int().optional(),\n          type: z.string().optional()\n        })\n        .describe('The actor who updated the ruleset'),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('The historical version of a ruleset')\n  export type RulesetVersion = z.infer<typeof RulesetVersionSchema>\n\n  export const SecretScanningPaginationBeforeOrgRepoSchema = z\n    .any()\n    .describe(\n      'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for events before this cursor. To receive an initial cursor on your first request, include an empty \"before\" query string.'\n    )\n  export type SecretScanningPaginationBeforeOrgRepo = z.infer<\n    typeof SecretScanningPaginationBeforeOrgRepoSchema\n  >\n\n  export const SecretScanningPaginationAfterOrgRepoSchema = z\n    .any()\n    .describe(\n      'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for events after this cursor.  To receive an initial cursor on your first request, include an empty \"after\" query string.'\n    )\n  export type SecretScanningPaginationAfterOrgRepo = z.infer<\n    typeof SecretScanningPaginationAfterOrgRepoSchema\n  >\n\n  export const ActionsBillingUsageSchema = z.object({\n    total_minutes_used: z\n      .number()\n      .int()\n      .describe('The sum of the free and paid GitHub Actions minutes used.'),\n    total_paid_minutes_used: z\n      .number()\n      .int()\n      .describe('The total paid GitHub Actions minutes used.'),\n    included_minutes: z\n      .number()\n      .int()\n      .describe('The amount of free GitHub Actions minutes available.'),\n    minutes_used_breakdown: z.object({\n      UBUNTU: z\n        .number()\n        .int()\n        .describe('Total minutes used on Ubuntu runner machines.')\n        .optional(),\n      MACOS: z\n        .number()\n        .int()\n        .describe('Total minutes used on macOS runner machines.')\n        .optional(),\n      WINDOWS: z\n        .number()\n        .int()\n        .describe('Total minutes used on Windows runner machines.')\n        .optional(),\n      ubuntu_4_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Ubuntu 4 core runner machines.')\n        .optional(),\n      ubuntu_8_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Ubuntu 8 core runner machines.')\n        .optional(),\n      ubuntu_16_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Ubuntu 16 core runner machines.')\n        .optional(),\n      ubuntu_32_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Ubuntu 32 core runner machines.')\n        .optional(),\n      ubuntu_64_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Ubuntu 64 core runner machines.')\n        .optional(),\n      windows_4_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Windows 4 core runner machines.')\n        .optional(),\n      windows_8_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Windows 8 core runner machines.')\n        .optional(),\n      windows_16_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Windows 16 core runner machines.')\n        .optional(),\n      windows_32_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Windows 32 core runner machines.')\n        .optional(),\n      windows_64_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on Windows 64 core runner machines.')\n        .optional(),\n      macos_12_core: z\n        .number()\n        .int()\n        .describe('Total minutes used on macOS 12 core runner machines.')\n        .optional(),\n      total: z\n        .number()\n        .int()\n        .describe('Total minutes used on all runner machines.')\n        .optional()\n    })\n  })\n  export type ActionsBillingUsage = z.infer<typeof ActionsBillingUsageSchema>\n\n  export const PackagesBillingUsageSchema = z.object({\n    total_gigabytes_bandwidth_used: z\n      .number()\n      .int()\n      .describe(\n        'Sum of the free and paid storage space (GB) for GitHuub Packages.'\n      ),\n    total_paid_gigabytes_bandwidth_used: z\n      .number()\n      .int()\n      .describe('Total paid storage space (GB) for GitHuub Packages.'),\n    included_gigabytes_bandwidth: z\n      .number()\n      .int()\n      .describe('Free storage space (GB) for GitHub Packages.')\n  })\n  export type PackagesBillingUsage = z.infer<typeof PackagesBillingUsageSchema>\n\n  export const CombinedBillingUsageSchema = z.object({\n    days_left_in_billing_cycle: z\n      .number()\n      .int()\n      .describe('Numbers of days left in billing cycle.'),\n    estimated_paid_storage_for_month: z\n      .number()\n      .int()\n      .describe('Estimated storage space (GB) used in billing cycle.'),\n    estimated_storage_for_month: z\n      .number()\n      .int()\n      .describe(\n        'Estimated sum of free and paid storage space (GB) used in billing cycle.'\n      )\n  })\n  export type CombinedBillingUsage = z.infer<typeof CombinedBillingUsageSchema>\n\n  export const NetworkConfigurationSchema = z\n    .object({\n      id: z\n        .string()\n        .describe('The unique identifier of the network configuration.'),\n      name: z.string().describe('The name of the network configuration.'),\n      compute_service: z\n        .enum(['none', 'actions', 'codespaces'])\n        .describe(\n          'The hosted compute service the network configuration supports.'\n        )\n        .optional(),\n      network_settings_ids: z\n        .array(z.string())\n        .describe(\n          'The unique identifier of each network settings in the configuration.'\n        )\n        .optional(),\n      created_on: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time at which the network configuration was created, in ISO 8601 format.'\n        )\n    })\n    .describe('A hosted compute network configuration.')\n  export type NetworkConfiguration = z.infer<typeof NetworkConfigurationSchema>\n\n  export const NetworkConfigurationIdSchema = z\n    .any()\n    .describe('Unique identifier of the hosted compute network configuration.')\n  export type NetworkConfigurationId = z.infer<\n    typeof NetworkConfigurationIdSchema\n  >\n\n  export const NetworkSettingsSchema = z\n    .object({\n      id: z\n        .string()\n        .describe('The unique identifier of the network settings resource.'),\n      network_configuration_id: z\n        .string()\n        .describe(\n          'The identifier of the network configuration that is using this settings resource.'\n        )\n        .optional(),\n      name: z.string().describe('The name of the network settings resource.'),\n      subnet_id: z\n        .string()\n        .describe(\n          'The subnet this network settings resource is configured for.'\n        ),\n      region: z\n        .string()\n        .describe(\n          'The location of the subnet this network settings resource is configured for.'\n        )\n    })\n    .describe('A hosted compute network settings resource.')\n  export type NetworkSettings = z.infer<typeof NetworkSettingsSchema>\n\n  export const NetworkSettingsIdSchema = z\n    .any()\n    .describe('Unique identifier of the hosted compute network settings.')\n  export type NetworkSettingsId = z.infer<typeof NetworkSettingsIdSchema>\n\n  export const TeamOrganizationSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string().url(),\n      hooks_url: z.string(),\n      issues_url: z.string(),\n      members_url: z.string(),\n      public_members_url: z.string(),\n      avatar_url: z.string(),\n      description: z.string(),\n      name: z.string().optional(),\n      company: z.string().optional(),\n      blog: z.string().url().optional(),\n      location: z.string().optional(),\n      email: z.string().email().optional(),\n      twitter_username: z.string().optional(),\n      is_verified: z.boolean().optional(),\n      has_organization_projects: z.boolean(),\n      has_repository_projects: z.boolean(),\n      public_repos: z.number().int(),\n      public_gists: z.number().int(),\n      followers: z.number().int(),\n      following: z.number().int(),\n      html_url: z.string().url(),\n      created_at: z.string().datetime({ offset: true }),\n      type: z.string(),\n      total_private_repos: z.number().int().optional(),\n      owned_private_repos: z.number().int().optional(),\n      private_gists: z.number().int().optional(),\n      disk_usage: z.number().int().optional(),\n      collaborators: z.number().int().optional(),\n      billing_email: z.string().email().optional(),\n      plan: z\n        .object({\n          name: z.string(),\n          space: z.number().int(),\n          private_repos: z.number().int(),\n          filled_seats: z.number().int().optional(),\n          seats: z.number().int().optional()\n        })\n        .optional(),\n      default_repository_permission: z.string().optional(),\n      members_can_create_repositories: z.boolean().optional(),\n      two_factor_requirement_enabled: z.boolean().optional(),\n      members_allowed_repository_creation_type: z.string().optional(),\n      members_can_create_public_repositories: z.boolean().optional(),\n      members_can_create_private_repositories: z.boolean().optional(),\n      members_can_create_internal_repositories: z.boolean().optional(),\n      members_can_create_pages: z.boolean().optional(),\n      members_can_create_public_pages: z.boolean().optional(),\n      members_can_create_private_pages: z.boolean().optional(),\n      members_can_fork_private_repositories: z.boolean().optional(),\n      web_commit_signoff_required: z.boolean().optional(),\n      updated_at: z.string().datetime({ offset: true }),\n      archived_at: z.string().datetime({ offset: true })\n    })\n    .describe('Team Organization')\n  export type TeamOrganization = z.infer<typeof TeamOrganizationSchema>\n\n  export const DiscussionNumberSchema = z\n    .any()\n    .describe('The number that identifies the discussion.')\n  export type DiscussionNumber = z.infer<typeof DiscussionNumberSchema>\n\n  export const CommentNumberSchema = z\n    .any()\n    .describe('The number that identifies the comment.')\n  export type CommentNumber = z.infer<typeof CommentNumberSchema>\n\n  export const ReactionIdSchema = z\n    .any()\n    .describe('The unique identifier of the reaction.')\n  export type ReactionId = z.infer<typeof ReactionIdSchema>\n\n  export const TeamMembershipSchema = z\n    .object({\n      url: z.string().url(),\n      role: z\n        .enum(['member', 'maintainer'])\n        .describe('The role of the user in the team.')\n        .default('member'),\n      state: z\n        .enum(['active', 'pending'])\n        .describe(\"The state of the user's membership in the team.\")\n    })\n    .describe('Team Membership')\n  export type TeamMembership = z.infer<typeof TeamMembershipSchema>\n\n  export const ProjectIdSchema = z\n    .any()\n    .describe('The unique identifier of the project.')\n  export type ProjectId = z.infer<typeof ProjectIdSchema>\n\n  export const SecurityProductSchema = z\n    .any()\n    .describe('The security feature to enable or disable.')\n  export type SecurityProduct = z.infer<typeof SecurityProductSchema>\n\n  export const OrgSecurityProductEnablementSchema = z\n    .any()\n    .describe(\n      'The action to take.\\n\\n`enable_all` means to enable the specified security feature for all repositories in the organization.\\n`disable_all` means to disable the specified security feature for all repositories in the organization.'\n    )\n  export type OrgSecurityProductEnablement = z.infer<\n    typeof OrgSecurityProductEnablementSchema\n  >\n\n  export const CardIdSchema = z\n    .any()\n    .describe('The unique identifier of the card.')\n  export type CardId = z.infer<typeof CardIdSchema>\n\n  export const ProjectColumnSchema = z\n    .object({\n      url: z.string().url(),\n      project_url: z.string().url(),\n      cards_url: z.string().url(),\n      id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the project column'),\n      node_id: z.string(),\n      name: z.string().describe('Name of the project column'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Project columns contain cards of work.')\n  export type ProjectColumn = z.infer<typeof ProjectColumnSchema>\n\n  export const ColumnIdSchema = z\n    .any()\n    .describe('The unique identifier of the column.')\n  export type ColumnId = z.infer<typeof ColumnIdSchema>\n\n  export const RateLimitSchema = z.object({\n    limit: z.number().int(),\n    remaining: z.number().int(),\n    reset: z.number().int(),\n    used: z.number().int()\n  })\n  export type RateLimit = z.infer<typeof RateLimitSchema>\n\n  export const ArtifactSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string().describe('The name of the artifact.'),\n      size_in_bytes: z\n        .number()\n        .int()\n        .describe('The size in bytes of the artifact.'),\n      url: z.string(),\n      archive_download_url: z.string(),\n      expired: z.boolean().describe('Whether or not the artifact has expired.'),\n      created_at: z.string().datetime({ offset: true }),\n      expires_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      digest: z\n        .string()\n        .describe(\n          'The SHA256 digest of the artifact. This field will only be populated on artifacts uploaded with upload-artifact v4 or newer. For older versions, this field will be null.'\n        )\n        .optional(),\n      workflow_run: z\n        .object({\n          id: z.number().int().optional(),\n          repository_id: z.number().int().optional(),\n          head_repository_id: z.number().int().optional(),\n          head_branch: z.string().optional(),\n          head_sha: z.string().optional()\n        })\n        .optional()\n    })\n    .describe('An artifact')\n  export type Artifact = z.infer<typeof ArtifactSchema>\n\n  export const ArtifactNameSchema = z\n    .any()\n    .describe(\n      'The name field of an artifact. When specified, only artifacts with this name will be returned.'\n    )\n  export type ArtifactName = z.infer<typeof ArtifactNameSchema>\n\n  export const ArtifactIdSchema = z\n    .any()\n    .describe('The unique identifier of the artifact.')\n  export type ArtifactId = z.infer<typeof ArtifactIdSchema>\n\n  export const ActionsCacheListSchema = z\n    .object({\n      total_count: z.number().int().describe('Total number of caches'),\n      actions_caches: z\n        .array(\n          z.object({\n            id: z.number().int().optional(),\n            ref: z.string().optional(),\n            key: z.string().optional(),\n            version: z.string().optional(),\n            last_accessed_at: z.string().datetime({ offset: true }).optional(),\n            created_at: z.string().datetime({ offset: true }).optional(),\n            size_in_bytes: z.number().int().optional()\n          })\n        )\n        .describe('Array of caches')\n    })\n    .describe('Repository actions caches')\n  export type ActionsCacheList = z.infer<typeof ActionsCacheListSchema>\n\n  export const ActionsCacheGitRefFullSchema = z\n    .any()\n    .describe(\n      'The full Git reference for narrowing down the cache. The `ref` for a branch should be formatted as `refs/heads/<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n    )\n  export type ActionsCacheGitRefFull = z.infer<\n    typeof ActionsCacheGitRefFullSchema\n  >\n\n  export const ActionsCacheKeySchema = z\n    .any()\n    .describe('An explicit key or prefix for identifying the cache')\n  export type ActionsCacheKey = z.infer<typeof ActionsCacheKeySchema>\n\n  export const ActionsCacheListSortSchema = z\n    .any()\n    .describe(\n      'The property to sort the results by. `created_at` means when the cache was created. `last_accessed_at` means when the cache was last accessed. `size_in_bytes` is the size of the cache in bytes.'\n    )\n  export type ActionsCacheListSort = z.infer<typeof ActionsCacheListSortSchema>\n\n  export const ActionsCacheKeyRequiredSchema = z\n    .any()\n    .describe('A key for identifying the cache.')\n  export type ActionsCacheKeyRequired = z.infer<\n    typeof ActionsCacheKeyRequiredSchema\n  >\n\n  export const CacheIdSchema = z\n    .any()\n    .describe('The unique identifier of the GitHub Actions cache.')\n  export type CacheId = z.infer<typeof CacheIdSchema>\n\n  export const JobSchema = z\n    .object({\n      id: z.number().int().describe('The id of the job.'),\n      run_id: z\n        .number()\n        .int()\n        .describe('The id of the associated workflow run.'),\n      run_url: z.string(),\n      run_attempt: z\n        .number()\n        .int()\n        .describe(\n          'Attempt number of the associated workflow run, 1 for first attempt and higher if the workflow was re-run.'\n        )\n        .optional(),\n      node_id: z.string(),\n      head_sha: z.string().describe('The SHA of the commit that is being run.'),\n      url: z.string(),\n      html_url: z.string(),\n      status: z\n        .enum([\n          'queued',\n          'in_progress',\n          'completed',\n          'waiting',\n          'requested',\n          'pending'\n        ])\n        .describe('The phase of the lifecycle that the job is currently in.'),\n      conclusion: z\n        .enum([\n          'success',\n          'failure',\n          'neutral',\n          'cancelled',\n          'skipped',\n          'timed_out',\n          'action_required'\n        ])\n        .describe('The outcome of the job.'),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time that the job created, in ISO 8601 format.'),\n      started_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time that the job started, in ISO 8601 format.'),\n      completed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time that the job finished, in ISO 8601 format.'),\n      name: z.string().describe('The name of the job.'),\n      steps: z\n        .array(\n          z.object({\n            status: z\n              .enum(['queued', 'in_progress', 'completed'])\n              .describe(\n                'The phase of the lifecycle that the job is currently in.'\n              ),\n            conclusion: z.string().describe('The outcome of the job.'),\n            name: z.string().describe('The name of the job.'),\n            number: z.number().int(),\n            started_at: z\n              .string()\n              .datetime({ offset: true })\n              .describe('The time that the step started, in ISO 8601 format.')\n              .optional(),\n            completed_at: z\n              .string()\n              .datetime({ offset: true })\n              .describe('The time that the job finished, in ISO 8601 format.')\n              .optional()\n          })\n        )\n        .describe('Steps in this job.')\n        .optional(),\n      check_run_url: z.string(),\n      labels: z\n        .array(z.string())\n        .describe(\n          'Labels for the workflow job. Specified by the \"runs_on\" attribute in the action\\'s workflow file.'\n        ),\n      runner_id: z\n        .number()\n        .int()\n        .describe(\n          \"The ID of the runner to which this job has been assigned. (If a runner hasn't yet been assigned, this will be null.)\"\n        ),\n      runner_name: z\n        .string()\n        .describe(\n          \"The name of the runner to which this job has been assigned. (If a runner hasn't yet been assigned, this will be null.)\"\n        ),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe(\n          \"The ID of the runner group to which this job has been assigned. (If a runner hasn't yet been assigned, this will be null.)\"\n        ),\n      runner_group_name: z\n        .string()\n        .describe(\n          \"The name of the runner group to which this job has been assigned. (If a runner hasn't yet been assigned, this will be null.)\"\n        ),\n      workflow_name: z.string().describe('The name of the workflow.'),\n      head_branch: z.string().describe('The name of the current branch.')\n    })\n    .describe('Information of a job execution in a workflow run')\n  export type Job = z.infer<typeof JobSchema>\n\n  export const JobIdSchema = z\n    .any()\n    .describe('The unique identifier of the job.')\n  export type JobId = z.infer<typeof JobIdSchema>\n\n  export const OidcCustomSubRepoSchema = z\n    .object({\n      use_default: z\n        .boolean()\n        .describe(\n          'Whether to use the default template or not. If `true`, the `include_claim_keys` field is ignored.'\n        ),\n      include_claim_keys: z\n        .array(z.string())\n        .describe(\n          'Array of unique strings. Each claim key can only contain alphanumeric characters and underscores.'\n        )\n        .optional()\n    })\n    .describe('Actions OIDC subject customization for a repository')\n  export type OidcCustomSubRepo = z.infer<typeof OidcCustomSubRepoSchema>\n\n  export const ActionsSecretSchema = z\n    .object({\n      name: z.string().describe('The name of the secret.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Set secrets for GitHub Actions.')\n  export type ActionsSecret = z.infer<typeof ActionsSecretSchema>\n\n  export const ActionsVariableSchema = z.object({\n    name: z.string().describe('The name of the variable.'),\n    value: z.string().describe('The value of the variable.'),\n    created_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        \"The date and time at which the variable was created, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n      ),\n    updated_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        \"The date and time at which the variable was last updated, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n      )\n  })\n  export type ActionsVariable = z.infer<typeof ActionsVariableSchema>\n\n  export const ActionsEnabledSchema = z\n    .boolean()\n    .describe('Whether GitHub Actions is enabled on the repository.')\n  export type ActionsEnabled = z.infer<typeof ActionsEnabledSchema>\n\n  export const ActionsWorkflowAccessToRepositorySchema = z.object({\n    access_level: z\n      .enum(['none', 'user', 'organization'])\n      .describe(\n        'Defines the level of access that workflows outside of the repository have to actions and reusable workflows within the\\nrepository.\\n\\n`none` means the access is only possible from workflows in this repository. `user` level access allows sharing across user owned private repositories only. `organization` level access allows sharing across the organization.'\n      )\n  })\n  export type ActionsWorkflowAccessToRepository = z.infer<\n    typeof ActionsWorkflowAccessToRepositorySchema\n  >\n\n  export const ReferencedWorkflowSchema = z\n    .object({ path: z.string(), sha: z.string(), ref: z.string().optional() })\n    .describe('A workflow referenced/reused by the initial caller workflow')\n  export type ReferencedWorkflow = z.infer<typeof ReferencedWorkflowSchema>\n\n  export const PullRequestMinimalSchema = z.object({\n    id: z.number().int(),\n    number: z.number().int(),\n    url: z.string(),\n    head: z.object({\n      ref: z.string(),\n      sha: z.string(),\n      repo: z.object({\n        id: z.number().int(),\n        url: z.string(),\n        name: z.string()\n      })\n    }),\n    base: z.object({\n      ref: z.string(),\n      sha: z.string(),\n      repo: z.object({\n        id: z.number().int(),\n        url: z.string(),\n        name: z.string()\n      })\n    })\n  })\n  export type PullRequestMinimal = z.infer<typeof PullRequestMinimalSchema>\n\n  export const NullableSimpleCommitSchema = z\n    .object({\n      id: z.string().describe('SHA for the commit'),\n      tree_id: z.string().describe(\"SHA for the commit's tree\"),\n      message: z\n        .string()\n        .describe('Message describing the purpose of the commit'),\n      timestamp: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Timestamp of the commit'),\n      author: z\n        .object({\n          name: z.string().describe(\"Name of the commit's author\"),\n          email: z\n            .string()\n            .email()\n            .describe(\"Git email address of the commit's author\")\n        })\n        .describe('Information about the Git author'),\n      committer: z\n        .object({\n          name: z.string().describe(\"Name of the commit's committer\"),\n          email: z\n            .string()\n            .email()\n            .describe(\"Git email address of the commit's committer\")\n        })\n        .describe('Information about the Git committer')\n    })\n    .describe('A commit.')\n  export type NullableSimpleCommit = z.infer<typeof NullableSimpleCommitSchema>\n\n  export const WorkflowRunBranchSchema = z\n    .any()\n    .describe(\n      'Returns workflow runs associated with a branch. Use the name of the branch of the `push`.'\n    )\n  export type WorkflowRunBranch = z.infer<typeof WorkflowRunBranchSchema>\n\n  export const EventSchema = z\n    .object({\n      id: z.string(),\n      type: z.string(),\n      actor: ActorSchema,\n      repo: z.object({\n        id: z.number().int(),\n        name: z.string(),\n        url: z.string().url()\n      }),\n      org: ActorSchema.optional(),\n      payload: z.object({\n        action: z.string().optional(),\n        issue: IssueSchema.optional(),\n        comment: IssueCommentSchema.optional(),\n        pages: z\n          .array(\n            z.object({\n              page_name: z.string().optional(),\n              title: z.string().optional(),\n              summary: z.string().optional(),\n              action: z.string().optional(),\n              sha: z.string().optional(),\n              html_url: z.string().optional()\n            })\n          )\n          .optional()\n      }),\n      public: z.boolean(),\n      created_at: z.string().datetime({ offset: true })\n    })\n    .describe('Event')\n  export type Event = z.infer<typeof EventSchema>\n\n  export const WorkflowRunStatusSchema = z\n    .any()\n    .describe(\n      'Returns workflow runs with the check run `status` or `conclusion` that you specify. For example, a conclusion can be `success` or a status can be `in_progress`. Only GitHub Actions can set a status of `waiting`, `pending`, or `requested`.'\n    )\n  export type WorkflowRunStatus = z.infer<typeof WorkflowRunStatusSchema>\n\n  export const CreatedSchema = z\n    .any()\n    .describe(\n      'Returns workflow runs created within the given date-time range. For more information on the syntax, see \"[Understanding the search syntax](https://docs.github.com/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates).\"'\n    )\n  export type Created = z.infer<typeof CreatedSchema>\n\n  export const ExcludePullRequestsSchema = z\n    .any()\n    .describe(\n      'If `true` pull requests are omitted from the response (empty array).'\n    )\n  export type ExcludePullRequests = z.infer<typeof ExcludePullRequestsSchema>\n\n  export const WorkflowRunCheckSuiteIdSchema = z\n    .any()\n    .describe(\n      'Returns workflow runs with the `check_suite_id` that you specify.'\n    )\n  export type WorkflowRunCheckSuiteId = z.infer<\n    typeof WorkflowRunCheckSuiteIdSchema\n  >\n\n  export const WorkflowRunHeadShaSchema = z\n    .any()\n    .describe(\n      'Only returns workflow runs that are associated with the specified `head_sha`.'\n    )\n  export type WorkflowRunHeadSha = z.infer<typeof WorkflowRunHeadShaSchema>\n\n  export const RunIdSchema = z\n    .any()\n    .describe('The unique identifier of the workflow run.')\n  export type RunId = z.infer<typeof RunIdSchema>\n\n  export const AttemptNumberSchema = z\n    .any()\n    .describe('The attempt number of the workflow run.')\n  export type AttemptNumber = z.infer<typeof AttemptNumberSchema>\n\n  export const ReviewCustomGatesCommentRequiredSchema = z.object({\n    environment_name: z\n      .string()\n      .describe('The name of the environment to approve or reject.'),\n    comment: z\n      .string()\n      .describe(\n        'Comment associated with the pending deployment protection rule. **Required when state is not provided.**'\n      )\n  })\n  export type ReviewCustomGatesCommentRequired = z.infer<\n    typeof ReviewCustomGatesCommentRequiredSchema\n  >\n\n  export const ReviewCustomGatesStateRequiredSchema = z.object({\n    environment_name: z\n      .string()\n      .describe('The name of the environment to approve or reject.'),\n    state: z\n      .enum(['approved', 'rejected'])\n      .describe(\n        'Whether to approve or reject deployment to the specified environments.'\n      ),\n    comment: z\n      .string()\n      .describe('Optional comment to include with the review.')\n      .optional()\n  })\n  export type ReviewCustomGatesStateRequired = z.infer<\n    typeof ReviewCustomGatesStateRequiredSchema\n  >\n\n  export const DeploymentReviewerTypeSchema = z\n    .enum(['User', 'Team'])\n    .describe('The type of reviewer.')\n  export type DeploymentReviewerType = z.infer<\n    typeof DeploymentReviewerTypeSchema\n  >\n\n  export const WorkflowRunUsageSchema = z\n    .object({\n      billable: z.object({\n        UBUNTU: z\n          .object({\n            total_ms: z.number().int(),\n            jobs: z.number().int(),\n            job_runs: z\n              .array(\n                z.object({\n                  job_id: z.number().int(),\n                  duration_ms: z.number().int()\n                })\n              )\n              .optional()\n          })\n          .optional(),\n        MACOS: z\n          .object({\n            total_ms: z.number().int(),\n            jobs: z.number().int(),\n            job_runs: z\n              .array(\n                z.object({\n                  job_id: z.number().int(),\n                  duration_ms: z.number().int()\n                })\n              )\n              .optional()\n          })\n          .optional(),\n        WINDOWS: z\n          .object({\n            total_ms: z.number().int(),\n            jobs: z.number().int(),\n            job_runs: z\n              .array(\n                z.object({\n                  job_id: z.number().int(),\n                  duration_ms: z.number().int()\n                })\n              )\n              .optional()\n          })\n          .optional()\n      }),\n      run_duration_ms: z.number().int().optional()\n    })\n    .describe('Workflow Run Usage')\n  export type WorkflowRunUsage = z.infer<typeof WorkflowRunUsageSchema>\n\n  export const WorkflowSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      path: z.string(),\n      state: z.enum([\n        'active',\n        'deleted',\n        'disabled_fork',\n        'disabled_inactivity',\n        'disabled_manually'\n      ]),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      url: z.string(),\n      html_url: z.string(),\n      badge_url: z.string(),\n      deleted_at: z.string().datetime({ offset: true }).optional()\n    })\n    .describe('A GitHub Actions workflow')\n  export type Workflow = z.infer<typeof WorkflowSchema>\n\n  export const WorkflowIdSchema = z\n    .any()\n    .describe(\n      'The ID of the workflow. You can also pass the workflow file name as a string.'\n    )\n  export type WorkflowId = z.infer<typeof WorkflowIdSchema>\n\n  export const WorkflowUsageSchema = z\n    .object({\n      billable: z.object({\n        UBUNTU: z.object({ total_ms: z.number().int().optional() }).optional(),\n        MACOS: z.object({ total_ms: z.number().int().optional() }).optional(),\n        WINDOWS: z.object({ total_ms: z.number().int().optional() }).optional()\n      })\n    })\n    .describe('Workflow Usage')\n  export type WorkflowUsage = z.infer<typeof WorkflowUsageSchema>\n\n  export const AutolinkSchema = z\n    .object({\n      id: z.number().int(),\n      key_prefix: z.string().describe('The prefix of a key that is linkified.'),\n      url_template: z\n        .string()\n        .describe(\n          'A template for the target URL that is generated if a key was found.'\n        ),\n      is_alphanumeric: z\n        .boolean()\n        .describe(\n          'Whether this autolink reference matches alphanumeric characters. If false, this autolink reference only matches numeric characters.'\n        )\n    })\n    .describe('An autolink reference.')\n  export type Autolink = z.infer<typeof AutolinkSchema>\n\n  export const AutolinkIdSchema = z\n    .any()\n    .describe('The unique identifier of the autolink.')\n  export type AutolinkId = z.infer<typeof AutolinkIdSchema>\n\n  export const CheckAutomatedSecurityFixesSchema = z\n    .object({\n      enabled: z\n        .boolean()\n        .describe(\n          'Whether Dependabot security updates are enabled for the repository.'\n        ),\n      paused: z\n        .boolean()\n        .describe(\n          'Whether Dependabot security updates are paused for the repository.'\n        )\n    })\n    .describe('Check Dependabot security updates')\n  export type CheckAutomatedSecurityFixes = z.infer<\n    typeof CheckAutomatedSecurityFixesSchema\n  >\n\n  export const ProtectedBranchRequiredStatusCheckSchema = z\n    .object({\n      url: z.string().optional(),\n      enforcement_level: z.string().optional(),\n      contexts: z.array(z.string()),\n      checks: z.array(\n        z.object({ context: z.string(), app_id: z.number().int() })\n      ),\n      contexts_url: z.string().optional(),\n      strict: z.boolean().optional()\n    })\n    .describe('Protected Branch Required Status Check')\n  export type ProtectedBranchRequiredStatusCheck = z.infer<\n    typeof ProtectedBranchRequiredStatusCheckSchema\n  >\n\n  export const ProtectedBranchAdminEnforcedSchema = z\n    .object({ url: z.string().url(), enabled: z.boolean() })\n    .describe('Protected Branch Admin Enforced')\n  export type ProtectedBranchAdminEnforced = z.infer<\n    typeof ProtectedBranchAdminEnforcedSchema\n  >\n\n  export const BranchRestrictionPolicySchema = z\n    .object({\n      url: z.string().url(),\n      users_url: z.string().url(),\n      teams_url: z.string().url(),\n      apps_url: z.string().url(),\n      users: z.array(\n        z.object({\n          login: z.string().optional(),\n          id: z.number().int().optional(),\n          node_id: z.string().optional(),\n          avatar_url: z.string().optional(),\n          gravatar_id: z.string().optional(),\n          url: z.string().optional(),\n          html_url: z.string().optional(),\n          followers_url: z.string().optional(),\n          following_url: z.string().optional(),\n          gists_url: z.string().optional(),\n          starred_url: z.string().optional(),\n          subscriptions_url: z.string().optional(),\n          organizations_url: z.string().optional(),\n          repos_url: z.string().optional(),\n          events_url: z.string().optional(),\n          received_events_url: z.string().optional(),\n          type: z.string().optional(),\n          site_admin: z.boolean().optional(),\n          user_view_type: z.string().optional()\n        })\n      ),\n      teams: z.array(\n        z.object({\n          id: z.number().int().optional(),\n          node_id: z.string().optional(),\n          url: z.string().optional(),\n          html_url: z.string().optional(),\n          name: z.string().optional(),\n          slug: z.string().optional(),\n          description: z.string().optional(),\n          privacy: z.string().optional(),\n          notification_setting: z.string().optional(),\n          permission: z.string().optional(),\n          members_url: z.string().optional(),\n          repositories_url: z.string().optional(),\n          parent: z.string().optional()\n        })\n      ),\n      apps: z.array(\n        z.object({\n          id: z.number().int().optional(),\n          slug: z.string().optional(),\n          node_id: z.string().optional(),\n          owner: z\n            .object({\n              login: z.string().optional(),\n              id: z.number().int().optional(),\n              node_id: z.string().optional(),\n              url: z.string().optional(),\n              repos_url: z.string().optional(),\n              events_url: z.string().optional(),\n              hooks_url: z.string().optional(),\n              issues_url: z.string().optional(),\n              members_url: z.string().optional(),\n              public_members_url: z.string().optional(),\n              avatar_url: z.string().optional(),\n              description: z.string().optional(),\n              gravatar_id: z.string().optional(),\n              html_url: z.string().optional(),\n              followers_url: z.string().optional(),\n              following_url: z.string().optional(),\n              gists_url: z.string().optional(),\n              starred_url: z.string().optional(),\n              subscriptions_url: z.string().optional(),\n              organizations_url: z.string().optional(),\n              received_events_url: z.string().optional(),\n              type: z.string().optional(),\n              site_admin: z.boolean().optional(),\n              user_view_type: z.string().optional()\n            })\n            .optional(),\n          name: z.string().optional(),\n          client_id: z.string().optional(),\n          description: z.string().optional(),\n          external_url: z.string().optional(),\n          html_url: z.string().optional(),\n          created_at: z.string().optional(),\n          updated_at: z.string().optional(),\n          permissions: z\n            .object({\n              metadata: z.string().optional(),\n              contents: z.string().optional(),\n              issues: z.string().optional(),\n              single_file: z.string().optional()\n            })\n            .optional(),\n          events: z.array(z.string()).optional()\n        })\n      )\n    })\n    .describe('Branch Restriction Policy')\n  export type BranchRestrictionPolicy = z.infer<\n    typeof BranchRestrictionPolicySchema\n  >\n\n  export const NullableGitUserSchema = z\n    .object({\n      name: z.string().optional(),\n      email: z.string().optional(),\n      date: z.string().optional()\n    })\n    .describe('Metaproperties for Git author/committer information.')\n  export type NullableGitUser = z.infer<typeof NullableGitUserSchema>\n\n  export const VerificationSchema = z.object({\n    verified: z.boolean(),\n    reason: z.string(),\n    payload: z.string(),\n    signature: z.string(),\n    verified_at: z.string()\n  })\n  export type Verification = z.infer<typeof VerificationSchema>\n\n  export const DiffEntrySchema = z\n    .object({\n      sha: z.string(),\n      filename: z.string(),\n      status: z.enum([\n        'added',\n        'removed',\n        'modified',\n        'renamed',\n        'copied',\n        'changed',\n        'unchanged'\n      ]),\n      additions: z.number().int(),\n      deletions: z.number().int(),\n      changes: z.number().int(),\n      blob_url: z.string().url(),\n      raw_url: z.string().url(),\n      contents_url: z.string().url(),\n      patch: z.string().optional(),\n      previous_filename: z.string().optional()\n    })\n    .describe('Diff Entry')\n  export type DiffEntry = z.infer<typeof DiffEntrySchema>\n\n  export const BranchSchema = z\n    .any()\n    .describe(\n      'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n    )\n  export type Branch = z.infer<typeof BranchSchema>\n\n  export const StatusCheckPolicySchema = z\n    .object({\n      url: z.string().url(),\n      strict: z.boolean(),\n      contexts: z.array(z.string()),\n      checks: z.array(\n        z.object({ context: z.string(), app_id: z.number().int() })\n      ),\n      contexts_url: z.string().url()\n    })\n    .describe('Status Check Policy')\n  export type StatusCheckPolicy = z.infer<typeof StatusCheckPolicySchema>\n\n  export const CheckRunIdSchema = z\n    .any()\n    .describe('The unique identifier of the check run.')\n  export type CheckRunId = z.infer<typeof CheckRunIdSchema>\n\n  export const CheckAnnotationSchema = z\n    .object({\n      path: z.string(),\n      start_line: z.number().int(),\n      end_line: z.number().int(),\n      start_column: z.number().int(),\n      end_column: z.number().int(),\n      annotation_level: z.string(),\n      title: z.string(),\n      message: z.string(),\n      raw_details: z.string(),\n      blob_href: z.string()\n    })\n    .describe('Check Annotation')\n  export type CheckAnnotation = z.infer<typeof CheckAnnotationSchema>\n\n  export const SimpleCommitSchema = z\n    .object({\n      id: z.string().describe('SHA for the commit'),\n      tree_id: z.string().describe(\"SHA for the commit's tree\"),\n      message: z\n        .string()\n        .describe('Message describing the purpose of the commit'),\n      timestamp: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Timestamp of the commit'),\n      author: z\n        .object({\n          name: z.string().describe(\"Name of the commit's author\"),\n          email: z\n            .string()\n            .email()\n            .describe(\"Git email address of the commit's author\")\n        })\n        .describe('Information about the Git author'),\n      committer: z\n        .object({\n          name: z.string().describe(\"Name of the commit's committer\"),\n          email: z\n            .string()\n            .email()\n            .describe(\"Git email address of the commit's committer\")\n        })\n        .describe('Information about the Git committer')\n    })\n    .describe('A commit.')\n  export type SimpleCommit = z.infer<typeof SimpleCommitSchema>\n\n  export const CheckSuiteIdSchema = z\n    .any()\n    .describe('The unique identifier of the check suite.')\n  export type CheckSuiteId = z.infer<typeof CheckSuiteIdSchema>\n\n  export const CheckNameSchema = z\n    .any()\n    .describe('Returns check runs with the specified `name`.')\n  export type CheckName = z.infer<typeof CheckNameSchema>\n\n  export const StatusSchema = z\n    .object({\n      url: z.string(),\n      avatar_url: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      state: z.string(),\n      description: z.string(),\n      target_url: z.string(),\n      context: z.string(),\n      created_at: z.string(),\n      updated_at: z.string(),\n      creator: NullableSimpleUserSchema\n    })\n    .describe('The status of a commit.')\n  export type Status = z.infer<typeof StatusSchema>\n\n  export const PrAliasSchema = z\n    .any()\n    .describe(\n      'The number of the pull request for the results you want to list.'\n    )\n  export type PrAlias = z.infer<typeof PrAliasSchema>\n\n  export const CodeScanningAlertRuleSchema = z.object({\n    id: z\n      .string()\n      .describe('A unique identifier for the rule used to detect the alert.')\n      .optional(),\n    name: z\n      .string()\n      .describe('The name of the rule used to detect the alert.')\n      .optional(),\n    severity: z\n      .enum(['none', 'note', 'warning', 'error'])\n      .describe('The severity of the alert.')\n      .optional(),\n    security_severity_level: z\n      .enum(['low', 'medium', 'high', 'critical'])\n      .describe('The security severity of the alert.')\n      .optional(),\n    description: z\n      .string()\n      .describe('A short description of the rule used to detect the alert.')\n      .optional(),\n    full_description: z\n      .string()\n      .describe('A description of the rule used to detect the alert.')\n      .optional(),\n    tags: z\n      .array(z.string())\n      .describe('A set of tags applicable for the rule.')\n      .optional(),\n    help: z\n      .string()\n      .describe(\n        'Detailed documentation for the rule as GitHub Flavored Markdown.'\n      )\n      .optional(),\n    help_uri: z\n      .string()\n      .describe(\n        'A link to the documentation for the rule used to detect the alert.'\n      )\n      .optional()\n  })\n  export type CodeScanningAlertRule = z.infer<\n    typeof CodeScanningAlertRuleSchema\n  >\n\n  export const CodeScanningAlertSetStateSchema = z\n    .enum(['open', 'dismissed'])\n    .describe(\n      'Sets the state of the code scanning alert. You must provide `dismissed_reason` when you set the state to `dismissed`.'\n    )\n  export type CodeScanningAlertSetState = z.infer<\n    typeof CodeScanningAlertSetStateSchema\n  >\n\n  export const CodeScanningAlertCreateRequestSchema = z\n    .boolean()\n    .describe('If `true`, attempt to create an alert dismissal request.')\n  export type CodeScanningAlertCreateRequest = z.infer<\n    typeof CodeScanningAlertCreateRequestSchema\n  >\n\n  export const CodeScanningAutofixStatusSchema = z\n    .enum(['pending', 'error', 'success', 'outdated'])\n    .describe('The status of an autofix.')\n  export type CodeScanningAutofixStatus = z.infer<\n    typeof CodeScanningAutofixStatusSchema\n  >\n\n  export const CodeScanningAutofixDescriptionSchema = z\n    .string()\n    .describe('The description of an autofix.')\n  export type CodeScanningAutofixDescription = z.infer<\n    typeof CodeScanningAutofixDescriptionSchema\n  >\n\n  export const CodeScanningAutofixStartedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The start time of an autofix in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type CodeScanningAutofixStartedAt = z.infer<\n    typeof CodeScanningAutofixStartedAtSchema\n  >\n\n  export const CodeScanningAutofixCommitsSchema = z\n    .object({\n      target_ref: z\n        .string()\n        .describe(\n          'The Git reference of target branch for the commit. Branch needs to already exist.  For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n        )\n        .optional(),\n      message: z.string().describe('Commit message to be used.').optional()\n    })\n    .describe('Commit an autofix for a code scanning alert')\n  export type CodeScanningAutofixCommits = z.infer<\n    typeof CodeScanningAutofixCommitsSchema\n  >\n\n  export const CodeScanningAutofixCommitsResponseSchema = z.object({\n    target_ref: z\n      .string()\n      .describe(\n        'The Git reference of target branch for the commit. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      )\n      .optional(),\n    sha: z.string().describe('SHA of commit with autofix.').optional()\n  })\n  export type CodeScanningAutofixCommitsResponse = z.infer<\n    typeof CodeScanningAutofixCommitsResponseSchema\n  >\n\n  export const CodeScanningAnalysisCommitShaSchema = z\n    .string()\n    .regex(new RegExp('^[0-9a-fA-F]+$'))\n    .min(40)\n    .max(40)\n    .describe(\n      'The SHA of the commit to which the analysis you are uploading relates.'\n    )\n  export type CodeScanningAnalysisCommitSha = z.infer<\n    typeof CodeScanningAnalysisCommitShaSchema\n  >\n\n  export const CodeScanningAnalysisEnvironmentSchema = z\n    .string()\n    .describe(\n      'Identifies the variable values associated with the environment in which this analysis was performed.'\n    )\n  export type CodeScanningAnalysisEnvironment = z.infer<\n    typeof CodeScanningAnalysisEnvironmentSchema\n  >\n\n  export const CodeScanningAnalysisCreatedAtSchema = z\n    .string()\n    .datetime({ offset: true })\n    .describe(\n      'The time that the analysis was created in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n    .readonly()\n  export type CodeScanningAnalysisCreatedAt = z.infer<\n    typeof CodeScanningAnalysisCreatedAtSchema\n  >\n\n  export const CodeScanningAnalysisUrlSchema = z\n    .string()\n    .url()\n    .describe('The REST API URL of the analysis resource.')\n    .readonly()\n  export type CodeScanningAnalysisUrl = z.infer<\n    typeof CodeScanningAnalysisUrlSchema\n  >\n\n  export const CodeScanningAnalysisSarifIdSchema = z\n    .string()\n    .describe('An identifier for the upload.')\n  export type CodeScanningAnalysisSarifId = z.infer<\n    typeof CodeScanningAnalysisSarifIdSchema\n  >\n\n  export const CodeScanningAnalysisDeletionSchema = z\n    .object({\n      next_analysis_url: z\n        .string()\n        .url()\n        .describe(\n          'Next deletable analysis in chain, without last analysis deletion confirmation'\n        )\n        .readonly(),\n      confirm_delete_url: z\n        .string()\n        .url()\n        .describe(\n          'Next deletable analysis in chain, with last analysis deletion confirmation'\n        )\n        .readonly()\n    })\n    .describe('Successful deletion of a code scanning analysis')\n  export type CodeScanningAnalysisDeletion = z.infer<\n    typeof CodeScanningAnalysisDeletionSchema\n  >\n\n  export const CodeScanningVariantAnalysisLanguageSchema = z\n    .enum([\n      'cpp',\n      'csharp',\n      'go',\n      'java',\n      'javascript',\n      'python',\n      'ruby',\n      'swift'\n    ])\n    .describe('The language targeted by the CodeQL query')\n  export type CodeScanningVariantAnalysisLanguage = z.infer<\n    typeof CodeScanningVariantAnalysisLanguageSchema\n  >\n\n  export const CodeScanningVariantAnalysisRepositorySchema = z\n    .object({\n      id: z.number().int().describe('A unique identifier of the repository.'),\n      name: z.string().describe('The name of the repository.'),\n      full_name: z\n        .string()\n        .describe('The full, globally unique, name of the repository.'),\n      private: z.boolean().describe('Whether the repository is private.'),\n      stargazers_count: z.number().int(),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Repository Identifier')\n  export type CodeScanningVariantAnalysisRepository = z.infer<\n    typeof CodeScanningVariantAnalysisRepositorySchema\n  >\n\n  export const CodeScanningVariantAnalysisStatusSchema = z\n    .enum([\n      'pending',\n      'in_progress',\n      'succeeded',\n      'failed',\n      'canceled',\n      'timed_out'\n    ])\n    .describe('The new status of the CodeQL variant analysis repository task.')\n  export type CodeScanningVariantAnalysisStatus = z.infer<\n    typeof CodeScanningVariantAnalysisStatusSchema\n  >\n\n  export const CodeScanningDefaultSetupSchema = z\n    .object({\n      state: z\n        .enum(['configured', 'not-configured'])\n        .describe('Code scanning default setup has been configured or not.')\n        .optional(),\n      languages: z\n        .array(\n          z.enum([\n            'actions',\n            'c-cpp',\n            'csharp',\n            'go',\n            'java-kotlin',\n            'javascript-typescript',\n            'javascript',\n            'python',\n            'ruby',\n            'typescript',\n            'swift'\n          ])\n        )\n        .describe('Languages to be analyzed.')\n        .optional(),\n      runner_type: z\n        .enum(['standard', 'labeled'])\n        .describe('Runner type to be used.')\n        .optional(),\n      runner_label: z\n        .string()\n        .describe('Runner label to be used if the runner type is labeled.')\n        .optional(),\n      query_suite: z\n        .enum(['default', 'extended'])\n        .describe('CodeQL query suite to be used.')\n        .optional(),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Timestamp of latest configuration update.')\n        .optional(),\n      schedule: z\n        .literal('weekly')\n        .describe('The frequency of the periodic analysis.')\n        .optional()\n    })\n    .describe('Configuration for code scanning default setup.')\n  export type CodeScanningDefaultSetup = z.infer<\n    typeof CodeScanningDefaultSetupSchema\n  >\n\n  export const CodeScanningDefaultSetupUpdateSchema = z\n    .object({\n      state: z\n        .enum(['configured', 'not-configured'])\n        .describe('The desired state of code scanning default setup.')\n        .optional(),\n      runner_type: z\n        .enum(['standard', 'labeled'])\n        .describe('Runner type to be used.')\n        .optional(),\n      runner_label: z\n        .string()\n        .describe('Runner label to be used if the runner type is labeled.')\n        .optional(),\n      query_suite: z\n        .enum(['default', 'extended'])\n        .describe('CodeQL query suite to be used.')\n        .optional(),\n      languages: z\n        .array(\n          z.enum([\n            'actions',\n            'c-cpp',\n            'csharp',\n            'go',\n            'java-kotlin',\n            'javascript-typescript',\n            'python',\n            'ruby',\n            'swift'\n          ])\n        )\n        .describe('CodeQL languages to be analyzed.')\n        .optional()\n    })\n    .strict()\n    .describe('Configuration for code scanning default setup.')\n  export type CodeScanningDefaultSetupUpdate = z.infer<\n    typeof CodeScanningDefaultSetupUpdateSchema\n  >\n\n  export const CodeScanningRefFullSchema = z\n    .string()\n    .regex(new RegExp('^refs/(heads|tags|pull)/.*$'))\n    .describe(\n      'The full Git reference, formatted as `refs/heads/<branch name>`,\\n`refs/tags/<tag>`, `refs/pull/<number>/merge`, or `refs/pull/<number>/head`.'\n    )\n  export type CodeScanningRefFull = z.infer<typeof CodeScanningRefFullSchema>\n\n  export const CodeScanningAnalysisSarifFileSchema = z\n    .string()\n    .describe(\n      'A Base64 string representing the SARIF file to upload. You must first compress your SARIF file using [`gzip`](http://www.gnu.org/software/gzip/manual/gzip.html) and then translate the contents of the file into a Base64 encoding string. For more information, see \"[SARIF support for code scanning](https://docs.github.com/code-security/secure-coding/sarif-support-for-code-scanning).\"'\n    )\n  export type CodeScanningAnalysisSarifFile = z.infer<\n    typeof CodeScanningAnalysisSarifFileSchema\n  >\n\n  export const CodeScanningSarifsStatusSchema = z.object({\n    processing_status: z\n      .enum(['pending', 'complete', 'failed'])\n      .describe(\n        '`pending` files have not yet been processed, while `complete` means results from the SARIF have been stored. `failed` files have either not been processed at all, or could only be partially processed.'\n      )\n      .optional(),\n    analyses_url: z\n      .string()\n      .url()\n      .describe(\n        'The REST API URL for getting the analyses associated with the upload.'\n      )\n      .readonly()\n      .optional(),\n    errors: z\n      .array(z.string())\n      .describe('Any errors that ocurred during processing of the delivery.')\n      .readonly()\n      .optional()\n  })\n  export type CodeScanningSarifsStatus = z.infer<\n    typeof CodeScanningSarifsStatusSchema\n  >\n\n  export const CodeownersErrorsSchema = z\n    .object({\n      errors: z.array(\n        z.object({\n          line: z\n            .number()\n            .int()\n            .describe('The line number where this errors occurs.'),\n          column: z\n            .number()\n            .int()\n            .describe('The column number where this errors occurs.'),\n          source: z\n            .string()\n            .describe('The contents of the line where the error occurs.')\n            .optional(),\n          kind: z.string().describe('The type of error.'),\n          suggestion: z\n            .string()\n            .describe(\n              'Suggested action to fix the error. This will usually be `null`, but is provided for some common errors.'\n            )\n            .optional(),\n          message: z\n            .string()\n            .describe(\n              'A human-readable description of the error, combining information from multiple fields, laid out for display in a monospaced typeface (for example, a command-line setting).'\n            ),\n          path: z\n            .string()\n            .describe('The path of the file where the error occured.')\n        })\n      )\n    })\n    .describe(\"A list of errors found in a repo's CODEOWNERS file\")\n  export type CodeownersErrors = z.infer<typeof CodeownersErrorsSchema>\n\n  export const CodespaceMachineSchema = z\n    .object({\n      name: z.string().describe('The name of the machine.'),\n      display_name: z\n        .string()\n        .describe(\n          'The display name of the machine includes cores, memory, and storage.'\n        ),\n      operating_system: z\n        .string()\n        .describe('The operating system of the machine.'),\n      storage_in_bytes: z\n        .number()\n        .int()\n        .describe('How much storage is available to the codespace.'),\n      memory_in_bytes: z\n        .number()\n        .int()\n        .describe('How much memory is available to the codespace.'),\n      cpus: z\n        .number()\n        .int()\n        .describe('How many cores are available to the codespace.'),\n      prebuild_availability: z\n        .enum(['none', 'ready', 'in_progress'])\n        .describe(\n          'Whether a prebuild is currently available when creating a codespace for this machine and repository. If a branch was not specified as a ref, the default branch will be assumed. Value will be \"null\" if prebuilds are not supported or prebuild availability could not be determined. Value will be \"none\" if no prebuild is available. Latest values \"ready\" and \"in_progress\" indicate the prebuild availability status.'\n        )\n    })\n    .describe('A description of the machine powering a codespace.')\n  export type CodespaceMachine = z.infer<typeof CodespaceMachineSchema>\n\n  export const CodespacesPermissionsCheckForDevcontainerSchema = z\n    .object({\n      accepted: z\n        .boolean()\n        .describe(\n          'Whether the user has accepted the permissions defined by the devcontainer config'\n        )\n    })\n    .describe('Permission check result for a given devcontainer config.')\n  export type CodespacesPermissionsCheckForDevcontainer = z.infer<\n    typeof CodespacesPermissionsCheckForDevcontainerSchema\n  >\n\n  export const RepoCodespacesSecretSchema = z\n    .object({\n      name: z.string().describe('The name of the secret.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Set repository secrets for GitHub Codespaces.')\n  export type RepoCodespacesSecret = z.infer<typeof RepoCodespacesSecretSchema>\n\n  export const CollaboratorSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      email: z.string().optional(),\n      name: z.string().optional(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      site_admin: z.boolean(),\n      permissions: z\n        .object({\n          pull: z.boolean(),\n          triage: z.boolean().optional(),\n          push: z.boolean(),\n          maintain: z.boolean().optional(),\n          admin: z.boolean()\n        })\n        .optional(),\n      role_name: z.string(),\n      user_view_type: z.string().optional()\n    })\n    .describe('Collaborator')\n  export type Collaborator = z.infer<typeof CollaboratorSchema>\n\n  export const NullableCollaboratorSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      email: z.string().optional(),\n      name: z.string().optional(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      site_admin: z.boolean(),\n      permissions: z\n        .object({\n          pull: z.boolean(),\n          triage: z.boolean().optional(),\n          push: z.boolean(),\n          maintain: z.boolean().optional(),\n          admin: z.boolean()\n        })\n        .optional(),\n      role_name: z.string(),\n      user_view_type: z.string().optional()\n    })\n    .describe('Collaborator')\n  export type NullableCollaborator = z.infer<typeof NullableCollaboratorSchema>\n\n  export const BranchShortSchema = z\n    .object({\n      name: z.string(),\n      commit: z.object({ sha: z.string(), url: z.string() }),\n      protected: z.boolean()\n    })\n    .describe('Branch Short')\n  export type BranchShort = z.infer<typeof BranchShortSchema>\n\n  export const CommitShaSchema = z.any().describe('The SHA of the commit.')\n  export type CommitSha = z.infer<typeof CommitShaSchema>\n\n  export const LinkSchema = z\n    .object({ href: z.string() })\n    .describe('Hypermedia Link')\n  export type Link = z.infer<typeof LinkSchema>\n\n  export const CommitRefSchema = z\n    .any()\n    .describe(\n      'The commit reference. Can be a commit SHA, branch name (`heads/BRANCH_NAME`), or tag name (`tags/TAG_NAME`). For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n    )\n  export type CommitRef = z.infer<typeof CommitRefSchema>\n\n  export const SimpleCommitStatusSchema = z.object({\n    description: z.string(),\n    id: z.number().int(),\n    node_id: z.string(),\n    state: z.string(),\n    context: z.string(),\n    target_url: z.string().url(),\n    required: z.boolean().optional(),\n    avatar_url: z.string().url(),\n    url: z.string().url(),\n    created_at: z.string().datetime({ offset: true }),\n    updated_at: z.string().datetime({ offset: true })\n  })\n  export type SimpleCommitStatus = z.infer<typeof SimpleCommitStatusSchema>\n\n  export const NullableCodeOfConductSimpleSchema = z\n    .object({\n      url: z.string().url(),\n      key: z.string(),\n      name: z.string(),\n      html_url: z.string().url()\n    })\n    .describe('Code of Conduct Simple')\n  export type NullableCodeOfConductSimple = z.infer<\n    typeof NullableCodeOfConductSimpleSchema\n  >\n\n  export const NullableCommunityHealthFileSchema = z.object({\n    url: z.string().url(),\n    html_url: z.string().url()\n  })\n  export type NullableCommunityHealthFile = z.infer<\n    typeof NullableCommunityHealthFileSchema\n  >\n\n  export const ContentDirectorySchema = z\n    .array(\n      z.object({\n        type: z.enum(['dir', 'file', 'submodule', 'symlink']),\n        size: z.number().int(),\n        name: z.string(),\n        path: z.string(),\n        content: z.string().optional(),\n        sha: z.string(),\n        url: z.string().url(),\n        git_url: z.string().url(),\n        html_url: z.string().url(),\n        download_url: z.string().url(),\n        _links: z.object({\n          git: z.string().url(),\n          html: z.string().url(),\n          self: z.string().url()\n        })\n      })\n    )\n    .describe('A list of directory items')\n  export type ContentDirectory = z.infer<typeof ContentDirectorySchema>\n\n  export const ContentFileSchema = z\n    .object({\n      type: z.literal('file'),\n      encoding: z.string(),\n      size: z.number().int(),\n      name: z.string(),\n      path: z.string(),\n      content: z.string(),\n      sha: z.string(),\n      url: z.string().url(),\n      git_url: z.string().url(),\n      html_url: z.string().url(),\n      download_url: z.string().url(),\n      _links: z.object({\n        git: z.string().url(),\n        html: z.string().url(),\n        self: z.string().url()\n      }),\n      target: z.string().optional(),\n      submodule_git_url: z.string().optional()\n    })\n    .describe('Content File')\n  export type ContentFile = z.infer<typeof ContentFileSchema>\n\n  export const ContentSymlinkSchema = z\n    .object({\n      type: z.literal('symlink'),\n      target: z.string(),\n      size: z.number().int(),\n      name: z.string(),\n      path: z.string(),\n      sha: z.string(),\n      url: z.string().url(),\n      git_url: z.string().url(),\n      html_url: z.string().url(),\n      download_url: z.string().url(),\n      _links: z.object({\n        git: z.string().url(),\n        html: z.string().url(),\n        self: z.string().url()\n      })\n    })\n    .describe('An object describing a symlink')\n  export type ContentSymlink = z.infer<typeof ContentSymlinkSchema>\n\n  export const ContentSubmoduleSchema = z\n    .object({\n      type: z.literal('submodule'),\n      submodule_git_url: z.string().url(),\n      size: z.number().int(),\n      name: z.string(),\n      path: z.string(),\n      sha: z.string(),\n      url: z.string().url(),\n      git_url: z.string().url(),\n      html_url: z.string().url(),\n      download_url: z.string().url(),\n      _links: z.object({\n        git: z.string().url(),\n        html: z.string().url(),\n        self: z.string().url()\n      })\n    })\n    .describe('An object describing a submodule')\n  export type ContentSubmodule = z.infer<typeof ContentSubmoduleSchema>\n\n  export const FileCommitSchema = z\n    .object({\n      content: z.object({\n        name: z.string().optional(),\n        path: z.string().optional(),\n        sha: z.string().optional(),\n        size: z.number().int().optional(),\n        url: z.string().optional(),\n        html_url: z.string().optional(),\n        git_url: z.string().optional(),\n        download_url: z.string().optional(),\n        type: z.string().optional(),\n        _links: z\n          .object({\n            self: z.string().optional(),\n            git: z.string().optional(),\n            html: z.string().optional()\n          })\n          .optional()\n      }),\n      commit: z.object({\n        sha: z.string().optional(),\n        node_id: z.string().optional(),\n        url: z.string().optional(),\n        html_url: z.string().optional(),\n        author: z\n          .object({\n            date: z.string().optional(),\n            name: z.string().optional(),\n            email: z.string().optional()\n          })\n          .optional(),\n        committer: z\n          .object({\n            date: z.string().optional(),\n            name: z.string().optional(),\n            email: z.string().optional()\n          })\n          .optional(),\n        message: z.string().optional(),\n        tree: z\n          .object({ url: z.string().optional(), sha: z.string().optional() })\n          .optional(),\n        parents: z\n          .array(\n            z.object({\n              url: z.string().optional(),\n              html_url: z.string().optional(),\n              sha: z.string().optional()\n            })\n          )\n          .optional(),\n        verification: z\n          .object({\n            verified: z.boolean().optional(),\n            reason: z.string().optional(),\n            signature: z.string().optional(),\n            payload: z.string().optional(),\n            verified_at: z.string().optional()\n          })\n          .optional()\n      })\n    })\n    .describe('File Commit')\n  export type FileCommit = z.infer<typeof FileCommitSchema>\n\n  export const ContributorSchema = z\n    .object({\n      login: z.string().optional(),\n      id: z.number().int().optional(),\n      node_id: z.string().optional(),\n      avatar_url: z.string().url().optional(),\n      gravatar_id: z.string().optional(),\n      url: z.string().url().optional(),\n      html_url: z.string().url().optional(),\n      followers_url: z.string().url().optional(),\n      following_url: z.string().optional(),\n      gists_url: z.string().optional(),\n      starred_url: z.string().optional(),\n      subscriptions_url: z.string().url().optional(),\n      organizations_url: z.string().url().optional(),\n      repos_url: z.string().url().optional(),\n      events_url: z.string().optional(),\n      received_events_url: z.string().url().optional(),\n      type: z.string(),\n      site_admin: z.boolean().optional(),\n      contributions: z.number().int(),\n      email: z.string().optional(),\n      name: z.string().optional(),\n      user_view_type: z.string().optional()\n    })\n    .describe('Contributor')\n  export type Contributor = z.infer<typeof ContributorSchema>\n\n  export const DependabotAlertCommaSeparatedManifestsSchema = z\n    .any()\n    .describe(\n      'A comma-separated list of full manifest paths. If specified, only alerts for these manifests will be returned.'\n    )\n  export type DependabotAlertCommaSeparatedManifests = z.infer<\n    typeof DependabotAlertCommaSeparatedManifestsSchema\n  >\n\n  export const DependabotSecretSchema = z\n    .object({\n      name: z.string().describe('The name of the secret.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Set secrets for Dependabot.')\n  export type DependabotSecret = z.infer<typeof DependabotSecretSchema>\n\n  export const DependencyGraphDiffSchema = z\n    .array(\n      z.object({\n        change_type: z.enum(['added', 'removed']),\n        manifest: z.string(),\n        ecosystem: z.string(),\n        name: z.string(),\n        version: z.string(),\n        package_url: z.string(),\n        license: z.string(),\n        source_repository_url: z.string(),\n        vulnerabilities: z.array(\n          z.object({\n            severity: z.string(),\n            advisory_ghsa_id: z.string(),\n            advisory_summary: z.string(),\n            advisory_url: z.string()\n          })\n        ),\n        scope: z\n          .enum(['unknown', 'runtime', 'development'])\n          .describe(\n            'Where the dependency is utilized. `development` means that the dependency is only utilized in the development environment. `runtime` means that the dependency is utilized at runtime and in the development environment.'\n          )\n      })\n    )\n    .describe('A diff of the dependencies between two commits.')\n  export type DependencyGraphDiff = z.infer<typeof DependencyGraphDiffSchema>\n\n  export const ManifestPathSchema = z\n    .any()\n    .describe(\n      'The full path, relative to the repository root, of the dependency manifest file.'\n    )\n  export type ManifestPath = z.infer<typeof ManifestPathSchema>\n\n  export const DependencyGraphSpdxSbomSchema = z\n    .object({\n      sbom: z.object({\n        SPDXID: z\n          .string()\n          .describe('The SPDX identifier for the SPDX document.'),\n        spdxVersion: z\n          .string()\n          .describe(\n            'The version of the SPDX specification that this document conforms to.'\n          ),\n        comment: z\n          .string()\n          .describe('An optional comment about the SPDX document.')\n          .optional(),\n        creationInfo: z.object({\n          created: z\n            .string()\n            .describe('The date and time the SPDX document was created.'),\n          creators: z\n            .array(z.string())\n            .describe('The tools that were used to generate the SPDX document.')\n        }),\n        name: z.string().describe('The name of the SPDX document.'),\n        dataLicense: z\n          .string()\n          .describe('The license under which the SPDX document is licensed.'),\n        documentNamespace: z\n          .string()\n          .describe('The namespace for the SPDX document.'),\n        packages: z.array(\n          z.object({\n            SPDXID: z\n              .string()\n              .describe('A unique SPDX identifier for the package.')\n              .optional(),\n            name: z.string().describe('The name of the package.').optional(),\n            versionInfo: z\n              .string()\n              .describe(\n                'The version of the package. If the package does not have an exact version specified,\\na version range is given.'\n              )\n              .optional(),\n            downloadLocation: z\n              .string()\n              .describe(\n                'The location where the package can be downloaded,\\nor NOASSERTION if this has not been determined.'\n              )\n              .optional(),\n            filesAnalyzed: z\n              .boolean()\n              .describe(\n                \"Whether the package's file content has been subjected to\\nanalysis during the creation of the SPDX document.\"\n              )\n              .optional(),\n            licenseConcluded: z\n              .string()\n              .describe(\n                'The license of the package as determined while creating the SPDX document.'\n              )\n              .optional(),\n            licenseDeclared: z\n              .string()\n              .describe(\n                'The license of the package as declared by its author, or NOASSERTION if this information\\nwas not available when the SPDX document was created.'\n              )\n              .optional(),\n            supplier: z\n              .string()\n              .describe(\n                'The distribution source of this package, or NOASSERTION if this was not determined.'\n              )\n              .optional(),\n            copyrightText: z\n              .string()\n              .describe(\n                'The copyright holders of the package, and any dates present with those notices, if available.'\n              )\n              .optional(),\n            externalRefs: z\n              .array(\n                z.object({\n                  referenceCategory: z\n                    .string()\n                    .describe(\n                      'The category of reference to an external resource this reference refers to.'\n                    ),\n                  referenceLocator: z\n                    .string()\n                    .describe(\n                      'A locator for the particular external resource this reference refers to.'\n                    ),\n                  referenceType: z\n                    .string()\n                    .describe(\n                      'The category of reference to an external resource this reference refers to.'\n                    )\n                })\n              )\n              .optional()\n          })\n        ),\n        relationships: z\n          .array(\n            z.object({\n              relationshipType: z\n                .string()\n                .describe(\n                  'The type of relationship between the two SPDX elements.'\n                )\n                .optional(),\n              spdxElementId: z\n                .string()\n                .describe(\n                  'The SPDX identifier of the package that is the source of the relationship.'\n                )\n                .optional(),\n              relatedSpdxElement: z\n                .string()\n                .describe(\n                  'The SPDX identifier of the package that is the target of the relationship.'\n                )\n                .optional()\n            })\n          )\n          .optional()\n      })\n    })\n    .describe(\n      'A schema for the SPDX JSON format returned by the Dependency Graph.'\n    )\n  export type DependencyGraphSpdxSbom = z.infer<\n    typeof DependencyGraphSpdxSbomSchema\n  >\n\n  export const MetadataSchema = z\n    .record(z.union([z.string(), z.number(), z.boolean()]))\n    .describe(\n      'User-defined metadata to store domain-specific information limited to 8 keys with scalar values.'\n    )\n  export type Metadata = z.infer<typeof MetadataSchema>\n\n  export const DeploymentIdSchema = z.any().describe('deployment_id parameter')\n  export type DeploymentId = z.infer<typeof DeploymentIdSchema>\n\n  export const WaitTimerSchema = z\n    .number()\n    .int()\n    .describe(\n      'The amount of time to delay a job after the job is initially triggered. The time (in minutes) must be an integer between 0 and 43,200 (30 days).'\n    )\n  export type WaitTimer = z.infer<typeof WaitTimerSchema>\n\n  export const DeploymentBranchPolicySettingsSchema = z\n    .object({\n      protected_branches: z\n        .boolean()\n        .describe(\n          'Whether only branches with branch protection rules can deploy to this environment. If `protected_branches` is `true`, `custom_branch_policies` must be `false`; if `protected_branches` is `false`, `custom_branch_policies` must be `true`.'\n        ),\n      custom_branch_policies: z\n        .boolean()\n        .describe(\n          'Whether only branches that match the specified name patterns can deploy to this environment.  If `custom_branch_policies` is `true`, `protected_branches` must be `false`; if `custom_branch_policies` is `false`, `protected_branches` must be `true`.'\n        )\n    })\n    .describe(\n      'The type of deployment branch policy for this environment. To allow all branches to deploy, set to `null`.'\n    )\n  export type DeploymentBranchPolicySettings = z.infer<\n    typeof DeploymentBranchPolicySettingsSchema\n  >\n\n  export const EnvironmentNameSchema = z\n    .any()\n    .describe(\n      'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n    )\n  export type EnvironmentName = z.infer<typeof EnvironmentNameSchema>\n\n  export const PreventSelfReviewSchema = z\n    .boolean()\n    .describe(\n      'Whether or not a user who created the job is prevented from approving their own job.'\n    )\n  export type PreventSelfReview = z.infer<typeof PreventSelfReviewSchema>\n\n  export const DeploymentBranchPolicySchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the branch or tag policy.')\n        .optional(),\n      node_id: z.string().optional(),\n      name: z\n        .string()\n        .describe(\n          'The name pattern that branches or tags must match in order to deploy to the environment.'\n        )\n        .optional(),\n      type: z\n        .enum(['branch', 'tag'])\n        .describe('Whether this rule targets a branch or tag.')\n        .optional()\n    })\n    .describe('Details of a deployment branch or tag policy.')\n  export type DeploymentBranchPolicy = z.infer<\n    typeof DeploymentBranchPolicySchema\n  >\n\n  export const DeploymentBranchPolicyNamePatternWithTypeSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        'The name pattern that branches or tags must match in order to deploy to the environment.\\n\\nWildcard characters will not match `/`. For example, to match branches that begin with `release/` and contain an additional single slash, use `release/*/*`.\\nFor more information about pattern matching syntax, see the [Ruby File.fnmatch documentation](https://ruby-doc.org/core-2.5.1/File.html#method-c-fnmatch).'\n      ),\n    type: z\n      .enum(['branch', 'tag'])\n      .describe('Whether this rule targets a branch or tag')\n      .optional()\n  })\n  export type DeploymentBranchPolicyNamePatternWithType = z.infer<\n    typeof DeploymentBranchPolicyNamePatternWithTypeSchema\n  >\n\n  export const BranchPolicyIdSchema = z\n    .any()\n    .describe('The unique identifier of the branch policy.')\n  export type BranchPolicyId = z.infer<typeof BranchPolicyIdSchema>\n\n  export const DeploymentBranchPolicyNamePatternSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        'The name pattern that branches must match in order to deploy to the environment.\\n\\nWildcard characters will not match `/`. For example, to match branches that begin with `release/` and contain an additional single slash, use `release/*/*`.\\nFor more information about pattern matching syntax, see the [Ruby File.fnmatch documentation](https://ruby-doc.org/core-2.5.1/File.html#method-c-fnmatch).'\n      )\n  })\n  export type DeploymentBranchPolicyNamePattern = z.infer<\n    typeof DeploymentBranchPolicyNamePatternSchema\n  >\n\n  export const CustomDeploymentRuleAppSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe(\n          'The unique identifier of the deployment protection rule integration.'\n        ),\n      slug: z\n        .string()\n        .describe(\n          'The slugified name of the deployment protection rule integration.'\n        ),\n      integration_url: z\n        .string()\n        .describe('The URL for the endpoint to get details about the app.'),\n      node_id: z\n        .string()\n        .describe('The node ID for the deployment protection rule integration.')\n    })\n    .describe(\n      'A GitHub App that is providing a custom deployment protection rule.'\n    )\n  export type CustomDeploymentRuleApp = z.infer<\n    typeof CustomDeploymentRuleAppSchema\n  >\n\n  export const DeploymentProtectionRulesSchema = z.any()\n  export type DeploymentProtectionRules = z.infer<\n    typeof DeploymentProtectionRulesSchema\n  >\n\n  export const ProtectionRuleIdSchema = z\n    .any()\n    .describe('The unique identifier of the protection rule.')\n  export type ProtectionRuleId = z.infer<typeof ProtectionRuleIdSchema>\n\n  export const ShortBlobSchema = z\n    .object({ url: z.string(), sha: z.string() })\n    .describe('Short Blob')\n  export type ShortBlob = z.infer<typeof ShortBlobSchema>\n\n  export const BlobSchema = z\n    .object({\n      content: z.string(),\n      encoding: z.string(),\n      url: z.string().url(),\n      sha: z.string(),\n      size: z.number().int(),\n      node_id: z.string(),\n      highlighted_content: z.string().optional()\n    })\n    .describe('Blob')\n  export type Blob = z.infer<typeof BlobSchema>\n\n  export const GitCommitSchema = z\n    .object({\n      sha: z.string().describe('SHA for the commit'),\n      node_id: z.string(),\n      url: z.string().url(),\n      author: z\n        .object({\n          date: z\n            .string()\n            .datetime({ offset: true })\n            .describe('Timestamp of the commit'),\n          email: z.string().describe('Git email address of the user'),\n          name: z.string().describe('Name of the git user')\n        })\n        .describe('Identifying information for the git-user'),\n      committer: z\n        .object({\n          date: z\n            .string()\n            .datetime({ offset: true })\n            .describe('Timestamp of the commit'),\n          email: z.string().describe('Git email address of the user'),\n          name: z.string().describe('Name of the git user')\n        })\n        .describe('Identifying information for the git-user'),\n      message: z\n        .string()\n        .describe('Message describing the purpose of the commit'),\n      tree: z.object({\n        sha: z.string().describe('SHA for the commit'),\n        url: z.string().url()\n      }),\n      parents: z.array(\n        z.object({\n          sha: z.string().describe('SHA for the commit'),\n          url: z.string().url(),\n          html_url: z.string().url()\n        })\n      ),\n      verification: z.object({\n        verified: z.boolean(),\n        reason: z.string(),\n        signature: z.string(),\n        payload: z.string(),\n        verified_at: z.string()\n      }),\n      html_url: z.string().url()\n    })\n    .describe('Low-level Git commit operations within a repository')\n  export type GitCommit = z.infer<typeof GitCommitSchema>\n\n  export const GitRefSchema = z\n    .any()\n    .describe(\n      'The Git reference for the results you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n    )\n  export type GitRef = z.infer<typeof GitRefSchema>\n\n  export const GitRefOnlySchema = z\n    .any()\n    .describe(\n      'The Git reference. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n    )\n  export type GitRefOnly = z.infer<typeof GitRefOnlySchema>\n\n  export const GitTreeSchema = z\n    .object({\n      sha: z.string(),\n      url: z.string().url(),\n      truncated: z.boolean(),\n      tree: z\n        .array(\n          z.object({\n            path: z.string().optional(),\n            mode: z.string().optional(),\n            type: z.string().optional(),\n            sha: z.string().optional(),\n            size: z.number().int().optional(),\n            url: z.string().optional()\n          })\n        )\n        .describe('Objects specifying a tree structure')\n    })\n    .describe('The hierarchy between files in a Git repository.')\n  export type GitTree = z.infer<typeof GitTreeSchema>\n\n  export const HookResponseSchema = z.object({\n    code: z.number().int(),\n    status: z.string(),\n    message: z.string()\n  })\n  export type HookResponse = z.infer<typeof HookResponseSchema>\n\n  export const ImportSchema = z\n    .object({\n      vcs: z.string(),\n      use_lfs: z.boolean().optional(),\n      vcs_url: z.string().describe('The URL of the originating repository.'),\n      svc_root: z.string().optional(),\n      tfvc_project: z.string().optional(),\n      status: z.enum([\n        'auth',\n        'error',\n        'none',\n        'detecting',\n        'choose',\n        'auth_failed',\n        'importing',\n        'mapping',\n        'waiting_to_push',\n        'pushing',\n        'complete',\n        'setup',\n        'unknown',\n        'detection_found_multiple',\n        'detection_found_nothing',\n        'detection_needs_auth'\n      ]),\n      status_text: z.string().optional(),\n      failed_step: z.string().optional(),\n      error_message: z.string().optional(),\n      import_percent: z.number().int().optional(),\n      commit_count: z.number().int().optional(),\n      push_percent: z.number().int().optional(),\n      has_large_files: z.boolean().optional(),\n      large_files_size: z.number().int().optional(),\n      large_files_count: z.number().int().optional(),\n      project_choices: z\n        .array(\n          z.object({\n            vcs: z.string().optional(),\n            tfvc_project: z.string().optional(),\n            human_name: z.string().optional()\n          })\n        )\n        .optional(),\n      message: z.string().optional(),\n      authors_count: z.number().int().optional(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      authors_url: z.string().url(),\n      repository_url: z.string().url(),\n      svn_root: z.string().optional()\n    })\n    .describe('A repository import from an external source.')\n  export type Import = z.infer<typeof ImportSchema>\n\n  export const PorterAuthorSchema = z\n    .object({\n      id: z.number().int(),\n      remote_id: z.string(),\n      remote_name: z.string(),\n      email: z.string(),\n      name: z.string(),\n      url: z.string().url(),\n      import_url: z.string().url()\n    })\n    .describe('Porter Author')\n  export type PorterAuthor = z.infer<typeof PorterAuthorSchema>\n\n  export const SinceUserSchema = z\n    .any()\n    .describe('A user ID. Only return users with an ID greater than this ID.')\n  export type SinceUser = z.infer<typeof SinceUserSchema>\n\n  export const PorterLargeFileSchema = z\n    .object({\n      ref_name: z.string(),\n      path: z.string(),\n      oid: z.string(),\n      size: z.number().int()\n    })\n    .describe('Porter Large File')\n  export type PorterLargeFile = z.infer<typeof PorterLargeFileSchema>\n\n  export const IssueEventLabelSchema = z\n    .object({ name: z.string(), color: z.string() })\n    .describe('Issue Event Label')\n  export type IssueEventLabel = z.infer<typeof IssueEventLabelSchema>\n\n  export const IssueEventDismissedReviewSchema = z.object({\n    state: z.string(),\n    review_id: z.number().int(),\n    dismissal_message: z.string(),\n    dismissal_commit_id: z.string().optional()\n  })\n  export type IssueEventDismissedReview = z.infer<\n    typeof IssueEventDismissedReviewSchema\n  >\n\n  export const IssueEventMilestoneSchema = z\n    .object({ title: z.string() })\n    .describe('Issue Event Milestone')\n  export type IssueEventMilestone = z.infer<typeof IssueEventMilestoneSchema>\n\n  export const IssueEventProjectCardSchema = z\n    .object({\n      url: z.string().url(),\n      id: z.number().int(),\n      project_url: z.string().url(),\n      project_id: z.number().int(),\n      column_name: z.string(),\n      previous_column_name: z.string().optional()\n    })\n    .describe('Issue Event Project Card')\n  export type IssueEventProjectCard = z.infer<\n    typeof IssueEventProjectCardSchema\n  >\n\n  export const IssueEventRenameSchema = z\n    .object({ from: z.string(), to: z.string() })\n    .describe('Issue Event Rename')\n  export type IssueEventRename = z.infer<typeof IssueEventRenameSchema>\n\n  export const IssueNumberSchema = z\n    .any()\n    .describe('The number that identifies the issue.')\n  export type IssueNumber = z.infer<typeof IssueNumberSchema>\n\n  export const LabelSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier for the label.'),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the label'),\n      name: z.string().describe('The name of the label.'),\n      description: z\n        .string()\n        .describe('Optional description of the label, such as its purpose.'),\n      color: z\n        .string()\n        .describe(\n          '6-character hex code, without the leading #, identifying the color'\n        ),\n      default: z\n        .boolean()\n        .describe('Whether this label comes by default in a new repository.')\n    })\n    .describe(\n      'Color-coded labels help you categorize and filter your issues (just like labels in Gmail).'\n    )\n  export type Label = z.infer<typeof LabelSchema>\n\n  export const TimelineCommittedEventSchema = z\n    .object({\n      event: z.string().optional(),\n      sha: z.string().describe('SHA for the commit'),\n      node_id: z.string(),\n      url: z.string().url(),\n      author: z\n        .object({\n          date: z\n            .string()\n            .datetime({ offset: true })\n            .describe('Timestamp of the commit'),\n          email: z.string().describe('Git email address of the user'),\n          name: z.string().describe('Name of the git user')\n        })\n        .describe('Identifying information for the git-user'),\n      committer: z\n        .object({\n          date: z\n            .string()\n            .datetime({ offset: true })\n            .describe('Timestamp of the commit'),\n          email: z.string().describe('Git email address of the user'),\n          name: z.string().describe('Name of the git user')\n        })\n        .describe('Identifying information for the git-user'),\n      message: z\n        .string()\n        .describe('Message describing the purpose of the commit'),\n      tree: z.object({\n        sha: z.string().describe('SHA for the commit'),\n        url: z.string().url()\n      }),\n      parents: z.array(\n        z.object({\n          sha: z.string().describe('SHA for the commit'),\n          url: z.string().url(),\n          html_url: z.string().url()\n        })\n      ),\n      verification: z.object({\n        verified: z.boolean(),\n        reason: z.string(),\n        signature: z.string(),\n        payload: z.string(),\n        verified_at: z.string()\n      }),\n      html_url: z.string().url()\n    })\n    .describe('Timeline Committed Event')\n  export type TimelineCommittedEvent = z.infer<\n    typeof TimelineCommittedEventSchema\n  >\n\n  export const DeployKeySchema = z\n    .object({\n      id: z.number().int(),\n      key: z.string(),\n      url: z.string(),\n      title: z.string(),\n      verified: z.boolean(),\n      created_at: z.string(),\n      read_only: z.boolean(),\n      added_by: z.string().optional(),\n      last_used: z.string().optional(),\n      enabled: z.boolean().optional()\n    })\n    .describe('An SSH key granting access to a single repository.')\n  export type DeployKey = z.infer<typeof DeployKeySchema>\n\n  export const KeyIdSchema = z\n    .any()\n    .describe('The unique identifier of the key.')\n  export type KeyId = z.infer<typeof KeyIdSchema>\n\n  export const LanguageSchema = z.record(z.number().int()).describe('Language')\n  export type Language = z.infer<typeof LanguageSchema>\n\n  export const MergedUpstreamSchema = z\n    .object({\n      message: z.string().optional(),\n      merge_type: z.enum(['merge', 'fast-forward', 'none']).optional(),\n      base_branch: z.string().optional()\n    })\n    .describe('Results of a successful merge upstream request')\n  export type MergedUpstream = z.infer<typeof MergedUpstreamSchema>\n\n  export const MilestoneNumberSchema = z\n    .any()\n    .describe('The number that identifies the milestone.')\n  export type MilestoneNumber = z.infer<typeof MilestoneNumberSchema>\n\n  export const PagesSourceHashSchema = z.object({\n    branch: z.string(),\n    path: z.string()\n  })\n  export type PagesSourceHash = z.infer<typeof PagesSourceHashSchema>\n\n  export const PagesHttpsCertificateSchema = z.object({\n    state: z.enum([\n      'new',\n      'authorization_created',\n      'authorization_pending',\n      'authorized',\n      'authorization_revoked',\n      'issued',\n      'uploaded',\n      'approved',\n      'errored',\n      'bad_authz',\n      'destroy_pending',\n      'dns_changed'\n    ]),\n    description: z.string(),\n    domains: z\n      .array(z.string())\n      .describe(\n        'Array of the domain set and its alternate name (if it is configured)'\n      ),\n    expires_at: z.string().date().optional()\n  })\n  export type PagesHttpsCertificate = z.infer<\n    typeof PagesHttpsCertificateSchema\n  >\n\n  export const PageBuildStatusSchema = z\n    .object({ url: z.string().url(), status: z.string() })\n    .describe('Page Build Status')\n  export type PageBuildStatus = z.infer<typeof PageBuildStatusSchema>\n\n  export const PageDeploymentSchema = z\n    .object({\n      id: z\n        .union([z.number().int(), z.string()])\n        .describe(\n          'The ID of the GitHub Pages deployment. This is the Git SHA of the deployed commit.'\n        ),\n      status_url: z\n        .string()\n        .url()\n        .describe('The URI to monitor GitHub Pages deployment status.'),\n      page_url: z\n        .string()\n        .url()\n        .describe('The URI to the deployed GitHub Pages.'),\n      preview_url: z\n        .string()\n        .url()\n        .describe('The URI to the deployed GitHub Pages preview.')\n        .optional()\n    })\n    .describe('The GitHub Pages deployment status.')\n  export type PageDeployment = z.infer<typeof PageDeploymentSchema>\n\n  export const PagesDeploymentStatusSchema = z.object({\n    status: z\n      .enum([\n        'deployment_in_progress',\n        'syncing_files',\n        'finished_file_sync',\n        'updating_pages',\n        'purging_cdn',\n        'deployment_cancelled',\n        'deployment_failed',\n        'deployment_content_failed',\n        'deployment_attempt_error',\n        'deployment_lost',\n        'succeed'\n      ])\n      .describe('The current status of the deployment.')\n      .optional()\n  })\n  export type PagesDeploymentStatus = z.infer<\n    typeof PagesDeploymentStatusSchema\n  >\n\n  export const PagesDeploymentIdSchema = z\n    .any()\n    .describe(\n      'The ID of the Pages deployment. You can also give the commit SHA of the deployment.'\n    )\n  export type PagesDeploymentId = z.infer<typeof PagesDeploymentIdSchema>\n\n  export const PagesHealthCheckSchema = z\n    .object({\n      domain: z\n        .object({\n          host: z.string().optional(),\n          uri: z.string().optional(),\n          nameservers: z.string().optional(),\n          dns_resolves: z.boolean().optional(),\n          is_proxied: z.boolean().optional(),\n          is_cloudflare_ip: z.boolean().optional(),\n          is_fastly_ip: z.boolean().optional(),\n          is_old_ip_address: z.boolean().optional(),\n          is_a_record: z.boolean().optional(),\n          has_cname_record: z.boolean().optional(),\n          has_mx_records_present: z.boolean().optional(),\n          is_valid_domain: z.boolean().optional(),\n          is_apex_domain: z.boolean().optional(),\n          should_be_a_record: z.boolean().optional(),\n          is_cname_to_github_user_domain: z.boolean().optional(),\n          is_cname_to_pages_dot_github_dot_com: z.boolean().optional(),\n          is_cname_to_fastly: z.boolean().optional(),\n          is_pointed_to_github_pages_ip: z.boolean().optional(),\n          is_non_github_pages_ip_present: z.boolean().optional(),\n          is_pages_domain: z.boolean().optional(),\n          is_served_by_pages: z.boolean().optional(),\n          is_valid: z.boolean().optional(),\n          reason: z.string().optional(),\n          responds_to_https: z.boolean().optional(),\n          enforces_https: z.boolean().optional(),\n          https_error: z.string().optional(),\n          is_https_eligible: z.boolean().optional(),\n          caa_error: z.string().optional()\n        })\n        .optional(),\n      alt_domain: z\n        .object({\n          host: z.string().optional(),\n          uri: z.string().optional(),\n          nameservers: z.string().optional(),\n          dns_resolves: z.boolean().optional(),\n          is_proxied: z.boolean().optional(),\n          is_cloudflare_ip: z.boolean().optional(),\n          is_fastly_ip: z.boolean().optional(),\n          is_old_ip_address: z.boolean().optional(),\n          is_a_record: z.boolean().optional(),\n          has_cname_record: z.boolean().optional(),\n          has_mx_records_present: z.boolean().optional(),\n          is_valid_domain: z.boolean().optional(),\n          is_apex_domain: z.boolean().optional(),\n          should_be_a_record: z.boolean().optional(),\n          is_cname_to_github_user_domain: z.boolean().optional(),\n          is_cname_to_pages_dot_github_dot_com: z.boolean().optional(),\n          is_cname_to_fastly: z.boolean().optional(),\n          is_pointed_to_github_pages_ip: z.boolean().optional(),\n          is_non_github_pages_ip_present: z.boolean().optional(),\n          is_pages_domain: z.boolean().optional(),\n          is_served_by_pages: z.boolean().optional(),\n          is_valid: z.boolean().optional(),\n          reason: z.string().optional(),\n          responds_to_https: z.boolean().optional(),\n          enforces_https: z.boolean().optional(),\n          https_error: z.string().optional(),\n          is_https_eligible: z.boolean().optional(),\n          caa_error: z.string().optional()\n        })\n        .optional()\n    })\n    .describe('Pages Health Check Status')\n  export type PagesHealthCheck = z.infer<typeof PagesHealthCheckSchema>\n\n  export const PullNumberSchema = z\n    .any()\n    .describe('The number that identifies the pull request.')\n  export type PullNumber = z.infer<typeof PullNumberSchema>\n\n  export const PullRequestMergeResultSchema = z\n    .object({ sha: z.string(), merged: z.boolean(), message: z.string() })\n    .describe('Pull Request Merge Result')\n  export type PullRequestMergeResult = z.infer<\n    typeof PullRequestMergeResultSchema\n  >\n\n  export const ReviewIdSchema = z\n    .any()\n    .describe('The unique identifier of the review.')\n  export type ReviewId = z.infer<typeof ReviewIdSchema>\n\n  export const AssetIdSchema = z\n    .any()\n    .describe('The unique identifier of the asset.')\n  export type AssetId = z.infer<typeof AssetIdSchema>\n\n  export const ReleaseNotesContentSchema = z\n    .object({\n      name: z.string().describe('The generated name of the release'),\n      body: z\n        .string()\n        .describe(\n          'The generated body describing the contents of the release supporting markdown formatting'\n        )\n    })\n    .describe('Generated name and body describing a release')\n  export type ReleaseNotesContent = z.infer<typeof ReleaseNotesContentSchema>\n\n  export const ReleaseIdSchema = z\n    .any()\n    .describe('The unique identifier of the release.')\n  export type ReleaseId = z.infer<typeof ReleaseIdSchema>\n\n  export const RepositoryRuleRulesetInfoSchema = z\n    .any()\n    .describe(\n      'User-defined metadata to store domain-specific information limited to 8 keys with scalar values.'\n    )\n  export type RepositoryRuleRulesetInfo = z.infer<\n    typeof RepositoryRuleRulesetInfoSchema\n  >\n\n  export const SecretScanningAlertResolutionCommentSchema = z\n    .string()\n    .describe(\n      'An optional comment when closing an alert. Cannot be updated or deleted. Must be `null` when changing `state` to `open`.'\n    )\n  export type SecretScanningAlertResolutionComment = z.infer<\n    typeof SecretScanningAlertResolutionCommentSchema\n  >\n\n  export const SecretScanningLocationCommitSchema = z\n    .object({\n      path: z.string().describe('The file path in the repository'),\n      start_line: z\n        .number()\n        .describe('Line number at which the secret starts in the file'),\n      end_line: z\n        .number()\n        .describe('Line number at which the secret ends in the file'),\n      start_column: z\n        .number()\n        .describe(\n          'The column at which the secret starts within the start line when the file is interpreted as 8BIT ASCII'\n        ),\n      end_column: z\n        .number()\n        .describe(\n          'The column at which the secret ends within the end line when the file is interpreted as 8BIT ASCII'\n        ),\n      blob_sha: z.string().describe('SHA-1 hash ID of the associated blob'),\n      blob_url: z\n        .string()\n        .describe('The API URL to get the associated blob resource'),\n      commit_sha: z.string().describe('SHA-1 hash ID of the associated commit'),\n      commit_url: z\n        .string()\n        .describe('The API URL to get the associated commit resource')\n    })\n    .describe(\n      \"Represents a 'commit' secret scanning location type. This location type shows that a secret was detected inside a commit to a repository.\"\n    )\n  export type SecretScanningLocationCommit = z.infer<\n    typeof SecretScanningLocationCommitSchema\n  >\n\n  export const SecretScanningLocationWikiCommitSchema = z\n    .object({\n      path: z.string().describe('The file path of the wiki page'),\n      start_line: z\n        .number()\n        .describe('Line number at which the secret starts in the file'),\n      end_line: z\n        .number()\n        .describe('Line number at which the secret ends in the file'),\n      start_column: z\n        .number()\n        .describe(\n          'The column at which the secret starts within the start line when the file is interpreted as 8-bit ASCII.'\n        ),\n      end_column: z\n        .number()\n        .describe(\n          'The column at which the secret ends within the end line when the file is interpreted as 8-bit ASCII.'\n        ),\n      blob_sha: z.string().describe('SHA-1 hash ID of the associated blob'),\n      page_url: z\n        .string()\n        .describe('The GitHub URL to get the associated wiki page'),\n      commit_sha: z.string().describe('SHA-1 hash ID of the associated commit'),\n      commit_url: z\n        .string()\n        .describe('The GitHub URL to get the associated wiki commit')\n    })\n    .describe(\n      \"Represents a 'wiki_commit' secret scanning location type. This location type shows that a secret was detected inside a commit to a repository wiki.\"\n    )\n  export type SecretScanningLocationWikiCommit = z.infer<\n    typeof SecretScanningLocationWikiCommitSchema\n  >\n\n  export const SecretScanningLocationIssueTitleSchema = z\n    .object({\n      issue_title_url: z\n        .string()\n        .url()\n        .describe('The API URL to get the issue where the secret was detected.')\n    })\n    .describe(\n      \"Represents an 'issue_title' secret scanning location type. This location type shows that a secret was detected in the title of an issue.\"\n    )\n  export type SecretScanningLocationIssueTitle = z.infer<\n    typeof SecretScanningLocationIssueTitleSchema\n  >\n\n  export const SecretScanningLocationIssueBodySchema = z\n    .object({\n      issue_body_url: z\n        .string()\n        .url()\n        .describe('The API URL to get the issue where the secret was detected.')\n    })\n    .describe(\n      \"Represents an 'issue_body' secret scanning location type. This location type shows that a secret was detected in the body of an issue.\"\n    )\n  export type SecretScanningLocationIssueBody = z.infer<\n    typeof SecretScanningLocationIssueBodySchema\n  >\n\n  export const SecretScanningLocationIssueCommentSchema = z\n    .object({\n      issue_comment_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get the issue comment where the secret was detected.'\n        )\n    })\n    .describe(\n      \"Represents an 'issue_comment' secret scanning location type. This location type shows that a secret was detected in a comment on an issue.\"\n    )\n  export type SecretScanningLocationIssueComment = z.infer<\n    typeof SecretScanningLocationIssueCommentSchema\n  >\n\n  export const SecretScanningLocationDiscussionTitleSchema = z\n    .object({\n      discussion_title_url: z\n        .string()\n        .url()\n        .describe('The URL to the discussion where the secret was detected.')\n    })\n    .describe(\n      \"Represents a 'discussion_title' secret scanning location type. This location type shows that a secret was detected in the title of a discussion.\"\n    )\n  export type SecretScanningLocationDiscussionTitle = z.infer<\n    typeof SecretScanningLocationDiscussionTitleSchema\n  >\n\n  export const SecretScanningLocationDiscussionBodySchema = z\n    .object({\n      discussion_body_url: z\n        .string()\n        .url()\n        .describe('The URL to the discussion where the secret was detected.')\n    })\n    .describe(\n      \"Represents a 'discussion_body' secret scanning location type. This location type shows that a secret was detected in the body of a discussion.\"\n    )\n  export type SecretScanningLocationDiscussionBody = z.infer<\n    typeof SecretScanningLocationDiscussionBodySchema\n  >\n\n  export const SecretScanningLocationDiscussionCommentSchema = z\n    .object({\n      discussion_comment_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get the discussion comment where the secret was detected.'\n        )\n    })\n    .describe(\n      \"Represents a 'discussion_comment' secret scanning location type. This location type shows that a secret was detected in a comment on a discussion.\"\n    )\n  export type SecretScanningLocationDiscussionComment = z.infer<\n    typeof SecretScanningLocationDiscussionCommentSchema\n  >\n\n  export const SecretScanningLocationPullRequestTitleSchema = z\n    .object({\n      pull_request_title_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get the pull request where the secret was detected.'\n        )\n    })\n    .describe(\n      \"Represents a 'pull_request_title' secret scanning location type. This location type shows that a secret was detected in the title of a pull request.\"\n    )\n  export type SecretScanningLocationPullRequestTitle = z.infer<\n    typeof SecretScanningLocationPullRequestTitleSchema\n  >\n\n  export const SecretScanningLocationPullRequestBodySchema = z\n    .object({\n      pull_request_body_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get the pull request where the secret was detected.'\n        )\n    })\n    .describe(\n      \"Represents a 'pull_request_body' secret scanning location type. This location type shows that a secret was detected in the body of a pull request.\"\n    )\n  export type SecretScanningLocationPullRequestBody = z.infer<\n    typeof SecretScanningLocationPullRequestBodySchema\n  >\n\n  export const SecretScanningLocationPullRequestCommentSchema = z\n    .object({\n      pull_request_comment_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get the pull request comment where the secret was detected.'\n        )\n    })\n    .describe(\n      \"Represents a 'pull_request_comment' secret scanning location type. This location type shows that a secret was detected in a comment on a pull request.\"\n    )\n  export type SecretScanningLocationPullRequestComment = z.infer<\n    typeof SecretScanningLocationPullRequestCommentSchema\n  >\n\n  export const SecretScanningLocationPullRequestReviewSchema = z\n    .object({\n      pull_request_review_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get the pull request review where the secret was detected.'\n        )\n    })\n    .describe(\n      \"Represents a 'pull_request_review' secret scanning location type. This location type shows that a secret was detected in a review on a pull request.\"\n    )\n  export type SecretScanningLocationPullRequestReview = z.infer<\n    typeof SecretScanningLocationPullRequestReviewSchema\n  >\n\n  export const SecretScanningLocationPullRequestReviewCommentSchema = z\n    .object({\n      pull_request_review_comment_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get the pull request review comment where the secret was detected.'\n        )\n    })\n    .describe(\n      \"Represents a 'pull_request_review_comment' secret scanning location type. This location type shows that a secret was detected in a review comment on a pull request.\"\n    )\n  export type SecretScanningLocationPullRequestReviewComment = z.infer<\n    typeof SecretScanningLocationPullRequestReviewCommentSchema\n  >\n\n  export const SecretScanningPushProtectionBypassReasonSchema = z\n    .enum(['false_positive', 'used_in_tests', 'will_fix_later'])\n    .describe('The reason for bypassing push protection.')\n  export type SecretScanningPushProtectionBypassReason = z.infer<\n    typeof SecretScanningPushProtectionBypassReasonSchema\n  >\n\n  export const SecretScanningPushProtectionBypassPlaceholderIdSchema = z\n    .string()\n    .describe(\n      'The ID of the push protection bypass placeholder. This value is returned on any push protected routes.'\n    )\n  export type SecretScanningPushProtectionBypassPlaceholderId = z.infer<\n    typeof SecretScanningPushProtectionBypassPlaceholderIdSchema\n  >\n\n  export const SecretScanningScanSchema = z\n    .object({\n      type: z.string().describe('The type of scan').optional(),\n      status: z\n        .string()\n        .describe(\n          'The state of the scan. Either \"completed\", \"running\", or \"pending\"'\n        )\n        .optional(),\n      completed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the scan was completed. Empty if the scan is running'\n        )\n        .optional(),\n      started_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the scan was started. Empty if the scan is pending'\n        )\n        .optional()\n    })\n    .describe(\n      'Information on a single scan performed by secret scanning on the repository'\n    )\n  export type SecretScanningScan = z.infer<typeof SecretScanningScanSchema>\n\n  export const CodeFrequencyStatSchema = z\n    .array(z.number().int())\n    .describe('Code Frequency Stat')\n  export type CodeFrequencyStat = z.infer<typeof CodeFrequencyStatSchema>\n\n  export const CommitActivitySchema = z\n    .object({\n      days: z.array(z.number().int()),\n      total: z.number().int(),\n      week: z.number().int()\n    })\n    .describe('Commit Activity')\n  export type CommitActivity = z.infer<typeof CommitActivitySchema>\n\n  export const ParticipationStatsSchema = z.object({\n    all: z.array(z.number().int()),\n    owner: z.array(z.number().int())\n  })\n  export type ParticipationStats = z.infer<typeof ParticipationStatsSchema>\n\n  export const RepositorySubscriptionSchema = z\n    .object({\n      subscribed: z\n        .boolean()\n        .describe(\n          'Determines if notifications should be received from this repository.'\n        ),\n      ignored: z\n        .boolean()\n        .describe(\n          'Determines if all notifications should be blocked from this repository.'\n        ),\n      reason: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      url: z.string().url(),\n      repository_url: z.string().url()\n    })\n    .describe('Repository invitations let you manage who you collaborate with.')\n  export type RepositorySubscription = z.infer<\n    typeof RepositorySubscriptionSchema\n  >\n\n  export const TagSchema = z\n    .object({\n      name: z.string(),\n      commit: z.object({ sha: z.string(), url: z.string().url() }),\n      zipball_url: z.string().url(),\n      tarball_url: z.string().url(),\n      node_id: z.string()\n    })\n    .describe('Tag')\n  export type Tag = z.infer<typeof TagSchema>\n\n  export const TagProtectionSchema = z\n    .object({\n      id: z.number().int().optional(),\n      created_at: z.string().optional(),\n      updated_at: z.string().optional(),\n      enabled: z.boolean().optional(),\n      pattern: z.string()\n    })\n    .describe('Tag protection')\n  export type TagProtection = z.infer<typeof TagProtectionSchema>\n\n  export const TagProtectionIdSchema = z\n    .any()\n    .describe('The unique identifier of the tag protection.')\n  export type TagProtectionId = z.infer<typeof TagProtectionIdSchema>\n\n  export const TopicSchema = z\n    .object({ names: z.array(z.string()) })\n    .describe('A topic aggregates entities that are related to a subject.')\n  export type Topic = z.infer<typeof TopicSchema>\n\n  export const TrafficSchema = z.object({\n    timestamp: z.string().datetime({ offset: true }),\n    uniques: z.number().int(),\n    count: z.number().int()\n  })\n  export type Traffic = z.infer<typeof TrafficSchema>\n\n  export const PerSchema = z\n    .any()\n    .describe('The time frame to display results for.')\n  export type Per = z.infer<typeof PerSchema>\n\n  export const ContentTrafficSchema = z\n    .object({\n      path: z.string(),\n      title: z.string(),\n      count: z.number().int(),\n      uniques: z.number().int()\n    })\n    .describe('Content Traffic')\n  export type ContentTraffic = z.infer<typeof ContentTrafficSchema>\n\n  export const ReferrerTrafficSchema = z\n    .object({\n      referrer: z.string(),\n      count: z.number().int(),\n      uniques: z.number().int()\n    })\n    .describe('Referrer Traffic')\n  export type ReferrerTraffic = z.infer<typeof ReferrerTrafficSchema>\n\n  export const SinceRepoSchema = z\n    .any()\n    .describe(\n      'A repository ID. Only return repositories with an ID greater than this ID.'\n    )\n  export type SinceRepo = z.infer<typeof SinceRepoSchema>\n\n  export const SearchResultTextMatchesSchema = z.array(\n    z.object({\n      object_url: z.string().optional(),\n      object_type: z.string().optional(),\n      property: z.string().optional(),\n      fragment: z.string().optional(),\n      matches: z\n        .array(\n          z.object({\n            text: z.string().optional(),\n            indices: z.array(z.number().int()).optional()\n          })\n        )\n        .optional()\n    })\n  )\n  export type SearchResultTextMatches = z.infer<\n    typeof SearchResultTextMatchesSchema\n  >\n\n  export const OrderSchema = z\n    .any()\n    .describe(\n      'Determines whether the first search result returned is the highest number of matches (`desc`) or lowest number of matches (`asc`). This parameter is ignored unless you provide `sort`.'\n    )\n  export type Order = z.infer<typeof OrderSchema>\n\n  export const IssuesAdvancedSearchSchema = z\n    .any()\n    .describe(\n      'Set to `true` to use advanced search.\\nExample: `http://api.github.com/search/issues?q={query}&advanced_search=true`'\n    )\n  export type IssuesAdvancedSearch = z.infer<typeof IssuesAdvancedSearchSchema>\n\n  export const TeamIdSchema = z\n    .any()\n    .describe('The unique identifier of the team.')\n  export type TeamId = z.infer<typeof TeamIdSchema>\n\n  export const PrivateUserSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      user_view_type: z.string().optional(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      site_admin: z.boolean(),\n      name: z.string(),\n      company: z.string(),\n      blog: z.string(),\n      location: z.string(),\n      email: z.string().email(),\n      notification_email: z.string().email().optional(),\n      hireable: z.boolean(),\n      bio: z.string(),\n      twitter_username: z.string().optional(),\n      public_repos: z.number().int(),\n      public_gists: z.number().int(),\n      followers: z.number().int(),\n      following: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      private_gists: z.number().int(),\n      total_private_repos: z.number().int(),\n      owned_private_repos: z.number().int(),\n      disk_usage: z.number().int(),\n      collaborators: z.number().int(),\n      two_factor_authentication: z.boolean(),\n      plan: z\n        .object({\n          collaborators: z.number().int(),\n          name: z.string(),\n          space: z.number().int(),\n          private_repos: z.number().int()\n        })\n        .optional(),\n      business_plus: z.boolean().optional(),\n      ldap_dn: z.string().optional()\n    })\n    .describe('Private User')\n  export type PrivateUser = z.infer<typeof PrivateUserSchema>\n\n  export const RepositoryIdInQuerySchema = z\n    .any()\n    .describe('ID of the Repository to filter on')\n  export type RepositoryIdInQuery = z.infer<typeof RepositoryIdInQuerySchema>\n\n  export const CodespacesSecretSchema = z\n    .object({\n      name: z.string().describe('The name of the secret'),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the secret was created, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the secret was last updated, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe(\n          'The type of repositories in the organization that the secret is visible to'\n        ),\n      selected_repositories_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL at which the list of repositories this secret is visible to can be retrieved'\n        )\n    })\n    .describe('Secrets for a GitHub Codespace.')\n  export type CodespacesSecret = z.infer<typeof CodespacesSecretSchema>\n\n  export const CodespacesUserPublicKeySchema = z\n    .object({\n      key_id: z.string().describe('The identifier for the key.'),\n      key: z.string().describe('The Base64 encoded public key.')\n    })\n    .describe(\"The public key used for setting user Codespaces' Secrets.\")\n  export type CodespacesUserPublicKey = z.infer<\n    typeof CodespacesUserPublicKeySchema\n  >\n\n  export const CodespaceExportDetailsSchema = z\n    .object({\n      state: z.string().describe('State of the latest export').optional(),\n      completed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Completion time of the last export operation')\n        .optional(),\n      branch: z.string().describe('Name of the exported branch').optional(),\n      sha: z\n        .string()\n        .describe('Git commit SHA of the exported branch')\n        .optional(),\n      id: z.string().describe('Id for the export details').optional(),\n      export_url: z\n        .string()\n        .describe('Url for fetching export details')\n        .optional(),\n      html_url: z\n        .string()\n        .describe('Web url for the exported branch')\n        .optional()\n    })\n    .describe(\n      'An export of a codespace. Also, latest export details for a codespace can be fetched with id = latest'\n    )\n  export type CodespaceExportDetails = z.infer<\n    typeof CodespaceExportDetailsSchema\n  >\n\n  export const ExportIdSchema = z\n    .any()\n    .describe(\n      'The ID of the export operation, or `latest`. Currently only `latest` is currently supported.'\n    )\n  export type ExportId = z.infer<typeof ExportIdSchema>\n\n  export const EmailSchema = z\n    .object({\n      email: z.string().email(),\n      primary: z.boolean(),\n      verified: z.boolean(),\n      visibility: z.string()\n    })\n    .describe('Email')\n  export type Email = z.infer<typeof EmailSchema>\n\n  export const GpgKeySchema = z\n    .object({\n      id: z.number().int(),\n      name: z.string().optional(),\n      primary_key_id: z.number().int(),\n      key_id: z.string(),\n      public_key: z.string(),\n      emails: z.array(\n        z.object({\n          email: z.string().optional(),\n          verified: z.boolean().optional()\n        })\n      ),\n      subkeys: z.array(\n        z.object({\n          id: z.number().int().optional(),\n          primary_key_id: z.number().int().optional(),\n          key_id: z.string().optional(),\n          public_key: z.string().optional(),\n          emails: z\n            .array(\n              z.object({\n                email: z.string().optional(),\n                verified: z.boolean().optional()\n              })\n            )\n            .optional(),\n          subkeys: z.array(z.any()).optional(),\n          can_sign: z.boolean().optional(),\n          can_encrypt_comms: z.boolean().optional(),\n          can_encrypt_storage: z.boolean().optional(),\n          can_certify: z.boolean().optional(),\n          created_at: z.string().optional(),\n          expires_at: z.string().optional(),\n          raw_key: z.string().optional(),\n          revoked: z.boolean().optional()\n        })\n      ),\n      can_sign: z.boolean(),\n      can_encrypt_comms: z.boolean(),\n      can_encrypt_storage: z.boolean(),\n      can_certify: z.boolean(),\n      created_at: z.string().datetime({ offset: true }),\n      expires_at: z.string().datetime({ offset: true }),\n      revoked: z.boolean(),\n      raw_key: z.string()\n    })\n    .describe('A unique encryption key')\n  export type GpgKey = z.infer<typeof GpgKeySchema>\n\n  export const GpgKeyIdSchema = z\n    .any()\n    .describe('The unique identifier of the GPG key.')\n  export type GpgKeyId = z.infer<typeof GpgKeyIdSchema>\n\n  export const KeySchema = z\n    .object({\n      key: z.string(),\n      id: z.number().int(),\n      url: z.string(),\n      title: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      verified: z.boolean(),\n      read_only: z.boolean()\n    })\n    .describe('Key')\n  export type Key = z.infer<typeof KeySchema>\n\n  export const MarketplaceAccountSchema = z.object({\n    url: z.string().url(),\n    id: z.number().int(),\n    type: z.string(),\n    node_id: z.string().optional(),\n    login: z.string(),\n    email: z.string().email().optional(),\n    organization_billing_email: z.string().email().optional()\n  })\n  export type MarketplaceAccount = z.infer<typeof MarketplaceAccountSchema>\n\n  export const SinceRepoDateSchema = z\n    .any()\n    .describe(\n      'Only show repositories updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type SinceRepoDate = z.infer<typeof SinceRepoDateSchema>\n\n  export const BeforeRepoDateSchema = z\n    .any()\n    .describe(\n      'Only show repositories updated before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n    )\n  export type BeforeRepoDate = z.infer<typeof BeforeRepoDateSchema>\n\n  export const SocialAccountSchema = z\n    .object({ provider: z.string(), url: z.string() })\n    .describe('Social media account')\n  export type SocialAccount = z.infer<typeof SocialAccountSchema>\n\n  export const SshSigningKeySchema = z\n    .object({\n      key: z.string(),\n      id: z.number().int(),\n      title: z.string(),\n      created_at: z.string().datetime({ offset: true })\n    })\n    .describe('A public SSH key used to sign Git commits')\n  export type SshSigningKey = z.infer<typeof SshSigningKeySchema>\n\n  export const SshSigningKeyIdSchema = z\n    .any()\n    .describe('The unique identifier of the SSH signing key.')\n  export type SshSigningKeyId = z.infer<typeof SshSigningKeyIdSchema>\n\n  export const SortStarredSchema = z\n    .any()\n    .describe(\n      'The property to sort the results by. `created` means when the repository was starred. `updated` means when the repository was last pushed to.'\n    )\n  export type SortStarred = z.infer<typeof SortStarredSchema>\n\n  export const HovercardSchema = z\n    .object({\n      contexts: z.array(z.object({ message: z.string(), octicon: z.string() }))\n    })\n    .describe('Hovercard')\n  export type Hovercard = z.infer<typeof HovercardSchema>\n\n  export const KeySimpleSchema = z\n    .object({ id: z.number().int(), key: z.string() })\n    .describe('Key Simple')\n  export type KeySimple = z.infer<typeof KeySimpleSchema>\n\n  export const VulnerabilitySchema = z\n    .object({\n      package: z\n        .object({\n          ecosystem: SecurityAdvisoryEcosystemsSchema,\n          name: z\n            .string()\n            .describe('The unique package name within its ecosystem.')\n        })\n        .describe('The name of the package affected by the vulnerability.'),\n      vulnerable_version_range: z\n        .string()\n        .describe(\n          'The range of the package versions affected by the vulnerability.'\n        ),\n      first_patched_version: z\n        .string()\n        .describe('The package version that resolves the vulnerability.'),\n      vulnerable_functions: z\n        .array(z.string())\n        .describe(\n          'The functions in the package that are affected by the vulnerability.'\n        )\n        .readonly()\n    })\n    .describe(\n      'A vulnerability describing the product and its affected versions within a GitHub Security Advisory.'\n    )\n  export type Vulnerability = z.infer<typeof VulnerabilitySchema>\n\n  export const ClassroomSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the classroom.'),\n      name: z.string().describe('The name of the classroom.'),\n      archived: z.boolean().describe('Whether classroom is archived.'),\n      organization: SimpleClassroomOrganizationSchema,\n      url: z.string().describe('The URL of the classroom on GitHub Classroom.')\n    })\n    .describe('A GitHub Classroom classroom')\n  export type Classroom = z.infer<typeof ClassroomSchema>\n\n  export const SimpleClassroomAssignmentSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the repository.'),\n      public_repo: z\n        .boolean()\n        .describe(\n          'Whether an accepted assignment creates a public repository.'\n        ),\n      title: z.string().describe('Assignment title.'),\n      type: z\n        .enum(['individual', 'group'])\n        .describe(\"Whether it's a Group Assignment or Individual Assignment.\"),\n      invite_link: z\n        .string()\n        .describe('The link that a student can use to accept the assignment.'),\n      invitations_enabled: z\n        .boolean()\n        .describe(\n          'Whether the invitation link is enabled. Visiting an enabled invitation link will accept the assignment.'\n        ),\n      slug: z.string().describe('Sluggified name of the assignment.'),\n      students_are_repo_admins: z\n        .boolean()\n        .describe(\n          'Whether students are admins on created repository on accepted assignment.'\n        ),\n      feedback_pull_requests_enabled: z\n        .boolean()\n        .describe(\n          'Whether feedback pull request will be created on assignment acceptance.'\n        ),\n      max_teams: z\n        .number()\n        .int()\n        .describe('The maximum allowable teams for the assignment.')\n        .optional(),\n      max_members: z\n        .number()\n        .int()\n        .describe('The maximum allowable members per team.')\n        .optional(),\n      editor: z.string().describe('The selected editor for the assignment.'),\n      accepted: z\n        .number()\n        .int()\n        .describe('The number of students that have accepted the assignment.'),\n      submitted: z\n        .number()\n        .int()\n        .describe('The number of students that have submitted the assignment.'),\n      passing: z\n        .number()\n        .int()\n        .describe('The number of students that have passed the assignment.'),\n      language: z\n        .string()\n        .describe('The programming language used in the assignment.'),\n      deadline: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time at which the assignment is due.'),\n      classroom: SimpleClassroomSchema\n    })\n    .describe('A GitHub Classroom assignment')\n  export type SimpleClassroomAssignment = z.infer<\n    typeof SimpleClassroomAssignmentSchema\n  >\n\n  export const CodeSecurityDefaultConfigurationsSchema = z\n    .array(\n      z.object({\n        default_for_new_repos: z\n          .enum(['public', 'private_and_internal', 'all'])\n          .describe(\n            'The visibility of newly created repositories for which the code security configuration will be applied to by default'\n          )\n          .optional(),\n        configuration: CodeSecurityConfigurationSchema.optional()\n      })\n    )\n    .describe('A list of default code security configurations')\n  export type CodeSecurityDefaultConfigurations = z.infer<\n    typeof CodeSecurityDefaultConfigurationsSchema\n  >\n\n  export const SimpleRepositorySchema = z\n    .object({\n      id: z.number().int().describe('A unique identifier of the repository.'),\n      node_id: z.string().describe('The GraphQL identifier of the repository.'),\n      name: z.string().describe('The name of the repository.'),\n      full_name: z\n        .string()\n        .describe('The full, globally unique, name of the repository.'),\n      owner: SimpleUserSchema,\n      private: z.boolean().describe('Whether the repository is private.'),\n      html_url: z\n        .string()\n        .url()\n        .describe('The URL to view the repository on GitHub.com.'),\n      description: z.string().describe('The repository description.'),\n      fork: z.boolean().describe('Whether the repository is a fork.'),\n      url: z\n        .string()\n        .url()\n        .describe(\n          'The URL to get more information about the repository from the GitHub API.'\n        ),\n      archive_url: z\n        .string()\n        .describe(\n          'A template for the API URL to download the repository as an archive.'\n        ),\n      assignees_url: z\n        .string()\n        .describe(\n          'A template for the API URL to list the available assignees for issues in the repository.'\n        ),\n      blobs_url: z\n        .string()\n        .describe(\n          'A template for the API URL to create or retrieve a raw Git blob in the repository.'\n        ),\n      branches_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about branches in the repository.'\n        ),\n      collaborators_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about collaborators of the repository.'\n        ),\n      comments_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about comments on the repository.'\n        ),\n      commits_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about commits on the repository.'\n        ),\n      compare_url: z\n        .string()\n        .describe('A template for the API URL to compare two commits or refs.'),\n      contents_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get the contents of the repository.'\n        ),\n      contributors_url: z\n        .string()\n        .url()\n        .describe(\n          'A template for the API URL to list the contributors to the repository.'\n        ),\n      deployments_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the deployments of the repository.'),\n      downloads_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the downloads on the repository.'),\n      events_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the events of the repository.'),\n      forks_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the forks of the repository.'),\n      git_commits_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about Git commits of the repository.'\n        ),\n      git_refs_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about Git refs of the repository.'\n        ),\n      git_tags_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about Git tags of the repository.'\n        ),\n      issue_comment_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about issue comments on the repository.'\n        ),\n      issue_events_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about issue events on the repository.'\n        ),\n      issues_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about issues on the repository.'\n        ),\n      keys_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about deploy keys on the repository.'\n        ),\n      labels_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about labels of the repository.'\n        ),\n      languages_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get information about the languages of the repository.'\n        ),\n      merges_url: z\n        .string()\n        .url()\n        .describe('The API URL to merge branches in the repository.'),\n      milestones_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about milestones of the repository.'\n        ),\n      notifications_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about notifications on the repository.'\n        ),\n      pulls_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about pull requests on the repository.'\n        ),\n      releases_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about releases on the repository.'\n        ),\n      stargazers_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the stargazers on the repository.'),\n      statuses_url: z\n        .string()\n        .describe(\n          'A template for the API URL to get information about statuses of a commit.'\n        ),\n      subscribers_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the subscribers on the repository.'),\n      subscription_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to subscribe to notifications for this repository.'\n        ),\n      tags_url: z\n        .string()\n        .url()\n        .describe(\n          'The API URL to get information about tags on the repository.'\n        ),\n      teams_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the teams on the repository.'),\n      trees_url: z\n        .string()\n        .describe(\n          'A template for the API URL to create or retrieve a raw Git tree of the repository.'\n        ),\n      hooks_url: z\n        .string()\n        .url()\n        .describe('The API URL to list the hooks on the repository.')\n    })\n    .describe('A GitHub repository.')\n  export type SimpleRepository = z.infer<typeof SimpleRepositorySchema>\n\n  export const DependabotAlertSecurityVulnerabilitySchema = z\n    .object({\n      package: DependabotAlertPackageSchema,\n      severity: z\n        .enum(['low', 'medium', 'high', 'critical'])\n        .describe('The severity of the vulnerability.')\n        .readonly(),\n      vulnerable_version_range: z\n        .string()\n        .describe(\n          \"Conditions that identify vulnerable versions of this vulnerability's package.\"\n        )\n        .readonly(),\n      first_patched_version: z\n        .object({\n          identifier: z\n            .string()\n            .describe('The package version that patches this vulnerability.')\n            .readonly()\n        })\n        .strict()\n        .describe(\n          'Details pertaining to the package version that patches this vulnerability.'\n        )\n        .readonly()\n    })\n    .strict()\n    .describe(\n      'Details pertaining to one vulnerable version range for the advisory.'\n    )\n    .readonly()\n  export type DependabotAlertSecurityVulnerability = z.infer<\n    typeof DependabotAlertSecurityVulnerabilitySchema\n  >\n\n  export const NullableMilestoneSchema = z\n    .object({\n      url: z.string().url(),\n      html_url: z.string().url(),\n      labels_url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      number: z.number().int().describe('The number of the milestone.'),\n      state: z\n        .enum(['open', 'closed'])\n        .describe('The state of the milestone.')\n        .default('open'),\n      title: z.string().describe('The title of the milestone.'),\n      description: z.string(),\n      creator: NullableSimpleUserSchema,\n      open_issues: z.number().int(),\n      closed_issues: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      closed_at: z.string().datetime({ offset: true }),\n      due_on: z.string().datetime({ offset: true })\n    })\n    .describe('A collection of related issues and pull requests.')\n  export type NullableMilestone = z.infer<typeof NullableMilestoneSchema>\n\n  export const FeedSchema = z\n    .object({\n      timeline_url: z.string(),\n      user_url: z.string(),\n      current_user_public_url: z.string().optional(),\n      current_user_url: z.string().optional(),\n      current_user_actor_url: z.string().optional(),\n      current_user_organization_url: z.string().optional(),\n      current_user_organization_urls: z.array(z.string().url()).optional(),\n      security_advisories_url: z.string().optional(),\n      repository_discussions_url: z\n        .string()\n        .describe('A feed of discussions for a given repository.')\n        .optional(),\n      repository_discussions_category_url: z\n        .string()\n        .describe('A feed of discussions for a given repository and category.')\n        .optional(),\n      _links: z.object({\n        timeline: LinkWithTypeSchema,\n        user: LinkWithTypeSchema,\n        security_advisories: LinkWithTypeSchema.optional(),\n        current_user: LinkWithTypeSchema.optional(),\n        current_user_public: LinkWithTypeSchema.optional(),\n        current_user_actor: LinkWithTypeSchema.optional(),\n        current_user_organization: LinkWithTypeSchema.optional(),\n        current_user_organizations: z.array(LinkWithTypeSchema).optional(),\n        repository_discussions: LinkWithTypeSchema.optional(),\n        repository_discussions_category: LinkWithTypeSchema.optional()\n      })\n    })\n    .describe('Feed')\n  export type Feed = z.infer<typeof FeedSchema>\n\n  export const GistHistorySchema = z\n    .object({\n      user: NullableSimpleUserSchema.optional(),\n      version: z.string().optional(),\n      committed_at: z.string().datetime({ offset: true }).optional(),\n      change_status: z\n        .object({\n          total: z.number().int().optional(),\n          additions: z.number().int().optional(),\n          deletions: z.number().int().optional()\n        })\n        .optional(),\n      url: z.string().url().optional()\n    })\n    .describe('Gist History')\n  export type GistHistory = z.infer<typeof GistHistorySchema>\n\n  export const GistCommitSchema = z\n    .object({\n      url: z.string().url(),\n      version: z.string(),\n      user: NullableSimpleUserSchema,\n      change_status: z.object({\n        total: z.number().int().optional(),\n        additions: z.number().int().optional(),\n        deletions: z.number().int().optional()\n      }),\n      committed_at: z.string().datetime({ offset: true })\n    })\n    .describe('Gist Commit')\n  export type GistCommit = z.infer<typeof GistCommitSchema>\n\n  export const MarketplacePurchaseSchema = z\n    .object({\n      url: z.string(),\n      type: z.string(),\n      id: z.number().int(),\n      login: z.string(),\n      organization_billing_email: z.string().optional(),\n      email: z.string().optional(),\n      marketplace_pending_change: z\n        .object({\n          is_installed: z.boolean().optional(),\n          effective_date: z.string().optional(),\n          unit_count: z.number().int().optional(),\n          id: z.number().int().optional(),\n          plan: MarketplaceListingPlanSchema.optional()\n        })\n        .optional(),\n      marketplace_purchase: z.object({\n        billing_cycle: z.string().optional(),\n        next_billing_date: z.string().optional(),\n        is_installed: z.boolean().optional(),\n        unit_count: z.number().int().optional(),\n        on_free_trial: z.boolean().optional(),\n        free_trial_ends_on: z.string().optional(),\n        updated_at: z.string().optional(),\n        plan: MarketplaceListingPlanSchema.optional()\n      })\n    })\n    .describe('Marketplace Purchase')\n  export type MarketplacePurchase = z.infer<typeof MarketplacePurchaseSchema>\n\n  export const RunnerSchema = z\n    .object({\n      id: z.number().int().describe('The ID of the runner.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('The ID of the runner group.')\n        .optional(),\n      name: z.string().describe('The name of the runner.'),\n      os: z.string().describe('The Operating System of the runner.'),\n      status: z.string().describe('The status of the runner.'),\n      busy: z.boolean(),\n      labels: z.array(RunnerLabelSchema),\n      ephemeral: z.boolean().optional()\n    })\n    .describe('A self hosted runner')\n  export type Runner = z.infer<typeof RunnerSchema>\n\n  export const ToolNameSchema = z\n    .any()\n    .describe(\n      'The name of a code scanning tool. Only results by this tool will be listed. You can specify the tool by using either `tool_name` or `tool_guid`, but not both.'\n    )\n  export type ToolName = z.infer<typeof ToolNameSchema>\n\n  export const ToolGuidSchema = z\n    .any()\n    .describe(\n      'The GUID of a code scanning tool. Only results by this tool will be listed. Note that some code scanning tools may not include a GUID in their analysis data. You can specify the tool by using either `tool_guid` or `tool_name`, but not both.'\n    )\n  export type ToolGuid = z.infer<typeof ToolGuidSchema>\n\n  export const CopilotOrganizationDetailsSchema = z\n    .object({\n      seat_breakdown: CopilotOrganizationSeatBreakdownSchema,\n      public_code_suggestions: z\n        .enum(['allow', 'block', 'unconfigured'])\n        .describe(\n          'The organization policy for allowing or blocking suggestions matching public code (duplication detection filter).'\n        ),\n      ide_chat: z\n        .enum(['enabled', 'disabled', 'unconfigured'])\n        .describe(\n          'The organization policy for allowing or disallowing Copilot Chat in the IDE.'\n        )\n        .optional(),\n      platform_chat: z\n        .enum(['enabled', 'disabled', 'unconfigured'])\n        .describe(\n          'The organization policy for allowing or disallowing Copilot features on GitHub.com.'\n        )\n        .optional(),\n      cli: z\n        .enum(['enabled', 'disabled', 'unconfigured'])\n        .describe(\n          'The organization policy for allowing or disallowing Copilot in the CLI.'\n        )\n        .optional(),\n      seat_management_setting: z\n        .enum(['assign_all', 'assign_selected', 'disabled', 'unconfigured'])\n        .describe('The mode of assigning new seats.'),\n      plan_type: z\n        .enum(['business', 'enterprise'])\n        .describe(\n          'The Copilot plan of the organization, or the parent enterprise, when applicable.'\n        )\n        .optional()\n    })\n    .catchall(z.any())\n    .describe(\n      'Information about the seat breakdown and policies set for an organization with a Copilot Business or Copilot Enterprise subscription.'\n    )\n  export type CopilotOrganizationDetails = z.infer<\n    typeof CopilotOrganizationDetailsSchema\n  >\n\n  export const TeamSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      slug: z.string(),\n      description: z.string(),\n      privacy: z.string().optional(),\n      notification_setting: z.string().optional(),\n      permission: z.string(),\n      permissions: z\n        .object({\n          pull: z.boolean(),\n          triage: z.boolean(),\n          push: z.boolean(),\n          maintain: z.boolean(),\n          admin: z.boolean()\n        })\n        .optional(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      members_url: z.string(),\n      repositories_url: z.string().url(),\n      parent: NullableTeamSimpleSchema\n    })\n    .describe(\n      'Groups of organization members that gives permissions on specified repositories.'\n    )\n  export type Team = z.infer<typeof TeamSchema>\n\n  export const OrganizationInvitationSchema = z\n    .object({\n      id: z.number().int(),\n      login: z.string(),\n      email: z.string(),\n      role: z.string(),\n      created_at: z.string(),\n      failed_at: z.string().optional(),\n      failed_reason: z.string().optional(),\n      inviter: SimpleUserSchema,\n      team_count: z.number().int(),\n      node_id: z.string(),\n      invitation_teams_url: z.string(),\n      invitation_source: z.string().optional()\n    })\n    .describe('Organization Invitation')\n  export type OrganizationInvitation = z.infer<\n    typeof OrganizationInvitationSchema\n  >\n\n  export const InteractionLimitResponseSchema = z\n    .object({\n      limit: InteractionGroupSchema,\n      origin: z.string(),\n      expires_at: z.string().datetime({ offset: true })\n    })\n    .describe('Interaction limit settings.')\n  export type InteractionLimitResponse = z.infer<\n    typeof InteractionLimitResponseSchema\n  >\n\n  export const OrganizationRoleSchema = z\n    .object({\n      id: z.number().int().describe('The unique identifier of the role.'),\n      name: z.string().describe('The name of the role.'),\n      description: z\n        .string()\n        .describe(\n          'A short description about who this role is for or what permissions it grants.'\n        )\n        .optional(),\n      base_role: z\n        .enum(['read', 'triage', 'write', 'maintain', 'admin'])\n        .describe('The system role from which this role inherits permissions.')\n        .optional(),\n      source: z\n        .enum(['Organization', 'Enterprise', 'Predefined'])\n        .describe(\n          'Source answers the question, \"where did this role come from?\"'\n        )\n        .optional(),\n      permissions: z\n        .array(z.string())\n        .describe('A list of permissions included in this role.'),\n      organization: NullableSimpleUserSchema,\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The date and time the role was created.'),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The date and time the role was last updated.')\n    })\n    .describe('Organization roles')\n  export type OrganizationRole = z.infer<typeof OrganizationRoleSchema>\n\n  export const TeamRoleAssignmentSchema = z\n    .object({\n      assignment: z\n        .enum(['direct', 'indirect', 'mixed'])\n        .describe(\n          'Determines if the team has a direct, indirect, or mixed relationship to a role'\n        )\n        .optional(),\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      slug: z.string(),\n      description: z.string(),\n      privacy: z.string().optional(),\n      notification_setting: z.string().optional(),\n      permission: z.string(),\n      permissions: z\n        .object({\n          pull: z.boolean(),\n          triage: z.boolean(),\n          push: z.boolean(),\n          maintain: z.boolean(),\n          admin: z.boolean()\n        })\n        .optional(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      members_url: z.string(),\n      repositories_url: z.string().url(),\n      parent: NullableTeamSimpleSchema\n    })\n    .describe('The Relationship a Team has with a role.')\n  export type TeamRoleAssignment = z.infer<typeof TeamRoleAssignmentSchema>\n\n  export const UserRoleAssignmentSchema = z\n    .object({\n      assignment: z\n        .enum(['direct', 'indirect', 'mixed'])\n        .describe(\n          'Determines if the user has a direct, indirect, or mixed relationship to a role'\n        )\n        .optional(),\n      inherited_from: z\n        .array(TeamSimpleSchema)\n        .describe('Team the user has gotten the role through')\n        .optional(),\n      name: z.string().optional(),\n      email: z.string().optional(),\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      events_url: z.string(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      site_admin: z.boolean(),\n      starred_at: z.string().optional(),\n      user_view_type: z.string().optional()\n    })\n    .describe('The Relationship a User has with a role.')\n  export type UserRoleAssignment = z.infer<typeof UserRoleAssignmentSchema>\n\n  export const OrganizationProgrammaticAccessGrantRequestSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe(\n          'Unique identifier of the request for access via fine-grained personal access token. The `pat_request_id` used to review PAT requests.'\n        ),\n      reason: z.string().describe('Reason for requesting access.'),\n      owner: SimpleUserSchema,\n      repository_selection: z\n        .enum(['none', 'all', 'subset'])\n        .describe('Type of repository selection requested.'),\n      repositories_url: z\n        .string()\n        .describe(\n          'URL to the list of repositories requested to be accessed via fine-grained personal access token. Should only be followed when `repository_selection` is `subset`.'\n        ),\n      permissions: z\n        .object({\n          organization: z.record(z.string()).optional(),\n          repository: z.record(z.string()).optional(),\n          other: z.record(z.string()).optional()\n        })\n        .describe('Permissions requested, categorized by type of permission.'),\n      created_at: z\n        .string()\n        .describe('Date and time when the request for access was created.'),\n      token_id: z\n        .number()\n        .int()\n        .describe(\n          \"Unique identifier of the user's token. This field can also be found in audit log events and the organization's settings for their PAT grants.\"\n        ),\n      token_name: z\n        .string()\n        .describe(\n          \"The name given to the user's token. This field can also be found in an organization's settings page for Active Tokens.\"\n        ),\n      token_expired: z\n        .boolean()\n        .describe(\n          'Whether the associated fine-grained personal access token has expired.'\n        ),\n      token_expires_at: z\n        .string()\n        .describe(\n          'Date and time when the associated fine-grained personal access token expires.'\n        ),\n      token_last_used_at: z\n        .string()\n        .describe(\n          'Date and time when the associated fine-grained personal access token was last used for authentication.'\n        )\n    })\n    .describe(\n      'Minimal representation of an organization programmatic access grant request for enumerations'\n    )\n  export type OrganizationProgrammaticAccessGrantRequest = z.infer<\n    typeof OrganizationProgrammaticAccessGrantRequestSchema\n  >\n\n  export const OrganizationProgrammaticAccessGrantSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe(\n          'Unique identifier of the fine-grained personal access token grant. The `pat_id` used to get details about an approved fine-grained personal access token.'\n        ),\n      owner: SimpleUserSchema,\n      repository_selection: z\n        .enum(['none', 'all', 'subset'])\n        .describe('Type of repository selection requested.'),\n      repositories_url: z\n        .string()\n        .describe(\n          'URL to the list of repositories the fine-grained personal access token can access. Only follow when `repository_selection` is `subset`.'\n        ),\n      permissions: z\n        .object({\n          organization: z.record(z.string()).optional(),\n          repository: z.record(z.string()).optional(),\n          other: z.record(z.string()).optional()\n        })\n        .describe('Permissions requested, categorized by type of permission.'),\n      access_granted_at: z\n        .string()\n        .describe(\n          'Date and time when the fine-grained personal access token was approved to access the organization.'\n        ),\n      token_id: z\n        .number()\n        .int()\n        .describe(\n          \"Unique identifier of the user's token. This field can also be found in audit log events and the organization's settings for their PAT grants.\"\n        ),\n      token_name: z\n        .string()\n        .describe(\n          \"The name given to the user's token. This field can also be found in an organization's settings page for Active Tokens.\"\n        ),\n      token_expired: z\n        .boolean()\n        .describe(\n          'Whether the associated fine-grained personal access token has expired.'\n        ),\n      token_expires_at: z\n        .string()\n        .describe(\n          'Date and time when the associated fine-grained personal access token expires.'\n        ),\n      token_last_used_at: z\n        .string()\n        .describe(\n          'Date and time when the associated fine-grained personal access token was last used for authentication.'\n        )\n    })\n    .describe(\n      'Minimal representation of an organization programmatic access grant for enumerations'\n    )\n  export type OrganizationProgrammaticAccessGrant = z.infer<\n    typeof OrganizationProgrammaticAccessGrantSchema\n  >\n\n  export const ProjectSchema = z\n    .object({\n      owner_url: z.string().url(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      columns_url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string().describe('Name of the project'),\n      body: z.string().describe('Body of the project'),\n      number: z.number().int(),\n      state: z\n        .string()\n        .describe(\"State of the project; either 'open' or 'closed'\"),\n      creator: NullableSimpleUserSchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      organization_permission: z\n        .enum(['read', 'write', 'admin', 'none'])\n        .describe(\n          'The baseline permission that all organization members have on this project. Only present if owner is an organization.'\n        )\n        .optional(),\n      private: z\n        .boolean()\n        .describe(\n          'Whether or not this project can be seen by everyone. Only present if owner is an organization.'\n        )\n        .optional()\n    })\n    .describe('Projects are a way to organize columns and cards of work.')\n  export type Project = z.infer<typeof ProjectSchema>\n\n  export const OrgRepoCustomPropertyValuesSchema = z\n    .object({\n      repository_id: z.number().int(),\n      repository_name: z.string(),\n      repository_full_name: z.string(),\n      properties: z\n        .array(CustomPropertyValueSchema)\n        .describe('List of custom property names and associated values')\n    })\n    .describe('List of custom property values for a repository')\n  export type OrgRepoCustomPropertyValues = z.infer<\n    typeof OrgRepoCustomPropertyValuesSchema\n  >\n\n  export const RepositoryRulesetConditionsRepositoryPropertyTargetSchema = z\n    .object({\n      repository_property: z.object({\n        include: z\n          .array(RepositoryRulesetConditionsRepositoryPropertySpecSchema)\n          .describe(\n            'The repository properties and values to include. All of these properties must match for the condition to pass.'\n          )\n          .optional(),\n        exclude: z\n          .array(RepositoryRulesetConditionsRepositoryPropertySpecSchema)\n          .describe(\n            'The repository properties and values to exclude. The condition will not pass if any of these properties match.'\n          )\n          .optional()\n      })\n    })\n    .describe('Parameters for a repository property condition')\n  export type RepositoryRulesetConditionsRepositoryPropertyTarget = z.infer<\n    typeof RepositoryRulesetConditionsRepositoryPropertyTargetSchema\n  >\n\n  export const RepositoryRuleRequiredStatusChecksSchema = z\n    .object({\n      type: z.literal('required_status_checks'),\n      parameters: z\n        .object({\n          do_not_enforce_on_create: z\n            .boolean()\n            .describe(\n              'Allow repositories and branches to be created if a check would otherwise prohibit it.'\n            )\n            .optional(),\n          required_status_checks: z\n            .array(RepositoryRuleParamsStatusCheckConfigurationSchema)\n            .describe('Status checks that are required.'),\n          strict_required_status_checks_policy: z\n            .boolean()\n            .describe(\n              'Whether pull requests targeting a matching branch must be tested with the latest code. This setting will not take effect unless at least one status check is enabled.'\n            )\n        })\n        .optional()\n    })\n    .describe(\n      'Choose which status checks must pass before the ref is updated. When enabled, commits must first be pushed to another ref where the checks pass.'\n    )\n  export type RepositoryRuleRequiredStatusChecks = z.infer<\n    typeof RepositoryRuleRequiredStatusChecksSchema\n  >\n\n  export const RepositoryRuleWorkflowsSchema = z\n    .object({\n      type: z.literal('workflows'),\n      parameters: z\n        .object({\n          do_not_enforce_on_create: z\n            .boolean()\n            .describe(\n              'Allow repositories and branches to be created if a check would otherwise prohibit it.'\n            )\n            .optional(),\n          workflows: z\n            .array(RepositoryRuleParamsWorkflowFileReferenceSchema)\n            .describe('Workflows that must pass for this rule to pass.')\n        })\n        .optional()\n    })\n    .describe(\n      'Require all changes made to a targeted branch to pass the specified workflows before they can be merged.'\n    )\n  export type RepositoryRuleWorkflows = z.infer<\n    typeof RepositoryRuleWorkflowsSchema\n  >\n\n  export const RepositoryRuleCodeScanningSchema = z\n    .object({\n      type: z.literal('code_scanning'),\n      parameters: z\n        .object({\n          code_scanning_tools: z\n            .array(RepositoryRuleParamsCodeScanningToolSchema)\n            .describe(\n              'Tools that must provide code scanning results for this rule to pass.'\n            )\n        })\n        .optional()\n    })\n    .describe(\n      'Choose which tools must provide code scanning results before the reference is updated. When configured, code scanning must be enabled and have results for both the commit and the reference being updated.'\n    )\n  export type RepositoryRuleCodeScanning = z.infer<\n    typeof RepositoryRuleCodeScanningSchema\n  >\n\n  export const RulesetVersionWithStateSchema = z.intersection(\n    RulesetVersionSchema,\n    z.object({\n      state: z.record(z.any()).describe('The state of the ruleset version')\n    })\n  )\n  export type RulesetVersionWithState = z.infer<\n    typeof RulesetVersionWithStateSchema\n  >\n\n  export const RepositoryAdvisoryVulnerabilitySchema = z\n    .object({\n      package: z\n        .object({\n          ecosystem: SecurityAdvisoryEcosystemsSchema,\n          name: z\n            .string()\n            .describe('The unique package name within its ecosystem.')\n        })\n        .describe('The name of the package affected by the vulnerability.'),\n      vulnerable_version_range: z\n        .string()\n        .describe(\n          'The range of the package versions affected by the vulnerability.'\n        ),\n      patched_versions: z\n        .string()\n        .describe('The package version(s) that resolve the vulnerability.'),\n      vulnerable_functions: z\n        .array(z.string())\n        .describe('The functions in the package that are affected.')\n    })\n    .strict()\n    .describe(\n      'A product affected by the vulnerability detailed in a repository security advisory.'\n    )\n  export type RepositoryAdvisoryVulnerability = z.infer<\n    typeof RepositoryAdvisoryVulnerabilitySchema\n  >\n\n  export const ReactionSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      user: NullableSimpleUserSchema,\n      content: z\n        .enum([\n          '+1',\n          '-1',\n          'laugh',\n          'confused',\n          'heart',\n          'hooray',\n          'rocket',\n          'eyes'\n        ])\n        .describe('The reaction to use'),\n      created_at: z.string().datetime({ offset: true })\n    })\n    .describe(\n      'Reactions to conversations provide a way to help people express their feelings more simply and effectively.'\n    )\n  export type Reaction = z.infer<typeof ReactionSchema>\n\n  export const TeamProjectSchema = z\n    .object({\n      owner_url: z.string(),\n      url: z.string(),\n      html_url: z.string(),\n      columns_url: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      body: z.string(),\n      number: z.number().int(),\n      state: z.string(),\n      creator: SimpleUserSchema,\n      created_at: z.string(),\n      updated_at: z.string(),\n      organization_permission: z\n        .string()\n        .describe(\n          'The organization permission for this project. Only present when owner is an organization.'\n        )\n        .optional(),\n      private: z\n        .boolean()\n        .describe(\n          'Whether the project is private or not. Only present when owner is an organization.'\n        )\n        .optional(),\n      permissions: z.object({\n        read: z.boolean(),\n        write: z.boolean(),\n        admin: z.boolean()\n      })\n    })\n    .describe(\"A team's access to a project.\")\n  export type TeamProject = z.infer<typeof TeamProjectSchema>\n\n  export const ProjectCardSchema = z\n    .object({\n      url: z.string().url(),\n      id: z.number().int().describe(\"The project card's ID\"),\n      node_id: z.string(),\n      note: z.string(),\n      creator: NullableSimpleUserSchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      archived: z\n        .boolean()\n        .describe('Whether or not the card is archived')\n        .optional(),\n      column_name: z.string().optional(),\n      project_id: z.string().optional(),\n      column_url: z.string().url(),\n      content_url: z.string().url().optional(),\n      project_url: z.string().url()\n    })\n    .describe('Project cards represent a scope of work.')\n  export type ProjectCard = z.infer<typeof ProjectCardSchema>\n\n  export const ProjectCollaboratorPermissionSchema = z\n    .object({ permission: z.string(), user: NullableSimpleUserSchema })\n    .describe('Project Collaborator Permission')\n  export type ProjectCollaboratorPermission = z.infer<\n    typeof ProjectCollaboratorPermissionSchema\n  >\n\n  export const RateLimitOverviewSchema = z\n    .object({\n      resources: z.object({\n        core: RateLimitSchema,\n        graphql: RateLimitSchema.optional(),\n        search: RateLimitSchema,\n        code_search: RateLimitSchema.optional(),\n        source_import: RateLimitSchema.optional(),\n        integration_manifest: RateLimitSchema.optional(),\n        code_scanning_upload: RateLimitSchema.optional(),\n        actions_runner_registration: RateLimitSchema.optional(),\n        scim: RateLimitSchema.optional(),\n        dependency_snapshots: RateLimitSchema.optional(),\n        code_scanning_autofix: RateLimitSchema.optional()\n      }),\n      rate: RateLimitSchema\n    })\n    .describe('Rate Limit Overview')\n  export type RateLimitOverview = z.infer<typeof RateLimitOverviewSchema>\n\n  export const EnvironmentApprovalsSchema = z\n    .object({\n      environments: z\n        .array(\n          z.object({\n            id: z\n              .number()\n              .int()\n              .describe('The id of the environment.')\n              .optional(),\n            node_id: z.string().optional(),\n            name: z\n              .string()\n              .describe('The name of the environment.')\n              .optional(),\n            url: z.string().optional(),\n            html_url: z.string().optional(),\n            created_at: z\n              .string()\n              .datetime({ offset: true })\n              .describe(\n                'The time that the environment was created, in ISO 8601 format.'\n              )\n              .optional(),\n            updated_at: z\n              .string()\n              .datetime({ offset: true })\n              .describe(\n                'The time that the environment was last updated, in ISO 8601 format.'\n              )\n              .optional()\n          })\n        )\n        .describe('The list of environments that were approved or rejected'),\n      state: z\n        .enum(['approved', 'rejected', 'pending'])\n        .describe(\n          'Whether deployment to the environment(s) was approved or rejected or pending (with comments)'\n        ),\n      user: SimpleUserSchema,\n      comment: z\n        .string()\n        .describe('The comment submitted with the deployment review')\n    })\n    .describe('An entry in the reviews log for environment deployments')\n  export type EnvironmentApprovals = z.infer<typeof EnvironmentApprovalsSchema>\n\n  export const ActivitySchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      before: z.string().describe('The SHA of the commit before the activity.'),\n      after: z.string().describe('The SHA of the commit after the activity.'),\n      ref: z\n        .string()\n        .describe(\n          'The full Git reference, formatted as `refs/heads/<branch name>`.'\n        ),\n      timestamp: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time when the activity occurred.'),\n      activity_type: z\n        .enum([\n          'push',\n          'force_push',\n          'branch_deletion',\n          'branch_creation',\n          'pr_merge',\n          'merge_queue_merge'\n        ])\n        .describe('The type of the activity that was performed.'),\n      actor: NullableSimpleUserSchema\n    })\n    .describe('Activity')\n  export type Activity = z.infer<typeof ActivitySchema>\n\n  export const CodeScanningCodeqlDatabaseSchema = z\n    .object({\n      id: z.number().int().describe('The ID of the CodeQL database.'),\n      name: z.string().describe('The name of the CodeQL database.'),\n      language: z.string().describe('The language of the CodeQL database.'),\n      uploader: SimpleUserSchema,\n      content_type: z\n        .string()\n        .describe('The MIME type of the CodeQL database file.'),\n      size: z\n        .number()\n        .int()\n        .describe('The size of the CodeQL database file in bytes.'),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the CodeQL database was created, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the CodeQL database was last updated, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        ),\n      url: z\n        .string()\n        .url()\n        .describe(\n          'The URL at which to download the CodeQL database. The `Accept` header must be set to the value of the `content_type` property.'\n        ),\n      commit_oid: z\n        .string()\n        .describe(\n          'The commit SHA of the repository at the time the CodeQL database was created.'\n        )\n        .optional()\n    })\n    .describe('A CodeQL database.')\n  export type CodeScanningCodeqlDatabase = z.infer<\n    typeof CodeScanningCodeqlDatabaseSchema\n  >\n\n  export const CodeScanningVariantAnalysisSkippedRepoGroupSchema = z.object({\n    repository_count: z\n      .number()\n      .int()\n      .describe(\n        'The total number of repositories that were skipped for this reason.'\n      ),\n    repositories: z\n      .array(CodeScanningVariantAnalysisRepositorySchema)\n      .describe(\n        'A list of repositories that were skipped. This list may not include all repositories that were skipped. This is only available when the repository was found and the user has access to it.'\n      )\n  })\n  export type CodeScanningVariantAnalysisSkippedRepoGroup = z.infer<\n    typeof CodeScanningVariantAnalysisSkippedRepoGroupSchema\n  >\n\n  export const CodeSecurityConfigurationForRepositorySchema = z\n    .object({\n      status: z\n        .enum([\n          'attached',\n          'attaching',\n          'detached',\n          'removed',\n          'enforced',\n          'failed',\n          'updating',\n          'removed_by_enterprise'\n        ])\n        .describe(\n          'The attachment status of the code security configuration on the repository.'\n        )\n        .optional(),\n      configuration: CodeSecurityConfigurationSchema.optional()\n    })\n    .describe(\n      'Code security configuration associated with a repository and attachment status'\n    )\n  export type CodeSecurityConfigurationForRepository = z.infer<\n    typeof CodeSecurityConfigurationForRepositorySchema\n  >\n\n  export const RepositoryCollaboratorPermissionSchema = z\n    .object({\n      permission: z.string(),\n      role_name: z.string(),\n      user: NullableCollaboratorSchema\n    })\n    .describe('Repository Collaborator Permission')\n  export type RepositoryCollaboratorPermission = z.infer<\n    typeof RepositoryCollaboratorPermissionSchema\n  >\n\n  export const AutoMergeSchema = z\n    .object({\n      enabled_by: SimpleUserSchema,\n      merge_method: z\n        .enum(['merge', 'squash', 'rebase'])\n        .describe('The merge method to use.'),\n      commit_title: z.string().describe('Title for the merge commit message.'),\n      commit_message: z\n        .string()\n        .describe('Commit message for the merge commit.')\n    })\n    .describe('The status of auto merging a pull request.')\n  export type AutoMerge = z.infer<typeof AutoMergeSchema>\n\n  export const DependabotAlertNumberSchema = z\n    .any()\n    .describe(\n      'The number that identifies a Dependabot alert in its repository.\\nYou can find this at the end of the URL for a Dependabot alert within GitHub,\\nor in `number` fields in the response from the\\n`GET /repos/{owner}/{repo}/dependabot/alerts` operation.'\n    )\n  export type DependabotAlertNumber = z.infer<\n    typeof DependabotAlertNumberSchema\n  >\n\n  export const DependencySchema = z\n    .object({\n      package_url: z\n        .string()\n        .regex(new RegExp('^pkg'))\n        .describe(\n          'Package-url (PURL) of dependency. See https://github.com/package-url/purl-spec for more details.'\n        )\n        .optional(),\n      metadata: MetadataSchema.optional(),\n      relationship: z\n        .enum(['direct', 'indirect'])\n        .describe(\n          'A notation of whether a dependency is requested directly by this manifest or is a dependency of another dependency.'\n        )\n        .optional(),\n      scope: z\n        .enum(['runtime', 'development'])\n        .describe(\n          'A notation of whether the dependency is required for the primary build artifact (runtime) or is only used for development. Future versions of this specification may allow for more granular scopes.'\n        )\n        .optional(),\n      dependencies: z\n        .array(z.string())\n        .describe('Array of package-url (PURLs) of direct child dependencies.')\n        .optional()\n    })\n    .strict()\n  export type Dependency = z.infer<typeof DependencySchema>\n\n  export const DeploymentProtectionRuleSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('The unique identifier for the deployment protection rule.'),\n      node_id: z\n        .string()\n        .describe('The node ID for the deployment protection rule.'),\n      enabled: z\n        .boolean()\n        .describe(\n          'Whether the deployment protection rule is enabled for the environment.'\n        ),\n      app: CustomDeploymentRuleAppSchema\n    })\n    .describe('Deployment protection rule')\n  export type DeploymentProtectionRule = z.infer<\n    typeof DeploymentProtectionRuleSchema\n  >\n\n  export const GitTagSchema = z\n    .object({\n      node_id: z.string(),\n      tag: z.string().describe('Name of the tag'),\n      sha: z.string(),\n      url: z.string().url().describe('URL for the tag'),\n      message: z.string().describe('Message describing the purpose of the tag'),\n      tagger: z.object({\n        date: z.string(),\n        email: z.string(),\n        name: z.string()\n      }),\n      object: z.object({\n        sha: z.string(),\n        type: z.string(),\n        url: z.string().url()\n      }),\n      verification: VerificationSchema.optional()\n    })\n    .describe('Metadata for a Git tag')\n  export type GitTag = z.infer<typeof GitTagSchema>\n\n  export const LicenseContentSchema = z\n    .object({\n      name: z.string(),\n      path: z.string(),\n      sha: z.string(),\n      size: z.number().int(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      git_url: z.string().url(),\n      download_url: z.string().url(),\n      type: z.string(),\n      content: z.string(),\n      encoding: z.string(),\n      _links: z.object({\n        git: z.string().url(),\n        html: z.string().url(),\n        self: z.string().url()\n      }),\n      license: NullableLicenseSimpleSchema\n    })\n    .describe('License Content')\n  export type LicenseContent = z.infer<typeof LicenseContentSchema>\n\n  export const MilestoneSchema = z\n    .object({\n      url: z.string().url(),\n      html_url: z.string().url(),\n      labels_url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      number: z.number().int().describe('The number of the milestone.'),\n      state: z\n        .enum(['open', 'closed'])\n        .describe('The state of the milestone.')\n        .default('open'),\n      title: z.string().describe('The title of the milestone.'),\n      description: z.string(),\n      creator: NullableSimpleUserSchema,\n      open_issues: z.number().int(),\n      closed_issues: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      closed_at: z.string().datetime({ offset: true }),\n      due_on: z.string().datetime({ offset: true })\n    })\n    .describe('A collection of related issues and pull requests.')\n  export type Milestone = z.infer<typeof MilestoneSchema>\n\n  export const PageBuildSchema = z\n    .object({\n      url: z.string().url(),\n      status: z.string(),\n      error: z.object({ message: z.string() }),\n      pusher: NullableSimpleUserSchema,\n      commit: z.string(),\n      duration: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('Page Build')\n  export type PageBuild = z.infer<typeof PageBuildSchema>\n\n  export const ReleaseAssetSchema = z\n    .object({\n      url: z.string().url(),\n      browser_download_url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string().describe('The file name of the asset.'),\n      label: z.string(),\n      state: z\n        .enum(['uploaded', 'open'])\n        .describe('State of the release asset.'),\n      content_type: z.string(),\n      size: z.number().int(),\n      download_count: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      uploader: NullableSimpleUserSchema\n    })\n    .describe('Data related to a release.')\n  export type ReleaseAsset = z.infer<typeof ReleaseAssetSchema>\n\n  export const SecretScanningPushProtectionBypassSchema = z.object({\n    reason: SecretScanningPushProtectionBypassReasonSchema.optional(),\n    expire_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The time that the bypass will expire in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    token_type: z\n      .string()\n      .describe('The token type this bypass is for.')\n      .optional()\n  })\n  export type SecretScanningPushProtectionBypass = z.infer<\n    typeof SecretScanningPushProtectionBypassSchema\n  >\n\n  export const SecretScanningScanHistorySchema = z.object({\n    incremental_scans: z.array(SecretScanningScanSchema).optional(),\n    pattern_update_scans: z.array(SecretScanningScanSchema).optional(),\n    backfill_scans: z.array(SecretScanningScanSchema).optional(),\n    custom_pattern_backfill_scans: z\n      .array(\n        z.intersection(\n          SecretScanningScanSchema,\n          z.object({\n            pattern_name: z\n              .string()\n              .describe('Name of the custom pattern for custom pattern scans')\n              .optional(),\n            pattern_scope: z\n              .string()\n              .describe(\n                'Level at which the custom pattern is defined, one of \"repository\", \"organization\", or \"enterprise\"'\n              )\n              .optional()\n          })\n        )\n      )\n      .optional()\n  })\n  export type SecretScanningScanHistory = z.infer<\n    typeof SecretScanningScanHistorySchema\n  >\n\n  export const PrivateVulnerabilityReportCreateSchema = z\n    .object({\n      summary: z\n        .string()\n        .max(1024)\n        .describe('A short summary of the advisory.'),\n      description: z\n        .string()\n        .max(65_535)\n        .describe('A detailed description of what the advisory impacts.'),\n      vulnerabilities: z\n        .array(\n          z\n            .object({\n              package: z\n                .object({\n                  ecosystem: SecurityAdvisoryEcosystemsSchema,\n                  name: z\n                    .string()\n                    .describe('The unique package name within its ecosystem.')\n                    .optional()\n                })\n                .describe(\n                  'The name of the package affected by the vulnerability.'\n                ),\n              vulnerable_version_range: z\n                .string()\n                .describe(\n                  'The range of the package versions affected by the vulnerability.'\n                )\n                .optional(),\n              patched_versions: z\n                .string()\n                .describe(\n                  'The package version(s) that resolve the vulnerability.'\n                )\n                .optional(),\n              vulnerable_functions: z\n                .array(z.string())\n                .describe('The functions in the package that are affected.')\n                .optional()\n            })\n            .strict()\n        )\n        .describe(\n          'An array of products affected by the vulnerability detailed in a repository security advisory.'\n        )\n        .optional(),\n      cwe_ids: z\n        .array(z.string())\n        .describe('A list of Common Weakness Enumeration (CWE) IDs.')\n        .optional(),\n      severity: z\n        .enum(['critical', 'high', 'medium', 'low'])\n        .describe(\n          'The severity of the advisory. You must choose between setting this field or `cvss_vector_string`.'\n        )\n        .optional(),\n      cvss_vector_string: z\n        .string()\n        .describe(\n          'The CVSS vector that calculates the severity of the advisory. You must choose between setting this field or `severity`.'\n        )\n        .optional(),\n      start_private_fork: z\n        .boolean()\n        .describe(\n          'Whether to create a temporary private fork of the repository to collaborate on a fix.'\n        )\n        .default(false)\n    })\n    .strict()\n  export type PrivateVulnerabilityReportCreate = z.infer<\n    typeof PrivateVulnerabilityReportCreateSchema\n  >\n\n  export const StargazerSchema = z\n    .object({\n      starred_at: z.string().datetime({ offset: true }),\n      user: NullableSimpleUserSchema\n    })\n    .describe('Stargazer')\n  export type Stargazer = z.infer<typeof StargazerSchema>\n\n  export const ContributorActivitySchema = z\n    .object({\n      author: NullableSimpleUserSchema,\n      total: z.number().int(),\n      weeks: z.array(\n        z.object({\n          w: z.number().int().optional(),\n          a: z.number().int().optional(),\n          d: z.number().int().optional(),\n          c: z.number().int().optional()\n        })\n      )\n    })\n    .describe('Contributor Activity')\n  export type ContributorActivity = z.infer<typeof ContributorActivitySchema>\n\n  export const CloneTrafficSchema = z\n    .object({\n      count: z.number().int(),\n      uniques: z.number().int(),\n      clones: z.array(TrafficSchema)\n    })\n    .describe('Clone Traffic')\n  export type CloneTraffic = z.infer<typeof CloneTrafficSchema>\n\n  export const ViewTrafficSchema = z\n    .object({\n      count: z.number().int(),\n      uniques: z.number().int(),\n      views: z.array(TrafficSchema)\n    })\n    .describe('View Traffic')\n  export type ViewTraffic = z.infer<typeof ViewTrafficSchema>\n\n  export const LabelSearchResultItemSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url(),\n      name: z.string(),\n      color: z.string(),\n      default: z.boolean(),\n      description: z.string(),\n      score: z.number(),\n      text_matches: SearchResultTextMatchesSchema.optional()\n    })\n    .describe('Label Search Result Item')\n  export type LabelSearchResultItem = z.infer<\n    typeof LabelSearchResultItemSchema\n  >\n\n  export const TopicSearchResultItemSchema = z\n    .object({\n      name: z.string(),\n      display_name: z.string(),\n      short_description: z.string(),\n      description: z.string(),\n      created_by: z.string(),\n      released: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      featured: z.boolean(),\n      curated: z.boolean(),\n      score: z.number(),\n      repository_count: z.number().int().optional(),\n      logo_url: z.string().url().optional(),\n      text_matches: SearchResultTextMatchesSchema.optional(),\n      related: z\n        .array(\n          z.object({\n            topic_relation: z\n              .object({\n                id: z.number().int().optional(),\n                name: z.string().optional(),\n                topic_id: z.number().int().optional(),\n                relation_type: z.string().optional()\n              })\n              .optional()\n          })\n        )\n        .optional(),\n      aliases: z\n        .array(\n          z.object({\n            topic_relation: z\n              .object({\n                id: z.number().int().optional(),\n                name: z.string().optional(),\n                topic_id: z.number().int().optional(),\n                relation_type: z.string().optional()\n              })\n              .optional()\n          })\n        )\n        .optional()\n    })\n    .describe('Topic Search Result Item')\n  export type TopicSearchResultItem = z.infer<\n    typeof TopicSearchResultItemSchema\n  >\n\n  export const UserSearchResultItemSchema = z\n    .object({\n      login: z.string(),\n      id: z.number().int(),\n      node_id: z.string(),\n      avatar_url: z.string().url(),\n      gravatar_id: z.string(),\n      url: z.string().url(),\n      html_url: z.string().url(),\n      followers_url: z.string().url(),\n      subscriptions_url: z.string().url(),\n      organizations_url: z.string().url(),\n      repos_url: z.string().url(),\n      received_events_url: z.string().url(),\n      type: z.string(),\n      score: z.number(),\n      following_url: z.string(),\n      gists_url: z.string(),\n      starred_url: z.string(),\n      events_url: z.string(),\n      public_repos: z.number().int().optional(),\n      public_gists: z.number().int().optional(),\n      followers: z.number().int().optional(),\n      following: z.number().int().optional(),\n      created_at: z.string().datetime({ offset: true }).optional(),\n      updated_at: z.string().datetime({ offset: true }).optional(),\n      name: z.string().optional(),\n      bio: z.string().optional(),\n      email: z.string().email().optional(),\n      location: z.string().optional(),\n      site_admin: z.boolean(),\n      hireable: z.boolean().optional(),\n      text_matches: SearchResultTextMatchesSchema.optional(),\n      blog: z.string().optional(),\n      company: z.string().optional(),\n      suspended_at: z.string().datetime({ offset: true }).optional(),\n      user_view_type: z.string().optional()\n    })\n    .describe('User Search Result Item')\n  export type UserSearchResultItem = z.infer<typeof UserSearchResultItemSchema>\n\n  export const IntegrationSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the GitHub app'),\n      slug: z.string().describe('The slug name of the GitHub app').optional(),\n      node_id: z.string(),\n      client_id: z.string().optional(),\n      owner: z.union([SimpleUserSchema, EnterpriseSchema]),\n      name: z.string().describe('The name of the GitHub app'),\n      description: z.string(),\n      external_url: z.string().url(),\n      html_url: z.string().url(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      permissions: z\n        .object({\n          issues: z.string().optional(),\n          checks: z.string().optional(),\n          metadata: z.string().optional(),\n          contents: z.string().optional(),\n          deployments: z.string().optional()\n        })\n        .catchall(z.string())\n        .describe('The set of permissions for the GitHub app'),\n      events: z\n        .array(z.string())\n        .describe('The list of events for the GitHub app'),\n      installations_count: z\n        .number()\n        .int()\n        .describe('The number of installations associated with the GitHub app')\n        .optional(),\n      client_secret: z.string().optional(),\n      webhook_secret: z.string().optional(),\n      pem: z.string().optional()\n    })\n    .describe(\n      'GitHub apps are a new way to extend GitHub. They can be installed directly on organizations and user accounts and granted access to specific repositories. They come with granular permissions and built-in webhooks. GitHub apps are first class actors within GitHub.'\n    )\n  export type Integration = z.infer<typeof IntegrationSchema>\n\n  export const IntegrationInstallationRequestSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the request installation.'),\n      node_id: z.string().optional(),\n      account: z.union([SimpleUserSchema, EnterpriseSchema]),\n      requester: SimpleUserSchema,\n      created_at: z.string().datetime({ offset: true })\n    })\n    .describe('Request to install an integration on a target')\n  export type IntegrationInstallationRequest = z.infer<\n    typeof IntegrationInstallationRequestSchema\n  >\n\n  export const RepositorySchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the repository'),\n      node_id: z.string(),\n      name: z.string().describe('The name of the repository.'),\n      full_name: z.string(),\n      license: NullableLicenseSimpleSchema,\n      forks: z.number().int(),\n      permissions: z\n        .object({\n          admin: z.boolean(),\n          pull: z.boolean(),\n          triage: z.boolean().optional(),\n          push: z.boolean(),\n          maintain: z.boolean().optional()\n        })\n        .optional(),\n      owner: SimpleUserSchema,\n      private: z\n        .boolean()\n        .describe('Whether the repository is private or public.')\n        .default(false),\n      html_url: z.string().url(),\n      description: z.string(),\n      fork: z.boolean(),\n      url: z.string().url(),\n      archive_url: z.string(),\n      assignees_url: z.string(),\n      blobs_url: z.string(),\n      branches_url: z.string(),\n      collaborators_url: z.string(),\n      comments_url: z.string(),\n      commits_url: z.string(),\n      compare_url: z.string(),\n      contents_url: z.string(),\n      contributors_url: z.string().url(),\n      deployments_url: z.string().url(),\n      downloads_url: z.string().url(),\n      events_url: z.string().url(),\n      forks_url: z.string().url(),\n      git_commits_url: z.string(),\n      git_refs_url: z.string(),\n      git_tags_url: z.string(),\n      git_url: z.string(),\n      issue_comment_url: z.string(),\n      issue_events_url: z.string(),\n      issues_url: z.string(),\n      keys_url: z.string(),\n      labels_url: z.string(),\n      languages_url: z.string().url(),\n      merges_url: z.string().url(),\n      milestones_url: z.string(),\n      notifications_url: z.string(),\n      pulls_url: z.string(),\n      releases_url: z.string(),\n      ssh_url: z.string(),\n      stargazers_url: z.string().url(),\n      statuses_url: z.string(),\n      subscribers_url: z.string().url(),\n      subscription_url: z.string().url(),\n      tags_url: z.string().url(),\n      teams_url: z.string().url(),\n      trees_url: z.string(),\n      clone_url: z.string(),\n      mirror_url: z.string().url(),\n      hooks_url: z.string().url(),\n      svn_url: z.string().url(),\n      homepage: z.string().url(),\n      language: z.string(),\n      forks_count: z.number().int(),\n      stargazers_count: z.number().int(),\n      watchers_count: z.number().int(),\n      size: z\n        .number()\n        .int()\n        .describe(\n          'The size of the repository, in kilobytes. Size is calculated hourly. When a repository is initially created, the size is 0.'\n        ),\n      default_branch: z\n        .string()\n        .describe('The default branch of the repository.'),\n      open_issues_count: z.number().int(),\n      is_template: z\n        .boolean()\n        .describe(\n          'Whether this repository acts as a template that can be used to generate new repositories.'\n        )\n        .default(false),\n      topics: z.array(z.string()).optional(),\n      has_issues: z\n        .boolean()\n        .describe('Whether issues are enabled.')\n        .default(true),\n      has_projects: z\n        .boolean()\n        .describe('Whether projects are enabled.')\n        .default(true),\n      has_wiki: z\n        .boolean()\n        .describe('Whether the wiki is enabled.')\n        .default(true),\n      has_pages: z.boolean(),\n      has_downloads: z\n        .boolean()\n        .describe('Whether downloads are enabled.')\n        .default(true),\n      has_discussions: z\n        .boolean()\n        .describe('Whether discussions are enabled.')\n        .default(false),\n      archived: z\n        .boolean()\n        .describe('Whether the repository is archived.')\n        .default(false),\n      disabled: z\n        .boolean()\n        .describe('Returns whether or not this repository disabled.'),\n      visibility: z\n        .string()\n        .describe('The repository visibility: public, private, or internal.')\n        .default('public'),\n      pushed_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      allow_rebase_merge: z\n        .boolean()\n        .describe('Whether to allow rebase merges for pull requests.')\n        .default(true),\n      temp_clone_token: z.string().optional(),\n      allow_squash_merge: z\n        .boolean()\n        .describe('Whether to allow squash merges for pull requests.')\n        .default(true),\n      allow_auto_merge: z\n        .boolean()\n        .describe('Whether to allow Auto-merge to be used on pull requests.')\n        .default(false),\n      delete_branch_on_merge: z\n        .boolean()\n        .describe(\n          'Whether to delete head branches when pull requests are merged'\n        )\n        .default(false),\n      allow_update_branch: z\n        .boolean()\n        .describe(\n          'Whether or not a pull request head branch that is behind its base branch can always be updated even if it is not required to be up to date before merging.'\n        )\n        .default(false),\n      use_squash_pr_title_as_default: z\n        .boolean()\n        .describe(\n          'Whether a squash merge commit can use the pull request title as default. **This property is closing down. Please use `squash_merge_commit_title` instead.'\n        )\n        .default(false),\n      squash_merge_commit_title: z\n        .enum(['PR_TITLE', 'COMMIT_OR_PR_TITLE'])\n        .describe(\n          \"The default value for a squash merge commit title:\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).\"\n        )\n        .optional(),\n      squash_merge_commit_message: z\n        .enum(['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'])\n        .describe(\n          \"The default value for a squash merge commit message:\\n\\n- `PR_BODY` - default to the pull request's body.\\n- `COMMIT_MESSAGES` - default to the branch's commit messages.\\n- `BLANK` - default to a blank commit message.\"\n        )\n        .optional(),\n      merge_commit_title: z\n        .enum(['PR_TITLE', 'MERGE_MESSAGE'])\n        .describe(\n          \"The default value for a merge commit title.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).\"\n        )\n        .optional(),\n      merge_commit_message: z\n        .enum(['PR_BODY', 'PR_TITLE', 'BLANK'])\n        .describe(\n          \"The default value for a merge commit message.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `PR_BODY` - default to the pull request's body.\\n- `BLANK` - default to a blank commit message.\"\n        )\n        .optional(),\n      allow_merge_commit: z\n        .boolean()\n        .describe('Whether to allow merge commits for pull requests.')\n        .default(true),\n      allow_forking: z\n        .boolean()\n        .describe('Whether to allow forking this repo')\n        .optional(),\n      web_commit_signoff_required: z\n        .boolean()\n        .describe(\n          'Whether to require contributors to sign off on web-based commits'\n        )\n        .default(false),\n      open_issues: z.number().int(),\n      watchers: z.number().int(),\n      master_branch: z.string().optional(),\n      starred_at: z.string().optional(),\n      anonymous_access_enabled: z\n        .boolean()\n        .describe('Whether anonymous git access is enabled for this repository')\n        .optional()\n    })\n    .describe('A repository on GitHub.')\n  export type Repository = z.infer<typeof RepositorySchema>\n\n  export const NullableScopedInstallationSchema = z.object({\n    permissions: AppPermissionsSchema,\n    repository_selection: z\n      .enum(['all', 'selected'])\n      .describe(\n        \"Describe whether all repositories have been selected or there's a selection involved\"\n      ),\n    single_file_name: z.string(),\n    has_multiple_single_files: z.boolean().optional(),\n    single_file_paths: z.array(z.string()).optional(),\n    repositories_url: z.string().url(),\n    account: SimpleUserSchema\n  })\n  export type NullableScopedInstallation = z.infer<\n    typeof NullableScopedInstallationSchema\n  >\n\n  export const CodeSecurityConfigurationRepositoriesSchema = z\n    .object({\n      status: z\n        .enum([\n          'attached',\n          'attaching',\n          'detached',\n          'removed',\n          'enforced',\n          'failed',\n          'updating',\n          'removed_by_enterprise'\n        ])\n        .describe(\n          'The attachment status of the code security configuration on the repository.'\n        )\n        .optional(),\n      repository: SimpleRepositorySchema.optional()\n    })\n    .describe(\n      'Repositories associated with a code security configuration and attachment status'\n    )\n  export type CodeSecurityConfigurationRepositories = z.infer<\n    typeof CodeSecurityConfigurationRepositoriesSchema\n  >\n\n  export const NullableIntegrationSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the GitHub app'),\n      slug: z.string().describe('The slug name of the GitHub app').optional(),\n      node_id: z.string(),\n      client_id: z.string().optional(),\n      owner: z.union([SimpleUserSchema, EnterpriseSchema]),\n      name: z.string().describe('The name of the GitHub app'),\n      description: z.string(),\n      external_url: z.string().url(),\n      html_url: z.string().url(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      permissions: z\n        .object({\n          issues: z.string().optional(),\n          checks: z.string().optional(),\n          metadata: z.string().optional(),\n          contents: z.string().optional(),\n          deployments: z.string().optional()\n        })\n        .catchall(z.string())\n        .describe('The set of permissions for the GitHub app'),\n      events: z\n        .array(z.string())\n        .describe('The list of events for the GitHub app'),\n      installations_count: z\n        .number()\n        .int()\n        .describe('The number of installations associated with the GitHub app')\n        .optional(),\n      client_secret: z.string().optional(),\n      webhook_secret: z.string().optional(),\n      pem: z.string().optional()\n    })\n    .describe(\n      'GitHub apps are a new way to extend GitHub. They can be installed directly on organizations and user accounts and granted access to specific repositories. They come with granular permissions and built-in webhooks. GitHub apps are first class actors within GitHub.'\n    )\n  export type NullableIntegration = z.infer<typeof NullableIntegrationSchema>\n\n  export const BaseGistSchema = z\n    .object({\n      url: z.string().url(),\n      forks_url: z.string().url(),\n      commits_url: z.string().url(),\n      id: z.string(),\n      node_id: z.string(),\n      git_pull_url: z.string().url(),\n      git_push_url: z.string().url(),\n      html_url: z.string().url(),\n      files: z.record(\n        z.object({\n          filename: z.string().optional(),\n          type: z.string().optional(),\n          language: z.string().optional(),\n          raw_url: z.string().optional(),\n          size: z.number().int().optional(),\n          encoding: z\n            .string()\n            .describe(\n              'The encoding used for `content`. Currently, `\"utf-8\"` and `\"base64\"` are supported.'\n            )\n            .default('utf-8')\n        })\n      ),\n      public: z.boolean(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      description: z.string(),\n      comments: z.number().int(),\n      comments_enabled: z.boolean().optional(),\n      user: NullableSimpleUserSchema,\n      comments_url: z.string().url(),\n      owner: SimpleUserSchema.optional(),\n      truncated: z.boolean().optional(),\n      forks: z.array(z.any()).optional(),\n      history: z.array(z.any()).optional()\n    })\n    .describe('Base Gist')\n  export type BaseGist = z.infer<typeof BaseGistSchema>\n\n  export const GistCommentSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url(),\n      body: z.string().max(65_535).describe('The comment text.'),\n      user: NullableSimpleUserSchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      author_association: AuthorAssociationSchema\n    })\n    .describe('A comment made to a gist.')\n  export type GistComment = z.infer<typeof GistCommentSchema>\n\n  export const BillingUsageReportOrgSchema = z\n    .any()\n    .describe('Billing usage report response for an organization')\n  export type BillingUsageReportOrg = z.infer<\n    typeof BillingUsageReportOrgSchema\n  >\n\n  export const ActionsGetDefaultWorkflowPermissionsSchema = z.object({\n    default_workflow_permissions: ActionsDefaultWorkflowPermissionsSchema,\n    can_approve_pull_request_reviews: ActionsCanApprovePullRequestReviewsSchema\n  })\n  export type ActionsGetDefaultWorkflowPermissions = z.infer<\n    typeof ActionsGetDefaultWorkflowPermissionsSchema\n  >\n\n  export const ActionsSetDefaultWorkflowPermissionsSchema = z.object({\n    default_workflow_permissions:\n      ActionsDefaultWorkflowPermissionsSchema.optional(),\n    can_approve_pull_request_reviews:\n      ActionsCanApprovePullRequestReviewsSchema.optional()\n  })\n  export type ActionsSetDefaultWorkflowPermissions = z.infer<\n    typeof ActionsSetDefaultWorkflowPermissionsSchema\n  >\n\n  export const ActionsRunnerLabelsSchema = z.any().describe('Response')\n  export type ActionsRunnerLabels = z.infer<typeof ActionsRunnerLabelsSchema>\n\n  export const ActionsRunnerLabelsReadonlySchema = z.any().describe('Response')\n  export type ActionsRunnerLabelsReadonly = z.infer<\n    typeof ActionsRunnerLabelsReadonlySchema\n  >\n\n  export const InteractionLimitSchema = z\n    .object({\n      limit: InteractionGroupSchema,\n      expiry: InteractionExpirySchema.optional()\n    })\n    .describe(\n      'Limit interactions to a specific type of user for a specified duration'\n    )\n  export type InteractionLimit = z.infer<typeof InteractionLimitSchema>\n\n  export const OrgMembershipSchema = z\n    .object({\n      url: z.string().url(),\n      state: z\n        .enum(['active', 'pending'])\n        .describe(\n          'The state of the member in the organization. The `pending` state indicates the user has not yet accepted an invitation.'\n        ),\n      role: z\n        .enum(['admin', 'member', 'billing_manager'])\n        .describe(\"The user's membership type in the organization.\"),\n      organization_url: z.string().url(),\n      organization: OrganizationSimpleSchema,\n      user: NullableSimpleUserSchema,\n      permissions: z.object({ can_create_repository: z.boolean() }).optional()\n    })\n    .describe('Org Membership')\n  export type OrgMembership = z.infer<typeof OrgMembershipSchema>\n\n  export const NullableRepositorySchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the repository'),\n      node_id: z.string(),\n      name: z.string().describe('The name of the repository.'),\n      full_name: z.string(),\n      license: NullableLicenseSimpleSchema,\n      forks: z.number().int(),\n      permissions: z\n        .object({\n          admin: z.boolean(),\n          pull: z.boolean(),\n          triage: z.boolean().optional(),\n          push: z.boolean(),\n          maintain: z.boolean().optional()\n        })\n        .optional(),\n      owner: SimpleUserSchema,\n      private: z\n        .boolean()\n        .describe('Whether the repository is private or public.')\n        .default(false),\n      html_url: z.string().url(),\n      description: z.string(),\n      fork: z.boolean(),\n      url: z.string().url(),\n      archive_url: z.string(),\n      assignees_url: z.string(),\n      blobs_url: z.string(),\n      branches_url: z.string(),\n      collaborators_url: z.string(),\n      comments_url: z.string(),\n      commits_url: z.string(),\n      compare_url: z.string(),\n      contents_url: z.string(),\n      contributors_url: z.string().url(),\n      deployments_url: z.string().url(),\n      downloads_url: z.string().url(),\n      events_url: z.string().url(),\n      forks_url: z.string().url(),\n      git_commits_url: z.string(),\n      git_refs_url: z.string(),\n      git_tags_url: z.string(),\n      git_url: z.string(),\n      issue_comment_url: z.string(),\n      issue_events_url: z.string(),\n      issues_url: z.string(),\n      keys_url: z.string(),\n      labels_url: z.string(),\n      languages_url: z.string().url(),\n      merges_url: z.string().url(),\n      milestones_url: z.string(),\n      notifications_url: z.string(),\n      pulls_url: z.string(),\n      releases_url: z.string(),\n      ssh_url: z.string(),\n      stargazers_url: z.string().url(),\n      statuses_url: z.string(),\n      subscribers_url: z.string().url(),\n      subscription_url: z.string().url(),\n      tags_url: z.string().url(),\n      teams_url: z.string().url(),\n      trees_url: z.string(),\n      clone_url: z.string(),\n      mirror_url: z.string().url(),\n      hooks_url: z.string().url(),\n      svn_url: z.string().url(),\n      homepage: z.string().url(),\n      language: z.string(),\n      forks_count: z.number().int(),\n      stargazers_count: z.number().int(),\n      watchers_count: z.number().int(),\n      size: z\n        .number()\n        .int()\n        .describe(\n          'The size of the repository, in kilobytes. Size is calculated hourly. When a repository is initially created, the size is 0.'\n        ),\n      default_branch: z\n        .string()\n        .describe('The default branch of the repository.'),\n      open_issues_count: z.number().int(),\n      is_template: z\n        .boolean()\n        .describe(\n          'Whether this repository acts as a template that can be used to generate new repositories.'\n        )\n        .default(false),\n      topics: z.array(z.string()).optional(),\n      has_issues: z\n        .boolean()\n        .describe('Whether issues are enabled.')\n        .default(true),\n      has_projects: z\n        .boolean()\n        .describe('Whether projects are enabled.')\n        .default(true),\n      has_wiki: z\n        .boolean()\n        .describe('Whether the wiki is enabled.')\n        .default(true),\n      has_pages: z.boolean(),\n      has_downloads: z\n        .boolean()\n        .describe('Whether downloads are enabled.')\n        .default(true),\n      has_discussions: z\n        .boolean()\n        .describe('Whether discussions are enabled.')\n        .default(false),\n      archived: z\n        .boolean()\n        .describe('Whether the repository is archived.')\n        .default(false),\n      disabled: z\n        .boolean()\n        .describe('Returns whether or not this repository disabled.'),\n      visibility: z\n        .string()\n        .describe('The repository visibility: public, private, or internal.')\n        .default('public'),\n      pushed_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      allow_rebase_merge: z\n        .boolean()\n        .describe('Whether to allow rebase merges for pull requests.')\n        .default(true),\n      temp_clone_token: z.string().optional(),\n      allow_squash_merge: z\n        .boolean()\n        .describe('Whether to allow squash merges for pull requests.')\n        .default(true),\n      allow_auto_merge: z\n        .boolean()\n        .describe('Whether to allow Auto-merge to be used on pull requests.')\n        .default(false),\n      delete_branch_on_merge: z\n        .boolean()\n        .describe(\n          'Whether to delete head branches when pull requests are merged'\n        )\n        .default(false),\n      allow_update_branch: z\n        .boolean()\n        .describe(\n          'Whether or not a pull request head branch that is behind its base branch can always be updated even if it is not required to be up to date before merging.'\n        )\n        .default(false),\n      use_squash_pr_title_as_default: z\n        .boolean()\n        .describe(\n          'Whether a squash merge commit can use the pull request title as default. **This property is closing down. Please use `squash_merge_commit_title` instead.'\n        )\n        .default(false),\n      squash_merge_commit_title: z\n        .enum(['PR_TITLE', 'COMMIT_OR_PR_TITLE'])\n        .describe(\n          \"The default value for a squash merge commit title:\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).\"\n        )\n        .optional(),\n      squash_merge_commit_message: z\n        .enum(['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'])\n        .describe(\n          \"The default value for a squash merge commit message:\\n\\n- `PR_BODY` - default to the pull request's body.\\n- `COMMIT_MESSAGES` - default to the branch's commit messages.\\n- `BLANK` - default to a blank commit message.\"\n        )\n        .optional(),\n      merge_commit_title: z\n        .enum(['PR_TITLE', 'MERGE_MESSAGE'])\n        .describe(\n          \"The default value for a merge commit title.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).\"\n        )\n        .optional(),\n      merge_commit_message: z\n        .enum(['PR_BODY', 'PR_TITLE', 'BLANK'])\n        .describe(\n          \"The default value for a merge commit message.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `PR_BODY` - default to the pull request's body.\\n- `BLANK` - default to a blank commit message.\"\n        )\n        .optional(),\n      allow_merge_commit: z\n        .boolean()\n        .describe('Whether to allow merge commits for pull requests.')\n        .default(true),\n      allow_forking: z\n        .boolean()\n        .describe('Whether to allow forking this repo')\n        .optional(),\n      web_commit_signoff_required: z\n        .boolean()\n        .describe(\n          'Whether to require contributors to sign off on web-based commits'\n        )\n        .default(false),\n      open_issues: z.number().int(),\n      watchers: z.number().int(),\n      master_branch: z.string().optional(),\n      starred_at: z.string().optional(),\n      anonymous_access_enabled: z\n        .boolean()\n        .describe('Whether anonymous git access is enabled for this repository')\n        .optional()\n    })\n    .describe('A repository on GitHub.')\n  export type NullableRepository = z.infer<typeof NullableRepositorySchema>\n\n  export const RepositoryAdvisoryCreditSchema = z\n    .object({\n      user: SimpleUserSchema,\n      type: SecurityAdvisoryCreditTypesSchema,\n      state: z\n        .enum(['accepted', 'declined', 'pending'])\n        .describe(\"The state of the user's acceptance of the credit.\")\n    })\n    .strict()\n    .describe('A credit given to a user for a repository security advisory.')\n  export type RepositoryAdvisoryCredit = z.infer<\n    typeof RepositoryAdvisoryCreditSchema\n  >\n\n  export const TeamFullSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the team'),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the team'),\n      html_url: z.string().url(),\n      name: z.string().describe('Name of the team'),\n      slug: z.string(),\n      description: z.string(),\n      privacy: z\n        .enum(['closed', 'secret'])\n        .describe('The level of privacy this team should have')\n        .optional(),\n      notification_setting: z\n        .enum(['notifications_enabled', 'notifications_disabled'])\n        .describe('The notification setting the team has set')\n        .optional(),\n      permission: z\n        .string()\n        .describe('Permission that the team will have for its repositories'),\n      members_url: z.string(),\n      repositories_url: z.string().url(),\n      parent: NullableTeamSimpleSchema.optional(),\n      members_count: z.number().int(),\n      repos_count: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      organization: TeamOrganizationSchema,\n      ldap_dn: z\n        .string()\n        .describe(\n          'Distinguished Name (DN) that team maps to within LDAP environment'\n        )\n        .optional()\n    })\n    .describe(\n      'Groups of organization members that gives permissions on specified repositories.'\n    )\n  export type TeamFull = z.infer<typeof TeamFullSchema>\n\n  export const TeamDiscussionSchema = z\n    .object({\n      author: NullableSimpleUserSchema,\n      body: z.string().describe('The main text of the discussion.'),\n      body_html: z.string(),\n      body_version: z\n        .string()\n        .describe(\n          'The current version of the body content. If provided, this update operation will be rejected if the given version does not match the latest version on the server.'\n        ),\n      comments_count: z.number().int(),\n      comments_url: z.string().url(),\n      created_at: z.string().datetime({ offset: true }),\n      last_edited_at: z.string().datetime({ offset: true }),\n      html_url: z.string().url(),\n      node_id: z.string(),\n      number: z\n        .number()\n        .int()\n        .describe('The unique sequence number of a team discussion.'),\n      pinned: z\n        .boolean()\n        .describe(\n          'Whether or not this discussion should be pinned for easy retrieval.'\n        ),\n      private: z\n        .boolean()\n        .describe(\n          'Whether or not this discussion should be restricted to team members and organization owners.'\n        ),\n      team_url: z.string().url(),\n      title: z.string().describe('The title of the discussion.'),\n      updated_at: z.string().datetime({ offset: true }),\n      url: z.string().url(),\n      reactions: ReactionRollupSchema.optional()\n    })\n    .describe(\n      'A team discussion is a persistent record of a free-form conversation within a team.'\n    )\n  export type TeamDiscussion = z.infer<typeof TeamDiscussionSchema>\n\n  export const TeamDiscussionCommentSchema = z\n    .object({\n      author: NullableSimpleUserSchema,\n      body: z.string().describe('The main text of the comment.'),\n      body_html: z.string(),\n      body_version: z\n        .string()\n        .describe(\n          'The current version of the body content. If provided, this update operation will be rejected if the given version does not match the latest version on the server.'\n        ),\n      created_at: z.string().datetime({ offset: true }),\n      last_edited_at: z.string().datetime({ offset: true }),\n      discussion_url: z.string().url(),\n      html_url: z.string().url(),\n      node_id: z.string(),\n      number: z\n        .number()\n        .int()\n        .describe('The unique sequence number of a team discussion comment.'),\n      updated_at: z.string().datetime({ offset: true }),\n      url: z.string().url(),\n      reactions: ReactionRollupSchema.optional()\n    })\n    .describe('A reply to a discussion within a team.')\n  export type TeamDiscussionComment = z.infer<\n    typeof TeamDiscussionCommentSchema\n  >\n\n  export const TeamRepositorySchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the repository'),\n      node_id: z.string(),\n      name: z.string().describe('The name of the repository.'),\n      full_name: z.string(),\n      license: NullableLicenseSimpleSchema,\n      forks: z.number().int(),\n      permissions: z\n        .object({\n          admin: z.boolean(),\n          pull: z.boolean(),\n          triage: z.boolean().optional(),\n          push: z.boolean(),\n          maintain: z.boolean().optional()\n        })\n        .optional(),\n      role_name: z.string().optional(),\n      owner: NullableSimpleUserSchema,\n      private: z\n        .boolean()\n        .describe('Whether the repository is private or public.')\n        .default(false),\n      html_url: z.string().url(),\n      description: z.string(),\n      fork: z.boolean(),\n      url: z.string().url(),\n      archive_url: z.string(),\n      assignees_url: z.string(),\n      blobs_url: z.string(),\n      branches_url: z.string(),\n      collaborators_url: z.string(),\n      comments_url: z.string(),\n      commits_url: z.string(),\n      compare_url: z.string(),\n      contents_url: z.string(),\n      contributors_url: z.string().url(),\n      deployments_url: z.string().url(),\n      downloads_url: z.string().url(),\n      events_url: z.string().url(),\n      forks_url: z.string().url(),\n      git_commits_url: z.string(),\n      git_refs_url: z.string(),\n      git_tags_url: z.string(),\n      git_url: z.string(),\n      issue_comment_url: z.string(),\n      issue_events_url: z.string(),\n      issues_url: z.string(),\n      keys_url: z.string(),\n      labels_url: z.string(),\n      languages_url: z.string().url(),\n      merges_url: z.string().url(),\n      milestones_url: z.string(),\n      notifications_url: z.string(),\n      pulls_url: z.string(),\n      releases_url: z.string(),\n      ssh_url: z.string(),\n      stargazers_url: z.string().url(),\n      statuses_url: z.string(),\n      subscribers_url: z.string().url(),\n      subscription_url: z.string().url(),\n      tags_url: z.string().url(),\n      teams_url: z.string().url(),\n      trees_url: z.string(),\n      clone_url: z.string(),\n      mirror_url: z.string().url(),\n      hooks_url: z.string().url(),\n      svn_url: z.string().url(),\n      homepage: z.string().url(),\n      language: z.string(),\n      forks_count: z.number().int(),\n      stargazers_count: z.number().int(),\n      watchers_count: z.number().int(),\n      size: z.number().int(),\n      default_branch: z\n        .string()\n        .describe('The default branch of the repository.'),\n      open_issues_count: z.number().int(),\n      is_template: z\n        .boolean()\n        .describe(\n          'Whether this repository acts as a template that can be used to generate new repositories.'\n        )\n        .default(false),\n      topics: z.array(z.string()).optional(),\n      has_issues: z\n        .boolean()\n        .describe('Whether issues are enabled.')\n        .default(true),\n      has_projects: z\n        .boolean()\n        .describe('Whether projects are enabled.')\n        .default(true),\n      has_wiki: z\n        .boolean()\n        .describe('Whether the wiki is enabled.')\n        .default(true),\n      has_pages: z.boolean(),\n      has_downloads: z\n        .boolean()\n        .describe('Whether downloads are enabled.')\n        .default(true),\n      archived: z\n        .boolean()\n        .describe('Whether the repository is archived.')\n        .default(false),\n      disabled: z\n        .boolean()\n        .describe('Returns whether or not this repository disabled.'),\n      visibility: z\n        .string()\n        .describe('The repository visibility: public, private, or internal.')\n        .default('public'),\n      pushed_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      allow_rebase_merge: z\n        .boolean()\n        .describe('Whether to allow rebase merges for pull requests.')\n        .default(true),\n      temp_clone_token: z.string().optional(),\n      allow_squash_merge: z\n        .boolean()\n        .describe('Whether to allow squash merges for pull requests.')\n        .default(true),\n      allow_auto_merge: z\n        .boolean()\n        .describe('Whether to allow Auto-merge to be used on pull requests.')\n        .default(false),\n      delete_branch_on_merge: z\n        .boolean()\n        .describe(\n          'Whether to delete head branches when pull requests are merged'\n        )\n        .default(false),\n      allow_merge_commit: z\n        .boolean()\n        .describe('Whether to allow merge commits for pull requests.')\n        .default(true),\n      allow_forking: z\n        .boolean()\n        .describe('Whether to allow forking this repo')\n        .default(false),\n      web_commit_signoff_required: z\n        .boolean()\n        .describe(\n          'Whether to require contributors to sign off on web-based commits'\n        )\n        .default(false),\n      subscribers_count: z.number().int().optional(),\n      network_count: z.number().int().optional(),\n      open_issues: z.number().int(),\n      watchers: z.number().int(),\n      master_branch: z.string().optional()\n    })\n    .describe(\"A team's access to a repository.\")\n  export type TeamRepository = z.infer<typeof TeamRepositorySchema>\n\n  export const ManifestSchema = z\n    .object({\n      name: z.string().describe('The name of the manifest.'),\n      file: z\n        .object({\n          source_location: z\n            .string()\n            .describe(\n              'The path of the manifest file relative to the root of the Git repository.'\n            )\n            .optional()\n        })\n        .strict()\n        .optional(),\n      metadata: MetadataSchema.optional(),\n      resolved: z\n        .record(DependencySchema)\n        .describe('A collection of resolved package dependencies.')\n        .optional()\n    })\n    .strict()\n  export type Manifest = z.infer<typeof ManifestSchema>\n\n  export const TimelineReviewedEventSchema = z\n    .object({\n      event: z.string(),\n      id: z.number().int().describe('Unique identifier of the review'),\n      node_id: z.string(),\n      user: SimpleUserSchema,\n      body: z.string().describe('The text of the review.'),\n      state: z.string(),\n      html_url: z.string().url(),\n      pull_request_url: z.string().url(),\n      _links: z.object({\n        html: z.object({ href: z.string() }),\n        pull_request: z.object({ href: z.string() })\n      }),\n      submitted_at: z.string().datetime({ offset: true }).optional(),\n      commit_id: z.string().describe('A commit SHA for the review.'),\n      body_html: z.string().optional(),\n      body_text: z.string().optional(),\n      author_association: AuthorAssociationSchema\n    })\n    .describe('Timeline Reviewed Event')\n  export type TimelineReviewedEvent = z.infer<\n    typeof TimelineReviewedEventSchema\n  >\n\n  export const PullRequestReviewSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the review'),\n      node_id: z.string(),\n      user: NullableSimpleUserSchema,\n      body: z.string().describe('The text of the review.'),\n      state: z.string(),\n      html_url: z.string().url(),\n      pull_request_url: z.string().url(),\n      _links: z.object({\n        html: z.object({ href: z.string() }),\n        pull_request: z.object({ href: z.string() })\n      }),\n      submitted_at: z.string().datetime({ offset: true }).optional(),\n      commit_id: z\n        .string()\n        .describe(\n          'A commit SHA for the review. If the commit object was garbage collected or forcibly deleted, then it no longer exists in Git and this value will be `null`.'\n        ),\n      body_html: z.string().optional(),\n      body_text: z.string().optional(),\n      author_association: AuthorAssociationSchema\n    })\n    .describe('Pull Request Reviews are reviews on pull requests.')\n  export type PullRequestReview = z.infer<typeof PullRequestReviewSchema>\n\n  export const RepositoryAdvisoryCreateSchema = z\n    .object({\n      summary: z\n        .string()\n        .max(1024)\n        .describe('A short summary of the advisory.'),\n      description: z\n        .string()\n        .max(65_535)\n        .describe('A detailed description of what the advisory impacts.'),\n      cve_id: z\n        .string()\n        .describe('The Common Vulnerabilities and Exposures (CVE) ID.')\n        .optional(),\n      vulnerabilities: z\n        .array(\n          z\n            .object({\n              package: z\n                .object({\n                  ecosystem: SecurityAdvisoryEcosystemsSchema,\n                  name: z\n                    .string()\n                    .describe('The unique package name within its ecosystem.')\n                    .optional()\n                })\n                .describe(\n                  'The name of the package affected by the vulnerability.'\n                ),\n              vulnerable_version_range: z\n                .string()\n                .describe(\n                  'The range of the package versions affected by the vulnerability.'\n                )\n                .optional(),\n              patched_versions: z\n                .string()\n                .describe(\n                  'The package version(s) that resolve the vulnerability.'\n                )\n                .optional(),\n              vulnerable_functions: z\n                .array(z.string())\n                .describe('The functions in the package that are affected.')\n                .optional()\n            })\n            .strict()\n        )\n        .describe(\n          'A product affected by the vulnerability detailed in a repository security advisory.'\n        ),\n      cwe_ids: z\n        .array(z.string())\n        .describe('A list of Common Weakness Enumeration (CWE) IDs.')\n        .optional(),\n      credits: z\n        .array(\n          z\n            .object({\n              login: z.string().describe('The username of the user credited.'),\n              type: SecurityAdvisoryCreditTypesSchema\n            })\n            .strict()\n        )\n        .describe(\n          'A list of users receiving credit for their participation in the security advisory.'\n        )\n        .optional(),\n      severity: z\n        .enum(['critical', 'high', 'medium', 'low'])\n        .describe(\n          'The severity of the advisory. You must choose between setting this field or `cvss_vector_string`.'\n        )\n        .optional(),\n      cvss_vector_string: z\n        .string()\n        .describe(\n          'The CVSS vector that calculates the severity of the advisory. You must choose between setting this field or `severity`.'\n        )\n        .optional(),\n      start_private_fork: z\n        .boolean()\n        .describe(\n          'Whether to create a temporary private fork of the repository to collaborate on a fix.'\n        )\n        .default(false)\n    })\n    .strict()\n  export type RepositoryAdvisoryCreate = z.infer<\n    typeof RepositoryAdvisoryCreateSchema\n  >\n\n  export const RepositoryAdvisoryUpdateSchema = z\n    .object({\n      summary: z\n        .string()\n        .max(1024)\n        .describe('A short summary of the advisory.')\n        .optional(),\n      description: z\n        .string()\n        .max(65_535)\n        .describe('A detailed description of what the advisory impacts.')\n        .optional(),\n      cve_id: z\n        .string()\n        .describe('The Common Vulnerabilities and Exposures (CVE) ID.')\n        .optional(),\n      vulnerabilities: z\n        .array(\n          z\n            .object({\n              package: z\n                .object({\n                  ecosystem: SecurityAdvisoryEcosystemsSchema,\n                  name: z\n                    .string()\n                    .describe('The unique package name within its ecosystem.')\n                    .optional()\n                })\n                .describe(\n                  'The name of the package affected by the vulnerability.'\n                ),\n              vulnerable_version_range: z\n                .string()\n                .describe(\n                  'The range of the package versions affected by the vulnerability.'\n                )\n                .optional(),\n              patched_versions: z\n                .string()\n                .describe(\n                  'The package version(s) that resolve the vulnerability.'\n                )\n                .optional(),\n              vulnerable_functions: z\n                .array(z.string())\n                .describe('The functions in the package that are affected.')\n                .optional()\n            })\n            .strict()\n        )\n        .describe(\n          'A product affected by the vulnerability detailed in a repository security advisory.'\n        )\n        .optional(),\n      cwe_ids: z\n        .array(z.string())\n        .describe('A list of Common Weakness Enumeration (CWE) IDs.')\n        .optional(),\n      credits: z\n        .array(\n          z\n            .object({\n              login: z.string().describe('The username of the user credited.'),\n              type: SecurityAdvisoryCreditTypesSchema\n            })\n            .strict()\n        )\n        .describe(\n          'A list of users receiving credit for their participation in the security advisory.'\n        )\n        .optional(),\n      severity: z\n        .enum(['critical', 'high', 'medium', 'low'])\n        .describe(\n          'The severity of the advisory. You must choose between setting this field or `cvss_vector_string`.'\n        )\n        .optional(),\n      cvss_vector_string: z\n        .string()\n        .describe(\n          'The CVSS vector that calculates the severity of the advisory. You must choose between setting this field or `severity`.'\n        )\n        .optional(),\n      state: z\n        .enum(['published', 'closed', 'draft'])\n        .describe('The state of the advisory.')\n        .optional(),\n      collaborating_users: z\n        .array(z.string())\n        .describe(\n          'A list of usernames who have been granted write access to the advisory.'\n        )\n        .optional(),\n      collaborating_teams: z\n        .array(z.string())\n        .describe(\n          'A list of team slugs which have been granted write access to the advisory.'\n        )\n        .optional()\n    })\n    .strict()\n  export type RepositoryAdvisoryUpdate = z.infer<\n    typeof RepositoryAdvisoryUpdateSchema\n  >\n\n  export const UserMarketplacePurchaseSchema = z\n    .object({\n      billing_cycle: z.string(),\n      next_billing_date: z.string().datetime({ offset: true }),\n      unit_count: z.number().int(),\n      on_free_trial: z.boolean(),\n      free_trial_ends_on: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      account: MarketplaceAccountSchema,\n      plan: MarketplaceListingPlanSchema\n    })\n    .describe('User Marketplace Purchase')\n  export type UserMarketplacePurchase = z.infer<\n    typeof UserMarketplacePurchaseSchema\n  >\n\n  export const ClassroomAssignmentSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the repository.'),\n      public_repo: z\n        .boolean()\n        .describe(\n          'Whether an accepted assignment creates a public repository.'\n        ),\n      title: z.string().describe('Assignment title.'),\n      type: z\n        .enum(['individual', 'group'])\n        .describe(\"Whether it's a group assignment or individual assignment.\"),\n      invite_link: z\n        .string()\n        .describe('The link that a student can use to accept the assignment.'),\n      invitations_enabled: z\n        .boolean()\n        .describe(\n          'Whether the invitation link is enabled. Visiting an enabled invitation link will accept the assignment.'\n        ),\n      slug: z.string().describe('Sluggified name of the assignment.'),\n      students_are_repo_admins: z\n        .boolean()\n        .describe(\n          'Whether students are admins on created repository when a student accepts the assignment.'\n        ),\n      feedback_pull_requests_enabled: z\n        .boolean()\n        .describe(\n          'Whether feedback pull request will be created when a student accepts the assignment.'\n        ),\n      max_teams: z\n        .number()\n        .int()\n        .describe('The maximum allowable teams for the assignment.'),\n      max_members: z\n        .number()\n        .int()\n        .describe('The maximum allowable members per team.'),\n      editor: z.string().describe('The selected editor for the assignment.'),\n      accepted: z\n        .number()\n        .int()\n        .describe('The number of students that have accepted the assignment.'),\n      submitted: z\n        .number()\n        .int()\n        .describe('The number of students that have submitted the assignment.'),\n      passing: z\n        .number()\n        .int()\n        .describe('The number of students that have passed the assignment.'),\n      language: z\n        .string()\n        .describe('The programming language used in the assignment.'),\n      deadline: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time at which the assignment is due.'),\n      starter_code_repository: SimpleClassroomRepositorySchema,\n      classroom: ClassroomSchema\n    })\n    .describe('A GitHub Classroom assignment')\n  export type ClassroomAssignment = z.infer<typeof ClassroomAssignmentSchema>\n\n  export const MinimalRepositorySchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      full_name: z.string(),\n      owner: SimpleUserSchema,\n      private: z.boolean(),\n      html_url: z.string().url(),\n      description: z.string(),\n      fork: z.boolean(),\n      url: z.string().url(),\n      archive_url: z.string(),\n      assignees_url: z.string(),\n      blobs_url: z.string(),\n      branches_url: z.string(),\n      collaborators_url: z.string(),\n      comments_url: z.string(),\n      commits_url: z.string(),\n      compare_url: z.string(),\n      contents_url: z.string(),\n      contributors_url: z.string().url(),\n      deployments_url: z.string().url(),\n      downloads_url: z.string().url(),\n      events_url: z.string().url(),\n      forks_url: z.string().url(),\n      git_commits_url: z.string(),\n      git_refs_url: z.string(),\n      git_tags_url: z.string(),\n      git_url: z.string().optional(),\n      issue_comment_url: z.string(),\n      issue_events_url: z.string(),\n      issues_url: z.string(),\n      keys_url: z.string(),\n      labels_url: z.string(),\n      languages_url: z.string().url(),\n      merges_url: z.string().url(),\n      milestones_url: z.string(),\n      notifications_url: z.string(),\n      pulls_url: z.string(),\n      releases_url: z.string(),\n      ssh_url: z.string().optional(),\n      stargazers_url: z.string().url(),\n      statuses_url: z.string(),\n      subscribers_url: z.string().url(),\n      subscription_url: z.string().url(),\n      tags_url: z.string().url(),\n      teams_url: z.string().url(),\n      trees_url: z.string(),\n      clone_url: z.string().optional(),\n      mirror_url: z.string().optional(),\n      hooks_url: z.string().url(),\n      svn_url: z.string().optional(),\n      homepage: z.string().optional(),\n      language: z.string().optional(),\n      forks_count: z.number().int().optional(),\n      stargazers_count: z.number().int().optional(),\n      watchers_count: z.number().int().optional(),\n      size: z\n        .number()\n        .int()\n        .describe(\n          'The size of the repository, in kilobytes. Size is calculated hourly. When a repository is initially created, the size is 0.'\n        )\n        .optional(),\n      default_branch: z.string().optional(),\n      open_issues_count: z.number().int().optional(),\n      is_template: z.boolean().optional(),\n      topics: z.array(z.string()).optional(),\n      has_issues: z.boolean().optional(),\n      has_projects: z.boolean().optional(),\n      has_wiki: z.boolean().optional(),\n      has_pages: z.boolean().optional(),\n      has_downloads: z.boolean().optional(),\n      has_discussions: z.boolean().optional(),\n      archived: z.boolean().optional(),\n      disabled: z.boolean().optional(),\n      visibility: z.string().optional(),\n      pushed_at: z.string().datetime({ offset: true }).optional(),\n      created_at: z.string().datetime({ offset: true }).optional(),\n      updated_at: z.string().datetime({ offset: true }).optional(),\n      permissions: z\n        .object({\n          admin: z.boolean().optional(),\n          maintain: z.boolean().optional(),\n          push: z.boolean().optional(),\n          triage: z.boolean().optional(),\n          pull: z.boolean().optional()\n        })\n        .optional(),\n      role_name: z.string().optional(),\n      temp_clone_token: z.string().optional(),\n      delete_branch_on_merge: z.boolean().optional(),\n      subscribers_count: z.number().int().optional(),\n      network_count: z.number().int().optional(),\n      code_of_conduct: CodeOfConductSchema.optional(),\n      license: z\n        .object({\n          key: z.string().optional(),\n          name: z.string().optional(),\n          spdx_id: z.string().optional(),\n          url: z.string().optional(),\n          node_id: z.string().optional()\n        })\n        .optional(),\n      forks: z.number().int().optional(),\n      open_issues: z.number().int().optional(),\n      watchers: z.number().int().optional(),\n      allow_forking: z.boolean().optional(),\n      web_commit_signoff_required: z.boolean().optional(),\n      security_and_analysis: SecurityAndAnalysisSchema.optional()\n    })\n    .describe('Minimal Repository')\n  export type MinimalRepository = z.infer<typeof MinimalRepositorySchema>\n\n  export const ActionsHostedRunnerSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the hosted runner.'),\n      name: z.string().describe('The name of the hosted runner.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe(\n          'The unique identifier of the group that the hosted runner belongs to.'\n        )\n        .optional(),\n      image_details: NullableActionsHostedRunnerPoolImageSchema,\n      machine_size_details: ActionsHostedRunnerMachineSpecSchema,\n      status: z\n        .enum(['Ready', 'Provisioning', 'Shutdown', 'Deleting', 'Stuck'])\n        .describe('The status of the runner.'),\n      platform: z.string().describe('The operating system of the image.'),\n      maximum_runners: z\n        .number()\n        .int()\n        .describe(\n          'The maximum amount of hosted runners. Runners will not scale automatically above this number. Use this setting to limit your cost.'\n        )\n        .default(10),\n      public_ip_enabled: z\n        .boolean()\n        .describe('Whether public IP is enabled for the hosted runners.'),\n      public_ips: z\n        .array(PublicIpSchema)\n        .describe(\n          'The public IP ranges when public IP is enabled for the hosted runners.'\n        )\n        .optional(),\n      last_active_on: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time at which the runner was last used, in ISO 8601 format.'\n        )\n        .optional()\n    })\n    .describe('A Github-hosted hosted runner.')\n  export type ActionsHostedRunner = z.infer<typeof ActionsHostedRunnerSchema>\n\n  export const ActionsOrganizationPermissionsSchema = z.object({\n    enabled_repositories: EnabledRepositoriesSchema,\n    selected_repositories_url: z\n      .string()\n      .describe(\n        'The API URL to use to get or set the selected repositories that are allowed to run GitHub Actions, when `enabled_repositories` is set to `selected`.'\n      )\n      .optional(),\n    allowed_actions: AllowedActionsSchema.optional(),\n    selected_actions_url: SelectedActionsUrlSchema.optional()\n  })\n  export type ActionsOrganizationPermissions = z.infer<\n    typeof ActionsOrganizationPermissionsSchema\n  >\n\n  export const ActionsRunnerJitconfigSchema = z.any().describe('Response')\n  export type ActionsRunnerJitconfig = z.infer<\n    typeof ActionsRunnerJitconfigSchema\n  >\n\n  export const AuthenticationTokenSchema = z\n    .object({\n      token: z.string().describe('The token used for authentication'),\n      expires_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time this token expires'),\n      permissions: z.record(z.any()).optional(),\n      repositories: z\n        .array(RepositorySchema)\n        .describe('The repositories this token has access to')\n        .optional(),\n      single_file: z.string().optional(),\n      repository_selection: z\n        .enum(['all', 'selected'])\n        .describe(\n          \"Describe whether all repositories have been selected or there's a selection involved\"\n        )\n        .optional()\n    })\n    .describe('Authentication Token')\n  export type AuthenticationToken = z.infer<typeof AuthenticationTokenSchema>\n\n  export const CodeScanningAnalysisToolSchema = z.object({\n    name: CodeScanningAnalysisToolNameSchema.optional(),\n    version: CodeScanningAnalysisToolVersionSchema.optional(),\n    guid: CodeScanningAnalysisToolGuidSchema.optional()\n  })\n  export type CodeScanningAnalysisTool = z.infer<\n    typeof CodeScanningAnalysisToolSchema\n  >\n\n  export const NullableMinimalRepositorySchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      full_name: z.string(),\n      owner: SimpleUserSchema,\n      private: z.boolean(),\n      html_url: z.string().url(),\n      description: z.string(),\n      fork: z.boolean(),\n      url: z.string().url(),\n      archive_url: z.string(),\n      assignees_url: z.string(),\n      blobs_url: z.string(),\n      branches_url: z.string(),\n      collaborators_url: z.string(),\n      comments_url: z.string(),\n      commits_url: z.string(),\n      compare_url: z.string(),\n      contents_url: z.string(),\n      contributors_url: z.string().url(),\n      deployments_url: z.string().url(),\n      downloads_url: z.string().url(),\n      events_url: z.string().url(),\n      forks_url: z.string().url(),\n      git_commits_url: z.string(),\n      git_refs_url: z.string(),\n      git_tags_url: z.string(),\n      git_url: z.string().optional(),\n      issue_comment_url: z.string(),\n      issue_events_url: z.string(),\n      issues_url: z.string(),\n      keys_url: z.string(),\n      labels_url: z.string(),\n      languages_url: z.string().url(),\n      merges_url: z.string().url(),\n      milestones_url: z.string(),\n      notifications_url: z.string(),\n      pulls_url: z.string(),\n      releases_url: z.string(),\n      ssh_url: z.string().optional(),\n      stargazers_url: z.string().url(),\n      statuses_url: z.string(),\n      subscribers_url: z.string().url(),\n      subscription_url: z.string().url(),\n      tags_url: z.string().url(),\n      teams_url: z.string().url(),\n      trees_url: z.string(),\n      clone_url: z.string().optional(),\n      mirror_url: z.string().optional(),\n      hooks_url: z.string().url(),\n      svn_url: z.string().optional(),\n      homepage: z.string().optional(),\n      language: z.string().optional(),\n      forks_count: z.number().int().optional(),\n      stargazers_count: z.number().int().optional(),\n      watchers_count: z.number().int().optional(),\n      size: z\n        .number()\n        .int()\n        .describe(\n          'The size of the repository, in kilobytes. Size is calculated hourly. When a repository is initially created, the size is 0.'\n        )\n        .optional(),\n      default_branch: z.string().optional(),\n      open_issues_count: z.number().int().optional(),\n      is_template: z.boolean().optional(),\n      topics: z.array(z.string()).optional(),\n      has_issues: z.boolean().optional(),\n      has_projects: z.boolean().optional(),\n      has_wiki: z.boolean().optional(),\n      has_pages: z.boolean().optional(),\n      has_downloads: z.boolean().optional(),\n      has_discussions: z.boolean().optional(),\n      archived: z.boolean().optional(),\n      disabled: z.boolean().optional(),\n      visibility: z.string().optional(),\n      pushed_at: z.string().datetime({ offset: true }).optional(),\n      created_at: z.string().datetime({ offset: true }).optional(),\n      updated_at: z.string().datetime({ offset: true }).optional(),\n      permissions: z\n        .object({\n          admin: z.boolean().optional(),\n          maintain: z.boolean().optional(),\n          push: z.boolean().optional(),\n          triage: z.boolean().optional(),\n          pull: z.boolean().optional()\n        })\n        .optional(),\n      role_name: z.string().optional(),\n      temp_clone_token: z.string().optional(),\n      delete_branch_on_merge: z.boolean().optional(),\n      subscribers_count: z.number().int().optional(),\n      network_count: z.number().int().optional(),\n      code_of_conduct: CodeOfConductSchema.optional(),\n      license: z\n        .object({\n          key: z.string().optional(),\n          name: z.string().optional(),\n          spdx_id: z.string().optional(),\n          url: z.string().optional(),\n          node_id: z.string().optional()\n        })\n        .optional(),\n      forks: z.number().int().optional(),\n      open_issues: z.number().int().optional(),\n      watchers: z.number().int().optional(),\n      allow_forking: z.boolean().optional(),\n      web_commit_signoff_required: z.boolean().optional(),\n      security_and_analysis: SecurityAndAnalysisSchema.optional()\n    })\n    .describe('Minimal Repository')\n  export type NullableMinimalRepository = z.infer<\n    typeof NullableMinimalRepositorySchema\n  >\n\n  export const ActionsRepositoryPermissionsSchema = z.object({\n    enabled: ActionsEnabledSchema,\n    allowed_actions: AllowedActionsSchema.optional(),\n    selected_actions_url: SelectedActionsUrlSchema.optional()\n  })\n  export type ActionsRepositoryPermissions = z.infer<\n    typeof ActionsRepositoryPermissionsSchema\n  >\n\n  export const DeploymentSimpleSchema = z\n    .object({\n      url: z.string().url(),\n      id: z.number().int().describe('Unique identifier of the deployment'),\n      node_id: z.string(),\n      task: z.string().describe('Parameter to specify a task to execute'),\n      original_environment: z.string().optional(),\n      environment: z\n        .string()\n        .describe('Name for the target deployment environment.'),\n      description: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      statuses_url: z.string().url(),\n      repository_url: z.string().url(),\n      transient_environment: z\n        .boolean()\n        .describe(\n          'Specifies if the given environment is will no longer exist at some point in the future. Default: false.'\n        )\n        .optional(),\n      production_environment: z\n        .boolean()\n        .describe(\n          'Specifies if the given environment is one that end-users directly interact with. Default: false.'\n        )\n        .optional(),\n      performed_via_github_app: NullableIntegrationSchema.optional()\n    })\n    .describe(\n      'A deployment created as the result of an Actions check run from a workflow that references an environment'\n    )\n  export type DeploymentSimple = z.infer<typeof DeploymentSimpleSchema>\n\n  export const CodeScanningAutofixSchema = z.object({\n    status: CodeScanningAutofixStatusSchema,\n    description: CodeScanningAutofixDescriptionSchema,\n    started_at: CodeScanningAutofixStartedAtSchema\n  })\n  export type CodeScanningAutofix = z.infer<typeof CodeScanningAutofixSchema>\n\n  export const CodeScanningVariantAnalysisRepoTaskSchema = z.object({\n    repository: SimpleRepositorySchema,\n    analysis_status: CodeScanningVariantAnalysisStatusSchema,\n    artifact_size_in_bytes: z\n      .number()\n      .int()\n      .describe(\n        'The size of the artifact. This is only available for successful analyses.'\n      )\n      .optional(),\n    result_count: z\n      .number()\n      .int()\n      .describe(\n        'The number of results in the case of a successful analysis. This is only available for successful analyses.'\n      )\n      .optional(),\n    failure_message: z\n      .string()\n      .describe(\n        'The reason of the failure of this repo task. This is only available if the repository task has failed.'\n      )\n      .optional(),\n    database_commit_sha: z\n      .string()\n      .describe(\n        'The SHA of the commit the CodeQL database was built against. This is only available for successful analyses.'\n      )\n      .optional(),\n    source_location_prefix: z\n      .string()\n      .describe(\n        'The source location prefix to use. This is only available for successful analyses.'\n      )\n      .optional(),\n    artifact_url: z\n      .string()\n      .describe(\n        'The URL of the artifact. This is only available for successful analyses.'\n      )\n      .optional()\n  })\n  export type CodeScanningVariantAnalysisRepoTask = z.infer<\n    typeof CodeScanningVariantAnalysisRepoTaskSchema\n  >\n\n  export const CommitCommentSchema = z\n    .object({\n      html_url: z.string().url(),\n      url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      body: z.string(),\n      path: z.string(),\n      position: z.number().int(),\n      line: z.number().int(),\n      commit_id: z.string(),\n      user: NullableSimpleUserSchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      author_association: AuthorAssociationSchema,\n      reactions: ReactionRollupSchema.optional()\n    })\n    .describe('Commit Comment')\n  export type CommitComment = z.infer<typeof CommitCommentSchema>\n\n  export const CommunityProfileSchema = z\n    .object({\n      health_percentage: z.number().int(),\n      description: z.string(),\n      documentation: z.string(),\n      files: z.object({\n        code_of_conduct: NullableCodeOfConductSimpleSchema,\n        code_of_conduct_file: NullableCommunityHealthFileSchema,\n        license: NullableLicenseSimpleSchema,\n        contributing: NullableCommunityHealthFileSchema,\n        readme: NullableCommunityHealthFileSchema,\n        issue_template: NullableCommunityHealthFileSchema,\n        pull_request_template: NullableCommunityHealthFileSchema\n      }),\n      updated_at: z.string().datetime({ offset: true }),\n      content_reports_enabled: z.boolean().optional()\n    })\n    .describe('Community Profile')\n  export type CommunityProfile = z.infer<typeof CommunityProfileSchema>\n\n  export const SnapshotSchema = z\n    .object({\n      version: z\n        .number()\n        .int()\n        .describe('The version of the repository snapshot submission.'),\n      job: z\n        .object({\n          id: z.string().describe('The external ID of the job.'),\n          correlator: z\n            .string()\n            .describe(\n              'Correlator provides a key that is used to group snapshots submitted over time. Only the \"latest\" submitted snapshot for a given combination of `job.correlator` and `detector.name` will be considered when calculating a repository\\'s current dependencies. Correlator should be as unique as it takes to distinguish all detection runs for a given \"wave\" of CI workflow you run. If you\\'re using GitHub Actions, a good default value for this could be the environment variables GITHUB_WORKFLOW and GITHUB_JOB concatenated together. If you\\'re using a build matrix, then you\\'ll also need to add additional key(s) to distinguish between each submission inside a matrix variation.'\n            ),\n          html_url: z.string().describe('The url for the job.').optional()\n        })\n        .strict(),\n      sha: z\n        .string()\n        .min(40)\n        .max(40)\n        .describe(\n          'The commit SHA associated with this dependency snapshot. Maximum length: 40 characters.'\n        ),\n      ref: z\n        .string()\n        .regex(new RegExp('^refs/'))\n        .describe('The repository branch that triggered this snapshot.'),\n      detector: z\n        .object({\n          name: z.string().describe('The name of the detector used.'),\n          version: z.string().describe('The version of the detector used.'),\n          url: z.string().describe('The url of the detector used.')\n        })\n        .strict()\n        .describe('A description of the detector used.'),\n      metadata: MetadataSchema.optional(),\n      manifests: z\n        .record(ManifestSchema)\n        .describe(\n          'A collection of package manifests, which are a collection of related dependencies declared in a file or representing a logical group of dependencies.'\n        )\n        .optional(),\n      scanned: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time at which the snapshot was scanned.')\n    })\n    .strict()\n    .describe(\"Create a new snapshot of a repository's dependencies.\")\n  export type Snapshot = z.infer<typeof SnapshotSchema>\n\n  export const LabeledIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      label: z.object({ name: z.string(), color: z.string() })\n    })\n    .describe('Labeled Issue Event')\n  export type LabeledIssueEvent = z.infer<typeof LabeledIssueEventSchema>\n\n  export const UnlabeledIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      label: z.object({ name: z.string(), color: z.string() })\n    })\n    .describe('Unlabeled Issue Event')\n  export type UnlabeledIssueEvent = z.infer<typeof UnlabeledIssueEventSchema>\n\n  export const AssignedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: IntegrationSchema,\n      assignee: SimpleUserSchema,\n      assigner: SimpleUserSchema\n    })\n    .describe('Assigned Issue Event')\n  export type AssignedIssueEvent = z.infer<typeof AssignedIssueEventSchema>\n\n  export const UnassignedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      assignee: SimpleUserSchema,\n      assigner: SimpleUserSchema\n    })\n    .describe('Unassigned Issue Event')\n  export type UnassignedIssueEvent = z.infer<typeof UnassignedIssueEventSchema>\n\n  export const MilestonedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      milestone: z.object({ title: z.string() })\n    })\n    .describe('Milestoned Issue Event')\n  export type MilestonedIssueEvent = z.infer<typeof MilestonedIssueEventSchema>\n\n  export const DemilestonedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      milestone: z.object({ title: z.string() })\n    })\n    .describe('Demilestoned Issue Event')\n  export type DemilestonedIssueEvent = z.infer<\n    typeof DemilestonedIssueEventSchema\n  >\n\n  export const RenamedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      rename: z.object({ from: z.string(), to: z.string() })\n    })\n    .describe('Renamed Issue Event')\n  export type RenamedIssueEvent = z.infer<typeof RenamedIssueEventSchema>\n\n  export const ReviewDismissedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      dismissed_review: z.object({\n        state: z.string(),\n        review_id: z.number().int(),\n        dismissal_message: z.string(),\n        dismissal_commit_id: z.string().optional()\n      })\n    })\n    .describe('Review Dismissed Issue Event')\n  export type ReviewDismissedIssueEvent = z.infer<\n    typeof ReviewDismissedIssueEventSchema\n  >\n\n  export const LockedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      lock_reason: z.string()\n    })\n    .describe('Locked Issue Event')\n  export type LockedIssueEvent = z.infer<typeof LockedIssueEventSchema>\n\n  export const AddedToProjectIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      project_card: z\n        .object({\n          id: z.number().int(),\n          url: z.string().url(),\n          project_id: z.number().int(),\n          project_url: z.string().url(),\n          column_name: z.string(),\n          previous_column_name: z.string().optional()\n        })\n        .optional()\n    })\n    .describe('Added to Project Issue Event')\n  export type AddedToProjectIssueEvent = z.infer<\n    typeof AddedToProjectIssueEventSchema\n  >\n\n  export const MovedColumnInProjectIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      project_card: z\n        .object({\n          id: z.number().int(),\n          url: z.string().url(),\n          project_id: z.number().int(),\n          project_url: z.string().url(),\n          column_name: z.string(),\n          previous_column_name: z.string().optional()\n        })\n        .optional()\n    })\n    .describe('Moved Column in Project Issue Event')\n  export type MovedColumnInProjectIssueEvent = z.infer<\n    typeof MovedColumnInProjectIssueEventSchema\n  >\n\n  export const RemovedFromProjectIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      project_card: z\n        .object({\n          id: z.number().int(),\n          url: z.string().url(),\n          project_id: z.number().int(),\n          project_url: z.string().url(),\n          column_name: z.string(),\n          previous_column_name: z.string().optional()\n        })\n        .optional()\n    })\n    .describe('Removed from Project Issue Event')\n  export type RemovedFromProjectIssueEvent = z.infer<\n    typeof RemovedFromProjectIssueEventSchema\n  >\n\n  export const ConvertedNoteToIssueIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: IntegrationSchema,\n      project_card: z\n        .object({\n          id: z.number().int(),\n          url: z.string().url(),\n          project_id: z.number().int(),\n          project_url: z.string().url(),\n          column_name: z.string(),\n          previous_column_name: z.string().optional()\n        })\n        .optional()\n    })\n    .describe('Converted Note to Issue Issue Event')\n  export type ConvertedNoteToIssueIssueEvent = z.infer<\n    typeof ConvertedNoteToIssueIssueEventSchema\n  >\n\n  export const PullRequestReviewCommentSchema = z\n    .object({\n      url: z.string().describe('URL for the pull request review comment'),\n      pull_request_review_id: z\n        .number()\n        .int()\n        .describe(\n          'The ID of the pull request review to which the comment belongs.'\n        ),\n      id: z\n        .number()\n        .int()\n        .describe('The ID of the pull request review comment.'),\n      node_id: z\n        .string()\n        .describe('The node ID of the pull request review comment.'),\n      diff_hunk: z\n        .string()\n        .describe('The diff of the line that the comment refers to.'),\n      path: z\n        .string()\n        .describe(\n          'The relative path of the file to which the comment applies.'\n        ),\n      position: z\n        .number()\n        .int()\n        .describe(\n          'The line index in the diff to which the comment applies. This field is closing down; use `line` instead.'\n        )\n        .optional(),\n      original_position: z\n        .number()\n        .int()\n        .describe(\n          'The index of the original line in the diff to which the comment applies. This field is closing down; use `original_line` instead.'\n        )\n        .optional(),\n      commit_id: z\n        .string()\n        .describe('The SHA of the commit to which the comment applies.'),\n      original_commit_id: z\n        .string()\n        .describe(\n          'The SHA of the original commit to which the comment applies.'\n        ),\n      in_reply_to_id: z\n        .number()\n        .int()\n        .describe('The comment ID to reply to.')\n        .optional(),\n      user: SimpleUserSchema,\n      body: z.string().describe('The text of the comment.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      html_url: z\n        .string()\n        .url()\n        .describe('HTML URL for the pull request review comment.'),\n      pull_request_url: z\n        .string()\n        .url()\n        .describe(\n          'URL for the pull request that the review comment belongs to.'\n        ),\n      author_association: AuthorAssociationSchema,\n      _links: z.object({\n        self: z.object({ href: z.string().url() }),\n        html: z.object({ href: z.string().url() }),\n        pull_request: z.object({ href: z.string().url() })\n      }),\n      start_line: z\n        .number()\n        .int()\n        .describe('The first line of the range for a multi-line comment.')\n        .optional(),\n      original_start_line: z\n        .number()\n        .int()\n        .describe('The first line of the range for a multi-line comment.')\n        .optional(),\n      start_side: z\n        .enum(['LEFT', 'RIGHT'])\n        .describe(\n          'The side of the first line of the range for a multi-line comment.'\n        )\n        .default('RIGHT'),\n      line: z\n        .number()\n        .int()\n        .describe(\n          'The line of the blob to which the comment applies. The last line of the range for a multi-line comment'\n        )\n        .optional(),\n      original_line: z\n        .number()\n        .int()\n        .describe(\n          'The line of the blob to which the comment applies. The last line of the range for a multi-line comment'\n        )\n        .optional(),\n      side: z\n        .enum(['LEFT', 'RIGHT'])\n        .describe(\n          'The side of the diff to which the comment applies. The side of the last line of the range for a multi-line comment'\n        )\n        .default('RIGHT'),\n      subject_type: z\n        .enum(['line', 'file'])\n        .describe(\n          'The level at which the comment is targeted, can be a diff line or a file.'\n        )\n        .optional(),\n      reactions: ReactionRollupSchema.optional(),\n      body_html: z.string().optional(),\n      body_text: z.string().optional()\n    })\n    .describe(\n      \"Pull Request Review Comments are comments on a portion of the Pull Request's diff.\"\n    )\n  export type PullRequestReviewComment = z.infer<\n    typeof PullRequestReviewCommentSchema\n  >\n\n  export const TimelineAssignedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      assignee: SimpleUserSchema\n    })\n    .describe('Timeline Assigned Issue Event')\n  export type TimelineAssignedIssueEvent = z.infer<\n    typeof TimelineAssignedIssueEventSchema\n  >\n\n  export const TimelineUnassignedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      assignee: SimpleUserSchema\n    })\n    .describe('Timeline Unassigned Issue Event')\n  export type TimelineUnassignedIssueEvent = z.infer<\n    typeof TimelineUnassignedIssueEventSchema\n  >\n\n  export const StateChangeIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      state_reason: z.string().optional()\n    })\n    .describe('State Change Issue Event')\n  export type StateChangeIssueEvent = z.infer<\n    typeof StateChangeIssueEventSchema\n  >\n\n  export const PullRequestReviewRequestSchema = z\n    .object({ users: z.array(SimpleUserSchema), teams: z.array(TeamSchema) })\n    .describe('Pull Request Review Request')\n  export type PullRequestReviewRequest = z.infer<\n    typeof PullRequestReviewRequestSchema\n  >\n\n  export const RepoSearchResultItemSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      full_name: z.string(),\n      owner: NullableSimpleUserSchema,\n      private: z.boolean(),\n      html_url: z.string().url(),\n      description: z.string(),\n      fork: z.boolean(),\n      url: z.string().url(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      pushed_at: z.string().datetime({ offset: true }),\n      homepage: z.string().url(),\n      size: z.number().int(),\n      stargazers_count: z.number().int(),\n      watchers_count: z.number().int(),\n      language: z.string(),\n      forks_count: z.number().int(),\n      open_issues_count: z.number().int(),\n      master_branch: z.string().optional(),\n      default_branch: z.string(),\n      score: z.number(),\n      forks_url: z.string().url(),\n      keys_url: z.string(),\n      collaborators_url: z.string(),\n      teams_url: z.string().url(),\n      hooks_url: z.string().url(),\n      issue_events_url: z.string(),\n      events_url: z.string().url(),\n      assignees_url: z.string(),\n      branches_url: z.string(),\n      tags_url: z.string().url(),\n      blobs_url: z.string(),\n      git_tags_url: z.string(),\n      git_refs_url: z.string(),\n      trees_url: z.string(),\n      statuses_url: z.string(),\n      languages_url: z.string().url(),\n      stargazers_url: z.string().url(),\n      contributors_url: z.string().url(),\n      subscribers_url: z.string().url(),\n      subscription_url: z.string().url(),\n      commits_url: z.string(),\n      git_commits_url: z.string(),\n      comments_url: z.string(),\n      issue_comment_url: z.string(),\n      contents_url: z.string(),\n      compare_url: z.string(),\n      merges_url: z.string().url(),\n      archive_url: z.string(),\n      downloads_url: z.string().url(),\n      issues_url: z.string(),\n      pulls_url: z.string(),\n      milestones_url: z.string(),\n      notifications_url: z.string(),\n      labels_url: z.string(),\n      releases_url: z.string(),\n      deployments_url: z.string().url(),\n      git_url: z.string(),\n      ssh_url: z.string(),\n      clone_url: z.string(),\n      svn_url: z.string().url(),\n      forks: z.number().int(),\n      open_issues: z.number().int(),\n      watchers: z.number().int(),\n      topics: z.array(z.string()).optional(),\n      mirror_url: z.string().url(),\n      has_issues: z.boolean(),\n      has_projects: z.boolean(),\n      has_pages: z.boolean(),\n      has_wiki: z.boolean(),\n      has_downloads: z.boolean(),\n      has_discussions: z.boolean().optional(),\n      archived: z.boolean(),\n      disabled: z\n        .boolean()\n        .describe('Returns whether or not this repository disabled.'),\n      visibility: z\n        .string()\n        .describe('The repository visibility: public, private, or internal.')\n        .optional(),\n      license: NullableLicenseSimpleSchema,\n      permissions: z\n        .object({\n          admin: z.boolean(),\n          maintain: z.boolean().optional(),\n          push: z.boolean(),\n          triage: z.boolean().optional(),\n          pull: z.boolean()\n        })\n        .optional(),\n      text_matches: SearchResultTextMatchesSchema.optional(),\n      temp_clone_token: z.string().optional(),\n      allow_merge_commit: z.boolean().optional(),\n      allow_squash_merge: z.boolean().optional(),\n      allow_rebase_merge: z.boolean().optional(),\n      allow_auto_merge: z.boolean().optional(),\n      delete_branch_on_merge: z.boolean().optional(),\n      allow_forking: z.boolean().optional(),\n      is_template: z.boolean().optional(),\n      web_commit_signoff_required: z.boolean().optional()\n    })\n    .describe('Repo Search Result Item')\n  export type RepoSearchResultItem = z.infer<typeof RepoSearchResultItemSchema>\n\n  export const StarredRepositorySchema = z\n    .object({\n      starred_at: z.string().datetime({ offset: true }),\n      repo: RepositorySchema\n    })\n    .describe('Starred Repository')\n  export type StarredRepository = z.infer<typeof StarredRepositorySchema>\n\n  export const WebhookConfigSchema = z\n    .object({\n      url: WebhookConfigUrlSchema.optional(),\n      content_type: WebhookConfigContentTypeSchema.optional(),\n      secret: WebhookConfigSecretSchema.optional(),\n      insecure_ssl: WebhookConfigInsecureSslSchema.optional()\n    })\n    .describe('Configuration object of the webhook')\n  export type WebhookConfig = z.infer<typeof WebhookConfigSchema>\n\n  export const InstallationSchema = z\n    .object({\n      id: z.number().int().describe('The ID of the installation.'),\n      account: z.union([SimpleUserSchema, EnterpriseSchema]),\n      repository_selection: z\n        .enum(['all', 'selected'])\n        .describe(\n          \"Describe whether all repositories have been selected or there's a selection involved\"\n        ),\n      access_tokens_url: z.string().url(),\n      repositories_url: z.string().url(),\n      html_url: z.string().url(),\n      app_id: z.number().int(),\n      target_id: z\n        .number()\n        .int()\n        .describe(\n          'The ID of the user or organization this token is being scoped to.'\n        ),\n      target_type: z.string(),\n      permissions: AppPermissionsSchema,\n      events: z.array(z.string()),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      single_file_name: z.string(),\n      has_multiple_single_files: z.boolean().optional(),\n      single_file_paths: z.array(z.string()).optional(),\n      app_slug: z.string(),\n      suspended_by: NullableSimpleUserSchema,\n      suspended_at: z.string().datetime({ offset: true }),\n      contact_email: z.string().optional()\n    })\n    .describe('Installation')\n  export type Installation = z.infer<typeof InstallationSchema>\n\n  export const InstallationTokenSchema = z\n    .object({\n      token: z.string(),\n      expires_at: z.string(),\n      permissions: AppPermissionsSchema.optional(),\n      repository_selection: z.enum(['all', 'selected']).optional(),\n      repositories: z.array(RepositorySchema).optional(),\n      single_file: z.string().optional(),\n      has_multiple_single_files: z.boolean().optional(),\n      single_file_paths: z.array(z.string()).optional()\n    })\n    .describe(\n      'Authentication token for a GitHub App installed on a user or org.'\n    )\n  export type InstallationToken = z.infer<typeof InstallationTokenSchema>\n\n  export const AuthorizationSchema = z\n    .object({\n      id: z.number().int(),\n      url: z.string().url(),\n      scopes: z\n        .array(z.string())\n        .describe('A list of scopes that this authorization is in.'),\n      token: z.string(),\n      token_last_eight: z.string(),\n      hashed_token: z.string(),\n      app: z.object({\n        client_id: z.string(),\n        name: z.string(),\n        url: z.string().url()\n      }),\n      note: z.string(),\n      note_url: z.string().url(),\n      updated_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      fingerprint: z.string(),\n      user: NullableSimpleUserSchema.optional(),\n      installation: NullableScopedInstallationSchema.optional(),\n      expires_at: z.string().datetime({ offset: true })\n    })\n    .describe(\n      'The authorization for an OAuth app, GitHub App, or a Personal Access Token.'\n    )\n  export type Authorization = z.infer<typeof AuthorizationSchema>\n\n  export const ClassroomAcceptedAssignmentSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the repository.'),\n      submitted: z\n        .boolean()\n        .describe('Whether an accepted assignment has been submitted.'),\n      passing: z.boolean().describe('Whether a submission passed.'),\n      commit_count: z.number().int().describe('Count of student commits.'),\n      grade: z.string().describe('Most recent grade.'),\n      students: z.array(SimpleClassroomUserSchema),\n      repository: SimpleClassroomRepositorySchema,\n      assignment: SimpleClassroomAssignmentSchema\n    })\n    .describe('A GitHub Classroom accepted assignment')\n  export type ClassroomAcceptedAssignment = z.infer<\n    typeof ClassroomAcceptedAssignmentSchema\n  >\n\n  export const DependabotAlertSecurityAdvisorySchema = z\n    .object({\n      ghsa_id: z\n        .string()\n        .describe(\n          'The unique GitHub Security Advisory ID assigned to the advisory.'\n        )\n        .readonly(),\n      cve_id: z\n        .string()\n        .describe('The unique CVE ID assigned to the advisory.')\n        .readonly(),\n      summary: z\n        .string()\n        .max(1024)\n        .describe('A short, plain text summary of the advisory.')\n        .readonly(),\n      description: z\n        .string()\n        .describe('A long-form Markdown-supported description of the advisory.')\n        .readonly(),\n      vulnerabilities: z\n        .array(DependabotAlertSecurityVulnerabilitySchema)\n        .describe('Vulnerable version range information for the advisory.')\n        .readonly(),\n      severity: z\n        .enum(['low', 'medium', 'high', 'critical'])\n        .describe('The severity of the advisory.')\n        .readonly(),\n      cvss: z\n        .object({\n          score: z\n            .number()\n            .gte(0)\n            .lte(10)\n            .describe('The overall CVSS score of the advisory.')\n            .readonly(),\n          vector_string: z\n            .string()\n            .describe('The full CVSS vector string for the advisory.')\n            .readonly()\n        })\n        .strict()\n        .describe(\n          'Details for the advisory pertaining to the Common Vulnerability Scoring System.'\n        )\n        .readonly(),\n      cvss_severities: CvssSeveritiesSchema.optional(),\n      epss: SecurityAdvisoryEpssSchema.optional(),\n      cwes: z\n        .array(\n          z\n            .object({\n              cwe_id: z.string().describe('The unique CWE ID.').readonly(),\n              name: z\n                .string()\n                .describe('The short, plain text name of the CWE.')\n                .readonly()\n            })\n            .strict()\n            .describe('A CWE weakness assigned to the advisory.')\n            .readonly()\n        )\n        .describe(\n          'Details for the advisory pertaining to Common Weakness Enumeration.'\n        )\n        .readonly(),\n      identifiers: z\n        .array(\n          z\n            .object({\n              type: z\n                .enum(['CVE', 'GHSA'])\n                .describe('The type of advisory identifier.')\n                .readonly(),\n              value: z\n                .string()\n                .describe('The value of the advisory identifer.')\n                .readonly()\n            })\n            .strict()\n            .describe('An advisory identifier.')\n            .readonly()\n        )\n        .describe(\n          'Values that identify this advisory among security information sources.'\n        )\n        .readonly(),\n      references: z\n        .array(\n          z\n            .object({\n              url: z\n                .string()\n                .url()\n                .describe('The URL of the reference.')\n                .readonly()\n            })\n            .strict()\n            .describe('A link to additional advisory information.')\n            .readonly()\n        )\n        .describe('Links to additional advisory information.')\n        .readonly(),\n      published_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the advisory was published in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .readonly(),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the advisory was last modified in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .readonly(),\n      withdrawn_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the advisory was withdrawn in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .readonly()\n    })\n    .strict()\n    .describe('Details for the GitHub Security Advisory.')\n    .readonly()\n  export type DependabotAlertSecurityAdvisory = z.infer<\n    typeof DependabotAlertSecurityAdvisorySchema\n  >\n\n  export const GistSimpleSchema = z\n    .object({\n      forks: z\n        .array(\n          z.object({\n            id: z.string().optional(),\n            url: z.string().url().optional(),\n            user: PublicUserSchema.optional(),\n            created_at: z.string().datetime({ offset: true }).optional(),\n            updated_at: z.string().datetime({ offset: true }).optional()\n          })\n        )\n        .optional(),\n      history: z.array(GistHistorySchema).optional(),\n      fork_of: z\n        .object({\n          url: z.string().url(),\n          forks_url: z.string().url(),\n          commits_url: z.string().url(),\n          id: z.string(),\n          node_id: z.string(),\n          git_pull_url: z.string().url(),\n          git_push_url: z.string().url(),\n          html_url: z.string().url(),\n          files: z.record(\n            z.object({\n              filename: z.string().optional(),\n              type: z.string().optional(),\n              language: z.string().optional(),\n              raw_url: z.string().optional(),\n              size: z.number().int().optional()\n            })\n          ),\n          public: z.boolean(),\n          created_at: z.string().datetime({ offset: true }),\n          updated_at: z.string().datetime({ offset: true }),\n          description: z.string(),\n          comments: z.number().int(),\n          comments_enabled: z.boolean().optional(),\n          user: NullableSimpleUserSchema,\n          comments_url: z.string().url(),\n          owner: NullableSimpleUserSchema.optional(),\n          truncated: z.boolean().optional(),\n          forks: z.array(z.any()).optional(),\n          history: z.array(z.any()).optional()\n        })\n        .describe('Gist')\n        .optional(),\n      url: z.string().optional(),\n      forks_url: z.string().optional(),\n      commits_url: z.string().optional(),\n      id: z.string().optional(),\n      node_id: z.string().optional(),\n      git_pull_url: z.string().optional(),\n      git_push_url: z.string().optional(),\n      html_url: z.string().optional(),\n      files: z\n        .record(\n          z.object({\n            filename: z.string().optional(),\n            type: z.string().optional(),\n            language: z.string().optional(),\n            raw_url: z.string().optional(),\n            size: z.number().int().optional(),\n            truncated: z.boolean().optional(),\n            content: z.string().optional(),\n            encoding: z\n              .string()\n              .describe(\n                'The encoding used for `content`. Currently, `\"utf-8\"` and `\"base64\"` are supported.'\n              )\n              .default('utf-8')\n          })\n        )\n        .optional(),\n      public: z.boolean().optional(),\n      created_at: z.string().optional(),\n      updated_at: z.string().optional(),\n      description: z.string().optional(),\n      comments: z.number().int().optional(),\n      comments_enabled: z.boolean().optional(),\n      user: z.string().optional(),\n      comments_url: z.string().optional(),\n      owner: SimpleUserSchema.optional(),\n      truncated: z.boolean().optional()\n    })\n    .describe('Gist Simple')\n  export type GistSimple = z.infer<typeof GistSimpleSchema>\n\n  export const ThreadSchema = z\n    .object({\n      id: z.string(),\n      repository: MinimalRepositorySchema,\n      subject: z.object({\n        title: z.string(),\n        url: z.string(),\n        latest_comment_url: z.string(),\n        type: z.string()\n      }),\n      reason: z.string(),\n      unread: z.boolean(),\n      updated_at: z.string(),\n      last_read_at: z.string(),\n      url: z.string(),\n      subscription_url: z.string()\n    })\n    .describe('Thread')\n  export type Thread = z.infer<typeof ThreadSchema>\n\n  export const CopilotUsageMetricsDaySchema = z\n    .object({\n      date: z\n        .string()\n        .date()\n        .describe(\n          'The date for which the usage metrics are aggregated, in `YYYY-MM-DD` format.'\n        ),\n      total_active_users: z\n        .number()\n        .int()\n        .describe(\n          'The total number of Copilot users with activity belonging to any Copilot feature, globally, for the given day. Includes passive activity such as receiving a code suggestion, as well as engagement activity such as accepting a code suggestion or prompting chat. Does not include authentication events. Is not limited to the individual features detailed on the endpoint.'\n        )\n        .optional(),\n      total_engaged_users: z\n        .number()\n        .int()\n        .describe(\n          'The total number of Copilot users who engaged with any Copilot feature, for the given day. Examples include but are not limited to accepting a code suggestion, prompting Copilot chat, or triggering a PR Summary. Does not include authentication events. Is not limited to the individual features detailed on the endpoint.'\n        )\n        .optional(),\n      copilot_ide_code_completions: CopilotIdeCodeCompletionsSchema.optional(),\n      copilot_ide_chat: CopilotIdeChatSchema.optional(),\n      copilot_dotcom_chat: CopilotDotcomChatSchema.optional(),\n      copilot_dotcom_pull_requests: CopilotDotcomPullRequestsSchema.optional()\n    })\n    .catchall(z.any())\n    .describe('Copilot usage metrics for a given day.')\n  export type CopilotUsageMetricsDay = z.infer<\n    typeof CopilotUsageMetricsDaySchema\n  >\n\n  export const MigrationSchema = z\n    .object({\n      id: z.number().int(),\n      owner: NullableSimpleUserSchema,\n      guid: z.string(),\n      state: z.string(),\n      lock_repositories: z.boolean(),\n      exclude_metadata: z.boolean(),\n      exclude_git_data: z.boolean(),\n      exclude_attachments: z.boolean(),\n      exclude_releases: z.boolean(),\n      exclude_owner_projects: z.boolean(),\n      org_metadata_only: z.boolean(),\n      repositories: z\n        .array(RepositorySchema)\n        .describe(\n          'The repositories included in the migration. Only returned for export migrations.'\n        ),\n      url: z.string().url(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      node_id: z.string(),\n      archive_url: z.string().url().optional(),\n      exclude: z\n        .array(\n          z\n            .string()\n            .describe(\n              'Allowed values that can be passed to the exclude parameter. The array can include any of: `\"repositories\"`.'\n            )\n        )\n        .describe(\n          'Exclude related items from being returned in the response in order to improve performance of the request. The array can include any of: `\"repositories\"`.'\n        )\n        .optional()\n    })\n    .describe('A migration.')\n  export type Migration = z.infer<typeof MigrationSchema>\n\n  export const PendingDeploymentSchema = z\n    .object({\n      environment: z.object({\n        id: z.number().int().describe('The id of the environment.').optional(),\n        node_id: z.string().optional(),\n        name: z.string().describe('The name of the environment.').optional(),\n        url: z.string().optional(),\n        html_url: z.string().optional()\n      }),\n      wait_timer: z\n        .number()\n        .int()\n        .describe('The set duration of the wait timer'),\n      wait_timer_started_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The time that the wait timer began.'),\n      current_user_can_approve: z\n        .boolean()\n        .describe(\n          'Whether the currently authenticated user can approve the deployment'\n        ),\n      reviewers: z\n        .array(\n          z.object({\n            type: DeploymentReviewerTypeSchema.optional(),\n            reviewer: z.union([SimpleUserSchema, TeamSchema]).optional()\n          })\n        )\n        .describe(\n          'The people or teams that may approve jobs that reference the environment. You can list up to six users or teams as reviewers. The reviewers must have at least read access to the repository. Only one of the required reviewers needs to approve the job for it to proceed.'\n        )\n    })\n    .describe(\n      'Details of a deployment that is waiting for protection rules to pass'\n    )\n  export type PendingDeployment = z.infer<typeof PendingDeploymentSchema>\n\n  export const DeploymentSchema = z\n    .object({\n      url: z.string().url(),\n      id: z.number().int().describe('Unique identifier of the deployment'),\n      node_id: z.string(),\n      sha: z.string(),\n      ref: z\n        .string()\n        .describe('The ref to deploy. This can be a branch, tag, or sha.'),\n      task: z.string().describe('Parameter to specify a task to execute'),\n      payload: z.union([z.record(z.any()), z.string()]),\n      original_environment: z.string().optional(),\n      environment: z\n        .string()\n        .describe('Name for the target deployment environment.'),\n      description: z.string(),\n      creator: NullableSimpleUserSchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      statuses_url: z.string().url(),\n      repository_url: z.string().url(),\n      transient_environment: z\n        .boolean()\n        .describe(\n          'Specifies if the given environment is will no longer exist at some point in the future. Default: false.'\n        )\n        .optional(),\n      production_environment: z\n        .boolean()\n        .describe(\n          'Specifies if the given environment is one that end-users directly interact with. Default: false.'\n        )\n        .optional(),\n      performed_via_github_app: NullableIntegrationSchema.optional()\n    })\n    .describe('A request for a specific ref(branch,sha,tag) to be deployed')\n  export type Deployment = z.infer<typeof DeploymentSchema>\n\n  export const CheckSuitePreferenceSchema = z\n    .object({\n      preferences: z.object({\n        auto_trigger_checks: z\n          .array(z.object({ app_id: z.number().int(), setting: z.boolean() }))\n          .optional()\n      }),\n      repository: MinimalRepositorySchema\n    })\n    .describe('Check suite configuration preferences for a repository.')\n  export type CheckSuitePreference = z.infer<typeof CheckSuitePreferenceSchema>\n\n  export const DeploymentStatusSchema = z\n    .object({\n      url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      state: z\n        .enum([\n          'error',\n          'failure',\n          'inactive',\n          'pending',\n          'success',\n          'queued',\n          'in_progress'\n        ])\n        .describe('The state of the status.'),\n      creator: NullableSimpleUserSchema,\n      description: z\n        .string()\n        .max(140)\n        .describe('A short description of the status.')\n        .default(''),\n      environment: z\n        .string()\n        .describe('The environment of the deployment that the status is for.')\n        .default(''),\n      target_url: z\n        .string()\n        .url()\n        .describe('Closing down notice: the URL to associate with this status.')\n        .default(''),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      deployment_url: z.string().url(),\n      repository_url: z.string().url(),\n      environment_url: z\n        .string()\n        .url()\n        .describe('The URL for accessing your environment.')\n        .default(''),\n      log_url: z\n        .string()\n        .url()\n        .describe('The URL to associate with this status.')\n        .default(''),\n      performed_via_github_app: NullableIntegrationSchema.optional()\n    })\n    .describe('The status of a deployment.')\n  export type DeploymentStatus = z.infer<typeof DeploymentStatusSchema>\n\n  export const TimelineLineCommentedEventSchema = z\n    .object({\n      event: z.string().optional(),\n      node_id: z.string().optional(),\n      comments: z.array(PullRequestReviewCommentSchema).optional()\n    })\n    .describe('Timeline Line Commented Event')\n  export type TimelineLineCommentedEvent = z.infer<\n    typeof TimelineLineCommentedEventSchema\n  >\n\n  export const TimelineCommitCommentedEventSchema = z\n    .object({\n      event: z.string().optional(),\n      node_id: z.string().optional(),\n      commit_id: z.string().optional(),\n      comments: z.array(CommitCommentSchema).optional()\n    })\n    .describe('Timeline Commit Commented Event')\n  export type TimelineCommitCommentedEvent = z.infer<\n    typeof TimelineCommitCommentedEventSchema\n  >\n\n  export const ReviewCommentSchema = z\n    .object({\n      url: z.string().url(),\n      pull_request_review_id: z.number().int(),\n      id: z.number().int(),\n      node_id: z.string(),\n      diff_hunk: z.string(),\n      path: z.string(),\n      position: z.number().int(),\n      original_position: z.number().int(),\n      commit_id: z.string(),\n      original_commit_id: z.string(),\n      in_reply_to_id: z.number().int().optional(),\n      user: NullableSimpleUserSchema,\n      body: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      html_url: z.string().url(),\n      pull_request_url: z.string().url(),\n      author_association: AuthorAssociationSchema,\n      _links: z.object({\n        self: LinkSchema,\n        html: LinkSchema,\n        pull_request: LinkSchema\n      }),\n      body_text: z.string().optional(),\n      body_html: z.string().optional(),\n      reactions: ReactionRollupSchema.optional(),\n      side: z\n        .enum(['LEFT', 'RIGHT'])\n        .describe(\n          'The side of the first line of the range for a multi-line comment.'\n        )\n        .default('RIGHT'),\n      start_side: z\n        .enum(['LEFT', 'RIGHT'])\n        .describe(\n          'The side of the first line of the range for a multi-line comment.'\n        )\n        .default('RIGHT'),\n      line: z\n        .number()\n        .int()\n        .describe(\n          'The line of the blob to which the comment applies. The last line of the range for a multi-line comment'\n        )\n        .optional(),\n      original_line: z\n        .number()\n        .int()\n        .describe(\n          'The original line of the blob to which the comment applies. The last line of the range for a multi-line comment'\n        )\n        .optional(),\n      start_line: z\n        .number()\n        .int()\n        .describe('The first line of the range for a multi-line comment.')\n        .optional(),\n      original_start_line: z\n        .number()\n        .int()\n        .describe(\n          'The original first line of the range for a multi-line comment.'\n        )\n        .optional()\n    })\n    .describe('Legacy Review Comment')\n  export type ReviewComment = z.infer<typeof ReviewCommentSchema>\n\n  export const ReleaseSchema = z\n    .object({\n      url: z.string().url(),\n      html_url: z.string().url(),\n      assets_url: z.string().url(),\n      upload_url: z.string(),\n      tarball_url: z.string().url(),\n      zipball_url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      tag_name: z.string().describe('The name of the tag.'),\n      target_commitish: z\n        .string()\n        .describe(\n          'Specifies the commitish value that determines where the Git tag is created from.'\n        ),\n      name: z.string(),\n      body: z.string().optional(),\n      draft: z\n        .boolean()\n        .describe(\n          'true to create a draft (unpublished) release, false to create a published one.'\n        ),\n      prerelease: z\n        .boolean()\n        .describe(\n          'Whether to identify the release as a prerelease or a full release.'\n        ),\n      created_at: z.string().datetime({ offset: true }),\n      published_at: z.string().datetime({ offset: true }),\n      author: SimpleUserSchema,\n      assets: z.array(ReleaseAssetSchema),\n      body_html: z.string().optional(),\n      body_text: z.string().optional(),\n      mentions_count: z.number().int().optional(),\n      discussion_url: z\n        .string()\n        .url()\n        .describe('The URL of the release discussion.')\n        .optional(),\n      reactions: ReactionRollupSchema.optional()\n    })\n    .describe('A release.')\n  export type Release = z.infer<typeof ReleaseSchema>\n\n  export const CodespaceSchema = z\n    .object({\n      id: z.number().int(),\n      name: z\n        .string()\n        .describe('Automatically generated name of this codespace.'),\n      display_name: z\n        .string()\n        .describe('Display name for this codespace.')\n        .optional(),\n      environment_id: z\n        .string()\n        .describe(\"UUID identifying this codespace's environment.\"),\n      owner: SimpleUserSchema,\n      billable_owner: SimpleUserSchema,\n      repository: MinimalRepositorySchema,\n      machine: NullableCodespaceMachineSchema,\n      devcontainer_path: z\n        .string()\n        .describe(\n          'Path to devcontainer.json from repo root used to create Codespace.'\n        )\n        .optional(),\n      prebuild: z\n        .boolean()\n        .describe('Whether the codespace was created from a prebuild.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      last_used_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Last known time this codespace was started.'),\n      state: z\n        .enum([\n          'Unknown',\n          'Created',\n          'Queued',\n          'Provisioning',\n          'Available',\n          'Awaiting',\n          'Unavailable',\n          'Deleted',\n          'Moved',\n          'Shutdown',\n          'Archived',\n          'Starting',\n          'ShuttingDown',\n          'Failed',\n          'Exporting',\n          'Updating',\n          'Rebuilding'\n        ])\n        .describe('State of this codespace.'),\n      url: z.string().url().describe('API URL for this codespace.'),\n      git_status: z\n        .object({\n          ahead: z\n            .number()\n            .int()\n            .describe(\n              'The number of commits the local repository is ahead of the remote.'\n            )\n            .optional(),\n          behind: z\n            .number()\n            .int()\n            .describe(\n              'The number of commits the local repository is behind the remote.'\n            )\n            .optional(),\n          has_unpushed_changes: z\n            .boolean()\n            .describe('Whether the local repository has unpushed changes.')\n            .optional(),\n          has_uncommitted_changes: z\n            .boolean()\n            .describe('Whether the local repository has uncommitted changes.')\n            .optional(),\n          ref: z\n            .string()\n            .describe(\n              'The current branch (or SHA if in detached HEAD state) of the local repository.'\n            )\n            .optional()\n        })\n        .describe(\"Details about the codespace's git repository.\"),\n      location: z\n        .enum(['EastUs', 'SouthEastAsia', 'WestEurope', 'WestUs2'])\n        .describe('The initally assigned location of a new codespace.'),\n      idle_timeout_minutes: z\n        .number()\n        .int()\n        .describe(\n          'The number of minutes of inactivity after which this codespace will be automatically stopped.'\n        ),\n      web_url: z\n        .string()\n        .url()\n        .describe('URL to access this codespace on the web.'),\n      machines_url: z\n        .string()\n        .url()\n        .describe(\n          'API URL to access available alternate machine types for this codespace.'\n        ),\n      start_url: z.string().url().describe('API URL to start this codespace.'),\n      stop_url: z.string().url().describe('API URL to stop this codespace.'),\n      publish_url: z\n        .string()\n        .url()\n        .describe('API URL to publish this codespace to a new repository.')\n        .optional(),\n      pulls_url: z\n        .string()\n        .url()\n        .describe(\n          'API URL for the Pull Request associated with this codespace, if any.'\n        ),\n      recent_folders: z.array(z.string()),\n      runtime_constraints: z\n        .object({\n          allowed_port_privacy_settings: z\n            .array(z.string())\n            .describe(\n              'The privacy settings a user can select from when forwarding a port.'\n            )\n            .optional()\n        })\n        .optional(),\n      pending_operation: z\n        .boolean()\n        .describe(\n          'Whether or not a codespace has a pending async operation. This would mean that the codespace is temporarily unavailable. The only thing that you can do with a codespace in this state is delete it.'\n        )\n        .optional(),\n      pending_operation_disabled_reason: z\n        .string()\n        .describe(\n          'Text to show user when codespace is disabled by a pending operation'\n        )\n        .optional(),\n      idle_timeout_notice: z\n        .string()\n        .describe(\n          'Text to show user when codespace idle timeout minutes has been overriden by an organization policy'\n        )\n        .optional(),\n      retention_period_minutes: z\n        .number()\n        .int()\n        .describe(\n          'Duration in minutes after codespace has gone idle in which it will be deleted. Must be integer minutes between 0 and 43200 (30 days).'\n        )\n        .optional(),\n      retention_expires_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'When a codespace will be auto-deleted based on the \"retention_period_minutes\" and \"last_used_at\"'\n        )\n        .optional(),\n      last_known_stop_notice: z\n        .string()\n        .describe(\n          'The text to display to a user when a codespace has been stopped for a potentially actionable reason.'\n        )\n        .optional()\n    })\n    .describe('A codespace.')\n  export type Codespace = z.infer<typeof CodespaceSchema>\n\n  export const CopilotSeatDetailsSchema = z\n    .object({\n      assignee: SimpleUserSchema,\n      organization: NullableOrganizationSimpleSchema.optional(),\n      assigning_team: z\n        .union([TeamSchema, EnterpriseTeamSchema])\n        .describe(\n          'The team through which the assignee is granted access to GitHub Copilot, if applicable.'\n        )\n        .optional(),\n      pending_cancellation_date: z\n        .string()\n        .date()\n        .describe(\n          \"The pending cancellation date for the seat, in `YYYY-MM-DD` format. This will be null unless the assignee's Copilot access has been canceled during the current billing cycle. If the seat has been cancelled, this corresponds to the start of the organization's next billing cycle.\"\n        )\n        .optional(),\n      last_activity_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"Timestamp of user's last GitHub Copilot activity, in ISO 8601 format.\"\n        )\n        .optional(),\n      last_activity_editor: z\n        .string()\n        .describe(\n          'Last editor that was used by the user for a GitHub Copilot completion.'\n        )\n        .optional(),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'Timestamp of when the assignee was last granted access to GitHub Copilot, in ISO 8601 format.'\n        ),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"**Closing down notice:** This field is no longer relevant and is closing down. Use the `created_at` field to determine when the assignee was last granted access to GitHub Copilot. Timestamp of when the assignee's GitHub Copilot access was last updated, in ISO 8601 format.\"\n        )\n        .optional(),\n      plan_type: z\n        .enum(['business', 'enterprise', 'unknown'])\n        .describe(\n          'The Copilot plan of the organization, or the parent enterprise, when applicable.'\n        )\n        .optional()\n    })\n    .strict()\n    .describe(\n      'Information about a Copilot Business seat assignment for a user, team, or organization.'\n    )\n  export type CopilotSeatDetails = z.infer<typeof CopilotSeatDetailsSchema>\n\n  export const PackageSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the package.'),\n      name: z.string().describe('The name of the package.'),\n      package_type: z.enum([\n        'npm',\n        'maven',\n        'rubygems',\n        'docker',\n        'nuget',\n        'container'\n      ]),\n      url: z.string(),\n      html_url: z.string(),\n      version_count: z\n        .number()\n        .int()\n        .describe('The number of versions of the package.'),\n      visibility: z.enum(['private', 'public']),\n      owner: NullableSimpleUserSchema.optional(),\n      repository: NullableMinimalRepositorySchema.optional(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true })\n    })\n    .describe('A software package')\n  export type Package = z.infer<typeof PackageSchema>\n\n  export const OrgRulesetConditionsSchema = z\n    .record(z.any())\n    .and(\n      z.union([\n        z\n          .record(z.any())\n          .and(\n            z.intersection(\n              RepositoryRulesetConditionsSchema,\n              RepositoryRulesetConditionsRepositoryNameTargetSchema\n            )\n          )\n          .describe(\n            'Conditions to target repositories by name and refs by name'\n          ),\n        z\n          .record(z.any())\n          .and(\n            z.intersection(\n              RepositoryRulesetConditionsSchema,\n              RepositoryRulesetConditionsRepositoryIdTargetSchema\n            )\n          )\n          .describe('Conditions to target repositories by id and refs by name'),\n        z\n          .record(z.any())\n          .and(\n            z.intersection(\n              RepositoryRulesetConditionsSchema,\n              RepositoryRulesetConditionsRepositoryPropertyTargetSchema\n            )\n          )\n          .describe(\n            'Conditions to target repositories by property and refs by name'\n          )\n      ])\n    )\n    .describe(\n      'Conditions for an organization ruleset.\\nThe branch and tag rulesets conditions object should contain both `repository_name` and `ref_name` properties, or both `repository_id` and `ref_name` properties, or both `repository_property` and `ref_name` properties.\\nThe push rulesets conditions object does not require the `ref_name` property.\\nFor repository policy rulesets, the conditions object should only contain the `repository_name`, the `repository_id`, or the `repository_property`.'\n    )\n  export type OrgRulesetConditions = z.infer<typeof OrgRulesetConditionsSchema>\n\n  export const ProtectedBranchPullRequestReviewSchema = z\n    .object({\n      url: z.string().url().optional(),\n      dismissal_restrictions: z\n        .object({\n          users: z\n            .array(SimpleUserSchema)\n            .describe('The list of users with review dismissal access.')\n            .optional(),\n          teams: z\n            .array(TeamSchema)\n            .describe('The list of teams with review dismissal access.')\n            .optional(),\n          apps: z\n            .array(IntegrationSchema)\n            .describe('The list of apps with review dismissal access.')\n            .optional(),\n          url: z.string().optional(),\n          users_url: z.string().optional(),\n          teams_url: z.string().optional()\n        })\n        .optional(),\n      bypass_pull_request_allowances: z\n        .object({\n          users: z\n            .array(SimpleUserSchema)\n            .describe(\n              'The list of users allowed to bypass pull request requirements.'\n            )\n            .optional(),\n          teams: z\n            .array(TeamSchema)\n            .describe(\n              'The list of teams allowed to bypass pull request requirements.'\n            )\n            .optional(),\n          apps: z\n            .array(IntegrationSchema)\n            .describe(\n              'The list of apps allowed to bypass pull request requirements.'\n            )\n            .optional()\n        })\n        .describe(\n          'Allow specific users, teams, or apps to bypass pull request requirements.'\n        )\n        .optional(),\n      dismiss_stale_reviews: z.boolean(),\n      require_code_owner_reviews: z.boolean(),\n      required_approving_review_count: z\n        .number()\n        .int()\n        .gte(0)\n        .lte(6)\n        .optional(),\n      require_last_push_approval: z\n        .boolean()\n        .describe(\n          'Whether the most recent push must be approved by someone other than the person who pushed it.'\n        )\n        .default(false)\n    })\n    .describe('Protected Branch Pull Request Review')\n  export type ProtectedBranchPullRequestReview = z.infer<\n    typeof ProtectedBranchPullRequestReviewSchema\n  >\n\n  export const CommitSchema = z\n    .object({\n      url: z.string().url(),\n      sha: z.string(),\n      node_id: z.string(),\n      html_url: z.string().url(),\n      comments_url: z.string().url(),\n      commit: z.object({\n        url: z.string().url(),\n        author: NullableGitUserSchema,\n        committer: NullableGitUserSchema,\n        message: z.string(),\n        comment_count: z.number().int(),\n        tree: z.object({ sha: z.string(), url: z.string().url() }),\n        verification: VerificationSchema.optional()\n      }),\n      author: z.union([SimpleUserSchema, EmptyObjectSchema]),\n      committer: z.union([SimpleUserSchema, EmptyObjectSchema]),\n      parents: z.array(\n        z.object({\n          sha: z.string(),\n          url: z.string().url(),\n          html_url: z.string().url().optional()\n        })\n      ),\n      stats: z\n        .object({\n          additions: z.number().int().optional(),\n          deletions: z.number().int().optional(),\n          total: z.number().int().optional()\n        })\n        .optional(),\n      files: z.array(DiffEntrySchema).optional()\n    })\n    .describe('Commit')\n  export type Commit = z.infer<typeof CommitSchema>\n\n  export const CheckRunSchema = z\n    .object({\n      id: z.number().int().describe('The id of the check.'),\n      head_sha: z\n        .string()\n        .describe('The SHA of the commit that is being checked.'),\n      node_id: z.string(),\n      external_id: z.string(),\n      url: z.string(),\n      html_url: z.string(),\n      details_url: z.string(),\n      status: z\n        .enum([\n          'queued',\n          'in_progress',\n          'completed',\n          'waiting',\n          'requested',\n          'pending'\n        ])\n        .describe(\n          'The phase of the lifecycle that the check is currently in. Statuses of waiting, requested, and pending are reserved for GitHub Actions check runs.'\n        ),\n      conclusion: z.enum([\n        'success',\n        'failure',\n        'neutral',\n        'cancelled',\n        'skipped',\n        'timed_out',\n        'action_required'\n      ]),\n      started_at: z.string().datetime({ offset: true }),\n      completed_at: z.string().datetime({ offset: true }),\n      output: z.object({\n        title: z.string(),\n        summary: z.string(),\n        text: z.string(),\n        annotations_count: z.number().int(),\n        annotations_url: z.string().url()\n      }),\n      name: z.string().describe('The name of the check.'),\n      check_suite: z.object({ id: z.number().int() }),\n      app: NullableIntegrationSchema,\n      pull_requests: z\n        .array(PullRequestMinimalSchema)\n        .describe(\n          'Pull requests that are open with a `head_sha` or `head_branch` that matches the check. The returned pull requests do not necessarily indicate pull requests that triggered the check.'\n        ),\n      deployment: DeploymentSimpleSchema.optional()\n    })\n    .describe('A check performed on the code of a given code change')\n  export type CheckRun = z.infer<typeof CheckRunSchema>\n\n  export const RepositoryInvitationSchema = z\n    .object({\n      id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the repository invitation.'),\n      repository: MinimalRepositorySchema,\n      invitee: NullableSimpleUserSchema,\n      inviter: NullableSimpleUserSchema,\n      permissions: z\n        .enum(['read', 'write', 'admin', 'triage', 'maintain'])\n        .describe('The permission associated with the invitation.'),\n      created_at: z.string().datetime({ offset: true }),\n      expired: z\n        .boolean()\n        .describe('Whether or not the invitation has expired')\n        .optional(),\n      url: z.string().describe('URL for the repository invitation'),\n      html_url: z.string(),\n      node_id: z.string()\n    })\n    .describe('Repository invitations let you manage who you collaborate with.')\n  export type RepositoryInvitation = z.infer<typeof RepositoryInvitationSchema>\n\n  export const CombinedCommitStatusSchema = z\n    .object({\n      state: z.string(),\n      statuses: z.array(SimpleCommitStatusSchema),\n      sha: z.string(),\n      total_count: z.number().int(),\n      repository: MinimalRepositorySchema,\n      commit_url: z.string().url(),\n      url: z.string().url()\n    })\n    .describe('Combined Commit Status')\n  export type CombinedCommitStatus = z.infer<typeof CombinedCommitStatusSchema>\n\n  export const ReviewRequestedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      review_requester: SimpleUserSchema,\n      requested_team: TeamSchema.optional(),\n      requested_reviewer: SimpleUserSchema.optional()\n    })\n    .describe('Review Requested Issue Event')\n  export type ReviewRequestedIssueEvent = z.infer<\n    typeof ReviewRequestedIssueEventSchema\n  >\n\n  export const ReviewRequestRemovedIssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string(),\n      actor: SimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string(),\n      performed_via_github_app: NullableIntegrationSchema,\n      review_requester: SimpleUserSchema,\n      requested_team: TeamSchema.optional(),\n      requested_reviewer: SimpleUserSchema.optional()\n    })\n    .describe('Review Request Removed Issue Event')\n  export type ReviewRequestRemovedIssueEvent = z.infer<\n    typeof ReviewRequestRemovedIssueEventSchema\n  >\n\n  export const TimelineCommentEventSchema = z\n    .object({\n      event: z.string(),\n      actor: SimpleUserSchema,\n      id: z.number().int().describe('Unique identifier of the issue comment'),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the issue comment'),\n      body: z.string().describe('Contents of the issue comment').optional(),\n      body_text: z.string().optional(),\n      body_html: z.string().optional(),\n      html_url: z.string().url(),\n      user: SimpleUserSchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      issue_url: z.string().url(),\n      author_association: AuthorAssociationSchema,\n      performed_via_github_app: NullableIntegrationSchema.optional(),\n      reactions: ReactionRollupSchema.optional()\n    })\n    .describe('Timeline Comment Event')\n  export type TimelineCommentEvent = z.infer<typeof TimelineCommentEventSchema>\n\n  export const CodeSearchResultItemSchema = z\n    .object({\n      name: z.string(),\n      path: z.string(),\n      sha: z.string(),\n      url: z.string().url(),\n      git_url: z.string().url(),\n      html_url: z.string().url(),\n      repository: MinimalRepositorySchema,\n      score: z.number(),\n      file_size: z.number().int().optional(),\n      language: z.string().optional(),\n      last_modified_at: z.string().datetime({ offset: true }).optional(),\n      line_numbers: z.array(z.string()).optional(),\n      text_matches: SearchResultTextMatchesSchema.optional()\n    })\n    .describe('Code Search Result Item')\n  export type CodeSearchResultItem = z.infer<typeof CodeSearchResultItemSchema>\n\n  export const GlobalAdvisorySchema = z\n    .object({\n      ghsa_id: z\n        .string()\n        .describe('The GitHub Security Advisory ID.')\n        .readonly(),\n      cve_id: z\n        .string()\n        .describe('The Common Vulnerabilities and Exposures (CVE) ID.')\n        .readonly(),\n      url: z.string().describe('The API URL for the advisory.').readonly(),\n      html_url: z\n        .string()\n        .url()\n        .describe('The URL for the advisory.')\n        .readonly(),\n      repository_advisory_url: z\n        .string()\n        .url()\n        .describe('The API URL for the repository advisory.')\n        .readonly(),\n      summary: z\n        .string()\n        .max(1024)\n        .describe('A short summary of the advisory.'),\n      description: z\n        .string()\n        .max(65_535)\n        .describe('A detailed description of what the advisory entails.'),\n      type: z\n        .enum(['reviewed', 'unreviewed', 'malware'])\n        .describe('The type of advisory.')\n        .readonly(),\n      severity: z\n        .enum(['critical', 'high', 'medium', 'low', 'unknown'])\n        .describe('The severity of the advisory.'),\n      source_code_location: z\n        .string()\n        .url()\n        .describe(\"The URL of the advisory's source code.\"),\n      identifiers: z\n        .array(\n          z.object({\n            type: z.enum(['CVE', 'GHSA']).describe('The type of identifier.'),\n            value: z.string().describe('The identifier value.')\n          })\n        )\n        .readonly(),\n      references: z.array(\n        z\n          .string()\n          .describe('URLs with more information regarding the advisory.')\n      ),\n      published_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was published, in ISO 8601 format.'\n        )\n        .readonly(),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was last updated, in ISO 8601 format.'\n        )\n        .readonly(),\n      github_reviewed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was reviewed by GitHub, in ISO 8601 format.'\n        )\n        .readonly(),\n      nvd_published_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time when the advisory was published in the National Vulnerability Database, in ISO 8601 format.\\nThis field is only populated when the advisory is imported from the National Vulnerability Database.'\n        )\n        .readonly(),\n      withdrawn_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was withdrawn, in ISO 8601 format.'\n        )\n        .readonly(),\n      vulnerabilities: z\n        .array(VulnerabilitySchema)\n        .describe(\n          'The products and respective version ranges affected by the advisory.'\n        ),\n      cvss: z.object({\n        vector_string: z.string().describe('The CVSS vector.'),\n        score: z.number().gte(0).lte(10).describe('The CVSS score.').readonly()\n      }),\n      cvss_severities: CvssSeveritiesSchema.optional(),\n      epss: SecurityAdvisoryEpssSchema.optional(),\n      cwes: z.array(\n        z.object({\n          cwe_id: z\n            .string()\n            .describe('The Common Weakness Enumeration (CWE) identifier.'),\n          name: z.string().describe('The name of the CWE.').readonly()\n        })\n      ),\n      credits: z\n        .array(\n          z.object({\n            user: SimpleUserSchema,\n            type: SecurityAdvisoryCreditTypesSchema\n          })\n        )\n        .describe('The users who contributed to the advisory.')\n        .readonly()\n    })\n    .strict()\n    .describe('A GitHub Security Advisory.')\n  export type GlobalAdvisory = z.infer<typeof GlobalAdvisorySchema>\n\n  export const IssueCommentSchema = z\n    .object({\n      id: z.number().int().describe('Unique identifier of the issue comment'),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the issue comment'),\n      body: z.string().describe('Contents of the issue comment').optional(),\n      body_text: z.string().optional(),\n      body_html: z.string().optional(),\n      html_url: z.string().url(),\n      user: NullableSimpleUserSchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      issue_url: z.string().url(),\n      author_association: AuthorAssociationSchema,\n      performed_via_github_app: NullableIntegrationSchema.optional(),\n      reactions: ReactionRollupSchema.optional()\n    })\n    .describe('Comments provide a way for people to collaborate on an issue.')\n  export type IssueComment = z.infer<typeof IssueCommentSchema>\n\n  export const CodeScanningVariantAnalysisSchema = z\n    .object({\n      id: z.number().int().describe('The ID of the variant analysis.'),\n      controller_repo: SimpleRepositorySchema,\n      actor: SimpleUserSchema,\n      query_language: CodeScanningVariantAnalysisLanguageSchema,\n      query_pack_url: z\n        .string()\n        .describe('The download url for the query pack.'),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the variant analysis was created, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        )\n        .optional(),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the variant analysis was last updated, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ.\"\n        )\n        .optional(),\n      completed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          \"The date and time at which the variant analysis was completed, in ISO 8601 format':' YYYY-MM-DDTHH:MM:SSZ. Will be null if the variant analysis has not yet completed or this information is not available.\"\n        )\n        .optional(),\n      status: z.enum(['in_progress', 'succeeded', 'failed', 'cancelled']),\n      actions_workflow_run_id: z\n        .number()\n        .int()\n        .describe(\n          'The GitHub Actions workflow run used to execute this variant analysis. This is only available if the workflow run has started.'\n        )\n        .optional(),\n      failure_reason: z\n        .enum([\n          'no_repos_queried',\n          'actions_workflow_run_failed',\n          'internal_error'\n        ])\n        .describe(\n          'The reason for a failure of the variant analysis. This is only available if the variant analysis has failed.'\n        )\n        .optional(),\n      scanned_repositories: z\n        .array(\n          z.object({\n            repository: CodeScanningVariantAnalysisRepositorySchema,\n            analysis_status: CodeScanningVariantAnalysisStatusSchema,\n            result_count: z\n              .number()\n              .int()\n              .describe(\n                'The number of results in the case of a successful analysis. This is only available for successful analyses.'\n              )\n              .optional(),\n            artifact_size_in_bytes: z\n              .number()\n              .int()\n              .describe(\n                'The size of the artifact. This is only available for successful analyses.'\n              )\n              .optional(),\n            failure_message: z\n              .string()\n              .describe(\n                'The reason of the failure of this repo task. This is only available if the repository task has failed.'\n              )\n              .optional()\n          })\n        )\n        .optional(),\n      skipped_repositories: z\n        .object({\n          access_mismatch_repos:\n            CodeScanningVariantAnalysisSkippedRepoGroupSchema,\n          not_found_repos: z.object({\n            repository_count: z\n              .number()\n              .int()\n              .describe(\n                'The total number of repositories that were skipped for this reason.'\n              ),\n            repository_full_names: z\n              .array(z.string())\n              .describe(\n                'A list of full repository names that were skipped. This list may not include all repositories that were skipped.'\n              )\n          }),\n          no_codeql_db_repos: CodeScanningVariantAnalysisSkippedRepoGroupSchema,\n          over_limit_repos: CodeScanningVariantAnalysisSkippedRepoGroupSchema\n        })\n        .describe(\n          'Information about repositories that were skipped from processing. This information is only available to the user that initiated the variant analysis.'\n        )\n        .optional()\n    })\n    .describe('A run of a CodeQL query against one or more repositories.')\n  export type CodeScanningVariantAnalysis = z.infer<\n    typeof CodeScanningVariantAnalysisSchema\n  >\n\n  export const CommitComparisonSchema = z\n    .object({\n      url: z.string().url(),\n      html_url: z.string().url(),\n      permalink_url: z.string().url(),\n      diff_url: z.string().url(),\n      patch_url: z.string().url(),\n      base_commit: CommitSchema,\n      merge_base_commit: CommitSchema,\n      status: z.enum(['diverged', 'ahead', 'behind', 'identical']),\n      ahead_by: z.number().int(),\n      behind_by: z.number().int(),\n      total_commits: z.number().int(),\n      commits: z.array(CommitSchema),\n      files: z.array(DiffEntrySchema).optional()\n    })\n    .describe('Commit Comparison')\n  export type CommitComparison = z.infer<typeof CommitComparisonSchema>\n\n  export const EnvironmentSchema = z\n    .object({\n      id: z.number().int().describe('The id of the environment.'),\n      node_id: z.string(),\n      name: z.string().describe('The name of the environment.'),\n      url: z.string(),\n      html_url: z.string(),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the environment was created, in ISO 8601 format.'\n        ),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the environment was last updated, in ISO 8601 format.'\n        ),\n      protection_rules: z\n        .array(\n          z.union([\n            z.object({\n              id: z.number().int(),\n              node_id: z.string(),\n              type: z.string(),\n              wait_timer: WaitTimerSchema.optional()\n            }),\n            z.object({\n              id: z.number().int(),\n              node_id: z.string(),\n              prevent_self_review: z\n                .boolean()\n                .describe(\n                  'Whether deployments to this environment can be approved by the user who created the deployment.'\n                )\n                .optional(),\n              type: z.string(),\n              reviewers: z\n                .array(\n                  z.object({\n                    type: DeploymentReviewerTypeSchema.optional(),\n                    reviewer: z.union([SimpleUserSchema, TeamSchema]).optional()\n                  })\n                )\n                .describe(\n                  'The people or teams that may approve jobs that reference the environment. You can list up to six users or teams as reviewers. The reviewers must have at least read access to the repository. Only one of the required reviewers needs to approve the job for it to proceed.'\n                )\n                .optional()\n            }),\n            z.object({\n              id: z.number().int(),\n              node_id: z.string(),\n              type: z.string()\n            })\n          ])\n        )\n        .describe('Built-in deployment protection rules for the environment.')\n        .optional(),\n      deployment_branch_policy: DeploymentBranchPolicySettingsSchema.optional()\n    })\n    .describe('Details of a deployment environment')\n  export type Environment = z.infer<typeof EnvironmentSchema>\n\n  export const HookSchema = z\n    .object({\n      type: z.string(),\n      id: z.number().int().describe('Unique identifier of the webhook.'),\n      name: z\n        .string()\n        .describe(\"The name of a valid service, use 'web' for a webhook.\"),\n      active: z\n        .boolean()\n        .describe(\n          'Determines whether the hook is actually triggered on pushes.'\n        ),\n      events: z\n        .array(z.string())\n        .describe(\n          \"Determines what events the hook is triggered for. Default: ['push'].\"\n        ),\n      config: WebhookConfigSchema,\n      updated_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      url: z.string().url(),\n      test_url: z.string().url(),\n      ping_url: z.string().url(),\n      deliveries_url: z.string().url().optional(),\n      last_response: HookResponseSchema\n    })\n    .describe('Webhooks for repositories.')\n  export type Hook = z.infer<typeof HookSchema>\n\n  export const CodeScanningAlertInstanceSchema = z.object({\n    ref: CodeScanningRefSchema.optional(),\n    analysis_key: CodeScanningAnalysisAnalysisKeySchema.optional(),\n    environment: CodeScanningAlertEnvironmentSchema.optional(),\n    category: CodeScanningAnalysisCategorySchema.optional(),\n    state: CodeScanningAlertStateSchema.optional(),\n    commit_sha: z.string().optional(),\n    message: z.object({ text: z.string().optional() }).optional(),\n    location: CodeScanningAlertLocationSchema.optional(),\n    html_url: z.string().optional(),\n    classifications: z\n      .array(CodeScanningAlertClassificationSchema)\n      .describe(\n        'Classifications that have been applied to the file that triggered the alert.\\nFor example identifying it as documentation, or a generated file.'\n      )\n      .optional()\n  })\n  export type CodeScanningAlertInstance = z.infer<\n    typeof CodeScanningAlertInstanceSchema\n  >\n\n  export const FullRepositorySchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      name: z.string(),\n      full_name: z.string(),\n      owner: SimpleUserSchema,\n      private: z.boolean(),\n      html_url: z.string().url(),\n      description: z.string(),\n      fork: z.boolean(),\n      url: z.string().url(),\n      archive_url: z.string(),\n      assignees_url: z.string(),\n      blobs_url: z.string(),\n      branches_url: z.string(),\n      collaborators_url: z.string(),\n      comments_url: z.string(),\n      commits_url: z.string(),\n      compare_url: z.string(),\n      contents_url: z.string(),\n      contributors_url: z.string().url(),\n      deployments_url: z.string().url(),\n      downloads_url: z.string().url(),\n      events_url: z.string().url(),\n      forks_url: z.string().url(),\n      git_commits_url: z.string(),\n      git_refs_url: z.string(),\n      git_tags_url: z.string(),\n      git_url: z.string(),\n      issue_comment_url: z.string(),\n      issue_events_url: z.string(),\n      issues_url: z.string(),\n      keys_url: z.string(),\n      labels_url: z.string(),\n      languages_url: z.string().url(),\n      merges_url: z.string().url(),\n      milestones_url: z.string(),\n      notifications_url: z.string(),\n      pulls_url: z.string(),\n      releases_url: z.string(),\n      ssh_url: z.string(),\n      stargazers_url: z.string().url(),\n      statuses_url: z.string(),\n      subscribers_url: z.string().url(),\n      subscription_url: z.string().url(),\n      tags_url: z.string().url(),\n      teams_url: z.string().url(),\n      trees_url: z.string(),\n      clone_url: z.string(),\n      mirror_url: z.string().url(),\n      hooks_url: z.string().url(),\n      svn_url: z.string().url(),\n      homepage: z.string().url(),\n      language: z.string(),\n      forks_count: z.number().int(),\n      stargazers_count: z.number().int(),\n      watchers_count: z.number().int(),\n      size: z\n        .number()\n        .int()\n        .describe(\n          'The size of the repository, in kilobytes. Size is calculated hourly. When a repository is initially created, the size is 0.'\n        ),\n      default_branch: z.string(),\n      open_issues_count: z.number().int(),\n      is_template: z.boolean().optional(),\n      topics: z.array(z.string()).optional(),\n      has_issues: z.boolean(),\n      has_projects: z.boolean(),\n      has_wiki: z.boolean(),\n      has_pages: z.boolean(),\n      has_downloads: z.boolean().optional(),\n      has_discussions: z.boolean(),\n      archived: z.boolean(),\n      disabled: z\n        .boolean()\n        .describe('Returns whether or not this repository disabled.'),\n      visibility: z\n        .string()\n        .describe('The repository visibility: public, private, or internal.')\n        .optional(),\n      pushed_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      permissions: z\n        .object({\n          admin: z.boolean(),\n          maintain: z.boolean().optional(),\n          push: z.boolean(),\n          triage: z.boolean().optional(),\n          pull: z.boolean()\n        })\n        .optional(),\n      allow_rebase_merge: z.boolean().optional(),\n      template_repository: NullableRepositorySchema.optional(),\n      temp_clone_token: z.string().optional(),\n      allow_squash_merge: z.boolean().optional(),\n      allow_auto_merge: z.boolean().optional(),\n      delete_branch_on_merge: z.boolean().optional(),\n      allow_merge_commit: z.boolean().optional(),\n      allow_update_branch: z.boolean().optional(),\n      use_squash_pr_title_as_default: z.boolean().optional(),\n      squash_merge_commit_title: z\n        .enum(['PR_TITLE', 'COMMIT_OR_PR_TITLE'])\n        .describe(\n          \"The default value for a squash merge commit title:\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).\"\n        )\n        .optional(),\n      squash_merge_commit_message: z\n        .enum(['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'])\n        .describe(\n          \"The default value for a squash merge commit message:\\n\\n- `PR_BODY` - default to the pull request's body.\\n- `COMMIT_MESSAGES` - default to the branch's commit messages.\\n- `BLANK` - default to a blank commit message.\"\n        )\n        .optional(),\n      merge_commit_title: z\n        .enum(['PR_TITLE', 'MERGE_MESSAGE'])\n        .describe(\n          \"The default value for a merge commit title.\\n\\n  - `PR_TITLE` - default to the pull request's title.\\n  - `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).\"\n        )\n        .optional(),\n      merge_commit_message: z\n        .enum(['PR_BODY', 'PR_TITLE', 'BLANK'])\n        .describe(\n          \"The default value for a merge commit message.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `PR_BODY` - default to the pull request's body.\\n- `BLANK` - default to a blank commit message.\"\n        )\n        .optional(),\n      allow_forking: z.boolean().optional(),\n      web_commit_signoff_required: z.boolean().optional(),\n      subscribers_count: z.number().int(),\n      network_count: z.number().int(),\n      license: NullableLicenseSimpleSchema,\n      organization: NullableSimpleUserSchema.optional(),\n      parent: RepositorySchema.optional(),\n      source: RepositorySchema.optional(),\n      forks: z.number().int(),\n      master_branch: z.string().optional(),\n      open_issues: z.number().int(),\n      watchers: z.number().int(),\n      anonymous_access_enabled: z\n        .boolean()\n        .describe('Whether anonymous git access is allowed.')\n        .default(true),\n      code_of_conduct: CodeOfConductSimpleSchema.optional(),\n      security_and_analysis: SecurityAndAnalysisSchema.optional(),\n      custom_properties: z\n        .record(z.any())\n        .describe(\n          'The custom properties that were defined for the repository. The keys are the custom property names, and the values are the corresponding custom property values.'\n        )\n        .optional()\n    })\n    .describe('Full Repository')\n  export type FullRepository = z.infer<typeof FullRepositorySchema>\n\n  export const WorkflowRunSchema = z\n    .object({\n      id: z.number().int().describe('The ID of the workflow run.'),\n      name: z.string().describe('The name of the workflow run.').optional(),\n      node_id: z.string(),\n      check_suite_id: z\n        .number()\n        .int()\n        .describe('The ID of the associated check suite.')\n        .optional(),\n      check_suite_node_id: z\n        .string()\n        .describe('The node ID of the associated check suite.')\n        .optional(),\n      head_branch: z.string(),\n      head_sha: z\n        .string()\n        .describe(\n          'The SHA of the head commit that points to the version of the workflow being run.'\n        ),\n      path: z.string().describe('The full path of the workflow'),\n      run_number: z\n        .number()\n        .int()\n        .describe('The auto incrementing run number for the workflow run.'),\n      run_attempt: z\n        .number()\n        .int()\n        .describe(\n          'Attempt number of the run, 1 for first attempt and higher if the workflow was re-run.'\n        )\n        .optional(),\n      referenced_workflows: z.array(ReferencedWorkflowSchema).optional(),\n      event: z.string(),\n      status: z.string(),\n      conclusion: z.string(),\n      workflow_id: z.number().int().describe('The ID of the parent workflow.'),\n      url: z.string().describe('The URL to the workflow run.'),\n      html_url: z.string(),\n      pull_requests: z\n        .array(PullRequestMinimalSchema)\n        .describe(\n          'Pull requests that are open with a `head_sha` or `head_branch` that matches the workflow run. The returned pull requests do not necessarily indicate pull requests that triggered the run.'\n        ),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      actor: SimpleUserSchema.optional(),\n      triggering_actor: SimpleUserSchema.optional(),\n      run_started_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('The start time of the latest run. Resets on re-run.')\n        .optional(),\n      jobs_url: z\n        .string()\n        .describe('The URL to the jobs for the workflow run.'),\n      logs_url: z\n        .string()\n        .describe('The URL to download the logs for the workflow run.'),\n      check_suite_url: z\n        .string()\n        .describe('The URL to the associated check suite.'),\n      artifacts_url: z\n        .string()\n        .describe('The URL to the artifacts for the workflow run.'),\n      cancel_url: z.string().describe('The URL to cancel the workflow run.'),\n      rerun_url: z.string().describe('The URL to rerun the workflow run.'),\n      previous_attempt_url: z\n        .string()\n        .describe(\n          'The URL to the previous attempted run of this workflow, if one exists.'\n        )\n        .optional(),\n      workflow_url: z.string().describe('The URL to the workflow.'),\n      head_commit: NullableSimpleCommitSchema,\n      repository: MinimalRepositorySchema,\n      head_repository: MinimalRepositorySchema,\n      head_repository_id: z.number().int().optional(),\n      display_title: z\n        .string()\n        .describe(\n          'The event-specific title associated with the run or the run-name if set, or the value of `run-name` if it is set in the workflow.'\n        )\n    })\n    .describe('An invocation of a workflow')\n  export type WorkflowRun = z.infer<typeof WorkflowRunSchema>\n\n  export const ProtectedBranchSchema = z\n    .object({\n      url: z.string().url(),\n      required_status_checks: StatusCheckPolicySchema.optional(),\n      required_pull_request_reviews: z\n        .object({\n          url: z.string().url(),\n          dismiss_stale_reviews: z.boolean().optional(),\n          require_code_owner_reviews: z.boolean().optional(),\n          required_approving_review_count: z.number().int().optional(),\n          require_last_push_approval: z\n            .boolean()\n            .describe(\n              'Whether the most recent push must be approved by someone other than the person who pushed it.'\n            )\n            .default(false),\n          dismissal_restrictions: z\n            .object({\n              url: z.string().url(),\n              users_url: z.string().url(),\n              teams_url: z.string().url(),\n              users: z.array(SimpleUserSchema),\n              teams: z.array(TeamSchema),\n              apps: z.array(IntegrationSchema).optional()\n            })\n            .optional(),\n          bypass_pull_request_allowances: z\n            .object({\n              users: z.array(SimpleUserSchema),\n              teams: z.array(TeamSchema),\n              apps: z.array(IntegrationSchema).optional()\n            })\n            .optional()\n        })\n        .optional(),\n      required_signatures: z\n        .object({ url: z.string().url(), enabled: z.boolean() })\n        .optional(),\n      enforce_admins: z\n        .object({ url: z.string().url(), enabled: z.boolean() })\n        .strict()\n        .optional(),\n      required_linear_history: z\n        .object({ enabled: z.boolean() })\n        .strict()\n        .optional(),\n      allow_force_pushes: z\n        .object({ enabled: z.boolean() })\n        .strict()\n        .optional(),\n      allow_deletions: z.object({ enabled: z.boolean() }).strict().optional(),\n      restrictions: BranchRestrictionPolicySchema.optional(),\n      required_conversation_resolution: z\n        .object({ enabled: z.boolean().optional() })\n        .strict()\n        .optional(),\n      block_creations: z.object({ enabled: z.boolean() }).strict().optional(),\n      lock_branch: z\n        .object({ enabled: z.boolean().default(false) })\n        .strict()\n        .describe(\n          'Whether to set the branch as read-only. If this is true, users will not be able to push to the branch.'\n        )\n        .optional(),\n      allow_fork_syncing: z\n        .object({ enabled: z.boolean().default(false) })\n        .strict()\n        .describe(\n          'Whether users can pull changes from upstream when the branch is locked. Set to `true` to allow fork syncing. Set to `false` to prevent fork syncing.'\n        )\n        .optional()\n    })\n    .describe('Branch protections protect branches')\n  export type ProtectedBranch = z.infer<typeof ProtectedBranchSchema>\n\n  export const CheckSuiteSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      head_branch: z.string(),\n      head_sha: z\n        .string()\n        .describe('The SHA of the head commit that is being checked.'),\n      status: z\n        .enum([\n          'queued',\n          'in_progress',\n          'completed',\n          'waiting',\n          'requested',\n          'pending'\n        ])\n        .describe(\n          'The phase of the lifecycle that the check suite is currently in. Statuses of waiting, requested, and pending are reserved for GitHub Actions check suites.'\n        ),\n      conclusion: z.union([\n        z.literal('success'),\n        z.literal('failure'),\n        z.literal('neutral'),\n        z.literal('cancelled'),\n        z.literal('skipped'),\n        z.literal('timed_out'),\n        z.literal('action_required'),\n        z.literal('startup_failure'),\n        z.literal('stale'),\n        z.literal(null)\n      ]),\n      url: z.string(),\n      before: z.string(),\n      after: z.string(),\n      pull_requests: z.array(PullRequestMinimalSchema),\n      app: NullableIntegrationSchema,\n      repository: MinimalRepositorySchema,\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      head_commit: SimpleCommitSchema,\n      latest_check_runs_count: z.number().int(),\n      check_runs_url: z.string(),\n      rerequestable: z.boolean().optional(),\n      runs_rerequestable: z.boolean().optional()\n    })\n    .describe('A suite of checks performed on the code of a given code change')\n  export type CheckSuite = z.infer<typeof CheckSuiteSchema>\n\n  export const SecretScanningAlertSchema = z.object({\n    number: AlertNumberSchema.optional(),\n    created_at: AlertCreatedAtSchema.optional(),\n    updated_at: NullableAlertUpdatedAtSchema.optional(),\n    url: AlertUrlSchema.optional(),\n    html_url: AlertHtmlUrlSchema.optional(),\n    locations_url: z\n      .string()\n      .url()\n      .describe('The REST API URL of the code locations for this alert.')\n      .optional(),\n    state: SecretScanningAlertStateSchema.optional(),\n    resolution: SecretScanningAlertResolutionSchema.optional(),\n    resolved_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The time that the alert was resolved in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    resolved_by: NullableSimpleUserSchema.optional(),\n    resolution_comment: z\n      .string()\n      .describe('An optional comment to resolve an alert.')\n      .optional(),\n    secret_type: z\n      .string()\n      .describe('The type of secret that secret scanning detected.')\n      .optional(),\n    secret_type_display_name: z\n      .string()\n      .describe(\n        'User-friendly name for the detected secret, matching the `secret_type`.\\nFor a list of built-in patterns, see \"[Supported secret scanning patterns](https://docs.github.com/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets).\"'\n      )\n      .optional(),\n    secret: z.string().describe('The secret that was detected.').optional(),\n    push_protection_bypassed: z\n      .boolean()\n      .describe('Whether push protection was bypassed for the detected secret.')\n      .optional(),\n    push_protection_bypassed_by: NullableSimpleUserSchema.optional(),\n    push_protection_bypassed_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The time that push protection was bypassed in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    push_protection_bypass_request_reviewer:\n      NullableSimpleUserSchema.optional(),\n    push_protection_bypass_request_reviewer_comment: z\n      .string()\n      .describe('An optional comment when reviewing a push protection bypass.')\n      .optional(),\n    push_protection_bypass_request_comment: z\n      .string()\n      .describe('An optional comment when requesting a push protection bypass.')\n      .optional(),\n    push_protection_bypass_request_html_url: z\n      .string()\n      .url()\n      .describe('The URL to a push protection bypass request.')\n      .optional(),\n    validity: z\n      .enum(['active', 'inactive', 'unknown'])\n      .describe('The token status as of the latest validity check.')\n      .optional(),\n    publicly_leaked: z\n      .boolean()\n      .describe('Whether the detected secret was publicly leaked.')\n      .optional(),\n    multi_repo: z\n      .boolean()\n      .describe(\n        'Whether the detected secret was found in multiple repositories under the same organization or enterprise.'\n      )\n      .optional(),\n    is_base64_encoded: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not alert is base64 encoded'\n      )\n      .optional()\n  })\n  export type SecretScanningAlert = z.infer<typeof SecretScanningAlertSchema>\n\n  export const CommitSearchResultItemSchema = z\n    .object({\n      url: z.string().url(),\n      sha: z.string(),\n      html_url: z.string().url(),\n      comments_url: z.string().url(),\n      commit: z.object({\n        author: z.object({\n          name: z.string(),\n          email: z.string(),\n          date: z.string().datetime({ offset: true })\n        }),\n        committer: NullableGitUserSchema,\n        comment_count: z.number().int(),\n        message: z.string(),\n        tree: z.object({ sha: z.string(), url: z.string().url() }),\n        url: z.string().url(),\n        verification: VerificationSchema.optional()\n      }),\n      author: NullableSimpleUserSchema,\n      committer: NullableGitUserSchema,\n      parents: z.array(\n        z.object({\n          url: z.string().optional(),\n          html_url: z.string().optional(),\n          sha: z.string().optional()\n        })\n      ),\n      repository: MinimalRepositorySchema,\n      score: z.number(),\n      node_id: z.string(),\n      text_matches: SearchResultTextMatchesSchema.optional()\n    })\n    .describe('Commit Search Result Item')\n  export type CommitSearchResultItem = z.infer<\n    typeof CommitSearchResultItemSchema\n  >\n\n  export const RepositoryAdvisorySchema = z\n    .object({\n      ghsa_id: z\n        .string()\n        .describe('The GitHub Security Advisory ID.')\n        .readonly(),\n      cve_id: z\n        .string()\n        .describe('The Common Vulnerabilities and Exposures (CVE) ID.'),\n      url: z\n        .string()\n        .url()\n        .describe('The API URL for the advisory.')\n        .readonly(),\n      html_url: z\n        .string()\n        .url()\n        .describe('The URL for the advisory.')\n        .readonly(),\n      summary: z\n        .string()\n        .max(1024)\n        .describe('A short summary of the advisory.'),\n      description: z\n        .string()\n        .max(65_535)\n        .describe('A detailed description of what the advisory entails.'),\n      severity: z\n        .enum(['critical', 'high', 'medium', 'low'])\n        .describe('The severity of the advisory.'),\n      author: SimpleUserSchema.describe(\n        'The author of the advisory.'\n      ).readonly(),\n      publisher: SimpleUserSchema.describe(\n        'The publisher of the advisory.'\n      ).readonly(),\n      identifiers: z\n        .array(\n          z.object({\n            type: z.enum(['CVE', 'GHSA']).describe('The type of identifier.'),\n            value: z.string().describe('The identifier value.')\n          })\n        )\n        .readonly(),\n      state: z\n        .enum(['published', 'closed', 'withdrawn', 'draft', 'triage'])\n        .describe('The state of the advisory.'),\n      created_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was created, in ISO 8601 format.'\n        )\n        .readonly(),\n      updated_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was last updated, in ISO 8601 format.'\n        )\n        .readonly(),\n      published_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was published, in ISO 8601 format.'\n        )\n        .readonly(),\n      closed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was closed, in ISO 8601 format.'\n        )\n        .readonly(),\n      withdrawn_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The date and time of when the advisory was withdrawn, in ISO 8601 format.'\n        )\n        .readonly(),\n      submission: z\n        .object({\n          accepted: z\n            .boolean()\n            .describe(\n              \"Whether a private vulnerability report was accepted by the repository's administrators.\"\n            )\n            .readonly()\n        })\n        .readonly(),\n      vulnerabilities: z.array(RepositoryAdvisoryVulnerabilitySchema),\n      cvss: z.object({\n        vector_string: z.string().describe('The CVSS vector.'),\n        score: z.number().gte(0).lte(10).describe('The CVSS score.').readonly()\n      }),\n      cvss_severities: CvssSeveritiesSchema.optional(),\n      cwes: z\n        .array(\n          z.object({\n            cwe_id: z\n              .string()\n              .describe('The Common Weakness Enumeration (CWE) identifier.'),\n            name: z.string().describe('The name of the CWE.').readonly()\n          })\n        )\n        .readonly(),\n      cwe_ids: z.array(z.string()).describe('A list of only the CWE IDs.'),\n      credits: z.array(\n        z.object({\n          login: z\n            .string()\n            .describe('The username of the user credited.')\n            .optional(),\n          type: SecurityAdvisoryCreditTypesSchema.optional()\n        })\n      ),\n      credits_detailed: z.array(RepositoryAdvisoryCreditSchema).readonly(),\n      collaborating_users: z\n        .array(SimpleUserSchema)\n        .describe('A list of users that collaborate on the advisory.'),\n      collaborating_teams: z\n        .array(TeamSchema)\n        .describe('A list of teams that collaborate on the advisory.'),\n      private_fork: SimpleRepositorySchema.describe(\n        \"A temporary private fork of the advisory's repository for collaborating on a fix.\"\n      ).readonly()\n    })\n    .strict()\n    .describe('A repository security advisory.')\n  export type RepositoryAdvisory = z.infer<typeof RepositoryAdvisorySchema>\n\n  export const BranchProtectionSchema = z\n    .object({\n      url: z.string().optional(),\n      enabled: z.boolean().optional(),\n      required_status_checks:\n        ProtectedBranchRequiredStatusCheckSchema.optional(),\n      enforce_admins: ProtectedBranchAdminEnforcedSchema.optional(),\n      required_pull_request_reviews:\n        ProtectedBranchPullRequestReviewSchema.optional(),\n      restrictions: BranchRestrictionPolicySchema.optional(),\n      required_linear_history: z\n        .object({ enabled: z.boolean().optional() })\n        .optional(),\n      allow_force_pushes: z\n        .object({ enabled: z.boolean().optional() })\n        .optional(),\n      allow_deletions: z.object({ enabled: z.boolean().optional() }).optional(),\n      block_creations: z.object({ enabled: z.boolean().optional() }).optional(),\n      required_conversation_resolution: z\n        .object({ enabled: z.boolean().optional() })\n        .optional(),\n      name: z.string().optional(),\n      protection_url: z.string().optional(),\n      required_signatures: z\n        .object({ url: z.string().url(), enabled: z.boolean() })\n        .optional(),\n      lock_branch: z\n        .object({ enabled: z.boolean().default(false) })\n        .describe(\n          'Whether to set the branch as read-only. If this is true, users will not be able to push to the branch.'\n        )\n        .optional(),\n      allow_fork_syncing: z\n        .object({ enabled: z.boolean().default(false) })\n        .describe(\n          'Whether users can pull changes from upstream when the branch is locked. Set to `true` to allow fork syncing. Set to `false` to prevent fork syncing.'\n        )\n        .optional()\n    })\n    .describe('Branch Protection')\n  export type BranchProtection = z.infer<typeof BranchProtectionSchema>\n\n  export const PullRequestSchema = z\n    .object({\n      url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      html_url: z.string().url(),\n      diff_url: z.string().url(),\n      patch_url: z.string().url(),\n      issue_url: z.string().url(),\n      commits_url: z.string().url(),\n      review_comments_url: z.string().url(),\n      review_comment_url: z.string(),\n      comments_url: z.string().url(),\n      statuses_url: z.string().url(),\n      number: z\n        .number()\n        .int()\n        .describe(\n          'Number uniquely identifying the pull request within its repository.'\n        ),\n      state: z\n        .enum(['open', 'closed'])\n        .describe('State of this Pull Request. Either `open` or `closed`.'),\n      locked: z.boolean(),\n      title: z.string().describe('The title of the pull request.'),\n      user: SimpleUserSchema,\n      body: z.string(),\n      labels: z.array(\n        z.object({\n          id: z.number().int(),\n          node_id: z.string(),\n          url: z.string(),\n          name: z.string(),\n          description: z.string(),\n          color: z.string(),\n          default: z.boolean()\n        })\n      ),\n      milestone: NullableMilestoneSchema,\n      active_lock_reason: z.string().optional(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      closed_at: z.string().datetime({ offset: true }),\n      merged_at: z.string().datetime({ offset: true }),\n      merge_commit_sha: z.string(),\n      assignee: NullableSimpleUserSchema,\n      assignees: z.array(SimpleUserSchema).optional(),\n      requested_reviewers: z.array(SimpleUserSchema).optional(),\n      requested_teams: z.array(TeamSimpleSchema).optional(),\n      head: z.object({\n        label: z.string(),\n        ref: z.string(),\n        repo: RepositorySchema,\n        sha: z.string(),\n        user: SimpleUserSchema\n      }),\n      base: z.object({\n        label: z.string(),\n        ref: z.string(),\n        repo: RepositorySchema,\n        sha: z.string(),\n        user: SimpleUserSchema\n      }),\n      _links: z.object({\n        comments: LinkSchema,\n        commits: LinkSchema,\n        statuses: LinkSchema,\n        html: LinkSchema,\n        issue: LinkSchema,\n        review_comments: LinkSchema,\n        review_comment: LinkSchema,\n        self: LinkSchema\n      }),\n      author_association: AuthorAssociationSchema,\n      auto_merge: AutoMergeSchema,\n      draft: z\n        .boolean()\n        .describe('Indicates whether or not the pull request is a draft.')\n        .optional(),\n      merged: z.boolean(),\n      mergeable: z.boolean(),\n      rebaseable: z.boolean().optional(),\n      mergeable_state: z.string(),\n      merged_by: NullableSimpleUserSchema,\n      comments: z.number().int(),\n      review_comments: z.number().int(),\n      maintainer_can_modify: z\n        .boolean()\n        .describe('Indicates whether maintainers can modify the pull request.'),\n      commits: z.number().int(),\n      additions: z.number().int(),\n      deletions: z.number().int(),\n      changed_files: z.number().int()\n    })\n    .describe(\n      \"Pull requests let you tell others about changes you've pushed to a repository on GitHub. Once a pull request is sent, interested parties can review the set of changes, discuss potential modifications, and even push follow-up commits if necessary.\"\n    )\n  export type PullRequest = z.infer<typeof PullRequestSchema>\n\n  export const CodespaceWithFullRepositorySchema = z\n    .object({\n      id: z.number().int(),\n      name: z\n        .string()\n        .describe('Automatically generated name of this codespace.'),\n      display_name: z\n        .string()\n        .describe('Display name for this codespace.')\n        .optional(),\n      environment_id: z\n        .string()\n        .describe(\"UUID identifying this codespace's environment.\"),\n      owner: SimpleUserSchema,\n      billable_owner: SimpleUserSchema,\n      repository: FullRepositorySchema,\n      machine: NullableCodespaceMachineSchema,\n      devcontainer_path: z\n        .string()\n        .describe(\n          'Path to devcontainer.json from repo root used to create Codespace.'\n        )\n        .optional(),\n      prebuild: z\n        .boolean()\n        .describe('Whether the codespace was created from a prebuild.'),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      last_used_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe('Last known time this codespace was started.'),\n      state: z\n        .enum([\n          'Unknown',\n          'Created',\n          'Queued',\n          'Provisioning',\n          'Available',\n          'Awaiting',\n          'Unavailable',\n          'Deleted',\n          'Moved',\n          'Shutdown',\n          'Archived',\n          'Starting',\n          'ShuttingDown',\n          'Failed',\n          'Exporting',\n          'Updating',\n          'Rebuilding'\n        ])\n        .describe('State of this codespace.'),\n      url: z.string().url().describe('API URL for this codespace.'),\n      git_status: z\n        .object({\n          ahead: z\n            .number()\n            .int()\n            .describe(\n              'The number of commits the local repository is ahead of the remote.'\n            )\n            .optional(),\n          behind: z\n            .number()\n            .int()\n            .describe(\n              'The number of commits the local repository is behind the remote.'\n            )\n            .optional(),\n          has_unpushed_changes: z\n            .boolean()\n            .describe('Whether the local repository has unpushed changes.')\n            .optional(),\n          has_uncommitted_changes: z\n            .boolean()\n            .describe('Whether the local repository has uncommitted changes.')\n            .optional(),\n          ref: z\n            .string()\n            .describe(\n              'The current branch (or SHA if in detached HEAD state) of the local repository.'\n            )\n            .optional()\n        })\n        .describe(\"Details about the codespace's git repository.\"),\n      location: z\n        .enum(['EastUs', 'SouthEastAsia', 'WestEurope', 'WestUs2'])\n        .describe('The initally assigned location of a new codespace.'),\n      idle_timeout_minutes: z\n        .number()\n        .int()\n        .describe(\n          'The number of minutes of inactivity after which this codespace will be automatically stopped.'\n        ),\n      web_url: z\n        .string()\n        .url()\n        .describe('URL to access this codespace on the web.'),\n      machines_url: z\n        .string()\n        .url()\n        .describe(\n          'API URL to access available alternate machine types for this codespace.'\n        ),\n      start_url: z.string().url().describe('API URL to start this codespace.'),\n      stop_url: z.string().url().describe('API URL to stop this codespace.'),\n      publish_url: z\n        .string()\n        .url()\n        .describe('API URL to publish this codespace to a new repository.')\n        .optional(),\n      pulls_url: z\n        .string()\n        .url()\n        .describe(\n          'API URL for the Pull Request associated with this codespace, if any.'\n        ),\n      recent_folders: z.array(z.string()),\n      runtime_constraints: z\n        .object({\n          allowed_port_privacy_settings: z\n            .array(z.string())\n            .describe(\n              'The privacy settings a user can select from when forwarding a port.'\n            )\n            .optional()\n        })\n        .optional(),\n      pending_operation: z\n        .boolean()\n        .describe(\n          'Whether or not a codespace has a pending async operation. This would mean that the codespace is temporarily unavailable. The only thing that you can do with a codespace in this state is delete it.'\n        )\n        .optional(),\n      pending_operation_disabled_reason: z\n        .string()\n        .describe(\n          'Text to show user when codespace is disabled by a pending operation'\n        )\n        .optional(),\n      idle_timeout_notice: z\n        .string()\n        .describe(\n          'Text to show user when codespace idle timeout minutes has been overriden by an organization policy'\n        )\n        .optional(),\n      retention_period_minutes: z\n        .number()\n        .int()\n        .describe(\n          'Duration in minutes after codespace has gone idle in which it will be deleted. Must be integer minutes between 0 and 43200 (30 days).'\n        )\n        .optional(),\n      retention_expires_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'When a codespace will be auto-deleted based on the \"retention_period_minutes\" and \"last_used_at\"'\n        )\n        .optional()\n    })\n    .describe('A codespace.')\n  export type CodespaceWithFullRepository = z.infer<\n    typeof CodespaceWithFullRepositorySchema\n  >\n\n  export const OrganizationSecretScanningAlertSchema = z.object({\n    number: AlertNumberSchema.optional(),\n    created_at: AlertCreatedAtSchema.optional(),\n    updated_at: NullableAlertUpdatedAtSchema.optional(),\n    url: AlertUrlSchema.optional(),\n    html_url: AlertHtmlUrlSchema.optional(),\n    locations_url: z\n      .string()\n      .url()\n      .describe('The REST API URL of the code locations for this alert.')\n      .optional(),\n    state: SecretScanningAlertStateSchema.optional(),\n    resolution: SecretScanningAlertResolutionSchema.optional(),\n    resolved_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The time that the alert was resolved in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    resolved_by: NullableSimpleUserSchema.optional(),\n    secret_type: z\n      .string()\n      .describe('The type of secret that secret scanning detected.')\n      .optional(),\n    secret_type_display_name: z\n      .string()\n      .describe(\n        'User-friendly name for the detected secret, matching the `secret_type`.\\nFor a list of built-in patterns, see \"[Supported secret scanning patterns](https://docs.github.com/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets).\"'\n      )\n      .optional(),\n    secret: z.string().describe('The secret that was detected.').optional(),\n    repository: SimpleRepositorySchema.optional(),\n    push_protection_bypassed: z\n      .boolean()\n      .describe('Whether push protection was bypassed for the detected secret.')\n      .optional(),\n    push_protection_bypassed_by: NullableSimpleUserSchema.optional(),\n    push_protection_bypassed_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The time that push protection was bypassed in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    push_protection_bypass_request_reviewer:\n      NullableSimpleUserSchema.optional(),\n    push_protection_bypass_request_reviewer_comment: z\n      .string()\n      .describe('An optional comment when reviewing a push protection bypass.')\n      .optional(),\n    push_protection_bypass_request_comment: z\n      .string()\n      .describe('An optional comment when requesting a push protection bypass.')\n      .optional(),\n    push_protection_bypass_request_html_url: z\n      .string()\n      .url()\n      .describe('The URL to a push protection bypass request.')\n      .optional(),\n    resolution_comment: z\n      .string()\n      .describe(\n        'The comment that was optionally added when this alert was closed'\n      )\n      .optional(),\n    validity: z\n      .enum(['active', 'inactive', 'unknown'])\n      .describe('The token status as of the latest validity check.')\n      .optional(),\n    publicly_leaked: z\n      .boolean()\n      .describe('Whether the secret was publicly leaked.')\n      .optional(),\n    multi_repo: z\n      .boolean()\n      .describe(\n        'Whether the detected secret was found in multiple repositories in the same organization or enterprise.'\n      )\n      .optional(),\n    is_base64_encoded: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not alert is base64 encoded'\n      )\n      .optional()\n  })\n  export type OrganizationSecretScanningAlert = z.infer<\n    typeof OrganizationSecretScanningAlertSchema\n  >\n\n  export const ShortBranchSchema = z\n    .object({\n      name: z.string(),\n      commit: z.object({ sha: z.string(), url: z.string().url() }),\n      protected: z.boolean(),\n      protection: BranchProtectionSchema.optional(),\n      protection_url: z.string().url().optional()\n    })\n    .describe('Short Branch')\n  export type ShortBranch = z.infer<typeof ShortBranchSchema>\n\n  export const PullRequestSimpleSchema = z\n    .object({\n      url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      html_url: z.string().url(),\n      diff_url: z.string().url(),\n      patch_url: z.string().url(),\n      issue_url: z.string().url(),\n      commits_url: z.string().url(),\n      review_comments_url: z.string().url(),\n      review_comment_url: z.string(),\n      comments_url: z.string().url(),\n      statuses_url: z.string().url(),\n      number: z.number().int(),\n      state: z.string(),\n      locked: z.boolean(),\n      title: z.string(),\n      user: NullableSimpleUserSchema,\n      body: z.string(),\n      labels: z.array(\n        z.object({\n          id: z.number().int(),\n          node_id: z.string(),\n          url: z.string(),\n          name: z.string(),\n          description: z.string(),\n          color: z.string(),\n          default: z.boolean()\n        })\n      ),\n      milestone: NullableMilestoneSchema,\n      active_lock_reason: z.string().optional(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      closed_at: z.string().datetime({ offset: true }),\n      merged_at: z.string().datetime({ offset: true }),\n      merge_commit_sha: z.string(),\n      assignee: NullableSimpleUserSchema,\n      assignees: z.array(SimpleUserSchema).optional(),\n      requested_reviewers: z.array(SimpleUserSchema).optional(),\n      requested_teams: z.array(TeamSchema).optional(),\n      head: z.object({\n        label: z.string(),\n        ref: z.string(),\n        repo: RepositorySchema,\n        sha: z.string(),\n        user: NullableSimpleUserSchema\n      }),\n      base: z.object({\n        label: z.string(),\n        ref: z.string(),\n        repo: RepositorySchema,\n        sha: z.string(),\n        user: NullableSimpleUserSchema\n      }),\n      _links: z.object({\n        comments: LinkSchema,\n        commits: LinkSchema,\n        statuses: LinkSchema,\n        html: LinkSchema,\n        issue: LinkSchema,\n        review_comments: LinkSchema,\n        review_comment: LinkSchema,\n        self: LinkSchema\n      }),\n      author_association: AuthorAssociationSchema,\n      auto_merge: AutoMergeSchema,\n      draft: z\n        .boolean()\n        .describe('Indicates whether or not the pull request is a draft.')\n        .optional()\n    })\n    .describe('Pull Request Simple')\n  export type PullRequestSimple = z.infer<typeof PullRequestSimpleSchema>\n\n  export const IssueSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the issue'),\n      repository_url: z.string().url(),\n      labels_url: z.string(),\n      comments_url: z.string().url(),\n      events_url: z.string().url(),\n      html_url: z.string().url(),\n      number: z\n        .number()\n        .int()\n        .describe(\n          'Number uniquely identifying the issue within its repository'\n        ),\n      state: z\n        .string()\n        .describe(\"State of the issue; either 'open' or 'closed'\"),\n      state_reason: z\n        .enum(['completed', 'reopened', 'not_planned'])\n        .describe('The reason for the current state')\n        .optional(),\n      title: z.string().describe('Title of the issue'),\n      body: z.string().describe('Contents of the issue').optional(),\n      user: NullableSimpleUserSchema,\n      labels: z\n        .array(\n          z.union([\n            z.string(),\n            z.object({\n              id: z.number().int().optional(),\n              node_id: z.string().optional(),\n              url: z.string().url().optional(),\n              name: z.string().optional(),\n              description: z.string().optional(),\n              color: z.string().optional(),\n              default: z.boolean().optional()\n            })\n          ])\n        )\n        .describe(\n          'Labels to associate with this issue; pass one or more label names to replace the set of labels on this issue; send an empty array to clear all labels from the issue; note that the labels are silently dropped for users without push access to the repository'\n        ),\n      assignee: NullableSimpleUserSchema,\n      assignees: z.array(SimpleUserSchema).optional(),\n      milestone: NullableMilestoneSchema,\n      locked: z.boolean(),\n      active_lock_reason: z.string().optional(),\n      comments: z.number().int(),\n      pull_request: z\n        .object({\n          merged_at: z.string().datetime({ offset: true }).optional(),\n          diff_url: z.string().url(),\n          html_url: z.string().url(),\n          patch_url: z.string().url(),\n          url: z.string().url()\n        })\n        .optional(),\n      closed_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      draft: z.boolean().optional(),\n      closed_by: NullableSimpleUserSchema.optional(),\n      body_html: z.string().optional(),\n      body_text: z.string().optional(),\n      timeline_url: z.string().url().optional(),\n      type: IssueTypeSchema.optional(),\n      repository: RepositorySchema.optional(),\n      performed_via_github_app: NullableIntegrationSchema.optional(),\n      author_association: AuthorAssociationSchema,\n      reactions: ReactionRollupSchema.optional(),\n      sub_issues_summary: SubIssuesSummarySchema.optional()\n    })\n    .describe(\n      'Issues are a great way to keep track of tasks, enhancements, and bugs for your projects.'\n    )\n  export type Issue = z.infer<typeof IssueSchema>\n\n  export const NullableIssueSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url().describe('URL for the issue'),\n      repository_url: z.string().url(),\n      labels_url: z.string(),\n      comments_url: z.string().url(),\n      events_url: z.string().url(),\n      html_url: z.string().url(),\n      number: z\n        .number()\n        .int()\n        .describe(\n          'Number uniquely identifying the issue within its repository'\n        ),\n      state: z\n        .string()\n        .describe(\"State of the issue; either 'open' or 'closed'\"),\n      state_reason: z\n        .enum(['completed', 'reopened', 'not_planned'])\n        .describe('The reason for the current state')\n        .optional(),\n      title: z.string().describe('Title of the issue'),\n      body: z.string().describe('Contents of the issue').optional(),\n      user: NullableSimpleUserSchema,\n      labels: z\n        .array(\n          z.union([\n            z.string(),\n            z.object({\n              id: z.number().int().optional(),\n              node_id: z.string().optional(),\n              url: z.string().url().optional(),\n              name: z.string().optional(),\n              description: z.string().optional(),\n              color: z.string().optional(),\n              default: z.boolean().optional()\n            })\n          ])\n        )\n        .describe(\n          'Labels to associate with this issue; pass one or more label names to replace the set of labels on this issue; send an empty array to clear all labels from the issue; note that the labels are silently dropped for users without push access to the repository'\n        ),\n      assignee: NullableSimpleUserSchema,\n      assignees: z.array(SimpleUserSchema).optional(),\n      milestone: NullableMilestoneSchema,\n      locked: z.boolean(),\n      active_lock_reason: z.string().optional(),\n      comments: z.number().int(),\n      pull_request: z\n        .object({\n          merged_at: z.string().datetime({ offset: true }).optional(),\n          diff_url: z.string().url(),\n          html_url: z.string().url(),\n          patch_url: z.string().url(),\n          url: z.string().url()\n        })\n        .optional(),\n      closed_at: z.string().datetime({ offset: true }),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      draft: z.boolean().optional(),\n      closed_by: NullableSimpleUserSchema.optional(),\n      body_html: z.string().optional(),\n      body_text: z.string().optional(),\n      timeline_url: z.string().url().optional(),\n      type: IssueTypeSchema.optional(),\n      repository: RepositorySchema.optional(),\n      performed_via_github_app: NullableIntegrationSchema.optional(),\n      author_association: AuthorAssociationSchema,\n      reactions: ReactionRollupSchema.optional(),\n      sub_issues_summary: SubIssuesSummarySchema.optional()\n    })\n    .describe(\n      'Issues are a great way to keep track of tasks, enhancements, and bugs for your projects.'\n    )\n  export type NullableIssue = z.infer<typeof NullableIssueSchema>\n\n  export const IssueSearchResultItemSchema = z\n    .object({\n      url: z.string().url(),\n      repository_url: z.string().url(),\n      labels_url: z.string(),\n      comments_url: z.string().url(),\n      events_url: z.string().url(),\n      html_url: z.string().url(),\n      id: z.number().int(),\n      node_id: z.string(),\n      number: z.number().int(),\n      title: z.string(),\n      locked: z.boolean(),\n      active_lock_reason: z.string().optional(),\n      assignees: z.array(SimpleUserSchema).optional(),\n      user: NullableSimpleUserSchema,\n      labels: z.array(\n        z.object({\n          id: z.number().int().optional(),\n          node_id: z.string().optional(),\n          url: z.string().optional(),\n          name: z.string().optional(),\n          color: z.string().optional(),\n          default: z.boolean().optional(),\n          description: z.string().optional()\n        })\n      ),\n      sub_issues_summary: z\n        .object({\n          total: z.number().int(),\n          completed: z.number().int(),\n          percent_completed: z.number().int()\n        })\n        .optional(),\n      state: z.string(),\n      state_reason: z.string().optional(),\n      assignee: NullableSimpleUserSchema,\n      milestone: NullableMilestoneSchema,\n      comments: z.number().int(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      closed_at: z.string().datetime({ offset: true }),\n      text_matches: SearchResultTextMatchesSchema.optional(),\n      pull_request: z\n        .object({\n          merged_at: z.string().datetime({ offset: true }).optional(),\n          diff_url: z.string().url(),\n          html_url: z.string().url(),\n          patch_url: z.string().url(),\n          url: z.string().url()\n        })\n        .optional(),\n      body: z.string().optional(),\n      score: z.number(),\n      author_association: AuthorAssociationSchema,\n      draft: z.boolean().optional(),\n      repository: RepositorySchema.optional(),\n      body_html: z.string().optional(),\n      body_text: z.string().optional(),\n      timeline_url: z.string().url().optional(),\n      type: IssueTypeSchema.optional(),\n      performed_via_github_app: NullableIntegrationSchema.optional(),\n      reactions: ReactionRollupSchema.optional()\n    })\n    .describe('Issue Search Result Item')\n  export type IssueSearchResultItem = z.infer<\n    typeof IssueSearchResultItemSchema\n  >\n\n  export const CodeScanningAnalysisSchema = z.object({\n    ref: CodeScanningRefSchema,\n    commit_sha: CodeScanningAnalysisCommitShaSchema,\n    analysis_key: CodeScanningAnalysisAnalysisKeySchema,\n    environment: CodeScanningAnalysisEnvironmentSchema,\n    category: CodeScanningAnalysisCategorySchema.optional(),\n    error: z.string(),\n    created_at: CodeScanningAnalysisCreatedAtSchema,\n    results_count: z\n      .number()\n      .int()\n      .describe('The total number of results in the analysis.'),\n    rules_count: z\n      .number()\n      .int()\n      .describe('The total number of rules used in the analysis.'),\n    id: z.number().int().describe('Unique identifier for this analysis.'),\n    url: CodeScanningAnalysisUrlSchema,\n    sarif_id: CodeScanningAnalysisSarifIdSchema,\n    tool: CodeScanningAnalysisToolSchema,\n    deletable: z.boolean(),\n    warning: z\n      .string()\n      .describe('Warning generated when processing the analysis')\n  })\n  export type CodeScanningAnalysis = z.infer<typeof CodeScanningAnalysisSchema>\n\n  export const TimelineCrossReferencedEventSchema = z\n    .object({\n      event: z.string(),\n      actor: SimpleUserSchema.optional(),\n      created_at: z.string().datetime({ offset: true }),\n      updated_at: z.string().datetime({ offset: true }),\n      source: z.object({\n        type: z.string().optional(),\n        issue: IssueSchema.optional()\n      })\n    })\n    .describe('Timeline Cross Referenced Event')\n  export type TimelineCrossReferencedEvent = z.infer<\n    typeof TimelineCrossReferencedEventSchema\n  >\n\n  export const SecretScanningLocationSchema = z.object({\n    type: z\n      .enum([\n        'commit',\n        'wiki_commit',\n        'issue_title',\n        'issue_body',\n        'issue_comment',\n        'discussion_title',\n        'discussion_body',\n        'discussion_comment',\n        'pull_request_title',\n        'pull_request_body',\n        'pull_request_comment',\n        'pull_request_review',\n        'pull_request_review_comment'\n      ])\n      .describe(\n        'The location type. Because secrets may be found in different types of resources (ie. code, comments, issues, pull requests, discussions), this field identifies the type of resource where the secret was found.'\n      )\n      .optional(),\n    details: z\n      .union([\n        SecretScanningLocationCommitSchema,\n        SecretScanningLocationWikiCommitSchema,\n        SecretScanningLocationIssueTitleSchema,\n        SecretScanningLocationIssueBodySchema,\n        SecretScanningLocationIssueCommentSchema,\n        SecretScanningLocationDiscussionTitleSchema,\n        SecretScanningLocationDiscussionBodySchema,\n        SecretScanningLocationDiscussionCommentSchema,\n        SecretScanningLocationPullRequestTitleSchema,\n        SecretScanningLocationPullRequestBodySchema,\n        SecretScanningLocationPullRequestCommentSchema,\n        SecretScanningLocationPullRequestReviewSchema,\n        SecretScanningLocationPullRequestReviewCommentSchema\n      ])\n      .optional()\n  })\n  export type SecretScanningLocation = z.infer<\n    typeof SecretScanningLocationSchema\n  >\n\n  export const DependabotAlertSchema = z\n    .object({\n      number: AlertNumberSchema,\n      state: z\n        .enum(['auto_dismissed', 'dismissed', 'fixed', 'open'])\n        .describe('The state of the Dependabot alert.')\n        .readonly(),\n      dependency: z\n        .object({\n          package: DependabotAlertPackageSchema.optional(),\n          manifest_path: z\n            .string()\n            .describe(\n              'The full path to the dependency manifest file, relative to the root of the repository.'\n            )\n            .readonly()\n            .optional(),\n          scope: z\n            .enum(['development', 'runtime'])\n            .describe('The execution scope of the vulnerable dependency.')\n            .readonly()\n            .optional(),\n          relationship: z\n            .enum(['unknown', 'direct', 'transitive'])\n            .describe(\n              'The vulnerable dependency\\'s relationship to your project.\\n\\n> [!NOTE]\\n> We are rolling out support for dependency relationship across ecosystems. This value will be \"unknown\" for all dependencies in unsupported ecosystems.\\n'\n            )\n            .readonly()\n            .optional()\n        })\n        .describe('Details for the vulnerable dependency.')\n        .readonly(),\n      security_advisory: DependabotAlertSecurityAdvisorySchema,\n      security_vulnerability: DependabotAlertSecurityVulnerabilitySchema,\n      url: AlertUrlSchema,\n      html_url: AlertHtmlUrlSchema,\n      created_at: AlertCreatedAtSchema,\n      updated_at: AlertUpdatedAtSchema,\n      dismissed_at: AlertDismissedAtSchema,\n      dismissed_by: NullableSimpleUserSchema,\n      dismissed_reason: z\n        .enum([\n          'fix_started',\n          'inaccurate',\n          'no_bandwidth',\n          'not_used',\n          'tolerable_risk'\n        ])\n        .describe('The reason that the alert was dismissed.'),\n      dismissed_comment: z\n        .string()\n        .max(280)\n        .describe(\"An optional comment associated with the alert's dismissal.\"),\n      fixed_at: AlertFixedAtSchema,\n      auto_dismissed_at: AlertAutoDismissedAtSchema.optional()\n    })\n    .strict()\n    .describe('A Dependabot alert.')\n  export type DependabotAlert = z.infer<typeof DependabotAlertSchema>\n\n  export const BranchWithProtectionSchema = z\n    .object({\n      name: z.string(),\n      commit: CommitSchema,\n      _links: z.object({ html: z.string(), self: z.string().url() }),\n      protected: z.boolean(),\n      protection: BranchProtectionSchema,\n      protection_url: z.string().url(),\n      pattern: z.string().optional(),\n      required_approving_review_count: z.number().int().optional()\n    })\n    .describe('Branch With Protection')\n  export type BranchWithProtection = z.infer<typeof BranchWithProtectionSchema>\n\n  export const DependabotAlertWithRepositorySchema = z\n    .object({\n      number: AlertNumberSchema,\n      state: z\n        .enum(['auto_dismissed', 'dismissed', 'fixed', 'open'])\n        .describe('The state of the Dependabot alert.')\n        .readonly(),\n      dependency: z\n        .object({\n          package: DependabotAlertPackageSchema.optional(),\n          manifest_path: z\n            .string()\n            .describe(\n              'The full path to the dependency manifest file, relative to the root of the repository.'\n            )\n            .readonly()\n            .optional(),\n          scope: z\n            .enum(['development', 'runtime'])\n            .describe('The execution scope of the vulnerable dependency.')\n            .readonly()\n            .optional(),\n          relationship: z\n            .enum(['unknown', 'direct', 'transitive'])\n            .describe(\n              'The vulnerable dependency\\'s relationship to your project.\\n\\n> [!NOTE]\\n> We are rolling out support for dependency relationship across ecosystems. This value will be \"unknown\" for all dependencies in unsupported ecosystems.\\n'\n            )\n            .readonly()\n            .optional()\n        })\n        .describe('Details for the vulnerable dependency.')\n        .readonly(),\n      security_advisory: DependabotAlertSecurityAdvisorySchema,\n      security_vulnerability: DependabotAlertSecurityVulnerabilitySchema,\n      url: AlertUrlSchema,\n      html_url: AlertHtmlUrlSchema,\n      created_at: AlertCreatedAtSchema,\n      updated_at: AlertUpdatedAtSchema,\n      dismissed_at: AlertDismissedAtSchema,\n      dismissed_by: NullableSimpleUserSchema,\n      dismissed_reason: z\n        .enum([\n          'fix_started',\n          'inaccurate',\n          'no_bandwidth',\n          'not_used',\n          'tolerable_risk'\n        ])\n        .describe('The reason that the alert was dismissed.'),\n      dismissed_comment: z\n        .string()\n        .max(280)\n        .describe(\"An optional comment associated with the alert's dismissal.\"),\n      fixed_at: AlertFixedAtSchema,\n      auto_dismissed_at: AlertAutoDismissedAtSchema.optional(),\n      repository: SimpleRepositorySchema\n    })\n    .strict()\n    .describe('A Dependabot alert.')\n  export type DependabotAlertWithRepository = z.infer<\n    typeof DependabotAlertWithRepositorySchema\n  >\n\n  export const IssueEventSchema = z\n    .object({\n      id: z.number().int(),\n      node_id: z.string(),\n      url: z.string().url(),\n      actor: NullableSimpleUserSchema,\n      event: z.string(),\n      commit_id: z.string(),\n      commit_url: z.string(),\n      created_at: z.string().datetime({ offset: true }),\n      issue: NullableIssueSchema.optional(),\n      label: IssueEventLabelSchema.optional(),\n      assignee: NullableSimpleUserSchema.optional(),\n      assigner: NullableSimpleUserSchema.optional(),\n      review_requester: NullableSimpleUserSchema.optional(),\n      requested_reviewer: NullableSimpleUserSchema.optional(),\n      requested_team: TeamSchema.optional(),\n      dismissed_review: IssueEventDismissedReviewSchema.optional(),\n      milestone: IssueEventMilestoneSchema.optional(),\n      project_card: IssueEventProjectCardSchema.optional(),\n      rename: IssueEventRenameSchema.optional(),\n      author_association: AuthorAssociationSchema.optional(),\n      lock_reason: z.string().optional(),\n      performed_via_github_app: NullableIntegrationSchema.optional()\n    })\n    .describe('Issue Event')\n  export type IssueEvent = z.infer<typeof IssueEventSchema>\n\n  export const IssueEventForIssueSchema = z\n    .union([\n      LabeledIssueEventSchema,\n      UnlabeledIssueEventSchema,\n      AssignedIssueEventSchema,\n      UnassignedIssueEventSchema,\n      MilestonedIssueEventSchema,\n      DemilestonedIssueEventSchema,\n      RenamedIssueEventSchema,\n      ReviewRequestedIssueEventSchema,\n      ReviewRequestRemovedIssueEventSchema,\n      ReviewDismissedIssueEventSchema,\n      LockedIssueEventSchema,\n      AddedToProjectIssueEventSchema,\n      MovedColumnInProjectIssueEventSchema,\n      RemovedFromProjectIssueEventSchema,\n      ConvertedNoteToIssueIssueEventSchema\n    ])\n    .describe('Issue Event for Issue')\n  export type IssueEventForIssue = z.infer<typeof IssueEventForIssueSchema>\n\n  export const RepositoryRuleSchema = z\n    .record(z.any())\n    .and(\n      z.union([\n        RepositoryRuleCreationSchema,\n        RepositoryRuleUpdateSchema,\n        RepositoryRuleDeletionSchema,\n        RepositoryRuleRequiredLinearHistorySchema,\n        RepositoryRuleMergeQueueSchema,\n        RepositoryRuleRequiredDeploymentsSchema,\n        RepositoryRuleRequiredSignaturesSchema,\n        RepositoryRulePullRequestSchema,\n        RepositoryRuleRequiredStatusChecksSchema,\n        RepositoryRuleNonFastForwardSchema,\n        RepositoryRuleCommitMessagePatternSchema,\n        RepositoryRuleCommitAuthorEmailPatternSchema,\n        RepositoryRuleCommitterEmailPatternSchema,\n        RepositoryRuleBranchNamePatternSchema,\n        RepositoryRuleTagNamePatternSchema,\n        RepositoryRuleFilePathRestrictionSchema,\n        RepositoryRuleMaxFilePathLengthSchema,\n        RepositoryRuleFileExtensionRestrictionSchema,\n        RepositoryRuleMaxFileSizeSchema,\n        RepositoryRuleWorkflowsSchema,\n        RepositoryRuleCodeScanningSchema\n      ])\n    )\n    .describe('A repository rule.')\n  export type RepositoryRule = z.infer<typeof RepositoryRuleSchema>\n\n  export const CodeScanningAlertItemsSchema = z.object({\n    number: AlertNumberSchema,\n    created_at: AlertCreatedAtSchema,\n    updated_at: AlertUpdatedAtSchema.optional(),\n    url: AlertUrlSchema,\n    html_url: AlertHtmlUrlSchema,\n    instances_url: AlertInstancesUrlSchema,\n    state: CodeScanningAlertStateSchema,\n    fixed_at: AlertFixedAtSchema.optional(),\n    dismissed_by: NullableSimpleUserSchema,\n    dismissed_at: AlertDismissedAtSchema,\n    dismissed_reason: CodeScanningAlertDismissedReasonSchema,\n    dismissed_comment: CodeScanningAlertDismissedCommentSchema.optional(),\n    rule: CodeScanningAlertRuleSummarySchema,\n    tool: CodeScanningAnalysisToolSchema,\n    most_recent_instance: CodeScanningAlertInstanceSchema,\n    dismissal_approved_by: NullableSimpleUserSchema.optional()\n  })\n  export type CodeScanningAlertItems = z.infer<\n    typeof CodeScanningAlertItemsSchema\n  >\n\n  export const CodeScanningAlertSchema = z.object({\n    number: AlertNumberSchema,\n    created_at: AlertCreatedAtSchema,\n    updated_at: AlertUpdatedAtSchema.optional(),\n    url: AlertUrlSchema,\n    html_url: AlertHtmlUrlSchema,\n    instances_url: AlertInstancesUrlSchema,\n    state: CodeScanningAlertStateSchema,\n    fixed_at: AlertFixedAtSchema.optional(),\n    dismissed_by: NullableSimpleUserSchema,\n    dismissed_at: AlertDismissedAtSchema,\n    dismissed_reason: CodeScanningAlertDismissedReasonSchema,\n    dismissed_comment: CodeScanningAlertDismissedCommentSchema.optional(),\n    rule: CodeScanningAlertRuleSchema,\n    tool: CodeScanningAnalysisToolSchema,\n    most_recent_instance: CodeScanningAlertInstanceSchema,\n    dismissal_approved_by: NullableSimpleUserSchema.optional()\n  })\n  export type CodeScanningAlert = z.infer<typeof CodeScanningAlertSchema>\n\n  export const RepositoryRuleDetailedSchema = z\n    .record(z.any())\n    .and(\n      z.union([\n        z.intersection(\n          RepositoryRuleCreationSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleUpdateSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleDeletionSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleRequiredLinearHistorySchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleMergeQueueSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleRequiredDeploymentsSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleRequiredSignaturesSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRulePullRequestSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleRequiredStatusChecksSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleNonFastForwardSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleCommitMessagePatternSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleCommitAuthorEmailPatternSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleCommitterEmailPatternSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleBranchNamePatternSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleTagNamePatternSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleFilePathRestrictionSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleMaxFilePathLengthSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleFileExtensionRestrictionSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleMaxFileSizeSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleWorkflowsSchema,\n          RepositoryRuleRulesetInfoSchema\n        ),\n        z.intersection(\n          RepositoryRuleCodeScanningSchema,\n          RepositoryRuleRulesetInfoSchema\n        )\n      ])\n    )\n    .describe('A repository rule with ruleset details.')\n  export type RepositoryRuleDetailed = z.infer<\n    typeof RepositoryRuleDetailedSchema\n  >\n\n  export const CodeScanningOrganizationAlertItemsSchema = z.object({\n    number: AlertNumberSchema,\n    created_at: AlertCreatedAtSchema,\n    updated_at: AlertUpdatedAtSchema.optional(),\n    url: AlertUrlSchema,\n    html_url: AlertHtmlUrlSchema,\n    instances_url: AlertInstancesUrlSchema,\n    state: CodeScanningAlertStateSchema,\n    fixed_at: AlertFixedAtSchema.optional(),\n    dismissed_by: NullableSimpleUserSchema,\n    dismissed_at: AlertDismissedAtSchema,\n    dismissed_reason: CodeScanningAlertDismissedReasonSchema,\n    dismissed_comment: CodeScanningAlertDismissedCommentSchema.optional(),\n    rule: CodeScanningAlertRuleSummarySchema,\n    tool: CodeScanningAnalysisToolSchema,\n    most_recent_instance: CodeScanningAlertInstanceSchema,\n    repository: SimpleRepositorySchema,\n    dismissal_approved_by: NullableSimpleUserSchema.optional()\n  })\n  export type CodeScanningOrganizationAlertItems = z.infer<\n    typeof CodeScanningOrganizationAlertItemsSchema\n  >\n\n  export const RepositoryRulesetSchema = z\n    .object({\n      id: z.number().int().describe('The ID of the ruleset'),\n      name: z.string().describe('The name of the ruleset'),\n      target: z\n        .enum(['branch', 'tag', 'push', 'repository'])\n        .describe('The target of the ruleset')\n        .optional(),\n      source_type: z\n        .enum(['Repository', 'Organization', 'Enterprise'])\n        .describe('The type of the source of the ruleset')\n        .optional(),\n      source: z.string().describe('The name of the source'),\n      enforcement: RepositoryRuleEnforcementSchema,\n      bypass_actors: z\n        .array(RepositoryRulesetBypassActorSchema)\n        .describe('The actors that can bypass the rules in this ruleset')\n        .optional(),\n      current_user_can_bypass: z\n        .enum(['always', 'pull_requests_only', 'never'])\n        .describe(\n          'The bypass type of the user making the API request for this ruleset. This field is only returned when\\nquerying the repository-level endpoint.'\n        )\n        .optional(),\n      node_id: z.string().optional(),\n      _links: z\n        .object({\n          self: z\n            .object({\n              href: z.string().describe('The URL of the ruleset').optional()\n            })\n            .optional(),\n          html: z\n            .object({\n              href: z\n                .string()\n                .describe('The html URL of the ruleset')\n                .optional()\n            })\n            .optional()\n        })\n        .optional(),\n      conditions: z\n        .union([RepositoryRulesetConditionsSchema, OrgRulesetConditionsSchema])\n        .optional(),\n      rules: z.array(RepositoryRuleSchema).optional(),\n      created_at: z.string().datetime({ offset: true }).optional(),\n      updated_at: z.string().datetime({ offset: true }).optional()\n    })\n    .describe('A set of rules to apply when specified conditions are met.')\n  export type RepositoryRuleset = z.infer<typeof RepositoryRulesetSchema>\n\n  export const TimelineIssueEventsSchema = z\n    .record(z.any())\n    .and(\n      z.union([\n        LabeledIssueEventSchema,\n        UnlabeledIssueEventSchema,\n        MilestonedIssueEventSchema,\n        DemilestonedIssueEventSchema,\n        RenamedIssueEventSchema,\n        ReviewRequestedIssueEventSchema,\n        ReviewRequestRemovedIssueEventSchema,\n        ReviewDismissedIssueEventSchema,\n        LockedIssueEventSchema,\n        AddedToProjectIssueEventSchema,\n        MovedColumnInProjectIssueEventSchema,\n        RemovedFromProjectIssueEventSchema,\n        ConvertedNoteToIssueIssueEventSchema,\n        TimelineCommentEventSchema,\n        TimelineCrossReferencedEventSchema,\n        TimelineCommittedEventSchema,\n        TimelineReviewedEventSchema,\n        TimelineLineCommentedEventSchema,\n        TimelineCommitCommentedEventSchema,\n        TimelineAssignedIssueEventSchema,\n        TimelineUnassignedIssueEventSchema,\n        StateChangeIssueEventSchema\n      ])\n    )\n    .describe('Timeline Event')\n  export type TimelineIssueEvents = z.infer<typeof TimelineIssueEventsSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const MetaRootParamsSchema = z.object({})\n  export type MetaRootParams = z.infer<typeof MetaRootParamsSchema>\n\n  export const MetaRootResponseSchema = RootSchema\n  export type MetaRootResponse = z.infer<typeof MetaRootResponseSchema>\n\n  export const SecurityAdvisoriesListGlobalAdvisoriesParamsSchema = z.object({\n    ghsa_id: z\n      .string()\n      .describe(\n        'If specified, only advisories with this GHSA (GitHub Security Advisory) identifier will be returned.'\n      )\n      .optional(),\n    type: z\n      .enum(['reviewed', 'malware', 'unreviewed'])\n      .describe(\n        'If specified, only advisories of this type will be returned. By default, a request with no other parameters defined will only return reviewed advisories that are not malware.'\n      )\n      .default('reviewed'),\n    cve_id: z\n      .string()\n      .describe(\n        'If specified, only advisories with this CVE (Common Vulnerabilities and Exposures) identifier will be returned.'\n      )\n      .optional(),\n    ecosystem: z\n      .any()\n      .describe(\n        'If specified, only advisories for these ecosystems will be returned.'\n      )\n      .optional(),\n    severity: z\n      .enum(['unknown', 'low', 'medium', 'high', 'critical'])\n      .describe(\n        'If specified, only advisories with these severities will be returned.'\n      )\n      .optional(),\n    cwes: z\n      .union([z.string(), z.array(z.string())])\n      .describe(\n        'If specified, only advisories with these Common Weakness Enumerations (CWEs) will be returned.\\n\\nExample: `cwes=79,284,22` or `cwes[]=79&cwes[]=284&cwes[]=22`'\n      )\n      .optional(),\n    is_withdrawn: z\n      .boolean()\n      .describe('Whether to only return advisories that have been withdrawn.')\n      .optional(),\n    affects: z\n      .union([z.string(), z.array(z.string()).max(1000)])\n      .describe(\n        'If specified, only return advisories that affect any of `package` or `package@version`. A maximum of 1000 packages can be specified.\\nIf the query parameter causes the URL to exceed the maximum URL length supported by your client, you must specify fewer packages.\\n\\nExample: `affects=package1,package2@1.0.0,package3@^2.0.0` or `affects[]=package1&affects[]=package2@1.0.0`'\n      )\n      .optional(),\n    published: z\n      .string()\n      .describe(\n        'If specified, only return advisories that were published on a date or date range.\\n\\nFor more information on the syntax of the date range, see \"[Understanding the search syntax](https://docs.github.com/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates).\"'\n      )\n      .optional(),\n    updated: z\n      .string()\n      .describe(\n        'If specified, only return advisories that were updated on a date or date range.\\n\\nFor more information on the syntax of the date range, see \"[Understanding the search syntax](https://docs.github.com/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates).\"'\n      )\n      .optional(),\n    modified: z\n      .string()\n      .describe(\n        'If specified, only show advisories that were updated or published on a date or date range.\\n\\nFor more information on the syntax of the date range, see \"[Understanding the search syntax](https://docs.github.com/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates).\"'\n      )\n      .optional(),\n    epss_percentage: z\n      .string()\n      .describe(\n        'If specified, only return advisories that have an EPSS percentage score that matches the provided value.\\nThe EPSS percentage represents the likelihood of a CVE being exploited.'\n      )\n      .optional(),\n    epss_percentile: z\n      .string()\n      .describe(\n        \"If specified, only return advisories that have an EPSS percentile score that matches the provided value.\\nThe EPSS percentile represents the relative rank of the CVE's likelihood of being exploited compared to other CVEs.\"\n      )\n      .optional(),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .gte(1)\n      .lte(100)\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    sort: z\n      .enum(['updated', 'published', 'epss_percentage', 'epss_percentile'])\n      .describe('The property to sort the results by.')\n      .default('published')\n  })\n  export type SecurityAdvisoriesListGlobalAdvisoriesParams = z.infer<\n    typeof SecurityAdvisoriesListGlobalAdvisoriesParamsSchema\n  >\n\n  export const SecurityAdvisoriesListGlobalAdvisoriesResponseSchema =\n    z.array(GlobalAdvisorySchema)\n  export type SecurityAdvisoriesListGlobalAdvisoriesResponse = z.infer<\n    typeof SecurityAdvisoriesListGlobalAdvisoriesResponseSchema\n  >\n\n  export const SecurityAdvisoriesGetGlobalAdvisoryParamsSchema = z.object({\n    ghsa_id: z\n      .string()\n      .describe(\n        'The GHSA (GitHub Security Advisory) identifier of the advisory.'\n      )\n  })\n  export type SecurityAdvisoriesGetGlobalAdvisoryParams = z.infer<\n    typeof SecurityAdvisoriesGetGlobalAdvisoryParamsSchema\n  >\n\n  export const SecurityAdvisoriesGetGlobalAdvisoryResponseSchema =\n    GlobalAdvisorySchema\n  export type SecurityAdvisoriesGetGlobalAdvisoryResponse = z.infer<\n    typeof SecurityAdvisoriesGetGlobalAdvisoryResponseSchema\n  >\n\n  export const AppsGetAuthenticatedParamsSchema = z.object({})\n  export type AppsGetAuthenticatedParams = z.infer<\n    typeof AppsGetAuthenticatedParamsSchema\n  >\n\n  export const AppsGetAuthenticatedResponseSchema = IntegrationSchema\n  export type AppsGetAuthenticatedResponse = z.infer<\n    typeof AppsGetAuthenticatedResponseSchema\n  >\n\n  export const AppsCreateFromManifestParamsSchema = z.object({\n    code: z.string()\n  })\n  export type AppsCreateFromManifestParams = z.infer<\n    typeof AppsCreateFromManifestParamsSchema\n  >\n\n  export type AppsCreateFromManifestResponse = undefined\n\n  export const AppsGetWebhookConfigForAppParamsSchema = z.object({})\n  export type AppsGetWebhookConfigForAppParams = z.infer<\n    typeof AppsGetWebhookConfigForAppParamsSchema\n  >\n\n  export const AppsGetWebhookConfigForAppResponseSchema = WebhookConfigSchema\n  export type AppsGetWebhookConfigForAppResponse = z.infer<\n    typeof AppsGetWebhookConfigForAppResponseSchema\n  >\n\n  export const AppsUpdateWebhookConfigForAppParamsSchema = z.object({\n    url: WebhookConfigUrlSchema.optional(),\n    content_type: WebhookConfigContentTypeSchema.optional(),\n    secret: WebhookConfigSecretSchema.optional(),\n    insecure_ssl: WebhookConfigInsecureSslSchema.optional()\n  })\n  export type AppsUpdateWebhookConfigForAppParams = z.infer<\n    typeof AppsUpdateWebhookConfigForAppParamsSchema\n  >\n\n  export const AppsUpdateWebhookConfigForAppResponseSchema = WebhookConfigSchema\n  export type AppsUpdateWebhookConfigForAppResponse = z.infer<\n    typeof AppsUpdateWebhookConfigForAppResponseSchema\n  >\n\n  export const AppsListWebhookDeliveriesParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    cursor: z\n      .string()\n      .describe(\n        'Used for pagination: the starting delivery from which the page of deliveries is fetched. Refer to the `link` header for the next and previous page cursors.'\n      )\n      .optional()\n  })\n  export type AppsListWebhookDeliveriesParams = z.infer<\n    typeof AppsListWebhookDeliveriesParamsSchema\n  >\n\n  export const AppsListWebhookDeliveriesResponseSchema = z.array(\n    HookDeliveryItemSchema\n  )\n  export type AppsListWebhookDeliveriesResponse = z.infer<\n    typeof AppsListWebhookDeliveriesResponseSchema\n  >\n\n  export const AppsGetWebhookDeliveryParamsSchema = z.object({\n    delivery_id: z.number().int()\n  })\n  export type AppsGetWebhookDeliveryParams = z.infer<\n    typeof AppsGetWebhookDeliveryParamsSchema\n  >\n\n  export const AppsGetWebhookDeliveryResponseSchema = HookDeliverySchema\n  export type AppsGetWebhookDeliveryResponse = z.infer<\n    typeof AppsGetWebhookDeliveryResponseSchema\n  >\n\n  export const AppsRedeliverWebhookDeliveryParamsSchema = z.object({\n    delivery_id: z.number().int()\n  })\n  export type AppsRedeliverWebhookDeliveryParams = z.infer<\n    typeof AppsRedeliverWebhookDeliveryParamsSchema\n  >\n\n  export type AppsRedeliverWebhookDeliveryResponse = undefined\n\n  export const AppsListInstallationRequestsForAuthenticatedAppParamsSchema =\n    z.object({\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type AppsListInstallationRequestsForAuthenticatedAppParams = z.infer<\n    typeof AppsListInstallationRequestsForAuthenticatedAppParamsSchema\n  >\n\n  export const AppsListInstallationRequestsForAuthenticatedAppResponseSchema =\n    z.array(IntegrationInstallationRequestSchema)\n  export type AppsListInstallationRequestsForAuthenticatedAppResponse = z.infer<\n    typeof AppsListInstallationRequestsForAuthenticatedAppResponseSchema\n  >\n\n  export const AppsListInstallationsParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    outdated: z.string().optional()\n  })\n  export type AppsListInstallationsParams = z.infer<\n    typeof AppsListInstallationsParamsSchema\n  >\n\n  export const AppsListInstallationsResponseSchema = z.array(InstallationSchema)\n  export type AppsListInstallationsResponse = z.infer<\n    typeof AppsListInstallationsResponseSchema\n  >\n\n  export const AppsGetInstallationParamsSchema = z.object({\n    installation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the installation.')\n  })\n  export type AppsGetInstallationParams = z.infer<\n    typeof AppsGetInstallationParamsSchema\n  >\n\n  export const AppsGetInstallationResponseSchema = InstallationSchema\n  export type AppsGetInstallationResponse = z.infer<\n    typeof AppsGetInstallationResponseSchema\n  >\n\n  export const AppsDeleteInstallationParamsSchema = z.object({\n    installation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the installation.')\n  })\n  export type AppsDeleteInstallationParams = z.infer<\n    typeof AppsDeleteInstallationParamsSchema\n  >\n\n  export type AppsDeleteInstallationResponse = undefined\n\n  export const AppsCreateInstallationAccessTokenParamsSchema = z.object({\n    repositories: z\n      .array(z.string())\n      .describe('List of repository names that the token should have access to')\n      .optional(),\n    repository_ids: z\n      .array(z.number().int())\n      .describe('List of repository IDs that the token should have access to')\n      .optional(),\n    permissions: AppPermissionsSchema.optional(),\n    installation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the installation.')\n  })\n  export type AppsCreateInstallationAccessTokenParams = z.infer<\n    typeof AppsCreateInstallationAccessTokenParamsSchema\n  >\n\n  export type AppsCreateInstallationAccessTokenResponse = undefined\n\n  export const AppsSuspendInstallationParamsSchema = z.object({\n    installation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the installation.')\n  })\n  export type AppsSuspendInstallationParams = z.infer<\n    typeof AppsSuspendInstallationParamsSchema\n  >\n\n  export type AppsSuspendInstallationResponse = undefined\n\n  export const AppsUnsuspendInstallationParamsSchema = z.object({\n    installation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the installation.')\n  })\n  export type AppsUnsuspendInstallationParams = z.infer<\n    typeof AppsUnsuspendInstallationParamsSchema\n  >\n\n  export type AppsUnsuspendInstallationResponse = undefined\n\n  export const AppsDeleteAuthorizationParamsSchema = z.object({\n    access_token: z\n      .string()\n      .describe(\n        'The OAuth access token used to authenticate to the GitHub API.'\n      ),\n    client_id: z.string().describe('The client ID of the GitHub app.')\n  })\n  export type AppsDeleteAuthorizationParams = z.infer<\n    typeof AppsDeleteAuthorizationParamsSchema\n  >\n\n  export type AppsDeleteAuthorizationResponse = undefined\n\n  export const AppsCheckTokenParamsSchema = z.object({\n    access_token: z\n      .string()\n      .describe('The access_token of the OAuth or GitHub application.'),\n    client_id: z.string().describe('The client ID of the GitHub app.')\n  })\n  export type AppsCheckTokenParams = z.infer<typeof AppsCheckTokenParamsSchema>\n\n  export const AppsCheckTokenResponseSchema = AuthorizationSchema\n  export type AppsCheckTokenResponse = z.infer<\n    typeof AppsCheckTokenResponseSchema\n  >\n\n  export const AppsDeleteTokenParamsSchema = z.object({\n    access_token: z\n      .string()\n      .describe(\n        'The OAuth access token used to authenticate to the GitHub API.'\n      ),\n    client_id: z.string().describe('The client ID of the GitHub app.')\n  })\n  export type AppsDeleteTokenParams = z.infer<\n    typeof AppsDeleteTokenParamsSchema\n  >\n\n  export type AppsDeleteTokenResponse = undefined\n\n  export const AppsResetTokenParamsSchema = z.object({\n    access_token: z\n      .string()\n      .describe('The access_token of the OAuth or GitHub application.'),\n    client_id: z.string().describe('The client ID of the GitHub app.')\n  })\n  export type AppsResetTokenParams = z.infer<typeof AppsResetTokenParamsSchema>\n\n  export const AppsResetTokenResponseSchema = AuthorizationSchema\n  export type AppsResetTokenResponse = z.infer<\n    typeof AppsResetTokenResponseSchema\n  >\n\n  export const AppsScopeTokenParamsSchema = z.object({\n    access_token: z\n      .string()\n      .describe('The access token used to authenticate to the GitHub API.'),\n    target: z\n      .string()\n      .describe(\n        'The name of the user or organization to scope the user access token to. **Required** unless `target_id` is specified.'\n      )\n      .optional(),\n    target_id: z\n      .number()\n      .int()\n      .describe(\n        'The ID of the user or organization to scope the user access token to. **Required** unless `target` is specified.'\n      )\n      .optional(),\n    repositories: z\n      .array(z.string())\n      .describe(\n        'The list of repository names to scope the user access token to. `repositories` may not be specified if `repository_ids` is specified.'\n      )\n      .optional(),\n    repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'The list of repository IDs to scope the user access token to. `repository_ids` may not be specified if `repositories` is specified.'\n      )\n      .optional(),\n    permissions: AppPermissionsSchema.optional(),\n    client_id: z.string().describe('The client ID of the GitHub app.')\n  })\n  export type AppsScopeTokenParams = z.infer<typeof AppsScopeTokenParamsSchema>\n\n  export const AppsScopeTokenResponseSchema = AuthorizationSchema\n  export type AppsScopeTokenResponse = z.infer<\n    typeof AppsScopeTokenResponseSchema\n  >\n\n  export const AppsGetBySlugParamsSchema = z.object({ app_slug: z.string() })\n  export type AppsGetBySlugParams = z.infer<typeof AppsGetBySlugParamsSchema>\n\n  export const AppsGetBySlugResponseSchema = IntegrationSchema\n  export type AppsGetBySlugResponse = z.infer<\n    typeof AppsGetBySlugResponseSchema\n  >\n\n  export const ClassroomGetAnAssignmentParamsSchema = z.object({\n    assignment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the classroom assignment.')\n  })\n  export type ClassroomGetAnAssignmentParams = z.infer<\n    typeof ClassroomGetAnAssignmentParamsSchema\n  >\n\n  export const ClassroomGetAnAssignmentResponseSchema =\n    ClassroomAssignmentSchema\n  export type ClassroomGetAnAssignmentResponse = z.infer<\n    typeof ClassroomGetAnAssignmentResponseSchema\n  >\n\n  export const ClassroomListAcceptedAssignmentsForAnAssignmentParamsSchema =\n    z.object({\n      assignment_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the classroom assignment.'),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30)\n    })\n  export type ClassroomListAcceptedAssignmentsForAnAssignmentParams = z.infer<\n    typeof ClassroomListAcceptedAssignmentsForAnAssignmentParamsSchema\n  >\n\n  export const ClassroomListAcceptedAssignmentsForAnAssignmentResponseSchema =\n    z.array(ClassroomAcceptedAssignmentSchema)\n  export type ClassroomListAcceptedAssignmentsForAnAssignmentResponse = z.infer<\n    typeof ClassroomListAcceptedAssignmentsForAnAssignmentResponseSchema\n  >\n\n  export const ClassroomGetAssignmentGradesParamsSchema = z.object({\n    assignment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the classroom assignment.')\n  })\n  export type ClassroomGetAssignmentGradesParams = z.infer<\n    typeof ClassroomGetAssignmentGradesParamsSchema\n  >\n\n  export const ClassroomGetAssignmentGradesResponseSchema = z.array(\n    ClassroomAssignmentGradeSchema\n  )\n  export type ClassroomGetAssignmentGradesResponse = z.infer<\n    typeof ClassroomGetAssignmentGradesResponseSchema\n  >\n\n  export const ClassroomListClassroomsParamsSchema = z.object({\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type ClassroomListClassroomsParams = z.infer<\n    typeof ClassroomListClassroomsParamsSchema\n  >\n\n  export const ClassroomListClassroomsResponseSchema = z.array(\n    SimpleClassroomSchema\n  )\n  export type ClassroomListClassroomsResponse = z.infer<\n    typeof ClassroomListClassroomsResponseSchema\n  >\n\n  export const ClassroomGetAclassroomParamsSchema = z.object({\n    classroom_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the classroom.')\n  })\n  export type ClassroomGetAclassroomParams = z.infer<\n    typeof ClassroomGetAclassroomParamsSchema\n  >\n\n  export const ClassroomGetAclassroomResponseSchema = ClassroomSchema\n  export type ClassroomGetAclassroomResponse = z.infer<\n    typeof ClassroomGetAclassroomResponseSchema\n  >\n\n  export const ClassroomListAssignmentsForAclassroomParamsSchema = z.object({\n    classroom_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the classroom.'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type ClassroomListAssignmentsForAclassroomParams = z.infer<\n    typeof ClassroomListAssignmentsForAclassroomParamsSchema\n  >\n\n  export const ClassroomListAssignmentsForAclassroomResponseSchema = z.array(\n    SimpleClassroomAssignmentSchema\n  )\n  export type ClassroomListAssignmentsForAclassroomResponse = z.infer<\n    typeof ClassroomListAssignmentsForAclassroomResponseSchema\n  >\n\n  export const CodesOfConductGetAllCodesOfConductParamsSchema = z.object({})\n  export type CodesOfConductGetAllCodesOfConductParams = z.infer<\n    typeof CodesOfConductGetAllCodesOfConductParamsSchema\n  >\n\n  export const CodesOfConductGetAllCodesOfConductResponseSchema =\n    z.array(CodeOfConductSchema)\n  export type CodesOfConductGetAllCodesOfConductResponse = z.infer<\n    typeof CodesOfConductGetAllCodesOfConductResponseSchema\n  >\n\n  export const CodesOfConductGetConductCodeParamsSchema = z.object({\n    key: z.string()\n  })\n  export type CodesOfConductGetConductCodeParams = z.infer<\n    typeof CodesOfConductGetConductCodeParamsSchema\n  >\n\n  export const CodesOfConductGetConductCodeResponseSchema = CodeOfConductSchema\n  export type CodesOfConductGetConductCodeResponse = z.infer<\n    typeof CodesOfConductGetConductCodeResponseSchema\n  >\n\n  export const EmojisGetParamsSchema = z.object({})\n  export type EmojisGetParams = z.infer<typeof EmojisGetParamsSchema>\n\n  export const EmojisGetResponseSchema = z.record(z.string())\n  export type EmojisGetResponse = z.infer<typeof EmojisGetResponseSchema>\n\n  export const CodeSecurityGetConfigurationsForEnterpriseParamsSchema =\n    z.object({\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        ),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      before: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      after: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional()\n    })\n  export type CodeSecurityGetConfigurationsForEnterpriseParams = z.infer<\n    typeof CodeSecurityGetConfigurationsForEnterpriseParamsSchema\n  >\n\n  export const CodeSecurityGetConfigurationsForEnterpriseResponseSchema =\n    z.array(CodeSecurityConfigurationSchema)\n  export type CodeSecurityGetConfigurationsForEnterpriseResponse = z.infer<\n    typeof CodeSecurityGetConfigurationsForEnterpriseResponseSchema\n  >\n\n  export const CodeSecurityCreateConfigurationForEnterpriseParamsSchema =\n    z.object({\n      name: z\n        .string()\n        .describe(\n          'The name of the code security configuration. Must be unique within the enterprise.'\n        ),\n      description: z\n        .string()\n        .max(255)\n        .describe('A description of the code security configuration'),\n      advanced_security: z\n        .enum(['enabled', 'disabled'])\n        .describe('The enablement status of GitHub Advanced Security')\n        .default('disabled'),\n      dependency_graph: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependency Graph')\n        .default('enabled'),\n      dependency_graph_autosubmit_action: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Automatic dependency submission')\n        .default('disabled'),\n      dependency_graph_autosubmit_action_options: z\n        .object({\n          labeled_runners: z\n            .boolean()\n            .describe(\n              \"Whether to use runners labeled with 'dependency-submission' or standard GitHub runners.\"\n            )\n            .default(false)\n        })\n        .describe('Feature options for Automatic dependency submission')\n        .optional(),\n      dependabot_alerts: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependabot alerts')\n        .default('disabled'),\n      dependabot_security_updates: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependabot security updates')\n        .default('disabled'),\n      code_scanning_default_setup: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of code scanning default setup')\n        .default('disabled'),\n      code_scanning_default_setup_options:\n        CodeScanningDefaultSetupOptionsSchema.optional(),\n      code_scanning_delegated_alert_dismissal: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of code scanning delegated alert dismissal'\n        )\n        .default('disabled'),\n      secret_scanning: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning')\n        .default('disabled'),\n      secret_scanning_push_protection: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning push protection')\n        .default('disabled'),\n      secret_scanning_validity_checks: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning validity checks')\n        .default('disabled'),\n      secret_scanning_non_provider_patterns: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of secret scanning non provider patterns'\n        )\n        .default('disabled'),\n      secret_scanning_generic_secrets: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Copilot secret scanning')\n        .default('disabled'),\n      secret_scanning_delegated_alert_dismissal: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of secret scanning delegated alert dismissal'\n        )\n        .default('disabled'),\n      private_vulnerability_reporting: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of private vulnerability reporting')\n        .default('disabled'),\n      enforcement: z\n        .enum(['enforced', 'unenforced'])\n        .describe('The enforcement status for a security configuration')\n        .default('enforced'),\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        )\n    })\n  export type CodeSecurityCreateConfigurationForEnterpriseParams = z.infer<\n    typeof CodeSecurityCreateConfigurationForEnterpriseParamsSchema\n  >\n\n  export type CodeSecurityCreateConfigurationForEnterpriseResponse = undefined\n\n  export const CodeSecurityGetDefaultConfigurationsForEnterpriseParamsSchema =\n    z.object({\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        )\n    })\n  export type CodeSecurityGetDefaultConfigurationsForEnterpriseParams = z.infer<\n    typeof CodeSecurityGetDefaultConfigurationsForEnterpriseParamsSchema\n  >\n\n  export const CodeSecurityGetDefaultConfigurationsForEnterpriseResponseSchema =\n    CodeSecurityDefaultConfigurationsSchema\n  export type CodeSecurityGetDefaultConfigurationsForEnterpriseResponse =\n    z.infer<\n      typeof CodeSecurityGetDefaultConfigurationsForEnterpriseResponseSchema\n    >\n\n  export const CodeSecurityGetSingleConfigurationForEnterpriseParamsSchema =\n    z.object({\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        ),\n      configuration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the code security configuration.')\n    })\n  export type CodeSecurityGetSingleConfigurationForEnterpriseParams = z.infer<\n    typeof CodeSecurityGetSingleConfigurationForEnterpriseParamsSchema\n  >\n\n  export const CodeSecurityGetSingleConfigurationForEnterpriseResponseSchema =\n    CodeSecurityConfigurationSchema\n  export type CodeSecurityGetSingleConfigurationForEnterpriseResponse = z.infer<\n    typeof CodeSecurityGetSingleConfigurationForEnterpriseResponseSchema\n  >\n\n  export const CodeSecurityDeleteConfigurationForEnterpriseParamsSchema =\n    z.object({\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        ),\n      configuration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the code security configuration.')\n    })\n  export type CodeSecurityDeleteConfigurationForEnterpriseParams = z.infer<\n    typeof CodeSecurityDeleteConfigurationForEnterpriseParamsSchema\n  >\n\n  export type CodeSecurityDeleteConfigurationForEnterpriseResponse = undefined\n\n  export const CodeSecurityUpdateEnterpriseConfigurationParamsSchema = z.object(\n    {\n      name: z\n        .string()\n        .describe(\n          'The name of the code security configuration. Must be unique across the enterprise.'\n        )\n        .optional(),\n      description: z\n        .string()\n        .max(255)\n        .describe('A description of the code security configuration')\n        .optional(),\n      advanced_security: z\n        .enum(['enabled', 'disabled'])\n        .describe(\n          'The enablement status of GitHub Advanced Security. Must be set to enabled if you want to enable any GHAS settings.'\n        )\n        .optional(),\n      dependency_graph: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependency Graph')\n        .optional(),\n      dependency_graph_autosubmit_action: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Automatic dependency submission')\n        .optional(),\n      dependency_graph_autosubmit_action_options: z\n        .object({\n          labeled_runners: z\n            .boolean()\n            .describe(\n              \"Whether to use runners labeled with 'dependency-submission' or standard GitHub runners.\"\n            )\n            .optional()\n        })\n        .describe('Feature options for Automatic dependency submission')\n        .optional(),\n      dependabot_alerts: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependabot alerts')\n        .optional(),\n      dependabot_security_updates: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Dependabot security updates')\n        .optional(),\n      code_scanning_default_setup: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of code scanning default setup')\n        .optional(),\n      code_scanning_default_setup_options:\n        CodeScanningDefaultSetupOptionsSchema.optional(),\n      code_scanning_delegated_alert_dismissal: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of code scanning delegated alert dismissal'\n        )\n        .default('disabled'),\n      secret_scanning: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning')\n        .optional(),\n      secret_scanning_push_protection: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning push protection')\n        .optional(),\n      secret_scanning_validity_checks: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of secret scanning validity checks')\n        .optional(),\n      secret_scanning_non_provider_patterns: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of secret scanning non-provider patterns'\n        )\n        .optional(),\n      secret_scanning_generic_secrets: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of Copilot secret scanning')\n        .default('disabled'),\n      secret_scanning_delegated_alert_dismissal: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe(\n          'The enablement status of secret scanning delegated alert dismissal'\n        )\n        .default('disabled'),\n      private_vulnerability_reporting: z\n        .enum(['enabled', 'disabled', 'not_set'])\n        .describe('The enablement status of private vulnerability reporting')\n        .optional(),\n      enforcement: z\n        .enum(['enforced', 'unenforced'])\n        .describe('The enforcement status for a security configuration')\n        .optional(),\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        ),\n      configuration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the code security configuration.')\n    }\n  )\n  export type CodeSecurityUpdateEnterpriseConfigurationParams = z.infer<\n    typeof CodeSecurityUpdateEnterpriseConfigurationParamsSchema\n  >\n\n  export const CodeSecurityUpdateEnterpriseConfigurationResponseSchema =\n    CodeSecurityConfigurationSchema\n  export type CodeSecurityUpdateEnterpriseConfigurationResponse = z.infer<\n    typeof CodeSecurityUpdateEnterpriseConfigurationResponseSchema\n  >\n\n  export const CodeSecurityAttachEnterpriseConfigurationParamsSchema = z.object(\n    {\n      scope: z\n        .enum(['all', 'all_without_configurations'])\n        .describe('The type of repositories to attach the configuration to.'),\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        ),\n      configuration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the code security configuration.')\n    }\n  )\n  export type CodeSecurityAttachEnterpriseConfigurationParams = z.infer<\n    typeof CodeSecurityAttachEnterpriseConfigurationParamsSchema\n  >\n\n  export type CodeSecurityAttachEnterpriseConfigurationResponse = undefined\n\n  export const CodeSecuritySetConfigurationAsDefaultForEnterpriseParamsSchema =\n    z.object({\n      default_for_new_repos: z\n        .enum(['all', 'none', 'private_and_internal', 'public'])\n        .describe(\n          'Specify which types of repository this security configuration should be applied to by default.'\n        )\n        .optional(),\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        ),\n      configuration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the code security configuration.')\n    })\n  export type CodeSecuritySetConfigurationAsDefaultForEnterpriseParams =\n    z.infer<\n      typeof CodeSecuritySetConfigurationAsDefaultForEnterpriseParamsSchema\n    >\n\n  export const CodeSecuritySetConfigurationAsDefaultForEnterpriseResponseSchema =\n    z.object({\n      default_for_new_repos: z\n        .enum(['all', 'none', 'private_and_internal', 'public'])\n        .describe(\n          'Specifies which types of repository this security configuration is applied to by default.'\n        )\n        .optional(),\n      configuration: CodeSecurityConfigurationSchema.optional()\n    })\n  export type CodeSecuritySetConfigurationAsDefaultForEnterpriseResponse =\n    z.infer<\n      typeof CodeSecuritySetConfigurationAsDefaultForEnterpriseResponseSchema\n    >\n\n  export const CodeSecurityGetRepositoriesForEnterpriseConfigurationParamsSchema =\n    z.object({\n      enterprise: z\n        .string()\n        .describe(\n          'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n        ),\n      configuration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the code security configuration.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      before: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      after: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      status: z\n        .string()\n        .describe(\n          'A comma-separated list of statuses. If specified, only repositories with these attachment statuses will be returned.\\n\\nCan be: `all`, `attached`, `attaching`, `removed`, `enforced`, `failed`, `updating`, `removed_by_enterprise`'\n        )\n        .default('all')\n    })\n  export type CodeSecurityGetRepositoriesForEnterpriseConfigurationParams =\n    z.infer<\n      typeof CodeSecurityGetRepositoriesForEnterpriseConfigurationParamsSchema\n    >\n\n  export const CodeSecurityGetRepositoriesForEnterpriseConfigurationResponseSchema =\n    z.array(CodeSecurityConfigurationRepositoriesSchema)\n  export type CodeSecurityGetRepositoriesForEnterpriseConfigurationResponse =\n    z.infer<\n      typeof CodeSecurityGetRepositoriesForEnterpriseConfigurationResponseSchema\n    >\n\n  export const DependabotListAlertsForEnterpriseParamsSchema = z.object({\n    enterprise: z\n      .string()\n      .describe(\n        'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n      ),\n    state: z\n      .string()\n      .describe(\n        'A comma-separated list of states. If specified, only alerts with these states will be returned.\\n\\nCan be: `auto_dismissed`, `dismissed`, `fixed`, `open`'\n      )\n      .optional(),\n    severity: z\n      .string()\n      .describe(\n        'A comma-separated list of severities. If specified, only alerts with these severities will be returned.\\n\\nCan be: `low`, `medium`, `high`, `critical`'\n      )\n      .optional(),\n    ecosystem: z\n      .string()\n      .describe(\n        'A comma-separated list of ecosystems. If specified, only alerts for these ecosystems will be returned.\\n\\nCan be: `composer`, `go`, `maven`, `npm`, `nuget`, `pip`, `pub`, `rubygems`, `rust`'\n      )\n      .optional(),\n    package: z\n      .string()\n      .describe(\n        'A comma-separated list of package names. If specified, only alerts for these packages will be returned.'\n      )\n      .optional(),\n    epss_percentage: z\n      .string()\n      .describe(\n        'CVE Exploit Prediction Scoring System (EPSS) percentage. Can be specified as:\\n- An exact number (`n`)\\n- Comparators such as `>n`, `<n`, `>=n`, `<=n`\\n- A range like `n..n`, where `n` is a number from 0.0 to 1.0\\n\\nFilters the list of alerts based on EPSS percentages. If specified, only alerts with the provided EPSS percentages will be returned.'\n      )\n      .optional(),\n    scope: z\n      .enum(['development', 'runtime'])\n      .describe(\n        'The scope of the vulnerable dependency. If specified, only alerts with this scope will be returned.'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated', 'epss_percentage'])\n      .describe(\n        \"The property by which to sort the results.\\n`created` means when the alert was created.\\n`updated` means when the alert's state last changed.\\n`epss_percentage` sorts alerts by the Exploit Prediction Scoring System (EPSS) percentage.\"\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    first: z\n      .number()\n      .int()\n      .gte(1)\n      .lte(100)\n      .describe(\n        '**Deprecated**. The number of results per page (max 100), starting from the first matching result.\\nThis parameter must not be used in combination with `last`.\\nInstead, use `per_page` in combination with `after` to fetch the first page of results.'\n      )\n      .default(30),\n    last: z\n      .number()\n      .int()\n      .gte(1)\n      .lte(100)\n      .describe(\n        '**Deprecated**. The number of results per page (max 100), starting from the last matching result.\\nThis parameter must not be used in combination with `first`.\\nInstead, use `per_page` in combination with `before` to fetch the last page of results.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type DependabotListAlertsForEnterpriseParams = z.infer<\n    typeof DependabotListAlertsForEnterpriseParamsSchema\n  >\n\n  export const DependabotListAlertsForEnterpriseResponseSchema = z.array(\n    DependabotAlertWithRepositorySchema\n  )\n  export type DependabotListAlertsForEnterpriseResponse = z.infer<\n    typeof DependabotListAlertsForEnterpriseResponseSchema\n  >\n\n  export const SecretScanningListAlertsForEnterpriseParamsSchema = z.object({\n    enterprise: z\n      .string()\n      .describe(\n        'The slug version of the enterprise name. You can also substitute this value with the enterprise id.'\n      ),\n    state: z\n      .enum(['open', 'resolved'])\n      .describe(\n        'Set to `open` or `resolved` to only list secret scanning alerts in a specific state.'\n      )\n      .optional(),\n    secret_type: z\n      .string()\n      .describe(\n        'A comma-separated list of secret types to return. All default secret patterns are returned. To return generic patterns, pass the token name(s) in the parameter. See \"[Supported secret scanning patterns](https://docs.github.com/enterprise-cloud@latest/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets)\" for a complete list of secret types.'\n      )\n      .optional(),\n    resolution: z\n      .string()\n      .describe(\n        'A comma-separated list of resolutions. Only secret scanning alerts with one of these resolutions are listed. Valid resolutions are `false_positive`, `wont_fix`, `revoked`, `pattern_edited`, `pattern_deleted` or `used_in_tests`.'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe(\n        'The property to sort the results by. `created` means when the alert was created. `updated` means when the alert was updated or resolved.'\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    validity: z\n      .string()\n      .describe(\n        'A comma-separated list of validities that, when present, will return alerts that match the validities in this list. Valid options are `active`, `inactive`, and `unknown`.'\n      )\n      .optional(),\n    is_publicly_leaked: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not to filter alerts by the publicly-leaked tag being present.'\n      )\n      .default(false),\n    is_multi_repo: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not to filter alerts by the multi-repo tag being present.'\n      )\n      .default(false)\n  })\n  export type SecretScanningListAlertsForEnterpriseParams = z.infer<\n    typeof SecretScanningListAlertsForEnterpriseParamsSchema\n  >\n\n  export const SecretScanningListAlertsForEnterpriseResponseSchema = z.array(\n    OrganizationSecretScanningAlertSchema\n  )\n  export type SecretScanningListAlertsForEnterpriseResponse = z.infer<\n    typeof SecretScanningListAlertsForEnterpriseResponseSchema\n  >\n\n  export const ActivityListPublicEventsParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListPublicEventsParams = z.infer<\n    typeof ActivityListPublicEventsParamsSchema\n  >\n\n  export const ActivityListPublicEventsResponseSchema = z.array(EventSchema)\n  export type ActivityListPublicEventsResponse = z.infer<\n    typeof ActivityListPublicEventsResponseSchema\n  >\n\n  export const ActivityGetFeedsParamsSchema = z.object({})\n  export type ActivityGetFeedsParams = z.infer<\n    typeof ActivityGetFeedsParamsSchema\n  >\n\n  export const ActivityGetFeedsResponseSchema = FeedSchema\n  export type ActivityGetFeedsResponse = z.infer<\n    typeof ActivityGetFeedsResponseSchema\n  >\n\n  export const GistsListParamsSchema = z.object({\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type GistsListParams = z.infer<typeof GistsListParamsSchema>\n\n  export const GistsListResponseSchema = z.array(BaseGistSchema)\n  export type GistsListResponse = z.infer<typeof GistsListResponseSchema>\n\n  export const GistsCreateParamsSchema = z.object({\n    description: z.string().describe('Description of the gist').optional(),\n    files: z\n      .record(z.object({ content: z.string().describe('Content of the file') }))\n      .describe('Names and content for the files that make up the gist'),\n    public: z\n      .union([\n        z\n          .boolean()\n          .describe('Flag indicating whether the gist is public')\n          .default(false),\n        z.enum(['true', 'false']).default('false')\n      ])\n      .optional()\n  })\n  export type GistsCreateParams = z.infer<typeof GistsCreateParamsSchema>\n\n  export type GistsCreateResponse = undefined\n\n  export const GistsListPublicParamsSchema = z.object({\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type GistsListPublicParams = z.infer<\n    typeof GistsListPublicParamsSchema\n  >\n\n  export const GistsListPublicResponseSchema = z.array(BaseGistSchema)\n  export type GistsListPublicResponse = z.infer<\n    typeof GistsListPublicResponseSchema\n  >\n\n  export const GistsListStarredParamsSchema = z.object({\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type GistsListStarredParams = z.infer<\n    typeof GistsListStarredParamsSchema\n  >\n\n  export const GistsListStarredResponseSchema = z.array(BaseGistSchema)\n  export type GistsListStarredResponse = z.infer<\n    typeof GistsListStarredResponseSchema\n  >\n\n  export const GistsGetParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsGetParams = z.infer<typeof GistsGetParamsSchema>\n\n  export const GistsGetResponseSchema = GistSimpleSchema\n  export type GistsGetResponse = z.infer<typeof GistsGetResponseSchema>\n\n  export const GistsDeleteParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsDeleteParams = z.infer<typeof GistsDeleteParamsSchema>\n\n  export type GistsDeleteResponse = undefined\n\n  export const GistsUpdateParamsSchema = z.object({\n    description: z.string().describe('The description of the gist.').optional(),\n    files: z\n      .record(\n        z.object({\n          content: z\n            .string()\n            .describe('The new content of the file.')\n            .optional(),\n          filename: z\n            .string()\n            .describe('The new filename for the file.')\n            .optional()\n        })\n      )\n      .describe(\n        'The gist files to be updated, renamed, or deleted. Each `key` must match the current filename\\n(including extension) of the targeted gist file. For example: `hello.py`.\\n\\nTo delete a file, set the whole file to null. For example: `hello.py : null`. The file will also be\\ndeleted if the specified object does not contain at least one of `content` or `filename`.'\n      )\n      .optional(),\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsUpdateParams = z.infer<typeof GistsUpdateParamsSchema>\n\n  export const GistsUpdateResponseSchema = GistSimpleSchema\n  export type GistsUpdateResponse = z.infer<typeof GistsUpdateResponseSchema>\n\n  export const GistsListCommentsParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type GistsListCommentsParams = z.infer<\n    typeof GistsListCommentsParamsSchema\n  >\n\n  export const GistsListCommentsResponseSchema = z.array(GistCommentSchema)\n  export type GistsListCommentsResponse = z.infer<\n    typeof GistsListCommentsResponseSchema\n  >\n\n  export const GistsCreateCommentParamsSchema = z.object({\n    body: z.string().max(65_535).describe('The comment text.'),\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsCreateCommentParams = z.infer<\n    typeof GistsCreateCommentParamsSchema\n  >\n\n  export type GistsCreateCommentResponse = undefined\n\n  export const GistsGetCommentParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.'),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type GistsGetCommentParams = z.infer<\n    typeof GistsGetCommentParamsSchema\n  >\n\n  export const GistsGetCommentResponseSchema = GistCommentSchema\n  export type GistsGetCommentResponse = z.infer<\n    typeof GistsGetCommentResponseSchema\n  >\n\n  export const GistsDeleteCommentParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.'),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type GistsDeleteCommentParams = z.infer<\n    typeof GistsDeleteCommentParamsSchema\n  >\n\n  export type GistsDeleteCommentResponse = undefined\n\n  export const GistsUpdateCommentParamsSchema = z.object({\n    body: z.string().max(65_535).describe('The comment text.'),\n    gist_id: z.string().describe('The unique identifier of the gist.'),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type GistsUpdateCommentParams = z.infer<\n    typeof GistsUpdateCommentParamsSchema\n  >\n\n  export const GistsUpdateCommentResponseSchema = GistCommentSchema\n  export type GistsUpdateCommentResponse = z.infer<\n    typeof GistsUpdateCommentResponseSchema\n  >\n\n  export const GistsListCommitsParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type GistsListCommitsParams = z.infer<\n    typeof GistsListCommitsParamsSchema\n  >\n\n  export const GistsListCommitsResponseSchema = z.array(GistCommitSchema)\n  export type GistsListCommitsResponse = z.infer<\n    typeof GistsListCommitsResponseSchema\n  >\n\n  export const GistsListForksParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type GistsListForksParams = z.infer<typeof GistsListForksParamsSchema>\n\n  export const GistsListForksResponseSchema = z.array(GistSimpleSchema)\n  export type GistsListForksResponse = z.infer<\n    typeof GistsListForksResponseSchema\n  >\n\n  export const GistsForkParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsForkParams = z.infer<typeof GistsForkParamsSchema>\n\n  export type GistsForkResponse = undefined\n\n  export const GistsCheckIsStarredParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsCheckIsStarredParams = z.infer<\n    typeof GistsCheckIsStarredParamsSchema\n  >\n\n  export type GistsCheckIsStarredResponse = undefined\n\n  export const GistsStarParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsStarParams = z.infer<typeof GistsStarParamsSchema>\n\n  export type GistsStarResponse = undefined\n\n  export const GistsUnstarParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.')\n  })\n  export type GistsUnstarParams = z.infer<typeof GistsUnstarParamsSchema>\n\n  export type GistsUnstarResponse = undefined\n\n  export const GistsGetRevisionParamsSchema = z.object({\n    gist_id: z.string().describe('The unique identifier of the gist.'),\n    sha: z.string()\n  })\n  export type GistsGetRevisionParams = z.infer<\n    typeof GistsGetRevisionParamsSchema\n  >\n\n  export const GistsGetRevisionResponseSchema = GistSimpleSchema\n  export type GistsGetRevisionResponse = z.infer<\n    typeof GistsGetRevisionResponseSchema\n  >\n\n  export const GitignoreGetAllTemplatesParamsSchema = z.object({})\n  export type GitignoreGetAllTemplatesParams = z.infer<\n    typeof GitignoreGetAllTemplatesParamsSchema\n  >\n\n  export const GitignoreGetAllTemplatesResponseSchema = z.array(z.string())\n  export type GitignoreGetAllTemplatesResponse = z.infer<\n    typeof GitignoreGetAllTemplatesResponseSchema\n  >\n\n  export const GitignoreGetTemplateParamsSchema = z.object({ name: z.string() })\n  export type GitignoreGetTemplateParams = z.infer<\n    typeof GitignoreGetTemplateParamsSchema\n  >\n\n  export const GitignoreGetTemplateResponseSchema = GitignoreTemplateSchema\n  export type GitignoreGetTemplateResponse = z.infer<\n    typeof GitignoreGetTemplateResponseSchema\n  >\n\n  export const AppsListReposAccessibleToInstallationParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type AppsListReposAccessibleToInstallationParams = z.infer<\n    typeof AppsListReposAccessibleToInstallationParamsSchema\n  >\n\n  export const AppsListReposAccessibleToInstallationResponseSchema = z.object({\n    total_count: z.number().int(),\n    repositories: z.array(RepositorySchema),\n    repository_selection: z.string().optional()\n  })\n  export type AppsListReposAccessibleToInstallationResponse = z.infer<\n    typeof AppsListReposAccessibleToInstallationResponseSchema\n  >\n\n  export const AppsRevokeInstallationAccessTokenParamsSchema = z.object({})\n  export type AppsRevokeInstallationAccessTokenParams = z.infer<\n    typeof AppsRevokeInstallationAccessTokenParamsSchema\n  >\n\n  export type AppsRevokeInstallationAccessTokenResponse = undefined\n\n  export const IssuesListParamsSchema = z.object({\n    filter: z\n      .enum(['assigned', 'created', 'mentioned', 'subscribed', 'repos', 'all'])\n      .describe(\n        \"Indicates which sorts of issues to return. `assigned` means issues assigned to you. `created` means issues created by you. `mentioned` means issues mentioning you. `subscribed` means issues you're subscribed to updates for. `all` or `repos` means all issues you can see, regardless of participation or creation.\"\n      )\n      .default('assigned'),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Indicates the state of the issues to return.')\n      .default('open'),\n    labels: z\n      .string()\n      .describe(\n        'A list of comma separated label names. Example: `bug,ui,@high`'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated', 'comments'])\n      .describe('What to sort results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    collab: z.boolean().optional(),\n    orgs: z.boolean().optional(),\n    owned: z.boolean().optional(),\n    pulls: z.boolean().optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListParams = z.infer<typeof IssuesListParamsSchema>\n\n  export const IssuesListResponseSchema = z.array(IssueSchema)\n  export type IssuesListResponse = z.infer<typeof IssuesListResponseSchema>\n\n  export const LicensesGetAllCommonlyUsedParamsSchema = z.object({\n    featured: z.boolean().optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type LicensesGetAllCommonlyUsedParams = z.infer<\n    typeof LicensesGetAllCommonlyUsedParamsSchema\n  >\n\n  export const LicensesGetAllCommonlyUsedResponseSchema =\n    z.array(LicenseSimpleSchema)\n  export type LicensesGetAllCommonlyUsedResponse = z.infer<\n    typeof LicensesGetAllCommonlyUsedResponseSchema\n  >\n\n  export const LicensesGetParamsSchema = z.object({ license: z.string() })\n  export type LicensesGetParams = z.infer<typeof LicensesGetParamsSchema>\n\n  export const LicensesGetResponseSchema = LicenseSchema\n  export type LicensesGetResponse = z.infer<typeof LicensesGetResponseSchema>\n\n  export const MarkdownRenderParamsSchema = z.object({\n    text: z.string().describe('The Markdown text to render in HTML.'),\n    mode: z\n      .enum(['markdown', 'gfm'])\n      .describe('The rendering mode.')\n      .default('markdown'),\n    context: z\n      .string()\n      .describe(\n        'The repository context to use when creating references in `gfm` mode.  For example, setting `context` to `octo-org/octo-repo` will change the text `#42` into an HTML link to issue 42 in the `octo-org/octo-repo` repository.'\n      )\n      .optional()\n  })\n  export type MarkdownRenderParams = z.infer<typeof MarkdownRenderParamsSchema>\n\n  export type MarkdownRenderResponse = undefined\n\n  export const MarkdownRenderRawParamsSchema = z.object({})\n  export type MarkdownRenderRawParams = z.infer<\n    typeof MarkdownRenderRawParamsSchema\n  >\n\n  export type MarkdownRenderRawResponse = undefined\n\n  export const AppsGetSubscriptionPlanForAccountParamsSchema = z.object({\n    account_id: z.number().int().describe('account_id parameter')\n  })\n  export type AppsGetSubscriptionPlanForAccountParams = z.infer<\n    typeof AppsGetSubscriptionPlanForAccountParamsSchema\n  >\n\n  export const AppsGetSubscriptionPlanForAccountResponseSchema =\n    MarketplacePurchaseSchema\n  export type AppsGetSubscriptionPlanForAccountResponse = z.infer<\n    typeof AppsGetSubscriptionPlanForAccountResponseSchema\n  >\n\n  export const AppsListPlansParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type AppsListPlansParams = z.infer<typeof AppsListPlansParamsSchema>\n\n  export const AppsListPlansResponseSchema = z.array(\n    MarketplaceListingPlanSchema\n  )\n  export type AppsListPlansResponse = z.infer<\n    typeof AppsListPlansResponseSchema\n  >\n\n  export const AppsListAccountsForPlanParamsSchema = z.object({\n    plan_id: z.number().int().describe('The unique identifier of the plan.'),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe('The property to sort the results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'To return the oldest accounts first, set to `asc`. Ignored without the `sort` parameter.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type AppsListAccountsForPlanParams = z.infer<\n    typeof AppsListAccountsForPlanParamsSchema\n  >\n\n  export const AppsListAccountsForPlanResponseSchema = z.array(\n    MarketplacePurchaseSchema\n  )\n  export type AppsListAccountsForPlanResponse = z.infer<\n    typeof AppsListAccountsForPlanResponseSchema\n  >\n\n  export const AppsGetSubscriptionPlanForAccountStubbedParamsSchema = z.object({\n    account_id: z.number().int().describe('account_id parameter')\n  })\n  export type AppsGetSubscriptionPlanForAccountStubbedParams = z.infer<\n    typeof AppsGetSubscriptionPlanForAccountStubbedParamsSchema\n  >\n\n  export const AppsGetSubscriptionPlanForAccountStubbedResponseSchema =\n    MarketplacePurchaseSchema\n  export type AppsGetSubscriptionPlanForAccountStubbedResponse = z.infer<\n    typeof AppsGetSubscriptionPlanForAccountStubbedResponseSchema\n  >\n\n  export const AppsListPlansStubbedParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type AppsListPlansStubbedParams = z.infer<\n    typeof AppsListPlansStubbedParamsSchema\n  >\n\n  export const AppsListPlansStubbedResponseSchema = z.array(\n    MarketplaceListingPlanSchema\n  )\n  export type AppsListPlansStubbedResponse = z.infer<\n    typeof AppsListPlansStubbedResponseSchema\n  >\n\n  export const AppsListAccountsForPlanStubbedParamsSchema = z.object({\n    plan_id: z.number().int().describe('The unique identifier of the plan.'),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe('The property to sort the results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'To return the oldest accounts first, set to `asc`. Ignored without the `sort` parameter.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type AppsListAccountsForPlanStubbedParams = z.infer<\n    typeof AppsListAccountsForPlanStubbedParamsSchema\n  >\n\n  export const AppsListAccountsForPlanStubbedResponseSchema = z.array(\n    MarketplacePurchaseSchema\n  )\n  export type AppsListAccountsForPlanStubbedResponse = z.infer<\n    typeof AppsListAccountsForPlanStubbedResponseSchema\n  >\n\n  export const MetaGetParamsSchema = z.object({})\n  export type MetaGetParams = z.infer<typeof MetaGetParamsSchema>\n\n  export const MetaGetResponseSchema = ApiOverviewSchema\n  export type MetaGetResponse = z.infer<typeof MetaGetResponseSchema>\n\n  export const ActivityListPublicEventsForRepoNetworkParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListPublicEventsForRepoNetworkParams = z.infer<\n    typeof ActivityListPublicEventsForRepoNetworkParamsSchema\n  >\n\n  export const ActivityListPublicEventsForRepoNetworkResponseSchema =\n    z.array(EventSchema)\n  export type ActivityListPublicEventsForRepoNetworkResponse = z.infer<\n    typeof ActivityListPublicEventsForRepoNetworkResponseSchema\n  >\n\n  export const ActivityListNotificationsForAuthenticatedUserParamsSchema =\n    z.object({\n      all: z\n        .boolean()\n        .describe('If `true`, show notifications marked as read.')\n        .default(false),\n      participating: z\n        .boolean()\n        .describe(\n          'If `true`, only shows notifications in which the user is directly participating or mentioned.'\n        )\n        .default(false),\n      since: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      before: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'Only show notifications updated before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 50). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(50)\n    })\n  export type ActivityListNotificationsForAuthenticatedUserParams = z.infer<\n    typeof ActivityListNotificationsForAuthenticatedUserParamsSchema\n  >\n\n  export const ActivityListNotificationsForAuthenticatedUserResponseSchema =\n    z.array(ThreadSchema)\n  export type ActivityListNotificationsForAuthenticatedUserResponse = z.infer<\n    typeof ActivityListNotificationsForAuthenticatedUserResponseSchema\n  >\n\n  export const ActivityMarkNotificationsAsReadParamsSchema = z.object({\n    last_read_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Describes the last point that notifications were checked. Anything updated since this time will not be marked as read. If you omit this parameter, all notifications are marked as read. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`. Default: The current timestamp.'\n      )\n      .optional(),\n    read: z\n      .boolean()\n      .describe('Whether the notification has been read.')\n      .optional()\n  })\n  export type ActivityMarkNotificationsAsReadParams = z.infer<\n    typeof ActivityMarkNotificationsAsReadParamsSchema\n  >\n\n  export type ActivityMarkNotificationsAsReadResponse = undefined\n\n  export const ActivityGetThreadParamsSchema = z.object({\n    thread_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the notification thread. This corresponds to the value returned in the `id` field when you retrieve notifications (for example with the [`GET /notifications` operation](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user)).'\n      )\n  })\n  export type ActivityGetThreadParams = z.infer<\n    typeof ActivityGetThreadParamsSchema\n  >\n\n  export const ActivityGetThreadResponseSchema = ThreadSchema\n  export type ActivityGetThreadResponse = z.infer<\n    typeof ActivityGetThreadResponseSchema\n  >\n\n  export const ActivityMarkThreadAsDoneParamsSchema = z.object({\n    thread_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the notification thread. This corresponds to the value returned in the `id` field when you retrieve notifications (for example with the [`GET /notifications` operation](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user)).'\n      )\n  })\n  export type ActivityMarkThreadAsDoneParams = z.infer<\n    typeof ActivityMarkThreadAsDoneParamsSchema\n  >\n\n  export type ActivityMarkThreadAsDoneResponse = undefined\n\n  export const ActivityMarkThreadAsReadParamsSchema = z.object({\n    thread_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the notification thread. This corresponds to the value returned in the `id` field when you retrieve notifications (for example with the [`GET /notifications` operation](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user)).'\n      )\n  })\n  export type ActivityMarkThreadAsReadParams = z.infer<\n    typeof ActivityMarkThreadAsReadParamsSchema\n  >\n\n  export type ActivityMarkThreadAsReadResponse = undefined\n\n  export const ActivityGetThreadSubscriptionForAuthenticatedUserParamsSchema =\n    z.object({\n      thread_id: z\n        .number()\n        .int()\n        .describe(\n          'The unique identifier of the notification thread. This corresponds to the value returned in the `id` field when you retrieve notifications (for example with the [`GET /notifications` operation](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user)).'\n        )\n    })\n  export type ActivityGetThreadSubscriptionForAuthenticatedUserParams = z.infer<\n    typeof ActivityGetThreadSubscriptionForAuthenticatedUserParamsSchema\n  >\n\n  export const ActivityGetThreadSubscriptionForAuthenticatedUserResponseSchema =\n    ThreadSubscriptionSchema\n  export type ActivityGetThreadSubscriptionForAuthenticatedUserResponse =\n    z.infer<\n      typeof ActivityGetThreadSubscriptionForAuthenticatedUserResponseSchema\n    >\n\n  export const ActivitySetThreadSubscriptionParamsSchema = z.object({\n    ignored: z\n      .boolean()\n      .describe('Whether to block all notifications from a thread.')\n      .default(false),\n    thread_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the notification thread. This corresponds to the value returned in the `id` field when you retrieve notifications (for example with the [`GET /notifications` operation](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user)).'\n      )\n  })\n  export type ActivitySetThreadSubscriptionParams = z.infer<\n    typeof ActivitySetThreadSubscriptionParamsSchema\n  >\n\n  export const ActivitySetThreadSubscriptionResponseSchema =\n    ThreadSubscriptionSchema\n  export type ActivitySetThreadSubscriptionResponse = z.infer<\n    typeof ActivitySetThreadSubscriptionResponseSchema\n  >\n\n  export const ActivityDeleteThreadSubscriptionParamsSchema = z.object({\n    thread_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the notification thread. This corresponds to the value returned in the `id` field when you retrieve notifications (for example with the [`GET /notifications` operation](https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user)).'\n      )\n  })\n  export type ActivityDeleteThreadSubscriptionParams = z.infer<\n    typeof ActivityDeleteThreadSubscriptionParamsSchema\n  >\n\n  export type ActivityDeleteThreadSubscriptionResponse = undefined\n\n  export const MetaGetOctocatParamsSchema = z.object({\n    s: z\n      .string()\n      .describe(\"The words to show in Octocat's speech bubble\")\n      .optional()\n  })\n  export type MetaGetOctocatParams = z.infer<typeof MetaGetOctocatParamsSchema>\n\n  export type MetaGetOctocatResponse = undefined\n\n  export const OrgsListParamsSchema = z.object({\n    since: z\n      .number()\n      .int()\n      .describe(\n        'An organization ID. Only return organizations with an ID greater than this ID.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type OrgsListParams = z.infer<typeof OrgsListParamsSchema>\n\n  export const OrgsListResponseSchema = z.array(OrganizationSimpleSchema)\n  export type OrgsListResponse = z.infer<typeof OrgsListResponseSchema>\n\n  export const BillingGetGithubBillingUsageReportOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    year: z\n      .number()\n      .int()\n      .describe(\n        'If specified, only return results for a single year. The value of `year` is an integer with four digits representing a year. For example, `2025`. Default value is the current year.'\n      )\n      .optional(),\n    month: z\n      .number()\n      .int()\n      .describe(\n        'If specified, only return results for a single month. The value of `month` is an integer between `1` and `12`. If no year is specified the default `year` is used.'\n      )\n      .optional(),\n    day: z\n      .number()\n      .int()\n      .describe(\n        'If specified, only return results for a single day. The value of `day` is an integer between `1` and `31`. If no `year` or `month` is specified, the default `year` and `month` are used.'\n      )\n      .optional(),\n    hour: z\n      .number()\n      .int()\n      .describe(\n        'If specified, only return results for a single hour. The value of `hour` is an integer between `0` and `23`. If no `year`, `month`, or `day` is specified, the default `year`, `month`, and `day` are used.'\n      )\n      .optional()\n  })\n  export type BillingGetGithubBillingUsageReportOrgParams = z.infer<\n    typeof BillingGetGithubBillingUsageReportOrgParamsSchema\n  >\n\n  export const BillingGetGithubBillingUsageReportOrgResponseSchema =\n    BillingUsageReportSchema\n  export type BillingGetGithubBillingUsageReportOrgResponse = z.infer<\n    typeof BillingGetGithubBillingUsageReportOrgResponseSchema\n  >\n\n  export const OrgsGetParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsGetParams = z.infer<typeof OrgsGetParamsSchema>\n\n  export const OrgsGetResponseSchema = OrganizationFullSchema\n  export type OrgsGetResponse = z.infer<typeof OrgsGetResponseSchema>\n\n  export const OrgsDeleteParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsDeleteParams = z.infer<typeof OrgsDeleteParamsSchema>\n\n  export type OrgsDeleteResponse = undefined\n\n  export const OrgsUpdateParamsSchema = z.object({\n    billing_email: z\n      .string()\n      .describe('Billing email address. This address is not publicized.')\n      .optional(),\n    company: z.string().describe('The company name.').optional(),\n    email: z\n      .string()\n      .describe('The publicly visible email address.')\n      .optional(),\n    twitter_username: z\n      .string()\n      .describe('The Twitter username of the company.')\n      .optional(),\n    location: z.string().describe('The location.').optional(),\n    name: z.string().describe('The shorthand name of the company.').optional(),\n    description: z\n      .string()\n      .describe(\n        'The description of the company. The maximum size is 160 characters.'\n      )\n      .optional(),\n    has_organization_projects: z\n      .boolean()\n      .describe('Whether an organization can use organization projects.')\n      .optional(),\n    has_repository_projects: z\n      .boolean()\n      .describe(\n        'Whether repositories that belong to the organization can use repository projects.'\n      )\n      .optional(),\n    default_repository_permission: z\n      .enum(['read', 'write', 'admin', 'none'])\n      .describe(\n        'Default permission level members have for organization repositories.'\n      )\n      .default('read'),\n    members_can_create_repositories: z\n      .boolean()\n      .describe(\n        'Whether of non-admin organization members can create repositories. **Note:** A parameter can override this parameter. See `members_allowed_repository_creation_type` in this table for details.'\n      )\n      .default(true),\n    members_can_create_internal_repositories: z\n      .boolean()\n      .describe(\n        'Whether organization members can create internal repositories, which are visible to all enterprise members. You can only allow members to create internal repositories if your organization is associated with an enterprise account using GitHub Enterprise Cloud or GitHub Enterprise Server 2.20+. For more information, see \"[Restricting repository creation in your organization](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/restricting-repository-creation-in-your-organization)\" in the GitHub Help documentation.'\n      )\n      .optional(),\n    members_can_create_private_repositories: z\n      .boolean()\n      .describe(\n        'Whether organization members can create private repositories, which are visible to organization members with permission. For more information, see \"[Restricting repository creation in your organization](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/restricting-repository-creation-in-your-organization)\" in the GitHub Help documentation.'\n      )\n      .optional(),\n    members_can_create_public_repositories: z\n      .boolean()\n      .describe(\n        'Whether organization members can create public repositories, which are visible to anyone. For more information, see \"[Restricting repository creation in your organization](https://docs.github.com/github/setting-up-and-managing-organizations-and-teams/restricting-repository-creation-in-your-organization)\" in the GitHub Help documentation.'\n      )\n      .optional(),\n    members_allowed_repository_creation_type: z\n      .enum(['all', 'private', 'none'])\n      .describe(\n        'Specifies which types of repositories non-admin organization members can create. `private` is only available to repositories that are part of an organization on GitHub Enterprise Cloud. \\n**Note:** This parameter is closing down and will be removed in the future. Its return value ignores internal repositories. Using this parameter overrides values set in `members_can_create_repositories`. See the parameter deprecation notice in the operation description for details.'\n      )\n      .optional(),\n    members_can_create_pages: z\n      .boolean()\n      .describe(\n        'Whether organization members can create GitHub Pages sites. Existing published sites will not be impacted.'\n      )\n      .default(true),\n    members_can_create_public_pages: z\n      .boolean()\n      .describe(\n        'Whether organization members can create public GitHub Pages sites. Existing published sites will not be impacted.'\n      )\n      .default(true),\n    members_can_create_private_pages: z\n      .boolean()\n      .describe(\n        'Whether organization members can create private GitHub Pages sites. Existing published sites will not be impacted.'\n      )\n      .default(true),\n    members_can_fork_private_repositories: z\n      .boolean()\n      .describe(\n        'Whether organization members can fork private organization repositories.'\n      )\n      .default(false),\n    web_commit_signoff_required: z\n      .boolean()\n      .describe(\n        \"Whether contributors to organization repositories are required to sign off on commits they make through GitHub's web interface.\"\n      )\n      .default(false),\n    blog: z.string().optional(),\n    advanced_security_enabled_for_new_repositories: z\n      .boolean()\n      .describe(\n        '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether GitHub Advanced Security is automatically enabled for new repositories and repositories transferred to this organization.\\n\\nTo use this parameter, you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\\n\\nYou can check which security and analysis features are currently enabled by using a `GET /orgs/{org}` request.'\n      )\n      .optional(),\n    dependabot_alerts_enabled_for_new_repositories: z\n      .boolean()\n      .describe(\n        '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether Dependabot alerts are automatically enabled for new repositories and repositories transferred to this organization.\\n\\nTo use this parameter, you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\\n\\nYou can check which security and analysis features are currently enabled by using a `GET /orgs/{org}` request.'\n      )\n      .optional(),\n    dependabot_security_updates_enabled_for_new_repositories: z\n      .boolean()\n      .describe(\n        '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether Dependabot security updates are automatically enabled for new repositories and repositories transferred to this organization.\\n\\nTo use this parameter, you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\\n\\nYou can check which security and analysis features are currently enabled by using a `GET /orgs/{org}` request.'\n      )\n      .optional(),\n    dependency_graph_enabled_for_new_repositories: z\n      .boolean()\n      .describe(\n        '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether dependency graph is automatically enabled for new repositories and repositories transferred to this organization.\\n\\nTo use this parameter, you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\\n\\nYou can check which security and analysis features are currently enabled by using a `GET /orgs/{org}` request.'\n      )\n      .optional(),\n    secret_scanning_enabled_for_new_repositories: z\n      .boolean()\n      .describe(\n        '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether secret scanning is automatically enabled for new repositories and repositories transferred to this organization.\\n\\nTo use this parameter, you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\\n\\nYou can check which security and analysis features are currently enabled by using a `GET /orgs/{org}` request.'\n      )\n      .optional(),\n    secret_scanning_push_protection_enabled_for_new_repositories: z\n      .boolean()\n      .describe(\n        '**Endpoint closing down notice.** Please use [code security configurations](https://docs.github.com/rest/code-security/configurations) instead.\\n\\nWhether secret scanning push protection is automatically enabled for new repositories and repositories transferred to this organization.\\n\\nTo use this parameter, you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\\n\\nYou can check which security and analysis features are currently enabled by using a `GET /orgs/{org}` request.'\n      )\n      .optional(),\n    secret_scanning_push_protection_custom_link_enabled: z\n      .boolean()\n      .describe(\n        'Whether a custom link is shown to contributors who are blocked from pushing a secret by push protection.'\n      )\n      .optional(),\n    secret_scanning_push_protection_custom_link: z\n      .string()\n      .describe(\n        'If `secret_scanning_push_protection_custom_link_enabled` is true, the URL that will be displayed to contributors who are blocked from pushing a secret.'\n      )\n      .optional(),\n    deploy_keys_enabled_for_repositories: z\n      .boolean()\n      .describe(\n        'Controls whether or not deploy keys may be added and used for repositories in the organization.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsUpdateParams = z.infer<typeof OrgsUpdateParamsSchema>\n\n  export const OrgsUpdateResponseSchema = OrganizationFullSchema\n  export type OrgsUpdateResponse = z.infer<typeof OrgsUpdateResponseSchema>\n\n  export const ActionsGetActionsCacheUsageForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsGetActionsCacheUsageForOrgParams = z.infer<\n    typeof ActionsGetActionsCacheUsageForOrgParamsSchema\n  >\n\n  export const ActionsGetActionsCacheUsageForOrgResponseSchema =\n    ActionsCacheUsageOrgEnterpriseSchema\n  export type ActionsGetActionsCacheUsageForOrgResponse = z.infer<\n    typeof ActionsGetActionsCacheUsageForOrgResponseSchema\n  >\n\n  export const ActionsGetActionsCacheUsageByRepoForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsGetActionsCacheUsageByRepoForOrgParams = z.infer<\n    typeof ActionsGetActionsCacheUsageByRepoForOrgParamsSchema\n  >\n\n  export const ActionsGetActionsCacheUsageByRepoForOrgResponseSchema = z.object(\n    {\n      total_count: z.number().int(),\n      repository_cache_usages: z.array(ActionsCacheUsageByRepositorySchema)\n    }\n  )\n  export type ActionsGetActionsCacheUsageByRepoForOrgResponse = z.infer<\n    typeof ActionsGetActionsCacheUsageByRepoForOrgResponseSchema\n  >\n\n  export const ActionsListHostedRunnersForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListHostedRunnersForOrgParams = z.infer<\n    typeof ActionsListHostedRunnersForOrgParamsSchema\n  >\n\n  export const ActionsListHostedRunnersForOrgResponseSchema = z.object({\n    total_count: z.number().int(),\n    runners: z.array(ActionsHostedRunnerSchema)\n  })\n  export type ActionsListHostedRunnersForOrgResponse = z.infer<\n    typeof ActionsListHostedRunnersForOrgResponseSchema\n  >\n\n  export const ActionsCreateHostedRunnerForOrgParamsSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        \"Name of the runner. Must be between 1 and 64 characters and may only contain upper and lowercase letters a-z, numbers 0-9, '.', '-', and '_'.\"\n      ),\n    image: z\n      .object({\n        id: z\n          .string()\n          .describe('The unique identifier of the runner image.')\n          .optional(),\n        source: z\n          .enum(['github', 'partner', 'custom'])\n          .describe('The source of the runner image.')\n          .optional()\n      })\n      .describe(\n        'The image of runner. To list all available images, use `GET /actions/hosted-runners/images/github-owned` or `GET /actions/hosted-runners/images/partner`.'\n      ),\n    size: z\n      .string()\n      .describe(\n        'The machine size of the runner. To list available sizes, use `GET actions/hosted-runners/machine-sizes`'\n      ),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('The existing runner group to add this runner to.'),\n    maximum_runners: z\n      .number()\n      .int()\n      .describe(\n        'The maximum amount of runners to scale up to. Runners will not auto-scale above this number. Use this setting to limit your cost.'\n      )\n      .optional(),\n    enable_static_ip: z\n      .boolean()\n      .describe(\n        'Whether this runner should be created with a static public IP. Note limit on account. To list limits on account, use `GET actions/hosted-runners/limits`'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsCreateHostedRunnerForOrgParams = z.infer<\n    typeof ActionsCreateHostedRunnerForOrgParamsSchema\n  >\n\n  export type ActionsCreateHostedRunnerForOrgResponse = undefined\n\n  export const ActionsGetHostedRunnersGithubOwnedImagesForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type ActionsGetHostedRunnersGithubOwnedImagesForOrgParams = z.infer<\n    typeof ActionsGetHostedRunnersGithubOwnedImagesForOrgParamsSchema\n  >\n\n  export const ActionsGetHostedRunnersGithubOwnedImagesForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      images: z.array(ActionsHostedRunnerImageSchema)\n    })\n  export type ActionsGetHostedRunnersGithubOwnedImagesForOrgResponse = z.infer<\n    typeof ActionsGetHostedRunnersGithubOwnedImagesForOrgResponseSchema\n  >\n\n  export const ActionsGetHostedRunnersPartnerImagesForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type ActionsGetHostedRunnersPartnerImagesForOrgParams = z.infer<\n    typeof ActionsGetHostedRunnersPartnerImagesForOrgParamsSchema\n  >\n\n  export const ActionsGetHostedRunnersPartnerImagesForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      images: z.array(ActionsHostedRunnerImageSchema)\n    })\n  export type ActionsGetHostedRunnersPartnerImagesForOrgResponse = z.infer<\n    typeof ActionsGetHostedRunnersPartnerImagesForOrgResponseSchema\n  >\n\n  export const ActionsGetHostedRunnersLimitsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsGetHostedRunnersLimitsForOrgParams = z.infer<\n    typeof ActionsGetHostedRunnersLimitsForOrgParamsSchema\n  >\n\n  export const ActionsGetHostedRunnersLimitsForOrgResponseSchema =\n    ActionsHostedRunnerLimitsSchema\n  export type ActionsGetHostedRunnersLimitsForOrgResponse = z.infer<\n    typeof ActionsGetHostedRunnersLimitsForOrgResponseSchema\n  >\n\n  export const ActionsGetHostedRunnersMachineSpecsForOrgParamsSchema = z.object(\n    {\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    }\n  )\n  export type ActionsGetHostedRunnersMachineSpecsForOrgParams = z.infer<\n    typeof ActionsGetHostedRunnersMachineSpecsForOrgParamsSchema\n  >\n\n  export const ActionsGetHostedRunnersMachineSpecsForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      machine_specs: z.array(ActionsHostedRunnerMachineSpecSchema)\n    })\n  export type ActionsGetHostedRunnersMachineSpecsForOrgResponse = z.infer<\n    typeof ActionsGetHostedRunnersMachineSpecsForOrgResponseSchema\n  >\n\n  export const ActionsGetHostedRunnersPlatformsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsGetHostedRunnersPlatformsForOrgParams = z.infer<\n    typeof ActionsGetHostedRunnersPlatformsForOrgParamsSchema\n  >\n\n  export const ActionsGetHostedRunnersPlatformsForOrgResponseSchema = z.object({\n    total_count: z.number().int(),\n    platforms: z.array(z.string())\n  })\n  export type ActionsGetHostedRunnersPlatformsForOrgResponse = z.infer<\n    typeof ActionsGetHostedRunnersPlatformsForOrgResponseSchema\n  >\n\n  export const ActionsGetHostedRunnerForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hosted_runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the GitHub-hosted runner.')\n  })\n  export type ActionsGetHostedRunnerForOrgParams = z.infer<\n    typeof ActionsGetHostedRunnerForOrgParamsSchema\n  >\n\n  export const ActionsGetHostedRunnerForOrgResponseSchema =\n    ActionsHostedRunnerSchema\n  export type ActionsGetHostedRunnerForOrgResponse = z.infer<\n    typeof ActionsGetHostedRunnerForOrgResponseSchema\n  >\n\n  export const ActionsDeleteHostedRunnerForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hosted_runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the GitHub-hosted runner.')\n  })\n  export type ActionsDeleteHostedRunnerForOrgParams = z.infer<\n    typeof ActionsDeleteHostedRunnerForOrgParamsSchema\n  >\n\n  export type ActionsDeleteHostedRunnerForOrgResponse = undefined\n\n  export const ActionsUpdateHostedRunnerForOrgParamsSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        \"Name of the runner. Must be between 1 and 64 characters and may only contain upper and lowercase letters a-z, numbers 0-9, '.', '-', and '_'.\"\n      )\n      .optional(),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('The existing runner group to add this runner to.')\n      .optional(),\n    maximum_runners: z\n      .number()\n      .int()\n      .describe(\n        'The maximum amount of runners to scale up to. Runners will not auto-scale above this number. Use this setting to limit your cost.'\n      )\n      .optional(),\n    enable_static_ip: z\n      .boolean()\n      .describe(\n        'Whether this runner should be updated with a static public IP. Note limit on account. To list limits on account, use `GET actions/hosted-runners/limits`'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hosted_runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the GitHub-hosted runner.')\n  })\n  export type ActionsUpdateHostedRunnerForOrgParams = z.infer<\n    typeof ActionsUpdateHostedRunnerForOrgParamsSchema\n  >\n\n  export const ActionsUpdateHostedRunnerForOrgResponseSchema =\n    ActionsHostedRunnerSchema\n  export type ActionsUpdateHostedRunnerForOrgResponse = z.infer<\n    typeof ActionsUpdateHostedRunnerForOrgResponseSchema\n  >\n\n  export const OidcGetOidcCustomSubTemplateForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OidcGetOidcCustomSubTemplateForOrgParams = z.infer<\n    typeof OidcGetOidcCustomSubTemplateForOrgParamsSchema\n  >\n\n  export const OidcGetOidcCustomSubTemplateForOrgResponseSchema =\n    OidcCustomSubSchema\n  export type OidcGetOidcCustomSubTemplateForOrgResponse = z.infer<\n    typeof OidcGetOidcCustomSubTemplateForOrgResponseSchema\n  >\n\n  export const OidcUpdateOidcCustomSubTemplateForOrgParamsSchema = z\n    .object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n    .merge(OidcCustomSubSchema)\n  export type OidcUpdateOidcCustomSubTemplateForOrgParams = z.infer<\n    typeof OidcUpdateOidcCustomSubTemplateForOrgParamsSchema\n  >\n\n  export type OidcUpdateOidcCustomSubTemplateForOrgResponse = undefined\n\n  export const ActionsGetGithubActionsPermissionsOrganizationParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type ActionsGetGithubActionsPermissionsOrganizationParams = z.infer<\n    typeof ActionsGetGithubActionsPermissionsOrganizationParamsSchema\n  >\n\n  export const ActionsGetGithubActionsPermissionsOrganizationResponseSchema =\n    ActionsOrganizationPermissionsSchema\n  export type ActionsGetGithubActionsPermissionsOrganizationResponse = z.infer<\n    typeof ActionsGetGithubActionsPermissionsOrganizationResponseSchema\n  >\n\n  export const ActionsSetGithubActionsPermissionsOrganizationParamsSchema =\n    z.object({\n      enabled_repositories: EnabledRepositoriesSchema,\n      allowed_actions: AllowedActionsSchema.optional(),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type ActionsSetGithubActionsPermissionsOrganizationParams = z.infer<\n    typeof ActionsSetGithubActionsPermissionsOrganizationParamsSchema\n  >\n\n  export type ActionsSetGithubActionsPermissionsOrganizationResponse = undefined\n\n  export const ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationParams =\n    z.infer<\n      typeof ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationParamsSchema\n    >\n\n  export const ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationResponseSchema =\n    z.object({\n      total_count: z.number(),\n      repositories: z.array(RepositorySchema)\n    })\n  export type ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationResponse =\n    z.infer<\n      typeof ActionsListSelectedRepositoriesEnabledGithubActionsOrganizationResponseSchema\n    >\n\n  export const ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationParamsSchema =\n    z.object({\n      selected_repository_ids: z\n        .array(\n          z.number().int().describe('Unique identifier of the repository.')\n        )\n        .describe('List of repository IDs to enable for GitHub Actions.'),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationParams =\n    z.infer<\n      typeof ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationParamsSchema\n    >\n\n  export type ActionsSetSelectedRepositoriesEnabledGithubActionsOrganizationResponse =\n    undefined\n\n  export const ActionsEnableSelectedRepositoryGithubActionsOrganizationParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the repository.')\n    })\n  export type ActionsEnableSelectedRepositoryGithubActionsOrganizationParams =\n    z.infer<\n      typeof ActionsEnableSelectedRepositoryGithubActionsOrganizationParamsSchema\n    >\n\n  export type ActionsEnableSelectedRepositoryGithubActionsOrganizationResponse =\n    undefined\n\n  export const ActionsDisableSelectedRepositoryGithubActionsOrganizationParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the repository.')\n    })\n  export type ActionsDisableSelectedRepositoryGithubActionsOrganizationParams =\n    z.infer<\n      typeof ActionsDisableSelectedRepositoryGithubActionsOrganizationParamsSchema\n    >\n\n  export type ActionsDisableSelectedRepositoryGithubActionsOrganizationResponse =\n    undefined\n\n  export const ActionsGetAllowedActionsOrganizationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsGetAllowedActionsOrganizationParams = z.infer<\n    typeof ActionsGetAllowedActionsOrganizationParamsSchema\n  >\n\n  export const ActionsGetAllowedActionsOrganizationResponseSchema =\n    SelectedActionsSchema\n  export type ActionsGetAllowedActionsOrganizationResponse = z.infer<\n    typeof ActionsGetAllowedActionsOrganizationResponseSchema\n  >\n\n  export const ActionsSetAllowedActionsOrganizationParamsSchema = z\n    .object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n    .merge(SelectedActionsSchema)\n  export type ActionsSetAllowedActionsOrganizationParams = z.infer<\n    typeof ActionsSetAllowedActionsOrganizationParamsSchema\n  >\n\n  export type ActionsSetAllowedActionsOrganizationResponse = undefined\n\n  export const ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationParams =\n    z.infer<\n      typeof ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationParamsSchema\n    >\n\n  export const ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationResponseSchema =\n    ActionsGetDefaultWorkflowPermissionsSchema\n  export type ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationResponse =\n    z.infer<\n      typeof ActionsGetGithubActionsDefaultWorkflowPermissionsOrganizationResponseSchema\n    >\n\n  export const ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationParamsSchema =\n    z\n      .object({\n        org: z\n          .string()\n          .describe('The organization name. The name is not case sensitive.')\n      })\n      .merge(ActionsSetDefaultWorkflowPermissionsSchema)\n  export type ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationParams =\n    z.infer<\n      typeof ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationParamsSchema\n    >\n\n  export type ActionsSetGithubActionsDefaultWorkflowPermissionsOrganizationResponse =\n    undefined\n\n  export const ActionsListSelfHostedRunnerGroupsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    visible_to_repository: z\n      .string()\n      .describe(\n        'Only return runner groups that are allowed to be used by this repository.'\n      )\n      .optional()\n  })\n  export type ActionsListSelfHostedRunnerGroupsForOrgParams = z.infer<\n    typeof ActionsListSelfHostedRunnerGroupsForOrgParamsSchema\n  >\n\n  export const ActionsListSelfHostedRunnerGroupsForOrgResponseSchema = z.object(\n    { total_count: z.number(), runner_groups: z.array(RunnerGroupsOrgSchema) }\n  )\n  export type ActionsListSelfHostedRunnerGroupsForOrgResponse = z.infer<\n    typeof ActionsListSelfHostedRunnerGroupsForOrgResponseSchema\n  >\n\n  export const ActionsCreateSelfHostedRunnerGroupForOrgParamsSchema = z.object({\n    name: z.string().describe('Name of the runner group.'),\n    visibility: z\n      .enum(['selected', 'all', 'private'])\n      .describe(\n        'Visibility of a runner group. You can select all repositories, select individual repositories, or limit access to private repositories.'\n      )\n      .default('all'),\n    selected_repository_ids: z\n      .array(z.number().int().describe('Unique identifier of the repository.'))\n      .describe('List of repository IDs that can access the runner group.')\n      .optional(),\n    runners: z\n      .array(z.number().int().describe('Unique identifier of the runner.'))\n      .describe('List of runner IDs to add to the runner group.')\n      .optional(),\n    allows_public_repositories: z\n      .boolean()\n      .describe(\n        'Whether the runner group can be used by `public` repositories.'\n      )\n      .default(false),\n    restricted_to_workflows: z\n      .boolean()\n      .describe(\n        'If `true`, the runner group will be restricted to running only the workflows specified in the `selected_workflows` array.'\n      )\n      .default(false),\n    selected_workflows: z\n      .array(\n        z\n          .string()\n          .describe(\n            'Name of workflow the runner group should be allowed to run. Note that a ref, tag, or long SHA is required.'\n          )\n      )\n      .describe(\n        'List of workflows the runner group should be allowed to run. This setting will be ignored unless `restricted_to_workflows` is set to `true`.'\n      )\n      .optional(),\n    network_configuration_id: z\n      .string()\n      .describe('The identifier of a hosted compute network configuration.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsCreateSelfHostedRunnerGroupForOrgParams = z.infer<\n    typeof ActionsCreateSelfHostedRunnerGroupForOrgParamsSchema\n  >\n\n  export type ActionsCreateSelfHostedRunnerGroupForOrgResponse = undefined\n\n  export const ActionsGetSelfHostedRunnerGroupForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner group.')\n  })\n  export type ActionsGetSelfHostedRunnerGroupForOrgParams = z.infer<\n    typeof ActionsGetSelfHostedRunnerGroupForOrgParamsSchema\n  >\n\n  export const ActionsGetSelfHostedRunnerGroupForOrgResponseSchema =\n    RunnerGroupsOrgSchema\n  export type ActionsGetSelfHostedRunnerGroupForOrgResponse = z.infer<\n    typeof ActionsGetSelfHostedRunnerGroupForOrgResponseSchema\n  >\n\n  export const ActionsDeleteSelfHostedRunnerGroupFromOrgParamsSchema = z.object(\n    {\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.')\n    }\n  )\n  export type ActionsDeleteSelfHostedRunnerGroupFromOrgParams = z.infer<\n    typeof ActionsDeleteSelfHostedRunnerGroupFromOrgParamsSchema\n  >\n\n  export type ActionsDeleteSelfHostedRunnerGroupFromOrgResponse = undefined\n\n  export const ActionsUpdateSelfHostedRunnerGroupForOrgParamsSchema = z.object({\n    name: z.string().describe('Name of the runner group.'),\n    visibility: z\n      .enum(['selected', 'all', 'private'])\n      .describe(\n        'Visibility of a runner group. You can select all repositories, select individual repositories, or all private repositories.'\n      )\n      .optional(),\n    allows_public_repositories: z\n      .boolean()\n      .describe(\n        'Whether the runner group can be used by `public` repositories.'\n      )\n      .default(false),\n    restricted_to_workflows: z\n      .boolean()\n      .describe(\n        'If `true`, the runner group will be restricted to running only the workflows specified in the `selected_workflows` array.'\n      )\n      .default(false),\n    selected_workflows: z\n      .array(\n        z\n          .string()\n          .describe(\n            'Name of workflow the runner group should be allowed to run. Note that a ref, tag, or long SHA is required.'\n          )\n      )\n      .describe(\n        'List of workflows the runner group should be allowed to run. This setting will be ignored unless `restricted_to_workflows` is set to `true`.'\n      )\n      .optional(),\n    network_configuration_id: z\n      .string()\n      .describe('The identifier of a hosted compute network configuration.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner group.')\n  })\n  export type ActionsUpdateSelfHostedRunnerGroupForOrgParams = z.infer<\n    typeof ActionsUpdateSelfHostedRunnerGroupForOrgParamsSchema\n  >\n\n  export const ActionsUpdateSelfHostedRunnerGroupForOrgResponseSchema =\n    RunnerGroupsOrgSchema\n  export type ActionsUpdateSelfHostedRunnerGroupForOrgResponse = z.infer<\n    typeof ActionsUpdateSelfHostedRunnerGroupForOrgResponseSchema\n  >\n\n  export const ActionsListGithubHostedRunnersInGroupForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type ActionsListGithubHostedRunnersInGroupForOrgParams = z.infer<\n    typeof ActionsListGithubHostedRunnersInGroupForOrgParamsSchema\n  >\n\n  export const ActionsListGithubHostedRunnersInGroupForOrgResponseSchema =\n    z.object({\n      total_count: z.number(),\n      runners: z.array(ActionsHostedRunnerSchema)\n    })\n  export type ActionsListGithubHostedRunnersInGroupForOrgResponse = z.infer<\n    typeof ActionsListGithubHostedRunnersInGroupForOrgResponseSchema\n  >\n\n  export const ActionsListRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.'),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30)\n    })\n  export type ActionsListRepoAccessToSelfHostedRunnerGroupInOrgParams = z.infer<\n    typeof ActionsListRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema\n  >\n\n  export const ActionsListRepoAccessToSelfHostedRunnerGroupInOrgResponseSchema =\n    z.object({\n      total_count: z.number(),\n      repositories: z.array(MinimalRepositorySchema)\n    })\n  export type ActionsListRepoAccessToSelfHostedRunnerGroupInOrgResponse =\n    z.infer<\n      typeof ActionsListRepoAccessToSelfHostedRunnerGroupInOrgResponseSchema\n    >\n\n  export const ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema =\n    z.object({\n      selected_repository_ids: z\n        .array(\n          z.number().int().describe('Unique identifier of the repository.')\n        )\n        .describe('List of repository IDs that can access the runner group.'),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.')\n    })\n  export type ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgParams = z.infer<\n    typeof ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema\n  >\n\n  export type ActionsSetRepoAccessToSelfHostedRunnerGroupInOrgResponse =\n    undefined\n\n  export const ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.'),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the repository.')\n    })\n  export type ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgParams = z.infer<\n    typeof ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema\n  >\n\n  export type ActionsAddRepoAccessToSelfHostedRunnerGroupInOrgResponse =\n    undefined\n\n  export const ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.'),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the repository.')\n    })\n  export type ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgParams =\n    z.infer<\n      typeof ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgParamsSchema\n    >\n\n  export type ActionsRemoveRepoAccessToSelfHostedRunnerGroupInOrgResponse =\n    undefined\n\n  export const ActionsListSelfHostedRunnersInGroupForOrgParamsSchema = z.object(\n    {\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type ActionsListSelfHostedRunnersInGroupForOrgParams = z.infer<\n    typeof ActionsListSelfHostedRunnersInGroupForOrgParamsSchema\n  >\n\n  export const ActionsListSelfHostedRunnersInGroupForOrgResponseSchema =\n    z.object({ total_count: z.number(), runners: z.array(RunnerSchema) })\n  export type ActionsListSelfHostedRunnersInGroupForOrgResponse = z.infer<\n    typeof ActionsListSelfHostedRunnersInGroupForOrgResponseSchema\n  >\n\n  export const ActionsSetSelfHostedRunnersInGroupForOrgParamsSchema = z.object({\n    runners: z\n      .array(z.number().int().describe('Unique identifier of the runner.'))\n      .describe('List of runner IDs to add to the runner group.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner group.')\n  })\n  export type ActionsSetSelfHostedRunnersInGroupForOrgParams = z.infer<\n    typeof ActionsSetSelfHostedRunnersInGroupForOrgParamsSchema\n  >\n\n  export type ActionsSetSelfHostedRunnersInGroupForOrgResponse = undefined\n\n  export const ActionsAddSelfHostedRunnerToGroupForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner group.'),\n    runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner.')\n  })\n  export type ActionsAddSelfHostedRunnerToGroupForOrgParams = z.infer<\n    typeof ActionsAddSelfHostedRunnerToGroupForOrgParamsSchema\n  >\n\n  export type ActionsAddSelfHostedRunnerToGroupForOrgResponse = undefined\n\n  export const ActionsRemoveSelfHostedRunnerFromGroupForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_group_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner group.'),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsRemoveSelfHostedRunnerFromGroupForOrgParams = z.infer<\n    typeof ActionsRemoveSelfHostedRunnerFromGroupForOrgParamsSchema\n  >\n\n  export type ActionsRemoveSelfHostedRunnerFromGroupForOrgResponse = undefined\n\n  export const ActionsListSelfHostedRunnersForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    name: z.string().describe('The name of a self-hosted runner.').optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListSelfHostedRunnersForOrgParams = z.infer<\n    typeof ActionsListSelfHostedRunnersForOrgParamsSchema\n  >\n\n  export const ActionsListSelfHostedRunnersForOrgResponseSchema = z.object({\n    total_count: z.number().int(),\n    runners: z.array(RunnerSchema)\n  })\n  export type ActionsListSelfHostedRunnersForOrgResponse = z.infer<\n    typeof ActionsListSelfHostedRunnersForOrgResponseSchema\n  >\n\n  export const ActionsListRunnerApplicationsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsListRunnerApplicationsForOrgParams = z.infer<\n    typeof ActionsListRunnerApplicationsForOrgParamsSchema\n  >\n\n  export const ActionsListRunnerApplicationsForOrgResponseSchema = z.array(\n    RunnerApplicationSchema\n  )\n  export type ActionsListRunnerApplicationsForOrgResponse = z.infer<\n    typeof ActionsListRunnerApplicationsForOrgResponseSchema\n  >\n\n  export const ActionsGenerateRunnerJitconfigForOrgParamsSchema = z.object({\n    name: z.string().describe('The name of the new runner.'),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('The ID of the runner group to register the runner to.'),\n    labels: z\n      .array(z.string())\n      .min(1)\n      .max(100)\n      .describe(\n        'The names of the custom labels to add to the runner. **Minimum items**: 1. **Maximum items**: 100.'\n      ),\n    work_folder: z\n      .string()\n      .describe(\n        'The working directory to be used for job execution, relative to the runner install directory.'\n      )\n      .default('_work'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsGenerateRunnerJitconfigForOrgParams = z.infer<\n    typeof ActionsGenerateRunnerJitconfigForOrgParamsSchema\n  >\n\n  export type ActionsGenerateRunnerJitconfigForOrgResponse = undefined\n\n  export const ActionsCreateRegistrationTokenForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsCreateRegistrationTokenForOrgParams = z.infer<\n    typeof ActionsCreateRegistrationTokenForOrgParamsSchema\n  >\n\n  export type ActionsCreateRegistrationTokenForOrgResponse = undefined\n\n  export const ActionsCreateRemoveTokenForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsCreateRemoveTokenForOrgParams = z.infer<\n    typeof ActionsCreateRemoveTokenForOrgParamsSchema\n  >\n\n  export type ActionsCreateRemoveTokenForOrgResponse = undefined\n\n  export const ActionsGetSelfHostedRunnerForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner.')\n  })\n  export type ActionsGetSelfHostedRunnerForOrgParams = z.infer<\n    typeof ActionsGetSelfHostedRunnerForOrgParamsSchema\n  >\n\n  export const ActionsGetSelfHostedRunnerForOrgResponseSchema = RunnerSchema\n  export type ActionsGetSelfHostedRunnerForOrgResponse = z.infer<\n    typeof ActionsGetSelfHostedRunnerForOrgResponseSchema\n  >\n\n  export const ActionsDeleteSelfHostedRunnerFromOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner.')\n  })\n  export type ActionsDeleteSelfHostedRunnerFromOrgParams = z.infer<\n    typeof ActionsDeleteSelfHostedRunnerFromOrgParamsSchema\n  >\n\n  export type ActionsDeleteSelfHostedRunnerFromOrgResponse = undefined\n\n  export const ActionsListLabelsForSelfHostedRunnerForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsListLabelsForSelfHostedRunnerForOrgParams = z.infer<\n    typeof ActionsListLabelsForSelfHostedRunnerForOrgParamsSchema\n  >\n\n  export const ActionsListLabelsForSelfHostedRunnerForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsListLabelsForSelfHostedRunnerForOrgResponse = z.infer<\n    typeof ActionsListLabelsForSelfHostedRunnerForOrgResponseSchema\n  >\n\n  export const ActionsAddCustomLabelsToSelfHostedRunnerForOrgParamsSchema =\n    z.object({\n      labels: z\n        .array(z.string())\n        .min(1)\n        .max(100)\n        .describe('The names of the custom labels to add to the runner.'),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsAddCustomLabelsToSelfHostedRunnerForOrgParams = z.infer<\n    typeof ActionsAddCustomLabelsToSelfHostedRunnerForOrgParamsSchema\n  >\n\n  export const ActionsAddCustomLabelsToSelfHostedRunnerForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsAddCustomLabelsToSelfHostedRunnerForOrgResponse = z.infer<\n    typeof ActionsAddCustomLabelsToSelfHostedRunnerForOrgResponseSchema\n  >\n\n  export const ActionsSetCustomLabelsForSelfHostedRunnerForOrgParamsSchema =\n    z.object({\n      labels: z\n        .array(z.string())\n        .min(0)\n        .max(100)\n        .describe(\n          'The names of the custom labels to set for the runner. You can pass an empty array to remove all custom labels.'\n        ),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsSetCustomLabelsForSelfHostedRunnerForOrgParams = z.infer<\n    typeof ActionsSetCustomLabelsForSelfHostedRunnerForOrgParamsSchema\n  >\n\n  export const ActionsSetCustomLabelsForSelfHostedRunnerForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsSetCustomLabelsForSelfHostedRunnerForOrgResponse = z.infer<\n    typeof ActionsSetCustomLabelsForSelfHostedRunnerForOrgResponseSchema\n  >\n\n  export const ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgParams =\n    z.infer<\n      typeof ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgParamsSchema\n    >\n\n  export const ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgResponse =\n    z.infer<\n      typeof ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForOrgResponseSchema\n    >\n\n  export const ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.'),\n      name: z\n        .string()\n        .describe(\"The name of a self-hosted runner's custom label.\")\n    })\n  export type ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgParams =\n    z.infer<\n      typeof ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgParamsSchema\n    >\n\n  export const ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgResponse =\n    z.infer<\n      typeof ActionsRemoveCustomLabelFromSelfHostedRunnerForOrgResponseSchema\n    >\n\n  export const ActionsListOrgSecretsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListOrgSecretsParams = z.infer<\n    typeof ActionsListOrgSecretsParamsSchema\n  >\n\n  export const ActionsListOrgSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(OrganizationActionsSecretSchema)\n  })\n  export type ActionsListOrgSecretsResponse = z.infer<\n    typeof ActionsListOrgSecretsResponseSchema\n  >\n\n  export const ActionsGetOrgPublicKeyParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsGetOrgPublicKeyParams = z.infer<\n    typeof ActionsGetOrgPublicKeyParamsSchema\n  >\n\n  export const ActionsGetOrgPublicKeyResponseSchema = ActionsPublicKeySchema\n  export type ActionsGetOrgPublicKeyResponse = z.infer<\n    typeof ActionsGetOrgPublicKeyResponseSchema\n  >\n\n  export const ActionsGetOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsGetOrgSecretParams = z.infer<\n    typeof ActionsGetOrgSecretParamsSchema\n  >\n\n  export const ActionsGetOrgSecretResponseSchema =\n    OrganizationActionsSecretSchema\n  export type ActionsGetOrgSecretResponse = z.infer<\n    typeof ActionsGetOrgSecretResponseSchema\n  >\n\n  export const ActionsCreateOrUpdateOrgSecretParamsSchema = z.object({\n    encrypted_value: z\n      .string()\n      .regex(\n        new RegExp(\n          '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n        )\n      )\n      .describe(\n        'Value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get an organization public key](https://docs.github.com/rest/actions/secrets#get-an-organization-public-key) endpoint.'\n      ),\n    key_id: z\n      .string()\n      .describe('ID of the key you used to encrypt the secret.'),\n    visibility: z\n      .enum(['all', 'private', 'selected'])\n      .describe(\n        'Which type of organization repositories have access to the organization secret. `selected` means only the repositories specified by `selected_repository_ids` can access the secret.'\n      ),\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'An array of repository ids that can access the organization secret. You can only provide a list of repository ids when the `visibility` is set to `selected`. You can manage the list of selected repositories using the [List selected repositories for an organization secret](https://docs.github.com/rest/actions/secrets#list-selected-repositories-for-an-organization-secret), [Set selected repositories for an organization secret](https://docs.github.com/rest/actions/secrets#set-selected-repositories-for-an-organization-secret), and [Remove selected repository from an organization secret](https://docs.github.com/rest/actions/secrets#remove-selected-repository-from-an-organization-secret) endpoints.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsCreateOrUpdateOrgSecretParams = z.infer<\n    typeof ActionsCreateOrUpdateOrgSecretParamsSchema\n  >\n\n  export type ActionsCreateOrUpdateOrgSecretResponse = undefined\n\n  export const ActionsDeleteOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsDeleteOrgSecretParams = z.infer<\n    typeof ActionsDeleteOrgSecretParamsSchema\n  >\n\n  export type ActionsDeleteOrgSecretResponse = undefined\n\n  export const ActionsListSelectedReposForOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type ActionsListSelectedReposForOrgSecretParams = z.infer<\n    typeof ActionsListSelectedReposForOrgSecretParamsSchema\n  >\n\n  export const ActionsListSelectedReposForOrgSecretResponseSchema = z.object({\n    total_count: z.number().int(),\n    repositories: z.array(MinimalRepositorySchema)\n  })\n  export type ActionsListSelectedReposForOrgSecretResponse = z.infer<\n    typeof ActionsListSelectedReposForOrgSecretResponseSchema\n  >\n\n  export const ActionsSetSelectedReposForOrgSecretParamsSchema = z.object({\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'An array of repository ids that can access the organization secret. You can only provide a list of repository ids when the `visibility` is set to `selected`. You can add and remove individual repositories using the [Add selected repository to an organization secret](https://docs.github.com/rest/actions/secrets#add-selected-repository-to-an-organization-secret) and [Remove selected repository from an organization secret](https://docs.github.com/rest/actions/secrets#remove-selected-repository-from-an-organization-secret) endpoints.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsSetSelectedReposForOrgSecretParams = z.infer<\n    typeof ActionsSetSelectedReposForOrgSecretParamsSchema\n  >\n\n  export type ActionsSetSelectedReposForOrgSecretResponse = undefined\n\n  export const ActionsAddSelectedRepoToOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.'),\n    repository_id: z.number().int()\n  })\n  export type ActionsAddSelectedRepoToOrgSecretParams = z.infer<\n    typeof ActionsAddSelectedRepoToOrgSecretParamsSchema\n  >\n\n  export type ActionsAddSelectedRepoToOrgSecretResponse = undefined\n\n  export const ActionsRemoveSelectedRepoFromOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.'),\n    repository_id: z.number().int()\n  })\n  export type ActionsRemoveSelectedRepoFromOrgSecretParams = z.infer<\n    typeof ActionsRemoveSelectedRepoFromOrgSecretParamsSchema\n  >\n\n  export type ActionsRemoveSelectedRepoFromOrgSecretResponse = undefined\n\n  export const ActionsListOrgVariablesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 30). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(10),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListOrgVariablesParams = z.infer<\n    typeof ActionsListOrgVariablesParamsSchema\n  >\n\n  export const ActionsListOrgVariablesResponseSchema = z.object({\n    total_count: z.number().int(),\n    variables: z.array(OrganizationActionsVariableSchema)\n  })\n  export type ActionsListOrgVariablesResponse = z.infer<\n    typeof ActionsListOrgVariablesResponseSchema\n  >\n\n  export const ActionsCreateOrgVariableParamsSchema = z.object({\n    name: z.string().describe('The name of the variable.'),\n    value: z.string().describe('The value of the variable.'),\n    visibility: z\n      .enum(['all', 'private', 'selected'])\n      .describe(\n        'The type of repositories in the organization that can access the variable. `selected` means only the repositories specified by `selected_repository_ids` can access the variable.'\n      ),\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'An array of repository ids that can access the organization variable. You can only provide a list of repository ids when the `visibility` is set to `selected`.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsCreateOrgVariableParams = z.infer<\n    typeof ActionsCreateOrgVariableParamsSchema\n  >\n\n  export type ActionsCreateOrgVariableResponse = undefined\n\n  export const ActionsGetOrgVariableParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    name: z.string().describe('The name of the variable.')\n  })\n  export type ActionsGetOrgVariableParams = z.infer<\n    typeof ActionsGetOrgVariableParamsSchema\n  >\n\n  export const ActionsGetOrgVariableResponseSchema =\n    OrganizationActionsVariableSchema\n  export type ActionsGetOrgVariableResponse = z.infer<\n    typeof ActionsGetOrgVariableResponseSchema\n  >\n\n  export const ActionsDeleteOrgVariableParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    name: z.string().describe('The name of the variable.')\n  })\n  export type ActionsDeleteOrgVariableParams = z.infer<\n    typeof ActionsDeleteOrgVariableParamsSchema\n  >\n\n  export type ActionsDeleteOrgVariableResponse = undefined\n\n  export const ActionsUpdateOrgVariableParamsSchema = z.object({\n    name: z.string().describe('The name of the variable.'),\n    value: z.string().describe('The value of the variable.').optional(),\n    visibility: z\n      .enum(['all', 'private', 'selected'])\n      .describe(\n        'The type of repositories in the organization that can access the variable. `selected` means only the repositories specified by `selected_repository_ids` can access the variable.'\n      )\n      .optional(),\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'An array of repository ids that can access the organization variable. You can only provide a list of repository ids when the `visibility` is set to `selected`.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ActionsUpdateOrgVariableParams = z.infer<\n    typeof ActionsUpdateOrgVariableParamsSchema\n  >\n\n  export type ActionsUpdateOrgVariableResponse = undefined\n\n  export const ActionsListSelectedReposForOrgVariableParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    name: z.string().describe('The name of the variable.'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type ActionsListSelectedReposForOrgVariableParams = z.infer<\n    typeof ActionsListSelectedReposForOrgVariableParamsSchema\n  >\n\n  export const ActionsListSelectedReposForOrgVariableResponseSchema = z.object({\n    total_count: z.number().int(),\n    repositories: z.array(MinimalRepositorySchema)\n  })\n  export type ActionsListSelectedReposForOrgVariableResponse = z.infer<\n    typeof ActionsListSelectedReposForOrgVariableResponseSchema\n  >\n\n  export const ActionsSetSelectedReposForOrgVariableParamsSchema = z.object({\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'The IDs of the repositories that can access the organization variable.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    name: z.string().describe('The name of the variable.')\n  })\n  export type ActionsSetSelectedReposForOrgVariableParams = z.infer<\n    typeof ActionsSetSelectedReposForOrgVariableParamsSchema\n  >\n\n  export type ActionsSetSelectedReposForOrgVariableResponse = undefined\n\n  export const ActionsAddSelectedRepoToOrgVariableParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    name: z.string().describe('The name of the variable.'),\n    repository_id: z.number().int()\n  })\n  export type ActionsAddSelectedRepoToOrgVariableParams = z.infer<\n    typeof ActionsAddSelectedRepoToOrgVariableParamsSchema\n  >\n\n  export type ActionsAddSelectedRepoToOrgVariableResponse = undefined\n\n  export const ActionsRemoveSelectedRepoFromOrgVariableParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    name: z.string().describe('The name of the variable.'),\n    repository_id: z.number().int()\n  })\n  export type ActionsRemoveSelectedRepoFromOrgVariableParams = z.infer<\n    typeof ActionsRemoveSelectedRepoFromOrgVariableParamsSchema\n  >\n\n  export type ActionsRemoveSelectedRepoFromOrgVariableResponse = undefined\n\n  export const OrgsListAttestationsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    subject_digest: z\n      .string()\n      .describe(\n        \"The parameter should be set to the attestation's subject's SHA256 digest, in the form `sha256:HEX_DIGEST`.\"\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    predicate_type: z\n      .string()\n      .describe(\n        'Optional filter for fetching attestations with a given predicate type.\\nThis option accepts `provenance`, `sbom`, or freeform text for custom predicate types.'\n      )\n      .optional()\n  })\n  export type OrgsListAttestationsParams = z.infer<\n    typeof OrgsListAttestationsParamsSchema\n  >\n\n  export const OrgsListAttestationsResponseSchema = z.object({\n    attestations: z\n      .array(\n        z.object({\n          bundle: z\n            .object({\n              mediaType: z.string().optional(),\n              verificationMaterial: z.object({}).catchall(z.any()).optional(),\n              dsseEnvelope: z.object({}).catchall(z.any()).optional()\n            })\n            .describe(\n              \"The attestation's Sigstore Bundle.\\nRefer to the [Sigstore Bundle Specification](https://github.com/sigstore/protobuf-specs/blob/main/protos/sigstore_bundle.proto) for more information.\"\n            )\n            .optional(),\n          repository_id: z.number().int().optional(),\n          bundle_url: z.string().optional()\n        })\n      )\n      .optional()\n  })\n  export type OrgsListAttestationsResponse = z.infer<\n    typeof OrgsListAttestationsResponseSchema\n  >\n\n  export const OrgsListBlockedUsersParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListBlockedUsersParams = z.infer<\n    typeof OrgsListBlockedUsersParamsSchema\n  >\n\n  export const OrgsListBlockedUsersResponseSchema = z.array(SimpleUserSchema)\n  export type OrgsListBlockedUsersResponse = z.infer<\n    typeof OrgsListBlockedUsersResponseSchema\n  >\n\n  export const OrgsCheckBlockedUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsCheckBlockedUserParams = z.infer<\n    typeof OrgsCheckBlockedUserParamsSchema\n  >\n\n  export type OrgsCheckBlockedUserResponse = undefined\n\n  export const OrgsBlockUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsBlockUserParams = z.infer<typeof OrgsBlockUserParamsSchema>\n\n  export type OrgsBlockUserResponse = undefined\n\n  export const OrgsUnblockUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsUnblockUserParams = z.infer<\n    typeof OrgsUnblockUserParamsSchema\n  >\n\n  export type OrgsUnblockUserResponse = undefined\n\n  export const CodeScanningListAlertsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    tool_name: z\n      .any()\n      .describe(\n        'The name of a code scanning tool. Only results by this tool will be listed. You can specify the tool by using either `tool_name` or `tool_guid`, but not both.'\n      )\n      .optional(),\n    tool_guid: z\n      .any()\n      .describe(\n        'The GUID of a code scanning tool. Only results by this tool will be listed. Note that some code scanning tools may not include a GUID in their analysis data. You can specify the tool by using either `tool_guid` or `tool_name`, but not both.'\n      )\n      .optional(),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    state: z\n      .any()\n      .describe(\n        'If specified, only code scanning alerts with this state will be returned.'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe('The property by which to sort the results.')\n      .default('created'),\n    severity: z\n      .any()\n      .describe(\n        'If specified, only code scanning alerts with this severity will be returned.'\n      )\n      .optional()\n  })\n  export type CodeScanningListAlertsForOrgParams = z.infer<\n    typeof CodeScanningListAlertsForOrgParamsSchema\n  >\n\n  export const CodeScanningListAlertsForOrgResponseSchema = z.array(\n    CodeScanningOrganizationAlertItemsSchema\n  )\n  export type CodeScanningListAlertsForOrgResponse = z.infer<\n    typeof CodeScanningListAlertsForOrgResponseSchema\n  >\n\n  export const CodeSecurityGetConfigurationsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    target_type: z\n      .enum(['global', 'all'])\n      .describe('The target type of the code security configuration')\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional()\n  })\n  export type CodeSecurityGetConfigurationsForOrgParams = z.infer<\n    typeof CodeSecurityGetConfigurationsForOrgParamsSchema\n  >\n\n  export const CodeSecurityGetConfigurationsForOrgResponseSchema = z.array(\n    CodeSecurityConfigurationSchema\n  )\n  export type CodeSecurityGetConfigurationsForOrgResponse = z.infer<\n    typeof CodeSecurityGetConfigurationsForOrgResponseSchema\n  >\n\n  export const CodeSecurityCreateConfigurationParamsSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        'The name of the code security configuration. Must be unique within the organization.'\n      ),\n    description: z\n      .string()\n      .max(255)\n      .describe('A description of the code security configuration'),\n    advanced_security: z\n      .enum(['enabled', 'disabled'])\n      .describe('The enablement status of GitHub Advanced Security')\n      .default('disabled'),\n    dependency_graph: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Dependency Graph')\n      .default('enabled'),\n    dependency_graph_autosubmit_action: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Automatic dependency submission')\n      .default('disabled'),\n    dependency_graph_autosubmit_action_options: z\n      .object({\n        labeled_runners: z\n          .boolean()\n          .describe(\n            \"Whether to use runners labeled with 'dependency-submission' or standard GitHub runners.\"\n          )\n          .default(false)\n      })\n      .describe('Feature options for Automatic dependency submission')\n      .optional(),\n    dependabot_alerts: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Dependabot alerts')\n      .default('disabled'),\n    dependabot_security_updates: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Dependabot security updates')\n      .default('disabled'),\n    code_scanning_default_setup: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of code scanning default setup')\n      .default('disabled'),\n    code_scanning_default_setup_options:\n      CodeScanningDefaultSetupOptionsSchema.optional(),\n    code_scanning_delegated_alert_dismissal: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe(\n        'The enablement status of code scanning delegated alert dismissal'\n      )\n      .default('not_set'),\n    secret_scanning: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning')\n      .default('disabled'),\n    secret_scanning_push_protection: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning push protection')\n      .default('disabled'),\n    secret_scanning_delegated_bypass: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning delegated bypass')\n      .default('disabled'),\n    secret_scanning_delegated_bypass_options: z\n      .object({\n        reviewers: z\n          .array(\n            z.object({\n              reviewer_id: z\n                .number()\n                .int()\n                .describe(\n                  'The ID of the team or role selected as a bypass reviewer'\n                ),\n              reviewer_type: z\n                .enum(['TEAM', 'ROLE'])\n                .describe('The type of the bypass reviewer')\n            })\n          )\n          .describe('The bypass reviewers for secret scanning delegated bypass')\n          .optional()\n      })\n      .describe('Feature options for secret scanning delegated bypass')\n      .optional(),\n    secret_scanning_validity_checks: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning validity checks')\n      .default('disabled'),\n    secret_scanning_non_provider_patterns: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe(\n        'The enablement status of secret scanning non provider patterns'\n      )\n      .default('disabled'),\n    secret_scanning_generic_secrets: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Copilot secret scanning')\n      .default('disabled'),\n    secret_scanning_delegated_alert_dismissal: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe(\n        'The enablement status of secret scanning delegated alert dismissal'\n      )\n      .optional(),\n    private_vulnerability_reporting: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of private vulnerability reporting')\n      .default('disabled'),\n    enforcement: z\n      .enum(['enforced', 'unenforced'])\n      .describe('The enforcement status for a security configuration')\n      .default('enforced'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CodeSecurityCreateConfigurationParams = z.infer<\n    typeof CodeSecurityCreateConfigurationParamsSchema\n  >\n\n  export type CodeSecurityCreateConfigurationResponse = undefined\n\n  export const CodeSecurityGetDefaultConfigurationsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CodeSecurityGetDefaultConfigurationsParams = z.infer<\n    typeof CodeSecurityGetDefaultConfigurationsParamsSchema\n  >\n\n  export const CodeSecurityGetDefaultConfigurationsResponseSchema =\n    CodeSecurityDefaultConfigurationsSchema\n  export type CodeSecurityGetDefaultConfigurationsResponse = z.infer<\n    typeof CodeSecurityGetDefaultConfigurationsResponseSchema\n  >\n\n  export const CodeSecurityDetachConfigurationParamsSchema = z.object({\n    selected_repository_ids: z\n      .array(z.number().int().describe('Unique identifier of the repository.'))\n      .describe('An array of repository IDs to detach from configurations.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CodeSecurityDetachConfigurationParams = z.infer<\n    typeof CodeSecurityDetachConfigurationParamsSchema\n  >\n\n  export type CodeSecurityDetachConfigurationResponse = undefined\n\n  export const CodeSecurityGetConfigurationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    configuration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the code security configuration.')\n  })\n  export type CodeSecurityGetConfigurationParams = z.infer<\n    typeof CodeSecurityGetConfigurationParamsSchema\n  >\n\n  export const CodeSecurityGetConfigurationResponseSchema =\n    CodeSecurityConfigurationSchema\n  export type CodeSecurityGetConfigurationResponse = z.infer<\n    typeof CodeSecurityGetConfigurationResponseSchema\n  >\n\n  export const CodeSecurityDeleteConfigurationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    configuration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the code security configuration.')\n  })\n  export type CodeSecurityDeleteConfigurationParams = z.infer<\n    typeof CodeSecurityDeleteConfigurationParamsSchema\n  >\n\n  export type CodeSecurityDeleteConfigurationResponse = undefined\n\n  export const CodeSecurityUpdateConfigurationParamsSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        'The name of the code security configuration. Must be unique within the organization.'\n      )\n      .optional(),\n    description: z\n      .string()\n      .max(255)\n      .describe('A description of the code security configuration')\n      .optional(),\n    advanced_security: z\n      .enum(['enabled', 'disabled'])\n      .describe('The enablement status of GitHub Advanced Security')\n      .optional(),\n    dependency_graph: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Dependency Graph')\n      .optional(),\n    dependency_graph_autosubmit_action: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Automatic dependency submission')\n      .optional(),\n    dependency_graph_autosubmit_action_options: z\n      .object({\n        labeled_runners: z\n          .boolean()\n          .describe(\n            \"Whether to use runners labeled with 'dependency-submission' or standard GitHub runners.\"\n          )\n          .optional()\n      })\n      .describe('Feature options for Automatic dependency submission')\n      .optional(),\n    dependabot_alerts: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Dependabot alerts')\n      .optional(),\n    dependabot_security_updates: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Dependabot security updates')\n      .optional(),\n    code_scanning_default_setup: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of code scanning default setup')\n      .optional(),\n    code_scanning_default_setup_options:\n      CodeScanningDefaultSetupOptionsSchema.optional(),\n    code_scanning_delegated_alert_dismissal: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe(\n        'The enablement status of code scanning delegated alert dismissal'\n      )\n      .default('disabled'),\n    secret_scanning: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning')\n      .optional(),\n    secret_scanning_push_protection: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning push protection')\n      .optional(),\n    secret_scanning_delegated_bypass: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning delegated bypass')\n      .optional(),\n    secret_scanning_delegated_bypass_options: z\n      .object({\n        reviewers: z\n          .array(\n            z.object({\n              reviewer_id: z\n                .number()\n                .int()\n                .describe(\n                  'The ID of the team or role selected as a bypass reviewer'\n                ),\n              reviewer_type: z\n                .enum(['TEAM', 'ROLE'])\n                .describe('The type of the bypass reviewer')\n            })\n          )\n          .describe('The bypass reviewers for secret scanning delegated bypass')\n          .optional()\n      })\n      .describe('Feature options for secret scanning delegated bypass')\n      .optional(),\n    secret_scanning_validity_checks: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of secret scanning validity checks')\n      .optional(),\n    secret_scanning_non_provider_patterns: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe(\n        'The enablement status of secret scanning non-provider patterns'\n      )\n      .optional(),\n    secret_scanning_generic_secrets: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of Copilot secret scanning')\n      .optional(),\n    secret_scanning_delegated_alert_dismissal: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe(\n        'The enablement status of secret scanning delegated alert dismissal'\n      )\n      .optional(),\n    private_vulnerability_reporting: z\n      .enum(['enabled', 'disabled', 'not_set'])\n      .describe('The enablement status of private vulnerability reporting')\n      .optional(),\n    enforcement: z\n      .enum(['enforced', 'unenforced'])\n      .describe('The enforcement status for a security configuration')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    configuration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the code security configuration.')\n  })\n  export type CodeSecurityUpdateConfigurationParams = z.infer<\n    typeof CodeSecurityUpdateConfigurationParamsSchema\n  >\n\n  export const CodeSecurityUpdateConfigurationResponseSchema =\n    CodeSecurityConfigurationSchema\n  export type CodeSecurityUpdateConfigurationResponse = z.infer<\n    typeof CodeSecurityUpdateConfigurationResponseSchema\n  >\n\n  export const CodeSecurityAttachConfigurationParamsSchema = z.object({\n    scope: z\n      .enum([\n        'all',\n        'all_without_configurations',\n        'public',\n        'private_or_internal',\n        'selected'\n      ])\n      .describe(\n        'The type of repositories to attach the configuration to. `selected` means the configuration will be attached to only the repositories specified by `selected_repository_ids`'\n      ),\n    selected_repository_ids: z\n      .array(z.number().int().describe('Unique identifier of the repository.'))\n      .describe(\n        'An array of repository IDs to attach the configuration to. You can only provide a list of repository ids when the `scope` is set to `selected`.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    configuration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the code security configuration.')\n  })\n  export type CodeSecurityAttachConfigurationParams = z.infer<\n    typeof CodeSecurityAttachConfigurationParamsSchema\n  >\n\n  export type CodeSecurityAttachConfigurationResponse = undefined\n\n  export const CodeSecuritySetConfigurationAsDefaultParamsSchema = z.object({\n    default_for_new_repos: z\n      .enum(['all', 'none', 'private_and_internal', 'public'])\n      .describe(\n        'Specify which types of repository this security configuration should be applied to by default.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    configuration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the code security configuration.')\n  })\n  export type CodeSecuritySetConfigurationAsDefaultParams = z.infer<\n    typeof CodeSecuritySetConfigurationAsDefaultParamsSchema\n  >\n\n  export const CodeSecuritySetConfigurationAsDefaultResponseSchema = z.object({\n    default_for_new_repos: z\n      .enum(['all', 'none', 'private_and_internal', 'public'])\n      .describe(\n        'Specifies which types of repository this security configuration is applied to by default.'\n      )\n      .optional(),\n    configuration: CodeSecurityConfigurationSchema.optional()\n  })\n  export type CodeSecuritySetConfigurationAsDefaultResponse = z.infer<\n    typeof CodeSecuritySetConfigurationAsDefaultResponseSchema\n  >\n\n  export const CodeSecurityGetRepositoriesForConfigurationParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      configuration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the code security configuration.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      before: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      after: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      status: z\n        .string()\n        .describe(\n          'A comma-separated list of statuses. If specified, only repositories with these attachment statuses will be returned.\\n\\nCan be: `all`, `attached`, `attaching`, `detached`, `removed`, `enforced`, `failed`, `updating`, `removed_by_enterprise`'\n        )\n        .default('all')\n    })\n  export type CodeSecurityGetRepositoriesForConfigurationParams = z.infer<\n    typeof CodeSecurityGetRepositoriesForConfigurationParamsSchema\n  >\n\n  export const CodeSecurityGetRepositoriesForConfigurationResponseSchema =\n    z.array(CodeSecurityConfigurationRepositoriesSchema)\n  export type CodeSecurityGetRepositoriesForConfigurationResponse = z.infer<\n    typeof CodeSecurityGetRepositoriesForConfigurationResponseSchema\n  >\n\n  export const CodespacesListInOrganizationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type CodespacesListInOrganizationParams = z.infer<\n    typeof CodespacesListInOrganizationParamsSchema\n  >\n\n  export const CodespacesListInOrganizationResponseSchema = z.object({\n    total_count: z.number().int(),\n    codespaces: z.array(CodespaceSchema)\n  })\n  export type CodespacesListInOrganizationResponse = z.infer<\n    typeof CodespacesListInOrganizationResponseSchema\n  >\n\n  export const CodespacesSetCodespacesAccessParamsSchema = z.object({\n    visibility: z\n      .enum([\n        'disabled',\n        'selected_members',\n        'all_members',\n        'all_members_and_outside_collaborators'\n      ])\n      .describe(\n        'Which users can access codespaces in the organization. `disabled` means that no users can access codespaces in the organization.'\n      ),\n    selected_usernames: z\n      .array(z.string())\n      .max(100)\n      .describe(\n        'The usernames of the organization members who should have access to codespaces in the organization. Required when `visibility` is `selected_members`. The provided list of usernames will replace any existing value.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CodespacesSetCodespacesAccessParams = z.infer<\n    typeof CodespacesSetCodespacesAccessParamsSchema\n  >\n\n  export type CodespacesSetCodespacesAccessResponse = undefined\n\n  export const CodespacesSetCodespacesAccessUsersParamsSchema = z.object({\n    selected_usernames: z\n      .array(z.string())\n      .max(100)\n      .describe(\n        'The usernames of the organization members whose codespaces be billed to the organization.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CodespacesSetCodespacesAccessUsersParams = z.infer<\n    typeof CodespacesSetCodespacesAccessUsersParamsSchema\n  >\n\n  export type CodespacesSetCodespacesAccessUsersResponse = undefined\n\n  export const CodespacesDeleteCodespacesAccessUsersParamsSchema = z.object({\n    selected_usernames: z\n      .array(z.string())\n      .max(100)\n      .describe(\n        'The usernames of the organization members whose codespaces should not be billed to the organization.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CodespacesDeleteCodespacesAccessUsersParams = z.infer<\n    typeof CodespacesDeleteCodespacesAccessUsersParamsSchema\n  >\n\n  export type CodespacesDeleteCodespacesAccessUsersResponse = undefined\n\n  export const CodespacesListOrgSecretsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type CodespacesListOrgSecretsParams = z.infer<\n    typeof CodespacesListOrgSecretsParamsSchema\n  >\n\n  export const CodespacesListOrgSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(CodespacesOrgSecretSchema)\n  })\n  export type CodespacesListOrgSecretsResponse = z.infer<\n    typeof CodespacesListOrgSecretsResponseSchema\n  >\n\n  export const CodespacesGetOrgPublicKeyParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CodespacesGetOrgPublicKeyParams = z.infer<\n    typeof CodespacesGetOrgPublicKeyParamsSchema\n  >\n\n  export const CodespacesGetOrgPublicKeyResponseSchema =\n    CodespacesPublicKeySchema\n  export type CodespacesGetOrgPublicKeyResponse = z.infer<\n    typeof CodespacesGetOrgPublicKeyResponseSchema\n  >\n\n  export const CodespacesGetOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesGetOrgSecretParams = z.infer<\n    typeof CodespacesGetOrgSecretParamsSchema\n  >\n\n  export const CodespacesGetOrgSecretResponseSchema = CodespacesOrgSecretSchema\n  export type CodespacesGetOrgSecretResponse = z.infer<\n    typeof CodespacesGetOrgSecretResponseSchema\n  >\n\n  export const CodespacesCreateOrUpdateOrgSecretParamsSchema = z.object({\n    encrypted_value: z\n      .string()\n      .regex(\n        new RegExp(\n          '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n        )\n      )\n      .describe(\n        'The value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get an organization public key](https://docs.github.com/rest/codespaces/organization-secrets#get-an-organization-public-key) endpoint.'\n      )\n      .optional(),\n    key_id: z\n      .string()\n      .describe('The ID of the key you used to encrypt the secret.')\n      .optional(),\n    visibility: z\n      .enum(['all', 'private', 'selected'])\n      .describe(\n        'Which type of organization repositories have access to the organization secret. `selected` means only the repositories specified by `selected_repository_ids` can access the secret.'\n      ),\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'An array of repository IDs that can access the organization secret. You can only provide a list of repository IDs when the `visibility` is set to `selected`. You can manage the list of selected repositories using the [List selected repositories for an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#list-selected-repositories-for-an-organization-secret), [Set selected repositories for an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#set-selected-repositories-for-an-organization-secret), and [Remove selected repository from an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#remove-selected-repository-from-an-organization-secret) endpoints.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesCreateOrUpdateOrgSecretParams = z.infer<\n    typeof CodespacesCreateOrUpdateOrgSecretParamsSchema\n  >\n\n  export type CodespacesCreateOrUpdateOrgSecretResponse = undefined\n\n  export const CodespacesDeleteOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesDeleteOrgSecretParams = z.infer<\n    typeof CodespacesDeleteOrgSecretParamsSchema\n  >\n\n  export type CodespacesDeleteOrgSecretResponse = undefined\n\n  export const CodespacesListSelectedReposForOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type CodespacesListSelectedReposForOrgSecretParams = z.infer<\n    typeof CodespacesListSelectedReposForOrgSecretParamsSchema\n  >\n\n  export const CodespacesListSelectedReposForOrgSecretResponseSchema = z.object(\n    {\n      total_count: z.number().int(),\n      repositories: z.array(MinimalRepositorySchema)\n    }\n  )\n  export type CodespacesListSelectedReposForOrgSecretResponse = z.infer<\n    typeof CodespacesListSelectedReposForOrgSecretResponseSchema\n  >\n\n  export const CodespacesSetSelectedReposForOrgSecretParamsSchema = z.object({\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'An array of repository ids that can access the organization secret. You can only provide a list of repository ids when the `visibility` is set to `selected`. You can add and remove individual repositories using the [Set selected repositories for an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#set-selected-repositories-for-an-organization-secret) and [Remove selected repository from an organization secret](https://docs.github.com/rest/codespaces/organization-secrets#remove-selected-repository-from-an-organization-secret) endpoints.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesSetSelectedReposForOrgSecretParams = z.infer<\n    typeof CodespacesSetSelectedReposForOrgSecretParamsSchema\n  >\n\n  export type CodespacesSetSelectedReposForOrgSecretResponse = undefined\n\n  export const CodespacesAddSelectedRepoToOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.'),\n    repository_id: z.number().int()\n  })\n  export type CodespacesAddSelectedRepoToOrgSecretParams = z.infer<\n    typeof CodespacesAddSelectedRepoToOrgSecretParamsSchema\n  >\n\n  export type CodespacesAddSelectedRepoToOrgSecretResponse = undefined\n\n  export const CodespacesRemoveSelectedRepoFromOrgSecretParamsSchema = z.object(\n    {\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      secret_name: z.string().describe('The name of the secret.'),\n      repository_id: z.number().int()\n    }\n  )\n  export type CodespacesRemoveSelectedRepoFromOrgSecretParams = z.infer<\n    typeof CodespacesRemoveSelectedRepoFromOrgSecretParamsSchema\n  >\n\n  export type CodespacesRemoveSelectedRepoFromOrgSecretResponse = undefined\n\n  export const CopilotGetCopilotOrganizationDetailsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CopilotGetCopilotOrganizationDetailsParams = z.infer<\n    typeof CopilotGetCopilotOrganizationDetailsParamsSchema\n  >\n\n  export const CopilotGetCopilotOrganizationDetailsResponseSchema =\n    CopilotOrganizationDetailsSchema\n  export type CopilotGetCopilotOrganizationDetailsResponse = z.infer<\n    typeof CopilotGetCopilotOrganizationDetailsResponseSchema\n  >\n\n  export const CopilotListCopilotSeatsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(50)\n  })\n  export type CopilotListCopilotSeatsParams = z.infer<\n    typeof CopilotListCopilotSeatsParamsSchema\n  >\n\n  export const CopilotListCopilotSeatsResponseSchema = z.object({\n    total_seats: z\n      .number()\n      .int()\n      .describe(\n        'Total number of Copilot seats for the organization currently being billed.'\n      )\n      .optional(),\n    seats: z.array(CopilotSeatDetailsSchema).optional()\n  })\n  export type CopilotListCopilotSeatsResponse = z.infer<\n    typeof CopilotListCopilotSeatsResponseSchema\n  >\n\n  export const CopilotAddCopilotSeatsForTeamsParamsSchema = z.object({\n    selected_teams: z\n      .array(z.string())\n      .min(1)\n      .describe(\n        'List of team names within the organization to which to grant access to GitHub Copilot.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CopilotAddCopilotSeatsForTeamsParams = z.infer<\n    typeof CopilotAddCopilotSeatsForTeamsParamsSchema\n  >\n\n  export type CopilotAddCopilotSeatsForTeamsResponse = undefined\n\n  export const CopilotCancelCopilotSeatAssignmentForTeamsParamsSchema =\n    z.object({\n      selected_teams: z\n        .array(z.string())\n        .min(1)\n        .describe(\n          'The names of teams from which to revoke access to GitHub Copilot.'\n        ),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type CopilotCancelCopilotSeatAssignmentForTeamsParams = z.infer<\n    typeof CopilotCancelCopilotSeatAssignmentForTeamsParamsSchema\n  >\n\n  export const CopilotCancelCopilotSeatAssignmentForTeamsResponseSchema = z\n    .object({ seats_cancelled: z.number().int() })\n    .describe(\n      'The total number of seats set to \"pending cancellation\" for members of the specified team(s).'\n    )\n  export type CopilotCancelCopilotSeatAssignmentForTeamsResponse = z.infer<\n    typeof CopilotCancelCopilotSeatAssignmentForTeamsResponseSchema\n  >\n\n  export const CopilotAddCopilotSeatsForUsersParamsSchema = z.object({\n    selected_usernames: z\n      .array(z.string())\n      .min(1)\n      .describe(\n        'The usernames of the organization members to be granted access to GitHub Copilot.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type CopilotAddCopilotSeatsForUsersParams = z.infer<\n    typeof CopilotAddCopilotSeatsForUsersParamsSchema\n  >\n\n  export type CopilotAddCopilotSeatsForUsersResponse = undefined\n\n  export const CopilotCancelCopilotSeatAssignmentForUsersParamsSchema =\n    z.object({\n      selected_usernames: z\n        .array(z.string())\n        .min(1)\n        .describe(\n          'The usernames of the organization members for which to revoke access to GitHub Copilot.'\n        ),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type CopilotCancelCopilotSeatAssignmentForUsersParams = z.infer<\n    typeof CopilotCancelCopilotSeatAssignmentForUsersParamsSchema\n  >\n\n  export const CopilotCancelCopilotSeatAssignmentForUsersResponseSchema = z\n    .object({ seats_cancelled: z.number().int() })\n    .describe(\n      'The total number of seats set to \"pending cancellation\" for the specified users.'\n    )\n  export type CopilotCancelCopilotSeatAssignmentForUsersResponse = z.infer<\n    typeof CopilotCancelCopilotSeatAssignmentForUsersResponseSchema\n  >\n\n  export const CopilotCopilotMetricsForOrganizationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    since: z\n      .string()\n      .describe(\n        'Show usage metrics since this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`). Maximum value is 28 days ago.'\n      )\n      .optional(),\n    until: z\n      .string()\n      .describe(\n        'Show usage metrics until this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`) and should not preceed the `since` date if it is passed.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of days of metrics to display per page (max 28). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(28)\n  })\n  export type CopilotCopilotMetricsForOrganizationParams = z.infer<\n    typeof CopilotCopilotMetricsForOrganizationParamsSchema\n  >\n\n  export const CopilotCopilotMetricsForOrganizationResponseSchema = z.array(\n    CopilotUsageMetricsDaySchema\n  )\n  export type CopilotCopilotMetricsForOrganizationResponse = z.infer<\n    typeof CopilotCopilotMetricsForOrganizationResponseSchema\n  >\n\n  export const CopilotUsageMetricsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    since: z\n      .string()\n      .describe(\n        'Show usage metrics since this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`). Maximum value is 28 days ago.'\n      )\n      .optional(),\n    until: z\n      .string()\n      .describe(\n        'Show usage metrics until this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`) and should not preceed the `since` date if it is passed.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of days of metrics to display per page (max 28). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(28)\n  })\n  export type CopilotUsageMetricsForOrgParams = z.infer<\n    typeof CopilotUsageMetricsForOrgParamsSchema\n  >\n\n  export const CopilotUsageMetricsForOrgResponseSchema = z.array(\n    CopilotUsageMetricsSchema\n  )\n  export type CopilotUsageMetricsForOrgResponse = z.infer<\n    typeof CopilotUsageMetricsForOrgResponseSchema\n  >\n\n  export const DependabotListAlertsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    state: z\n      .string()\n      .describe(\n        'A comma-separated list of states. If specified, only alerts with these states will be returned.\\n\\nCan be: `auto_dismissed`, `dismissed`, `fixed`, `open`'\n      )\n      .optional(),\n    severity: z\n      .string()\n      .describe(\n        'A comma-separated list of severities. If specified, only alerts with these severities will be returned.\\n\\nCan be: `low`, `medium`, `high`, `critical`'\n      )\n      .optional(),\n    ecosystem: z\n      .string()\n      .describe(\n        'A comma-separated list of ecosystems. If specified, only alerts for these ecosystems will be returned.\\n\\nCan be: `composer`, `go`, `maven`, `npm`, `nuget`, `pip`, `pub`, `rubygems`, `rust`'\n      )\n      .optional(),\n    package: z\n      .string()\n      .describe(\n        'A comma-separated list of package names. If specified, only alerts for these packages will be returned.'\n      )\n      .optional(),\n    epss_percentage: z\n      .string()\n      .describe(\n        'CVE Exploit Prediction Scoring System (EPSS) percentage. Can be specified as:\\n- An exact number (`n`)\\n- Comparators such as `>n`, `<n`, `>=n`, `<=n`\\n- A range like `n..n`, where `n` is a number from 0.0 to 1.0\\n\\nFilters the list of alerts based on EPSS percentages. If specified, only alerts with the provided EPSS percentages will be returned.'\n      )\n      .optional(),\n    scope: z\n      .enum(['development', 'runtime'])\n      .describe(\n        'The scope of the vulnerable dependency. If specified, only alerts with this scope will be returned.'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated', 'epss_percentage'])\n      .describe(\n        \"The property by which to sort the results.\\n`created` means when the alert was created.\\n`updated` means when the alert's state last changed.\\n`epss_percentage` sorts alerts by the Exploit Prediction Scoring System (EPSS) percentage.\"\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    first: z\n      .number()\n      .int()\n      .gte(1)\n      .lte(100)\n      .describe(\n        '**Deprecated**. The number of results per page (max 100), starting from the first matching result.\\nThis parameter must not be used in combination with `last`.\\nInstead, use `per_page` in combination with `after` to fetch the first page of results.'\n      )\n      .default(30),\n    last: z\n      .number()\n      .int()\n      .gte(1)\n      .lte(100)\n      .describe(\n        '**Deprecated**. The number of results per page (max 100), starting from the last matching result.\\nThis parameter must not be used in combination with `first`.\\nInstead, use `per_page` in combination with `before` to fetch the last page of results.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type DependabotListAlertsForOrgParams = z.infer<\n    typeof DependabotListAlertsForOrgParamsSchema\n  >\n\n  export const DependabotListAlertsForOrgResponseSchema = z.array(\n    DependabotAlertWithRepositorySchema\n  )\n  export type DependabotListAlertsForOrgResponse = z.infer<\n    typeof DependabotListAlertsForOrgResponseSchema\n  >\n\n  export const DependabotListOrgSecretsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type DependabotListOrgSecretsParams = z.infer<\n    typeof DependabotListOrgSecretsParamsSchema\n  >\n\n  export const DependabotListOrgSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(OrganizationDependabotSecretSchema)\n  })\n  export type DependabotListOrgSecretsResponse = z.infer<\n    typeof DependabotListOrgSecretsResponseSchema\n  >\n\n  export const DependabotGetOrgPublicKeyParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type DependabotGetOrgPublicKeyParams = z.infer<\n    typeof DependabotGetOrgPublicKeyParamsSchema\n  >\n\n  export const DependabotGetOrgPublicKeyResponseSchema =\n    DependabotPublicKeySchema\n  export type DependabotGetOrgPublicKeyResponse = z.infer<\n    typeof DependabotGetOrgPublicKeyResponseSchema\n  >\n\n  export const DependabotGetOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type DependabotGetOrgSecretParams = z.infer<\n    typeof DependabotGetOrgSecretParamsSchema\n  >\n\n  export const DependabotGetOrgSecretResponseSchema =\n    OrganizationDependabotSecretSchema\n  export type DependabotGetOrgSecretResponse = z.infer<\n    typeof DependabotGetOrgSecretResponseSchema\n  >\n\n  export const DependabotCreateOrUpdateOrgSecretParamsSchema = z.object({\n    encrypted_value: z\n      .string()\n      .regex(\n        new RegExp(\n          '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n        )\n      )\n      .describe(\n        'Value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get an organization public key](https://docs.github.com/rest/dependabot/secrets#get-an-organization-public-key) endpoint.'\n      )\n      .optional(),\n    key_id: z\n      .string()\n      .describe('ID of the key you used to encrypt the secret.')\n      .optional(),\n    visibility: z\n      .enum(['all', 'private', 'selected'])\n      .describe(\n        'Which type of organization repositories have access to the organization secret. `selected` means only the repositories specified by `selected_repository_ids` can access the secret.'\n      ),\n    selected_repository_ids: z\n      .array(z.string())\n      .describe(\n        'An array of repository ids that can access the organization secret. You can only provide a list of repository ids when the `visibility` is set to `selected`. You can manage the list of selected repositories using the [List selected repositories for an organization secret](https://docs.github.com/rest/dependabot/secrets#list-selected-repositories-for-an-organization-secret), [Set selected repositories for an organization secret](https://docs.github.com/rest/dependabot/secrets#set-selected-repositories-for-an-organization-secret), and [Remove selected repository from an organization secret](https://docs.github.com/rest/dependabot/secrets#remove-selected-repository-from-an-organization-secret) endpoints.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type DependabotCreateOrUpdateOrgSecretParams = z.infer<\n    typeof DependabotCreateOrUpdateOrgSecretParamsSchema\n  >\n\n  export type DependabotCreateOrUpdateOrgSecretResponse = undefined\n\n  export const DependabotDeleteOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type DependabotDeleteOrgSecretParams = z.infer<\n    typeof DependabotDeleteOrgSecretParamsSchema\n  >\n\n  export type DependabotDeleteOrgSecretResponse = undefined\n\n  export const DependabotListSelectedReposForOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type DependabotListSelectedReposForOrgSecretParams = z.infer<\n    typeof DependabotListSelectedReposForOrgSecretParamsSchema\n  >\n\n  export const DependabotListSelectedReposForOrgSecretResponseSchema = z.object(\n    {\n      total_count: z.number().int(),\n      repositories: z.array(MinimalRepositorySchema)\n    }\n  )\n  export type DependabotListSelectedReposForOrgSecretResponse = z.infer<\n    typeof DependabotListSelectedReposForOrgSecretResponseSchema\n  >\n\n  export const DependabotSetSelectedReposForOrgSecretParamsSchema = z.object({\n    selected_repository_ids: z\n      .array(z.number().int())\n      .describe(\n        'An array of repository ids that can access the organization secret. You can only provide a list of repository ids when the `visibility` is set to `selected`. You can add and remove individual repositories using the [Set selected repositories for an organization secret](https://docs.github.com/rest/dependabot/secrets#set-selected-repositories-for-an-organization-secret) and [Remove selected repository from an organization secret](https://docs.github.com/rest/dependabot/secrets#remove-selected-repository-from-an-organization-secret) endpoints.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type DependabotSetSelectedReposForOrgSecretParams = z.infer<\n    typeof DependabotSetSelectedReposForOrgSecretParamsSchema\n  >\n\n  export type DependabotSetSelectedReposForOrgSecretResponse = undefined\n\n  export const DependabotAddSelectedRepoToOrgSecretParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.'),\n    repository_id: z.number().int()\n  })\n  export type DependabotAddSelectedRepoToOrgSecretParams = z.infer<\n    typeof DependabotAddSelectedRepoToOrgSecretParamsSchema\n  >\n\n  export type DependabotAddSelectedRepoToOrgSecretResponse = undefined\n\n  export const DependabotRemoveSelectedRepoFromOrgSecretParamsSchema = z.object(\n    {\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      secret_name: z.string().describe('The name of the secret.'),\n      repository_id: z.number().int()\n    }\n  )\n  export type DependabotRemoveSelectedRepoFromOrgSecretParams = z.infer<\n    typeof DependabotRemoveSelectedRepoFromOrgSecretParamsSchema\n  >\n\n  export type DependabotRemoveSelectedRepoFromOrgSecretResponse = undefined\n\n  export const PackagesListDockerMigrationConflictingPackagesForOrganizationParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type PackagesListDockerMigrationConflictingPackagesForOrganizationParams =\n    z.infer<\n      typeof PackagesListDockerMigrationConflictingPackagesForOrganizationParamsSchema\n    >\n\n  export const PackagesListDockerMigrationConflictingPackagesForOrganizationResponseSchema =\n    z.array(PackageSchema)\n  export type PackagesListDockerMigrationConflictingPackagesForOrganizationResponse =\n    z.infer<\n      typeof PackagesListDockerMigrationConflictingPackagesForOrganizationResponseSchema\n    >\n\n  export const ActivityListPublicOrgEventsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListPublicOrgEventsParams = z.infer<\n    typeof ActivityListPublicOrgEventsParamsSchema\n  >\n\n  export const ActivityListPublicOrgEventsResponseSchema = z.array(EventSchema)\n  export type ActivityListPublicOrgEventsResponse = z.infer<\n    typeof ActivityListPublicOrgEventsResponseSchema\n  >\n\n  export const OrgsListFailedInvitationsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListFailedInvitationsParams = z.infer<\n    typeof OrgsListFailedInvitationsParamsSchema\n  >\n\n  export const OrgsListFailedInvitationsResponseSchema = z.array(\n    OrganizationInvitationSchema\n  )\n  export type OrgsListFailedInvitationsResponse = z.infer<\n    typeof OrgsListFailedInvitationsResponseSchema\n  >\n\n  export const OrgsListWebhooksParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListWebhooksParams = z.infer<\n    typeof OrgsListWebhooksParamsSchema\n  >\n\n  export const OrgsListWebhooksResponseSchema = z.array(OrgHookSchema)\n  export type OrgsListWebhooksResponse = z.infer<\n    typeof OrgsListWebhooksResponseSchema\n  >\n\n  export const OrgsCreateWebhookParamsSchema = z.object({\n    name: z.string().describe('Must be passed as \"web\".'),\n    config: z\n      .object({\n        url: WebhookConfigUrlSchema,\n        content_type: WebhookConfigContentTypeSchema.optional(),\n        secret: WebhookConfigSecretSchema.optional(),\n        insecure_ssl: WebhookConfigInsecureSslSchema.optional(),\n        username: z.string().optional(),\n        password: z.string().optional()\n      })\n      .describe('Key/value pairs to provide settings for this webhook.'),\n    events: z\n      .array(z.string())\n      .describe(\n        'Determines what [events](https://docs.github.com/webhooks/event-payloads) the hook is triggered for. Set to `[\"*\"]` to receive all possible events.'\n      )\n      .default(['push']),\n    active: z\n      .boolean()\n      .describe(\n        'Determines if notifications are sent when the webhook is triggered. Set to `true` to send notifications.'\n      )\n      .default(true),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsCreateWebhookParams = z.infer<\n    typeof OrgsCreateWebhookParamsSchema\n  >\n\n  export type OrgsCreateWebhookResponse = undefined\n\n  export const OrgsGetWebhookParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type OrgsGetWebhookParams = z.infer<typeof OrgsGetWebhookParamsSchema>\n\n  export const OrgsGetWebhookResponseSchema = OrgHookSchema\n  export type OrgsGetWebhookResponse = z.infer<\n    typeof OrgsGetWebhookResponseSchema\n  >\n\n  export const OrgsDeleteWebhookParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type OrgsDeleteWebhookParams = z.infer<\n    typeof OrgsDeleteWebhookParamsSchema\n  >\n\n  export type OrgsDeleteWebhookResponse = undefined\n\n  export const OrgsUpdateWebhookParamsSchema = z.object({\n    config: z\n      .object({\n        url: WebhookConfigUrlSchema,\n        content_type: WebhookConfigContentTypeSchema.optional(),\n        secret: WebhookConfigSecretSchema.optional(),\n        insecure_ssl: WebhookConfigInsecureSslSchema.optional()\n      })\n      .describe('Key/value pairs to provide settings for this webhook.')\n      .optional(),\n    events: z\n      .array(z.string())\n      .describe(\n        'Determines what [events](https://docs.github.com/webhooks/event-payloads) the hook is triggered for.'\n      )\n      .default(['push']),\n    active: z\n      .boolean()\n      .describe(\n        'Determines if notifications are sent when the webhook is triggered. Set to `true` to send notifications.'\n      )\n      .default(true),\n    name: z.string().optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type OrgsUpdateWebhookParams = z.infer<\n    typeof OrgsUpdateWebhookParamsSchema\n  >\n\n  export const OrgsUpdateWebhookResponseSchema = OrgHookSchema\n  export type OrgsUpdateWebhookResponse = z.infer<\n    typeof OrgsUpdateWebhookResponseSchema\n  >\n\n  export const OrgsGetWebhookConfigForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type OrgsGetWebhookConfigForOrgParams = z.infer<\n    typeof OrgsGetWebhookConfigForOrgParamsSchema\n  >\n\n  export const OrgsGetWebhookConfigForOrgResponseSchema = WebhookConfigSchema\n  export type OrgsGetWebhookConfigForOrgResponse = z.infer<\n    typeof OrgsGetWebhookConfigForOrgResponseSchema\n  >\n\n  export const OrgsUpdateWebhookConfigForOrgParamsSchema = z.object({\n    url: WebhookConfigUrlSchema.optional(),\n    content_type: WebhookConfigContentTypeSchema.optional(),\n    secret: WebhookConfigSecretSchema.optional(),\n    insecure_ssl: WebhookConfigInsecureSslSchema.optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type OrgsUpdateWebhookConfigForOrgParams = z.infer<\n    typeof OrgsUpdateWebhookConfigForOrgParamsSchema\n  >\n\n  export const OrgsUpdateWebhookConfigForOrgResponseSchema = WebhookConfigSchema\n  export type OrgsUpdateWebhookConfigForOrgResponse = z.infer<\n    typeof OrgsUpdateWebhookConfigForOrgResponseSchema\n  >\n\n  export const OrgsListWebhookDeliveriesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    cursor: z\n      .string()\n      .describe(\n        'Used for pagination: the starting delivery from which the page of deliveries is fetched. Refer to the `link` header for the next and previous page cursors.'\n      )\n      .optional()\n  })\n  export type OrgsListWebhookDeliveriesParams = z.infer<\n    typeof OrgsListWebhookDeliveriesParamsSchema\n  >\n\n  export const OrgsListWebhookDeliveriesResponseSchema = z.array(\n    HookDeliveryItemSchema\n  )\n  export type OrgsListWebhookDeliveriesResponse = z.infer<\n    typeof OrgsListWebhookDeliveriesResponseSchema\n  >\n\n  export const OrgsGetWebhookDeliveryParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      ),\n    delivery_id: z.number().int()\n  })\n  export type OrgsGetWebhookDeliveryParams = z.infer<\n    typeof OrgsGetWebhookDeliveryParamsSchema\n  >\n\n  export const OrgsGetWebhookDeliveryResponseSchema = HookDeliverySchema\n  export type OrgsGetWebhookDeliveryResponse = z.infer<\n    typeof OrgsGetWebhookDeliveryResponseSchema\n  >\n\n  export const OrgsRedeliverWebhookDeliveryParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      ),\n    delivery_id: z.number().int()\n  })\n  export type OrgsRedeliverWebhookDeliveryParams = z.infer<\n    typeof OrgsRedeliverWebhookDeliveryParamsSchema\n  >\n\n  export type OrgsRedeliverWebhookDeliveryResponse = undefined\n\n  export const OrgsPingWebhookParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type OrgsPingWebhookParams = z.infer<\n    typeof OrgsPingWebhookParamsSchema\n  >\n\n  export type OrgsPingWebhookResponse = undefined\n\n  export const ApiInsightsGetRouteStatsByActorParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    actor_type: z\n      .enum([\n        'installation',\n        'classic_pat',\n        'fine_grained_pat',\n        'oauth_app',\n        'github_app_user_to_server'\n      ])\n      .describe('The type of the actor'),\n    actor_id: z.number().int().describe('The ID of the actor'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    sort: z\n      .array(\n        z\n          .enum([\n            'last_rate_limited_timestamp',\n            'last_request_timestamp',\n            'rate_limited_request_count',\n            'http_method',\n            'api_route',\n            'total_request_count'\n          ])\n          .default('total_request_count')\n      )\n      .describe('The property to sort the results by.')\n      .optional(),\n    api_route_substring: z\n      .string()\n      .describe(\n        'Providing a substring will filter results where the API route contains the substring. This is a case-insensitive search.'\n      )\n      .optional()\n  })\n  export type ApiInsightsGetRouteStatsByActorParams = z.infer<\n    typeof ApiInsightsGetRouteStatsByActorParamsSchema\n  >\n\n  export const ApiInsightsGetRouteStatsByActorResponseSchema =\n    ApiInsightsRouteStatsSchema\n  export type ApiInsightsGetRouteStatsByActorResponse = z.infer<\n    typeof ApiInsightsGetRouteStatsByActorResponseSchema\n  >\n\n  export const ApiInsightsGetSubjectStatsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    sort: z\n      .array(\n        z\n          .enum([\n            'last_rate_limited_timestamp',\n            'last_request_timestamp',\n            'rate_limited_request_count',\n            'subject_name',\n            'total_request_count'\n          ])\n          .default('total_request_count')\n      )\n      .describe('The property to sort the results by.')\n      .optional(),\n    subject_name_substring: z\n      .string()\n      .describe(\n        'Providing a substring will filter results where the subject name contains the substring. This is a case-insensitive search.'\n      )\n      .optional()\n  })\n  export type ApiInsightsGetSubjectStatsParams = z.infer<\n    typeof ApiInsightsGetSubjectStatsParamsSchema\n  >\n\n  export const ApiInsightsGetSubjectStatsResponseSchema =\n    ApiInsightsSubjectStatsSchema\n  export type ApiInsightsGetSubjectStatsResponse = z.infer<\n    typeof ApiInsightsGetSubjectStatsResponseSchema\n  >\n\n  export const ApiInsightsGetSummaryStatsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional()\n  })\n  export type ApiInsightsGetSummaryStatsParams = z.infer<\n    typeof ApiInsightsGetSummaryStatsParamsSchema\n  >\n\n  export const ApiInsightsGetSummaryStatsResponseSchema =\n    ApiInsightsSummaryStatsSchema\n  export type ApiInsightsGetSummaryStatsResponse = z.infer<\n    typeof ApiInsightsGetSummaryStatsResponseSchema\n  >\n\n  export const ApiInsightsGetSummaryStatsByUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    user_id: z.string().describe('The ID of the user to query for stats'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional()\n  })\n  export type ApiInsightsGetSummaryStatsByUserParams = z.infer<\n    typeof ApiInsightsGetSummaryStatsByUserParamsSchema\n  >\n\n  export const ApiInsightsGetSummaryStatsByUserResponseSchema =\n    ApiInsightsSummaryStatsSchema\n  export type ApiInsightsGetSummaryStatsByUserResponse = z.infer<\n    typeof ApiInsightsGetSummaryStatsByUserResponseSchema\n  >\n\n  export const ApiInsightsGetSummaryStatsByActorParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    actor_type: z\n      .enum([\n        'installation',\n        'classic_pat',\n        'fine_grained_pat',\n        'oauth_app',\n        'github_app_user_to_server'\n      ])\n      .describe('The type of the actor'),\n    actor_id: z.number().int().describe('The ID of the actor'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional()\n  })\n  export type ApiInsightsGetSummaryStatsByActorParams = z.infer<\n    typeof ApiInsightsGetSummaryStatsByActorParamsSchema\n  >\n\n  export const ApiInsightsGetSummaryStatsByActorResponseSchema =\n    ApiInsightsSummaryStatsSchema\n  export type ApiInsightsGetSummaryStatsByActorResponse = z.infer<\n    typeof ApiInsightsGetSummaryStatsByActorResponseSchema\n  >\n\n  export const ApiInsightsGetTimeStatsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    timestamp_increment: z\n      .string()\n      .describe(\n        'The increment of time used to breakdown the query results (5m, 10m, 1h, etc.)'\n      )\n  })\n  export type ApiInsightsGetTimeStatsParams = z.infer<\n    typeof ApiInsightsGetTimeStatsParamsSchema\n  >\n\n  export const ApiInsightsGetTimeStatsResponseSchema =\n    ApiInsightsTimeStatsSchema\n  export type ApiInsightsGetTimeStatsResponse = z.infer<\n    typeof ApiInsightsGetTimeStatsResponseSchema\n  >\n\n  export const ApiInsightsGetTimeStatsByUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    user_id: z.string().describe('The ID of the user to query for stats'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    timestamp_increment: z\n      .string()\n      .describe(\n        'The increment of time used to breakdown the query results (5m, 10m, 1h, etc.)'\n      )\n  })\n  export type ApiInsightsGetTimeStatsByUserParams = z.infer<\n    typeof ApiInsightsGetTimeStatsByUserParamsSchema\n  >\n\n  export const ApiInsightsGetTimeStatsByUserResponseSchema =\n    ApiInsightsTimeStatsSchema\n  export type ApiInsightsGetTimeStatsByUserResponse = z.infer<\n    typeof ApiInsightsGetTimeStatsByUserResponseSchema\n  >\n\n  export const ApiInsightsGetTimeStatsByActorParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    actor_type: z\n      .enum([\n        'installation',\n        'classic_pat',\n        'fine_grained_pat',\n        'oauth_app',\n        'github_app_user_to_server'\n      ])\n      .describe('The type of the actor'),\n    actor_id: z.number().int().describe('The ID of the actor'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    timestamp_increment: z\n      .string()\n      .describe(\n        'The increment of time used to breakdown the query results (5m, 10m, 1h, etc.)'\n      )\n  })\n  export type ApiInsightsGetTimeStatsByActorParams = z.infer<\n    typeof ApiInsightsGetTimeStatsByActorParamsSchema\n  >\n\n  export const ApiInsightsGetTimeStatsByActorResponseSchema =\n    ApiInsightsTimeStatsSchema\n  export type ApiInsightsGetTimeStatsByActorResponse = z.infer<\n    typeof ApiInsightsGetTimeStatsByActorResponseSchema\n  >\n\n  export const ApiInsightsGetUserStatsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    user_id: z.string().describe('The ID of the user to query for stats'),\n    min_timestamp: z\n      .string()\n      .describe(\n        'The minimum timestamp to query for stats. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      ),\n    max_timestamp: z\n      .string()\n      .describe(\n        'The maximum timestamp to query for stats. Defaults to the time 30 days ago. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    sort: z\n      .array(\n        z\n          .enum([\n            'last_rate_limited_timestamp',\n            'last_request_timestamp',\n            'rate_limited_request_count',\n            'subject_name',\n            'total_request_count'\n          ])\n          .default('total_request_count')\n      )\n      .describe('The property to sort the results by.')\n      .optional(),\n    actor_name_substring: z\n      .string()\n      .describe(\n        'Providing a substring will filter results where the actor name contains the substring. This is a case-insensitive search.'\n      )\n      .optional()\n  })\n  export type ApiInsightsGetUserStatsParams = z.infer<\n    typeof ApiInsightsGetUserStatsParamsSchema\n  >\n\n  export const ApiInsightsGetUserStatsResponseSchema =\n    ApiInsightsUserStatsSchema\n  export type ApiInsightsGetUserStatsResponse = z.infer<\n    typeof ApiInsightsGetUserStatsResponseSchema\n  >\n\n  export const AppsGetOrgInstallationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type AppsGetOrgInstallationParams = z.infer<\n    typeof AppsGetOrgInstallationParamsSchema\n  >\n\n  export const AppsGetOrgInstallationResponseSchema = InstallationSchema\n  export type AppsGetOrgInstallationResponse = z.infer<\n    typeof AppsGetOrgInstallationResponseSchema\n  >\n\n  export const OrgsListAppInstallationsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListAppInstallationsParams = z.infer<\n    typeof OrgsListAppInstallationsParamsSchema\n  >\n\n  export const OrgsListAppInstallationsResponseSchema = z.object({\n    total_count: z.number().int(),\n    installations: z.array(InstallationSchema)\n  })\n  export type OrgsListAppInstallationsResponse = z.infer<\n    typeof OrgsListAppInstallationsResponseSchema\n  >\n\n  export const InteractionsGetRestrictionsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type InteractionsGetRestrictionsForOrgParams = z.infer<\n    typeof InteractionsGetRestrictionsForOrgParamsSchema\n  >\n\n  export const InteractionsGetRestrictionsForOrgResponseSchema = z.union([\n    InteractionLimitResponseSchema,\n    z.object({}).strict()\n  ])\n  export type InteractionsGetRestrictionsForOrgResponse = z.infer<\n    typeof InteractionsGetRestrictionsForOrgResponseSchema\n  >\n\n  export const InteractionsSetRestrictionsForOrgParamsSchema = z\n    .object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n    .merge(InteractionLimitSchema)\n  export type InteractionsSetRestrictionsForOrgParams = z.infer<\n    typeof InteractionsSetRestrictionsForOrgParamsSchema\n  >\n\n  export const InteractionsSetRestrictionsForOrgResponseSchema =\n    InteractionLimitResponseSchema\n  export type InteractionsSetRestrictionsForOrgResponse = z.infer<\n    typeof InteractionsSetRestrictionsForOrgResponseSchema\n  >\n\n  export const InteractionsRemoveRestrictionsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type InteractionsRemoveRestrictionsForOrgParams = z.infer<\n    typeof InteractionsRemoveRestrictionsForOrgParamsSchema\n  >\n\n  export type InteractionsRemoveRestrictionsForOrgResponse = undefined\n\n  export const OrgsListPendingInvitationsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    role: z\n      .enum([\n        'all',\n        'admin',\n        'direct_member',\n        'billing_manager',\n        'hiring_manager'\n      ])\n      .describe('Filter invitations by their member role.')\n      .default('all'),\n    invitation_source: z\n      .enum(['all', 'member', 'scim'])\n      .describe('Filter invitations by their invitation source.')\n      .default('all')\n  })\n  export type OrgsListPendingInvitationsParams = z.infer<\n    typeof OrgsListPendingInvitationsParamsSchema\n  >\n\n  export const OrgsListPendingInvitationsResponseSchema = z.array(\n    OrganizationInvitationSchema\n  )\n  export type OrgsListPendingInvitationsResponse = z.infer<\n    typeof OrgsListPendingInvitationsResponseSchema\n  >\n\n  export const OrgsCreateInvitationParamsSchema = z.object({\n    invitee_id: z\n      .number()\n      .int()\n      .describe(\n        '**Required unless you provide `email`**. GitHub user ID for the person you are inviting.'\n      )\n      .optional(),\n    email: z\n      .string()\n      .describe(\n        '**Required unless you provide `invitee_id`**. Email address of the person you are inviting, which can be an existing GitHub user.'\n      )\n      .optional(),\n    role: z\n      .enum(['admin', 'direct_member', 'billing_manager', 'reinstate'])\n      .describe(\n        'The role for the new member. \\n * `admin` - Organization owners with full administrative rights to the organization and complete access to all repositories and teams.  \\n * `direct_member` - Non-owner organization members with ability to see other members and join teams by invitation.  \\n * `billing_manager` - Non-owner organization members with ability to manage the billing settings of your organization. \\n * `reinstate` - The previous role assigned to the invitee before they were removed from your organization. Can be one of the roles listed above. Only works if the invitee was previously part of your organization.'\n      )\n      .default('direct_member'),\n    team_ids: z\n      .array(z.number().int())\n      .describe('Specify IDs for the teams you want to invite new members to.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsCreateInvitationParams = z.infer<\n    typeof OrgsCreateInvitationParamsSchema\n  >\n\n  export type OrgsCreateInvitationResponse = undefined\n\n  export const OrgsCancelInvitationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    invitation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the invitation.')\n  })\n  export type OrgsCancelInvitationParams = z.infer<\n    typeof OrgsCancelInvitationParamsSchema\n  >\n\n  export type OrgsCancelInvitationResponse = undefined\n\n  export const OrgsListInvitationTeamsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    invitation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the invitation.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListInvitationTeamsParams = z.infer<\n    typeof OrgsListInvitationTeamsParamsSchema\n  >\n\n  export const OrgsListInvitationTeamsResponseSchema = z.array(TeamSchema)\n  export type OrgsListInvitationTeamsResponse = z.infer<\n    typeof OrgsListInvitationTeamsResponseSchema\n  >\n\n  export const OrgsListIssueTypesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsListIssueTypesParams = z.infer<\n    typeof OrgsListIssueTypesParamsSchema\n  >\n\n  export const OrgsListIssueTypesResponseSchema = z.array(IssueTypeSchema)\n  export type OrgsListIssueTypesResponse = z.infer<\n    typeof OrgsListIssueTypesResponseSchema\n  >\n\n  export const OrgsCreateIssueTypeParamsSchema = z\n    .object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n    .merge(OrganizationCreateIssueTypeSchema)\n  export type OrgsCreateIssueTypeParams = z.infer<\n    typeof OrgsCreateIssueTypeParamsSchema\n  >\n\n  export const OrgsCreateIssueTypeResponseSchema = IssueTypeSchema\n  export type OrgsCreateIssueTypeResponse = z.infer<\n    typeof OrgsCreateIssueTypeResponseSchema\n  >\n\n  export const OrgsUpdateIssueTypeParamsSchema = z\n    .object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      issue_type_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the issue type.')\n    })\n    .merge(OrganizationUpdateIssueTypeSchema)\n  export type OrgsUpdateIssueTypeParams = z.infer<\n    typeof OrgsUpdateIssueTypeParamsSchema\n  >\n\n  export const OrgsUpdateIssueTypeResponseSchema = IssueTypeSchema\n  export type OrgsUpdateIssueTypeResponse = z.infer<\n    typeof OrgsUpdateIssueTypeResponseSchema\n  >\n\n  export const OrgsDeleteIssueTypeParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    issue_type_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the issue type.')\n  })\n  export type OrgsDeleteIssueTypeParams = z.infer<\n    typeof OrgsDeleteIssueTypeParamsSchema\n  >\n\n  export type OrgsDeleteIssueTypeResponse = undefined\n\n  export const IssuesListForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    filter: z\n      .enum(['assigned', 'created', 'mentioned', 'subscribed', 'repos', 'all'])\n      .describe(\n        \"Indicates which sorts of issues to return. `assigned` means issues assigned to you. `created` means issues created by you. `mentioned` means issues mentioning you. `subscribed` means issues you're subscribed to updates for. `all` or `repos` means all issues you can see, regardless of participation or creation.\"\n      )\n      .default('assigned'),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Indicates the state of the issues to return.')\n      .default('open'),\n    labels: z\n      .string()\n      .describe(\n        'A list of comma separated label names. Example: `bug,ui,@high`'\n      )\n      .optional(),\n    type: z.string().describe('Can be the name of an issue type.').optional(),\n    sort: z\n      .enum(['created', 'updated', 'comments'])\n      .describe('What to sort results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListForOrgParams = z.infer<\n    typeof IssuesListForOrgParamsSchema\n  >\n\n  export const IssuesListForOrgResponseSchema = z.array(IssueSchema)\n  export type IssuesListForOrgResponse = z.infer<\n    typeof IssuesListForOrgResponseSchema\n  >\n\n  export const OrgsListMembersParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    filter: z\n      .enum(['2fa_disabled', 'all'])\n      .describe(\n        'Filter members returned in the list. `2fa_disabled` means that only members without [two-factor authentication](https://github.com/blog/1614-two-factor-authentication) enabled will be returned. This options is only available for organization owners.'\n      )\n      .default('all'),\n    role: z\n      .enum(['all', 'admin', 'member'])\n      .describe('Filter members returned by their role.')\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListMembersParams = z.infer<\n    typeof OrgsListMembersParamsSchema\n  >\n\n  export const OrgsListMembersResponseSchema = z.array(SimpleUserSchema)\n  export type OrgsListMembersResponse = z.infer<\n    typeof OrgsListMembersResponseSchema\n  >\n\n  export const OrgsCheckMembershipForUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsCheckMembershipForUserParams = z.infer<\n    typeof OrgsCheckMembershipForUserParamsSchema\n  >\n\n  export type OrgsCheckMembershipForUserResponse = undefined\n\n  export const OrgsRemoveMemberParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsRemoveMemberParams = z.infer<\n    typeof OrgsRemoveMemberParamsSchema\n  >\n\n  export type OrgsRemoveMemberResponse = undefined\n\n  export const CodespacesGetCodespacesForUserInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type CodespacesGetCodespacesForUserInOrgParams = z.infer<\n    typeof CodespacesGetCodespacesForUserInOrgParamsSchema\n  >\n\n  export const CodespacesGetCodespacesForUserInOrgResponseSchema = z.object({\n    total_count: z.number().int(),\n    codespaces: z.array(CodespaceSchema)\n  })\n  export type CodespacesGetCodespacesForUserInOrgResponse = z.infer<\n    typeof CodespacesGetCodespacesForUserInOrgResponseSchema\n  >\n\n  export const CodespacesDeleteFromOrganizationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesDeleteFromOrganizationParams = z.infer<\n    typeof CodespacesDeleteFromOrganizationParamsSchema\n  >\n\n  export type CodespacesDeleteFromOrganizationResponse = undefined\n\n  export const CodespacesStopInOrganizationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesStopInOrganizationParams = z.infer<\n    typeof CodespacesStopInOrganizationParamsSchema\n  >\n\n  export const CodespacesStopInOrganizationResponseSchema = CodespaceSchema\n  export type CodespacesStopInOrganizationResponse = z.infer<\n    typeof CodespacesStopInOrganizationResponseSchema\n  >\n\n  export const CopilotGetCopilotSeatDetailsForUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type CopilotGetCopilotSeatDetailsForUserParams = z.infer<\n    typeof CopilotGetCopilotSeatDetailsForUserParamsSchema\n  >\n\n  export const CopilotGetCopilotSeatDetailsForUserResponseSchema =\n    CopilotSeatDetailsSchema\n  export type CopilotGetCopilotSeatDetailsForUserResponse = z.infer<\n    typeof CopilotGetCopilotSeatDetailsForUserResponseSchema\n  >\n\n  export const OrgsGetMembershipForUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsGetMembershipForUserParams = z.infer<\n    typeof OrgsGetMembershipForUserParamsSchema\n  >\n\n  export const OrgsGetMembershipForUserResponseSchema = OrgMembershipSchema\n  export type OrgsGetMembershipForUserResponse = z.infer<\n    typeof OrgsGetMembershipForUserResponseSchema\n  >\n\n  export const OrgsSetMembershipForUserParamsSchema = z.object({\n    role: z\n      .enum(['admin', 'member'])\n      .describe(\n        'The role to give the user in the organization. Can be one of:  \\n * `admin` - The user will become an owner of the organization.  \\n * `member` - The user will become a non-owner member of the organization.'\n      )\n      .default('member'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsSetMembershipForUserParams = z.infer<\n    typeof OrgsSetMembershipForUserParamsSchema\n  >\n\n  export const OrgsSetMembershipForUserResponseSchema = OrgMembershipSchema\n  export type OrgsSetMembershipForUserResponse = z.infer<\n    typeof OrgsSetMembershipForUserResponseSchema\n  >\n\n  export const OrgsRemoveMembershipForUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsRemoveMembershipForUserParams = z.infer<\n    typeof OrgsRemoveMembershipForUserParamsSchema\n  >\n\n  export type OrgsRemoveMembershipForUserResponse = undefined\n\n  export const MigrationsListForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    exclude: z\n      .array(\n        z\n          .literal('repositories')\n          .describe('Allowed values that can be passed to the exclude param.')\n      )\n      .describe(\n        'Exclude attributes from the API response to improve performance'\n      )\n      .optional()\n  })\n  export type MigrationsListForOrgParams = z.infer<\n    typeof MigrationsListForOrgParamsSchema\n  >\n\n  export const MigrationsListForOrgResponseSchema = z.array(MigrationSchema)\n  export type MigrationsListForOrgResponse = z.infer<\n    typeof MigrationsListForOrgResponseSchema\n  >\n\n  export const MigrationsStartForOrgParamsSchema = z.object({\n    repositories: z\n      .array(z.string())\n      .describe(\n        'A list of arrays indicating which repositories should be migrated.'\n      ),\n    lock_repositories: z\n      .boolean()\n      .describe(\n        'Indicates whether repositories should be locked (to prevent manipulation) while migrating data.'\n      )\n      .default(false),\n    exclude_metadata: z\n      .boolean()\n      .describe(\n        'Indicates whether metadata should be excluded and only git source should be included for the migration.'\n      )\n      .default(false),\n    exclude_git_data: z\n      .boolean()\n      .describe(\n        'Indicates whether the repository git data should be excluded from the migration.'\n      )\n      .default(false),\n    exclude_attachments: z\n      .boolean()\n      .describe(\n        'Indicates whether attachments should be excluded from the migration (to reduce migration archive file size).'\n      )\n      .default(false),\n    exclude_releases: z\n      .boolean()\n      .describe(\n        'Indicates whether releases should be excluded from the migration (to reduce migration archive file size).'\n      )\n      .default(false),\n    exclude_owner_projects: z\n      .boolean()\n      .describe(\n        'Indicates whether projects owned by the organization or users should be excluded. from the migration.'\n      )\n      .default(false),\n    org_metadata_only: z\n      .boolean()\n      .describe(\n        'Indicates whether this should only include organization metadata (repositories array should be empty and will ignore other flags).'\n      )\n      .default(false),\n    exclude: z\n      .array(z.literal('repositories'))\n      .describe(\n        'Exclude related items from being returned in the response in order to improve performance of the request.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type MigrationsStartForOrgParams = z.infer<\n    typeof MigrationsStartForOrgParamsSchema\n  >\n\n  export type MigrationsStartForOrgResponse = undefined\n\n  export const MigrationsGetStatusForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.'),\n    exclude: z\n      .array(\n        z\n          .literal('repositories')\n          .describe('Allowed values that can be passed to the exclude param.')\n      )\n      .describe(\n        'Exclude attributes from the API response to improve performance'\n      )\n      .optional()\n  })\n  export type MigrationsGetStatusForOrgParams = z.infer<\n    typeof MigrationsGetStatusForOrgParamsSchema\n  >\n\n  export const MigrationsGetStatusForOrgResponseSchema = MigrationSchema\n  export type MigrationsGetStatusForOrgResponse = z.infer<\n    typeof MigrationsGetStatusForOrgResponseSchema\n  >\n\n  export const MigrationsDownloadArchiveForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.')\n  })\n  export type MigrationsDownloadArchiveForOrgParams = z.infer<\n    typeof MigrationsDownloadArchiveForOrgParamsSchema\n  >\n\n  export type MigrationsDownloadArchiveForOrgResponse = undefined\n\n  export const MigrationsDeleteArchiveForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.')\n  })\n  export type MigrationsDeleteArchiveForOrgParams = z.infer<\n    typeof MigrationsDeleteArchiveForOrgParamsSchema\n  >\n\n  export type MigrationsDeleteArchiveForOrgResponse = undefined\n\n  export const MigrationsUnlockRepoForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.'),\n    repo_name: z.string().describe('repo_name parameter')\n  })\n  export type MigrationsUnlockRepoForOrgParams = z.infer<\n    typeof MigrationsUnlockRepoForOrgParamsSchema\n  >\n\n  export type MigrationsUnlockRepoForOrgResponse = undefined\n\n  export const MigrationsListReposForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type MigrationsListReposForOrgParams = z.infer<\n    typeof MigrationsListReposForOrgParamsSchema\n  >\n\n  export const MigrationsListReposForOrgResponseSchema = z.array(\n    MinimalRepositorySchema\n  )\n  export type MigrationsListReposForOrgResponse = z.infer<\n    typeof MigrationsListReposForOrgResponseSchema\n  >\n\n  export const OrgsListOrgRolesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsListOrgRolesParams = z.infer<\n    typeof OrgsListOrgRolesParamsSchema\n  >\n\n  export const OrgsListOrgRolesResponseSchema = z.object({\n    total_count: z\n      .number()\n      .int()\n      .describe(\n        'The total number of organization roles available to the organization.'\n      )\n      .optional(),\n    roles: z\n      .array(OrganizationRoleSchema)\n      .describe('The list of organization roles available to the organization.')\n      .optional()\n  })\n  export type OrgsListOrgRolesResponse = z.infer<\n    typeof OrgsListOrgRolesResponseSchema\n  >\n\n  export const OrgsRevokeAllOrgRolesTeamParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.')\n  })\n  export type OrgsRevokeAllOrgRolesTeamParams = z.infer<\n    typeof OrgsRevokeAllOrgRolesTeamParamsSchema\n  >\n\n  export type OrgsRevokeAllOrgRolesTeamResponse = undefined\n\n  export const OrgsAssignTeamToOrgRoleParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    role_id: z.number().int().describe('The unique identifier of the role.')\n  })\n  export type OrgsAssignTeamToOrgRoleParams = z.infer<\n    typeof OrgsAssignTeamToOrgRoleParamsSchema\n  >\n\n  export type OrgsAssignTeamToOrgRoleResponse = undefined\n\n  export const OrgsRevokeOrgRoleTeamParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    role_id: z.number().int().describe('The unique identifier of the role.')\n  })\n  export type OrgsRevokeOrgRoleTeamParams = z.infer<\n    typeof OrgsRevokeOrgRoleTeamParamsSchema\n  >\n\n  export type OrgsRevokeOrgRoleTeamResponse = undefined\n\n  export const OrgsRevokeAllOrgRolesUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsRevokeAllOrgRolesUserParams = z.infer<\n    typeof OrgsRevokeAllOrgRolesUserParamsSchema\n  >\n\n  export type OrgsRevokeAllOrgRolesUserResponse = undefined\n\n  export const OrgsAssignUserToOrgRoleParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    role_id: z.number().int().describe('The unique identifier of the role.')\n  })\n  export type OrgsAssignUserToOrgRoleParams = z.infer<\n    typeof OrgsAssignUserToOrgRoleParamsSchema\n  >\n\n  export type OrgsAssignUserToOrgRoleResponse = undefined\n\n  export const OrgsRevokeOrgRoleUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    role_id: z.number().int().describe('The unique identifier of the role.')\n  })\n  export type OrgsRevokeOrgRoleUserParams = z.infer<\n    typeof OrgsRevokeOrgRoleUserParamsSchema\n  >\n\n  export type OrgsRevokeOrgRoleUserResponse = undefined\n\n  export const OrgsGetOrgRoleParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    role_id: z.number().int().describe('The unique identifier of the role.')\n  })\n  export type OrgsGetOrgRoleParams = z.infer<typeof OrgsGetOrgRoleParamsSchema>\n\n  export const OrgsGetOrgRoleResponseSchema = OrganizationRoleSchema\n  export type OrgsGetOrgRoleResponse = z.infer<\n    typeof OrgsGetOrgRoleResponseSchema\n  >\n\n  export const OrgsListOrgRoleTeamsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    role_id: z.number().int().describe('The unique identifier of the role.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListOrgRoleTeamsParams = z.infer<\n    typeof OrgsListOrgRoleTeamsParamsSchema\n  >\n\n  export const OrgsListOrgRoleTeamsResponseSchema = z\n    .array(TeamRoleAssignmentSchema)\n    .describe('List of teams assigned to the organization role')\n  export type OrgsListOrgRoleTeamsResponse = z.infer<\n    typeof OrgsListOrgRoleTeamsResponseSchema\n  >\n\n  export const OrgsListOrgRoleUsersParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    role_id: z.number().int().describe('The unique identifier of the role.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListOrgRoleUsersParams = z.infer<\n    typeof OrgsListOrgRoleUsersParamsSchema\n  >\n\n  export const OrgsListOrgRoleUsersResponseSchema = z\n    .array(UserRoleAssignmentSchema)\n    .describe('List of users assigned to the organization role')\n  export type OrgsListOrgRoleUsersResponse = z.infer<\n    typeof OrgsListOrgRoleUsersResponseSchema\n  >\n\n  export const OrgsListOutsideCollaboratorsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    filter: z\n      .enum(['2fa_disabled', 'all'])\n      .describe(\n        'Filter the list of outside collaborators. `2fa_disabled` means that only outside collaborators without [two-factor authentication](https://github.com/blog/1614-two-factor-authentication) enabled will be returned.'\n      )\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListOutsideCollaboratorsParams = z.infer<\n    typeof OrgsListOutsideCollaboratorsParamsSchema\n  >\n\n  export const OrgsListOutsideCollaboratorsResponseSchema =\n    z.array(SimpleUserSchema)\n  export type OrgsListOutsideCollaboratorsResponse = z.infer<\n    typeof OrgsListOutsideCollaboratorsResponseSchema\n  >\n\n  export const OrgsConvertMemberToOutsideCollaboratorParamsSchema = z.object({\n    async: z\n      .boolean()\n      .describe(\n        'When set to `true`, the request will be performed asynchronously. Returns a 202 status code when the job is successfully queued.'\n      )\n      .default(false),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsConvertMemberToOutsideCollaboratorParams = z.infer<\n    typeof OrgsConvertMemberToOutsideCollaboratorParamsSchema\n  >\n\n  export type OrgsConvertMemberToOutsideCollaboratorResponse = undefined\n\n  export const OrgsRemoveOutsideCollaboratorParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsRemoveOutsideCollaboratorParams = z.infer<\n    typeof OrgsRemoveOutsideCollaboratorParamsSchema\n  >\n\n  export type OrgsRemoveOutsideCollaboratorResponse = undefined\n\n  export const PackagesListPackagesForOrganizationParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    visibility: z\n      .enum(['public', 'private', 'internal'])\n      .describe(\n        'The selected visibility of the packages.  This parameter is optional and only filters an existing result set.\\n\\nThe `internal` visibility is only supported for GitHub Packages registries that allow for granular permissions. For other ecosystems `internal` is synonymous with `private`.\\nFor the list of GitHub Packages registries that support granular permissions, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type PackagesListPackagesForOrganizationParams = z.infer<\n    typeof PackagesListPackagesForOrganizationParamsSchema\n  >\n\n  export const PackagesListPackagesForOrganizationResponseSchema =\n    z.array(PackageSchema)\n  export type PackagesListPackagesForOrganizationResponse = z.infer<\n    typeof PackagesListPackagesForOrganizationResponseSchema\n  >\n\n  export const PackagesGetPackageForOrganizationParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type PackagesGetPackageForOrganizationParams = z.infer<\n    typeof PackagesGetPackageForOrganizationParamsSchema\n  >\n\n  export const PackagesGetPackageForOrganizationResponseSchema = PackageSchema\n  export type PackagesGetPackageForOrganizationResponse = z.infer<\n    typeof PackagesGetPackageForOrganizationResponseSchema\n  >\n\n  export const PackagesDeletePackageForOrgParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type PackagesDeletePackageForOrgParams = z.infer<\n    typeof PackagesDeletePackageForOrgParamsSchema\n  >\n\n  export type PackagesDeletePackageForOrgResponse = undefined\n\n  export const PackagesRestorePackageForOrgParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    token: z.string().describe('package token').optional()\n  })\n  export type PackagesRestorePackageForOrgParams = z.infer<\n    typeof PackagesRestorePackageForOrgParamsSchema\n  >\n\n  export type PackagesRestorePackageForOrgResponse = undefined\n\n  export const PackagesGetAllPackageVersionsForPackageOwnedByOrgParamsSchema =\n    z.object({\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.'),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      state: z\n        .enum(['active', 'deleted'])\n        .describe('The state of the package, either active or deleted.')\n        .default('active')\n    })\n  export type PackagesGetAllPackageVersionsForPackageOwnedByOrgParams = z.infer<\n    typeof PackagesGetAllPackageVersionsForPackageOwnedByOrgParamsSchema\n  >\n\n  export const PackagesGetAllPackageVersionsForPackageOwnedByOrgResponseSchema =\n    z.array(PackageVersionSchema)\n  export type PackagesGetAllPackageVersionsForPackageOwnedByOrgResponse =\n    z.infer<\n      typeof PackagesGetAllPackageVersionsForPackageOwnedByOrgResponseSchema\n    >\n\n  export const PackagesGetPackageVersionForOrganizationParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    package_version_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the package version.')\n  })\n  export type PackagesGetPackageVersionForOrganizationParams = z.infer<\n    typeof PackagesGetPackageVersionForOrganizationParamsSchema\n  >\n\n  export const PackagesGetPackageVersionForOrganizationResponseSchema =\n    PackageVersionSchema\n  export type PackagesGetPackageVersionForOrganizationResponse = z.infer<\n    typeof PackagesGetPackageVersionForOrganizationResponseSchema\n  >\n\n  export const PackagesDeletePackageVersionForOrgParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    package_version_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the package version.')\n  })\n  export type PackagesDeletePackageVersionForOrgParams = z.infer<\n    typeof PackagesDeletePackageVersionForOrgParamsSchema\n  >\n\n  export type PackagesDeletePackageVersionForOrgResponse = undefined\n\n  export const PackagesRestorePackageVersionForOrgParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    package_version_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the package version.')\n  })\n  export type PackagesRestorePackageVersionForOrgParams = z.infer<\n    typeof PackagesRestorePackageVersionForOrgParamsSchema\n  >\n\n  export type PackagesRestorePackageVersionForOrgResponse = undefined\n\n  export const OrgsListPatGrantRequestsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    sort: z\n      .literal('created_at')\n      .describe('The property by which to sort the results.')\n      .default('created_at'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    owner: z\n      .array(z.string())\n      .max(10)\n      .describe('A list of owner usernames to use to filter the results.')\n      .optional(),\n    repository: z\n      .string()\n      .describe('The name of the repository to use to filter the results.')\n      .optional(),\n    permission: z\n      .string()\n      .describe('The permission to use to filter the results.')\n      .optional(),\n    last_used_before: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show fine-grained personal access tokens used before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    last_used_after: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show fine-grained personal access tokens used after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    token_id: z\n      .array(z.string())\n      .max(50)\n      .describe('The ID of the token')\n      .optional()\n  })\n  export type OrgsListPatGrantRequestsParams = z.infer<\n    typeof OrgsListPatGrantRequestsParamsSchema\n  >\n\n  export const OrgsListPatGrantRequestsResponseSchema = z.array(\n    OrganizationProgrammaticAccessGrantRequestSchema\n  )\n  export type OrgsListPatGrantRequestsResponse = z.infer<\n    typeof OrgsListPatGrantRequestsResponseSchema\n  >\n\n  export const OrgsReviewPatGrantRequestsInBulkParamsSchema = z.object({\n    pat_request_ids: z\n      .array(z.number().int())\n      .min(1)\n      .max(100)\n      .describe(\n        'Unique identifiers of the requests for access via fine-grained personal access token. Must be formed of between 1 and 100 `pat_request_id` values.'\n      )\n      .optional(),\n    action: z\n      .enum(['approve', 'deny'])\n      .describe('Action to apply to the requests.'),\n    reason: z\n      .string()\n      .max(1024)\n      .describe(\n        'Reason for approving or denying the requests. Max 1024 characters.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsReviewPatGrantRequestsInBulkParams = z.infer<\n    typeof OrgsReviewPatGrantRequestsInBulkParamsSchema\n  >\n\n  export type OrgsReviewPatGrantRequestsInBulkResponse = undefined\n\n  export const OrgsReviewPatGrantRequestParamsSchema = z.object({\n    action: z\n      .enum(['approve', 'deny'])\n      .describe('Action to apply to the request.'),\n    reason: z\n      .string()\n      .max(1024)\n      .describe(\n        'Reason for approving or denying the request. Max 1024 characters.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    pat_request_id: z\n      .number()\n      .int()\n      .describe(\n        'Unique identifier of the request for access via fine-grained personal access token.'\n      )\n  })\n  export type OrgsReviewPatGrantRequestParams = z.infer<\n    typeof OrgsReviewPatGrantRequestParamsSchema\n  >\n\n  export type OrgsReviewPatGrantRequestResponse = undefined\n\n  export const OrgsListPatGrantRequestRepositoriesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    pat_request_id: z\n      .number()\n      .int()\n      .describe(\n        'Unique identifier of the request for access via fine-grained personal access token.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListPatGrantRequestRepositoriesParams = z.infer<\n    typeof OrgsListPatGrantRequestRepositoriesParamsSchema\n  >\n\n  export const OrgsListPatGrantRequestRepositoriesResponseSchema = z.array(\n    MinimalRepositorySchema\n  )\n  export type OrgsListPatGrantRequestRepositoriesResponse = z.infer<\n    typeof OrgsListPatGrantRequestRepositoriesResponseSchema\n  >\n\n  export const OrgsListPatGrantsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    sort: z\n      .literal('created_at')\n      .describe('The property by which to sort the results.')\n      .default('created_at'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    owner: z\n      .array(z.string())\n      .max(10)\n      .describe('A list of owner usernames to use to filter the results.')\n      .optional(),\n    repository: z\n      .string()\n      .describe('The name of the repository to use to filter the results.')\n      .optional(),\n    permission: z\n      .string()\n      .describe('The permission to use to filter the results.')\n      .optional(),\n    last_used_before: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show fine-grained personal access tokens used before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    last_used_after: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show fine-grained personal access tokens used after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    token_id: z\n      .array(z.string())\n      .max(50)\n      .describe('The ID of the token')\n      .optional()\n  })\n  export type OrgsListPatGrantsParams = z.infer<\n    typeof OrgsListPatGrantsParamsSchema\n  >\n\n  export const OrgsListPatGrantsResponseSchema = z.array(\n    OrganizationProgrammaticAccessGrantSchema\n  )\n  export type OrgsListPatGrantsResponse = z.infer<\n    typeof OrgsListPatGrantsResponseSchema\n  >\n\n  export const OrgsUpdatePatAccessesParamsSchema = z.object({\n    action: z\n      .literal('revoke')\n      .describe('Action to apply to the fine-grained personal access token.'),\n    pat_ids: z\n      .array(\n        z\n          .number()\n          .int()\n          .describe(\n            'Unique identifier of the fine-grained personal access token.'\n          )\n      )\n      .min(1)\n      .max(100)\n      .describe('The IDs of the fine-grained personal access tokens.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsUpdatePatAccessesParams = z.infer<\n    typeof OrgsUpdatePatAccessesParamsSchema\n  >\n\n  export type OrgsUpdatePatAccessesResponse = undefined\n\n  export const OrgsUpdatePatAccessParamsSchema = z.object({\n    action: z\n      .literal('revoke')\n      .describe('Action to apply to the fine-grained personal access token.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    pat_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the fine-grained personal access token.'\n      )\n  })\n  export type OrgsUpdatePatAccessParams = z.infer<\n    typeof OrgsUpdatePatAccessParamsSchema\n  >\n\n  export type OrgsUpdatePatAccessResponse = undefined\n\n  export const OrgsListPatGrantRepositoriesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    pat_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the fine-grained personal access token.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListPatGrantRepositoriesParams = z.infer<\n    typeof OrgsListPatGrantRepositoriesParamsSchema\n  >\n\n  export const OrgsListPatGrantRepositoriesResponseSchema = z.array(\n    MinimalRepositorySchema\n  )\n  export type OrgsListPatGrantRepositoriesResponse = z.infer<\n    typeof OrgsListPatGrantRepositoriesResponseSchema\n  >\n\n  export const PrivateRegistriesListOrgPrivateRegistriesParamsSchema = z.object(\n    {\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type PrivateRegistriesListOrgPrivateRegistriesParams = z.infer<\n    typeof PrivateRegistriesListOrgPrivateRegistriesParamsSchema\n  >\n\n  export const PrivateRegistriesListOrgPrivateRegistriesResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      configurations: z.array(OrgPrivateRegistryConfigurationSchema)\n    })\n  export type PrivateRegistriesListOrgPrivateRegistriesResponse = z.infer<\n    typeof PrivateRegistriesListOrgPrivateRegistriesResponseSchema\n  >\n\n  export const PrivateRegistriesCreateOrgPrivateRegistryParamsSchema = z.object(\n    {\n      registry_type: z\n        .literal('maven_repository')\n        .describe('The registry type.'),\n      username: z\n        .string()\n        .describe(\n          'The username to use when authenticating with the private registry. This field should be omitted if the private registry does not require a username for authentication.'\n        )\n        .optional(),\n      encrypted_value: z\n        .string()\n        .regex(\n          new RegExp(\n            '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n          )\n        )\n        .describe(\n          'The value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get private registries public key for an organization](https://docs.github.com/rest/private-registries/organization-configurations#get-private-registries-public-key-for-an-organization) endpoint.'\n        ),\n      key_id: z\n        .string()\n        .describe('The ID of the key you used to encrypt the secret.'),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe(\n          'Which type of organization repositories have access to the private registry. `selected` means only the repositories specified by `selected_repository_ids` can access the private registry.'\n        ),\n      selected_repository_ids: z\n        .array(z.number().int())\n        .describe(\n          'An array of repository IDs that can access the organization private registry. You can only provide a list of repository IDs when `visibility` is set to `selected`. You can manage the list of selected repositories using the [Update a private registry for an organization](https://docs.github.com/rest/private-registries/organization-configurations#update-a-private-registry-for-an-organization) endpoint. This field should be omitted if `visibility` is set to `all` or `private`.'\n        )\n        .optional(),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    }\n  )\n  export type PrivateRegistriesCreateOrgPrivateRegistryParams = z.infer<\n    typeof PrivateRegistriesCreateOrgPrivateRegistryParamsSchema\n  >\n\n  export type PrivateRegistriesCreateOrgPrivateRegistryResponse = undefined\n\n  export const PrivateRegistriesGetOrgPublicKeyParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type PrivateRegistriesGetOrgPublicKeyParams = z.infer<\n    typeof PrivateRegistriesGetOrgPublicKeyParamsSchema\n  >\n\n  export const PrivateRegistriesGetOrgPublicKeyResponseSchema = z.object({\n    key_id: z.string().describe('The identifier for the key.'),\n    key: z.string().describe('The Base64 encoded public key.')\n  })\n  export type PrivateRegistriesGetOrgPublicKeyResponse = z.infer<\n    typeof PrivateRegistriesGetOrgPublicKeyResponseSchema\n  >\n\n  export const PrivateRegistriesGetOrgPrivateRegistryParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type PrivateRegistriesGetOrgPrivateRegistryParams = z.infer<\n    typeof PrivateRegistriesGetOrgPrivateRegistryParamsSchema\n  >\n\n  export const PrivateRegistriesGetOrgPrivateRegistryResponseSchema =\n    OrgPrivateRegistryConfigurationSchema\n  export type PrivateRegistriesGetOrgPrivateRegistryResponse = z.infer<\n    typeof PrivateRegistriesGetOrgPrivateRegistryResponseSchema\n  >\n\n  export const PrivateRegistriesDeleteOrgPrivateRegistryParamsSchema = z.object(\n    {\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      secret_name: z.string().describe('The name of the secret.')\n    }\n  )\n  export type PrivateRegistriesDeleteOrgPrivateRegistryParams = z.infer<\n    typeof PrivateRegistriesDeleteOrgPrivateRegistryParamsSchema\n  >\n\n  export type PrivateRegistriesDeleteOrgPrivateRegistryResponse = undefined\n\n  export const PrivateRegistriesUpdateOrgPrivateRegistryParamsSchema = z.object(\n    {\n      registry_type: z\n        .literal('maven_repository')\n        .describe('The registry type.')\n        .optional(),\n      username: z\n        .string()\n        .describe(\n          'The username to use when authenticating with the private registry. This field should be omitted if the private registry does not require a username for authentication.'\n        )\n        .optional(),\n      encrypted_value: z\n        .string()\n        .regex(\n          new RegExp(\n            '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n          )\n        )\n        .describe(\n          'The value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get private registries public key for an organization](https://docs.github.com/rest/private-registries/organization-configurations#get-private-registries-public-key-for-an-organization) endpoint.'\n        )\n        .optional(),\n      key_id: z\n        .string()\n        .describe('The ID of the key you used to encrypt the secret.')\n        .optional(),\n      visibility: z\n        .enum(['all', 'private', 'selected'])\n        .describe(\n          'Which type of organization repositories have access to the private registry. `selected` means only the repositories specified by `selected_repository_ids` can access the private registry.'\n        )\n        .optional(),\n      selected_repository_ids: z\n        .array(z.number().int())\n        .describe(\n          'An array of repository IDs that can access the organization private registry. You can only provide a list of repository IDs when `visibility` is set to `selected`. This field should be omitted if `visibility` is set to `all` or `private`.'\n        )\n        .optional(),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      secret_name: z.string().describe('The name of the secret.')\n    }\n  )\n  export type PrivateRegistriesUpdateOrgPrivateRegistryParams = z.infer<\n    typeof PrivateRegistriesUpdateOrgPrivateRegistryParamsSchema\n  >\n\n  export type PrivateRegistriesUpdateOrgPrivateRegistryResponse = undefined\n\n  export const ProjectsListForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Indicates the state of the projects to return.')\n      .default('open'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ProjectsListForOrgParams = z.infer<\n    typeof ProjectsListForOrgParamsSchema\n  >\n\n  export const ProjectsListForOrgResponseSchema = z.array(ProjectSchema)\n  export type ProjectsListForOrgResponse = z.infer<\n    typeof ProjectsListForOrgResponseSchema\n  >\n\n  export const ProjectsCreateForOrgParamsSchema = z.object({\n    name: z.string().describe('The name of the project.'),\n    body: z.string().describe('The description of the project.').optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ProjectsCreateForOrgParams = z.infer<\n    typeof ProjectsCreateForOrgParamsSchema\n  >\n\n  export type ProjectsCreateForOrgResponse = undefined\n\n  export const OrgsGetAllCustomPropertiesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsGetAllCustomPropertiesParams = z.infer<\n    typeof OrgsGetAllCustomPropertiesParamsSchema\n  >\n\n  export const OrgsGetAllCustomPropertiesResponseSchema =\n    z.array(CustomPropertySchema)\n  export type OrgsGetAllCustomPropertiesResponse = z.infer<\n    typeof OrgsGetAllCustomPropertiesResponseSchema\n  >\n\n  export const OrgsCreateOrUpdateCustomPropertiesParamsSchema = z.object({\n    properties: z\n      .array(CustomPropertySchema)\n      .min(1)\n      .max(100)\n      .describe('The array of custom properties to create or update.'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsCreateOrUpdateCustomPropertiesParams = z.infer<\n    typeof OrgsCreateOrUpdateCustomPropertiesParamsSchema\n  >\n\n  export const OrgsCreateOrUpdateCustomPropertiesResponseSchema =\n    z.array(CustomPropertySchema)\n  export type OrgsCreateOrUpdateCustomPropertiesResponse = z.infer<\n    typeof OrgsCreateOrUpdateCustomPropertiesResponseSchema\n  >\n\n  export const OrgsGetCustomPropertyParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    custom_property_name: z.string().describe('The custom property name')\n  })\n  export type OrgsGetCustomPropertyParams = z.infer<\n    typeof OrgsGetCustomPropertyParamsSchema\n  >\n\n  export const OrgsGetCustomPropertyResponseSchema = CustomPropertySchema\n  export type OrgsGetCustomPropertyResponse = z.infer<\n    typeof OrgsGetCustomPropertyResponseSchema\n  >\n\n  export const OrgsCreateOrUpdateCustomPropertyParamsSchema = z\n    .object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      custom_property_name: z.string().describe('The custom property name')\n    })\n    .merge(CustomPropertySetPayloadSchema)\n  export type OrgsCreateOrUpdateCustomPropertyParams = z.infer<\n    typeof OrgsCreateOrUpdateCustomPropertyParamsSchema\n  >\n\n  export const OrgsCreateOrUpdateCustomPropertyResponseSchema =\n    CustomPropertySchema\n  export type OrgsCreateOrUpdateCustomPropertyResponse = z.infer<\n    typeof OrgsCreateOrUpdateCustomPropertyResponseSchema\n  >\n\n  export const OrgsRemoveCustomPropertyParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    custom_property_name: z.string().describe('The custom property name')\n  })\n  export type OrgsRemoveCustomPropertyParams = z.infer<\n    typeof OrgsRemoveCustomPropertyParamsSchema\n  >\n\n  export type OrgsRemoveCustomPropertyResponse = undefined\n\n  export const OrgsListCustomPropertiesValuesForReposParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    repository_query: z\n      .string()\n      .describe(\n        'Finds repositories in the organization with a query containing one or more search keywords and qualifiers. Qualifiers allow you to limit your search to specific areas of GitHub. The REST API supports the same qualifiers as the web interface for GitHub. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query). See \"[Searching for repositories](https://docs.github.com/articles/searching-for-repositories/)\" for a detailed list of qualifiers.'\n      )\n      .optional()\n  })\n  export type OrgsListCustomPropertiesValuesForReposParams = z.infer<\n    typeof OrgsListCustomPropertiesValuesForReposParamsSchema\n  >\n\n  export const OrgsListCustomPropertiesValuesForReposResponseSchema = z.array(\n    OrgRepoCustomPropertyValuesSchema\n  )\n  export type OrgsListCustomPropertiesValuesForReposResponse = z.infer<\n    typeof OrgsListCustomPropertiesValuesForReposResponseSchema\n  >\n\n  export const OrgsCreateOrUpdateCustomPropertiesValuesForReposParamsSchema =\n    z.object({\n      repository_names: z\n        .array(z.string())\n        .min(1)\n        .max(30)\n        .describe(\n          'The names of repositories that the custom property values will be applied to.'\n        ),\n      properties: z\n        .array(CustomPropertyValueSchema)\n        .describe(\n          'List of custom property names and associated values to apply to the repositories.'\n        ),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type OrgsCreateOrUpdateCustomPropertiesValuesForReposParams = z.infer<\n    typeof OrgsCreateOrUpdateCustomPropertiesValuesForReposParamsSchema\n  >\n\n  export type OrgsCreateOrUpdateCustomPropertiesValuesForReposResponse =\n    undefined\n\n  export const OrgsListPublicMembersParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListPublicMembersParams = z.infer<\n    typeof OrgsListPublicMembersParamsSchema\n  >\n\n  export const OrgsListPublicMembersResponseSchema = z.array(SimpleUserSchema)\n  export type OrgsListPublicMembersResponse = z.infer<\n    typeof OrgsListPublicMembersResponseSchema\n  >\n\n  export const OrgsCheckPublicMembershipForUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type OrgsCheckPublicMembershipForUserParams = z.infer<\n    typeof OrgsCheckPublicMembershipForUserParamsSchema\n  >\n\n  export type OrgsCheckPublicMembershipForUserResponse = undefined\n\n  export const OrgsSetPublicMembershipForAuthenticatedUserParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      username: z.string().describe('The handle for the GitHub user account.')\n    })\n  export type OrgsSetPublicMembershipForAuthenticatedUserParams = z.infer<\n    typeof OrgsSetPublicMembershipForAuthenticatedUserParamsSchema\n  >\n\n  export type OrgsSetPublicMembershipForAuthenticatedUserResponse = undefined\n\n  export const OrgsRemovePublicMembershipForAuthenticatedUserParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      username: z.string().describe('The handle for the GitHub user account.')\n    })\n  export type OrgsRemovePublicMembershipForAuthenticatedUserParams = z.infer<\n    typeof OrgsRemovePublicMembershipForAuthenticatedUserParamsSchema\n  >\n\n  export type OrgsRemovePublicMembershipForAuthenticatedUserResponse = undefined\n\n  export const ReposListForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    type: z\n      .enum(['all', 'public', 'private', 'forks', 'sources', 'member'])\n      .describe('Specifies the types of repositories you want returned.')\n      .default('all'),\n    sort: z\n      .enum(['created', 'updated', 'pushed', 'full_name'])\n      .describe('The property to sort the results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'The order to sort by. Default: `asc` when using `full_name`, otherwise `desc`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListForOrgParams = z.infer<\n    typeof ReposListForOrgParamsSchema\n  >\n\n  export const ReposListForOrgResponseSchema = z.array(MinimalRepositorySchema)\n  export type ReposListForOrgResponse = z.infer<\n    typeof ReposListForOrgResponseSchema\n  >\n\n  export const ReposCreateInOrgParamsSchema = z.object({\n    name: z.string().describe('The name of the repository.'),\n    description: z\n      .string()\n      .describe('A short description of the repository.')\n      .optional(),\n    homepage: z\n      .string()\n      .describe('A URL with more information about the repository.')\n      .optional(),\n    private: z\n      .boolean()\n      .describe('Whether the repository is private.')\n      .default(false),\n    visibility: z\n      .enum(['public', 'private'])\n      .describe('The visibility of the repository.')\n      .optional(),\n    has_issues: z\n      .boolean()\n      .describe(\n        'Either `true` to enable issues for this repository or `false` to disable them.'\n      )\n      .default(true),\n    has_projects: z\n      .boolean()\n      .describe(\n        \"Either `true` to enable projects for this repository or `false` to disable them. **Note:** If you're creating a repository in an organization that has disabled repository projects, the default is `false`, and if you pass `true`, the API returns an error.\"\n      )\n      .default(true),\n    has_wiki: z\n      .boolean()\n      .describe(\n        'Either `true` to enable the wiki for this repository or `false` to disable it.'\n      )\n      .default(true),\n    has_downloads: z\n      .boolean()\n      .describe('Whether downloads are enabled.')\n      .default(true),\n    is_template: z\n      .boolean()\n      .describe(\n        'Either `true` to make this repo available as a template repository or `false` to prevent it.'\n      )\n      .default(false),\n    team_id: z\n      .number()\n      .int()\n      .describe(\n        'The id of the team that will be granted access to this repository. This is only valid when creating a repository in an organization.'\n      )\n      .optional(),\n    auto_init: z\n      .boolean()\n      .describe('Pass `true` to create an initial commit with empty README.')\n      .default(false),\n    gitignore_template: z\n      .string()\n      .describe(\n        'Desired language or platform [.gitignore template](https://github.com/github/gitignore) to apply. Use the name of the template without the extension. For example, \"Haskell\".'\n      )\n      .optional(),\n    license_template: z\n      .string()\n      .describe(\n        'Choose an [open source license template](https://choosealicense.com/) that best suits your needs, and then use the [license keyword](https://docs.github.com/articles/licensing-a-repository/#searching-github-by-license-type) as the `license_template` string. For example, \"mit\" or \"mpl-2.0\".'\n      )\n      .optional(),\n    allow_squash_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.'\n      )\n      .default(true),\n    allow_merge_commit: z\n      .boolean()\n      .describe(\n        'Either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits.'\n      )\n      .default(true),\n    allow_rebase_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow rebase-merging pull requests, or `false` to prevent rebase-merging.'\n      )\n      .default(true),\n    allow_auto_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow auto-merge on pull requests, or `false` to disallow auto-merge.'\n      )\n      .default(false),\n    delete_branch_on_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow automatically deleting head branches when pull requests are merged, or `false` to prevent automatic deletion. **The authenticated user must be an organization owner to set this property to `true`.**'\n      )\n      .default(false),\n    use_squash_pr_title_as_default: z\n      .boolean()\n      .describe(\n        'Either `true` to allow squash-merge commits to use pull request title, or `false` to use commit message. **This property is closing down. Please use `squash_merge_commit_title` instead.'\n      )\n      .default(false),\n    squash_merge_commit_title: z\n      .enum(['PR_TITLE', 'COMMIT_OR_PR_TITLE'])\n      .describe(\n        \"Required when using `squash_merge_commit_message`.\\n\\nThe default value for a squash merge commit title:\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).\"\n      )\n      .optional(),\n    squash_merge_commit_message: z\n      .enum(['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'])\n      .describe(\n        \"The default value for a squash merge commit message:\\n\\n- `PR_BODY` - default to the pull request's body.\\n- `COMMIT_MESSAGES` - default to the branch's commit messages.\\n- `BLANK` - default to a blank commit message.\"\n      )\n      .optional(),\n    merge_commit_title: z\n      .enum(['PR_TITLE', 'MERGE_MESSAGE'])\n      .describe(\n        \"Required when using `merge_commit_message`.\\n\\nThe default value for a merge commit title.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).\"\n      )\n      .optional(),\n    merge_commit_message: z\n      .enum(['PR_BODY', 'PR_TITLE', 'BLANK'])\n      .describe(\n        \"The default value for a merge commit message.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `PR_BODY` - default to the pull request's body.\\n- `BLANK` - default to a blank commit message.\"\n      )\n      .optional(),\n    custom_properties: z\n      .record(z.any())\n      .describe(\n        'The custom properties for the new repository. The keys are the custom property names, and the values are the corresponding custom property values.'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ReposCreateInOrgParams = z.infer<\n    typeof ReposCreateInOrgParamsSchema\n  >\n\n  export type ReposCreateInOrgResponse = undefined\n\n  export const ReposGetOrgRulesetsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    targets: z\n      .string()\n      .describe(\n        'A comma-separated list of rule targets to filter by.\\nIf provided, only rulesets that apply to the specified targets will be returned.\\nFor example, `branch,tag,push`.\\n'\n      )\n      .optional()\n  })\n  export type ReposGetOrgRulesetsParams = z.infer<\n    typeof ReposGetOrgRulesetsParamsSchema\n  >\n\n  export const ReposGetOrgRulesetsResponseSchema = z.array(\n    RepositoryRulesetSchema\n  )\n  export type ReposGetOrgRulesetsResponse = z.infer<\n    typeof ReposGetOrgRulesetsResponseSchema\n  >\n\n  export const ReposCreateOrgRulesetParamsSchema = z.object({\n    name: z.string().describe('The name of the ruleset.'),\n    target: z\n      .enum(['branch', 'tag', 'push', 'repository'])\n      .describe('The target of the ruleset')\n      .default('branch'),\n    enforcement: RepositoryRuleEnforcementSchema,\n    bypass_actors: z\n      .array(RepositoryRulesetBypassActorSchema)\n      .describe('The actors that can bypass the rules in this ruleset')\n      .optional(),\n    conditions: OrgRulesetConditionsSchema.optional(),\n    rules: z\n      .array(RepositoryRuleSchema)\n      .describe('An array of rules within the ruleset.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type ReposCreateOrgRulesetParams = z.infer<\n    typeof ReposCreateOrgRulesetParamsSchema\n  >\n\n  export type ReposCreateOrgRulesetResponse = undefined\n\n  export const ReposGetOrgRuleSuitesParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    ref: z\n      .string()\n      .describe(\n        'The name of the ref. Cannot contain wildcard characters. Optionally prefix with `refs/heads/` to limit to branches or `refs/tags/` to limit to tags. Omit the prefix to search across all refs. When specified, only rule evaluations triggered for this ref will be returned.'\n      )\n      .optional(),\n    repository_name: z\n      .string()\n      .describe('The name of the repository to filter on.')\n      .optional(),\n    time_period: z\n      .enum(['hour', 'day', 'week', 'month'])\n      .describe(\n        'The time period to filter by.\\n\\nFor example, `day` will filter for rule suites that occurred in the past 24 hours, and `week` will filter for insights that occurred in the past 7 days (168 hours).'\n      )\n      .default('day'),\n    actor_name: z\n      .string()\n      .describe(\n        'The handle for the GitHub user account to filter on. When specified, only rule evaluations triggered by this actor will be returned.'\n      )\n      .optional(),\n    rule_suite_result: z\n      .enum(['pass', 'fail', 'bypass', 'all'])\n      .describe(\n        'The rule results to filter on. When specified, only suites with this result will be returned.'\n      )\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposGetOrgRuleSuitesParams = z.infer<\n    typeof ReposGetOrgRuleSuitesParamsSchema\n  >\n\n  export const ReposGetOrgRuleSuitesResponseSchema = RuleSuitesSchema\n  export type ReposGetOrgRuleSuitesResponse = z.infer<\n    typeof ReposGetOrgRuleSuitesResponseSchema\n  >\n\n  export const ReposGetOrgRuleSuiteParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    rule_suite_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the rule suite result.\\nTo get this ID, you can use [GET /repos/{owner}/{repo}/rulesets/rule-suites](https://docs.github.com/rest/repos/rule-suites#list-repository-rule-suites)\\nfor repositories and [GET /orgs/{org}/rulesets/rule-suites](https://docs.github.com/rest/orgs/rule-suites#list-organization-rule-suites)\\nfor organizations.'\n      )\n  })\n  export type ReposGetOrgRuleSuiteParams = z.infer<\n    typeof ReposGetOrgRuleSuiteParamsSchema\n  >\n\n  export const ReposGetOrgRuleSuiteResponseSchema = RuleSuiteSchema\n  export type ReposGetOrgRuleSuiteResponse = z.infer<\n    typeof ReposGetOrgRuleSuiteResponseSchema\n  >\n\n  export const ReposGetOrgRulesetParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.')\n  })\n  export type ReposGetOrgRulesetParams = z.infer<\n    typeof ReposGetOrgRulesetParamsSchema\n  >\n\n  export const ReposGetOrgRulesetResponseSchema = RepositoryRulesetSchema\n  export type ReposGetOrgRulesetResponse = z.infer<\n    typeof ReposGetOrgRulesetResponseSchema\n  >\n\n  export const ReposUpdateOrgRulesetParamsSchema = z.object({\n    name: z.string().describe('The name of the ruleset.').optional(),\n    target: z\n      .enum(['branch', 'tag', 'push', 'repository'])\n      .describe('The target of the ruleset')\n      .optional(),\n    enforcement: RepositoryRuleEnforcementSchema.optional(),\n    bypass_actors: z\n      .array(RepositoryRulesetBypassActorSchema)\n      .describe('The actors that can bypass the rules in this ruleset')\n      .optional(),\n    conditions: OrgRulesetConditionsSchema.optional(),\n    rules: z\n      .array(RepositoryRuleSchema)\n      .describe('An array of rules within the ruleset.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.')\n  })\n  export type ReposUpdateOrgRulesetParams = z.infer<\n    typeof ReposUpdateOrgRulesetParamsSchema\n  >\n\n  export const ReposUpdateOrgRulesetResponseSchema = RepositoryRulesetSchema\n  export type ReposUpdateOrgRulesetResponse = z.infer<\n    typeof ReposUpdateOrgRulesetResponseSchema\n  >\n\n  export const ReposDeleteOrgRulesetParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.')\n  })\n  export type ReposDeleteOrgRulesetParams = z.infer<\n    typeof ReposDeleteOrgRulesetParamsSchema\n  >\n\n  export type ReposDeleteOrgRulesetResponse = undefined\n\n  export const OrgsGetOrgRulesetHistoryParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsGetOrgRulesetHistoryParams = z.infer<\n    typeof OrgsGetOrgRulesetHistoryParamsSchema\n  >\n\n  export const OrgsGetOrgRulesetHistoryResponseSchema =\n    z.array(RulesetVersionSchema)\n  export type OrgsGetOrgRulesetHistoryResponse = z.infer<\n    typeof OrgsGetOrgRulesetHistoryResponseSchema\n  >\n\n  export const OrgsGetOrgRulesetVersionParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.'),\n    version_id: z.number().int().describe('The ID of the version')\n  })\n  export type OrgsGetOrgRulesetVersionParams = z.infer<\n    typeof OrgsGetOrgRulesetVersionParamsSchema\n  >\n\n  export const OrgsGetOrgRulesetVersionResponseSchema =\n    RulesetVersionWithStateSchema\n  export type OrgsGetOrgRulesetVersionResponse = z.infer<\n    typeof OrgsGetOrgRulesetVersionResponseSchema\n  >\n\n  export const SecretScanningListAlertsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    state: z\n      .enum(['open', 'resolved'])\n      .describe(\n        'Set to `open` or `resolved` to only list secret scanning alerts in a specific state.'\n      )\n      .optional(),\n    secret_type: z\n      .string()\n      .describe(\n        'A comma-separated list of secret types to return. All default secret patterns are returned. To return generic patterns, pass the token name(s) in the parameter. See \"[Supported secret scanning patterns](https://docs.github.com/enterprise-cloud@latest/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets)\" for a complete list of secret types.'\n      )\n      .optional(),\n    resolution: z\n      .string()\n      .describe(\n        'A comma-separated list of resolutions. Only secret scanning alerts with one of these resolutions are listed. Valid resolutions are `false_positive`, `wont_fix`, `revoked`, `pattern_edited`, `pattern_deleted` or `used_in_tests`.'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe(\n        'The property to sort the results by. `created` means when the alert was created. `updated` means when the alert was updated or resolved.'\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for events before this cursor. To receive an initial cursor on your first request, include an empty \"before\" query string.'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for events after this cursor.  To receive an initial cursor on your first request, include an empty \"after\" query string.'\n      )\n      .optional(),\n    validity: z\n      .string()\n      .describe(\n        'A comma-separated list of validities that, when present, will return alerts that match the validities in this list. Valid options are `active`, `inactive`, and `unknown`.'\n      )\n      .optional(),\n    is_publicly_leaked: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not to filter alerts by the publicly-leaked tag being present.'\n      )\n      .default(false),\n    is_multi_repo: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not to filter alerts by the multi-repo tag being present.'\n      )\n      .default(false)\n  })\n  export type SecretScanningListAlertsForOrgParams = z.infer<\n    typeof SecretScanningListAlertsForOrgParamsSchema\n  >\n\n  export const SecretScanningListAlertsForOrgResponseSchema = z.array(\n    OrganizationSecretScanningAlertSchema\n  )\n  export type SecretScanningListAlertsForOrgResponse = z.infer<\n    typeof SecretScanningListAlertsForOrgResponseSchema\n  >\n\n  export const SecurityAdvisoriesListOrgRepositoryAdvisoriesParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      direction: z\n        .enum(['asc', 'desc'])\n        .describe('The direction to sort the results by.')\n        .default('desc'),\n      sort: z\n        .enum(['created', 'updated', 'published'])\n        .describe('The property to sort the results by.')\n        .default('created'),\n      before: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      after: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      per_page: z\n        .number()\n        .int()\n        .gte(1)\n        .lte(100)\n        .describe(\n          'The number of advisories to return per page. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      state: z\n        .enum(['triage', 'draft', 'published', 'closed'])\n        .describe(\n          'Filter by the state of the repository advisories. Only advisories of this state will be returned.'\n        )\n        .optional()\n    })\n  export type SecurityAdvisoriesListOrgRepositoryAdvisoriesParams = z.infer<\n    typeof SecurityAdvisoriesListOrgRepositoryAdvisoriesParamsSchema\n  >\n\n  export const SecurityAdvisoriesListOrgRepositoryAdvisoriesResponseSchema =\n    z.array(RepositoryAdvisorySchema)\n  export type SecurityAdvisoriesListOrgRepositoryAdvisoriesResponse = z.infer<\n    typeof SecurityAdvisoriesListOrgRepositoryAdvisoriesResponseSchema\n  >\n\n  export const OrgsListSecurityManagerTeamsParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsListSecurityManagerTeamsParams = z.infer<\n    typeof OrgsListSecurityManagerTeamsParamsSchema\n  >\n\n  export const OrgsListSecurityManagerTeamsResponseSchema =\n    z.array(TeamSimpleSchema)\n  export type OrgsListSecurityManagerTeamsResponse = z.infer<\n    typeof OrgsListSecurityManagerTeamsResponseSchema\n  >\n\n  export const OrgsAddSecurityManagerTeamParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.')\n  })\n  export type OrgsAddSecurityManagerTeamParams = z.infer<\n    typeof OrgsAddSecurityManagerTeamParamsSchema\n  >\n\n  export type OrgsAddSecurityManagerTeamResponse = undefined\n\n  export const OrgsRemoveSecurityManagerTeamParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.')\n  })\n  export type OrgsRemoveSecurityManagerTeamParams = z.infer<\n    typeof OrgsRemoveSecurityManagerTeamParamsSchema\n  >\n\n  export type OrgsRemoveSecurityManagerTeamResponse = undefined\n\n  export const BillingGetGithubActionsBillingOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type BillingGetGithubActionsBillingOrgParams = z.infer<\n    typeof BillingGetGithubActionsBillingOrgParamsSchema\n  >\n\n  export const BillingGetGithubActionsBillingOrgResponseSchema =\n    ActionsBillingUsageSchema\n  export type BillingGetGithubActionsBillingOrgResponse = z.infer<\n    typeof BillingGetGithubActionsBillingOrgResponseSchema\n  >\n\n  export const BillingGetGithubPackagesBillingOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type BillingGetGithubPackagesBillingOrgParams = z.infer<\n    typeof BillingGetGithubPackagesBillingOrgParamsSchema\n  >\n\n  export const BillingGetGithubPackagesBillingOrgResponseSchema =\n    PackagesBillingUsageSchema\n  export type BillingGetGithubPackagesBillingOrgResponse = z.infer<\n    typeof BillingGetGithubPackagesBillingOrgResponseSchema\n  >\n\n  export const BillingGetSharedStorageBillingOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type BillingGetSharedStorageBillingOrgParams = z.infer<\n    typeof BillingGetSharedStorageBillingOrgParamsSchema\n  >\n\n  export const BillingGetSharedStorageBillingOrgResponseSchema =\n    CombinedBillingUsageSchema\n  export type BillingGetSharedStorageBillingOrgResponse = z.infer<\n    typeof BillingGetSharedStorageBillingOrgResponseSchema\n  >\n\n  export const HostedComputeListNetworkConfigurationsForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type HostedComputeListNetworkConfigurationsForOrgParams = z.infer<\n    typeof HostedComputeListNetworkConfigurationsForOrgParamsSchema\n  >\n\n  export const HostedComputeListNetworkConfigurationsForOrgResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      network_configurations: z.array(NetworkConfigurationSchema)\n    })\n  export type HostedComputeListNetworkConfigurationsForOrgResponse = z.infer<\n    typeof HostedComputeListNetworkConfigurationsForOrgResponseSchema\n  >\n\n  export const HostedComputeCreateNetworkConfigurationForOrgParamsSchema =\n    z.object({\n      name: z\n        .string()\n        .describe(\n          \"Name of the network configuration. Must be between 1 and 100 characters and may only contain upper and lowercase letters a-z, numbers 0-9, '.', '-', and '_'.\"\n        ),\n      compute_service: z\n        .enum(['none', 'actions'])\n        .describe(\n          'The hosted compute service to use for the network configuration.'\n        )\n        .optional(),\n      network_settings_ids: z\n        .array(z.string())\n        .min(1)\n        .max(1)\n        .describe(\n          'The identifier of the network settings to use for the network configuration. Exactly one network settings must be specified.'\n        ),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.')\n    })\n  export type HostedComputeCreateNetworkConfigurationForOrgParams = z.infer<\n    typeof HostedComputeCreateNetworkConfigurationForOrgParamsSchema\n  >\n\n  export type HostedComputeCreateNetworkConfigurationForOrgResponse = undefined\n\n  export const HostedComputeGetNetworkConfigurationForOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      network_configuration_id: z\n        .string()\n        .describe(\n          'Unique identifier of the hosted compute network configuration.'\n        )\n    })\n  export type HostedComputeGetNetworkConfigurationForOrgParams = z.infer<\n    typeof HostedComputeGetNetworkConfigurationForOrgParamsSchema\n  >\n\n  export const HostedComputeGetNetworkConfigurationForOrgResponseSchema =\n    NetworkConfigurationSchema\n  export type HostedComputeGetNetworkConfigurationForOrgResponse = z.infer<\n    typeof HostedComputeGetNetworkConfigurationForOrgResponseSchema\n  >\n\n  export const HostedComputeDeleteNetworkConfigurationFromOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      network_configuration_id: z\n        .string()\n        .describe(\n          'Unique identifier of the hosted compute network configuration.'\n        )\n    })\n  export type HostedComputeDeleteNetworkConfigurationFromOrgParams = z.infer<\n    typeof HostedComputeDeleteNetworkConfigurationFromOrgParamsSchema\n  >\n\n  export type HostedComputeDeleteNetworkConfigurationFromOrgResponse = undefined\n\n  export const HostedComputeUpdateNetworkConfigurationForOrgParamsSchema =\n    z.object({\n      name: z\n        .string()\n        .describe(\n          \"Name of the network configuration. Must be between 1 and 100 characters and may only contain upper and lowercase letters a-z, numbers 0-9, '.', '-', and '_'.\"\n        )\n        .optional(),\n      compute_service: z\n        .enum(['none', 'actions'])\n        .describe(\n          'The hosted compute service to use for the network configuration.'\n        )\n        .optional(),\n      network_settings_ids: z\n        .array(z.string())\n        .min(0)\n        .max(1)\n        .describe(\n          'The identifier of the network settings to use for the network configuration. Exactly one network settings must be specified.'\n        )\n        .optional(),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      network_configuration_id: z\n        .string()\n        .describe(\n          'Unique identifier of the hosted compute network configuration.'\n        )\n    })\n  export type HostedComputeUpdateNetworkConfigurationForOrgParams = z.infer<\n    typeof HostedComputeUpdateNetworkConfigurationForOrgParamsSchema\n  >\n\n  export const HostedComputeUpdateNetworkConfigurationForOrgResponseSchema =\n    NetworkConfigurationSchema\n  export type HostedComputeUpdateNetworkConfigurationForOrgResponse = z.infer<\n    typeof HostedComputeUpdateNetworkConfigurationForOrgResponseSchema\n  >\n\n  export const HostedComputeGetNetworkSettingsForOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    network_settings_id: z\n      .string()\n      .describe('Unique identifier of the hosted compute network settings.')\n  })\n  export type HostedComputeGetNetworkSettingsForOrgParams = z.infer<\n    typeof HostedComputeGetNetworkSettingsForOrgParamsSchema\n  >\n\n  export const HostedComputeGetNetworkSettingsForOrgResponseSchema =\n    NetworkSettingsSchema\n  export type HostedComputeGetNetworkSettingsForOrgResponse = z.infer<\n    typeof HostedComputeGetNetworkSettingsForOrgResponseSchema\n  >\n\n  export const CopilotCopilotMetricsForTeamParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    since: z\n      .string()\n      .describe(\n        'Show usage metrics since this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`). Maximum value is 28 days ago.'\n      )\n      .optional(),\n    until: z\n      .string()\n      .describe(\n        'Show usage metrics until this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`) and should not preceed the `since` date if it is passed.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of days of metrics to display per page (max 28). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(28)\n  })\n  export type CopilotCopilotMetricsForTeamParams = z.infer<\n    typeof CopilotCopilotMetricsForTeamParamsSchema\n  >\n\n  export const CopilotCopilotMetricsForTeamResponseSchema = z.array(\n    CopilotUsageMetricsDaySchema\n  )\n  export type CopilotCopilotMetricsForTeamResponse = z.infer<\n    typeof CopilotCopilotMetricsForTeamResponseSchema\n  >\n\n  export const CopilotUsageMetricsForTeamParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    since: z\n      .string()\n      .describe(\n        'Show usage metrics since this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`). Maximum value is 28 days ago.'\n      )\n      .optional(),\n    until: z\n      .string()\n      .describe(\n        'Show usage metrics until this date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:MM:SSZ`) and should not preceed the `since` date if it is passed.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of days of metrics to display per page (max 28). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(28)\n  })\n  export type CopilotUsageMetricsForTeamParams = z.infer<\n    typeof CopilotUsageMetricsForTeamParamsSchema\n  >\n\n  export const CopilotUsageMetricsForTeamResponseSchema = z.array(\n    CopilotUsageMetricsSchema\n  )\n  export type CopilotUsageMetricsForTeamResponse = z.infer<\n    typeof CopilotUsageMetricsForTeamResponseSchema\n  >\n\n  export const TeamsListParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListParams = z.infer<typeof TeamsListParamsSchema>\n\n  export const TeamsListResponseSchema = z.array(TeamSchema)\n  export type TeamsListResponse = z.infer<typeof TeamsListResponseSchema>\n\n  export const TeamsCreateParamsSchema = z.object({\n    name: z.string().describe('The name of the team.'),\n    description: z.string().describe('The description of the team.').optional(),\n    maintainers: z\n      .array(z.string())\n      .describe(\n        'List GitHub IDs for organization members who will become team maintainers.'\n      )\n      .optional(),\n    repo_names: z\n      .array(z.string())\n      .describe(\n        'The full name (e.g., \"organization-name/repository-name\") of repositories to add the team to.'\n      )\n      .optional(),\n    privacy: z\n      .enum(['secret', 'closed'])\n      .describe(\n        'The level of privacy this team should have. The options are:  \\n**For a non-nested team:**  \\n * `secret` - only visible to organization owners and members of this team.  \\n * `closed` - visible to all members of this organization.  \\nDefault: `secret`  \\n**For a parent or child team:**  \\n * `closed` - visible to all members of this organization.  \\nDefault for child team: `closed`'\n      )\n      .optional(),\n    notification_setting: z\n      .enum(['notifications_enabled', 'notifications_disabled'])\n      .describe(\n        'The notification setting the team has chosen. The options are:  \\n * `notifications_enabled` - team members receive notifications when the team is @mentioned.  \\n * `notifications_disabled` - no one receives notifications.  \\nDefault: `notifications_enabled`'\n      )\n      .optional(),\n    permission: z\n      .enum(['pull', 'push'])\n      .describe(\n        '**Closing down notice**. The permission that new repositories will be added to the team with when none is specified.'\n      )\n      .default('pull'),\n    parent_team_id: z\n      .number()\n      .int()\n      .describe('The ID of a team to set as the parent team.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type TeamsCreateParams = z.infer<typeof TeamsCreateParamsSchema>\n\n  export type TeamsCreateResponse = undefined\n\n  export const TeamsGetByNameParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.')\n  })\n  export type TeamsGetByNameParams = z.infer<typeof TeamsGetByNameParamsSchema>\n\n  export const TeamsGetByNameResponseSchema = TeamFullSchema\n  export type TeamsGetByNameResponse = z.infer<\n    typeof TeamsGetByNameResponseSchema\n  >\n\n  export const TeamsDeleteInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.')\n  })\n  export type TeamsDeleteInOrgParams = z.infer<\n    typeof TeamsDeleteInOrgParamsSchema\n  >\n\n  export type TeamsDeleteInOrgResponse = undefined\n\n  export const TeamsUpdateInOrgParamsSchema = z.object({\n    name: z.string().describe('The name of the team.').optional(),\n    description: z.string().describe('The description of the team.').optional(),\n    privacy: z\n      .enum(['secret', 'closed'])\n      .describe(\n        'The level of privacy this team should have. Editing teams without specifying this parameter leaves `privacy` intact. When a team is nested, the `privacy` for parent teams cannot be `secret`. The options are:  \\n**For a non-nested team:**  \\n * `secret` - only visible to organization owners and members of this team.  \\n * `closed` - visible to all members of this organization.  \\n**For a parent or child team:**  \\n * `closed` - visible to all members of this organization.'\n      )\n      .optional(),\n    notification_setting: z\n      .enum(['notifications_enabled', 'notifications_disabled'])\n      .describe(\n        'The notification setting the team has chosen. Editing teams without specifying this parameter leaves `notification_setting` intact. The options are: \\n * `notifications_enabled` - team members receive notifications when the team is @mentioned.  \\n * `notifications_disabled` - no one receives notifications.'\n      )\n      .optional(),\n    permission: z\n      .enum(['pull', 'push', 'admin'])\n      .describe(\n        '**Closing down notice**. The permission that new repositories will be added to the team with when none is specified.'\n      )\n      .default('pull'),\n    parent_team_id: z\n      .number()\n      .int()\n      .describe('The ID of a team to set as the parent team.')\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.')\n  })\n  export type TeamsUpdateInOrgParams = z.infer<\n    typeof TeamsUpdateInOrgParamsSchema\n  >\n\n  export const TeamsUpdateInOrgResponseSchema = TeamFullSchema\n  export type TeamsUpdateInOrgResponse = z.infer<\n    typeof TeamsUpdateInOrgResponseSchema\n  >\n\n  export const TeamsListDiscussionsInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    pinned: z.string().describe('Pinned discussions only filter').optional()\n  })\n  export type TeamsListDiscussionsInOrgParams = z.infer<\n    typeof TeamsListDiscussionsInOrgParamsSchema\n  >\n\n  export const TeamsListDiscussionsInOrgResponseSchema =\n    z.array(TeamDiscussionSchema)\n  export type TeamsListDiscussionsInOrgResponse = z.infer<\n    typeof TeamsListDiscussionsInOrgResponseSchema\n  >\n\n  export const TeamsCreateDiscussionInOrgParamsSchema = z.object({\n    title: z.string().describe(\"The discussion post's title.\"),\n    body: z.string().describe(\"The discussion post's body text.\"),\n    private: z\n      .boolean()\n      .describe(\n        'Private posts are only visible to team members, organization owners, and team maintainers. Public posts are visible to all members of the organization. Set to `true` to create a private post.'\n      )\n      .default(false),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.')\n  })\n  export type TeamsCreateDiscussionInOrgParams = z.infer<\n    typeof TeamsCreateDiscussionInOrgParamsSchema\n  >\n\n  export type TeamsCreateDiscussionInOrgResponse = undefined\n\n  export const TeamsGetDiscussionInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsGetDiscussionInOrgParams = z.infer<\n    typeof TeamsGetDiscussionInOrgParamsSchema\n  >\n\n  export const TeamsGetDiscussionInOrgResponseSchema = TeamDiscussionSchema\n  export type TeamsGetDiscussionInOrgResponse = z.infer<\n    typeof TeamsGetDiscussionInOrgResponseSchema\n  >\n\n  export const TeamsDeleteDiscussionInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsDeleteDiscussionInOrgParams = z.infer<\n    typeof TeamsDeleteDiscussionInOrgParamsSchema\n  >\n\n  export type TeamsDeleteDiscussionInOrgResponse = undefined\n\n  export const TeamsUpdateDiscussionInOrgParamsSchema = z.object({\n    title: z.string().describe(\"The discussion post's title.\").optional(),\n    body: z.string().describe(\"The discussion post's body text.\").optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsUpdateDiscussionInOrgParams = z.infer<\n    typeof TeamsUpdateDiscussionInOrgParamsSchema\n  >\n\n  export const TeamsUpdateDiscussionInOrgResponseSchema = TeamDiscussionSchema\n  export type TeamsUpdateDiscussionInOrgResponse = z.infer<\n    typeof TeamsUpdateDiscussionInOrgResponseSchema\n  >\n\n  export const TeamsListDiscussionCommentsInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListDiscussionCommentsInOrgParams = z.infer<\n    typeof TeamsListDiscussionCommentsInOrgParamsSchema\n  >\n\n  export const TeamsListDiscussionCommentsInOrgResponseSchema = z.array(\n    TeamDiscussionCommentSchema\n  )\n  export type TeamsListDiscussionCommentsInOrgResponse = z.infer<\n    typeof TeamsListDiscussionCommentsInOrgResponseSchema\n  >\n\n  export const TeamsCreateDiscussionCommentInOrgParamsSchema = z.object({\n    body: z.string().describe(\"The discussion comment's body text.\"),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsCreateDiscussionCommentInOrgParams = z.infer<\n    typeof TeamsCreateDiscussionCommentInOrgParamsSchema\n  >\n\n  export type TeamsCreateDiscussionCommentInOrgResponse = undefined\n\n  export const TeamsGetDiscussionCommentInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    comment_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the comment.')\n  })\n  export type TeamsGetDiscussionCommentInOrgParams = z.infer<\n    typeof TeamsGetDiscussionCommentInOrgParamsSchema\n  >\n\n  export const TeamsGetDiscussionCommentInOrgResponseSchema =\n    TeamDiscussionCommentSchema\n  export type TeamsGetDiscussionCommentInOrgResponse = z.infer<\n    typeof TeamsGetDiscussionCommentInOrgResponseSchema\n  >\n\n  export const TeamsDeleteDiscussionCommentInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    comment_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the comment.')\n  })\n  export type TeamsDeleteDiscussionCommentInOrgParams = z.infer<\n    typeof TeamsDeleteDiscussionCommentInOrgParamsSchema\n  >\n\n  export type TeamsDeleteDiscussionCommentInOrgResponse = undefined\n\n  export const TeamsUpdateDiscussionCommentInOrgParamsSchema = z.object({\n    body: z.string().describe(\"The discussion comment's body text.\"),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    comment_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the comment.')\n  })\n  export type TeamsUpdateDiscussionCommentInOrgParams = z.infer<\n    typeof TeamsUpdateDiscussionCommentInOrgParamsSchema\n  >\n\n  export const TeamsUpdateDiscussionCommentInOrgResponseSchema =\n    TeamDiscussionCommentSchema\n  export type TeamsUpdateDiscussionCommentInOrgResponse = z.infer<\n    typeof TeamsUpdateDiscussionCommentInOrgResponseSchema\n  >\n\n  export const ReactionsListForTeamDiscussionCommentInOrgParamsSchema =\n    z.object({\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      team_slug: z.string().describe('The slug of the team name.'),\n      discussion_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the discussion.'),\n      comment_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the comment.'),\n      content: z\n        .enum([\n          '+1',\n          '-1',\n          'laugh',\n          'confused',\n          'heart',\n          'hooray',\n          'rocket',\n          'eyes'\n        ])\n        .describe(\n          'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to a team discussion comment.'\n        )\n        .optional(),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type ReactionsListForTeamDiscussionCommentInOrgParams = z.infer<\n    typeof ReactionsListForTeamDiscussionCommentInOrgParamsSchema\n  >\n\n  export const ReactionsListForTeamDiscussionCommentInOrgResponseSchema =\n    z.array(ReactionSchema)\n  export type ReactionsListForTeamDiscussionCommentInOrgResponse = z.infer<\n    typeof ReactionsListForTeamDiscussionCommentInOrgResponseSchema\n  >\n\n  export const ReactionsCreateForTeamDiscussionCommentInOrgParamsSchema =\n    z.object({\n      content: z\n        .enum([\n          '+1',\n          '-1',\n          'laugh',\n          'confused',\n          'heart',\n          'hooray',\n          'rocket',\n          'eyes'\n        ])\n        .describe(\n          'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the team discussion comment.'\n        ),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      team_slug: z.string().describe('The slug of the team name.'),\n      discussion_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the discussion.'),\n      comment_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the comment.')\n    })\n  export type ReactionsCreateForTeamDiscussionCommentInOrgParams = z.infer<\n    typeof ReactionsCreateForTeamDiscussionCommentInOrgParamsSchema\n  >\n\n  export const ReactionsCreateForTeamDiscussionCommentInOrgResponseSchema =\n    ReactionSchema\n  export type ReactionsCreateForTeamDiscussionCommentInOrgResponse = z.infer<\n    typeof ReactionsCreateForTeamDiscussionCommentInOrgResponseSchema\n  >\n\n  export const ReactionsDeleteForTeamDiscussionCommentParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    comment_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the comment.'),\n    reaction_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the reaction.')\n  })\n  export type ReactionsDeleteForTeamDiscussionCommentParams = z.infer<\n    typeof ReactionsDeleteForTeamDiscussionCommentParamsSchema\n  >\n\n  export type ReactionsDeleteForTeamDiscussionCommentResponse = undefined\n\n  export const ReactionsListForTeamDiscussionInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to a team discussion.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReactionsListForTeamDiscussionInOrgParams = z.infer<\n    typeof ReactionsListForTeamDiscussionInOrgParamsSchema\n  >\n\n  export const ReactionsListForTeamDiscussionInOrgResponseSchema =\n    z.array(ReactionSchema)\n  export type ReactionsListForTeamDiscussionInOrgResponse = z.infer<\n    typeof ReactionsListForTeamDiscussionInOrgResponseSchema\n  >\n\n  export const ReactionsCreateForTeamDiscussionInOrgParamsSchema = z.object({\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the team discussion.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type ReactionsCreateForTeamDiscussionInOrgParams = z.infer<\n    typeof ReactionsCreateForTeamDiscussionInOrgParamsSchema\n  >\n\n  export const ReactionsCreateForTeamDiscussionInOrgResponseSchema =\n    ReactionSchema\n  export type ReactionsCreateForTeamDiscussionInOrgResponse = z.infer<\n    typeof ReactionsCreateForTeamDiscussionInOrgResponseSchema\n  >\n\n  export const ReactionsDeleteForTeamDiscussionParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    reaction_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the reaction.')\n  })\n  export type ReactionsDeleteForTeamDiscussionParams = z.infer<\n    typeof ReactionsDeleteForTeamDiscussionParamsSchema\n  >\n\n  export type ReactionsDeleteForTeamDiscussionResponse = undefined\n\n  export const TeamsListPendingInvitationsInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListPendingInvitationsInOrgParams = z.infer<\n    typeof TeamsListPendingInvitationsInOrgParamsSchema\n  >\n\n  export const TeamsListPendingInvitationsInOrgResponseSchema = z.array(\n    OrganizationInvitationSchema\n  )\n  export type TeamsListPendingInvitationsInOrgResponse = z.infer<\n    typeof TeamsListPendingInvitationsInOrgResponseSchema\n  >\n\n  export const TeamsListMembersInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    role: z\n      .enum(['member', 'maintainer', 'all'])\n      .describe('Filters members returned by their role in the team.')\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListMembersInOrgParams = z.infer<\n    typeof TeamsListMembersInOrgParamsSchema\n  >\n\n  export const TeamsListMembersInOrgResponseSchema = z.array(SimpleUserSchema)\n  export type TeamsListMembersInOrgResponse = z.infer<\n    typeof TeamsListMembersInOrgResponseSchema\n  >\n\n  export const TeamsGetMembershipForUserInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsGetMembershipForUserInOrgParams = z.infer<\n    typeof TeamsGetMembershipForUserInOrgParamsSchema\n  >\n\n  export const TeamsGetMembershipForUserInOrgResponseSchema =\n    TeamMembershipSchema\n  export type TeamsGetMembershipForUserInOrgResponse = z.infer<\n    typeof TeamsGetMembershipForUserInOrgResponseSchema\n  >\n\n  export const TeamsAddOrUpdateMembershipForUserInOrgParamsSchema = z.object({\n    role: z\n      .enum(['member', 'maintainer'])\n      .describe('The role that this user should have in the team.')\n      .default('member'),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsAddOrUpdateMembershipForUserInOrgParams = z.infer<\n    typeof TeamsAddOrUpdateMembershipForUserInOrgParamsSchema\n  >\n\n  export const TeamsAddOrUpdateMembershipForUserInOrgResponseSchema =\n    TeamMembershipSchema\n  export type TeamsAddOrUpdateMembershipForUserInOrgResponse = z.infer<\n    typeof TeamsAddOrUpdateMembershipForUserInOrgResponseSchema\n  >\n\n  export const TeamsRemoveMembershipForUserInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsRemoveMembershipForUserInOrgParams = z.infer<\n    typeof TeamsRemoveMembershipForUserInOrgParamsSchema\n  >\n\n  export type TeamsRemoveMembershipForUserInOrgResponse = undefined\n\n  export const TeamsListProjectsInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListProjectsInOrgParams = z.infer<\n    typeof TeamsListProjectsInOrgParamsSchema\n  >\n\n  export const TeamsListProjectsInOrgResponseSchema = z.array(TeamProjectSchema)\n  export type TeamsListProjectsInOrgResponse = z.infer<\n    typeof TeamsListProjectsInOrgResponseSchema\n  >\n\n  export const TeamsCheckPermissionsForProjectInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type TeamsCheckPermissionsForProjectInOrgParams = z.infer<\n    typeof TeamsCheckPermissionsForProjectInOrgParamsSchema\n  >\n\n  export const TeamsCheckPermissionsForProjectInOrgResponseSchema =\n    TeamProjectSchema\n  export type TeamsCheckPermissionsForProjectInOrgResponse = z.infer<\n    typeof TeamsCheckPermissionsForProjectInOrgResponseSchema\n  >\n\n  export const TeamsAddOrUpdateProjectPermissionsInOrgParamsSchema = z.object({\n    permission: z\n      .enum(['read', 'write', 'admin'])\n      .describe(\n        'The permission to grant to the team for this project. Default: the team\\'s `permission` attribute will be used to determine what permission to grant the team on this project. Note that, if you choose not to pass any parameters, you\\'ll need to set `Content-Length` to zero when calling this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"'\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type TeamsAddOrUpdateProjectPermissionsInOrgParams = z.infer<\n    typeof TeamsAddOrUpdateProjectPermissionsInOrgParamsSchema\n  >\n\n  export type TeamsAddOrUpdateProjectPermissionsInOrgResponse = undefined\n\n  export const TeamsRemoveProjectInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type TeamsRemoveProjectInOrgParams = z.infer<\n    typeof TeamsRemoveProjectInOrgParamsSchema\n  >\n\n  export type TeamsRemoveProjectInOrgResponse = undefined\n\n  export const TeamsListReposInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListReposInOrgParams = z.infer<\n    typeof TeamsListReposInOrgParamsSchema\n  >\n\n  export const TeamsListReposInOrgResponseSchema = z.array(\n    MinimalRepositorySchema\n  )\n  export type TeamsListReposInOrgResponse = z.infer<\n    typeof TeamsListReposInOrgResponseSchema\n  >\n\n  export const TeamsCheckPermissionsForRepoInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type TeamsCheckPermissionsForRepoInOrgParams = z.infer<\n    typeof TeamsCheckPermissionsForRepoInOrgParamsSchema\n  >\n\n  export const TeamsCheckPermissionsForRepoInOrgResponseSchema =\n    TeamRepositorySchema\n  export type TeamsCheckPermissionsForRepoInOrgResponse = z.infer<\n    typeof TeamsCheckPermissionsForRepoInOrgResponseSchema\n  >\n\n  export const TeamsAddOrUpdateRepoPermissionsInOrgParamsSchema = z.object({\n    permission: z\n      .string()\n      .describe(\n        \"The permission to grant the team on this repository. We accept the following permissions to be set: `pull`, `triage`, `push`, `maintain`, `admin` and you can also specify a custom repository role name, if the owning organization has defined any. If no permission is specified, the team's `permission` attribute will be used to determine what permission to grant the team on this repository.\"\n      )\n      .optional(),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type TeamsAddOrUpdateRepoPermissionsInOrgParams = z.infer<\n    typeof TeamsAddOrUpdateRepoPermissionsInOrgParamsSchema\n  >\n\n  export type TeamsAddOrUpdateRepoPermissionsInOrgResponse = undefined\n\n  export const TeamsRemoveRepoInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type TeamsRemoveRepoInOrgParams = z.infer<\n    typeof TeamsRemoveRepoInOrgParamsSchema\n  >\n\n  export type TeamsRemoveRepoInOrgResponse = undefined\n\n  export const TeamsListChildInOrgParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.'),\n    team_slug: z.string().describe('The slug of the team name.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListChildInOrgParams = z.infer<\n    typeof TeamsListChildInOrgParamsSchema\n  >\n\n  export const TeamsListChildInOrgResponseSchema = z.array(TeamSchema)\n  export type TeamsListChildInOrgResponse = z.infer<\n    typeof TeamsListChildInOrgResponseSchema\n  >\n\n  export const OrgsEnableOrDisableSecurityProductOnAllOrgReposParamsSchema =\n    z.object({\n      query_suite: z\n        .enum(['default', 'extended'])\n        .describe(\n          \"CodeQL query suite to be used. If you specify the `query_suite` parameter, the default setup will be configured with this query suite only on all repositories that didn't have default setup already configured. It will not change the query suite on repositories that already have default setup configured.\\nIf you don't specify any `query_suite` in your request, the preferred query suite of the organization will be applied.\"\n        )\n        .optional(),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      security_product: z\n        .enum([\n          'dependency_graph',\n          'dependabot_alerts',\n          'dependabot_security_updates',\n          'advanced_security',\n          'code_scanning_default_setup',\n          'secret_scanning',\n          'secret_scanning_push_protection'\n        ])\n        .describe('The security feature to enable or disable.'),\n      enablement: z\n        .enum(['enable_all', 'disable_all'])\n        .describe(\n          'The action to take.\\n\\n`enable_all` means to enable the specified security feature for all repositories in the organization.\\n`disable_all` means to disable the specified security feature for all repositories in the organization.'\n        )\n    })\n  export type OrgsEnableOrDisableSecurityProductOnAllOrgReposParams = z.infer<\n    typeof OrgsEnableOrDisableSecurityProductOnAllOrgReposParamsSchema\n  >\n\n  export type OrgsEnableOrDisableSecurityProductOnAllOrgReposResponse =\n    undefined\n\n  export const ProjectsGetCardParamsSchema = z.object({\n    card_id: z.number().int().describe('The unique identifier of the card.')\n  })\n  export type ProjectsGetCardParams = z.infer<\n    typeof ProjectsGetCardParamsSchema\n  >\n\n  export const ProjectsGetCardResponseSchema = ProjectCardSchema\n  export type ProjectsGetCardResponse = z.infer<\n    typeof ProjectsGetCardResponseSchema\n  >\n\n  export const ProjectsDeleteCardParamsSchema = z.object({\n    card_id: z.number().int().describe('The unique identifier of the card.')\n  })\n  export type ProjectsDeleteCardParams = z.infer<\n    typeof ProjectsDeleteCardParamsSchema\n  >\n\n  export type ProjectsDeleteCardResponse = undefined\n\n  export const ProjectsUpdateCardParamsSchema = z.object({\n    note: z.string().describe(\"The project card's note\").optional(),\n    archived: z\n      .boolean()\n      .describe('Whether or not the card is archived')\n      .optional(),\n    card_id: z.number().int().describe('The unique identifier of the card.')\n  })\n  export type ProjectsUpdateCardParams = z.infer<\n    typeof ProjectsUpdateCardParamsSchema\n  >\n\n  export const ProjectsUpdateCardResponseSchema = ProjectCardSchema\n  export type ProjectsUpdateCardResponse = z.infer<\n    typeof ProjectsUpdateCardResponseSchema\n  >\n\n  export const ProjectsMoveCardParamsSchema = z.object({\n    position: z\n      .string()\n      .regex(new RegExp('^(?:top|bottom|after:\\\\d+)$'))\n      .describe(\n        'The position of the card in a column. Can be one of: `top`, `bottom`, or `after:<card_id>` to place after the specified card.'\n      ),\n    column_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the column the card should be moved to'\n      )\n      .optional(),\n    card_id: z.number().int().describe('The unique identifier of the card.')\n  })\n  export type ProjectsMoveCardParams = z.infer<\n    typeof ProjectsMoveCardParamsSchema\n  >\n\n  export type ProjectsMoveCardResponse = undefined\n\n  export const ProjectsGetColumnParamsSchema = z.object({\n    column_id: z.number().int().describe('The unique identifier of the column.')\n  })\n  export type ProjectsGetColumnParams = z.infer<\n    typeof ProjectsGetColumnParamsSchema\n  >\n\n  export const ProjectsGetColumnResponseSchema = ProjectColumnSchema\n  export type ProjectsGetColumnResponse = z.infer<\n    typeof ProjectsGetColumnResponseSchema\n  >\n\n  export const ProjectsDeleteColumnParamsSchema = z.object({\n    column_id: z.number().int().describe('The unique identifier of the column.')\n  })\n  export type ProjectsDeleteColumnParams = z.infer<\n    typeof ProjectsDeleteColumnParamsSchema\n  >\n\n  export type ProjectsDeleteColumnResponse = undefined\n\n  export const ProjectsUpdateColumnParamsSchema = z.object({\n    name: z.string().describe('Name of the project column'),\n    column_id: z.number().int().describe('The unique identifier of the column.')\n  })\n  export type ProjectsUpdateColumnParams = z.infer<\n    typeof ProjectsUpdateColumnParamsSchema\n  >\n\n  export const ProjectsUpdateColumnResponseSchema = ProjectColumnSchema\n  export type ProjectsUpdateColumnResponse = z.infer<\n    typeof ProjectsUpdateColumnResponseSchema\n  >\n\n  export const ProjectsListCardsParamsSchema = z.object({\n    column_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the column.'),\n    archived_state: z\n      .enum(['all', 'archived', 'not_archived'])\n      .describe(\n        \"Filters the project cards that are returned by the card's state.\"\n      )\n      .default('not_archived'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ProjectsListCardsParams = z.infer<\n    typeof ProjectsListCardsParamsSchema\n  >\n\n  export const ProjectsListCardsResponseSchema = z.array(ProjectCardSchema)\n  export type ProjectsListCardsResponse = z.infer<\n    typeof ProjectsListCardsResponseSchema\n  >\n\n  export const ProjectsCreateCardParamsSchema = z\n    .object({\n      column_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the column.')\n    })\n    .and(\n      z.union([\n        z.object({ note: z.string().describe(\"The project card's note\") }),\n        z.object({\n          content_id: z\n            .number()\n            .int()\n            .describe(\n              'The unique identifier of the content associated with the card'\n            ),\n          content_type: z\n            .string()\n            .describe('The piece of content associated with the card')\n        })\n      ])\n    )\n  export type ProjectsCreateCardParams = z.infer<\n    typeof ProjectsCreateCardParamsSchema\n  >\n\n  export type ProjectsCreateCardResponse = undefined\n\n  export const ProjectsMoveColumnParamsSchema = z.object({\n    position: z\n      .string()\n      .regex(new RegExp('^(?:first|last|after:\\\\d+)$'))\n      .describe(\n        'The position of the column in a project. Can be one of: `first`, `last`, or `after:<column_id>` to place after the specified column.'\n      ),\n    column_id: z.number().int().describe('The unique identifier of the column.')\n  })\n  export type ProjectsMoveColumnParams = z.infer<\n    typeof ProjectsMoveColumnParamsSchema\n  >\n\n  export type ProjectsMoveColumnResponse = undefined\n\n  export const ProjectsGetParamsSchema = z.object({\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type ProjectsGetParams = z.infer<typeof ProjectsGetParamsSchema>\n\n  export const ProjectsGetResponseSchema = ProjectSchema\n  export type ProjectsGetResponse = z.infer<typeof ProjectsGetResponseSchema>\n\n  export const ProjectsDeleteParamsSchema = z.object({\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type ProjectsDeleteParams = z.infer<typeof ProjectsDeleteParamsSchema>\n\n  export type ProjectsDeleteResponse = undefined\n\n  export const ProjectsUpdateParamsSchema = z.object({\n    name: z.string().describe('Name of the project').optional(),\n    body: z.string().describe('Body of the project').optional(),\n    state: z\n      .string()\n      .describe(\"State of the project; either 'open' or 'closed'\")\n      .optional(),\n    organization_permission: z\n      .enum(['read', 'write', 'admin', 'none'])\n      .describe(\n        'The baseline permission that all organization members have on this project'\n      )\n      .optional(),\n    private: z\n      .boolean()\n      .describe('Whether or not this project can be seen by everyone.')\n      .optional(),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type ProjectsUpdateParams = z.infer<typeof ProjectsUpdateParamsSchema>\n\n  export const ProjectsUpdateResponseSchema = ProjectSchema\n  export type ProjectsUpdateResponse = z.infer<\n    typeof ProjectsUpdateResponseSchema\n  >\n\n  export const ProjectsListCollaboratorsParamsSchema = z.object({\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.'),\n    affiliation: z\n      .enum(['outside', 'direct', 'all'])\n      .describe(\n        \"Filters the collaborators by their affiliation. `outside` means outside collaborators of a project that are not a member of the project's organization. `direct` means collaborators with permissions to a project, regardless of organization membership status. `all` means all collaborators the authenticated user can see.\"\n      )\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ProjectsListCollaboratorsParams = z.infer<\n    typeof ProjectsListCollaboratorsParamsSchema\n  >\n\n  export const ProjectsListCollaboratorsResponseSchema =\n    z.array(SimpleUserSchema)\n  export type ProjectsListCollaboratorsResponse = z.infer<\n    typeof ProjectsListCollaboratorsResponseSchema\n  >\n\n  export const ProjectsAddCollaboratorParamsSchema = z.object({\n    permission: z\n      .enum(['read', 'write', 'admin'])\n      .describe('The permission to grant the collaborator.')\n      .default('write'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type ProjectsAddCollaboratorParams = z.infer<\n    typeof ProjectsAddCollaboratorParamsSchema\n  >\n\n  export type ProjectsAddCollaboratorResponse = undefined\n\n  export const ProjectsRemoveCollaboratorParamsSchema = z.object({\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type ProjectsRemoveCollaboratorParams = z.infer<\n    typeof ProjectsRemoveCollaboratorParamsSchema\n  >\n\n  export type ProjectsRemoveCollaboratorResponse = undefined\n\n  export const ProjectsGetPermissionForUserParamsSchema = z.object({\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type ProjectsGetPermissionForUserParams = z.infer<\n    typeof ProjectsGetPermissionForUserParamsSchema\n  >\n\n  export const ProjectsGetPermissionForUserResponseSchema =\n    ProjectCollaboratorPermissionSchema\n  export type ProjectsGetPermissionForUserResponse = z.infer<\n    typeof ProjectsGetPermissionForUserResponseSchema\n  >\n\n  export const ProjectsListColumnsParamsSchema = z.object({\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ProjectsListColumnsParams = z.infer<\n    typeof ProjectsListColumnsParamsSchema\n  >\n\n  export const ProjectsListColumnsResponseSchema = z.array(ProjectColumnSchema)\n  export type ProjectsListColumnsResponse = z.infer<\n    typeof ProjectsListColumnsResponseSchema\n  >\n\n  export const ProjectsCreateColumnParamsSchema = z.object({\n    name: z.string().describe('Name of the project column'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type ProjectsCreateColumnParams = z.infer<\n    typeof ProjectsCreateColumnParamsSchema\n  >\n\n  export type ProjectsCreateColumnResponse = undefined\n\n  export const RateLimitGetParamsSchema = z.object({})\n  export type RateLimitGetParams = z.infer<typeof RateLimitGetParamsSchema>\n\n  export const RateLimitGetResponseSchema = RateLimitOverviewSchema\n  export type RateLimitGetResponse = z.infer<typeof RateLimitGetResponseSchema>\n\n  export const ReposGetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetParams = z.infer<typeof ReposGetParamsSchema>\n\n  export const ReposGetResponseSchema = FullRepositorySchema\n  export type ReposGetResponse = z.infer<typeof ReposGetResponseSchema>\n\n  export const ReposDeleteParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposDeleteParams = z.infer<typeof ReposDeleteParamsSchema>\n\n  export type ReposDeleteResponse = undefined\n\n  export const ReposUpdateParamsSchema = z.object({\n    name: z.string().describe('The name of the repository.').optional(),\n    description: z\n      .string()\n      .describe('A short description of the repository.')\n      .optional(),\n    homepage: z\n      .string()\n      .describe('A URL with more information about the repository.')\n      .optional(),\n    private: z\n      .boolean()\n      .describe(\n        'Either `true` to make the repository private or `false` to make it public. Default: `false`.  \\n**Note**: You will get a `422` error if the organization restricts [changing repository visibility](https://docs.github.com/articles/repository-permission-levels-for-an-organization#changing-the-visibility-of-repositories) to organization owners and a non-owner tries to change the value of private.'\n      )\n      .default(false),\n    visibility: z\n      .enum(['public', 'private'])\n      .describe('The visibility of the repository.')\n      .optional(),\n    security_and_analysis: z\n      .object({\n        advanced_security: z\n          .object({\n            status: z\n              .string()\n              .describe('Can be `enabled` or `disabled`.')\n              .optional()\n          })\n          .describe(\n            'Use the `status` property to enable or disable GitHub Advanced Security for this repository. For more information, see \"[About GitHub Advanced Security](/github/getting-started-with-github/learning-about-github/about-github-advanced-security).\"'\n          )\n          .optional(),\n        secret_scanning: z\n          .object({\n            status: z\n              .string()\n              .describe('Can be `enabled` or `disabled`.')\n              .optional()\n          })\n          .describe(\n            'Use the `status` property to enable or disable secret scanning for this repository. For more information, see \"[About secret scanning](/code-security/secret-security/about-secret-scanning).\"'\n          )\n          .optional(),\n        secret_scanning_push_protection: z\n          .object({\n            status: z\n              .string()\n              .describe('Can be `enabled` or `disabled`.')\n              .optional()\n          })\n          .describe(\n            'Use the `status` property to enable or disable secret scanning push protection for this repository. For more information, see \"[Protecting pushes with secret scanning](/code-security/secret-scanning/protecting-pushes-with-secret-scanning).\"'\n          )\n          .optional(),\n        secret_scanning_ai_detection: z\n          .object({\n            status: z\n              .string()\n              .describe('Can be `enabled` or `disabled`.')\n              .optional()\n          })\n          .describe(\n            'Use the `status` property to enable or disable secret scanning AI detection for this repository. For more information, see \"[Responsible detection of generic secrets with AI](https://docs.github.com/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/generic-secret-detection/responsible-ai-generic-secrets).\"'\n          )\n          .optional(),\n        secret_scanning_non_provider_patterns: z\n          .object({\n            status: z\n              .string()\n              .describe('Can be `enabled` or `disabled`.')\n              .optional()\n          })\n          .describe(\n            'Use the `status` property to enable or disable secret scanning non-provider patterns for this repository. For more information, see \"[Supported secret scanning patterns](/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets).\"'\n          )\n          .optional()\n      })\n      .describe(\n        'Specify which security and analysis features to enable or disable for the repository.\\n\\nTo use this parameter, you must have admin permissions for the repository or be an owner or security manager for the organization that owns the repository. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\\n\\nFor example, to enable GitHub Advanced Security, use this data in the body of the `PATCH` request:\\n`{ \"security_and_analysis\": {\"advanced_security\": { \"status\": \"enabled\" } } }`.\\n\\nYou can check which security and analysis features are currently enabled by using a `GET /repos/{owner}/{repo}` request.'\n      )\n      .optional(),\n    has_issues: z\n      .boolean()\n      .describe(\n        'Either `true` to enable issues for this repository or `false` to disable them.'\n      )\n      .default(true),\n    has_projects: z\n      .boolean()\n      .describe(\n        \"Either `true` to enable projects for this repository or `false` to disable them. **Note:** If you're creating a repository in an organization that has disabled repository projects, the default is `false`, and if you pass `true`, the API returns an error.\"\n      )\n      .default(true),\n    has_wiki: z\n      .boolean()\n      .describe(\n        'Either `true` to enable the wiki for this repository or `false` to disable it.'\n      )\n      .default(true),\n    is_template: z\n      .boolean()\n      .describe(\n        'Either `true` to make this repo available as a template repository or `false` to prevent it.'\n      )\n      .default(false),\n    default_branch: z\n      .string()\n      .describe('Updates the default branch for this repository.')\n      .optional(),\n    allow_squash_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.'\n      )\n      .default(true),\n    allow_merge_commit: z\n      .boolean()\n      .describe(\n        'Either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits.'\n      )\n      .default(true),\n    allow_rebase_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow rebase-merging pull requests, or `false` to prevent rebase-merging.'\n      )\n      .default(true),\n    allow_auto_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow auto-merge on pull requests, or `false` to disallow auto-merge.'\n      )\n      .default(false),\n    delete_branch_on_merge: z\n      .boolean()\n      .describe(\n        'Either `true` to allow automatically deleting head branches when pull requests are merged, or `false` to prevent automatic deletion.'\n      )\n      .default(false),\n    allow_update_branch: z\n      .boolean()\n      .describe(\n        'Either `true` to always allow a pull request head branch that is behind its base branch to be updated even if it is not required to be up to date before merging, or false otherwise.'\n      )\n      .default(false),\n    use_squash_pr_title_as_default: z\n      .boolean()\n      .describe(\n        'Either `true` to allow squash-merge commits to use pull request title, or `false` to use commit message. **This property is closing down. Please use `squash_merge_commit_title` instead.'\n      )\n      .default(false),\n    squash_merge_commit_title: z\n      .enum(['PR_TITLE', 'COMMIT_OR_PR_TITLE'])\n      .describe(\n        \"Required when using `squash_merge_commit_message`.\\n\\nThe default value for a squash merge commit title:\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).\"\n      )\n      .optional(),\n    squash_merge_commit_message: z\n      .enum(['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'])\n      .describe(\n        \"The default value for a squash merge commit message:\\n\\n- `PR_BODY` - default to the pull request's body.\\n- `COMMIT_MESSAGES` - default to the branch's commit messages.\\n- `BLANK` - default to a blank commit message.\"\n      )\n      .optional(),\n    merge_commit_title: z\n      .enum(['PR_TITLE', 'MERGE_MESSAGE'])\n      .describe(\n        \"Required when using `merge_commit_message`.\\n\\nThe default value for a merge commit title.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).\"\n      )\n      .optional(),\n    merge_commit_message: z\n      .enum(['PR_BODY', 'PR_TITLE', 'BLANK'])\n      .describe(\n        \"The default value for a merge commit message.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `PR_BODY` - default to the pull request's body.\\n- `BLANK` - default to a blank commit message.\"\n      )\n      .optional(),\n    archived: z\n      .boolean()\n      .describe(\n        'Whether to archive this repository. `false` will unarchive a previously archived repository.'\n      )\n      .default(false),\n    allow_forking: z\n      .boolean()\n      .describe(\n        'Either `true` to allow private forks, or `false` to prevent private forks.'\n      )\n      .default(false),\n    web_commit_signoff_required: z\n      .boolean()\n      .describe(\n        'Either `true` to require contributors to sign off on web-based commits, or `false` to not require contributors to sign off on web-based commits.'\n      )\n      .default(false),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposUpdateParams = z.infer<typeof ReposUpdateParamsSchema>\n\n  export const ReposUpdateResponseSchema = FullRepositorySchema\n  export type ReposUpdateResponse = z.infer<typeof ReposUpdateResponseSchema>\n\n  export const ActionsListArtifactsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    name: z\n      .string()\n      .describe(\n        'The name field of an artifact. When specified, only artifacts with this name will be returned.'\n      )\n      .optional()\n  })\n  export type ActionsListArtifactsForRepoParams = z.infer<\n    typeof ActionsListArtifactsForRepoParamsSchema\n  >\n\n  export const ActionsListArtifactsForRepoResponseSchema = z.object({\n    total_count: z.number().int(),\n    artifacts: z.array(ArtifactSchema)\n  })\n  export type ActionsListArtifactsForRepoResponse = z.infer<\n    typeof ActionsListArtifactsForRepoResponseSchema\n  >\n\n  export const ActionsGetArtifactParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    artifact_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the artifact.')\n  })\n  export type ActionsGetArtifactParams = z.infer<\n    typeof ActionsGetArtifactParamsSchema\n  >\n\n  export const ActionsGetArtifactResponseSchema = ArtifactSchema\n  export type ActionsGetArtifactResponse = z.infer<\n    typeof ActionsGetArtifactResponseSchema\n  >\n\n  export const ActionsDeleteArtifactParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    artifact_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the artifact.')\n  })\n  export type ActionsDeleteArtifactParams = z.infer<\n    typeof ActionsDeleteArtifactParamsSchema\n  >\n\n  export type ActionsDeleteArtifactResponse = undefined\n\n  export const ActionsDownloadArtifactParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    artifact_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the artifact.'),\n    archive_format: z.string()\n  })\n  export type ActionsDownloadArtifactParams = z.infer<\n    typeof ActionsDownloadArtifactParamsSchema\n  >\n\n  export type ActionsDownloadArtifactResponse = undefined\n\n  export const ActionsGetActionsCacheUsageParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsGetActionsCacheUsageParams = z.infer<\n    typeof ActionsGetActionsCacheUsageParamsSchema\n  >\n\n  export const ActionsGetActionsCacheUsageResponseSchema =\n    ActionsCacheUsageByRepositorySchema\n  export type ActionsGetActionsCacheUsageResponse = z.infer<\n    typeof ActionsGetActionsCacheUsageResponseSchema\n  >\n\n  export const ActionsGetActionsCacheListParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    ref: z\n      .string()\n      .describe(\n        'The full Git reference for narrowing down the cache. The `ref` for a branch should be formatted as `refs/heads/<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n      )\n      .optional(),\n    key: z\n      .string()\n      .describe('An explicit key or prefix for identifying the cache')\n      .optional(),\n    sort: z\n      .enum(['created_at', 'last_accessed_at', 'size_in_bytes'])\n      .describe(\n        'The property to sort the results by. `created_at` means when the cache was created. `last_accessed_at` means when the cache was last accessed. `size_in_bytes` is the size of the cache in bytes.'\n      )\n      .default('last_accessed_at'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc')\n  })\n  export type ActionsGetActionsCacheListParams = z.infer<\n    typeof ActionsGetActionsCacheListParamsSchema\n  >\n\n  export const ActionsGetActionsCacheListResponseSchema = ActionsCacheListSchema\n  export type ActionsGetActionsCacheListResponse = z.infer<\n    typeof ActionsGetActionsCacheListResponseSchema\n  >\n\n  export const ActionsDeleteActionsCacheByKeyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    key: z.string().describe('A key for identifying the cache.'),\n    ref: z\n      .string()\n      .describe(\n        'The full Git reference for narrowing down the cache. The `ref` for a branch should be formatted as `refs/heads/<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n      )\n      .optional()\n  })\n  export type ActionsDeleteActionsCacheByKeyParams = z.infer<\n    typeof ActionsDeleteActionsCacheByKeyParamsSchema\n  >\n\n  export const ActionsDeleteActionsCacheByKeyResponseSchema =\n    ActionsCacheListSchema\n  export type ActionsDeleteActionsCacheByKeyResponse = z.infer<\n    typeof ActionsDeleteActionsCacheByKeyResponseSchema\n  >\n\n  export const ActionsDeleteActionsCacheByIdParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    cache_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the GitHub Actions cache.')\n  })\n  export type ActionsDeleteActionsCacheByIdParams = z.infer<\n    typeof ActionsDeleteActionsCacheByIdParamsSchema\n  >\n\n  export type ActionsDeleteActionsCacheByIdResponse = undefined\n\n  export const ActionsGetJobForWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    job_id: z.number().int().describe('The unique identifier of the job.')\n  })\n  export type ActionsGetJobForWorkflowRunParams = z.infer<\n    typeof ActionsGetJobForWorkflowRunParamsSchema\n  >\n\n  export const ActionsGetJobForWorkflowRunResponseSchema = JobSchema\n  export type ActionsGetJobForWorkflowRunResponse = z.infer<\n    typeof ActionsGetJobForWorkflowRunResponseSchema\n  >\n\n  export const ActionsDownloadJobLogsForWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    job_id: z.number().int().describe('The unique identifier of the job.')\n  })\n  export type ActionsDownloadJobLogsForWorkflowRunParams = z.infer<\n    typeof ActionsDownloadJobLogsForWorkflowRunParamsSchema\n  >\n\n  export type ActionsDownloadJobLogsForWorkflowRunResponse = undefined\n\n  export const ActionsReRunJobForWorkflowRunParamsSchema = z.object({\n    enable_debug_logging: z\n      .boolean()\n      .describe('Whether to enable debug logging for the re-run.')\n      .default(false),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    job_id: z.number().int().describe('The unique identifier of the job.')\n  })\n  export type ActionsReRunJobForWorkflowRunParams = z.infer<\n    typeof ActionsReRunJobForWorkflowRunParamsSchema\n  >\n\n  export type ActionsReRunJobForWorkflowRunResponse = undefined\n\n  export const ActionsGetCustomOidcSubClaimForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsGetCustomOidcSubClaimForRepoParams = z.infer<\n    typeof ActionsGetCustomOidcSubClaimForRepoParamsSchema\n  >\n\n  export const ActionsGetCustomOidcSubClaimForRepoResponseSchema =\n    OidcCustomSubRepoSchema\n  export type ActionsGetCustomOidcSubClaimForRepoResponse = z.infer<\n    typeof ActionsGetCustomOidcSubClaimForRepoResponseSchema\n  >\n\n  export const ActionsSetCustomOidcSubClaimForRepoParamsSchema = z.object({\n    use_default: z\n      .boolean()\n      .describe(\n        'Whether to use the default template or not. If `true`, the `include_claim_keys` field is ignored.'\n      ),\n    include_claim_keys: z\n      .array(z.string())\n      .describe(\n        'Array of unique strings. Each claim key can only contain alphanumeric characters and underscores.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsSetCustomOidcSubClaimForRepoParams = z.infer<\n    typeof ActionsSetCustomOidcSubClaimForRepoParamsSchema\n  >\n\n  export type ActionsSetCustomOidcSubClaimForRepoResponse = undefined\n\n  export const ActionsListRepoOrganizationSecretsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListRepoOrganizationSecretsParams = z.infer<\n    typeof ActionsListRepoOrganizationSecretsParamsSchema\n  >\n\n  export const ActionsListRepoOrganizationSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(ActionsSecretSchema)\n  })\n  export type ActionsListRepoOrganizationSecretsResponse = z.infer<\n    typeof ActionsListRepoOrganizationSecretsResponseSchema\n  >\n\n  export const ActionsListRepoOrganizationVariablesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 30). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(10),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListRepoOrganizationVariablesParams = z.infer<\n    typeof ActionsListRepoOrganizationVariablesParamsSchema\n  >\n\n  export const ActionsListRepoOrganizationVariablesResponseSchema = z.object({\n    total_count: z.number().int(),\n    variables: z.array(ActionsVariableSchema)\n  })\n  export type ActionsListRepoOrganizationVariablesResponse = z.infer<\n    typeof ActionsListRepoOrganizationVariablesResponseSchema\n  >\n\n  export const ActionsGetGithubActionsPermissionsRepositoryParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n  export type ActionsGetGithubActionsPermissionsRepositoryParams = z.infer<\n    typeof ActionsGetGithubActionsPermissionsRepositoryParamsSchema\n  >\n\n  export const ActionsGetGithubActionsPermissionsRepositoryResponseSchema =\n    ActionsRepositoryPermissionsSchema\n  export type ActionsGetGithubActionsPermissionsRepositoryResponse = z.infer<\n    typeof ActionsGetGithubActionsPermissionsRepositoryResponseSchema\n  >\n\n  export const ActionsSetGithubActionsPermissionsRepositoryParamsSchema =\n    z.object({\n      enabled: ActionsEnabledSchema,\n      allowed_actions: AllowedActionsSchema.optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n  export type ActionsSetGithubActionsPermissionsRepositoryParams = z.infer<\n    typeof ActionsSetGithubActionsPermissionsRepositoryParamsSchema\n  >\n\n  export type ActionsSetGithubActionsPermissionsRepositoryResponse = undefined\n\n  export const ActionsGetWorkflowAccessToRepositoryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsGetWorkflowAccessToRepositoryParams = z.infer<\n    typeof ActionsGetWorkflowAccessToRepositoryParamsSchema\n  >\n\n  export const ActionsGetWorkflowAccessToRepositoryResponseSchema =\n    ActionsWorkflowAccessToRepositorySchema\n  export type ActionsGetWorkflowAccessToRepositoryResponse = z.infer<\n    typeof ActionsGetWorkflowAccessToRepositoryResponseSchema\n  >\n\n  export const ActionsSetWorkflowAccessToRepositoryParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .merge(ActionsWorkflowAccessToRepositorySchema)\n  export type ActionsSetWorkflowAccessToRepositoryParams = z.infer<\n    typeof ActionsSetWorkflowAccessToRepositoryParamsSchema\n  >\n\n  export type ActionsSetWorkflowAccessToRepositoryResponse = undefined\n\n  export const ActionsGetAllowedActionsRepositoryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsGetAllowedActionsRepositoryParams = z.infer<\n    typeof ActionsGetAllowedActionsRepositoryParamsSchema\n  >\n\n  export const ActionsGetAllowedActionsRepositoryResponseSchema =\n    SelectedActionsSchema\n  export type ActionsGetAllowedActionsRepositoryResponse = z.infer<\n    typeof ActionsGetAllowedActionsRepositoryResponseSchema\n  >\n\n  export const ActionsSetAllowedActionsRepositoryParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .merge(SelectedActionsSchema)\n  export type ActionsSetAllowedActionsRepositoryParams = z.infer<\n    typeof ActionsSetAllowedActionsRepositoryParamsSchema\n  >\n\n  export type ActionsSetAllowedActionsRepositoryResponse = undefined\n\n  export const ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n  export type ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryParams =\n    z.infer<\n      typeof ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryParamsSchema\n    >\n\n  export const ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryResponseSchema =\n    ActionsGetDefaultWorkflowPermissionsSchema\n  export type ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryResponse =\n    z.infer<\n      typeof ActionsGetGithubActionsDefaultWorkflowPermissionsRepositoryResponseSchema\n    >\n\n  export const ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryParamsSchema =\n    z\n      .object({\n        owner: z\n          .string()\n          .describe(\n            'The account owner of the repository. The name is not case sensitive.'\n          ),\n        repo: z\n          .string()\n          .describe(\n            'The name of the repository without the `.git` extension. The name is not case sensitive.'\n          )\n      })\n      .merge(ActionsSetDefaultWorkflowPermissionsSchema)\n  export type ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryParams =\n    z.infer<\n      typeof ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryParamsSchema\n    >\n\n  export type ActionsSetGithubActionsDefaultWorkflowPermissionsRepositoryResponse =\n    undefined\n\n  export const ActionsListSelfHostedRunnersForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    name: z.string().describe('The name of a self-hosted runner.').optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListSelfHostedRunnersForRepoParams = z.infer<\n    typeof ActionsListSelfHostedRunnersForRepoParamsSchema\n  >\n\n  export const ActionsListSelfHostedRunnersForRepoResponseSchema = z.object({\n    total_count: z.number().int(),\n    runners: z.array(RunnerSchema)\n  })\n  export type ActionsListSelfHostedRunnersForRepoResponse = z.infer<\n    typeof ActionsListSelfHostedRunnersForRepoResponseSchema\n  >\n\n  export const ActionsListRunnerApplicationsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsListRunnerApplicationsForRepoParams = z.infer<\n    typeof ActionsListRunnerApplicationsForRepoParamsSchema\n  >\n\n  export const ActionsListRunnerApplicationsForRepoResponseSchema = z.array(\n    RunnerApplicationSchema\n  )\n  export type ActionsListRunnerApplicationsForRepoResponse = z.infer<\n    typeof ActionsListRunnerApplicationsForRepoResponseSchema\n  >\n\n  export const ActionsGenerateRunnerJitconfigForRepoParamsSchema = z.object({\n    name: z.string().describe('The name of the new runner.'),\n    runner_group_id: z\n      .number()\n      .int()\n      .describe('The ID of the runner group to register the runner to.'),\n    labels: z\n      .array(z.string())\n      .min(1)\n      .max(100)\n      .describe(\n        'The names of the custom labels to add to the runner. **Minimum items**: 1. **Maximum items**: 100.'\n      ),\n    work_folder: z\n      .string()\n      .describe(\n        'The working directory to be used for job execution, relative to the runner install directory.'\n      )\n      .default('_work'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsGenerateRunnerJitconfigForRepoParams = z.infer<\n    typeof ActionsGenerateRunnerJitconfigForRepoParamsSchema\n  >\n\n  export type ActionsGenerateRunnerJitconfigForRepoResponse = undefined\n\n  export const ActionsCreateRegistrationTokenForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsCreateRegistrationTokenForRepoParams = z.infer<\n    typeof ActionsCreateRegistrationTokenForRepoParamsSchema\n  >\n\n  export type ActionsCreateRegistrationTokenForRepoResponse = undefined\n\n  export const ActionsCreateRemoveTokenForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsCreateRemoveTokenForRepoParams = z.infer<\n    typeof ActionsCreateRemoveTokenForRepoParamsSchema\n  >\n\n  export type ActionsCreateRemoveTokenForRepoResponse = undefined\n\n  export const ActionsGetSelfHostedRunnerForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner.')\n  })\n  export type ActionsGetSelfHostedRunnerForRepoParams = z.infer<\n    typeof ActionsGetSelfHostedRunnerForRepoParamsSchema\n  >\n\n  export const ActionsGetSelfHostedRunnerForRepoResponseSchema = RunnerSchema\n  export type ActionsGetSelfHostedRunnerForRepoResponse = z.infer<\n    typeof ActionsGetSelfHostedRunnerForRepoResponseSchema\n  >\n\n  export const ActionsDeleteSelfHostedRunnerFromRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    runner_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the self-hosted runner.')\n  })\n  export type ActionsDeleteSelfHostedRunnerFromRepoParams = z.infer<\n    typeof ActionsDeleteSelfHostedRunnerFromRepoParamsSchema\n  >\n\n  export type ActionsDeleteSelfHostedRunnerFromRepoResponse = undefined\n\n  export const ActionsListLabelsForSelfHostedRunnerForRepoParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsListLabelsForSelfHostedRunnerForRepoParams = z.infer<\n    typeof ActionsListLabelsForSelfHostedRunnerForRepoParamsSchema\n  >\n\n  export const ActionsListLabelsForSelfHostedRunnerForRepoResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsListLabelsForSelfHostedRunnerForRepoResponse = z.infer<\n    typeof ActionsListLabelsForSelfHostedRunnerForRepoResponseSchema\n  >\n\n  export const ActionsAddCustomLabelsToSelfHostedRunnerForRepoParamsSchema =\n    z.object({\n      labels: z\n        .array(z.string())\n        .min(1)\n        .max(100)\n        .describe('The names of the custom labels to add to the runner.'),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsAddCustomLabelsToSelfHostedRunnerForRepoParams = z.infer<\n    typeof ActionsAddCustomLabelsToSelfHostedRunnerForRepoParamsSchema\n  >\n\n  export const ActionsAddCustomLabelsToSelfHostedRunnerForRepoResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsAddCustomLabelsToSelfHostedRunnerForRepoResponse = z.infer<\n    typeof ActionsAddCustomLabelsToSelfHostedRunnerForRepoResponseSchema\n  >\n\n  export const ActionsSetCustomLabelsForSelfHostedRunnerForRepoParamsSchema =\n    z.object({\n      labels: z\n        .array(z.string())\n        .min(0)\n        .max(100)\n        .describe(\n          'The names of the custom labels to set for the runner. You can pass an empty array to remove all custom labels.'\n        ),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsSetCustomLabelsForSelfHostedRunnerForRepoParams = z.infer<\n    typeof ActionsSetCustomLabelsForSelfHostedRunnerForRepoParamsSchema\n  >\n\n  export const ActionsSetCustomLabelsForSelfHostedRunnerForRepoResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsSetCustomLabelsForSelfHostedRunnerForRepoResponse =\n    z.infer<\n      typeof ActionsSetCustomLabelsForSelfHostedRunnerForRepoResponseSchema\n    >\n\n  export const ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.')\n    })\n  export type ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoParams =\n    z.infer<\n      typeof ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoParamsSchema\n    >\n\n  export const ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoResponse =\n    z.infer<\n      typeof ActionsRemoveAllCustomLabelsFromSelfHostedRunnerForRepoResponseSchema\n    >\n\n  export const ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      runner_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the self-hosted runner.'),\n      name: z\n        .string()\n        .describe(\"The name of a self-hosted runner's custom label.\")\n    })\n  export type ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoParams =\n    z.infer<\n      typeof ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoParamsSchema\n    >\n\n  export const ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      labels: z.array(RunnerLabelSchema)\n    })\n  export type ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoResponse =\n    z.infer<\n      typeof ActionsRemoveCustomLabelFromSelfHostedRunnerForRepoResponseSchema\n    >\n\n  export const ActionsListWorkflowRunsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    actor: z\n      .string()\n      .describe(\n        \"Returns someone's workflow runs. Use the login for the user who created the `push` associated with the check suite or workflow run.\"\n      )\n      .optional(),\n    branch: z\n      .string()\n      .describe(\n        'Returns workflow runs associated with a branch. Use the name of the branch of the `push`.'\n      )\n      .optional(),\n    event: z\n      .string()\n      .describe(\n        'Returns workflow run triggered by the event you specify. For example, `push`, `pull_request` or `issue`. For more information, see \"[Events that trigger workflows](https://docs.github.com/actions/automating-your-workflow-with-github-actions/events-that-trigger-workflows).\"'\n      )\n      .optional(),\n    status: z\n      .enum([\n        'completed',\n        'action_required',\n        'cancelled',\n        'failure',\n        'neutral',\n        'skipped',\n        'stale',\n        'success',\n        'timed_out',\n        'in_progress',\n        'queued',\n        'requested',\n        'waiting',\n        'pending'\n      ])\n      .describe(\n        'Returns workflow runs with the check run `status` or `conclusion` that you specify. For example, a conclusion can be `success` or a status can be `in_progress`. Only GitHub Actions can set a status of `waiting`, `pending`, or `requested`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    created: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Returns workflow runs created within the given date-time range. For more information on the syntax, see \"[Understanding the search syntax](https://docs.github.com/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates).\"'\n      )\n      .optional(),\n    exclude_pull_requests: z\n      .boolean()\n      .describe(\n        'If `true` pull requests are omitted from the response (empty array).'\n      )\n      .default(false),\n    check_suite_id: z\n      .number()\n      .int()\n      .describe(\n        'Returns workflow runs with the `check_suite_id` that you specify.'\n      )\n      .optional(),\n    head_sha: z\n      .string()\n      .describe(\n        'Only returns workflow runs that are associated with the specified `head_sha`.'\n      )\n      .optional()\n  })\n  export type ActionsListWorkflowRunsForRepoParams = z.infer<\n    typeof ActionsListWorkflowRunsForRepoParamsSchema\n  >\n\n  export const ActionsListWorkflowRunsForRepoResponseSchema = z.object({\n    total_count: z.number().int(),\n    workflow_runs: z.array(WorkflowRunSchema)\n  })\n  export type ActionsListWorkflowRunsForRepoResponse = z.infer<\n    typeof ActionsListWorkflowRunsForRepoResponseSchema\n  >\n\n  export const ActionsGetWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.'),\n    exclude_pull_requests: z\n      .boolean()\n      .describe(\n        'If `true` pull requests are omitted from the response (empty array).'\n      )\n      .default(false)\n  })\n  export type ActionsGetWorkflowRunParams = z.infer<\n    typeof ActionsGetWorkflowRunParamsSchema\n  >\n\n  export const ActionsGetWorkflowRunResponseSchema = WorkflowRunSchema\n  export type ActionsGetWorkflowRunResponse = z.infer<\n    typeof ActionsGetWorkflowRunResponseSchema\n  >\n\n  export const ActionsDeleteWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsDeleteWorkflowRunParams = z.infer<\n    typeof ActionsDeleteWorkflowRunParamsSchema\n  >\n\n  export type ActionsDeleteWorkflowRunResponse = undefined\n\n  export const ActionsGetReviewsForRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsGetReviewsForRunParams = z.infer<\n    typeof ActionsGetReviewsForRunParamsSchema\n  >\n\n  export const ActionsGetReviewsForRunResponseSchema = z.array(\n    EnvironmentApprovalsSchema\n  )\n  export type ActionsGetReviewsForRunResponse = z.infer<\n    typeof ActionsGetReviewsForRunResponseSchema\n  >\n\n  export const ActionsApproveWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsApproveWorkflowRunParams = z.infer<\n    typeof ActionsApproveWorkflowRunParamsSchema\n  >\n\n  export type ActionsApproveWorkflowRunResponse = undefined\n\n  export const ActionsListWorkflowRunArtifactsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    name: z\n      .string()\n      .describe(\n        'The name field of an artifact. When specified, only artifacts with this name will be returned.'\n      )\n      .optional()\n  })\n  export type ActionsListWorkflowRunArtifactsParams = z.infer<\n    typeof ActionsListWorkflowRunArtifactsParamsSchema\n  >\n\n  export const ActionsListWorkflowRunArtifactsResponseSchema = z.object({\n    total_count: z.number().int(),\n    artifacts: z.array(ArtifactSchema)\n  })\n  export type ActionsListWorkflowRunArtifactsResponse = z.infer<\n    typeof ActionsListWorkflowRunArtifactsResponseSchema\n  >\n\n  export const ActionsGetWorkflowRunAttemptParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.'),\n    attempt_number: z\n      .number()\n      .int()\n      .describe('The attempt number of the workflow run.'),\n    exclude_pull_requests: z\n      .boolean()\n      .describe(\n        'If `true` pull requests are omitted from the response (empty array).'\n      )\n      .default(false)\n  })\n  export type ActionsGetWorkflowRunAttemptParams = z.infer<\n    typeof ActionsGetWorkflowRunAttemptParamsSchema\n  >\n\n  export const ActionsGetWorkflowRunAttemptResponseSchema = WorkflowRunSchema\n  export type ActionsGetWorkflowRunAttemptResponse = z.infer<\n    typeof ActionsGetWorkflowRunAttemptResponseSchema\n  >\n\n  export const ActionsListJobsForWorkflowRunAttemptParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.'),\n    attempt_number: z\n      .number()\n      .int()\n      .describe('The attempt number of the workflow run.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListJobsForWorkflowRunAttemptParams = z.infer<\n    typeof ActionsListJobsForWorkflowRunAttemptParamsSchema\n  >\n\n  export const ActionsListJobsForWorkflowRunAttemptResponseSchema = z.object({\n    total_count: z.number().int(),\n    jobs: z.array(JobSchema)\n  })\n  export type ActionsListJobsForWorkflowRunAttemptResponse = z.infer<\n    typeof ActionsListJobsForWorkflowRunAttemptResponseSchema\n  >\n\n  export const ActionsDownloadWorkflowRunAttemptLogsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.'),\n    attempt_number: z\n      .number()\n      .int()\n      .describe('The attempt number of the workflow run.')\n  })\n  export type ActionsDownloadWorkflowRunAttemptLogsParams = z.infer<\n    typeof ActionsDownloadWorkflowRunAttemptLogsParamsSchema\n  >\n\n  export type ActionsDownloadWorkflowRunAttemptLogsResponse = undefined\n\n  export const ActionsCancelWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsCancelWorkflowRunParams = z.infer<\n    typeof ActionsCancelWorkflowRunParamsSchema\n  >\n\n  export type ActionsCancelWorkflowRunResponse = undefined\n\n  export const ActionsReviewCustomGatesForRunParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      run_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the workflow run.')\n    })\n    .and(\n      z.union([\n        ReviewCustomGatesCommentRequiredSchema,\n        ReviewCustomGatesStateRequiredSchema\n      ])\n    )\n  export type ActionsReviewCustomGatesForRunParams = z.infer<\n    typeof ActionsReviewCustomGatesForRunParamsSchema\n  >\n\n  export type ActionsReviewCustomGatesForRunResponse = undefined\n\n  export const ActionsForceCancelWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsForceCancelWorkflowRunParams = z.infer<\n    typeof ActionsForceCancelWorkflowRunParamsSchema\n  >\n\n  export type ActionsForceCancelWorkflowRunResponse = undefined\n\n  export const ActionsListJobsForWorkflowRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.'),\n    filter: z\n      .enum(['latest', 'all'])\n      .describe(\n        'Filters jobs by their `completed_at` timestamp. `latest` returns jobs from the most recent execution of the workflow run. `all` returns all jobs for a workflow run, including from old executions of the workflow run.'\n      )\n      .default('latest'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListJobsForWorkflowRunParams = z.infer<\n    typeof ActionsListJobsForWorkflowRunParamsSchema\n  >\n\n  export const ActionsListJobsForWorkflowRunResponseSchema = z.object({\n    total_count: z.number().int(),\n    jobs: z.array(JobSchema)\n  })\n  export type ActionsListJobsForWorkflowRunResponse = z.infer<\n    typeof ActionsListJobsForWorkflowRunResponseSchema\n  >\n\n  export const ActionsDownloadWorkflowRunLogsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsDownloadWorkflowRunLogsParams = z.infer<\n    typeof ActionsDownloadWorkflowRunLogsParamsSchema\n  >\n\n  export type ActionsDownloadWorkflowRunLogsResponse = undefined\n\n  export const ActionsDeleteWorkflowRunLogsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsDeleteWorkflowRunLogsParams = z.infer<\n    typeof ActionsDeleteWorkflowRunLogsParamsSchema\n  >\n\n  export type ActionsDeleteWorkflowRunLogsResponse = undefined\n\n  export const ActionsGetPendingDeploymentsForRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsGetPendingDeploymentsForRunParams = z.infer<\n    typeof ActionsGetPendingDeploymentsForRunParamsSchema\n  >\n\n  export const ActionsGetPendingDeploymentsForRunResponseSchema = z.array(\n    PendingDeploymentSchema\n  )\n  export type ActionsGetPendingDeploymentsForRunResponse = z.infer<\n    typeof ActionsGetPendingDeploymentsForRunResponseSchema\n  >\n\n  export const ActionsReviewPendingDeploymentsForRunParamsSchema = z.object({\n    environment_ids: z\n      .array(z.number().int())\n      .describe('The list of environment ids to approve or reject'),\n    state: z\n      .enum(['approved', 'rejected'])\n      .describe(\n        'Whether to approve or reject deployment to the specified environments.'\n      ),\n    comment: z\n      .string()\n      .describe('A comment to accompany the deployment review'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsReviewPendingDeploymentsForRunParams = z.infer<\n    typeof ActionsReviewPendingDeploymentsForRunParamsSchema\n  >\n\n  export const ActionsReviewPendingDeploymentsForRunResponseSchema =\n    z.array(DeploymentSchema)\n  export type ActionsReviewPendingDeploymentsForRunResponse = z.infer<\n    typeof ActionsReviewPendingDeploymentsForRunResponseSchema\n  >\n\n  export const ActionsReRunWorkflowParamsSchema = z.object({\n    enable_debug_logging: z\n      .boolean()\n      .describe('Whether to enable debug logging for the re-run.')\n      .default(false),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsReRunWorkflowParams = z.infer<\n    typeof ActionsReRunWorkflowParamsSchema\n  >\n\n  export type ActionsReRunWorkflowResponse = undefined\n\n  export const ActionsReRunWorkflowFailedJobsParamsSchema = z.object({\n    enable_debug_logging: z\n      .boolean()\n      .describe('Whether to enable debug logging for the re-run.')\n      .default(false),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsReRunWorkflowFailedJobsParams = z.infer<\n    typeof ActionsReRunWorkflowFailedJobsParamsSchema\n  >\n\n  export type ActionsReRunWorkflowFailedJobsResponse = undefined\n\n  export const ActionsGetWorkflowRunUsageParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the workflow run.')\n  })\n  export type ActionsGetWorkflowRunUsageParams = z.infer<\n    typeof ActionsGetWorkflowRunUsageParamsSchema\n  >\n\n  export const ActionsGetWorkflowRunUsageResponseSchema = WorkflowRunUsageSchema\n  export type ActionsGetWorkflowRunUsageResponse = z.infer<\n    typeof ActionsGetWorkflowRunUsageResponseSchema\n  >\n\n  export const ActionsListRepoSecretsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListRepoSecretsParams = z.infer<\n    typeof ActionsListRepoSecretsParamsSchema\n  >\n\n  export const ActionsListRepoSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(ActionsSecretSchema)\n  })\n  export type ActionsListRepoSecretsResponse = z.infer<\n    typeof ActionsListRepoSecretsResponseSchema\n  >\n\n  export const ActionsGetRepoPublicKeyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsGetRepoPublicKeyParams = z.infer<\n    typeof ActionsGetRepoPublicKeyParamsSchema\n  >\n\n  export const ActionsGetRepoPublicKeyResponseSchema = ActionsPublicKeySchema\n  export type ActionsGetRepoPublicKeyResponse = z.infer<\n    typeof ActionsGetRepoPublicKeyResponseSchema\n  >\n\n  export const ActionsGetRepoSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsGetRepoSecretParams = z.infer<\n    typeof ActionsGetRepoSecretParamsSchema\n  >\n\n  export const ActionsGetRepoSecretResponseSchema = ActionsSecretSchema\n  export type ActionsGetRepoSecretResponse = z.infer<\n    typeof ActionsGetRepoSecretResponseSchema\n  >\n\n  export const ActionsCreateOrUpdateRepoSecretParamsSchema = z.object({\n    encrypted_value: z\n      .string()\n      .regex(\n        new RegExp(\n          '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n        )\n      )\n      .describe(\n        'Value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get a repository public key](https://docs.github.com/rest/actions/secrets#get-a-repository-public-key) endpoint.'\n      ),\n    key_id: z\n      .string()\n      .describe('ID of the key you used to encrypt the secret.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsCreateOrUpdateRepoSecretParams = z.infer<\n    typeof ActionsCreateOrUpdateRepoSecretParamsSchema\n  >\n\n  export type ActionsCreateOrUpdateRepoSecretResponse = undefined\n\n  export const ActionsDeleteRepoSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsDeleteRepoSecretParams = z.infer<\n    typeof ActionsDeleteRepoSecretParamsSchema\n  >\n\n  export type ActionsDeleteRepoSecretResponse = undefined\n\n  export const ActionsListRepoVariablesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 30). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(10),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListRepoVariablesParams = z.infer<\n    typeof ActionsListRepoVariablesParamsSchema\n  >\n\n  export const ActionsListRepoVariablesResponseSchema = z.object({\n    total_count: z.number().int(),\n    variables: z.array(ActionsVariableSchema)\n  })\n  export type ActionsListRepoVariablesResponse = z.infer<\n    typeof ActionsListRepoVariablesResponseSchema\n  >\n\n  export const ActionsCreateRepoVariableParamsSchema = z.object({\n    name: z.string().describe('The name of the variable.'),\n    value: z.string().describe('The value of the variable.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsCreateRepoVariableParams = z.infer<\n    typeof ActionsCreateRepoVariableParamsSchema\n  >\n\n  export type ActionsCreateRepoVariableResponse = undefined\n\n  export const ActionsGetRepoVariableParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    name: z.string().describe('The name of the variable.')\n  })\n  export type ActionsGetRepoVariableParams = z.infer<\n    typeof ActionsGetRepoVariableParamsSchema\n  >\n\n  export const ActionsGetRepoVariableResponseSchema = ActionsVariableSchema\n  export type ActionsGetRepoVariableResponse = z.infer<\n    typeof ActionsGetRepoVariableResponseSchema\n  >\n\n  export const ActionsDeleteRepoVariableParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    name: z.string().describe('The name of the variable.')\n  })\n  export type ActionsDeleteRepoVariableParams = z.infer<\n    typeof ActionsDeleteRepoVariableParamsSchema\n  >\n\n  export type ActionsDeleteRepoVariableResponse = undefined\n\n  export const ActionsUpdateRepoVariableParamsSchema = z.object({\n    name: z.string().describe('The name of the variable.'),\n    value: z.string().describe('The value of the variable.').optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActionsUpdateRepoVariableParams = z.infer<\n    typeof ActionsUpdateRepoVariableParamsSchema\n  >\n\n  export type ActionsUpdateRepoVariableResponse = undefined\n\n  export const ActionsListRepoWorkflowsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListRepoWorkflowsParams = z.infer<\n    typeof ActionsListRepoWorkflowsParamsSchema\n  >\n\n  export const ActionsListRepoWorkflowsResponseSchema = z.object({\n    total_count: z.number().int(),\n    workflows: z.array(WorkflowSchema)\n  })\n  export type ActionsListRepoWorkflowsResponse = z.infer<\n    typeof ActionsListRepoWorkflowsResponseSchema\n  >\n\n  export const ActionsGetWorkflowParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    workflow_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the workflow. You can also pass the workflow file name as a string.'\n      )\n  })\n  export type ActionsGetWorkflowParams = z.infer<\n    typeof ActionsGetWorkflowParamsSchema\n  >\n\n  export const ActionsGetWorkflowResponseSchema = WorkflowSchema\n  export type ActionsGetWorkflowResponse = z.infer<\n    typeof ActionsGetWorkflowResponseSchema\n  >\n\n  export const ActionsDisableWorkflowParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    workflow_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the workflow. You can also pass the workflow file name as a string.'\n      )\n  })\n  export type ActionsDisableWorkflowParams = z.infer<\n    typeof ActionsDisableWorkflowParamsSchema\n  >\n\n  export type ActionsDisableWorkflowResponse = undefined\n\n  export const ActionsCreateWorkflowDispatchParamsSchema = z.object({\n    ref: z\n      .string()\n      .describe(\n        'The git reference for the workflow. The reference can be a branch or tag name.'\n      ),\n    inputs: z\n      .record(z.any())\n      .describe(\n        'Input keys and values configured in the workflow file. The maximum number of properties is 10. Any default properties configured in the workflow file will be used when `inputs` are omitted.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    workflow_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the workflow. You can also pass the workflow file name as a string.'\n      )\n  })\n  export type ActionsCreateWorkflowDispatchParams = z.infer<\n    typeof ActionsCreateWorkflowDispatchParamsSchema\n  >\n\n  export type ActionsCreateWorkflowDispatchResponse = undefined\n\n  export const ActionsEnableWorkflowParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    workflow_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the workflow. You can also pass the workflow file name as a string.'\n      )\n  })\n  export type ActionsEnableWorkflowParams = z.infer<\n    typeof ActionsEnableWorkflowParamsSchema\n  >\n\n  export type ActionsEnableWorkflowResponse = undefined\n\n  export const ActionsListWorkflowRunsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    workflow_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the workflow. You can also pass the workflow file name as a string.'\n      ),\n    actor: z\n      .string()\n      .describe(\n        \"Returns someone's workflow runs. Use the login for the user who created the `push` associated with the check suite or workflow run.\"\n      )\n      .optional(),\n    branch: z\n      .string()\n      .describe(\n        'Returns workflow runs associated with a branch. Use the name of the branch of the `push`.'\n      )\n      .optional(),\n    event: z\n      .string()\n      .describe(\n        'Returns workflow run triggered by the event you specify. For example, `push`, `pull_request` or `issue`. For more information, see \"[Events that trigger workflows](https://docs.github.com/actions/automating-your-workflow-with-github-actions/events-that-trigger-workflows).\"'\n      )\n      .optional(),\n    status: z\n      .enum([\n        'completed',\n        'action_required',\n        'cancelled',\n        'failure',\n        'neutral',\n        'skipped',\n        'stale',\n        'success',\n        'timed_out',\n        'in_progress',\n        'queued',\n        'requested',\n        'waiting',\n        'pending'\n      ])\n      .describe(\n        'Returns workflow runs with the check run `status` or `conclusion` that you specify. For example, a conclusion can be `success` or a status can be `in_progress`. Only GitHub Actions can set a status of `waiting`, `pending`, or `requested`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    created: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Returns workflow runs created within the given date-time range. For more information on the syntax, see \"[Understanding the search syntax](https://docs.github.com/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax#query-for-dates).\"'\n      )\n      .optional(),\n    exclude_pull_requests: z\n      .boolean()\n      .describe(\n        'If `true` pull requests are omitted from the response (empty array).'\n      )\n      .default(false),\n    check_suite_id: z\n      .number()\n      .int()\n      .describe(\n        'Returns workflow runs with the `check_suite_id` that you specify.'\n      )\n      .optional(),\n    head_sha: z\n      .string()\n      .describe(\n        'Only returns workflow runs that are associated with the specified `head_sha`.'\n      )\n      .optional()\n  })\n  export type ActionsListWorkflowRunsParams = z.infer<\n    typeof ActionsListWorkflowRunsParamsSchema\n  >\n\n  export const ActionsListWorkflowRunsResponseSchema = z.object({\n    total_count: z.number().int(),\n    workflow_runs: z.array(WorkflowRunSchema)\n  })\n  export type ActionsListWorkflowRunsResponse = z.infer<\n    typeof ActionsListWorkflowRunsResponseSchema\n  >\n\n  export const ActionsGetWorkflowUsageParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    workflow_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the workflow. You can also pass the workflow file name as a string.'\n      )\n  })\n  export type ActionsGetWorkflowUsageParams = z.infer<\n    typeof ActionsGetWorkflowUsageParamsSchema\n  >\n\n  export const ActionsGetWorkflowUsageResponseSchema = WorkflowUsageSchema\n  export type ActionsGetWorkflowUsageResponse = z.infer<\n    typeof ActionsGetWorkflowUsageResponseSchema\n  >\n\n  export const ReposListActivitiesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    ref: z\n      .string()\n      .describe(\n        'The Git reference for the activities you want to list.\\n\\nThe `ref` for a branch can be formatted either as `refs/heads/BRANCH_NAME` or `BRANCH_NAME`, where `BRANCH_NAME` is the name of your branch.'\n      )\n      .optional(),\n    actor: z\n      .string()\n      .describe(\n        'The GitHub username to use to filter by the actor who performed the activity.'\n      )\n      .optional(),\n    time_period: z\n      .enum(['day', 'week', 'month', 'quarter', 'year'])\n      .describe(\n        'The time period to filter by.\\n\\nFor example, `day` will filter for activity that occurred in the past 24 hours, and `week` will filter for activity that occurred in the past 7 days (168 hours).'\n      )\n      .optional(),\n    activity_type: z\n      .enum([\n        'push',\n        'force_push',\n        'branch_creation',\n        'branch_deletion',\n        'pr_merge',\n        'merge_queue_merge'\n      ])\n      .describe(\n        'The activity type to filter by.\\n\\nFor example, you can choose to filter by \"force_push\", to see all force pushes to the repository.'\n      )\n      .optional()\n  })\n  export type ReposListActivitiesParams = z.infer<\n    typeof ReposListActivitiesParamsSchema\n  >\n\n  export const ReposListActivitiesResponseSchema = z.array(ActivitySchema)\n  export type ReposListActivitiesResponse = z.infer<\n    typeof ReposListActivitiesResponseSchema\n  >\n\n  export const IssuesListAssigneesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListAssigneesParams = z.infer<\n    typeof IssuesListAssigneesParamsSchema\n  >\n\n  export const IssuesListAssigneesResponseSchema = z.array(SimpleUserSchema)\n  export type IssuesListAssigneesResponse = z.infer<\n    typeof IssuesListAssigneesResponseSchema\n  >\n\n  export const IssuesCheckUserCanBeAssignedParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    assignee: z.string()\n  })\n  export type IssuesCheckUserCanBeAssignedParams = z.infer<\n    typeof IssuesCheckUserCanBeAssignedParamsSchema\n  >\n\n  export type IssuesCheckUserCanBeAssignedResponse = undefined\n\n  export const ReposCreateAttestationParamsSchema = z.object({\n    bundle: z\n      .object({\n        mediaType: z.string().optional(),\n        verificationMaterial: z.object({}).catchall(z.any()).optional(),\n        dsseEnvelope: z.object({}).catchall(z.any()).optional()\n      })\n      .describe(\n        \"The attestation's Sigstore Bundle.\\nRefer to the [Sigstore Bundle Specification](https://github.com/sigstore/protobuf-specs/blob/main/protos/sigstore_bundle.proto) for more information.\"\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateAttestationParams = z.infer<\n    typeof ReposCreateAttestationParamsSchema\n  >\n\n  export type ReposCreateAttestationResponse = undefined\n\n  export const ReposListAttestationsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    subject_digest: z\n      .string()\n      .describe(\n        \"The parameter should be set to the attestation's subject's SHA256 digest, in the form `sha256:HEX_DIGEST`.\"\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    predicate_type: z\n      .string()\n      .describe(\n        'Optional filter for fetching attestations with a given predicate type.\\nThis option accepts `provenance`, `sbom`, or freeform text for custom predicate types.'\n      )\n      .optional()\n  })\n  export type ReposListAttestationsParams = z.infer<\n    typeof ReposListAttestationsParamsSchema\n  >\n\n  export const ReposListAttestationsResponseSchema = z.object({\n    attestations: z\n      .array(\n        z.object({\n          bundle: z\n            .object({\n              mediaType: z.string().optional(),\n              verificationMaterial: z.object({}).catchall(z.any()).optional(),\n              dsseEnvelope: z.object({}).catchall(z.any()).optional()\n            })\n            .describe(\n              \"The attestation's Sigstore Bundle.\\nRefer to the [Sigstore Bundle Specification](https://github.com/sigstore/protobuf-specs/blob/main/protos/sigstore_bundle.proto) for more information.\"\n            )\n            .optional(),\n          repository_id: z.number().int().optional(),\n          bundle_url: z.string().optional()\n        })\n      )\n      .optional()\n  })\n  export type ReposListAttestationsResponse = z.infer<\n    typeof ReposListAttestationsResponseSchema\n  >\n\n  export const ReposListAutolinksParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposListAutolinksParams = z.infer<\n    typeof ReposListAutolinksParamsSchema\n  >\n\n  export const ReposListAutolinksResponseSchema = z.array(AutolinkSchema)\n  export type ReposListAutolinksResponse = z.infer<\n    typeof ReposListAutolinksResponseSchema\n  >\n\n  export const ReposCreateAutolinkParamsSchema = z.object({\n    key_prefix: z\n      .string()\n      .describe(\n        'This prefix appended by certain characters will generate a link any time it is found in an issue, pull request, or commit.'\n      ),\n    url_template: z\n      .string()\n      .describe(\n        'The URL must contain `<num>` for the reference number. `<num>` matches different characters depending on the value of `is_alphanumeric`.'\n      ),\n    is_alphanumeric: z\n      .boolean()\n      .describe(\n        'Whether this autolink reference matches alphanumeric characters. If true, the `<num>` parameter of the `url_template` matches alphanumeric characters `A-Z` (case insensitive), `0-9`, and `-`. If false, this autolink reference only matches numeric characters.'\n      )\n      .default(true),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateAutolinkParams = z.infer<\n    typeof ReposCreateAutolinkParamsSchema\n  >\n\n  export type ReposCreateAutolinkResponse = undefined\n\n  export const ReposGetAutolinkParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    autolink_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the autolink.')\n  })\n  export type ReposGetAutolinkParams = z.infer<\n    typeof ReposGetAutolinkParamsSchema\n  >\n\n  export const ReposGetAutolinkResponseSchema = AutolinkSchema\n  export type ReposGetAutolinkResponse = z.infer<\n    typeof ReposGetAutolinkResponseSchema\n  >\n\n  export const ReposDeleteAutolinkParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    autolink_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the autolink.')\n  })\n  export type ReposDeleteAutolinkParams = z.infer<\n    typeof ReposDeleteAutolinkParamsSchema\n  >\n\n  export type ReposDeleteAutolinkResponse = undefined\n\n  export const ReposCheckAutomatedSecurityFixesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCheckAutomatedSecurityFixesParams = z.infer<\n    typeof ReposCheckAutomatedSecurityFixesParamsSchema\n  >\n\n  export const ReposCheckAutomatedSecurityFixesResponseSchema =\n    CheckAutomatedSecurityFixesSchema\n  export type ReposCheckAutomatedSecurityFixesResponse = z.infer<\n    typeof ReposCheckAutomatedSecurityFixesResponseSchema\n  >\n\n  export const ReposEnableAutomatedSecurityFixesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposEnableAutomatedSecurityFixesParams = z.infer<\n    typeof ReposEnableAutomatedSecurityFixesParamsSchema\n  >\n\n  export type ReposEnableAutomatedSecurityFixesResponse = undefined\n\n  export const ReposDisableAutomatedSecurityFixesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposDisableAutomatedSecurityFixesParams = z.infer<\n    typeof ReposDisableAutomatedSecurityFixesParamsSchema\n  >\n\n  export type ReposDisableAutomatedSecurityFixesResponse = undefined\n\n  export const ReposListBranchesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    protected: z\n      .boolean()\n      .describe(\n        'Setting to `true` returns only branches protected by branch protections or rulesets. When set to `false`, only unprotected branches are returned. Omitting this parameter returns all branches.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListBranchesParams = z.infer<\n    typeof ReposListBranchesParamsSchema\n  >\n\n  export const ReposListBranchesResponseSchema = z.array(ShortBranchSchema)\n  export type ReposListBranchesResponse = z.infer<\n    typeof ReposListBranchesResponseSchema\n  >\n\n  export const ReposGetBranchParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetBranchParams = z.infer<typeof ReposGetBranchParamsSchema>\n\n  export const ReposGetBranchResponseSchema = BranchWithProtectionSchema\n  export type ReposGetBranchResponse = z.infer<\n    typeof ReposGetBranchResponseSchema\n  >\n\n  export const ReposGetBranchProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetBranchProtectionParams = z.infer<\n    typeof ReposGetBranchProtectionParamsSchema\n  >\n\n  export const ReposGetBranchProtectionResponseSchema = BranchProtectionSchema\n  export type ReposGetBranchProtectionResponse = z.infer<\n    typeof ReposGetBranchProtectionResponseSchema\n  >\n\n  export const ReposUpdateBranchProtectionParamsSchema = z.object({\n    required_status_checks: z\n      .object({\n        strict: z\n          .boolean()\n          .describe('Require branches to be up to date before merging.'),\n        contexts: z\n          .array(z.string())\n          .describe(\n            '**Closing down notice**: The list of status checks to require in order to merge into this branch. If any of these checks have recently been set by a particular GitHub App, they will be required to come from that app in future for the branch to merge. Use `checks` instead of `contexts` for more fine-grained control.'\n          ),\n        checks: z\n          .array(\n            z.object({\n              context: z.string().describe('The name of the required check'),\n              app_id: z\n                .number()\n                .int()\n                .describe(\n                  'The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.'\n                )\n                .optional()\n            })\n          )\n          .describe(\n            'The list of status checks to require in order to merge into this branch.'\n          )\n          .optional()\n      })\n      .describe(\n        'Require status checks to pass before merging. Set to `null` to disable.'\n      ),\n    enforce_admins: z\n      .boolean()\n      .describe(\n        'Enforce all configured restrictions for administrators. Set to `true` to enforce required status checks for repository administrators. Set to `null` to disable.'\n      ),\n    required_pull_request_reviews: z\n      .object({\n        dismissal_restrictions: z\n          .object({\n            users: z\n              .array(z.string())\n              .describe('The list of user `login`s with dismissal access')\n              .optional(),\n            teams: z\n              .array(z.string())\n              .describe('The list of team `slug`s with dismissal access')\n              .optional(),\n            apps: z\n              .array(z.string())\n              .describe('The list of app `slug`s with dismissal access')\n              .optional()\n          })\n          .describe(\n            'Specify which users, teams, and apps can dismiss pull request reviews. Pass an empty `dismissal_restrictions` object to disable. User and team `dismissal_restrictions` are only available for organization-owned repositories. Omit this parameter for personal repositories.'\n          )\n          .optional(),\n        dismiss_stale_reviews: z\n          .boolean()\n          .describe(\n            'Set to `true` if you want to automatically dismiss approving reviews when someone pushes a new commit.'\n          )\n          .optional(),\n        require_code_owner_reviews: z\n          .boolean()\n          .describe(\n            'Blocks merging pull requests until [code owners](https://docs.github.com/articles/about-code-owners/) review them.'\n          )\n          .optional(),\n        required_approving_review_count: z\n          .number()\n          .int()\n          .describe(\n            'Specify the number of reviewers required to approve pull requests. Use a number between 1 and 6 or 0 to not require reviewers.'\n          )\n          .optional(),\n        require_last_push_approval: z\n          .boolean()\n          .describe(\n            'Whether the most recent push must be approved by someone other than the person who pushed it. Default: `false`.'\n          )\n          .default(false),\n        bypass_pull_request_allowances: z\n          .object({\n            users: z\n              .array(z.string())\n              .describe(\n                'The list of user `login`s allowed to bypass pull request requirements.'\n              )\n              .optional(),\n            teams: z\n              .array(z.string())\n              .describe(\n                'The list of team `slug`s allowed to bypass pull request requirements.'\n              )\n              .optional(),\n            apps: z\n              .array(z.string())\n              .describe(\n                'The list of app `slug`s allowed to bypass pull request requirements.'\n              )\n              .optional()\n          })\n          .describe(\n            'Allow specific users, teams, or apps to bypass pull request requirements.'\n          )\n          .optional()\n      })\n      .describe(\n        'Require at least one approving review on a pull request, before merging. Set to `null` to disable.'\n      ),\n    restrictions: z\n      .object({\n        users: z\n          .array(z.string())\n          .describe('The list of user `login`s with push access'),\n        teams: z\n          .array(z.string())\n          .describe('The list of team `slug`s with push access'),\n        apps: z\n          .array(z.string())\n          .describe('The list of app `slug`s with push access')\n          .optional()\n      })\n      .describe(\n        'Restrict who can push to the protected branch. User, app, and team `restrictions` are only available for organization-owned repositories. Set to `null` to disable.'\n      ),\n    required_linear_history: z\n      .boolean()\n      .describe(\n        'Enforces a linear commit Git history, which prevents anyone from pushing merge commits to a branch. Set to `true` to enforce a linear commit history. Set to `false` to disable a linear commit Git history. Your repository must allow squash merging or rebase merging before you can enable a linear commit history. Default: `false`. For more information, see \"[Requiring a linear commit history](https://docs.github.com/github/administering-a-repository/requiring-a-linear-commit-history)\" in the GitHub Help documentation.'\n      )\n      .optional(),\n    allow_force_pushes: z\n      .boolean()\n      .describe(\n        'Permits force pushes to the protected branch by anyone with write access to the repository. Set to `true` to allow force pushes. Set to `false` or `null` to block force pushes. Default: `false`. For more information, see \"[Enabling force pushes to a protected branch](https://docs.github.com/github/administering-a-repository/enabling-force-pushes-to-a-protected-branch)\" in the GitHub Help documentation.\"'\n      )\n      .optional(),\n    allow_deletions: z\n      .boolean()\n      .describe(\n        'Allows deletion of the protected branch by anyone with write access to the repository. Set to `false` to prevent deletion of the protected branch. Default: `false`. For more information, see \"[Enabling force pushes to a protected branch](https://docs.github.com/github/administering-a-repository/enabling-force-pushes-to-a-protected-branch)\" in the GitHub Help documentation.'\n      )\n      .optional(),\n    block_creations: z\n      .boolean()\n      .describe(\n        'If set to `true`, the `restrictions` branch protection settings which limits who can push will also block pushes which create new branches, unless the push is initiated by a user, team, or app which has the ability to push. Set to `true` to restrict new branch creation. Default: `false`.'\n      )\n      .optional(),\n    required_conversation_resolution: z\n      .boolean()\n      .describe(\n        'Requires all conversations on code to be resolved before a pull request can be merged into a branch that matches this rule. Set to `false` to disable. Default: `false`.'\n      )\n      .optional(),\n    lock_branch: z\n      .boolean()\n      .describe(\n        'Whether to set the branch as read-only. If this is true, users will not be able to push to the branch. Default: `false`.'\n      )\n      .default(false),\n    allow_fork_syncing: z\n      .boolean()\n      .describe(\n        'Whether users can pull changes from upstream when the branch is locked. Set to `true` to allow fork syncing. Set to `false` to prevent fork syncing. Default: `false`.'\n      )\n      .default(false),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposUpdateBranchProtectionParams = z.infer<\n    typeof ReposUpdateBranchProtectionParamsSchema\n  >\n\n  export const ReposUpdateBranchProtectionResponseSchema = ProtectedBranchSchema\n  export type ReposUpdateBranchProtectionResponse = z.infer<\n    typeof ReposUpdateBranchProtectionResponseSchema\n  >\n\n  export const ReposDeleteBranchProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposDeleteBranchProtectionParams = z.infer<\n    typeof ReposDeleteBranchProtectionParamsSchema\n  >\n\n  export type ReposDeleteBranchProtectionResponse = undefined\n\n  export const ReposGetAdminBranchProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetAdminBranchProtectionParams = z.infer<\n    typeof ReposGetAdminBranchProtectionParamsSchema\n  >\n\n  export const ReposGetAdminBranchProtectionResponseSchema =\n    ProtectedBranchAdminEnforcedSchema\n  export type ReposGetAdminBranchProtectionResponse = z.infer<\n    typeof ReposGetAdminBranchProtectionResponseSchema\n  >\n\n  export const ReposSetAdminBranchProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposSetAdminBranchProtectionParams = z.infer<\n    typeof ReposSetAdminBranchProtectionParamsSchema\n  >\n\n  export const ReposSetAdminBranchProtectionResponseSchema =\n    ProtectedBranchAdminEnforcedSchema\n  export type ReposSetAdminBranchProtectionResponse = z.infer<\n    typeof ReposSetAdminBranchProtectionResponseSchema\n  >\n\n  export const ReposDeleteAdminBranchProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposDeleteAdminBranchProtectionParams = z.infer<\n    typeof ReposDeleteAdminBranchProtectionParamsSchema\n  >\n\n  export type ReposDeleteAdminBranchProtectionResponse = undefined\n\n  export const ReposGetPullRequestReviewProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetPullRequestReviewProtectionParams = z.infer<\n    typeof ReposGetPullRequestReviewProtectionParamsSchema\n  >\n\n  export const ReposGetPullRequestReviewProtectionResponseSchema =\n    ProtectedBranchPullRequestReviewSchema\n  export type ReposGetPullRequestReviewProtectionResponse = z.infer<\n    typeof ReposGetPullRequestReviewProtectionResponseSchema\n  >\n\n  export const ReposDeletePullRequestReviewProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposDeletePullRequestReviewProtectionParams = z.infer<\n    typeof ReposDeletePullRequestReviewProtectionParamsSchema\n  >\n\n  export type ReposDeletePullRequestReviewProtectionResponse = undefined\n\n  export const ReposUpdatePullRequestReviewProtectionParamsSchema = z.object({\n    dismissal_restrictions: z\n      .object({\n        users: z\n          .array(z.string())\n          .describe('The list of user `login`s with dismissal access')\n          .optional(),\n        teams: z\n          .array(z.string())\n          .describe('The list of team `slug`s with dismissal access')\n          .optional(),\n        apps: z\n          .array(z.string())\n          .describe('The list of app `slug`s with dismissal access')\n          .optional()\n      })\n      .describe(\n        'Specify which users, teams, and apps can dismiss pull request reviews. Pass an empty `dismissal_restrictions` object to disable. User and team `dismissal_restrictions` are only available for organization-owned repositories. Omit this parameter for personal repositories.'\n      )\n      .optional(),\n    dismiss_stale_reviews: z\n      .boolean()\n      .describe(\n        'Set to `true` if you want to automatically dismiss approving reviews when someone pushes a new commit.'\n      )\n      .optional(),\n    require_code_owner_reviews: z\n      .boolean()\n      .describe(\n        'Blocks merging pull requests until [code owners](https://docs.github.com/articles/about-code-owners/) have reviewed.'\n      )\n      .optional(),\n    required_approving_review_count: z\n      .number()\n      .int()\n      .describe(\n        'Specifies the number of reviewers required to approve pull requests. Use a number between 1 and 6 or 0 to not require reviewers.'\n      )\n      .optional(),\n    require_last_push_approval: z\n      .boolean()\n      .describe(\n        'Whether the most recent push must be approved by someone other than the person who pushed it. Default: `false`'\n      )\n      .default(false),\n    bypass_pull_request_allowances: z\n      .object({\n        users: z\n          .array(z.string())\n          .describe(\n            'The list of user `login`s allowed to bypass pull request requirements.'\n          )\n          .optional(),\n        teams: z\n          .array(z.string())\n          .describe(\n            'The list of team `slug`s allowed to bypass pull request requirements.'\n          )\n          .optional(),\n        apps: z\n          .array(z.string())\n          .describe(\n            'The list of app `slug`s allowed to bypass pull request requirements.'\n          )\n          .optional()\n      })\n      .describe(\n        'Allow specific users, teams, or apps to bypass pull request requirements.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposUpdatePullRequestReviewProtectionParams = z.infer<\n    typeof ReposUpdatePullRequestReviewProtectionParamsSchema\n  >\n\n  export const ReposUpdatePullRequestReviewProtectionResponseSchema =\n    ProtectedBranchPullRequestReviewSchema\n  export type ReposUpdatePullRequestReviewProtectionResponse = z.infer<\n    typeof ReposUpdatePullRequestReviewProtectionResponseSchema\n  >\n\n  export const ReposGetCommitSignatureProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetCommitSignatureProtectionParams = z.infer<\n    typeof ReposGetCommitSignatureProtectionParamsSchema\n  >\n\n  export const ReposGetCommitSignatureProtectionResponseSchema =\n    ProtectedBranchAdminEnforcedSchema\n  export type ReposGetCommitSignatureProtectionResponse = z.infer<\n    typeof ReposGetCommitSignatureProtectionResponseSchema\n  >\n\n  export const ReposCreateCommitSignatureProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposCreateCommitSignatureProtectionParams = z.infer<\n    typeof ReposCreateCommitSignatureProtectionParamsSchema\n  >\n\n  export const ReposCreateCommitSignatureProtectionResponseSchema =\n    ProtectedBranchAdminEnforcedSchema\n  export type ReposCreateCommitSignatureProtectionResponse = z.infer<\n    typeof ReposCreateCommitSignatureProtectionResponseSchema\n  >\n\n  export const ReposDeleteCommitSignatureProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposDeleteCommitSignatureProtectionParams = z.infer<\n    typeof ReposDeleteCommitSignatureProtectionParamsSchema\n  >\n\n  export type ReposDeleteCommitSignatureProtectionResponse = undefined\n\n  export const ReposGetStatusChecksProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetStatusChecksProtectionParams = z.infer<\n    typeof ReposGetStatusChecksProtectionParamsSchema\n  >\n\n  export const ReposGetStatusChecksProtectionResponseSchema =\n    StatusCheckPolicySchema\n  export type ReposGetStatusChecksProtectionResponse = z.infer<\n    typeof ReposGetStatusChecksProtectionResponseSchema\n  >\n\n  export const ReposRemoveStatusCheckProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposRemoveStatusCheckProtectionParams = z.infer<\n    typeof ReposRemoveStatusCheckProtectionParamsSchema\n  >\n\n  export type ReposRemoveStatusCheckProtectionResponse = undefined\n\n  export const ReposUpdateStatusCheckProtectionParamsSchema = z.object({\n    strict: z\n      .boolean()\n      .describe('Require branches to be up to date before merging.')\n      .optional(),\n    contexts: z\n      .array(z.string())\n      .describe(\n        '**Closing down notice**: The list of status checks to require in order to merge into this branch. If any of these checks have recently been set by a particular GitHub App, they will be required to come from that app in future for the branch to merge. Use `checks` instead of `contexts` for more fine-grained control.'\n      )\n      .optional(),\n    checks: z\n      .array(\n        z.object({\n          context: z.string().describe('The name of the required check'),\n          app_id: z\n            .number()\n            .int()\n            .describe(\n              'The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.'\n            )\n            .optional()\n        })\n      )\n      .describe(\n        'The list of status checks to require in order to merge into this branch.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposUpdateStatusCheckProtectionParams = z.infer<\n    typeof ReposUpdateStatusCheckProtectionParamsSchema\n  >\n\n  export const ReposUpdateStatusCheckProtectionResponseSchema =\n    StatusCheckPolicySchema\n  export type ReposUpdateStatusCheckProtectionResponse = z.infer<\n    typeof ReposUpdateStatusCheckProtectionResponseSchema\n  >\n\n  export const ReposGetAllStatusCheckContextsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetAllStatusCheckContextsParams = z.infer<\n    typeof ReposGetAllStatusCheckContextsParamsSchema\n  >\n\n  export const ReposGetAllStatusCheckContextsResponseSchema = z.array(\n    z.string()\n  )\n  export type ReposGetAllStatusCheckContextsResponse = z.infer<\n    typeof ReposGetAllStatusCheckContextsResponseSchema\n  >\n\n  export const ReposAddStatusCheckContextsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      branch: z\n        .string()\n        .describe(\n          'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n        )\n    })\n    .and(\n      z.union([\n        z.object({\n          contexts: z\n            .array(z.string())\n            .describe('The name of the status checks')\n        }),\n        z.array(z.string()).describe('The name of the status checks')\n      ])\n    )\n  export type ReposAddStatusCheckContextsParams = z.infer<\n    typeof ReposAddStatusCheckContextsParamsSchema\n  >\n\n  export const ReposAddStatusCheckContextsResponseSchema = z.array(z.string())\n  export type ReposAddStatusCheckContextsResponse = z.infer<\n    typeof ReposAddStatusCheckContextsResponseSchema\n  >\n\n  export const ReposSetStatusCheckContextsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      branch: z\n        .string()\n        .describe(\n          'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n        )\n    })\n    .and(\n      z.union([\n        z.object({\n          contexts: z\n            .array(z.string())\n            .describe('The name of the status checks')\n        }),\n        z.array(z.string()).describe('The name of the status checks')\n      ])\n    )\n  export type ReposSetStatusCheckContextsParams = z.infer<\n    typeof ReposSetStatusCheckContextsParamsSchema\n  >\n\n  export const ReposSetStatusCheckContextsResponseSchema = z.array(z.string())\n  export type ReposSetStatusCheckContextsResponse = z.infer<\n    typeof ReposSetStatusCheckContextsResponseSchema\n  >\n\n  export const ReposRemoveStatusCheckContextsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      branch: z\n        .string()\n        .describe(\n          'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n        )\n    })\n    .and(\n      z.union([\n        z.object({\n          contexts: z\n            .array(z.string())\n            .describe('The name of the status checks')\n        }),\n        z.array(z.string()).describe('The name of the status checks')\n      ])\n    )\n  export type ReposRemoveStatusCheckContextsParams = z.infer<\n    typeof ReposRemoveStatusCheckContextsParamsSchema\n  >\n\n  export const ReposRemoveStatusCheckContextsResponseSchema = z.array(\n    z.string()\n  )\n  export type ReposRemoveStatusCheckContextsResponse = z.infer<\n    typeof ReposRemoveStatusCheckContextsResponseSchema\n  >\n\n  export const ReposGetAccessRestrictionsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetAccessRestrictionsParams = z.infer<\n    typeof ReposGetAccessRestrictionsParamsSchema\n  >\n\n  export const ReposGetAccessRestrictionsResponseSchema =\n    BranchRestrictionPolicySchema\n  export type ReposGetAccessRestrictionsResponse = z.infer<\n    typeof ReposGetAccessRestrictionsResponseSchema\n  >\n\n  export const ReposDeleteAccessRestrictionsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposDeleteAccessRestrictionsParams = z.infer<\n    typeof ReposDeleteAccessRestrictionsParamsSchema\n  >\n\n  export type ReposDeleteAccessRestrictionsResponse = undefined\n\n  export const ReposGetAppsWithAccessToProtectedBranchParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetAppsWithAccessToProtectedBranchParams = z.infer<\n    typeof ReposGetAppsWithAccessToProtectedBranchParamsSchema\n  >\n\n  export const ReposGetAppsWithAccessToProtectedBranchResponseSchema =\n    z.array(IntegrationSchema)\n  export type ReposGetAppsWithAccessToProtectedBranchResponse = z.infer<\n    typeof ReposGetAppsWithAccessToProtectedBranchResponseSchema\n  >\n\n  export const ReposAddAppAccessRestrictionsParamsSchema = z.object({\n    apps: z\n      .array(z.string())\n      .describe(\n        'The GitHub Apps that have push access to this branch. Use the slugified version of the app name. **Note**: The list of users, apps, and teams in total is limited to 100 items.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposAddAppAccessRestrictionsParams = z.infer<\n    typeof ReposAddAppAccessRestrictionsParamsSchema\n  >\n\n  export const ReposAddAppAccessRestrictionsResponseSchema =\n    z.array(IntegrationSchema)\n  export type ReposAddAppAccessRestrictionsResponse = z.infer<\n    typeof ReposAddAppAccessRestrictionsResponseSchema\n  >\n\n  export const ReposSetAppAccessRestrictionsParamsSchema = z.object({\n    apps: z\n      .array(z.string())\n      .describe(\n        'The GitHub Apps that have push access to this branch. Use the slugified version of the app name. **Note**: The list of users, apps, and teams in total is limited to 100 items.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposSetAppAccessRestrictionsParams = z.infer<\n    typeof ReposSetAppAccessRestrictionsParamsSchema\n  >\n\n  export const ReposSetAppAccessRestrictionsResponseSchema =\n    z.array(IntegrationSchema)\n  export type ReposSetAppAccessRestrictionsResponse = z.infer<\n    typeof ReposSetAppAccessRestrictionsResponseSchema\n  >\n\n  export const ReposRemoveAppAccessRestrictionsParamsSchema = z.object({\n    apps: z\n      .array(z.string())\n      .describe(\n        'The GitHub Apps that have push access to this branch. Use the slugified version of the app name. **Note**: The list of users, apps, and teams in total is limited to 100 items.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposRemoveAppAccessRestrictionsParams = z.infer<\n    typeof ReposRemoveAppAccessRestrictionsParamsSchema\n  >\n\n  export const ReposRemoveAppAccessRestrictionsResponseSchema =\n    z.array(IntegrationSchema)\n  export type ReposRemoveAppAccessRestrictionsResponse = z.infer<\n    typeof ReposRemoveAppAccessRestrictionsResponseSchema\n  >\n\n  export const ReposGetTeamsWithAccessToProtectedBranchParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetTeamsWithAccessToProtectedBranchParams = z.infer<\n    typeof ReposGetTeamsWithAccessToProtectedBranchParamsSchema\n  >\n\n  export const ReposGetTeamsWithAccessToProtectedBranchResponseSchema =\n    z.array(TeamSchema)\n  export type ReposGetTeamsWithAccessToProtectedBranchResponse = z.infer<\n    typeof ReposGetTeamsWithAccessToProtectedBranchResponseSchema\n  >\n\n  export const ReposAddTeamAccessRestrictionsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      branch: z\n        .string()\n        .describe(\n          'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n        )\n    })\n    .and(\n      z.union([\n        z.object({\n          teams: z.array(z.string()).describe('The slug values for teams')\n        }),\n        z.array(z.string()).describe('The slug values for teams')\n      ])\n    )\n  export type ReposAddTeamAccessRestrictionsParams = z.infer<\n    typeof ReposAddTeamAccessRestrictionsParamsSchema\n  >\n\n  export const ReposAddTeamAccessRestrictionsResponseSchema =\n    z.array(TeamSchema)\n  export type ReposAddTeamAccessRestrictionsResponse = z.infer<\n    typeof ReposAddTeamAccessRestrictionsResponseSchema\n  >\n\n  export const ReposSetTeamAccessRestrictionsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      branch: z\n        .string()\n        .describe(\n          'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n        )\n    })\n    .and(\n      z.union([\n        z.object({\n          teams: z.array(z.string()).describe('The slug values for teams')\n        }),\n        z.array(z.string()).describe('The slug values for teams')\n      ])\n    )\n  export type ReposSetTeamAccessRestrictionsParams = z.infer<\n    typeof ReposSetTeamAccessRestrictionsParamsSchema\n  >\n\n  export const ReposSetTeamAccessRestrictionsResponseSchema =\n    z.array(TeamSchema)\n  export type ReposSetTeamAccessRestrictionsResponse = z.infer<\n    typeof ReposSetTeamAccessRestrictionsResponseSchema\n  >\n\n  export const ReposRemoveTeamAccessRestrictionsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      branch: z\n        .string()\n        .describe(\n          'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n        )\n    })\n    .and(\n      z.union([\n        z.object({\n          teams: z.array(z.string()).describe('The slug values for teams')\n        }),\n        z.array(z.string()).describe('The slug values for teams')\n      ])\n    )\n  export type ReposRemoveTeamAccessRestrictionsParams = z.infer<\n    typeof ReposRemoveTeamAccessRestrictionsParamsSchema\n  >\n\n  export const ReposRemoveTeamAccessRestrictionsResponseSchema =\n    z.array(TeamSchema)\n  export type ReposRemoveTeamAccessRestrictionsResponse = z.infer<\n    typeof ReposRemoveTeamAccessRestrictionsResponseSchema\n  >\n\n  export const ReposGetUsersWithAccessToProtectedBranchParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposGetUsersWithAccessToProtectedBranchParams = z.infer<\n    typeof ReposGetUsersWithAccessToProtectedBranchParamsSchema\n  >\n\n  export const ReposGetUsersWithAccessToProtectedBranchResponseSchema =\n    z.array(SimpleUserSchema)\n  export type ReposGetUsersWithAccessToProtectedBranchResponse = z.infer<\n    typeof ReposGetUsersWithAccessToProtectedBranchResponseSchema\n  >\n\n  export const ReposAddUserAccessRestrictionsParamsSchema = z.object({\n    users: z.array(z.string()).describe('The username for users'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposAddUserAccessRestrictionsParams = z.infer<\n    typeof ReposAddUserAccessRestrictionsParamsSchema\n  >\n\n  export const ReposAddUserAccessRestrictionsResponseSchema =\n    z.array(SimpleUserSchema)\n  export type ReposAddUserAccessRestrictionsResponse = z.infer<\n    typeof ReposAddUserAccessRestrictionsResponseSchema\n  >\n\n  export const ReposSetUserAccessRestrictionsParamsSchema = z.object({\n    users: z.array(z.string()).describe('The username for users'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposSetUserAccessRestrictionsParams = z.infer<\n    typeof ReposSetUserAccessRestrictionsParamsSchema\n  >\n\n  export const ReposSetUserAccessRestrictionsResponseSchema =\n    z.array(SimpleUserSchema)\n  export type ReposSetUserAccessRestrictionsResponse = z.infer<\n    typeof ReposSetUserAccessRestrictionsResponseSchema\n  >\n\n  export const ReposRemoveUserAccessRestrictionsParamsSchema = z.object({\n    users: z.array(z.string()).describe('The username for users'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposRemoveUserAccessRestrictionsParams = z.infer<\n    typeof ReposRemoveUserAccessRestrictionsParamsSchema\n  >\n\n  export const ReposRemoveUserAccessRestrictionsResponseSchema =\n    z.array(SimpleUserSchema)\n  export type ReposRemoveUserAccessRestrictionsResponse = z.infer<\n    typeof ReposRemoveUserAccessRestrictionsResponseSchema\n  >\n\n  export const ReposRenameBranchParamsSchema = z.object({\n    new_name: z.string().describe('The new name of the branch.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      )\n  })\n  export type ReposRenameBranchParams = z.infer<\n    typeof ReposRenameBranchParamsSchema\n  >\n\n  export type ReposRenameBranchResponse = undefined\n\n  export const ChecksCreateParamsSchema = z\n    .object({\n      name: z\n        .string()\n        .describe('The name of the check. For example, \"code-coverage\".'),\n      head_sha: z.string().describe('The SHA of the commit.'),\n      details_url: z\n        .string()\n        .describe(\n          \"The URL of the integrator's site that has the full details of the check. If the integrator does not provide this, then the homepage of the GitHub app is used.\"\n        )\n        .optional(),\n      external_id: z\n        .string()\n        .describe(\"A reference for the run on the integrator's system.\")\n        .optional(),\n      status: z\n        .enum([\n          'queued',\n          'in_progress',\n          'completed',\n          'waiting',\n          'requested',\n          'pending'\n        ])\n        .describe(\n          'The current status of the check run. Only GitHub Actions can set a status of `waiting`, `pending`, or `requested`.'\n        )\n        .default('queued'),\n      started_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time that the check run began. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      conclusion: z\n        .enum([\n          'action_required',\n          'cancelled',\n          'failure',\n          'neutral',\n          'success',\n          'skipped',\n          'stale',\n          'timed_out'\n        ])\n        .describe(\n          '**Required if you provide `completed_at` or a `status` of `completed`**. The final conclusion of the check. \\n**Note:** Providing `conclusion` will automatically set the `status` parameter to `completed`. You cannot change a check run conclusion to `stale`, only GitHub can set this.'\n        )\n        .optional(),\n      completed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time the check completed. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      output: z\n        .object({\n          title: z.string().describe('The title of the check run.'),\n          summary: z\n            .string()\n            .max(65_535)\n            .describe(\n              'The summary of the check run. This parameter supports Markdown. **Maximum length**: 65535 characters.'\n            ),\n          text: z\n            .string()\n            .max(65_535)\n            .describe(\n              'The details of the check run. This parameter supports Markdown. **Maximum length**: 65535 characters.'\n            )\n            .optional(),\n          annotations: z\n            .array(\n              z.object({\n                path: z\n                  .string()\n                  .describe(\n                    'The path of the file to add an annotation to. For example, `assets/css/main.css`.'\n                  ),\n                start_line: z\n                  .number()\n                  .int()\n                  .describe(\n                    'The start line of the annotation. Line numbers start at 1.'\n                  ),\n                end_line: z\n                  .number()\n                  .int()\n                  .describe('The end line of the annotation.'),\n                start_column: z\n                  .number()\n                  .int()\n                  .describe(\n                    'The start column of the annotation. Annotations only support `start_column` and `end_column` on the same line. Omit this parameter if `start_line` and `end_line` have different values. Column numbers start at 1.'\n                  )\n                  .optional(),\n                end_column: z\n                  .number()\n                  .int()\n                  .describe(\n                    'The end column of the annotation. Annotations only support `start_column` and `end_column` on the same line. Omit this parameter if `start_line` and `end_line` have different values.'\n                  )\n                  .optional(),\n                annotation_level: z\n                  .enum(['notice', 'warning', 'failure'])\n                  .describe('The level of the annotation.'),\n                message: z\n                  .string()\n                  .describe(\n                    'A short description of the feedback for these lines of code. The maximum size is 64 KB.'\n                  ),\n                title: z\n                  .string()\n                  .describe(\n                    'The title that represents the annotation. The maximum size is 255 characters.'\n                  )\n                  .optional(),\n                raw_details: z\n                  .string()\n                  .describe(\n                    'Details about this annotation. The maximum size is 64 KB.'\n                  )\n                  .optional()\n              })\n            )\n            .max(50)\n            .describe(\n              'Adds information from your analysis to specific lines of code. Annotations are visible on GitHub in the **Checks** and **Files changed** tab of the pull request. The Checks API limits the number of annotations to a maximum of 50 per API request. To create more than 50 annotations, you have to make multiple requests to the [Update a check run](https://docs.github.com/rest/checks/runs#update-a-check-run) endpoint. Each time you update the check run, annotations are appended to the list of annotations that already exist for the check run. GitHub Actions are limited to 10 warning annotations and 10 error annotations per step. For details about how you can view annotations on GitHub, see \"[About status checks](https://docs.github.com/articles/about-status-checks#checks)\".'\n            )\n            .optional(),\n          images: z\n            .array(\n              z.object({\n                alt: z.string().describe('The alternative text for the image.'),\n                image_url: z.string().describe('The full URL of the image.'),\n                caption: z\n                  .string()\n                  .describe('A short image description.')\n                  .optional()\n              })\n            )\n            .describe(\n              'Adds images to the output displayed in the GitHub pull request UI.'\n            )\n            .optional()\n        })\n        .describe(\n          'Check runs can accept a variety of data in the `output` object, including a `title` and `summary` and can optionally provide descriptive details about the run.'\n        )\n        .optional(),\n      actions: z\n        .array(\n          z.object({\n            label: z\n              .string()\n              .max(20)\n              .describe(\n                'The text to be displayed on a button in the web UI. The maximum size is 20 characters.'\n              ),\n            description: z\n              .string()\n              .max(40)\n              .describe(\n                'A short explanation of what this action would do. The maximum size is 40 characters.'\n              ),\n            identifier: z\n              .string()\n              .max(20)\n              .describe(\n                \"A reference for the action on the integrator's system. The maximum size is 20 characters.\"\n              )\n          })\n        )\n        .max(3)\n        .describe(\n          'Displays a button on GitHub that can be clicked to alert your app to do additional tasks. For example, a code linting app can display a button that automatically fixes detected errors. The button created in this object is displayed after the check run completes. When a user clicks the button, GitHub sends the [`check_run.requested_action` webhook](https://docs.github.com/webhooks/event-payloads/#check_run) to your app. Each action includes a `label`, `identifier` and `description`. A maximum of three actions are accepted. To learn more about check runs and requested actions, see \"[Check runs and requested actions](https://docs.github.com/rest/guides/using-the-rest-api-to-interact-with-checks#check-runs-and-requested-actions).\"'\n        )\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .and(\n      z.union([\n        z.object({ status: z.literal('completed') }).catchall(z.any()),\n        z\n          .object({ status: z.enum(['queued', 'in_progress']).optional() })\n          .catchall(z.any())\n      ])\n    )\n  export type ChecksCreateParams = z.infer<typeof ChecksCreateParamsSchema>\n\n  export type ChecksCreateResponse = undefined\n\n  export const ChecksGetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    check_run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the check run.')\n  })\n  export type ChecksGetParams = z.infer<typeof ChecksGetParamsSchema>\n\n  export const ChecksGetResponseSchema = CheckRunSchema\n  export type ChecksGetResponse = z.infer<typeof ChecksGetResponseSchema>\n\n  export const ChecksUpdateParamsSchema = z\n    .object({\n      name: z\n        .string()\n        .describe('The name of the check. For example, \"code-coverage\".')\n        .optional(),\n      details_url: z\n        .string()\n        .describe(\n          \"The URL of the integrator's site that has the full details of the check.\"\n        )\n        .optional(),\n      external_id: z\n        .string()\n        .describe(\"A reference for the run on the integrator's system.\")\n        .optional(),\n      started_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      status: z\n        .enum([\n          'queued',\n          'in_progress',\n          'completed',\n          'waiting',\n          'requested',\n          'pending'\n        ])\n        .describe(\n          'The current status of the check run. Only GitHub Actions can set a status of `waiting`, `pending`, or `requested`.'\n        )\n        .optional(),\n      conclusion: z\n        .enum([\n          'action_required',\n          'cancelled',\n          'failure',\n          'neutral',\n          'success',\n          'skipped',\n          'stale',\n          'timed_out'\n        ])\n        .describe(\n          '**Required if you provide `completed_at` or a `status` of `completed`**. The final conclusion of the check. \\n**Note:** Providing `conclusion` will automatically set the `status` parameter to `completed`. You cannot change a check run conclusion to `stale`, only GitHub can set this.'\n        )\n        .optional(),\n      completed_at: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'The time the check completed. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      output: z\n        .object({\n          title: z.string().describe('**Required**.').optional(),\n          summary: z.string().max(65_535).describe('Can contain Markdown.'),\n          text: z\n            .string()\n            .max(65_535)\n            .describe('Can contain Markdown.')\n            .optional(),\n          annotations: z\n            .array(\n              z.object({\n                path: z\n                  .string()\n                  .describe(\n                    'The path of the file to add an annotation to. For example, `assets/css/main.css`.'\n                  ),\n                start_line: z\n                  .number()\n                  .int()\n                  .describe(\n                    'The start line of the annotation. Line numbers start at 1.'\n                  ),\n                end_line: z\n                  .number()\n                  .int()\n                  .describe('The end line of the annotation.'),\n                start_column: z\n                  .number()\n                  .int()\n                  .describe(\n                    'The start column of the annotation. Annotations only support `start_column` and `end_column` on the same line. Omit this parameter if `start_line` and `end_line` have different values. Column numbers start at 1.'\n                  )\n                  .optional(),\n                end_column: z\n                  .number()\n                  .int()\n                  .describe(\n                    'The end column of the annotation. Annotations only support `start_column` and `end_column` on the same line. Omit this parameter if `start_line` and `end_line` have different values.'\n                  )\n                  .optional(),\n                annotation_level: z\n                  .enum(['notice', 'warning', 'failure'])\n                  .describe('The level of the annotation.'),\n                message: z\n                  .string()\n                  .describe(\n                    'A short description of the feedback for these lines of code. The maximum size is 64 KB.'\n                  ),\n                title: z\n                  .string()\n                  .describe(\n                    'The title that represents the annotation. The maximum size is 255 characters.'\n                  )\n                  .optional(),\n                raw_details: z\n                  .string()\n                  .describe(\n                    'Details about this annotation. The maximum size is 64 KB.'\n                  )\n                  .optional()\n              })\n            )\n            .max(50)\n            .describe(\n              'Adds information from your analysis to specific lines of code. Annotations are visible in GitHub\\'s pull request UI. Annotations are visible in GitHub\\'s pull request UI. The Checks API limits the number of annotations to a maximum of 50 per API request. To create more than 50 annotations, you have to make multiple requests to the [Update a check run](https://docs.github.com/rest/checks/runs#update-a-check-run) endpoint. Each time you update the check run, annotations are appended to the list of annotations that already exist for the check run. GitHub Actions are limited to 10 warning annotations and 10 error annotations per step. For details about annotations in the UI, see \"[About status checks](https://docs.github.com/articles/about-status-checks#checks)\".'\n            )\n            .optional(),\n          images: z\n            .array(\n              z.object({\n                alt: z.string().describe('The alternative text for the image.'),\n                image_url: z.string().describe('The full URL of the image.'),\n                caption: z\n                  .string()\n                  .describe('A short image description.')\n                  .optional()\n              })\n            )\n            .describe(\n              'Adds images to the output displayed in the GitHub pull request UI.'\n            )\n            .optional()\n        })\n        .describe(\n          'Check runs can accept a variety of data in the `output` object, including a `title` and `summary` and can optionally provide descriptive details about the run.'\n        )\n        .optional(),\n      actions: z\n        .array(\n          z.object({\n            label: z\n              .string()\n              .max(20)\n              .describe(\n                'The text to be displayed on a button in the web UI. The maximum size is 20 characters.'\n              ),\n            description: z\n              .string()\n              .max(40)\n              .describe(\n                'A short explanation of what this action would do. The maximum size is 40 characters.'\n              ),\n            identifier: z\n              .string()\n              .max(20)\n              .describe(\n                \"A reference for the action on the integrator's system. The maximum size is 20 characters.\"\n              )\n          })\n        )\n        .max(3)\n        .describe(\n          'Possible further actions the integrator can perform, which a user may trigger. Each action includes a `label`, `identifier` and `description`. A maximum of three actions are accepted. To learn more about check runs and requested actions, see \"[Check runs and requested actions](https://docs.github.com/rest/guides/using-the-rest-api-to-interact-with-checks#check-runs-and-requested-actions).\"'\n        )\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      check_run_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the check run.')\n    })\n    .and(\n      z.union([\n        z\n          .object({ status: z.literal('completed').optional() })\n          .catchall(z.any()),\n        z\n          .object({ status: z.enum(['queued', 'in_progress']).optional() })\n          .catchall(z.any())\n      ])\n    )\n  export type ChecksUpdateParams = z.infer<typeof ChecksUpdateParamsSchema>\n\n  export const ChecksUpdateResponseSchema = CheckRunSchema\n  export type ChecksUpdateResponse = z.infer<typeof ChecksUpdateResponseSchema>\n\n  export const ChecksListAnnotationsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    check_run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the check run.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ChecksListAnnotationsParams = z.infer<\n    typeof ChecksListAnnotationsParamsSchema\n  >\n\n  export const ChecksListAnnotationsResponseSchema = z.array(\n    CheckAnnotationSchema\n  )\n  export type ChecksListAnnotationsResponse = z.infer<\n    typeof ChecksListAnnotationsResponseSchema\n  >\n\n  export const ChecksRerequestRunParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    check_run_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the check run.')\n  })\n  export type ChecksRerequestRunParams = z.infer<\n    typeof ChecksRerequestRunParamsSchema\n  >\n\n  export type ChecksRerequestRunResponse = undefined\n\n  export const ChecksCreateSuiteParamsSchema = z.object({\n    head_sha: z.string().describe('The sha of the head commit.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ChecksCreateSuiteParams = z.infer<\n    typeof ChecksCreateSuiteParamsSchema\n  >\n\n  export const ChecksCreateSuiteResponseSchema = CheckSuiteSchema\n  export type ChecksCreateSuiteResponse = z.infer<\n    typeof ChecksCreateSuiteResponseSchema\n  >\n\n  export const ChecksSetSuitesPreferencesParamsSchema = z.object({\n    auto_trigger_checks: z\n      .array(\n        z.object({\n          app_id: z.number().int().describe('The `id` of the GitHub App.'),\n          setting: z\n            .boolean()\n            .describe(\n              'Set to `true` to enable automatic creation of CheckSuite events upon pushes to the repository, or `false` to disable them.'\n            )\n            .default(true)\n        })\n      )\n      .describe(\n        'Enables or disables automatic creation of CheckSuite events upon pushes to the repository. Enabled by default.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ChecksSetSuitesPreferencesParams = z.infer<\n    typeof ChecksSetSuitesPreferencesParamsSchema\n  >\n\n  export const ChecksSetSuitesPreferencesResponseSchema =\n    CheckSuitePreferenceSchema\n  export type ChecksSetSuitesPreferencesResponse = z.infer<\n    typeof ChecksSetSuitesPreferencesResponseSchema\n  >\n\n  export const ChecksGetSuiteParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    check_suite_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the check suite.')\n  })\n  export type ChecksGetSuiteParams = z.infer<typeof ChecksGetSuiteParamsSchema>\n\n  export const ChecksGetSuiteResponseSchema = CheckSuiteSchema\n  export type ChecksGetSuiteResponse = z.infer<\n    typeof ChecksGetSuiteResponseSchema\n  >\n\n  export const ChecksListForSuiteParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    check_suite_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the check suite.'),\n    check_name: z\n      .string()\n      .describe('Returns check runs with the specified `name`.')\n      .optional(),\n    status: z\n      .enum(['queued', 'in_progress', 'completed'])\n      .describe('Returns check runs with the specified `status`.')\n      .optional(),\n    filter: z\n      .enum(['latest', 'all'])\n      .describe(\n        'Filters check runs by their `completed_at` timestamp. `latest` returns the most recent check runs.'\n      )\n      .default('latest'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ChecksListForSuiteParams = z.infer<\n    typeof ChecksListForSuiteParamsSchema\n  >\n\n  export const ChecksListForSuiteResponseSchema = z.object({\n    total_count: z.number().int(),\n    check_runs: z.array(CheckRunSchema)\n  })\n  export type ChecksListForSuiteResponse = z.infer<\n    typeof ChecksListForSuiteResponseSchema\n  >\n\n  export const ChecksRerequestSuiteParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    check_suite_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the check suite.')\n  })\n  export type ChecksRerequestSuiteParams = z.infer<\n    typeof ChecksRerequestSuiteParamsSchema\n  >\n\n  export type ChecksRerequestSuiteResponse = undefined\n\n  export const CodeScanningListAlertsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    tool_name: z\n      .any()\n      .describe(\n        'The name of a code scanning tool. Only results by this tool will be listed. You can specify the tool by using either `tool_name` or `tool_guid`, but not both.'\n      )\n      .optional(),\n    tool_guid: z\n      .any()\n      .describe(\n        'The GUID of a code scanning tool. Only results by this tool will be listed. Note that some code scanning tools may not include a GUID in their analysis data. You can specify the tool by using either `tool_guid` or `tool_name`, but not both.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    ref: z\n      .any()\n      .describe(\n        'The Git reference for the results you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n      )\n      .optional(),\n    pr: z\n      .number()\n      .int()\n      .describe(\n        'The number of the pull request for the results you want to list.'\n      )\n      .optional(),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe('The property by which to sort the results.')\n      .default('created'),\n    state: z\n      .any()\n      .describe(\n        'If specified, only code scanning alerts with this state will be returned.'\n      )\n      .optional(),\n    severity: z\n      .any()\n      .describe(\n        'If specified, only code scanning alerts with this severity will be returned.'\n      )\n      .optional()\n  })\n  export type CodeScanningListAlertsForRepoParams = z.infer<\n    typeof CodeScanningListAlertsForRepoParamsSchema\n  >\n\n  export const CodeScanningListAlertsForRepoResponseSchema = z.array(\n    CodeScanningAlertItemsSchema\n  )\n  export type CodeScanningListAlertsForRepoResponse = z.infer<\n    typeof CodeScanningListAlertsForRepoResponseSchema\n  >\n\n  export const CodeScanningGetAlertParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      )\n  })\n  export type CodeScanningGetAlertParams = z.infer<\n    typeof CodeScanningGetAlertParamsSchema\n  >\n\n  export const CodeScanningGetAlertResponseSchema = CodeScanningAlertSchema\n  export type CodeScanningGetAlertResponse = z.infer<\n    typeof CodeScanningGetAlertResponseSchema\n  >\n\n  export const CodeScanningUpdateAlertParamsSchema = z.object({\n    state: CodeScanningAlertSetStateSchema,\n    dismissed_reason: CodeScanningAlertDismissedReasonSchema.optional(),\n    dismissed_comment: CodeScanningAlertDismissedCommentSchema.optional(),\n    create_request: CodeScanningAlertCreateRequestSchema.optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      )\n  })\n  export type CodeScanningUpdateAlertParams = z.infer<\n    typeof CodeScanningUpdateAlertParamsSchema\n  >\n\n  export const CodeScanningUpdateAlertResponseSchema = CodeScanningAlertSchema\n  export type CodeScanningUpdateAlertResponse = z.infer<\n    typeof CodeScanningUpdateAlertResponseSchema\n  >\n\n  export const CodeScanningGetAutofixParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      )\n  })\n  export type CodeScanningGetAutofixParams = z.infer<\n    typeof CodeScanningGetAutofixParamsSchema\n  >\n\n  export const CodeScanningGetAutofixResponseSchema = CodeScanningAutofixSchema\n  export type CodeScanningGetAutofixResponse = z.infer<\n    typeof CodeScanningGetAutofixResponseSchema\n  >\n\n  export const CodeScanningCreateAutofixParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      )\n  })\n  export type CodeScanningCreateAutofixParams = z.infer<\n    typeof CodeScanningCreateAutofixParamsSchema\n  >\n\n  export const CodeScanningCreateAutofixResponseSchema =\n    CodeScanningAutofixSchema\n  export type CodeScanningCreateAutofixResponse = z.infer<\n    typeof CodeScanningCreateAutofixResponseSchema\n  >\n\n  export const CodeScanningCommitAutofixParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      alert_number: z\n        .any()\n        .describe(\n          'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n        )\n    })\n    .merge(CodeScanningAutofixCommitsSchema)\n  export type CodeScanningCommitAutofixParams = z.infer<\n    typeof CodeScanningCommitAutofixParamsSchema\n  >\n\n  export type CodeScanningCommitAutofixResponse = undefined\n\n  export const CodeScanningListAlertInstancesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      ),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    ref: z\n      .any()\n      .describe(\n        'The Git reference for the results you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n      )\n      .optional(),\n    pr: z\n      .number()\n      .int()\n      .describe(\n        'The number of the pull request for the results you want to list.'\n      )\n      .optional()\n  })\n  export type CodeScanningListAlertInstancesParams = z.infer<\n    typeof CodeScanningListAlertInstancesParamsSchema\n  >\n\n  export const CodeScanningListAlertInstancesResponseSchema = z.array(\n    CodeScanningAlertInstanceSchema\n  )\n  export type CodeScanningListAlertInstancesResponse = z.infer<\n    typeof CodeScanningListAlertInstancesResponseSchema\n  >\n\n  export const CodeScanningListRecentAnalysesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    tool_name: z\n      .any()\n      .describe(\n        'The name of a code scanning tool. Only results by this tool will be listed. You can specify the tool by using either `tool_name` or `tool_guid`, but not both.'\n      )\n      .optional(),\n    tool_guid: z\n      .any()\n      .describe(\n        'The GUID of a code scanning tool. Only results by this tool will be listed. Note that some code scanning tools may not include a GUID in their analysis data. You can specify the tool by using either `tool_guid` or `tool_name`, but not both.'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    pr: z\n      .number()\n      .int()\n      .describe(\n        'The number of the pull request for the results you want to list.'\n      )\n      .optional(),\n    ref: z\n      .any()\n      .describe(\n        'The Git reference for the analyses you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n      )\n      .optional(),\n    sarif_id: z\n      .any()\n      .describe('Filter analyses belonging to the same SARIF upload.')\n      .optional(),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    sort: z\n      .literal('created')\n      .describe('The property by which to sort the results.')\n      .default('created')\n  })\n  export type CodeScanningListRecentAnalysesParams = z.infer<\n    typeof CodeScanningListRecentAnalysesParamsSchema\n  >\n\n  export const CodeScanningListRecentAnalysesResponseSchema = z.array(\n    CodeScanningAnalysisSchema\n  )\n  export type CodeScanningListRecentAnalysesResponse = z.infer<\n    typeof CodeScanningListRecentAnalysesResponseSchema\n  >\n\n  export const CodeScanningGetAnalysisParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    analysis_id: z\n      .number()\n      .int()\n      .describe(\n        'The ID of the analysis, as returned from the `GET /repos/{owner}/{repo}/code-scanning/analyses` operation.'\n      )\n  })\n  export type CodeScanningGetAnalysisParams = z.infer<\n    typeof CodeScanningGetAnalysisParamsSchema\n  >\n\n  export const CodeScanningGetAnalysisResponseSchema =\n    CodeScanningAnalysisSchema\n  export type CodeScanningGetAnalysisResponse = z.infer<\n    typeof CodeScanningGetAnalysisResponseSchema\n  >\n\n  export const CodeScanningDeleteAnalysisParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    analysis_id: z\n      .number()\n      .int()\n      .describe(\n        'The ID of the analysis, as returned from the `GET /repos/{owner}/{repo}/code-scanning/analyses` operation.'\n      ),\n    confirm_delete: z\n      .union([z.string(), z.null()])\n      .describe(\n        \"Allow deletion if the specified analysis is the last in a set. If you attempt to delete the final analysis in a set without setting this parameter to `true`, you'll get a 400 response with the message: `Analysis is last of its type and deletion may result in the loss of historical alert data. Please specify confirm_delete.`\"\n      )\n      .optional()\n  })\n  export type CodeScanningDeleteAnalysisParams = z.infer<\n    typeof CodeScanningDeleteAnalysisParamsSchema\n  >\n\n  export const CodeScanningDeleteAnalysisResponseSchema =\n    CodeScanningAnalysisDeletionSchema\n  export type CodeScanningDeleteAnalysisResponse = z.infer<\n    typeof CodeScanningDeleteAnalysisResponseSchema\n  >\n\n  export const CodeScanningListCodeqlDatabasesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type CodeScanningListCodeqlDatabasesParams = z.infer<\n    typeof CodeScanningListCodeqlDatabasesParamsSchema\n  >\n\n  export const CodeScanningListCodeqlDatabasesResponseSchema = z.array(\n    CodeScanningCodeqlDatabaseSchema\n  )\n  export type CodeScanningListCodeqlDatabasesResponse = z.infer<\n    typeof CodeScanningListCodeqlDatabasesResponseSchema\n  >\n\n  export const CodeScanningGetCodeqlDatabaseParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    language: z.string().describe('The language of the CodeQL database.')\n  })\n  export type CodeScanningGetCodeqlDatabaseParams = z.infer<\n    typeof CodeScanningGetCodeqlDatabaseParamsSchema\n  >\n\n  export const CodeScanningGetCodeqlDatabaseResponseSchema =\n    CodeScanningCodeqlDatabaseSchema\n  export type CodeScanningGetCodeqlDatabaseResponse = z.infer<\n    typeof CodeScanningGetCodeqlDatabaseResponseSchema\n  >\n\n  export const CodeScanningDeleteCodeqlDatabaseParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    language: z.string().describe('The language of the CodeQL database.')\n  })\n  export type CodeScanningDeleteCodeqlDatabaseParams = z.infer<\n    typeof CodeScanningDeleteCodeqlDatabaseParamsSchema\n  >\n\n  export type CodeScanningDeleteCodeqlDatabaseResponse = undefined\n\n  export const CodeScanningCreateVariantAnalysisParamsSchema = z\n    .object({\n      language: CodeScanningVariantAnalysisLanguageSchema,\n      query_pack: z\n        .string()\n        .describe(\n          'A Base64-encoded tarball containing a CodeQL query and all its dependencies'\n        ),\n      repositories: z\n        .array(z.string())\n        .describe(\n          'List of repository names (in the form `owner/repo-name`) to run the query against. Precisely one property from `repositories`, `repository_lists` and `repository_owners` is required.'\n        )\n        .optional(),\n      repository_lists: z\n        .array(z.string())\n        .max(1)\n        .describe(\n          'List of repository lists to run the query against. Precisely one property from `repositories`, `repository_lists` and `repository_owners` is required.'\n        )\n        .optional(),\n      repository_owners: z\n        .array(z.string())\n        .max(1)\n        .describe(\n          'List of organization or user names whose repositories the query should be run against. Precisely one property from `repositories`, `repository_lists` and `repository_owners` is required.'\n        )\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .and(z.union([z.any(), z.any(), z.any()]))\n  export type CodeScanningCreateVariantAnalysisParams = z.infer<\n    typeof CodeScanningCreateVariantAnalysisParamsSchema\n  >\n\n  export type CodeScanningCreateVariantAnalysisResponse = undefined\n\n  export const CodeScanningGetVariantAnalysisParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    codeql_variant_analysis_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the variant analysis.')\n  })\n  export type CodeScanningGetVariantAnalysisParams = z.infer<\n    typeof CodeScanningGetVariantAnalysisParamsSchema\n  >\n\n  export const CodeScanningGetVariantAnalysisResponseSchema =\n    CodeScanningVariantAnalysisSchema\n  export type CodeScanningGetVariantAnalysisResponse = z.infer<\n    typeof CodeScanningGetVariantAnalysisResponseSchema\n  >\n\n  export const CodeScanningGetVariantAnalysisRepoTaskParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z.string().describe('The name of the controller repository.'),\n    codeql_variant_analysis_id: z\n      .number()\n      .int()\n      .describe('The ID of the variant analysis.'),\n    repo_owner: z\n      .string()\n      .describe(\n        'The account owner of the variant analysis repository. The name is not case sensitive.'\n      ),\n    repo_name: z\n      .string()\n      .describe('The name of the variant analysis repository.')\n  })\n  export type CodeScanningGetVariantAnalysisRepoTaskParams = z.infer<\n    typeof CodeScanningGetVariantAnalysisRepoTaskParamsSchema\n  >\n\n  export const CodeScanningGetVariantAnalysisRepoTaskResponseSchema =\n    CodeScanningVariantAnalysisRepoTaskSchema\n  export type CodeScanningGetVariantAnalysisRepoTaskResponse = z.infer<\n    typeof CodeScanningGetVariantAnalysisRepoTaskResponseSchema\n  >\n\n  export const CodeScanningGetDefaultSetupParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type CodeScanningGetDefaultSetupParams = z.infer<\n    typeof CodeScanningGetDefaultSetupParamsSchema\n  >\n\n  export const CodeScanningGetDefaultSetupResponseSchema =\n    CodeScanningDefaultSetupSchema\n  export type CodeScanningGetDefaultSetupResponse = z.infer<\n    typeof CodeScanningGetDefaultSetupResponseSchema\n  >\n\n  export const CodeScanningUpdateDefaultSetupParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .merge(CodeScanningDefaultSetupUpdateSchema)\n  export type CodeScanningUpdateDefaultSetupParams = z.infer<\n    typeof CodeScanningUpdateDefaultSetupParamsSchema\n  >\n\n  export const CodeScanningUpdateDefaultSetupResponseSchema = EmptyObjectSchema\n  export type CodeScanningUpdateDefaultSetupResponse = z.infer<\n    typeof CodeScanningUpdateDefaultSetupResponseSchema\n  >\n\n  export const CodeScanningUploadSarifParamsSchema = z.object({\n    commit_sha: CodeScanningAnalysisCommitShaSchema,\n    ref: CodeScanningRefFullSchema,\n    sarif: CodeScanningAnalysisSarifFileSchema,\n    checkout_uri: z\n      .string()\n      .url()\n      .describe(\n        'The base directory used in the analysis, as it appears in the SARIF file.\\nThis property is used to convert file paths from absolute to relative, so that alerts can be mapped to their correct location in the repository.'\n      )\n      .optional(),\n    started_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The time that the analysis run began. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    tool_name: z\n      .string()\n      .describe(\n        'The name of the tool used to generate the code scanning analysis. If this parameter is not used, the tool name defaults to \"API\". If the uploaded SARIF contains a tool GUID, this will be available for filtering using the `tool_guid` parameter of operations such as `GET /repos/{owner}/{repo}/code-scanning/alerts`.'\n      )\n      .optional(),\n    validate: z\n      .boolean()\n      .describe(\n        'Whether the SARIF file will be validated according to the code scanning specifications.\\nThis parameter is intended to help integrators ensure that the uploaded SARIF files are correctly rendered by code scanning.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type CodeScanningUploadSarifParams = z.infer<\n    typeof CodeScanningUploadSarifParamsSchema\n  >\n\n  export type CodeScanningUploadSarifResponse = undefined\n\n  export const CodeScanningGetSarifParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    sarif_id: z.string().describe('The SARIF ID obtained after uploading.')\n  })\n  export type CodeScanningGetSarifParams = z.infer<\n    typeof CodeScanningGetSarifParamsSchema\n  >\n\n  export const CodeScanningGetSarifResponseSchema =\n    CodeScanningSarifsStatusSchema\n  export type CodeScanningGetSarifResponse = z.infer<\n    typeof CodeScanningGetSarifResponseSchema\n  >\n\n  export const CodeSecurityGetConfigurationForRepositoryParamsSchema = z.object(\n    {\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    }\n  )\n  export type CodeSecurityGetConfigurationForRepositoryParams = z.infer<\n    typeof CodeSecurityGetConfigurationForRepositoryParamsSchema\n  >\n\n  export const CodeSecurityGetConfigurationForRepositoryResponseSchema =\n    CodeSecurityConfigurationForRepositorySchema\n  export type CodeSecurityGetConfigurationForRepositoryResponse = z.infer<\n    typeof CodeSecurityGetConfigurationForRepositoryResponseSchema\n  >\n\n  export const ReposCodeownersErrorsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        \"A branch, tag or commit name used to determine which version of the CODEOWNERS file to use. Default: the repository's default branch (e.g. `main`)\"\n      )\n      .optional()\n  })\n  export type ReposCodeownersErrorsParams = z.infer<\n    typeof ReposCodeownersErrorsParamsSchema\n  >\n\n  export const ReposCodeownersErrorsResponseSchema = CodeownersErrorsSchema\n  export type ReposCodeownersErrorsResponse = z.infer<\n    typeof ReposCodeownersErrorsResponseSchema\n  >\n\n  export const CodespacesListInRepositoryForAuthenticatedUserParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type CodespacesListInRepositoryForAuthenticatedUserParams = z.infer<\n    typeof CodespacesListInRepositoryForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesListInRepositoryForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      codespaces: z.array(CodespaceSchema)\n    })\n  export type CodespacesListInRepositoryForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesListInRepositoryForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesCreateWithRepoForAuthenticatedUserParamsSchema =\n    z.object({\n      ref: z\n        .string()\n        .describe('Git ref (typically a branch name) for this codespace')\n        .optional(),\n      location: z\n        .string()\n        .describe(\n          'The requested location for a new codespace. Best efforts are made to respect this upon creation. Assigned by IP if not provided.'\n        )\n        .optional(),\n      geo: z\n        .enum(['EuropeWest', 'SoutheastAsia', 'UsEast', 'UsWest'])\n        .describe(\n          'The geographic area for this codespace. If not specified, the value is assigned by IP. This property replaces `location`, which is closing down.'\n        )\n        .optional(),\n      client_ip: z\n        .string()\n        .describe('IP for location auto-detection when proxying a request')\n        .optional(),\n      machine: z\n        .string()\n        .describe('Machine type to use for this codespace')\n        .optional(),\n      devcontainer_path: z\n        .string()\n        .describe('Path to devcontainer.json config to use for this codespace')\n        .optional(),\n      multi_repo_permissions_opt_out: z\n        .boolean()\n        .describe(\n          'Whether to authorize requested permissions from devcontainer.json'\n        )\n        .optional(),\n      working_directory: z\n        .string()\n        .describe('Working directory for this codespace')\n        .optional(),\n      idle_timeout_minutes: z\n        .number()\n        .int()\n        .describe('Time in minutes before codespace stops from inactivity')\n        .optional(),\n      display_name: z\n        .string()\n        .describe('Display name for this codespace')\n        .optional(),\n      retention_period_minutes: z\n        .number()\n        .int()\n        .describe(\n          'Duration in minutes after codespace has gone idle in which it will be deleted. Must be integer minutes between 0 and 43200 (30 days).'\n        )\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n  export type CodespacesCreateWithRepoForAuthenticatedUserParams = z.infer<\n    typeof CodespacesCreateWithRepoForAuthenticatedUserParamsSchema\n  >\n\n  export type CodespacesCreateWithRepoForAuthenticatedUserResponse = undefined\n\n  export const CodespacesListDevcontainersInRepositoryForAuthenticatedUserParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type CodespacesListDevcontainersInRepositoryForAuthenticatedUserParams =\n    z.infer<\n      typeof CodespacesListDevcontainersInRepositoryForAuthenticatedUserParamsSchema\n    >\n\n  export const CodespacesListDevcontainersInRepositoryForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      devcontainers: z.array(\n        z.object({\n          path: z.string(),\n          name: z.string().optional(),\n          display_name: z.string().optional()\n        })\n      )\n    })\n  export type CodespacesListDevcontainersInRepositoryForAuthenticatedUserResponse =\n    z.infer<\n      typeof CodespacesListDevcontainersInRepositoryForAuthenticatedUserResponseSchema\n    >\n\n  export const CodespacesRepoMachinesForAuthenticatedUserParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      location: z\n        .string()\n        .describe(\n          'The location to check for available machines. Assigned by IP if not provided.'\n        )\n        .optional(),\n      client_ip: z\n        .string()\n        .describe('IP for location auto-detection when proxying a request')\n        .optional(),\n      ref: z\n        .string()\n        .describe(\n          'The branch or commit to check for prebuild availability and devcontainer restrictions.'\n        )\n        .optional()\n    })\n  export type CodespacesRepoMachinesForAuthenticatedUserParams = z.infer<\n    typeof CodespacesRepoMachinesForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesRepoMachinesForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      machines: z.array(CodespaceMachineSchema)\n    })\n  export type CodespacesRepoMachinesForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesRepoMachinesForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesPreFlightWithRepoForAuthenticatedUserParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      ref: z\n        .string()\n        .describe(\n          'The branch or commit to check for a default devcontainer path. If not specified, the default branch will be checked.'\n        )\n        .optional(),\n      client_ip: z\n        .string()\n        .describe(\n          'An alternative IP for default location auto-detection, such as when proxying a request.'\n        )\n        .optional()\n    })\n  export type CodespacesPreFlightWithRepoForAuthenticatedUserParams = z.infer<\n    typeof CodespacesPreFlightWithRepoForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesPreFlightWithRepoForAuthenticatedUserResponseSchema =\n    z.object({\n      billable_owner: SimpleUserSchema.optional(),\n      defaults: z\n        .object({ location: z.string(), devcontainer_path: z.string() })\n        .optional()\n    })\n  export type CodespacesPreFlightWithRepoForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesPreFlightWithRepoForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesCheckPermissionsForDevcontainerParamsSchema = z.object(\n    {\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      ref: z\n        .string()\n        .describe(\n          'The git reference that points to the location of the devcontainer configuration to use for the permission check. The value of `ref` will typically be a branch name (`heads/BRANCH_NAME`). For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n        ),\n      devcontainer_path: z\n        .string()\n        .describe(\n          'Path to the devcontainer.json configuration to use for the permission check.'\n        )\n    }\n  )\n  export type CodespacesCheckPermissionsForDevcontainerParams = z.infer<\n    typeof CodespacesCheckPermissionsForDevcontainerParamsSchema\n  >\n\n  export const CodespacesCheckPermissionsForDevcontainerResponseSchema =\n    CodespacesPermissionsCheckForDevcontainerSchema\n  export type CodespacesCheckPermissionsForDevcontainerResponse = z.infer<\n    typeof CodespacesCheckPermissionsForDevcontainerResponseSchema\n  >\n\n  export const CodespacesListRepoSecretsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type CodespacesListRepoSecretsParams = z.infer<\n    typeof CodespacesListRepoSecretsParamsSchema\n  >\n\n  export const CodespacesListRepoSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(RepoCodespacesSecretSchema)\n  })\n  export type CodespacesListRepoSecretsResponse = z.infer<\n    typeof CodespacesListRepoSecretsResponseSchema\n  >\n\n  export const CodespacesGetRepoPublicKeyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type CodespacesGetRepoPublicKeyParams = z.infer<\n    typeof CodespacesGetRepoPublicKeyParamsSchema\n  >\n\n  export const CodespacesGetRepoPublicKeyResponseSchema =\n    CodespacesPublicKeySchema\n  export type CodespacesGetRepoPublicKeyResponse = z.infer<\n    typeof CodespacesGetRepoPublicKeyResponseSchema\n  >\n\n  export const CodespacesGetRepoSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesGetRepoSecretParams = z.infer<\n    typeof CodespacesGetRepoSecretParamsSchema\n  >\n\n  export const CodespacesGetRepoSecretResponseSchema =\n    RepoCodespacesSecretSchema\n  export type CodespacesGetRepoSecretResponse = z.infer<\n    typeof CodespacesGetRepoSecretResponseSchema\n  >\n\n  export const CodespacesCreateOrUpdateRepoSecretParamsSchema = z.object({\n    encrypted_value: z\n      .string()\n      .regex(\n        new RegExp(\n          '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n        )\n      )\n      .describe(\n        'Value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get a repository public key](https://docs.github.com/rest/codespaces/repository-secrets#get-a-repository-public-key) endpoint.'\n      )\n      .optional(),\n    key_id: z\n      .string()\n      .describe('ID of the key you used to encrypt the secret.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesCreateOrUpdateRepoSecretParams = z.infer<\n    typeof CodespacesCreateOrUpdateRepoSecretParamsSchema\n  >\n\n  export type CodespacesCreateOrUpdateRepoSecretResponse = undefined\n\n  export const CodespacesDeleteRepoSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesDeleteRepoSecretParams = z.infer<\n    typeof CodespacesDeleteRepoSecretParamsSchema\n  >\n\n  export type CodespacesDeleteRepoSecretResponse = undefined\n\n  export const ReposListCollaboratorsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    affiliation: z\n      .enum(['outside', 'direct', 'all'])\n      .describe(\n        'Filter collaborators returned by their affiliation. `outside` means all outside collaborators of an organization-owned repository. `direct` means all collaborators with permissions to an organization-owned repository, regardless of organization membership status. `all` means all collaborators the authenticated user can see.'\n      )\n      .default('all'),\n    permission: z\n      .enum(['pull', 'triage', 'push', 'maintain', 'admin'])\n      .describe(\n        'Filter collaborators by the permissions they have on the repository. If not specified, all collaborators will be returned.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListCollaboratorsParams = z.infer<\n    typeof ReposListCollaboratorsParamsSchema\n  >\n\n  export const ReposListCollaboratorsResponseSchema =\n    z.array(CollaboratorSchema)\n  export type ReposListCollaboratorsResponse = z.infer<\n    typeof ReposListCollaboratorsResponseSchema\n  >\n\n  export const ReposCheckCollaboratorParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type ReposCheckCollaboratorParams = z.infer<\n    typeof ReposCheckCollaboratorParamsSchema\n  >\n\n  export type ReposCheckCollaboratorResponse = undefined\n\n  export const ReposAddCollaboratorParamsSchema = z.object({\n    permission: z\n      .string()\n      .describe(\n        'The permission to grant the collaborator. **Only valid on organization-owned repositories.** We accept the following permissions to be set: `pull`, `triage`, `push`, `maintain`, `admin` and you can also specify a custom repository role name, if the owning organization has defined any.'\n      )\n      .default('push'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type ReposAddCollaboratorParams = z.infer<\n    typeof ReposAddCollaboratorParamsSchema\n  >\n\n  export type ReposAddCollaboratorResponse = undefined\n\n  export const ReposRemoveCollaboratorParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type ReposRemoveCollaboratorParams = z.infer<\n    typeof ReposRemoveCollaboratorParamsSchema\n  >\n\n  export type ReposRemoveCollaboratorResponse = undefined\n\n  export const ReposGetCollaboratorPermissionLevelParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type ReposGetCollaboratorPermissionLevelParams = z.infer<\n    typeof ReposGetCollaboratorPermissionLevelParamsSchema\n  >\n\n  export const ReposGetCollaboratorPermissionLevelResponseSchema =\n    RepositoryCollaboratorPermissionSchema\n  export type ReposGetCollaboratorPermissionLevelResponse = z.infer<\n    typeof ReposGetCollaboratorPermissionLevelResponseSchema\n  >\n\n  export const ReposListCommitCommentsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListCommitCommentsForRepoParams = z.infer<\n    typeof ReposListCommitCommentsForRepoParamsSchema\n  >\n\n  export const ReposListCommitCommentsForRepoResponseSchema =\n    z.array(CommitCommentSchema)\n  export type ReposListCommitCommentsForRepoResponse = z.infer<\n    typeof ReposListCommitCommentsForRepoResponseSchema\n  >\n\n  export const ReposGetCommitCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type ReposGetCommitCommentParams = z.infer<\n    typeof ReposGetCommitCommentParamsSchema\n  >\n\n  export const ReposGetCommitCommentResponseSchema = CommitCommentSchema\n  export type ReposGetCommitCommentResponse = z.infer<\n    typeof ReposGetCommitCommentResponseSchema\n  >\n\n  export const ReposDeleteCommitCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type ReposDeleteCommitCommentParams = z.infer<\n    typeof ReposDeleteCommitCommentParamsSchema\n  >\n\n  export type ReposDeleteCommitCommentResponse = undefined\n\n  export const ReposUpdateCommitCommentParamsSchema = z.object({\n    body: z.string().describe('The contents of the comment'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type ReposUpdateCommitCommentParams = z.infer<\n    typeof ReposUpdateCommitCommentParamsSchema\n  >\n\n  export const ReposUpdateCommitCommentResponseSchema = CommitCommentSchema\n  export type ReposUpdateCommitCommentResponse = z.infer<\n    typeof ReposUpdateCommitCommentResponseSchema\n  >\n\n  export const ReactionsListForCommitCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.'),\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to a commit comment.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReactionsListForCommitCommentParams = z.infer<\n    typeof ReactionsListForCommitCommentParamsSchema\n  >\n\n  export const ReactionsListForCommitCommentResponseSchema =\n    z.array(ReactionSchema)\n  export type ReactionsListForCommitCommentResponse = z.infer<\n    typeof ReactionsListForCommitCommentResponseSchema\n  >\n\n  export const ReactionsCreateForCommitCommentParamsSchema = z.object({\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the commit comment.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type ReactionsCreateForCommitCommentParams = z.infer<\n    typeof ReactionsCreateForCommitCommentParamsSchema\n  >\n\n  export const ReactionsCreateForCommitCommentResponseSchema = ReactionSchema\n  export type ReactionsCreateForCommitCommentResponse = z.infer<\n    typeof ReactionsCreateForCommitCommentResponseSchema\n  >\n\n  export const ReactionsDeleteForCommitCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.'),\n    reaction_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the reaction.')\n  })\n  export type ReactionsDeleteForCommitCommentParams = z.infer<\n    typeof ReactionsDeleteForCommitCommentParamsSchema\n  >\n\n  export type ReactionsDeleteForCommitCommentResponse = undefined\n\n  export const ReposListCommitsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    sha: z\n      .string()\n      .describe(\n        'SHA or branch to start listing commits from. Default: the repository’s default branch (usually `main`).'\n      )\n      .optional(),\n    path: z\n      .string()\n      .describe('Only commits containing this file path will be returned.')\n      .optional(),\n    author: z\n      .string()\n      .describe(\n        'GitHub username or email address to use to filter by commit author.'\n      )\n      .optional(),\n    committer: z\n      .string()\n      .describe(\n        'GitHub username or email address to use to filter by commit committer.'\n      )\n      .optional(),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`. Due to limitations of Git, timestamps must be between 1970-01-01 and 2099-12-31 (inclusive) or unexpected results may be returned.'\n      )\n      .optional(),\n    until: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only commits before this date will be returned. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`. Due to limitations of Git, timestamps must be between 1970-01-01 and 2099-12-31 (inclusive) or unexpected results may be returned.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListCommitsParams = z.infer<\n    typeof ReposListCommitsParamsSchema\n  >\n\n  export const ReposListCommitsResponseSchema = z.array(CommitSchema)\n  export type ReposListCommitsResponse = z.infer<\n    typeof ReposListCommitsResponseSchema\n  >\n\n  export const ReposListBranchesForHeadCommitParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    commit_sha: z.string().describe('The SHA of the commit.')\n  })\n  export type ReposListBranchesForHeadCommitParams = z.infer<\n    typeof ReposListBranchesForHeadCommitParamsSchema\n  >\n\n  export const ReposListBranchesForHeadCommitResponseSchema =\n    z.array(BranchShortSchema)\n  export type ReposListBranchesForHeadCommitResponse = z.infer<\n    typeof ReposListBranchesForHeadCommitResponseSchema\n  >\n\n  export const ReposListCommentsForCommitParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    commit_sha: z.string().describe('The SHA of the commit.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListCommentsForCommitParams = z.infer<\n    typeof ReposListCommentsForCommitParamsSchema\n  >\n\n  export const ReposListCommentsForCommitResponseSchema =\n    z.array(CommitCommentSchema)\n  export type ReposListCommentsForCommitResponse = z.infer<\n    typeof ReposListCommentsForCommitResponseSchema\n  >\n\n  export const ReposCreateCommitCommentParamsSchema = z.object({\n    body: z.string().describe('The contents of the comment.'),\n    path: z\n      .string()\n      .describe('Relative path of the file to comment on.')\n      .optional(),\n    position: z\n      .number()\n      .int()\n      .describe('Line index in the diff to comment on.')\n      .optional(),\n    line: z\n      .number()\n      .int()\n      .describe(\n        '**Closing down notice**. Use **position** parameter instead. Line number in the file to comment on.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    commit_sha: z.string().describe('The SHA of the commit.')\n  })\n  export type ReposCreateCommitCommentParams = z.infer<\n    typeof ReposCreateCommitCommentParamsSchema\n  >\n\n  export type ReposCreateCommitCommentResponse = undefined\n\n  export const ReposListPullRequestsAssociatedWithCommitParamsSchema = z.object(\n    {\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      commit_sha: z.string().describe('The SHA of the commit.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type ReposListPullRequestsAssociatedWithCommitParams = z.infer<\n    typeof ReposListPullRequestsAssociatedWithCommitParamsSchema\n  >\n\n  export const ReposListPullRequestsAssociatedWithCommitResponseSchema =\n    z.array(PullRequestSimpleSchema)\n  export type ReposListPullRequestsAssociatedWithCommitResponse = z.infer<\n    typeof ReposListPullRequestsAssociatedWithCommitResponseSchema\n  >\n\n  export const ReposGetCommitParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The commit reference. Can be a commit SHA, branch name (`heads/BRANCH_NAME`), or tag name (`tags/TAG_NAME`). For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      ),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type ReposGetCommitParams = z.infer<typeof ReposGetCommitParamsSchema>\n\n  export const ReposGetCommitResponseSchema = CommitSchema\n  export type ReposGetCommitResponse = z.infer<\n    typeof ReposGetCommitResponseSchema\n  >\n\n  export const ChecksListForRefParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The commit reference. Can be a commit SHA, branch name (`heads/BRANCH_NAME`), or tag name (`tags/TAG_NAME`). For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      ),\n    check_name: z\n      .string()\n      .describe('Returns check runs with the specified `name`.')\n      .optional(),\n    status: z\n      .enum(['queued', 'in_progress', 'completed'])\n      .describe('Returns check runs with the specified `status`.')\n      .optional(),\n    filter: z\n      .enum(['latest', 'all'])\n      .describe(\n        'Filters check runs by their `completed_at` timestamp. `latest` returns the most recent check runs.'\n      )\n      .default('latest'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    app_id: z.number().int().optional()\n  })\n  export type ChecksListForRefParams = z.infer<\n    typeof ChecksListForRefParamsSchema\n  >\n\n  export const ChecksListForRefResponseSchema = z.object({\n    total_count: z.number().int(),\n    check_runs: z.array(CheckRunSchema)\n  })\n  export type ChecksListForRefResponse = z.infer<\n    typeof ChecksListForRefResponseSchema\n  >\n\n  export const ChecksListSuitesForRefParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The commit reference. Can be a commit SHA, branch name (`heads/BRANCH_NAME`), or tag name (`tags/TAG_NAME`). For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      ),\n    app_id: z\n      .number()\n      .int()\n      .describe('Filters check suites by GitHub App `id`.')\n      .optional(),\n    check_name: z\n      .string()\n      .describe('Returns check runs with the specified `name`.')\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ChecksListSuitesForRefParams = z.infer<\n    typeof ChecksListSuitesForRefParamsSchema\n  >\n\n  export const ChecksListSuitesForRefResponseSchema = z.object({\n    total_count: z.number().int(),\n    check_suites: z.array(CheckSuiteSchema)\n  })\n  export type ChecksListSuitesForRefResponse = z.infer<\n    typeof ChecksListSuitesForRefResponseSchema\n  >\n\n  export const ReposGetCombinedStatusForRefParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The commit reference. Can be a commit SHA, branch name (`heads/BRANCH_NAME`), or tag name (`tags/TAG_NAME`). For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposGetCombinedStatusForRefParams = z.infer<\n    typeof ReposGetCombinedStatusForRefParamsSchema\n  >\n\n  export const ReposGetCombinedStatusForRefResponseSchema =\n    CombinedCommitStatusSchema\n  export type ReposGetCombinedStatusForRefResponse = z.infer<\n    typeof ReposGetCombinedStatusForRefResponseSchema\n  >\n\n  export const ReposListCommitStatusesForRefParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The commit reference. Can be a commit SHA, branch name (`heads/BRANCH_NAME`), or tag name (`tags/TAG_NAME`). For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListCommitStatusesForRefParams = z.infer<\n    typeof ReposListCommitStatusesForRefParamsSchema\n  >\n\n  export const ReposListCommitStatusesForRefResponseSchema =\n    z.array(StatusSchema)\n  export type ReposListCommitStatusesForRefResponse = z.infer<\n    typeof ReposListCommitStatusesForRefResponseSchema\n  >\n\n  export const ReposGetCommunityProfileMetricsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetCommunityProfileMetricsParams = z.infer<\n    typeof ReposGetCommunityProfileMetricsParamsSchema\n  >\n\n  export const ReposGetCommunityProfileMetricsResponseSchema =\n    CommunityProfileSchema\n  export type ReposGetCommunityProfileMetricsResponse = z.infer<\n    typeof ReposGetCommunityProfileMetricsResponseSchema\n  >\n\n  export const ReposCompareCommitsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    basehead: z\n      .string()\n      .describe(\n        'The base branch and head branch to compare. This parameter expects the format `BASE...HEAD`. Both must be branch names in `repo`. To compare with a branch that exists in a different repository in the same network as `repo`, the `basehead` parameter expects the format `USERNAME:BASE...USERNAME:HEAD`.'\n      ),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type ReposCompareCommitsParams = z.infer<\n    typeof ReposCompareCommitsParamsSchema\n  >\n\n  export const ReposCompareCommitsResponseSchema = CommitComparisonSchema\n  export type ReposCompareCommitsResponse = z.infer<\n    typeof ReposCompareCommitsResponseSchema\n  >\n\n  export const ReposGetContentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    path: z.string().describe('path parameter'),\n    ref: z\n      .string()\n      .describe(\n        'The name of the commit/branch/tag. Default: the repository’s default branch.'\n      )\n      .optional()\n  })\n  export type ReposGetContentParams = z.infer<\n    typeof ReposGetContentParamsSchema\n  >\n\n  export const ReposGetContentResponseSchema = z.union([\n    ContentDirectorySchema,\n    ContentFileSchema,\n    ContentSymlinkSchema,\n    ContentSubmoduleSchema\n  ])\n  export type ReposGetContentResponse = z.infer<\n    typeof ReposGetContentResponseSchema\n  >\n\n  export const ReposCreateOrUpdateFileContentsParamsSchema = z.object({\n    message: z.string().describe('The commit message.'),\n    content: z\n      .string()\n      .describe('The new file content, using Base64 encoding.'),\n    sha: z\n      .string()\n      .describe(\n        '**Required if you are updating a file**. The blob SHA of the file being replaced.'\n      )\n      .optional(),\n    branch: z\n      .string()\n      .describe('The branch name. Default: the repository’s default branch.')\n      .optional(),\n    committer: z\n      .object({\n        name: z\n          .string()\n          .describe(\n            \"The name of the author or committer of the commit. You'll receive a `422` status code if `name` is omitted.\"\n          ),\n        email: z\n          .string()\n          .describe(\n            \"The email of the author or committer of the commit. You'll receive a `422` status code if `email` is omitted.\"\n          ),\n        date: z.string().optional()\n      })\n      .describe(\n        'The person that committed the file. Default: the authenticated user.'\n      )\n      .optional(),\n    author: z\n      .object({\n        name: z\n          .string()\n          .describe(\n            \"The name of the author or committer of the commit. You'll receive a `422` status code if `name` is omitted.\"\n          ),\n        email: z\n          .string()\n          .describe(\n            \"The email of the author or committer of the commit. You'll receive a `422` status code if `email` is omitted.\"\n          ),\n        date: z.string().optional()\n      })\n      .describe(\n        'The author of the file. Default: The `committer` or the authenticated user if you omit `committer`.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    path: z.string().describe('path parameter')\n  })\n  export type ReposCreateOrUpdateFileContentsParams = z.infer<\n    typeof ReposCreateOrUpdateFileContentsParamsSchema\n  >\n\n  export const ReposCreateOrUpdateFileContentsResponseSchema = FileCommitSchema\n  export type ReposCreateOrUpdateFileContentsResponse = z.infer<\n    typeof ReposCreateOrUpdateFileContentsResponseSchema\n  >\n\n  export const ReposDeleteFileParamsSchema = z.object({\n    message: z.string().describe('The commit message.'),\n    sha: z.string().describe('The blob SHA of the file being deleted.'),\n    branch: z\n      .string()\n      .describe('The branch name. Default: the repository’s default branch')\n      .optional(),\n    committer: z\n      .object({\n        name: z\n          .string()\n          .describe('The name of the author (or committer) of the commit')\n          .optional(),\n        email: z\n          .string()\n          .describe('The email of the author (or committer) of the commit')\n          .optional()\n      })\n      .describe('object containing information about the committer.')\n      .optional(),\n    author: z\n      .object({\n        name: z\n          .string()\n          .describe('The name of the author (or committer) of the commit')\n          .optional(),\n        email: z\n          .string()\n          .describe('The email of the author (or committer) of the commit')\n          .optional()\n      })\n      .describe('object containing information about the author.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    path: z.string().describe('path parameter')\n  })\n  export type ReposDeleteFileParams = z.infer<\n    typeof ReposDeleteFileParamsSchema\n  >\n\n  export const ReposDeleteFileResponseSchema = FileCommitSchema\n  export type ReposDeleteFileResponse = z.infer<\n    typeof ReposDeleteFileResponseSchema\n  >\n\n  export const ReposListContributorsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    anon: z\n      .string()\n      .describe(\n        'Set to `1` or `true` to include anonymous contributors in results.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListContributorsParams = z.infer<\n    typeof ReposListContributorsParamsSchema\n  >\n\n  export const ReposListContributorsResponseSchema = z.array(ContributorSchema)\n  export type ReposListContributorsResponse = z.infer<\n    typeof ReposListContributorsResponseSchema\n  >\n\n  export const DependabotListAlertsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    state: z\n      .string()\n      .describe(\n        'A comma-separated list of states. If specified, only alerts with these states will be returned.\\n\\nCan be: `auto_dismissed`, `dismissed`, `fixed`, `open`'\n      )\n      .optional(),\n    severity: z\n      .string()\n      .describe(\n        'A comma-separated list of severities. If specified, only alerts with these severities will be returned.\\n\\nCan be: `low`, `medium`, `high`, `critical`'\n      )\n      .optional(),\n    ecosystem: z\n      .string()\n      .describe(\n        'A comma-separated list of ecosystems. If specified, only alerts for these ecosystems will be returned.\\n\\nCan be: `composer`, `go`, `maven`, `npm`, `nuget`, `pip`, `pub`, `rubygems`, `rust`'\n      )\n      .optional(),\n    package: z\n      .string()\n      .describe(\n        'A comma-separated list of package names. If specified, only alerts for these packages will be returned.'\n      )\n      .optional(),\n    manifest: z\n      .string()\n      .describe(\n        'A comma-separated list of full manifest paths. If specified, only alerts for these manifests will be returned.'\n      )\n      .optional(),\n    epss_percentage: z\n      .string()\n      .describe(\n        'CVE Exploit Prediction Scoring System (EPSS) percentage. Can be specified as:\\n- An exact number (`n`)\\n- Comparators such as `>n`, `<n`, `>=n`, `<=n`\\n- A range like `n..n`, where `n` is a number from 0.0 to 1.0\\n\\nFilters the list of alerts based on EPSS percentages. If specified, only alerts with the provided EPSS percentages will be returned.'\n      )\n      .optional(),\n    scope: z\n      .enum(['development', 'runtime'])\n      .describe(\n        'The scope of the vulnerable dependency. If specified, only alerts with this scope will be returned.'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated', 'epss_percentage'])\n      .describe(\n        \"The property by which to sort the results.\\n`created` means when the alert was created.\\n`updated` means when the alert's state last changed.\\n`epss_percentage` sorts alerts by the Exploit Prediction Scoring System (EPSS) percentage.\"\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        '**Closing down notice**. Page number of the results to fetch. Use cursor-based pagination with `before` or `after` instead.'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    first: z\n      .number()\n      .int()\n      .gte(1)\n      .lte(100)\n      .describe(\n        '**Deprecated**. The number of results per page (max 100), starting from the first matching result.\\nThis parameter must not be used in combination with `last`.\\nInstead, use `per_page` in combination with `after` to fetch the first page of results.'\n      )\n      .default(30),\n    last: z\n      .number()\n      .int()\n      .gte(1)\n      .lte(100)\n      .describe(\n        '**Deprecated**. The number of results per page (max 100), starting from the last matching result.\\nThis parameter must not be used in combination with `first`.\\nInstead, use `per_page` in combination with `before` to fetch the last page of results.'\n      )\n      .optional()\n  })\n  export type DependabotListAlertsForRepoParams = z.infer<\n    typeof DependabotListAlertsForRepoParamsSchema\n  >\n\n  export const DependabotListAlertsForRepoResponseSchema = z.array(\n    DependabotAlertSchema\n  )\n  export type DependabotListAlertsForRepoResponse = z.infer<\n    typeof DependabotListAlertsForRepoResponseSchema\n  >\n\n  export const DependabotGetAlertParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies a Dependabot alert in its repository.\\nYou can find this at the end of the URL for a Dependabot alert within GitHub,\\nor in `number` fields in the response from the\\n`GET /repos/{owner}/{repo}/dependabot/alerts` operation.'\n      )\n  })\n  export type DependabotGetAlertParams = z.infer<\n    typeof DependabotGetAlertParamsSchema\n  >\n\n  export const DependabotGetAlertResponseSchema = DependabotAlertSchema\n  export type DependabotGetAlertResponse = z.infer<\n    typeof DependabotGetAlertResponseSchema\n  >\n\n  export const DependabotUpdateAlertParamsSchema = z.object({\n    state: z\n      .enum(['dismissed', 'open'])\n      .describe(\n        'The state of the Dependabot alert.\\nA `dismissed_reason` must be provided when setting the state to `dismissed`.'\n      ),\n    dismissed_reason: z\n      .enum([\n        'fix_started',\n        'inaccurate',\n        'no_bandwidth',\n        'not_used',\n        'tolerable_risk'\n      ])\n      .describe(\n        '**Required when `state` is `dismissed`.** A reason for dismissing the alert.'\n      )\n      .optional(),\n    dismissed_comment: z\n      .string()\n      .max(280)\n      .describe('An optional comment associated with dismissing the alert.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies a Dependabot alert in its repository.\\nYou can find this at the end of the URL for a Dependabot alert within GitHub,\\nor in `number` fields in the response from the\\n`GET /repos/{owner}/{repo}/dependabot/alerts` operation.'\n      )\n  })\n  export type DependabotUpdateAlertParams = z.infer<\n    typeof DependabotUpdateAlertParamsSchema\n  >\n\n  export const DependabotUpdateAlertResponseSchema = DependabotAlertSchema\n  export type DependabotUpdateAlertResponse = z.infer<\n    typeof DependabotUpdateAlertResponseSchema\n  >\n\n  export const DependabotListRepoSecretsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type DependabotListRepoSecretsParams = z.infer<\n    typeof DependabotListRepoSecretsParamsSchema\n  >\n\n  export const DependabotListRepoSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(DependabotSecretSchema)\n  })\n  export type DependabotListRepoSecretsResponse = z.infer<\n    typeof DependabotListRepoSecretsResponseSchema\n  >\n\n  export const DependabotGetRepoPublicKeyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type DependabotGetRepoPublicKeyParams = z.infer<\n    typeof DependabotGetRepoPublicKeyParamsSchema\n  >\n\n  export const DependabotGetRepoPublicKeyResponseSchema =\n    DependabotPublicKeySchema\n  export type DependabotGetRepoPublicKeyResponse = z.infer<\n    typeof DependabotGetRepoPublicKeyResponseSchema\n  >\n\n  export const DependabotGetRepoSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type DependabotGetRepoSecretParams = z.infer<\n    typeof DependabotGetRepoSecretParamsSchema\n  >\n\n  export const DependabotGetRepoSecretResponseSchema = DependabotSecretSchema\n  export type DependabotGetRepoSecretResponse = z.infer<\n    typeof DependabotGetRepoSecretResponseSchema\n  >\n\n  export const DependabotCreateOrUpdateRepoSecretParamsSchema = z.object({\n    encrypted_value: z\n      .string()\n      .regex(\n        new RegExp(\n          '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n        )\n      )\n      .describe(\n        'Value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get a repository public key](https://docs.github.com/rest/dependabot/secrets#get-a-repository-public-key) endpoint.'\n      )\n      .optional(),\n    key_id: z\n      .string()\n      .describe('ID of the key you used to encrypt the secret.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type DependabotCreateOrUpdateRepoSecretParams = z.infer<\n    typeof DependabotCreateOrUpdateRepoSecretParamsSchema\n  >\n\n  export type DependabotCreateOrUpdateRepoSecretResponse = undefined\n\n  export const DependabotDeleteRepoSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type DependabotDeleteRepoSecretParams = z.infer<\n    typeof DependabotDeleteRepoSecretParamsSchema\n  >\n\n  export type DependabotDeleteRepoSecretResponse = undefined\n\n  export const DependencyGraphDiffRangeParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    basehead: z\n      .string()\n      .describe(\n        'The base and head Git revisions to compare. The Git revisions will be resolved to commit SHAs. Named revisions will be resolved to their corresponding HEAD commits, and an appropriate merge base will be determined. This parameter expects the format `{base}...{head}`.'\n      ),\n    name: z\n      .string()\n      .describe(\n        'The full path, relative to the repository root, of the dependency manifest file.'\n      )\n      .optional()\n  })\n  export type DependencyGraphDiffRangeParams = z.infer<\n    typeof DependencyGraphDiffRangeParamsSchema\n  >\n\n  export const DependencyGraphDiffRangeResponseSchema =\n    DependencyGraphDiffSchema\n  export type DependencyGraphDiffRangeResponse = z.infer<\n    typeof DependencyGraphDiffRangeResponseSchema\n  >\n\n  export const DependencyGraphExportSbomParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type DependencyGraphExportSbomParams = z.infer<\n    typeof DependencyGraphExportSbomParamsSchema\n  >\n\n  export const DependencyGraphExportSbomResponseSchema =\n    DependencyGraphSpdxSbomSchema\n  export type DependencyGraphExportSbomResponse = z.infer<\n    typeof DependencyGraphExportSbomResponseSchema\n  >\n\n  export const DependencyGraphCreateRepositorySnapshotParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .merge(SnapshotSchema)\n  export type DependencyGraphCreateRepositorySnapshotParams = z.infer<\n    typeof DependencyGraphCreateRepositorySnapshotParamsSchema\n  >\n\n  export type DependencyGraphCreateRepositorySnapshotResponse = undefined\n\n  export const ReposListDeploymentsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    sha: z\n      .string()\n      .describe('The SHA recorded at creation time.')\n      .default('none'),\n    ref: z\n      .string()\n      .describe('The name of the ref. This can be a branch, tag, or SHA.')\n      .default('none'),\n    task: z\n      .string()\n      .describe(\n        'The name of the task for the deployment (e.g., `deploy` or `deploy:migrations`).'\n      )\n      .default('none'),\n    environment: z\n      .union([z.string().default('none'), z.null()])\n      .describe(\n        'The name of the environment that was deployed to (e.g., `staging` or `production`).'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListDeploymentsParams = z.infer<\n    typeof ReposListDeploymentsParamsSchema\n  >\n\n  export const ReposListDeploymentsResponseSchema = z.array(DeploymentSchema)\n  export type ReposListDeploymentsResponse = z.infer<\n    typeof ReposListDeploymentsResponseSchema\n  >\n\n  export const ReposCreateDeploymentParamsSchema = z.object({\n    ref: z\n      .string()\n      .describe('The ref to deploy. This can be a branch, tag, or SHA.'),\n    task: z\n      .string()\n      .describe(\n        'Specifies a task to execute (e.g., `deploy` or `deploy:migrations`).'\n      )\n      .default('deploy'),\n    auto_merge: z\n      .boolean()\n      .describe(\n        \"Attempts to automatically merge the default branch into the requested ref, if it's behind the default branch.\"\n      )\n      .default(true),\n    required_contexts: z\n      .array(z.string())\n      .describe(\n        'The [status](https://docs.github.com/rest/commits/statuses) contexts to verify against commit status checks. If you omit this parameter, GitHub verifies all unique contexts before creating a deployment. To bypass checking entirely, pass an empty array. Defaults to all unique contexts.'\n      )\n      .optional(),\n    payload: z\n      .union([\n        z.record(z.any()),\n        z\n          .string()\n          .describe('JSON payload with extra information about the deployment.')\n          .default('')\n      ])\n      .optional(),\n    environment: z\n      .string()\n      .describe(\n        'Name for the target deployment environment (e.g., `production`, `staging`, `qa`).'\n      )\n      .default('production'),\n    description: z\n      .string()\n      .describe('Short description of the deployment.')\n      .default(''),\n    transient_environment: z\n      .boolean()\n      .describe(\n        'Specifies if the given environment is specific to the deployment and will no longer exist at some point in the future. Default: `false`'\n      )\n      .default(false),\n    production_environment: z\n      .boolean()\n      .describe(\n        'Specifies if the given environment is one that end-users directly interact with. Default: `true` when `environment` is `production` and `false` otherwise.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateDeploymentParams = z.infer<\n    typeof ReposCreateDeploymentParamsSchema\n  >\n\n  export type ReposCreateDeploymentResponse = undefined\n\n  export const ReposGetDeploymentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    deployment_id: z.number().int().describe('deployment_id parameter')\n  })\n  export type ReposGetDeploymentParams = z.infer<\n    typeof ReposGetDeploymentParamsSchema\n  >\n\n  export const ReposGetDeploymentResponseSchema = DeploymentSchema\n  export type ReposGetDeploymentResponse = z.infer<\n    typeof ReposGetDeploymentResponseSchema\n  >\n\n  export const ReposDeleteDeploymentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    deployment_id: z.number().int().describe('deployment_id parameter')\n  })\n  export type ReposDeleteDeploymentParams = z.infer<\n    typeof ReposDeleteDeploymentParamsSchema\n  >\n\n  export type ReposDeleteDeploymentResponse = undefined\n\n  export const ReposListDeploymentStatusesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    deployment_id: z.number().int().describe('deployment_id parameter'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListDeploymentStatusesParams = z.infer<\n    typeof ReposListDeploymentStatusesParamsSchema\n  >\n\n  export const ReposListDeploymentStatusesResponseSchema = z.array(\n    DeploymentStatusSchema\n  )\n  export type ReposListDeploymentStatusesResponse = z.infer<\n    typeof ReposListDeploymentStatusesResponseSchema\n  >\n\n  export const ReposCreateDeploymentStatusParamsSchema = z.object({\n    state: z\n      .enum([\n        'error',\n        'failure',\n        'inactive',\n        'in_progress',\n        'queued',\n        'pending',\n        'success'\n      ])\n      .describe(\n        'The state of the status. When you set a transient deployment to `inactive`, the deployment will be shown as `destroyed` in GitHub.'\n      ),\n    target_url: z\n      .string()\n      .describe(\n        \"The target URL to associate with this status. This URL should contain output to keep the user updated while the task is running or serve as historical information for what happened in the deployment.\\n\\n> [!NOTE]\\n> It's recommended to use the `log_url` parameter, which replaces `target_url`.\"\n      )\n      .default(''),\n    log_url: z\n      .string()\n      .describe(\n        'The full URL of the deployment\\'s output. This parameter replaces `target_url`. We will continue to accept `target_url` to support legacy uses, but we recommend replacing `target_url` with `log_url`. Setting `log_url` will automatically set `target_url` to the same value. Default: `\"\"`'\n      )\n      .default(''),\n    description: z\n      .string()\n      .describe(\n        'A short description of the status. The maximum description length is 140 characters.'\n      )\n      .default(''),\n    environment: z\n      .string()\n      .describe(\n        'Name for the target deployment environment, which can be changed when setting a deploy status. For example, `production`, `staging`, or `qa`. If not defined, the environment of the previous status on the deployment will be used, if it exists. Otherwise, the environment of the deployment will be used.'\n      )\n      .optional(),\n    environment_url: z\n      .string()\n      .describe('Sets the URL for accessing your environment. Default: `\"\"`')\n      .default(''),\n    auto_inactive: z\n      .boolean()\n      .describe(\n        \"Adds a new `inactive` status to all prior non-transient, non-production environment deployments with the same repository and `environment` name as the created status's deployment. An `inactive` status is only added to deployments that had a `success` state. Default: `true`\"\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    deployment_id: z.number().int().describe('deployment_id parameter')\n  })\n  export type ReposCreateDeploymentStatusParams = z.infer<\n    typeof ReposCreateDeploymentStatusParamsSchema\n  >\n\n  export type ReposCreateDeploymentStatusResponse = undefined\n\n  export const ReposGetDeploymentStatusParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    deployment_id: z.number().int().describe('deployment_id parameter'),\n    status_id: z.number().int()\n  })\n  export type ReposGetDeploymentStatusParams = z.infer<\n    typeof ReposGetDeploymentStatusParamsSchema\n  >\n\n  export const ReposGetDeploymentStatusResponseSchema = DeploymentStatusSchema\n  export type ReposGetDeploymentStatusResponse = z.infer<\n    typeof ReposGetDeploymentStatusResponseSchema\n  >\n\n  export const ReposCreateDispatchEventParamsSchema = z.object({\n    event_type: z\n      .string()\n      .min(1)\n      .max(100)\n      .describe(\n        'A custom webhook event name. Must be 100 characters or fewer.'\n      ),\n    client_payload: z\n      .record(z.any())\n      .describe(\n        'JSON payload with extra information about the webhook event that your action or workflow may use. The maximum number of top-level properties is 10. The total size of the JSON payload must be less than 64KB.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateDispatchEventParams = z.infer<\n    typeof ReposCreateDispatchEventParamsSchema\n  >\n\n  export type ReposCreateDispatchEventResponse = undefined\n\n  export const ReposGetAllEnvironmentsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposGetAllEnvironmentsParams = z.infer<\n    typeof ReposGetAllEnvironmentsParamsSchema\n  >\n\n  export const ReposGetAllEnvironmentsResponseSchema = z.object({\n    total_count: z\n      .number()\n      .int()\n      .describe('The number of environments in this repository')\n      .optional(),\n    environments: z.array(EnvironmentSchema).optional()\n  })\n  export type ReposGetAllEnvironmentsResponse = z.infer<\n    typeof ReposGetAllEnvironmentsResponseSchema\n  >\n\n  export const ReposGetEnvironmentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      )\n  })\n  export type ReposGetEnvironmentParams = z.infer<\n    typeof ReposGetEnvironmentParamsSchema\n  >\n\n  export const ReposGetEnvironmentResponseSchema = EnvironmentSchema\n  export type ReposGetEnvironmentResponse = z.infer<\n    typeof ReposGetEnvironmentResponseSchema\n  >\n\n  export const ReposCreateOrUpdateEnvironmentParamsSchema = z.object({\n    wait_timer: WaitTimerSchema.optional(),\n    prevent_self_review: PreventSelfReviewSchema.optional(),\n    reviewers: z\n      .array(\n        z.object({\n          type: DeploymentReviewerTypeSchema.optional(),\n          id: z\n            .number()\n            .int()\n            .describe(\n              'The id of the user or team who can review the deployment'\n            )\n            .optional()\n        })\n      )\n      .describe(\n        'The people or teams that may review jobs that reference the environment. You can list up to six users or teams as reviewers. The reviewers must have at least read access to the repository. Only one of the required reviewers needs to approve the job for it to proceed.'\n      )\n      .optional(),\n    deployment_branch_policy: DeploymentBranchPolicySettingsSchema.optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      )\n  })\n  export type ReposCreateOrUpdateEnvironmentParams = z.infer<\n    typeof ReposCreateOrUpdateEnvironmentParamsSchema\n  >\n\n  export const ReposCreateOrUpdateEnvironmentResponseSchema = EnvironmentSchema\n  export type ReposCreateOrUpdateEnvironmentResponse = z.infer<\n    typeof ReposCreateOrUpdateEnvironmentResponseSchema\n  >\n\n  export const ReposDeleteAnEnvironmentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      )\n  })\n  export type ReposDeleteAnEnvironmentParams = z.infer<\n    typeof ReposDeleteAnEnvironmentParamsSchema\n  >\n\n  export type ReposDeleteAnEnvironmentResponse = undefined\n\n  export const ReposListDeploymentBranchPoliciesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListDeploymentBranchPoliciesParams = z.infer<\n    typeof ReposListDeploymentBranchPoliciesParamsSchema\n  >\n\n  export const ReposListDeploymentBranchPoliciesResponseSchema = z.object({\n    total_count: z\n      .number()\n      .int()\n      .describe(\n        'The number of deployment branch policies for the environment.'\n      ),\n    branch_policies: z.array(DeploymentBranchPolicySchema)\n  })\n  export type ReposListDeploymentBranchPoliciesResponse = z.infer<\n    typeof ReposListDeploymentBranchPoliciesResponseSchema\n  >\n\n  export const ReposCreateDeploymentBranchPolicyParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      environment_name: z\n        .string()\n        .describe(\n          'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n        )\n    })\n    .merge(DeploymentBranchPolicyNamePatternWithTypeSchema)\n  export type ReposCreateDeploymentBranchPolicyParams = z.infer<\n    typeof ReposCreateDeploymentBranchPolicyParamsSchema\n  >\n\n  export const ReposCreateDeploymentBranchPolicyResponseSchema =\n    DeploymentBranchPolicySchema\n  export type ReposCreateDeploymentBranchPolicyResponse = z.infer<\n    typeof ReposCreateDeploymentBranchPolicyResponseSchema\n  >\n\n  export const ReposGetDeploymentBranchPolicyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    branch_policy_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the branch policy.')\n  })\n  export type ReposGetDeploymentBranchPolicyParams = z.infer<\n    typeof ReposGetDeploymentBranchPolicyParamsSchema\n  >\n\n  export const ReposGetDeploymentBranchPolicyResponseSchema =\n    DeploymentBranchPolicySchema\n  export type ReposGetDeploymentBranchPolicyResponse = z.infer<\n    typeof ReposGetDeploymentBranchPolicyResponseSchema\n  >\n\n  export const ReposUpdateDeploymentBranchPolicyParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      environment_name: z\n        .string()\n        .describe(\n          'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n        ),\n      branch_policy_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the branch policy.')\n    })\n    .merge(DeploymentBranchPolicyNamePatternSchema)\n  export type ReposUpdateDeploymentBranchPolicyParams = z.infer<\n    typeof ReposUpdateDeploymentBranchPolicyParamsSchema\n  >\n\n  export const ReposUpdateDeploymentBranchPolicyResponseSchema =\n    DeploymentBranchPolicySchema\n  export type ReposUpdateDeploymentBranchPolicyResponse = z.infer<\n    typeof ReposUpdateDeploymentBranchPolicyResponseSchema\n  >\n\n  export const ReposDeleteDeploymentBranchPolicyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    branch_policy_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the branch policy.')\n  })\n  export type ReposDeleteDeploymentBranchPolicyParams = z.infer<\n    typeof ReposDeleteDeploymentBranchPolicyParamsSchema\n  >\n\n  export type ReposDeleteDeploymentBranchPolicyResponse = undefined\n\n  export const ReposGetAllDeploymentProtectionRulesParamsSchema = z.object({\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetAllDeploymentProtectionRulesParams = z.infer<\n    typeof ReposGetAllDeploymentProtectionRulesParamsSchema\n  >\n\n  export const ReposGetAllDeploymentProtectionRulesResponseSchema = z.object({\n    total_count: z\n      .number()\n      .int()\n      .describe(\n        'The number of enabled custom deployment protection rules for this environment'\n      )\n      .optional(),\n    custom_deployment_protection_rules: z\n      .array(DeploymentProtectionRuleSchema)\n      .optional()\n  })\n  export type ReposGetAllDeploymentProtectionRulesResponse = z.infer<\n    typeof ReposGetAllDeploymentProtectionRulesResponseSchema\n  >\n\n  export const ReposCreateDeploymentProtectionRuleParamsSchema = z.object({\n    integration_id: z\n      .number()\n      .int()\n      .describe(\n        'The ID of the custom app that will be enabled on the environment.'\n      )\n      .optional(),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateDeploymentProtectionRuleParams = z.infer<\n    typeof ReposCreateDeploymentProtectionRuleParamsSchema\n  >\n\n  export type ReposCreateDeploymentProtectionRuleResponse = undefined\n\n  export const ReposListCustomDeploymentRuleIntegrationsParamsSchema = z.object(\n    {\n      environment_name: z\n        .string()\n        .describe(\n          'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30)\n    }\n  )\n  export type ReposListCustomDeploymentRuleIntegrationsParams = z.infer<\n    typeof ReposListCustomDeploymentRuleIntegrationsParamsSchema\n  >\n\n  export const ReposListCustomDeploymentRuleIntegrationsResponseSchema =\n    z.object({\n      total_count: z\n        .number()\n        .int()\n        .describe(\n          'The total number of custom deployment protection rule integrations available for this environment.'\n        )\n        .optional(),\n      available_custom_deployment_protection_rule_integrations: z\n        .array(CustomDeploymentRuleAppSchema)\n        .optional()\n    })\n  export type ReposListCustomDeploymentRuleIntegrationsResponse = z.infer<\n    typeof ReposListCustomDeploymentRuleIntegrationsResponseSchema\n  >\n\n  export const ReposGetCustomDeploymentProtectionRuleParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    protection_rule_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the protection rule.')\n  })\n  export type ReposGetCustomDeploymentProtectionRuleParams = z.infer<\n    typeof ReposGetCustomDeploymentProtectionRuleParamsSchema\n  >\n\n  export const ReposGetCustomDeploymentProtectionRuleResponseSchema =\n    DeploymentProtectionRuleSchema\n  export type ReposGetCustomDeploymentProtectionRuleResponse = z.infer<\n    typeof ReposGetCustomDeploymentProtectionRuleResponseSchema\n  >\n\n  export const ReposDisableDeploymentProtectionRuleParamsSchema = z.object({\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    protection_rule_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the protection rule.')\n  })\n  export type ReposDisableDeploymentProtectionRuleParams = z.infer<\n    typeof ReposDisableDeploymentProtectionRuleParamsSchema\n  >\n\n  export type ReposDisableDeploymentProtectionRuleResponse = undefined\n\n  export const ActionsListEnvironmentSecretsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListEnvironmentSecretsParams = z.infer<\n    typeof ActionsListEnvironmentSecretsParamsSchema\n  >\n\n  export const ActionsListEnvironmentSecretsResponseSchema = z.object({\n    total_count: z.number().int(),\n    secrets: z.array(ActionsSecretSchema)\n  })\n  export type ActionsListEnvironmentSecretsResponse = z.infer<\n    typeof ActionsListEnvironmentSecretsResponseSchema\n  >\n\n  export const ActionsGetEnvironmentPublicKeyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      )\n  })\n  export type ActionsGetEnvironmentPublicKeyParams = z.infer<\n    typeof ActionsGetEnvironmentPublicKeyParamsSchema\n  >\n\n  export const ActionsGetEnvironmentPublicKeyResponseSchema =\n    ActionsPublicKeySchema\n  export type ActionsGetEnvironmentPublicKeyResponse = z.infer<\n    typeof ActionsGetEnvironmentPublicKeyResponseSchema\n  >\n\n  export const ActionsGetEnvironmentSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsGetEnvironmentSecretParams = z.infer<\n    typeof ActionsGetEnvironmentSecretParamsSchema\n  >\n\n  export const ActionsGetEnvironmentSecretResponseSchema = ActionsSecretSchema\n  export type ActionsGetEnvironmentSecretResponse = z.infer<\n    typeof ActionsGetEnvironmentSecretResponseSchema\n  >\n\n  export const ActionsCreateOrUpdateEnvironmentSecretParamsSchema = z.object({\n    encrypted_value: z\n      .string()\n      .regex(\n        new RegExp(\n          '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n        )\n      )\n      .describe(\n        'Value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get an environment public key](https://docs.github.com/rest/actions/secrets#get-an-environment-public-key) endpoint.'\n      ),\n    key_id: z\n      .string()\n      .describe('ID of the key you used to encrypt the secret.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsCreateOrUpdateEnvironmentSecretParams = z.infer<\n    typeof ActionsCreateOrUpdateEnvironmentSecretParamsSchema\n  >\n\n  export type ActionsCreateOrUpdateEnvironmentSecretResponse = undefined\n\n  export const ActionsDeleteEnvironmentSecretParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type ActionsDeleteEnvironmentSecretParams = z.infer<\n    typeof ActionsDeleteEnvironmentSecretParamsSchema\n  >\n\n  export type ActionsDeleteEnvironmentSecretResponse = undefined\n\n  export const ActionsListEnvironmentVariablesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 30). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(10),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActionsListEnvironmentVariablesParams = z.infer<\n    typeof ActionsListEnvironmentVariablesParamsSchema\n  >\n\n  export const ActionsListEnvironmentVariablesResponseSchema = z.object({\n    total_count: z.number().int(),\n    variables: z.array(ActionsVariableSchema)\n  })\n  export type ActionsListEnvironmentVariablesResponse = z.infer<\n    typeof ActionsListEnvironmentVariablesResponseSchema\n  >\n\n  export const ActionsCreateEnvironmentVariableParamsSchema = z.object({\n    name: z.string().describe('The name of the variable.'),\n    value: z.string().describe('The value of the variable.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      )\n  })\n  export type ActionsCreateEnvironmentVariableParams = z.infer<\n    typeof ActionsCreateEnvironmentVariableParamsSchema\n  >\n\n  export type ActionsCreateEnvironmentVariableResponse = undefined\n\n  export const ActionsGetEnvironmentVariableParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      ),\n    name: z.string().describe('The name of the variable.')\n  })\n  export type ActionsGetEnvironmentVariableParams = z.infer<\n    typeof ActionsGetEnvironmentVariableParamsSchema\n  >\n\n  export const ActionsGetEnvironmentVariableResponseSchema =\n    ActionsVariableSchema\n  export type ActionsGetEnvironmentVariableResponse = z.infer<\n    typeof ActionsGetEnvironmentVariableResponseSchema\n  >\n\n  export const ActionsDeleteEnvironmentVariableParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    name: z.string().describe('The name of the variable.'),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      )\n  })\n  export type ActionsDeleteEnvironmentVariableParams = z.infer<\n    typeof ActionsDeleteEnvironmentVariableParamsSchema\n  >\n\n  export type ActionsDeleteEnvironmentVariableResponse = undefined\n\n  export const ActionsUpdateEnvironmentVariableParamsSchema = z.object({\n    name: z.string().describe('The name of the variable.'),\n    value: z.string().describe('The value of the variable.').optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    environment_name: z\n      .string()\n      .describe(\n        'The name of the environment. The name must be URL encoded. For example, any slashes in the name must be replaced with `%2F`.'\n      )\n  })\n  export type ActionsUpdateEnvironmentVariableParams = z.infer<\n    typeof ActionsUpdateEnvironmentVariableParamsSchema\n  >\n\n  export type ActionsUpdateEnvironmentVariableResponse = undefined\n\n  export const ActivityListRepoEventsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListRepoEventsParams = z.infer<\n    typeof ActivityListRepoEventsParamsSchema\n  >\n\n  export const ActivityListRepoEventsResponseSchema = z.array(EventSchema)\n  export type ActivityListRepoEventsResponse = z.infer<\n    typeof ActivityListRepoEventsResponseSchema\n  >\n\n  export const ReposListForksParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    sort: z\n      .enum(['newest', 'oldest', 'stargazers', 'watchers'])\n      .describe('The sort order. `stargazers` will sort by star count.')\n      .default('newest'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListForksParams = z.infer<typeof ReposListForksParamsSchema>\n\n  export const ReposListForksResponseSchema = z.array(MinimalRepositorySchema)\n  export type ReposListForksResponse = z.infer<\n    typeof ReposListForksResponseSchema\n  >\n\n  export const ReposCreateForkParamsSchema = z.object({\n    organization: z\n      .string()\n      .describe(\n        'Optional parameter to specify the organization name if forking into an organization.'\n      )\n      .optional(),\n    name: z\n      .string()\n      .describe(\n        'When forking from an existing repository, a new name for the fork.'\n      )\n      .optional(),\n    default_branch_only: z\n      .boolean()\n      .describe(\n        'When forking from an existing repository, fork with only the default branch.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateForkParams = z.infer<\n    typeof ReposCreateForkParamsSchema\n  >\n\n  export type ReposCreateForkResponse = undefined\n\n  export const GitCreateBlobParamsSchema = z.object({\n    content: z.string().describe(\"The new blob's content.\"),\n    encoding: z\n      .string()\n      .describe(\n        'The encoding used for `content`. Currently, `\"utf-8\"` and `\"base64\"` are supported.'\n      )\n      .default('utf-8'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type GitCreateBlobParams = z.infer<typeof GitCreateBlobParamsSchema>\n\n  export type GitCreateBlobResponse = undefined\n\n  export const GitGetBlobParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    file_sha: z.string()\n  })\n  export type GitGetBlobParams = z.infer<typeof GitGetBlobParamsSchema>\n\n  export const GitGetBlobResponseSchema = BlobSchema\n  export type GitGetBlobResponse = z.infer<typeof GitGetBlobResponseSchema>\n\n  export const GitCreateCommitParamsSchema = z.object({\n    message: z.string().describe('The commit message'),\n    tree: z\n      .string()\n      .describe('The SHA of the tree object this commit points to'),\n    parents: z\n      .array(z.string())\n      .describe(\n        'The full SHAs of the commits that were the parents of this commit. If omitted or empty, the commit will be written as a root commit. For a single parent, an array of one SHA should be provided; for a merge commit, an array of more than one should be provided.'\n      )\n      .optional(),\n    author: z\n      .object({\n        name: z\n          .string()\n          .describe('The name of the author (or committer) of the commit'),\n        email: z\n          .string()\n          .describe('The email of the author (or committer) of the commit'),\n        date: z\n          .string()\n          .datetime({ offset: true })\n          .describe(\n            'Indicates when this commit was authored (or committed). This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n          )\n          .optional()\n      })\n      .describe(\n        'Information about the author of the commit. By default, the `author` will be the authenticated user and the current date. See the `author` and `committer` object below for details.'\n      )\n      .optional(),\n    committer: z\n      .object({\n        name: z\n          .string()\n          .describe('The name of the author (or committer) of the commit')\n          .optional(),\n        email: z\n          .string()\n          .describe('The email of the author (or committer) of the commit')\n          .optional(),\n        date: z\n          .string()\n          .datetime({ offset: true })\n          .describe(\n            'Indicates when this commit was authored (or committed). This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n          )\n          .optional()\n      })\n      .describe(\n        'Information about the person who is making the commit. By default, `committer` will use the information set in `author`. See the `author` and `committer` object below for details.'\n      )\n      .optional(),\n    signature: z\n      .string()\n      .describe(\n        'The [PGP signature](https://en.wikipedia.org/wiki/Pretty_Good_Privacy) of the commit. GitHub adds the signature to the `gpgsig` header of the created commit. For a commit signature to be verifiable by Git or GitHub, it must be an ASCII-armored detached PGP signature over the string commit as it would be written to the object database. To pass a `signature` parameter, you need to first manually create a valid PGP signature, which can be complicated. You may find it easier to [use the command line](https://git-scm.com/book/id/v2/Git-Tools-Signing-Your-Work) to create signed commits.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type GitCreateCommitParams = z.infer<\n    typeof GitCreateCommitParamsSchema\n  >\n\n  export type GitCreateCommitResponse = undefined\n\n  export const GitGetCommitParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    commit_sha: z.string().describe('The SHA of the commit.')\n  })\n  export type GitGetCommitParams = z.infer<typeof GitGetCommitParamsSchema>\n\n  export const GitGetCommitResponseSchema = GitCommitSchema\n  export type GitGetCommitResponse = z.infer<typeof GitGetCommitResponseSchema>\n\n  export const GitListMatchingRefsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The Git reference. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      )\n  })\n  export type GitListMatchingRefsParams = z.infer<\n    typeof GitListMatchingRefsParamsSchema\n  >\n\n  export const GitListMatchingRefsResponseSchema = z.array(GitRefSchema)\n  export type GitListMatchingRefsResponse = z.infer<\n    typeof GitListMatchingRefsResponseSchema\n  >\n\n  export const GitGetRefParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The Git reference. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      )\n  })\n  export type GitGetRefParams = z.infer<typeof GitGetRefParamsSchema>\n\n  export const GitGetRefResponseSchema = GitRefSchema\n  export type GitGetRefResponse = z.infer<typeof GitGetRefResponseSchema>\n\n  export const GitCreateRefParamsSchema = z.object({\n    ref: z\n      .string()\n      .describe(\n        \"The name of the fully qualified reference (ie: `refs/heads/master`). If it doesn't start with 'refs' and have at least two slashes, it will be rejected.\"\n      ),\n    sha: z.string().describe('The SHA1 value for this reference.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type GitCreateRefParams = z.infer<typeof GitCreateRefParamsSchema>\n\n  export type GitCreateRefResponse = undefined\n\n  export const GitDeleteRefParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The Git reference. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      )\n  })\n  export type GitDeleteRefParams = z.infer<typeof GitDeleteRefParamsSchema>\n\n  export type GitDeleteRefResponse = undefined\n\n  export const GitUpdateRefParamsSchema = z.object({\n    sha: z.string().describe('The SHA1 value to set this reference to'),\n    force: z\n      .boolean()\n      .describe(\n        \"Indicates whether to force the update or to make sure the update is a fast-forward update. Leaving this out or setting it to `false` will make sure you're not overwriting work.\"\n      )\n      .default(false),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The Git reference. For more information, see \"[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)\" in the Git documentation.'\n      )\n  })\n  export type GitUpdateRefParams = z.infer<typeof GitUpdateRefParamsSchema>\n\n  export const GitUpdateRefResponseSchema = GitRefSchema\n  export type GitUpdateRefResponse = z.infer<typeof GitUpdateRefResponseSchema>\n\n  export const GitCreateTagParamsSchema = z.object({\n    tag: z\n      .string()\n      .describe(\n        'The tag\\'s name. This is typically a version (e.g., \"v0.0.1\").'\n      ),\n    message: z.string().describe('The tag message.'),\n    object: z.string().describe('The SHA of the git object this is tagging.'),\n    type: z\n      .enum(['commit', 'tree', 'blob'])\n      .describe(\n        \"The type of the object we're tagging. Normally this is a `commit` but it can also be a `tree` or a `blob`.\"\n      ),\n    tagger: z\n      .object({\n        name: z.string().describe('The name of the author of the tag'),\n        email: z.string().describe('The email of the author of the tag'),\n        date: z\n          .string()\n          .datetime({ offset: true })\n          .describe(\n            'When this object was tagged. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n          )\n          .optional()\n      })\n      .describe(\n        'An object with information about the individual creating the tag.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type GitCreateTagParams = z.infer<typeof GitCreateTagParamsSchema>\n\n  export type GitCreateTagResponse = undefined\n\n  export const GitGetTagParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    tag_sha: z.string()\n  })\n  export type GitGetTagParams = z.infer<typeof GitGetTagParamsSchema>\n\n  export const GitGetTagResponseSchema = GitTagSchema\n  export type GitGetTagResponse = z.infer<typeof GitGetTagResponseSchema>\n\n  export const GitCreateTreeParamsSchema = z.object({\n    tree: z\n      .array(\n        z.object({\n          path: z\n            .string()\n            .describe('The file referenced in the tree.')\n            .optional(),\n          mode: z\n            .enum(['100644', '100755', '040000', '160000', '120000'])\n            .describe(\n              'The file mode; one of `100644` for file (blob), `100755` for executable (blob), `040000` for subdirectory (tree), `160000` for submodule (commit), or `120000` for a blob that specifies the path of a symlink.'\n            )\n            .optional(),\n          type: z\n            .enum(['blob', 'tree', 'commit'])\n            .describe('Either `blob`, `tree`, or `commit`.')\n            .optional(),\n          sha: z\n            .string()\n            .describe(\n              'The SHA1 checksum ID of the object in the tree. Also called `tree.sha`. If the value is `null` then the file will be deleted.  \\n  \\n**Note:** Use either `tree.sha` or `content` to specify the contents of the entry. Using both `tree.sha` and `content` will return an error.'\n            )\n            .optional(),\n          content: z\n            .string()\n            .describe(\n              'The content you want this file to have. GitHub will write this blob out and use that SHA for this entry. Use either this, or `tree.sha`.  \\n  \\n**Note:** Use either `tree.sha` or `content` to specify the contents of the entry. Using both `tree.sha` and `content` will return an error.'\n            )\n            .optional()\n        })\n      )\n      .describe(\n        'Objects (of `path`, `mode`, `type`, and `sha`) specifying a tree structure.'\n      ),\n    base_tree: z\n      .string()\n      .describe(\n        \"The SHA1 of an existing Git tree object which will be used as the base for the new tree. If provided, a new Git tree object will be created from entries in the Git tree object pointed to by `base_tree` and entries defined in the `tree` parameter. Entries defined in the `tree` parameter will overwrite items from `base_tree` with the same `path`. If you're creating new changes on a branch, then normally you'd set `base_tree` to the SHA1 of the Git tree object of the current latest commit on the branch you're working on.\\nIf not provided, GitHub will create a new Git tree object from only the entries defined in the `tree` parameter. If you create a new commit pointing to such a tree, then all files which were a part of the parent commit's tree and were not defined in the `tree` parameter will be listed as deleted by the new commit.\"\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type GitCreateTreeParams = z.infer<typeof GitCreateTreeParamsSchema>\n\n  export type GitCreateTreeResponse = undefined\n\n  export const GitGetTreeParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    tree_sha: z\n      .string()\n      .describe('The SHA1 value or ref (branch or tag) name of the tree.'),\n    recursive: z\n      .string()\n      .describe(\n        'Setting this parameter to any value returns the objects or subtrees referenced by the tree specified in `:tree_sha`. For example, setting `recursive` to any of the following will enable returning objects or subtrees: `0`, `1`, `\"true\"`, and `\"false\"`. Omit this parameter to prevent recursively returning objects or subtrees.'\n      )\n      .optional()\n  })\n  export type GitGetTreeParams = z.infer<typeof GitGetTreeParamsSchema>\n\n  export const GitGetTreeResponseSchema = GitTreeSchema\n  export type GitGetTreeResponse = z.infer<typeof GitGetTreeResponseSchema>\n\n  export const ReposListWebhooksParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListWebhooksParams = z.infer<\n    typeof ReposListWebhooksParamsSchema\n  >\n\n  export const ReposListWebhooksResponseSchema = z.array(HookSchema)\n  export type ReposListWebhooksResponse = z.infer<\n    typeof ReposListWebhooksResponseSchema\n  >\n\n  export const ReposCreateWebhookParamsSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        'Use `web` to create a webhook. Default: `web`. This parameter only accepts the value `web`.'\n      )\n      .optional(),\n    config: z\n      .object({\n        url: WebhookConfigUrlSchema.optional(),\n        content_type: WebhookConfigContentTypeSchema.optional(),\n        secret: WebhookConfigSecretSchema.optional(),\n        insecure_ssl: WebhookConfigInsecureSslSchema.optional()\n      })\n      .describe('Key/value pairs to provide settings for this webhook.')\n      .optional(),\n    events: z\n      .array(z.string())\n      .describe(\n        'Determines what [events](https://docs.github.com/webhooks/event-payloads) the hook is triggered for.'\n      )\n      .default(['push']),\n    active: z\n      .boolean()\n      .describe(\n        'Determines if notifications are sent when the webhook is triggered. Set to `true` to send notifications.'\n      )\n      .default(true),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateWebhookParams = z.infer<\n    typeof ReposCreateWebhookParamsSchema\n  >\n\n  export type ReposCreateWebhookResponse = undefined\n\n  export const ReposGetWebhookParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type ReposGetWebhookParams = z.infer<\n    typeof ReposGetWebhookParamsSchema\n  >\n\n  export const ReposGetWebhookResponseSchema = HookSchema\n  export type ReposGetWebhookResponse = z.infer<\n    typeof ReposGetWebhookResponseSchema\n  >\n\n  export const ReposDeleteWebhookParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type ReposDeleteWebhookParams = z.infer<\n    typeof ReposDeleteWebhookParamsSchema\n  >\n\n  export type ReposDeleteWebhookResponse = undefined\n\n  export const ReposUpdateWebhookParamsSchema = z.object({\n    config: WebhookConfigSchema.optional(),\n    events: z\n      .array(z.string())\n      .describe(\n        'Determines what [events](https://docs.github.com/webhooks/event-payloads) the hook is triggered for. This replaces the entire array of events.'\n      )\n      .default(['push']),\n    add_events: z\n      .array(z.string())\n      .describe(\n        'Determines a list of events to be added to the list of events that the Hook triggers for.'\n      )\n      .optional(),\n    remove_events: z\n      .array(z.string())\n      .describe(\n        'Determines a list of events to be removed from the list of events that the Hook triggers for.'\n      )\n      .optional(),\n    active: z\n      .boolean()\n      .describe(\n        'Determines if notifications are sent when the webhook is triggered. Set to `true` to send notifications.'\n      )\n      .default(true),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type ReposUpdateWebhookParams = z.infer<\n    typeof ReposUpdateWebhookParamsSchema\n  >\n\n  export const ReposUpdateWebhookResponseSchema = HookSchema\n  export type ReposUpdateWebhookResponse = z.infer<\n    typeof ReposUpdateWebhookResponseSchema\n  >\n\n  export const ReposGetWebhookConfigForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type ReposGetWebhookConfigForRepoParams = z.infer<\n    typeof ReposGetWebhookConfigForRepoParamsSchema\n  >\n\n  export const ReposGetWebhookConfigForRepoResponseSchema = WebhookConfigSchema\n  export type ReposGetWebhookConfigForRepoResponse = z.infer<\n    typeof ReposGetWebhookConfigForRepoResponseSchema\n  >\n\n  export const ReposUpdateWebhookConfigForRepoParamsSchema = z.object({\n    url: WebhookConfigUrlSchema.optional(),\n    content_type: WebhookConfigContentTypeSchema.optional(),\n    secret: WebhookConfigSecretSchema.optional(),\n    insecure_ssl: WebhookConfigInsecureSslSchema.optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type ReposUpdateWebhookConfigForRepoParams = z.infer<\n    typeof ReposUpdateWebhookConfigForRepoParamsSchema\n  >\n\n  export const ReposUpdateWebhookConfigForRepoResponseSchema =\n    WebhookConfigSchema\n  export type ReposUpdateWebhookConfigForRepoResponse = z.infer<\n    typeof ReposUpdateWebhookConfigForRepoResponseSchema\n  >\n\n  export const ReposListWebhookDeliveriesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    cursor: z\n      .string()\n      .describe(\n        'Used for pagination: the starting delivery from which the page of deliveries is fetched. Refer to the `link` header for the next and previous page cursors.'\n      )\n      .optional()\n  })\n  export type ReposListWebhookDeliveriesParams = z.infer<\n    typeof ReposListWebhookDeliveriesParamsSchema\n  >\n\n  export const ReposListWebhookDeliveriesResponseSchema = z.array(\n    HookDeliveryItemSchema\n  )\n  export type ReposListWebhookDeliveriesResponse = z.infer<\n    typeof ReposListWebhookDeliveriesResponseSchema\n  >\n\n  export const ReposGetWebhookDeliveryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      ),\n    delivery_id: z.number().int()\n  })\n  export type ReposGetWebhookDeliveryParams = z.infer<\n    typeof ReposGetWebhookDeliveryParamsSchema\n  >\n\n  export const ReposGetWebhookDeliveryResponseSchema = HookDeliverySchema\n  export type ReposGetWebhookDeliveryResponse = z.infer<\n    typeof ReposGetWebhookDeliveryResponseSchema\n  >\n\n  export const ReposRedeliverWebhookDeliveryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      ),\n    delivery_id: z.number().int()\n  })\n  export type ReposRedeliverWebhookDeliveryParams = z.infer<\n    typeof ReposRedeliverWebhookDeliveryParamsSchema\n  >\n\n  export type ReposRedeliverWebhookDeliveryResponse = undefined\n\n  export const ReposPingWebhookParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type ReposPingWebhookParams = z.infer<\n    typeof ReposPingWebhookParamsSchema\n  >\n\n  export type ReposPingWebhookResponse = undefined\n\n  export const ReposTestPushWebhookParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    hook_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the hook. You can find this value in the `X-GitHub-Hook-ID` header of a webhook delivery.'\n      )\n  })\n  export type ReposTestPushWebhookParams = z.infer<\n    typeof ReposTestPushWebhookParamsSchema\n  >\n\n  export type ReposTestPushWebhookResponse = undefined\n\n  export const MigrationsGetImportStatusParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type MigrationsGetImportStatusParams = z.infer<\n    typeof MigrationsGetImportStatusParamsSchema\n  >\n\n  export const MigrationsGetImportStatusResponseSchema = ImportSchema\n  export type MigrationsGetImportStatusResponse = z.infer<\n    typeof MigrationsGetImportStatusResponseSchema\n  >\n\n  export const MigrationsStartImportParamsSchema = z.object({\n    vcs_url: z.string().describe('The URL of the originating repository.'),\n    vcs: z\n      .enum(['subversion', 'git', 'mercurial', 'tfvc'])\n      .describe(\n        'The originating VCS type. Without this parameter, the import job will take additional time to detect the VCS type before beginning the import. This detection step will be reflected in the response.'\n      )\n      .optional(),\n    vcs_username: z\n      .string()\n      .describe(\n        'If authentication is required, the username to provide to `vcs_url`.'\n      )\n      .optional(),\n    vcs_password: z\n      .string()\n      .describe(\n        'If authentication is required, the password to provide to `vcs_url`.'\n      )\n      .optional(),\n    tfvc_project: z\n      .string()\n      .describe(\n        'For a tfvc import, the name of the project that is being imported.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type MigrationsStartImportParams = z.infer<\n    typeof MigrationsStartImportParamsSchema\n  >\n\n  export type MigrationsStartImportResponse = undefined\n\n  export const MigrationsCancelImportParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type MigrationsCancelImportParams = z.infer<\n    typeof MigrationsCancelImportParamsSchema\n  >\n\n  export type MigrationsCancelImportResponse = undefined\n\n  export const MigrationsUpdateImportParamsSchema = z.object({\n    vcs_username: z\n      .string()\n      .describe('The username to provide to the originating repository.')\n      .optional(),\n    vcs_password: z\n      .string()\n      .describe('The password to provide to the originating repository.')\n      .optional(),\n    vcs: z\n      .enum(['subversion', 'tfvc', 'git', 'mercurial'])\n      .describe('The type of version control system you are migrating from.')\n      .optional(),\n    tfvc_project: z\n      .string()\n      .describe(\n        'For a tfvc import, the name of the project that is being imported.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type MigrationsUpdateImportParams = z.infer<\n    typeof MigrationsUpdateImportParamsSchema\n  >\n\n  export const MigrationsUpdateImportResponseSchema = ImportSchema\n  export type MigrationsUpdateImportResponse = z.infer<\n    typeof MigrationsUpdateImportResponseSchema\n  >\n\n  export const MigrationsGetCommitAuthorsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    since: z\n      .number()\n      .int()\n      .describe('A user ID. Only return users with an ID greater than this ID.')\n      .optional()\n  })\n  export type MigrationsGetCommitAuthorsParams = z.infer<\n    typeof MigrationsGetCommitAuthorsParamsSchema\n  >\n\n  export const MigrationsGetCommitAuthorsResponseSchema =\n    z.array(PorterAuthorSchema)\n  export type MigrationsGetCommitAuthorsResponse = z.infer<\n    typeof MigrationsGetCommitAuthorsResponseSchema\n  >\n\n  export const MigrationsMapCommitAuthorParamsSchema = z.object({\n    email: z.string().describe('The new Git author email.').optional(),\n    name: z.string().describe('The new Git author name.').optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    author_id: z.number().int()\n  })\n  export type MigrationsMapCommitAuthorParams = z.infer<\n    typeof MigrationsMapCommitAuthorParamsSchema\n  >\n\n  export const MigrationsMapCommitAuthorResponseSchema = PorterAuthorSchema\n  export type MigrationsMapCommitAuthorResponse = z.infer<\n    typeof MigrationsMapCommitAuthorResponseSchema\n  >\n\n  export const MigrationsGetLargeFilesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type MigrationsGetLargeFilesParams = z.infer<\n    typeof MigrationsGetLargeFilesParamsSchema\n  >\n\n  export const MigrationsGetLargeFilesResponseSchema = z.array(\n    PorterLargeFileSchema\n  )\n  export type MigrationsGetLargeFilesResponse = z.infer<\n    typeof MigrationsGetLargeFilesResponseSchema\n  >\n\n  export const MigrationsSetLfsPreferenceParamsSchema = z.object({\n    use_lfs: z\n      .enum(['opt_in', 'opt_out'])\n      .describe(\n        'Whether to store large files during the import. `opt_in` means large files will be stored using Git LFS. `opt_out` means large files will be removed during the import.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type MigrationsSetLfsPreferenceParams = z.infer<\n    typeof MigrationsSetLfsPreferenceParamsSchema\n  >\n\n  export const MigrationsSetLfsPreferenceResponseSchema = ImportSchema\n  export type MigrationsSetLfsPreferenceResponse = z.infer<\n    typeof MigrationsSetLfsPreferenceResponseSchema\n  >\n\n  export const AppsGetRepoInstallationParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type AppsGetRepoInstallationParams = z.infer<\n    typeof AppsGetRepoInstallationParamsSchema\n  >\n\n  export const AppsGetRepoInstallationResponseSchema = InstallationSchema\n  export type AppsGetRepoInstallationResponse = z.infer<\n    typeof AppsGetRepoInstallationResponseSchema\n  >\n\n  export const InteractionsGetRestrictionsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type InteractionsGetRestrictionsForRepoParams = z.infer<\n    typeof InteractionsGetRestrictionsForRepoParamsSchema\n  >\n\n  export const InteractionsGetRestrictionsForRepoResponseSchema = z.union([\n    InteractionLimitResponseSchema,\n    z.object({}).strict()\n  ])\n  export type InteractionsGetRestrictionsForRepoResponse = z.infer<\n    typeof InteractionsGetRestrictionsForRepoResponseSchema\n  >\n\n  export const InteractionsSetRestrictionsForRepoParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .merge(InteractionLimitSchema)\n  export type InteractionsSetRestrictionsForRepoParams = z.infer<\n    typeof InteractionsSetRestrictionsForRepoParamsSchema\n  >\n\n  export const InteractionsSetRestrictionsForRepoResponseSchema =\n    InteractionLimitResponseSchema\n  export type InteractionsSetRestrictionsForRepoResponse = z.infer<\n    typeof InteractionsSetRestrictionsForRepoResponseSchema\n  >\n\n  export const InteractionsRemoveRestrictionsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type InteractionsRemoveRestrictionsForRepoParams = z.infer<\n    typeof InteractionsRemoveRestrictionsForRepoParamsSchema\n  >\n\n  export type InteractionsRemoveRestrictionsForRepoResponse = undefined\n\n  export const ReposListInvitationsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListInvitationsParams = z.infer<\n    typeof ReposListInvitationsParamsSchema\n  >\n\n  export const ReposListInvitationsResponseSchema = z.array(\n    RepositoryInvitationSchema\n  )\n  export type ReposListInvitationsResponse = z.infer<\n    typeof ReposListInvitationsResponseSchema\n  >\n\n  export const ReposDeleteInvitationParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    invitation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the invitation.')\n  })\n  export type ReposDeleteInvitationParams = z.infer<\n    typeof ReposDeleteInvitationParamsSchema\n  >\n\n  export type ReposDeleteInvitationResponse = undefined\n\n  export const ReposUpdateInvitationParamsSchema = z.object({\n    permissions: z\n      .enum(['read', 'write', 'maintain', 'triage', 'admin'])\n      .describe(\n        'The permissions that the associated user will have on the repository. Valid values are `read`, `write`, `maintain`, `triage`, and `admin`.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    invitation_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the invitation.')\n  })\n  export type ReposUpdateInvitationParams = z.infer<\n    typeof ReposUpdateInvitationParamsSchema\n  >\n\n  export const ReposUpdateInvitationResponseSchema = RepositoryInvitationSchema\n  export type ReposUpdateInvitationResponse = z.infer<\n    typeof ReposUpdateInvitationResponseSchema\n  >\n\n  export const IssuesListForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    milestone: z\n      .string()\n      .describe(\n        'If an `integer` is passed, it should refer to a milestone by its `number` field. If the string `*` is passed, issues with any milestone are accepted. If the string `none` is passed, issues without milestones are returned.'\n      )\n      .optional(),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Indicates the state of the issues to return.')\n      .default('open'),\n    assignee: z\n      .string()\n      .describe(\n        'Can be the name of a user. Pass in `none` for issues with no assigned user, and `*` for issues assigned to any user.'\n      )\n      .optional(),\n    type: z\n      .string()\n      .describe(\n        'Can be the name of an issue type. If the string `*` is passed, issues with any type are accepted. If the string `none` is passed, issues without type are returned.'\n      )\n      .optional(),\n    creator: z.string().describe('The user that created the issue.').optional(),\n    mentioned: z\n      .string()\n      .describe(\"A user that's mentioned in the issue.\")\n      .optional(),\n    labels: z\n      .string()\n      .describe(\n        'A list of comma separated label names. Example: `bug,ui,@high`'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated', 'comments'])\n      .describe('What to sort results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListForRepoParams = z.infer<\n    typeof IssuesListForRepoParamsSchema\n  >\n\n  export const IssuesListForRepoResponseSchema = z.array(IssueSchema)\n  export type IssuesListForRepoResponse = z.infer<\n    typeof IssuesListForRepoResponseSchema\n  >\n\n  export const IssuesCreateParamsSchema = z.object({\n    title: z\n      .union([z.string(), z.number().int()])\n      .describe('The title of the issue.'),\n    body: z.string().describe('The contents of the issue.').optional(),\n    assignee: z\n      .string()\n      .describe(\n        'Login for the user that this issue should be assigned to. _NOTE: Only users with push access can set the assignee for new issues. The assignee is silently dropped otherwise. **This field is closing down.**_'\n      )\n      .optional(),\n    milestone: z\n      .union([\n        z.string(),\n        z\n          .number()\n          .int()\n          .describe(\n            'The `number` of the milestone to associate this issue with. _NOTE: Only users with push access can set the milestone for new issues. The milestone is silently dropped otherwise._'\n          )\n      ])\n      .optional(),\n    labels: z\n      .array(\n        z.union([\n          z.string(),\n          z.object({\n            id: z.number().int().optional(),\n            name: z.string().optional(),\n            description: z.string().optional(),\n            color: z.string().optional()\n          })\n        ])\n      )\n      .describe(\n        'Labels to associate with this issue. _NOTE: Only users with push access can set labels for new issues. Labels are silently dropped otherwise._'\n      )\n      .optional(),\n    assignees: z\n      .array(z.string())\n      .describe(\n        'Logins for Users to assign to this issue. _NOTE: Only users with push access can set assignees for new issues. Assignees are silently dropped otherwise._'\n      )\n      .optional(),\n    type: z\n      .string()\n      .describe(\n        'The name of the issue type to associate with this issue. _NOTE: Only users with push access can set the type for new issues. The type is silently dropped otherwise._'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type IssuesCreateParams = z.infer<typeof IssuesCreateParamsSchema>\n\n  export type IssuesCreateResponse = undefined\n\n  export const IssuesListCommentsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe('The property to sort the results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('Either `asc` or `desc`. Ignored without the `sort` parameter.')\n      .optional(),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListCommentsForRepoParams = z.infer<\n    typeof IssuesListCommentsForRepoParamsSchema\n  >\n\n  export const IssuesListCommentsForRepoResponseSchema =\n    z.array(IssueCommentSchema)\n  export type IssuesListCommentsForRepoResponse = z.infer<\n    typeof IssuesListCommentsForRepoResponseSchema\n  >\n\n  export const IssuesGetCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type IssuesGetCommentParams = z.infer<\n    typeof IssuesGetCommentParamsSchema\n  >\n\n  export const IssuesGetCommentResponseSchema = IssueCommentSchema\n  export type IssuesGetCommentResponse = z.infer<\n    typeof IssuesGetCommentResponseSchema\n  >\n\n  export const IssuesDeleteCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type IssuesDeleteCommentParams = z.infer<\n    typeof IssuesDeleteCommentParamsSchema\n  >\n\n  export type IssuesDeleteCommentResponse = undefined\n\n  export const IssuesUpdateCommentParamsSchema = z.object({\n    body: z.string().describe('The contents of the comment.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type IssuesUpdateCommentParams = z.infer<\n    typeof IssuesUpdateCommentParamsSchema\n  >\n\n  export const IssuesUpdateCommentResponseSchema = IssueCommentSchema\n  export type IssuesUpdateCommentResponse = z.infer<\n    typeof IssuesUpdateCommentResponseSchema\n  >\n\n  export const ReactionsListForIssueCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.'),\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to an issue comment.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReactionsListForIssueCommentParams = z.infer<\n    typeof ReactionsListForIssueCommentParamsSchema\n  >\n\n  export const ReactionsListForIssueCommentResponseSchema =\n    z.array(ReactionSchema)\n  export type ReactionsListForIssueCommentResponse = z.infer<\n    typeof ReactionsListForIssueCommentResponseSchema\n  >\n\n  export const ReactionsCreateForIssueCommentParamsSchema = z.object({\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the issue comment.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type ReactionsCreateForIssueCommentParams = z.infer<\n    typeof ReactionsCreateForIssueCommentParamsSchema\n  >\n\n  export const ReactionsCreateForIssueCommentResponseSchema = ReactionSchema\n  export type ReactionsCreateForIssueCommentResponse = z.infer<\n    typeof ReactionsCreateForIssueCommentResponseSchema\n  >\n\n  export const ReactionsDeleteForIssueCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.'),\n    reaction_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the reaction.')\n  })\n  export type ReactionsDeleteForIssueCommentParams = z.infer<\n    typeof ReactionsDeleteForIssueCommentParamsSchema\n  >\n\n  export type ReactionsDeleteForIssueCommentResponse = undefined\n\n  export const IssuesListEventsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListEventsForRepoParams = z.infer<\n    typeof IssuesListEventsForRepoParamsSchema\n  >\n\n  export const IssuesListEventsForRepoResponseSchema = z.array(IssueEventSchema)\n  export type IssuesListEventsForRepoResponse = z.infer<\n    typeof IssuesListEventsForRepoResponseSchema\n  >\n\n  export const IssuesGetEventParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    event_id: z.number().int()\n  })\n  export type IssuesGetEventParams = z.infer<typeof IssuesGetEventParamsSchema>\n\n  export const IssuesGetEventResponseSchema = IssueEventSchema\n  export type IssuesGetEventResponse = z.infer<\n    typeof IssuesGetEventResponseSchema\n  >\n\n  export const IssuesGetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesGetParams = z.infer<typeof IssuesGetParamsSchema>\n\n  export const IssuesGetResponseSchema = IssueSchema\n  export type IssuesGetResponse = z.infer<typeof IssuesGetResponseSchema>\n\n  export const IssuesUpdateParamsSchema = z.object({\n    title: z\n      .union([z.string(), z.number().int()])\n      .describe('The title of the issue.')\n      .optional(),\n    body: z.string().describe('The contents of the issue.').optional(),\n    assignee: z\n      .string()\n      .describe(\n        'Username to assign to this issue. **This field is closing down.**'\n      )\n      .optional(),\n    state: z\n      .enum(['open', 'closed'])\n      .describe('The open or closed state of the issue.')\n      .optional(),\n    state_reason: z\n      .enum(['completed', 'not_planned', 'reopened'])\n      .describe(\n        'The reason for the state change. Ignored unless `state` is changed.'\n      )\n      .optional(),\n    milestone: z\n      .union([\n        z.string(),\n        z\n          .number()\n          .int()\n          .describe(\n            'The `number` of the milestone to associate this issue with or use `null` to remove the current milestone. Only users with push access can set the milestone for issues. Without push access to the repository, milestone changes are silently dropped.'\n          )\n      ])\n      .optional(),\n    labels: z\n      .array(\n        z.union([\n          z.string(),\n          z.object({\n            id: z.number().int().optional(),\n            name: z.string().optional(),\n            description: z.string().optional(),\n            color: z.string().optional()\n          })\n        ])\n      )\n      .describe(\n        'Labels to associate with this issue. Pass one or more labels to _replace_ the set of labels on this issue. Send an empty array (`[]`) to clear all labels from the issue. Only users with push access can set labels for issues. Without push access to the repository, label changes are silently dropped.'\n      )\n      .optional(),\n    assignees: z\n      .array(z.string())\n      .describe(\n        'Usernames to assign to this issue. Pass one or more user logins to _replace_ the set of assignees on this issue. Send an empty array (`[]`) to clear all assignees from the issue. Only users with push access can set assignees for new issues. Without push access to the repository, assignee changes are silently dropped.'\n      )\n      .optional(),\n    type: z\n      .string()\n      .describe(\n        'The name of the issue type to associate with this issue or use `null` to remove the current issue type. Only users with push access can set the type for issues. Without push access to the repository, type changes are silently dropped.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesUpdateParams = z.infer<typeof IssuesUpdateParamsSchema>\n\n  export const IssuesUpdateResponseSchema = IssueSchema\n  export type IssuesUpdateResponse = z.infer<typeof IssuesUpdateResponseSchema>\n\n  export const IssuesAddAssigneesParamsSchema = z.object({\n    assignees: z\n      .array(z.string())\n      .describe(\n        'Usernames of people to assign this issue to. _NOTE: Only users with push access can add assignees to an issue. Assignees are silently ignored otherwise._'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesAddAssigneesParams = z.infer<\n    typeof IssuesAddAssigneesParamsSchema\n  >\n\n  export type IssuesAddAssigneesResponse = undefined\n\n  export const IssuesRemoveAssigneesParamsSchema = z.object({\n    assignees: z\n      .array(z.string())\n      .describe(\n        'Usernames of assignees to remove from an issue. _NOTE: Only users with push access can remove assignees from an issue. Assignees are silently ignored otherwise._'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesRemoveAssigneesParams = z.infer<\n    typeof IssuesRemoveAssigneesParamsSchema\n  >\n\n  export const IssuesRemoveAssigneesResponseSchema = IssueSchema\n  export type IssuesRemoveAssigneesResponse = z.infer<\n    typeof IssuesRemoveAssigneesResponseSchema\n  >\n\n  export const IssuesCheckUserCanBeAssignedToIssueParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    assignee: z.string()\n  })\n  export type IssuesCheckUserCanBeAssignedToIssueParams = z.infer<\n    typeof IssuesCheckUserCanBeAssignedToIssueParamsSchema\n  >\n\n  export type IssuesCheckUserCanBeAssignedToIssueResponse = undefined\n\n  export const IssuesListCommentsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListCommentsParams = z.infer<\n    typeof IssuesListCommentsParamsSchema\n  >\n\n  export const IssuesListCommentsResponseSchema = z.array(IssueCommentSchema)\n  export type IssuesListCommentsResponse = z.infer<\n    typeof IssuesListCommentsResponseSchema\n  >\n\n  export const IssuesCreateCommentParamsSchema = z.object({\n    body: z.string().describe('The contents of the comment.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesCreateCommentParams = z.infer<\n    typeof IssuesCreateCommentParamsSchema\n  >\n\n  export type IssuesCreateCommentResponse = undefined\n\n  export const IssuesListEventsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListEventsParams = z.infer<\n    typeof IssuesListEventsParamsSchema\n  >\n\n  export const IssuesListEventsResponseSchema = z.array(\n    IssueEventForIssueSchema\n  )\n  export type IssuesListEventsResponse = z.infer<\n    typeof IssuesListEventsResponseSchema\n  >\n\n  export const IssuesListLabelsOnIssueParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListLabelsOnIssueParams = z.infer<\n    typeof IssuesListLabelsOnIssueParamsSchema\n  >\n\n  export const IssuesListLabelsOnIssueResponseSchema = z.array(LabelSchema)\n  export type IssuesListLabelsOnIssueResponse = z.infer<\n    typeof IssuesListLabelsOnIssueResponseSchema\n  >\n\n  export const IssuesAddLabelsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      issue_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the issue.')\n    })\n    .and(\n      z.union([\n        z.object({\n          labels: z\n            .array(z.string())\n            .min(1)\n            .describe(\n              'The names of the labels to add to the issue\\'s existing labels. You can pass an empty array to remove all labels. Alternatively, you can pass a single label as a `string` or an `array` of labels directly, but GitHub recommends passing an object with the `labels` key. You can also replace all of the labels for an issue. For more information, see \"[Set labels for an issue](https://docs.github.com/rest/issues/labels#set-labels-for-an-issue).\"'\n            )\n            .optional()\n        }),\n        z.array(z.string()).min(1),\n        z.object({\n          labels: z\n            .array(z.object({ name: z.string() }))\n            .min(1)\n            .optional()\n        }),\n        z.array(z.object({ name: z.string() })).min(1),\n        z.string()\n      ])\n    )\n  export type IssuesAddLabelsParams = z.infer<\n    typeof IssuesAddLabelsParamsSchema\n  >\n\n  export const IssuesAddLabelsResponseSchema = z.array(LabelSchema)\n  export type IssuesAddLabelsResponse = z.infer<\n    typeof IssuesAddLabelsResponseSchema\n  >\n\n  export const IssuesSetLabelsParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      issue_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the issue.')\n    })\n    .and(\n      z.union([\n        z.object({\n          labels: z\n            .array(z.string())\n            .min(1)\n            .describe(\n              'The names of the labels to set for the issue. The labels you set replace any existing labels. You can pass an empty array to remove all labels. Alternatively, you can pass a single label as a `string` or an `array` of labels directly, but GitHub recommends passing an object with the `labels` key. You can also add labels to the existing labels for an issue. For more information, see \"[Add labels to an issue](https://docs.github.com/rest/issues/labels#add-labels-to-an-issue).\"'\n            )\n            .optional()\n        }),\n        z.array(z.string()).min(1),\n        z.object({\n          labels: z\n            .array(z.object({ name: z.string() }))\n            .min(1)\n            .optional()\n        }),\n        z.array(z.object({ name: z.string() })).min(1),\n        z.string()\n      ])\n    )\n  export type IssuesSetLabelsParams = z.infer<\n    typeof IssuesSetLabelsParamsSchema\n  >\n\n  export const IssuesSetLabelsResponseSchema = z.array(LabelSchema)\n  export type IssuesSetLabelsResponse = z.infer<\n    typeof IssuesSetLabelsResponseSchema\n  >\n\n  export const IssuesRemoveAllLabelsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesRemoveAllLabelsParams = z.infer<\n    typeof IssuesRemoveAllLabelsParamsSchema\n  >\n\n  export type IssuesRemoveAllLabelsResponse = undefined\n\n  export const IssuesRemoveLabelParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    name: z.string()\n  })\n  export type IssuesRemoveLabelParams = z.infer<\n    typeof IssuesRemoveLabelParamsSchema\n  >\n\n  export const IssuesRemoveLabelResponseSchema = z.array(LabelSchema)\n  export type IssuesRemoveLabelResponse = z.infer<\n    typeof IssuesRemoveLabelResponseSchema\n  >\n\n  export const IssuesLockParamsSchema = z.object({\n    lock_reason: z\n      .enum(['off-topic', 'too heated', 'resolved', 'spam'])\n      .describe(\n        \"The reason for locking the issue or pull request conversation. Lock will fail if you don't use one of these reasons:  \\n * `off-topic`  \\n * `too heated`  \\n * `resolved`  \\n * `spam`\"\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesLockParams = z.infer<typeof IssuesLockParamsSchema>\n\n  export type IssuesLockResponse = undefined\n\n  export const IssuesUnlockParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesUnlockParams = z.infer<typeof IssuesUnlockParamsSchema>\n\n  export type IssuesUnlockResponse = undefined\n\n  export const ReactionsListForIssueParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to an issue.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReactionsListForIssueParams = z.infer<\n    typeof ReactionsListForIssueParamsSchema\n  >\n\n  export const ReactionsListForIssueResponseSchema = z.array(ReactionSchema)\n  export type ReactionsListForIssueResponse = z.infer<\n    typeof ReactionsListForIssueResponseSchema\n  >\n\n  export const ReactionsCreateForIssueParamsSchema = z.object({\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the issue.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type ReactionsCreateForIssueParams = z.infer<\n    typeof ReactionsCreateForIssueParamsSchema\n  >\n\n  export const ReactionsCreateForIssueResponseSchema = ReactionSchema\n  export type ReactionsCreateForIssueResponse = z.infer<\n    typeof ReactionsCreateForIssueResponseSchema\n  >\n\n  export const ReactionsDeleteForIssueParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    reaction_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the reaction.')\n  })\n  export type ReactionsDeleteForIssueParams = z.infer<\n    typeof ReactionsDeleteForIssueParamsSchema\n  >\n\n  export type ReactionsDeleteForIssueResponse = undefined\n\n  export const IssuesRemoveSubIssueParamsSchema = z.object({\n    sub_issue_id: z\n      .number()\n      .int()\n      .describe('The id of the sub-issue to remove'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesRemoveSubIssueParams = z.infer<\n    typeof IssuesRemoveSubIssueParamsSchema\n  >\n\n  export const IssuesRemoveSubIssueResponseSchema = IssueSchema\n  export type IssuesRemoveSubIssueResponse = z.infer<\n    typeof IssuesRemoveSubIssueResponseSchema\n  >\n\n  export const IssuesListSubIssuesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListSubIssuesParams = z.infer<\n    typeof IssuesListSubIssuesParamsSchema\n  >\n\n  export const IssuesListSubIssuesResponseSchema = z.array(IssueSchema)\n  export type IssuesListSubIssuesResponse = z.infer<\n    typeof IssuesListSubIssuesResponseSchema\n  >\n\n  export const IssuesAddSubIssueParamsSchema = z.object({\n    sub_issue_id: z\n      .number()\n      .int()\n      .describe(\n        'The id of the sub-issue to add. The sub-issue must belong to the same repository owner as the parent issue'\n      ),\n    replace_parent: z\n      .boolean()\n      .describe(\n        'Option that, when true, instructs the operation to replace the sub-issues current parent issue'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesAddSubIssueParams = z.infer<\n    typeof IssuesAddSubIssueParamsSchema\n  >\n\n  export type IssuesAddSubIssueResponse = undefined\n\n  export const IssuesReprioritizeSubIssueParamsSchema = z.object({\n    sub_issue_id: z\n      .number()\n      .int()\n      .describe('The id of the sub-issue to reprioritize'),\n    after_id: z\n      .number()\n      .int()\n      .describe(\n        'The id of the sub-issue to be prioritized after (either positional argument after OR before should be specified).'\n      )\n      .optional(),\n    before_id: z\n      .number()\n      .int()\n      .describe(\n        'The id of the sub-issue to be prioritized before (either positional argument after OR before should be specified).'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.')\n  })\n  export type IssuesReprioritizeSubIssueParams = z.infer<\n    typeof IssuesReprioritizeSubIssueParamsSchema\n  >\n\n  export const IssuesReprioritizeSubIssueResponseSchema = IssueSchema\n  export type IssuesReprioritizeSubIssueResponse = z.infer<\n    typeof IssuesReprioritizeSubIssueResponseSchema\n  >\n\n  export const IssuesListEventsForTimelineParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    issue_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the issue.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListEventsForTimelineParams = z.infer<\n    typeof IssuesListEventsForTimelineParamsSchema\n  >\n\n  export const IssuesListEventsForTimelineResponseSchema = z.array(\n    TimelineIssueEventsSchema\n  )\n  export type IssuesListEventsForTimelineResponse = z.infer<\n    typeof IssuesListEventsForTimelineResponseSchema\n  >\n\n  export const ReposListDeployKeysParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListDeployKeysParams = z.infer<\n    typeof ReposListDeployKeysParamsSchema\n  >\n\n  export const ReposListDeployKeysResponseSchema = z.array(DeployKeySchema)\n  export type ReposListDeployKeysResponse = z.infer<\n    typeof ReposListDeployKeysResponseSchema\n  >\n\n  export const ReposCreateDeployKeyParamsSchema = z.object({\n    title: z.string().describe('A name for the key.').optional(),\n    key: z.string().describe('The contents of the key.'),\n    read_only: z\n      .boolean()\n      .describe(\n        'If `true`, the key will only be able to read repository contents. Otherwise, the key will be able to read and write.  \\n  \\nDeploy keys with write access can perform the same actions as an organization member with admin access, or a collaborator on a personal repository. For more information, see \"[Repository permission levels for an organization](https://docs.github.com/articles/repository-permission-levels-for-an-organization/)\" and \"[Permission levels for a user account repository](https://docs.github.com/articles/permission-levels-for-a-user-account-repository/).\"'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateDeployKeyParams = z.infer<\n    typeof ReposCreateDeployKeyParamsSchema\n  >\n\n  export type ReposCreateDeployKeyResponse = undefined\n\n  export const ReposGetDeployKeyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    key_id: z.number().int().describe('The unique identifier of the key.')\n  })\n  export type ReposGetDeployKeyParams = z.infer<\n    typeof ReposGetDeployKeyParamsSchema\n  >\n\n  export const ReposGetDeployKeyResponseSchema = DeployKeySchema\n  export type ReposGetDeployKeyResponse = z.infer<\n    typeof ReposGetDeployKeyResponseSchema\n  >\n\n  export const ReposDeleteDeployKeyParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    key_id: z.number().int().describe('The unique identifier of the key.')\n  })\n  export type ReposDeleteDeployKeyParams = z.infer<\n    typeof ReposDeleteDeployKeyParamsSchema\n  >\n\n  export type ReposDeleteDeployKeyResponse = undefined\n\n  export const IssuesListLabelsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListLabelsForRepoParams = z.infer<\n    typeof IssuesListLabelsForRepoParamsSchema\n  >\n\n  export const IssuesListLabelsForRepoResponseSchema = z.array(LabelSchema)\n  export type IssuesListLabelsForRepoResponse = z.infer<\n    typeof IssuesListLabelsForRepoResponseSchema\n  >\n\n  export const IssuesCreateLabelParamsSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        'The name of the label. Emoji can be added to label names, using either native emoji or colon-style markup. For example, typing `:strawberry:` will render the emoji ![:strawberry:](https://github.githubassets.com/images/icons/emoji/unicode/1f353.png \":strawberry:\"). For a full list of available emoji and codes, see \"[Emoji cheat sheet](https://github.com/ikatyang/emoji-cheat-sheet).\"'\n      ),\n    color: z\n      .string()\n      .describe(\n        'The [hexadecimal color code](http://www.color-hex.com/) for the label, without the leading `#`.'\n      )\n      .optional(),\n    description: z\n      .string()\n      .describe(\n        'A short description of the label. Must be 100 characters or fewer.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type IssuesCreateLabelParams = z.infer<\n    typeof IssuesCreateLabelParamsSchema\n  >\n\n  export type IssuesCreateLabelResponse = undefined\n\n  export const IssuesGetLabelParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    name: z.string()\n  })\n  export type IssuesGetLabelParams = z.infer<typeof IssuesGetLabelParamsSchema>\n\n  export const IssuesGetLabelResponseSchema = LabelSchema\n  export type IssuesGetLabelResponse = z.infer<\n    typeof IssuesGetLabelResponseSchema\n  >\n\n  export const IssuesDeleteLabelParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    name: z.string()\n  })\n  export type IssuesDeleteLabelParams = z.infer<\n    typeof IssuesDeleteLabelParamsSchema\n  >\n\n  export type IssuesDeleteLabelResponse = undefined\n\n  export const IssuesUpdateLabelParamsSchema = z.object({\n    new_name: z\n      .string()\n      .describe(\n        'The new name of the label. Emoji can be added to label names, using either native emoji or colon-style markup. For example, typing `:strawberry:` will render the emoji ![:strawberry:](https://github.githubassets.com/images/icons/emoji/unicode/1f353.png \":strawberry:\"). For a full list of available emoji and codes, see \"[Emoji cheat sheet](https://github.com/ikatyang/emoji-cheat-sheet).\"'\n      )\n      .optional(),\n    color: z\n      .string()\n      .describe(\n        'The [hexadecimal color code](http://www.color-hex.com/) for the label, without the leading `#`.'\n      )\n      .optional(),\n    description: z\n      .string()\n      .describe(\n        'A short description of the label. Must be 100 characters or fewer.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    name: z.string()\n  })\n  export type IssuesUpdateLabelParams = z.infer<\n    typeof IssuesUpdateLabelParamsSchema\n  >\n\n  export const IssuesUpdateLabelResponseSchema = LabelSchema\n  export type IssuesUpdateLabelResponse = z.infer<\n    typeof IssuesUpdateLabelResponseSchema\n  >\n\n  export const ReposListLanguagesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposListLanguagesParams = z.infer<\n    typeof ReposListLanguagesParamsSchema\n  >\n\n  export const ReposListLanguagesResponseSchema = LanguageSchema\n  export type ReposListLanguagesResponse = z.infer<\n    typeof ReposListLanguagesResponseSchema\n  >\n\n  export const LicensesGetForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .any()\n      .describe(\n        'The Git reference for the results you want to list. The `ref` for a branch can be formatted either as `refs/heads/<branch name>` or simply `<branch name>`. To reference a pull request use `refs/pull/<number>/merge`.'\n      )\n      .optional()\n  })\n  export type LicensesGetForRepoParams = z.infer<\n    typeof LicensesGetForRepoParamsSchema\n  >\n\n  export const LicensesGetForRepoResponseSchema = LicenseContentSchema\n  export type LicensesGetForRepoResponse = z.infer<\n    typeof LicensesGetForRepoResponseSchema\n  >\n\n  export const ReposMergeUpstreamParamsSchema = z.object({\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch which should be updated to match upstream.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposMergeUpstreamParams = z.infer<\n    typeof ReposMergeUpstreamParamsSchema\n  >\n\n  export const ReposMergeUpstreamResponseSchema = MergedUpstreamSchema\n  export type ReposMergeUpstreamResponse = z.infer<\n    typeof ReposMergeUpstreamResponseSchema\n  >\n\n  export const ReposMergeParamsSchema = z.object({\n    base: z\n      .string()\n      .describe(\n        'The name of the base branch that the head will be merged into.'\n      ),\n    head: z\n      .string()\n      .describe(\n        'The head to merge. This can be a branch name or a commit SHA1.'\n      ),\n    commit_message: z\n      .string()\n      .describe(\n        'Commit message to use for the merge commit. If omitted, a default message will be used.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposMergeParams = z.infer<typeof ReposMergeParamsSchema>\n\n  export type ReposMergeResponse = undefined\n\n  export const IssuesListMilestonesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe(\n        'The state of the milestone. Either `open`, `closed`, or `all`.'\n      )\n      .default('open'),\n    sort: z\n      .enum(['due_on', 'completeness'])\n      .describe('What to sort results by. Either `due_on` or `completeness`.')\n      .default('due_on'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction of the sort. Either `asc` or `desc`.')\n      .default('asc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListMilestonesParams = z.infer<\n    typeof IssuesListMilestonesParamsSchema\n  >\n\n  export const IssuesListMilestonesResponseSchema = z.array(MilestoneSchema)\n  export type IssuesListMilestonesResponse = z.infer<\n    typeof IssuesListMilestonesResponseSchema\n  >\n\n  export const IssuesCreateMilestoneParamsSchema = z.object({\n    title: z.string().describe('The title of the milestone.'),\n    state: z\n      .enum(['open', 'closed'])\n      .describe('The state of the milestone. Either `open` or `closed`.')\n      .default('open'),\n    description: z\n      .string()\n      .describe('A description of the milestone.')\n      .optional(),\n    due_on: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The milestone due date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type IssuesCreateMilestoneParams = z.infer<\n    typeof IssuesCreateMilestoneParamsSchema\n  >\n\n  export type IssuesCreateMilestoneResponse = undefined\n\n  export const IssuesGetMilestoneParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    milestone_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the milestone.')\n  })\n  export type IssuesGetMilestoneParams = z.infer<\n    typeof IssuesGetMilestoneParamsSchema\n  >\n\n  export const IssuesGetMilestoneResponseSchema = MilestoneSchema\n  export type IssuesGetMilestoneResponse = z.infer<\n    typeof IssuesGetMilestoneResponseSchema\n  >\n\n  export const IssuesDeleteMilestoneParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    milestone_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the milestone.')\n  })\n  export type IssuesDeleteMilestoneParams = z.infer<\n    typeof IssuesDeleteMilestoneParamsSchema\n  >\n\n  export type IssuesDeleteMilestoneResponse = undefined\n\n  export const IssuesUpdateMilestoneParamsSchema = z.object({\n    title: z.string().describe('The title of the milestone.').optional(),\n    state: z\n      .enum(['open', 'closed'])\n      .describe('The state of the milestone. Either `open` or `closed`.')\n      .default('open'),\n    description: z\n      .string()\n      .describe('A description of the milestone.')\n      .optional(),\n    due_on: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'The milestone due date. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    milestone_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the milestone.')\n  })\n  export type IssuesUpdateMilestoneParams = z.infer<\n    typeof IssuesUpdateMilestoneParamsSchema\n  >\n\n  export const IssuesUpdateMilestoneResponseSchema = MilestoneSchema\n  export type IssuesUpdateMilestoneResponse = z.infer<\n    typeof IssuesUpdateMilestoneResponseSchema\n  >\n\n  export const IssuesListLabelsForMilestoneParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    milestone_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the milestone.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListLabelsForMilestoneParams = z.infer<\n    typeof IssuesListLabelsForMilestoneParamsSchema\n  >\n\n  export const IssuesListLabelsForMilestoneResponseSchema = z.array(LabelSchema)\n  export type IssuesListLabelsForMilestoneResponse = z.infer<\n    typeof IssuesListLabelsForMilestoneResponseSchema\n  >\n\n  export const ActivityListRepoNotificationsForAuthenticatedUserParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      all: z\n        .boolean()\n        .describe('If `true`, show notifications marked as read.')\n        .default(false),\n      participating: z\n        .boolean()\n        .describe(\n          'If `true`, only shows notifications in which the user is directly participating or mentioned.'\n        )\n        .default(false),\n      since: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      before: z\n        .string()\n        .datetime({ offset: true })\n        .describe(\n          'Only show notifications updated before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n        )\n        .optional(),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type ActivityListRepoNotificationsForAuthenticatedUserParams = z.infer<\n    typeof ActivityListRepoNotificationsForAuthenticatedUserParamsSchema\n  >\n\n  export const ActivityListRepoNotificationsForAuthenticatedUserResponseSchema =\n    z.array(ThreadSchema)\n  export type ActivityListRepoNotificationsForAuthenticatedUserResponse =\n    z.infer<\n      typeof ActivityListRepoNotificationsForAuthenticatedUserResponseSchema\n    >\n\n  export const ActivityMarkRepoNotificationsAsReadParamsSchema = z.object({\n    last_read_at: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Describes the last point that notifications were checked. Anything updated since this time will not be marked as read. If you omit this parameter, all notifications are marked as read. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`. Default: The current timestamp.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActivityMarkRepoNotificationsAsReadParams = z.infer<\n    typeof ActivityMarkRepoNotificationsAsReadParamsSchema\n  >\n\n  export type ActivityMarkRepoNotificationsAsReadResponse = undefined\n\n  export const ReposGetPagesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetPagesParams = z.infer<typeof ReposGetPagesParamsSchema>\n\n  export const ReposGetPagesResponseSchema = PageSchema\n  export type ReposGetPagesResponse = z.infer<\n    typeof ReposGetPagesResponseSchema\n  >\n\n  export const ReposCreatePagesSiteParamsSchema = z\n    .object({\n      build_type: z\n        .enum(['legacy', 'workflow'])\n        .describe(\n          'The process in which the Page will be built. Possible values are `\"legacy\"` and `\"workflow\"`.'\n        )\n        .optional(),\n      source: z\n        .object({\n          branch: z\n            .string()\n            .describe(\n              \"The repository branch used to publish your site's source files.\"\n            ),\n          path: z\n            .enum(['/', '/docs'])\n            .describe(\n              'The repository directory that includes the source files for the Pages site. Allowed paths are `/` or `/docs`. Default: `/`'\n            )\n            .default('/')\n        })\n        .describe(\n          'The source branch and directory used to publish your Pages site.'\n        )\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .and(z.union([z.any(), z.any()]))\n  export type ReposCreatePagesSiteParams = z.infer<\n    typeof ReposCreatePagesSiteParamsSchema\n  >\n\n  export type ReposCreatePagesSiteResponse = undefined\n\n  export const ReposUpdateInformationAboutPagesSiteParamsSchema = z\n    .object({\n      cname: z\n        .string()\n        .describe(\n          'Specify a custom domain for the repository. Sending a `null` value will remove the custom domain. For more about custom domains, see \"[Using a custom domain with GitHub Pages](https://docs.github.com/pages/configuring-a-custom-domain-for-your-github-pages-site).\"'\n        )\n        .optional(),\n      https_enforced: z\n        .boolean()\n        .describe(\n          'Specify whether HTTPS should be enforced for the repository.'\n        )\n        .optional(),\n      build_type: z\n        .enum(['legacy', 'workflow'])\n        .describe(\n          'The process by which the GitHub Pages site will be built. `workflow` means that the site is built by a custom GitHub Actions workflow. `legacy` means that the site is built by GitHub when changes are pushed to a specific branch.'\n        )\n        .optional(),\n      source: z\n        .union([\n          z\n            .enum(['gh-pages', 'master', 'master /docs'])\n            .describe(\n              'Update the source for the repository. Must include the branch name, and may optionally specify the subdirectory `/docs`. Possible values are `\"gh-pages\"`, `\"master\"`, and `\"master /docs\"`.'\n            ),\n          z\n            .object({\n              branch: z\n                .string()\n                .describe(\n                  \"The repository branch used to publish your site's source files.\"\n                ),\n              path: z\n                .enum(['/', '/docs'])\n                .describe(\n                  'The repository directory that includes the source files for the Pages site. Allowed paths are `/` or `/docs`.'\n                )\n            })\n            .describe(\n              'Update the source for the repository. Must include the branch name and path.'\n            )\n        ])\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .and(z.union([z.any(), z.any(), z.any(), z.any(), z.any()]))\n  export type ReposUpdateInformationAboutPagesSiteParams = z.infer<\n    typeof ReposUpdateInformationAboutPagesSiteParamsSchema\n  >\n\n  export type ReposUpdateInformationAboutPagesSiteResponse = undefined\n\n  export const ReposDeletePagesSiteParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposDeletePagesSiteParams = z.infer<\n    typeof ReposDeletePagesSiteParamsSchema\n  >\n\n  export type ReposDeletePagesSiteResponse = undefined\n\n  export const ReposListPagesBuildsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListPagesBuildsParams = z.infer<\n    typeof ReposListPagesBuildsParamsSchema\n  >\n\n  export const ReposListPagesBuildsResponseSchema = z.array(PageBuildSchema)\n  export type ReposListPagesBuildsResponse = z.infer<\n    typeof ReposListPagesBuildsResponseSchema\n  >\n\n  export const ReposRequestPagesBuildParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposRequestPagesBuildParams = z.infer<\n    typeof ReposRequestPagesBuildParamsSchema\n  >\n\n  export type ReposRequestPagesBuildResponse = undefined\n\n  export const ReposGetLatestPagesBuildParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetLatestPagesBuildParams = z.infer<\n    typeof ReposGetLatestPagesBuildParamsSchema\n  >\n\n  export const ReposGetLatestPagesBuildResponseSchema = PageBuildSchema\n  export type ReposGetLatestPagesBuildResponse = z.infer<\n    typeof ReposGetLatestPagesBuildResponseSchema\n  >\n\n  export const ReposGetPagesBuildParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    build_id: z.number().int()\n  })\n  export type ReposGetPagesBuildParams = z.infer<\n    typeof ReposGetPagesBuildParamsSchema\n  >\n\n  export const ReposGetPagesBuildResponseSchema = PageBuildSchema\n  export type ReposGetPagesBuildResponse = z.infer<\n    typeof ReposGetPagesBuildResponseSchema\n  >\n\n  export const ReposCreatePagesDeploymentParamsSchema = z.object({\n    artifact_id: z\n      .number()\n      .describe(\n        'The ID of an artifact that contains the .zip or .tar of static assets to deploy. The artifact belongs to the repository. Either `artifact_id` or `artifact_url` are required.'\n      )\n      .optional(),\n    artifact_url: z\n      .string()\n      .describe(\n        'The URL of an artifact that contains the .zip or .tar of static assets to deploy. The artifact belongs to the repository. Either `artifact_id` or `artifact_url` are required.'\n      )\n      .optional(),\n    environment: z\n      .string()\n      .describe('The target environment for this GitHub Pages deployment.')\n      .default('github-pages'),\n    pages_build_version: z\n      .string()\n      .describe(\n        'A unique string that represents the version of the build for this deployment.'\n      )\n      .default('GITHUB_SHA'),\n    oidc_token: z\n      .string()\n      .describe(\n        'The OIDC token issued by GitHub Actions certifying the origin of the deployment.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreatePagesDeploymentParams = z.infer<\n    typeof ReposCreatePagesDeploymentParamsSchema\n  >\n\n  export const ReposCreatePagesDeploymentResponseSchema = PageDeploymentSchema\n  export type ReposCreatePagesDeploymentResponse = z.infer<\n    typeof ReposCreatePagesDeploymentResponseSchema\n  >\n\n  export const ReposGetPagesDeploymentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pages_deployment_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the Pages deployment. You can also give the commit SHA of the deployment.'\n      )\n  })\n  export type ReposGetPagesDeploymentParams = z.infer<\n    typeof ReposGetPagesDeploymentParamsSchema\n  >\n\n  export const ReposGetPagesDeploymentResponseSchema =\n    PagesDeploymentStatusSchema\n  export type ReposGetPagesDeploymentResponse = z.infer<\n    typeof ReposGetPagesDeploymentResponseSchema\n  >\n\n  export const ReposCancelPagesDeploymentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pages_deployment_id: z\n      .union([z.number().int(), z.string()])\n      .describe(\n        'The ID of the Pages deployment. You can also give the commit SHA of the deployment.'\n      )\n  })\n  export type ReposCancelPagesDeploymentParams = z.infer<\n    typeof ReposCancelPagesDeploymentParamsSchema\n  >\n\n  export type ReposCancelPagesDeploymentResponse = undefined\n\n  export const ReposGetPagesHealthCheckParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetPagesHealthCheckParams = z.infer<\n    typeof ReposGetPagesHealthCheckParamsSchema\n  >\n\n  export const ReposGetPagesHealthCheckResponseSchema = PagesHealthCheckSchema\n  export type ReposGetPagesHealthCheckResponse = z.infer<\n    typeof ReposGetPagesHealthCheckResponseSchema\n  >\n\n  export const ReposCheckPrivateVulnerabilityReportingParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCheckPrivateVulnerabilityReportingParams = z.infer<\n    typeof ReposCheckPrivateVulnerabilityReportingParamsSchema\n  >\n\n  export const ReposCheckPrivateVulnerabilityReportingResponseSchema = z.object(\n    {\n      enabled: z\n        .boolean()\n        .describe(\n          'Whether or not private vulnerability reporting is enabled for the repository.'\n        )\n    }\n  )\n  export type ReposCheckPrivateVulnerabilityReportingResponse = z.infer<\n    typeof ReposCheckPrivateVulnerabilityReportingResponseSchema\n  >\n\n  export const ReposEnablePrivateVulnerabilityReportingParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposEnablePrivateVulnerabilityReportingParams = z.infer<\n    typeof ReposEnablePrivateVulnerabilityReportingParamsSchema\n  >\n\n  export type ReposEnablePrivateVulnerabilityReportingResponse = undefined\n\n  export const ReposDisablePrivateVulnerabilityReportingParamsSchema = z.object(\n    {\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    }\n  )\n  export type ReposDisablePrivateVulnerabilityReportingParams = z.infer<\n    typeof ReposDisablePrivateVulnerabilityReportingParamsSchema\n  >\n\n  export type ReposDisablePrivateVulnerabilityReportingResponse = undefined\n\n  export const ProjectsListForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Indicates the state of the projects to return.')\n      .default('open'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ProjectsListForRepoParams = z.infer<\n    typeof ProjectsListForRepoParamsSchema\n  >\n\n  export const ProjectsListForRepoResponseSchema = z.array(ProjectSchema)\n  export type ProjectsListForRepoResponse = z.infer<\n    typeof ProjectsListForRepoResponseSchema\n  >\n\n  export const ProjectsCreateForRepoParamsSchema = z.object({\n    name: z.string().describe('The name of the project.'),\n    body: z.string().describe('The description of the project.').optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ProjectsCreateForRepoParams = z.infer<\n    typeof ProjectsCreateForRepoParamsSchema\n  >\n\n  export type ProjectsCreateForRepoResponse = undefined\n\n  export const ReposGetCustomPropertiesValuesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetCustomPropertiesValuesParams = z.infer<\n    typeof ReposGetCustomPropertiesValuesParamsSchema\n  >\n\n  export const ReposGetCustomPropertiesValuesResponseSchema = z.array(\n    CustomPropertyValueSchema\n  )\n  export type ReposGetCustomPropertiesValuesResponse = z.infer<\n    typeof ReposGetCustomPropertiesValuesResponseSchema\n  >\n\n  export const ReposCreateOrUpdateCustomPropertiesValuesParamsSchema = z.object(\n    {\n      properties: z\n        .array(CustomPropertyValueSchema)\n        .describe(\n          'A list of custom property names and associated values to apply to the repositories.'\n        ),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    }\n  )\n  export type ReposCreateOrUpdateCustomPropertiesValuesParams = z.infer<\n    typeof ReposCreateOrUpdateCustomPropertiesValuesParamsSchema\n  >\n\n  export type ReposCreateOrUpdateCustomPropertiesValuesResponse = undefined\n\n  export const PullsListParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Either `open`, `closed`, or `all` to filter by state.')\n      .default('open'),\n    head: z\n      .string()\n      .describe(\n        'Filter pulls by head user or head organization and branch name in the format of `user:ref-name` or `organization:ref-name`. For example: `github:new-script-format` or `octocat:test-branch`.'\n      )\n      .optional(),\n    base: z\n      .string()\n      .describe('Filter pulls by base branch name. Example: `gh-pages`.')\n      .optional(),\n    sort: z\n      .enum(['created', 'updated', 'popularity', 'long-running'])\n      .describe(\n        'What to sort results by. `popularity` will sort by the number of comments. `long-running` will sort by date created and will limit the results to pull requests that have been open for more than a month and have had activity within the past month.'\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'The direction of the sort. Default: `desc` when sort is `created` or sort is not specified, otherwise `asc`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type PullsListParams = z.infer<typeof PullsListParamsSchema>\n\n  export const PullsListResponseSchema = z.array(PullRequestSimpleSchema)\n  export type PullsListResponse = z.infer<typeof PullsListResponseSchema>\n\n  export const PullsCreateParamsSchema = z.object({\n    title: z\n      .string()\n      .describe(\n        'The title of the new pull request. Required unless `issue` is specified.'\n      )\n      .optional(),\n    head: z\n      .string()\n      .describe(\n        'The name of the branch where your changes are implemented. For cross-repository pull requests in the same network, namespace `head` with a user like this: `username:branch`.'\n      ),\n    head_repo: z\n      .string()\n      .describe(\n        'The name of the repository where the changes in the pull request were made. This field is required for cross-repository pull requests if both repositories are owned by the same organization.'\n      )\n      .optional(),\n    base: z\n      .string()\n      .describe(\n        'The name of the branch you want the changes pulled into. This should be an existing branch on the current repository. You cannot submit a pull request to one repository that requests a merge to a base of another repository.'\n      ),\n    body: z.string().describe('The contents of the pull request.').optional(),\n    maintainer_can_modify: z\n      .boolean()\n      .describe(\n        'Indicates whether [maintainers can modify](https://docs.github.com/articles/allowing-changes-to-a-pull-request-branch-created-from-a-fork/) the pull request.'\n      )\n      .optional(),\n    draft: z\n      .boolean()\n      .describe(\n        'Indicates whether the pull request is a draft. See \"[Draft Pull Requests](https://docs.github.com/articles/about-pull-requests#draft-pull-requests)\" in the GitHub Help documentation to learn more.'\n      )\n      .optional(),\n    issue: z\n      .number()\n      .int()\n      .describe(\n        'An issue in the repository to convert to a pull request. The issue title, body, and comments will become the title, body, and comments on the new pull request. Required unless `title` is specified.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type PullsCreateParams = z.infer<typeof PullsCreateParamsSchema>\n\n  export type PullsCreateResponse = undefined\n\n  export const PullsListReviewCommentsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    sort: z.enum(['created', 'updated', 'created_at']).optional(),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'The direction to sort results. Ignored without `sort` parameter.'\n      )\n      .optional(),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type PullsListReviewCommentsForRepoParams = z.infer<\n    typeof PullsListReviewCommentsForRepoParamsSchema\n  >\n\n  export const PullsListReviewCommentsForRepoResponseSchema = z.array(\n    PullRequestReviewCommentSchema\n  )\n  export type PullsListReviewCommentsForRepoResponse = z.infer<\n    typeof PullsListReviewCommentsForRepoResponseSchema\n  >\n\n  export const PullsGetReviewCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type PullsGetReviewCommentParams = z.infer<\n    typeof PullsGetReviewCommentParamsSchema\n  >\n\n  export const PullsGetReviewCommentResponseSchema =\n    PullRequestReviewCommentSchema\n  export type PullsGetReviewCommentResponse = z.infer<\n    typeof PullsGetReviewCommentResponseSchema\n  >\n\n  export const PullsDeleteReviewCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type PullsDeleteReviewCommentParams = z.infer<\n    typeof PullsDeleteReviewCommentParamsSchema\n  >\n\n  export type PullsDeleteReviewCommentResponse = undefined\n\n  export const PullsUpdateReviewCommentParamsSchema = z.object({\n    body: z.string().describe('The text of the reply to the review comment.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type PullsUpdateReviewCommentParams = z.infer<\n    typeof PullsUpdateReviewCommentParamsSchema\n  >\n\n  export const PullsUpdateReviewCommentResponseSchema =\n    PullRequestReviewCommentSchema\n  export type PullsUpdateReviewCommentResponse = z.infer<\n    typeof PullsUpdateReviewCommentResponseSchema\n  >\n\n  export const ReactionsListForPullRequestReviewCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.'),\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to a pull request review comment.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReactionsListForPullRequestReviewCommentParams = z.infer<\n    typeof ReactionsListForPullRequestReviewCommentParamsSchema\n  >\n\n  export const ReactionsListForPullRequestReviewCommentResponseSchema =\n    z.array(ReactionSchema)\n  export type ReactionsListForPullRequestReviewCommentResponse = z.infer<\n    typeof ReactionsListForPullRequestReviewCommentResponseSchema\n  >\n\n  export const ReactionsCreateForPullRequestReviewCommentParamsSchema =\n    z.object({\n      content: z\n        .enum([\n          '+1',\n          '-1',\n          'laugh',\n          'confused',\n          'heart',\n          'hooray',\n          'rocket',\n          'eyes'\n        ])\n        .describe(\n          'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the pull request review comment.'\n        ),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      comment_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the comment.')\n    })\n  export type ReactionsCreateForPullRequestReviewCommentParams = z.infer<\n    typeof ReactionsCreateForPullRequestReviewCommentParamsSchema\n  >\n\n  export const ReactionsCreateForPullRequestReviewCommentResponseSchema =\n    ReactionSchema\n  export type ReactionsCreateForPullRequestReviewCommentResponse = z.infer<\n    typeof ReactionsCreateForPullRequestReviewCommentResponseSchema\n  >\n\n  export const ReactionsDeleteForPullRequestCommentParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.'),\n    reaction_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the reaction.')\n  })\n  export type ReactionsDeleteForPullRequestCommentParams = z.infer<\n    typeof ReactionsDeleteForPullRequestCommentParamsSchema\n  >\n\n  export type ReactionsDeleteForPullRequestCommentResponse = undefined\n\n  export const PullsGetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsGetParams = z.infer<typeof PullsGetParamsSchema>\n\n  export const PullsGetResponseSchema = PullRequestSchema\n  export type PullsGetResponse = z.infer<typeof PullsGetResponseSchema>\n\n  export const PullsUpdateParamsSchema = z.object({\n    title: z.string().describe('The title of the pull request.').optional(),\n    body: z.string().describe('The contents of the pull request.').optional(),\n    state: z\n      .enum(['open', 'closed'])\n      .describe('State of this Pull Request. Either `open` or `closed`.')\n      .optional(),\n    base: z\n      .string()\n      .describe(\n        'The name of the branch you want your changes pulled into. This should be an existing branch on the current repository. You cannot update the base branch on a pull request to point to another repository.'\n      )\n      .optional(),\n    maintainer_can_modify: z\n      .boolean()\n      .describe(\n        'Indicates whether [maintainers can modify](https://docs.github.com/articles/allowing-changes-to-a-pull-request-branch-created-from-a-fork/) the pull request.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsUpdateParams = z.infer<typeof PullsUpdateParamsSchema>\n\n  export const PullsUpdateResponseSchema = PullRequestSchema\n  export type PullsUpdateResponse = z.infer<typeof PullsUpdateResponseSchema>\n\n  export const CodespacesCreateWithPrForAuthenticatedUserParamsSchema =\n    z.object({\n      location: z\n        .string()\n        .describe(\n          'The requested location for a new codespace. Best efforts are made to respect this upon creation. Assigned by IP if not provided.'\n        )\n        .optional(),\n      geo: z\n        .enum(['EuropeWest', 'SoutheastAsia', 'UsEast', 'UsWest'])\n        .describe(\n          'The geographic area for this codespace. If not specified, the value is assigned by IP. This property replaces `location`, which is closing down.'\n        )\n        .optional(),\n      client_ip: z\n        .string()\n        .describe('IP for location auto-detection when proxying a request')\n        .optional(),\n      machine: z\n        .string()\n        .describe('Machine type to use for this codespace')\n        .optional(),\n      devcontainer_path: z\n        .string()\n        .describe('Path to devcontainer.json config to use for this codespace')\n        .optional(),\n      multi_repo_permissions_opt_out: z\n        .boolean()\n        .describe(\n          'Whether to authorize requested permissions from devcontainer.json'\n        )\n        .optional(),\n      working_directory: z\n        .string()\n        .describe('Working directory for this codespace')\n        .optional(),\n      idle_timeout_minutes: z\n        .number()\n        .int()\n        .describe('Time in minutes before codespace stops from inactivity')\n        .optional(),\n      display_name: z\n        .string()\n        .describe('Display name for this codespace')\n        .optional(),\n      retention_period_minutes: z\n        .number()\n        .int()\n        .describe(\n          'Duration in minutes after codespace has gone idle in which it will be deleted. Must be integer minutes between 0 and 43200 (30 days).'\n        )\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      pull_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the pull request.')\n    })\n  export type CodespacesCreateWithPrForAuthenticatedUserParams = z.infer<\n    typeof CodespacesCreateWithPrForAuthenticatedUserParamsSchema\n  >\n\n  export type CodespacesCreateWithPrForAuthenticatedUserResponse = undefined\n\n  export const PullsListReviewCommentsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe('The property to sort the results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'The direction to sort results. Ignored without `sort` parameter.'\n      )\n      .optional(),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type PullsListReviewCommentsParams = z.infer<\n    typeof PullsListReviewCommentsParamsSchema\n  >\n\n  export const PullsListReviewCommentsResponseSchema = z.array(\n    PullRequestReviewCommentSchema\n  )\n  export type PullsListReviewCommentsResponse = z.infer<\n    typeof PullsListReviewCommentsResponseSchema\n  >\n\n  export const PullsCreateReviewCommentParamsSchema = z.object({\n    body: z.string().describe('The text of the review comment.'),\n    commit_id: z\n      .string()\n      .describe(\n        'The SHA of the commit needing a comment. Not using the latest commit SHA may render your comment outdated if a subsequent commit modifies the line you specify as the `position`.'\n      ),\n    path: z\n      .string()\n      .describe('The relative path to the file that necessitates a comment.'),\n    position: z\n      .number()\n      .int()\n      .describe(\n        '**This parameter is closing down. Use `line` instead**. The position in the diff where you want to add a review comment. Note this value is not the same as the line number in the file. The position value equals the number of lines down from the first \"@@\" hunk header in the file you want to add a comment. The line just below the \"@@\" line is position 1, the next line is position 2, and so on. The position in the diff continues to increase through lines of whitespace and additional hunks until the beginning of a new file.'\n      )\n      .optional(),\n    side: z\n      .enum(['LEFT', 'RIGHT'])\n      .describe(\n        'In a split diff view, the side of the diff that the pull request\\'s changes appear on. Can be `LEFT` or `RIGHT`. Use `LEFT` for deletions that appear in red. Use `RIGHT` for additions that appear in green or unchanged lines that appear in white and are shown for context. For a multi-line comment, side represents whether the last line of the comment range is a deletion or addition. For more information, see \"[Diff view options](https://docs.github.com/articles/about-comparing-branches-in-pull-requests#diff-view-options)\" in the GitHub Help documentation.'\n      )\n      .optional(),\n    line: z\n      .number()\n      .int()\n      .describe(\n        '**Required unless using `subject_type:file`**. The line of the blob in the pull request diff that the comment applies to. For a multi-line comment, the last line of the range that your comment applies to.'\n      )\n      .optional(),\n    start_line: z\n      .number()\n      .int()\n      .describe(\n        '**Required when using multi-line comments unless using `in_reply_to`**. The `start_line` is the first line in the pull request diff that your multi-line comment applies to. To learn more about multi-line comments, see \"[Commenting on a pull request](https://docs.github.com/articles/commenting-on-a-pull-request#adding-line-comments-to-a-pull-request)\" in the GitHub Help documentation.'\n      )\n      .optional(),\n    start_side: z\n      .enum(['LEFT', 'RIGHT', 'side'])\n      .describe(\n        '**Required when using multi-line comments unless using `in_reply_to`**. The `start_side` is the starting side of the diff that the comment applies to. Can be `LEFT` or `RIGHT`. To learn more about multi-line comments, see \"[Commenting on a pull request](https://docs.github.com/articles/commenting-on-a-pull-request#adding-line-comments-to-a-pull-request)\" in the GitHub Help documentation. See `side` in this table for additional context.'\n      )\n      .optional(),\n    in_reply_to: z\n      .number()\n      .int()\n      .describe(\n        'The ID of the review comment to reply to. To find the ID of a review comment with [\"List review comments on a pull request\"](#list-review-comments-on-a-pull-request). When specified, all parameters other than `body` in the request body are ignored.'\n      )\n      .optional(),\n    subject_type: z\n      .enum(['line', 'file'])\n      .describe('The level at which the comment is targeted.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsCreateReviewCommentParams = z.infer<\n    typeof PullsCreateReviewCommentParamsSchema\n  >\n\n  export type PullsCreateReviewCommentResponse = undefined\n\n  export const PullsCreateReplyForReviewCommentParamsSchema = z.object({\n    body: z.string().describe('The text of the review comment.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    comment_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the comment.')\n  })\n  export type PullsCreateReplyForReviewCommentParams = z.infer<\n    typeof PullsCreateReplyForReviewCommentParamsSchema\n  >\n\n  export type PullsCreateReplyForReviewCommentResponse = undefined\n\n  export const PullsListCommitsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type PullsListCommitsParams = z.infer<\n    typeof PullsListCommitsParamsSchema\n  >\n\n  export const PullsListCommitsResponseSchema = z.array(CommitSchema)\n  export type PullsListCommitsResponse = z.infer<\n    typeof PullsListCommitsResponseSchema\n  >\n\n  export const PullsListFilesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type PullsListFilesParams = z.infer<typeof PullsListFilesParamsSchema>\n\n  export const PullsListFilesResponseSchema = z.array(DiffEntrySchema)\n  export type PullsListFilesResponse = z.infer<\n    typeof PullsListFilesResponseSchema\n  >\n\n  export const PullsCheckIfMergedParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsCheckIfMergedParams = z.infer<\n    typeof PullsCheckIfMergedParamsSchema\n  >\n\n  export type PullsCheckIfMergedResponse = undefined\n\n  export const PullsMergeParamsSchema = z.object({\n    commit_title: z\n      .string()\n      .describe('Title for the automatic commit message.')\n      .optional(),\n    commit_message: z\n      .string()\n      .describe('Extra detail to append to automatic commit message.')\n      .optional(),\n    sha: z\n      .string()\n      .describe('SHA that pull request head must match to allow merge.')\n      .optional(),\n    merge_method: z\n      .enum(['merge', 'squash', 'rebase'])\n      .describe('The merge method to use.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsMergeParams = z.infer<typeof PullsMergeParamsSchema>\n\n  export const PullsMergeResponseSchema = PullRequestMergeResultSchema\n  export type PullsMergeResponse = z.infer<typeof PullsMergeResponseSchema>\n\n  export const PullsListRequestedReviewersParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsListRequestedReviewersParams = z.infer<\n    typeof PullsListRequestedReviewersParamsSchema\n  >\n\n  export const PullsListRequestedReviewersResponseSchema =\n    PullRequestReviewRequestSchema\n  export type PullsListRequestedReviewersResponse = z.infer<\n    typeof PullsListRequestedReviewersResponseSchema\n  >\n\n  export const PullsRequestReviewersParamsSchema = z\n    .object({\n      reviewers: z\n        .array(z.string())\n        .describe('An array of user `login`s that will be requested.')\n        .optional(),\n      team_reviewers: z\n        .array(z.string())\n        .describe('An array of team `slug`s that will be requested.')\n        .optional(),\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      pull_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the pull request.')\n    })\n    .and(z.union([z.any(), z.any()]))\n  export type PullsRequestReviewersParams = z.infer<\n    typeof PullsRequestReviewersParamsSchema\n  >\n\n  export type PullsRequestReviewersResponse = undefined\n\n  export const PullsRemoveRequestedReviewersParamsSchema = z.object({\n    reviewers: z\n      .array(z.string())\n      .describe('An array of user `login`s that will be removed.'),\n    team_reviewers: z\n      .array(z.string())\n      .describe('An array of team `slug`s that will be removed.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsRemoveRequestedReviewersParams = z.infer<\n    typeof PullsRemoveRequestedReviewersParamsSchema\n  >\n\n  export const PullsRemoveRequestedReviewersResponseSchema =\n    PullRequestSimpleSchema\n  export type PullsRemoveRequestedReviewersResponse = z.infer<\n    typeof PullsRemoveRequestedReviewersResponseSchema\n  >\n\n  export const PullsListReviewsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type PullsListReviewsParams = z.infer<\n    typeof PullsListReviewsParamsSchema\n  >\n\n  export const PullsListReviewsResponseSchema = z.array(PullRequestReviewSchema)\n  export type PullsListReviewsResponse = z.infer<\n    typeof PullsListReviewsResponseSchema\n  >\n\n  export const PullsCreateReviewParamsSchema = z.object({\n    commit_id: z\n      .string()\n      .describe(\n        'The SHA of the commit that needs a review. Not using the latest commit SHA may render your review comment outdated if a subsequent commit modifies the line you specify as the `position`. Defaults to the most recent commit in the pull request when you do not specify a value.'\n      )\n      .optional(),\n    body: z\n      .string()\n      .describe(\n        '**Required** when using `REQUEST_CHANGES` or `COMMENT` for the `event` parameter. The body text of the pull request review.'\n      )\n      .optional(),\n    event: z\n      .enum(['APPROVE', 'REQUEST_CHANGES', 'COMMENT'])\n      .describe(\n        'The review action you want to perform. The review actions include: `APPROVE`, `REQUEST_CHANGES`, or `COMMENT`. By leaving this blank, you set the review action state to `PENDING`, which means you will need to [submit the pull request review](https://docs.github.com/rest/pulls/reviews#submit-a-review-for-a-pull-request) when you are ready.'\n      )\n      .optional(),\n    comments: z\n      .array(\n        z.object({\n          path: z\n            .string()\n            .describe(\n              'The relative path to the file that necessitates a review comment.'\n            ),\n          position: z\n            .number()\n            .int()\n            .describe(\n              'The position in the diff where you want to add a review comment. Note this value is not the same as the line number in the file. The `position` value equals the number of lines down from the first \"@@\" hunk header in the file you want to add a comment. The line just below the \"@@\" line is position 1, the next line is position 2, and so on. The position in the diff continues to increase through lines of whitespace and additional hunks until the beginning of a new file.'\n            )\n            .optional(),\n          body: z.string().describe('Text of the review comment.'),\n          line: z.number().int().optional(),\n          side: z.string().optional(),\n          start_line: z.number().int().optional(),\n          start_side: z.string().optional()\n        })\n      )\n      .describe(\n        'Use the following table to specify the location, destination, and contents of the draft review comment.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsCreateReviewParams = z.infer<\n    typeof PullsCreateReviewParamsSchema\n  >\n\n  export const PullsCreateReviewResponseSchema = PullRequestReviewSchema\n  export type PullsCreateReviewResponse = z.infer<\n    typeof PullsCreateReviewResponseSchema\n  >\n\n  export const PullsGetReviewParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    review_id: z.number().int().describe('The unique identifier of the review.')\n  })\n  export type PullsGetReviewParams = z.infer<typeof PullsGetReviewParamsSchema>\n\n  export const PullsGetReviewResponseSchema = PullRequestReviewSchema\n  export type PullsGetReviewResponse = z.infer<\n    typeof PullsGetReviewResponseSchema\n  >\n\n  export const PullsUpdateReviewParamsSchema = z.object({\n    body: z.string().describe('The body text of the pull request review.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    review_id: z.number().int().describe('The unique identifier of the review.')\n  })\n  export type PullsUpdateReviewParams = z.infer<\n    typeof PullsUpdateReviewParamsSchema\n  >\n\n  export const PullsUpdateReviewResponseSchema = PullRequestReviewSchema\n  export type PullsUpdateReviewResponse = z.infer<\n    typeof PullsUpdateReviewResponseSchema\n  >\n\n  export const PullsDeletePendingReviewParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    review_id: z.number().int().describe('The unique identifier of the review.')\n  })\n  export type PullsDeletePendingReviewParams = z.infer<\n    typeof PullsDeletePendingReviewParamsSchema\n  >\n\n  export const PullsDeletePendingReviewResponseSchema = PullRequestReviewSchema\n  export type PullsDeletePendingReviewResponse = z.infer<\n    typeof PullsDeletePendingReviewResponseSchema\n  >\n\n  export const PullsListCommentsForReviewParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    review_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the review.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type PullsListCommentsForReviewParams = z.infer<\n    typeof PullsListCommentsForReviewParamsSchema\n  >\n\n  export const PullsListCommentsForReviewResponseSchema =\n    z.array(ReviewCommentSchema)\n  export type PullsListCommentsForReviewResponse = z.infer<\n    typeof PullsListCommentsForReviewResponseSchema\n  >\n\n  export const PullsDismissReviewParamsSchema = z.object({\n    message: z\n      .string()\n      .describe('The message for the pull request review dismissal'),\n    event: z.literal('DISMISS').optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    review_id: z.number().int().describe('The unique identifier of the review.')\n  })\n  export type PullsDismissReviewParams = z.infer<\n    typeof PullsDismissReviewParamsSchema\n  >\n\n  export const PullsDismissReviewResponseSchema = PullRequestReviewSchema\n  export type PullsDismissReviewResponse = z.infer<\n    typeof PullsDismissReviewResponseSchema\n  >\n\n  export const PullsSubmitReviewParamsSchema = z.object({\n    body: z\n      .string()\n      .describe('The body text of the pull request review')\n      .optional(),\n    event: z\n      .enum(['APPROVE', 'REQUEST_CHANGES', 'COMMENT'])\n      .describe(\n        'The review action you want to perform. The review actions include: `APPROVE`, `REQUEST_CHANGES`, or `COMMENT`. When you leave this blank, the API returns _HTTP 422 (Unrecognizable entity)_ and sets the review action state to `PENDING`, which means you will need to re-submit the pull request review using a review action.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.'),\n    review_id: z.number().int().describe('The unique identifier of the review.')\n  })\n  export type PullsSubmitReviewParams = z.infer<\n    typeof PullsSubmitReviewParamsSchema\n  >\n\n  export const PullsSubmitReviewResponseSchema = PullRequestReviewSchema\n  export type PullsSubmitReviewResponse = z.infer<\n    typeof PullsSubmitReviewResponseSchema\n  >\n\n  export const PullsUpdateBranchParamsSchema = z.object({\n    expected_head_sha: z\n      .string()\n      .describe(\n        \"The expected SHA of the pull request's HEAD ref. This is the most recent commit on the pull request's branch. If the expected SHA does not match the pull request's HEAD, you will receive a `422 Unprocessable Entity` status. You can use the \\\"[List commits](https://docs.github.com/rest/commits/commits#list-commits)\\\" endpoint to find the most recent commit SHA. Default: SHA of the pull request's current HEAD ref.\"\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    pull_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the pull request.')\n  })\n  export type PullsUpdateBranchParams = z.infer<\n    typeof PullsUpdateBranchParamsSchema\n  >\n\n  export type PullsUpdateBranchResponse = undefined\n\n  export const ReposGetReadmeParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The name of the commit/branch/tag. Default: the repository’s default branch.'\n      )\n      .optional()\n  })\n  export type ReposGetReadmeParams = z.infer<typeof ReposGetReadmeParamsSchema>\n\n  export const ReposGetReadmeResponseSchema = ContentFileSchema\n  export type ReposGetReadmeResponse = z.infer<\n    typeof ReposGetReadmeResponseSchema\n  >\n\n  export const ReposGetReadmeInDirectoryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    dir: z.string().describe('The alternate path to look for a README file'),\n    ref: z\n      .string()\n      .describe(\n        'The name of the commit/branch/tag. Default: the repository’s default branch.'\n      )\n      .optional()\n  })\n  export type ReposGetReadmeInDirectoryParams = z.infer<\n    typeof ReposGetReadmeInDirectoryParamsSchema\n  >\n\n  export const ReposGetReadmeInDirectoryResponseSchema = ContentFileSchema\n  export type ReposGetReadmeInDirectoryResponse = z.infer<\n    typeof ReposGetReadmeInDirectoryResponseSchema\n  >\n\n  export const ReposListReleasesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListReleasesParams = z.infer<\n    typeof ReposListReleasesParamsSchema\n  >\n\n  export const ReposListReleasesResponseSchema = z.array(ReleaseSchema)\n  export type ReposListReleasesResponse = z.infer<\n    typeof ReposListReleasesResponseSchema\n  >\n\n  export const ReposCreateReleaseParamsSchema = z.object({\n    tag_name: z.string().describe('The name of the tag.'),\n    target_commitish: z\n      .string()\n      .describe(\n        \"Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository's default branch.\"\n      )\n      .optional(),\n    name: z.string().describe('The name of the release.').optional(),\n    body: z\n      .string()\n      .describe('Text describing the contents of the tag.')\n      .optional(),\n    draft: z\n      .boolean()\n      .describe(\n        '`true` to create a draft (unpublished) release, `false` to create a published one.'\n      )\n      .default(false),\n    prerelease: z\n      .boolean()\n      .describe(\n        '`true` to identify the release as a prerelease. `false` to identify the release as a full release.'\n      )\n      .default(false),\n    discussion_category_name: z\n      .string()\n      .describe(\n        'If specified, a discussion of the specified category is created and linked to the release. The value must be a category that already exists in the repository. For more information, see \"[Managing categories for discussions in your repository](https://docs.github.com/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository).\"'\n      )\n      .optional(),\n    generate_release_notes: z\n      .boolean()\n      .describe(\n        'Whether to automatically generate the name and body for this release. If `name` is specified, the specified name will be used; otherwise, a name will be automatically generated. If `body` is specified, the body will be pre-pended to the automatically generated notes.'\n      )\n      .default(false),\n    make_latest: z\n      .enum(['true', 'false', 'legacy'])\n      .describe(\n        'Specifies whether this release should be set as the latest release for the repository. Drafts and prereleases cannot be set as latest. Defaults to `true` for newly published releases. `legacy` specifies that the latest release should be determined based on the release creation date and higher semantic version.'\n      )\n      .default('true'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateReleaseParams = z.infer<\n    typeof ReposCreateReleaseParamsSchema\n  >\n\n  export type ReposCreateReleaseResponse = undefined\n\n  export const ReposGetReleaseAssetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    asset_id: z.number().int().describe('The unique identifier of the asset.')\n  })\n  export type ReposGetReleaseAssetParams = z.infer<\n    typeof ReposGetReleaseAssetParamsSchema\n  >\n\n  export const ReposGetReleaseAssetResponseSchema = ReleaseAssetSchema\n  export type ReposGetReleaseAssetResponse = z.infer<\n    typeof ReposGetReleaseAssetResponseSchema\n  >\n\n  export const ReposDeleteReleaseAssetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    asset_id: z.number().int().describe('The unique identifier of the asset.')\n  })\n  export type ReposDeleteReleaseAssetParams = z.infer<\n    typeof ReposDeleteReleaseAssetParamsSchema\n  >\n\n  export type ReposDeleteReleaseAssetResponse = undefined\n\n  export const ReposUpdateReleaseAssetParamsSchema = z.object({\n    name: z.string().describe('The file name of the asset.').optional(),\n    label: z\n      .string()\n      .describe(\n        'An alternate short description of the asset. Used in place of the filename.'\n      )\n      .optional(),\n    state: z.string().optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    asset_id: z.number().int().describe('The unique identifier of the asset.')\n  })\n  export type ReposUpdateReleaseAssetParams = z.infer<\n    typeof ReposUpdateReleaseAssetParamsSchema\n  >\n\n  export const ReposUpdateReleaseAssetResponseSchema = ReleaseAssetSchema\n  export type ReposUpdateReleaseAssetResponse = z.infer<\n    typeof ReposUpdateReleaseAssetResponseSchema\n  >\n\n  export const ReposGenerateReleaseNotesParamsSchema = z.object({\n    tag_name: z\n      .string()\n      .describe(\n        'The tag name for the release. This can be an existing tag or a new one.'\n      ),\n    target_commitish: z\n      .string()\n      .describe(\n        \"Specifies the commitish value that will be the target for the release's tag. Required if the supplied tag_name does not reference an existing tag. Ignored if the tag_name already exists.\"\n      )\n      .optional(),\n    previous_tag_name: z\n      .string()\n      .describe(\n        'The name of the previous tag to use as the starting point for the release notes. Use to manually specify the range for the set of changes considered as part this release.'\n      )\n      .optional(),\n    configuration_file_path: z\n      .string()\n      .describe(\n        \"Specifies a path to a file in the repository containing configuration settings used for generating the release notes. If unspecified, the configuration file located in the repository at '.github/release.yml' or '.github/release.yaml' will be used. If that is not present, the default configuration will be used.\"\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGenerateReleaseNotesParams = z.infer<\n    typeof ReposGenerateReleaseNotesParamsSchema\n  >\n\n  export const ReposGenerateReleaseNotesResponseSchema =\n    ReleaseNotesContentSchema\n  export type ReposGenerateReleaseNotesResponse = z.infer<\n    typeof ReposGenerateReleaseNotesResponseSchema\n  >\n\n  export const ReposGetLatestReleaseParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetLatestReleaseParams = z.infer<\n    typeof ReposGetLatestReleaseParamsSchema\n  >\n\n  export const ReposGetLatestReleaseResponseSchema = ReleaseSchema\n  export type ReposGetLatestReleaseResponse = z.infer<\n    typeof ReposGetLatestReleaseResponseSchema\n  >\n\n  export const ReposGetReleaseByTagParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    tag: z.string().describe('tag parameter')\n  })\n  export type ReposGetReleaseByTagParams = z.infer<\n    typeof ReposGetReleaseByTagParamsSchema\n  >\n\n  export const ReposGetReleaseByTagResponseSchema = ReleaseSchema\n  export type ReposGetReleaseByTagResponse = z.infer<\n    typeof ReposGetReleaseByTagResponseSchema\n  >\n\n  export const ReposGetReleaseParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.')\n  })\n  export type ReposGetReleaseParams = z.infer<\n    typeof ReposGetReleaseParamsSchema\n  >\n\n  export const ReposGetReleaseResponseSchema = ReleaseSchema\n  export type ReposGetReleaseResponse = z.infer<\n    typeof ReposGetReleaseResponseSchema\n  >\n\n  export const ReposDeleteReleaseParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.')\n  })\n  export type ReposDeleteReleaseParams = z.infer<\n    typeof ReposDeleteReleaseParamsSchema\n  >\n\n  export type ReposDeleteReleaseResponse = undefined\n\n  export const ReposUpdateReleaseParamsSchema = z.object({\n    tag_name: z.string().describe('The name of the tag.').optional(),\n    target_commitish: z\n      .string()\n      .describe(\n        \"Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository's default branch.\"\n      )\n      .optional(),\n    name: z.string().describe('The name of the release.').optional(),\n    body: z\n      .string()\n      .describe('Text describing the contents of the tag.')\n      .optional(),\n    draft: z\n      .boolean()\n      .describe(\n        '`true` makes the release a draft, and `false` publishes the release.'\n      )\n      .optional(),\n    prerelease: z\n      .boolean()\n      .describe(\n        '`true` to identify the release as a prerelease, `false` to identify the release as a full release.'\n      )\n      .optional(),\n    make_latest: z\n      .enum(['true', 'false', 'legacy'])\n      .describe(\n        'Specifies whether this release should be set as the latest release for the repository. Drafts and prereleases cannot be set as latest. Defaults to `true` for newly published releases. `legacy` specifies that the latest release should be determined based on the release creation date and higher semantic version.'\n      )\n      .default('true'),\n    discussion_category_name: z\n      .string()\n      .describe(\n        'If specified, a discussion of the specified category is created and linked to the release. The value must be a category that already exists in the repository. If there is already a discussion linked to the release, this parameter is ignored. For more information, see \"[Managing categories for discussions in your repository](https://docs.github.com/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository).\"'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.')\n  })\n  export type ReposUpdateReleaseParams = z.infer<\n    typeof ReposUpdateReleaseParamsSchema\n  >\n\n  export const ReposUpdateReleaseResponseSchema = ReleaseSchema\n  export type ReposUpdateReleaseResponse = z.infer<\n    typeof ReposUpdateReleaseResponseSchema\n  >\n\n  export const ReposListReleaseAssetsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListReleaseAssetsParams = z.infer<\n    typeof ReposListReleaseAssetsParamsSchema\n  >\n\n  export const ReposListReleaseAssetsResponseSchema =\n    z.array(ReleaseAssetSchema)\n  export type ReposListReleaseAssetsResponse = z.infer<\n    typeof ReposListReleaseAssetsResponseSchema\n  >\n\n  export const ReposUploadReleaseAssetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.'),\n    name: z.string(),\n    label: z.string().optional()\n  })\n  export type ReposUploadReleaseAssetParams = z.infer<\n    typeof ReposUploadReleaseAssetParamsSchema\n  >\n\n  export type ReposUploadReleaseAssetResponse = undefined\n\n  export const ReactionsListForReleaseParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.'),\n    content: z\n      .enum(['+1', 'laugh', 'heart', 'hooray', 'rocket', 'eyes'])\n      .describe(\n        'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to a release.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReactionsListForReleaseParams = z.infer<\n    typeof ReactionsListForReleaseParamsSchema\n  >\n\n  export const ReactionsListForReleaseResponseSchema = z.array(ReactionSchema)\n  export type ReactionsListForReleaseResponse = z.infer<\n    typeof ReactionsListForReleaseResponseSchema\n  >\n\n  export const ReactionsCreateForReleaseParamsSchema = z.object({\n    content: z\n      .enum(['+1', 'laugh', 'heart', 'hooray', 'rocket', 'eyes'])\n      .describe(\n        'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the release.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.')\n  })\n  export type ReactionsCreateForReleaseParams = z.infer<\n    typeof ReactionsCreateForReleaseParamsSchema\n  >\n\n  export const ReactionsCreateForReleaseResponseSchema = ReactionSchema\n  export type ReactionsCreateForReleaseResponse = z.infer<\n    typeof ReactionsCreateForReleaseResponseSchema\n  >\n\n  export const ReactionsDeleteForReleaseParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    release_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the release.'),\n    reaction_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the reaction.')\n  })\n  export type ReactionsDeleteForReleaseParams = z.infer<\n    typeof ReactionsDeleteForReleaseParamsSchema\n  >\n\n  export type ReactionsDeleteForReleaseResponse = undefined\n\n  export const ReposGetBranchRulesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    branch: z\n      .string()\n      .describe(\n        'The name of the branch. Cannot contain wildcard characters. To use wildcard characters in branch names, use [the GraphQL API](https://docs.github.com/graphql).'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposGetBranchRulesParams = z.infer<\n    typeof ReposGetBranchRulesParamsSchema\n  >\n\n  export const ReposGetBranchRulesResponseSchema = z.array(\n    RepositoryRuleDetailedSchema\n  )\n  export type ReposGetBranchRulesResponse = z.infer<\n    typeof ReposGetBranchRulesResponseSchema\n  >\n\n  export const ReposGetRepoRulesetsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    includes_parents: z\n      .boolean()\n      .describe(\n        'Include rulesets configured at higher levels that apply to this repository'\n      )\n      .default(true),\n    targets: z\n      .string()\n      .describe(\n        'A comma-separated list of rule targets to filter by.\\nIf provided, only rulesets that apply to the specified targets will be returned.\\nFor example, `branch,tag,push`.\\n'\n      )\n      .optional()\n  })\n  export type ReposGetRepoRulesetsParams = z.infer<\n    typeof ReposGetRepoRulesetsParamsSchema\n  >\n\n  export const ReposGetRepoRulesetsResponseSchema = z.array(\n    RepositoryRulesetSchema\n  )\n  export type ReposGetRepoRulesetsResponse = z.infer<\n    typeof ReposGetRepoRulesetsResponseSchema\n  >\n\n  export const ReposCreateRepoRulesetParamsSchema = z.object({\n    name: z.string().describe('The name of the ruleset.'),\n    target: z\n      .enum(['branch', 'tag', 'push'])\n      .describe('The target of the ruleset')\n      .default('branch'),\n    enforcement: RepositoryRuleEnforcementSchema,\n    bypass_actors: z\n      .array(RepositoryRulesetBypassActorSchema)\n      .describe('The actors that can bypass the rules in this ruleset')\n      .optional(),\n    conditions: RepositoryRulesetConditionsSchema.optional(),\n    rules: z\n      .array(RepositoryRuleSchema)\n      .describe('An array of rules within the ruleset.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateRepoRulesetParams = z.infer<\n    typeof ReposCreateRepoRulesetParamsSchema\n  >\n\n  export type ReposCreateRepoRulesetResponse = undefined\n\n  export const ReposGetRepoRuleSuitesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z\n      .string()\n      .describe(\n        'The name of the ref. Cannot contain wildcard characters. Optionally prefix with `refs/heads/` to limit to branches or `refs/tags/` to limit to tags. Omit the prefix to search across all refs. When specified, only rule evaluations triggered for this ref will be returned.'\n      )\n      .optional(),\n    time_period: z\n      .enum(['hour', 'day', 'week', 'month'])\n      .describe(\n        'The time period to filter by.\\n\\nFor example, `day` will filter for rule suites that occurred in the past 24 hours, and `week` will filter for insights that occurred in the past 7 days (168 hours).'\n      )\n      .default('day'),\n    actor_name: z\n      .string()\n      .describe(\n        'The handle for the GitHub user account to filter on. When specified, only rule evaluations triggered by this actor will be returned.'\n      )\n      .optional(),\n    rule_suite_result: z\n      .enum(['pass', 'fail', 'bypass', 'all'])\n      .describe(\n        'The rule results to filter on. When specified, only suites with this result will be returned.'\n      )\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposGetRepoRuleSuitesParams = z.infer<\n    typeof ReposGetRepoRuleSuitesParamsSchema\n  >\n\n  export const ReposGetRepoRuleSuitesResponseSchema = RuleSuitesSchema\n  export type ReposGetRepoRuleSuitesResponse = z.infer<\n    typeof ReposGetRepoRuleSuitesResponseSchema\n  >\n\n  export const ReposGetRepoRuleSuiteParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    rule_suite_id: z\n      .number()\n      .int()\n      .describe(\n        'The unique identifier of the rule suite result.\\nTo get this ID, you can use [GET /repos/{owner}/{repo}/rulesets/rule-suites](https://docs.github.com/rest/repos/rule-suites#list-repository-rule-suites)\\nfor repositories and [GET /orgs/{org}/rulesets/rule-suites](https://docs.github.com/rest/orgs/rule-suites#list-organization-rule-suites)\\nfor organizations.'\n      )\n  })\n  export type ReposGetRepoRuleSuiteParams = z.infer<\n    typeof ReposGetRepoRuleSuiteParamsSchema\n  >\n\n  export const ReposGetRepoRuleSuiteResponseSchema = RuleSuiteSchema\n  export type ReposGetRepoRuleSuiteResponse = z.infer<\n    typeof ReposGetRepoRuleSuiteResponseSchema\n  >\n\n  export const ReposGetRepoRulesetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.'),\n    includes_parents: z\n      .boolean()\n      .describe(\n        'Include rulesets configured at higher levels that apply to this repository'\n      )\n      .default(true)\n  })\n  export type ReposGetRepoRulesetParams = z.infer<\n    typeof ReposGetRepoRulesetParamsSchema\n  >\n\n  export const ReposGetRepoRulesetResponseSchema = RepositoryRulesetSchema\n  export type ReposGetRepoRulesetResponse = z.infer<\n    typeof ReposGetRepoRulesetResponseSchema\n  >\n\n  export const ReposUpdateRepoRulesetParamsSchema = z.object({\n    name: z.string().describe('The name of the ruleset.').optional(),\n    target: z\n      .enum(['branch', 'tag', 'push'])\n      .describe('The target of the ruleset')\n      .optional(),\n    enforcement: RepositoryRuleEnforcementSchema.optional(),\n    bypass_actors: z\n      .array(RepositoryRulesetBypassActorSchema)\n      .describe('The actors that can bypass the rules in this ruleset')\n      .optional(),\n    conditions: RepositoryRulesetConditionsSchema.optional(),\n    rules: z\n      .array(RepositoryRuleSchema)\n      .describe('An array of rules within the ruleset.')\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.')\n  })\n  export type ReposUpdateRepoRulesetParams = z.infer<\n    typeof ReposUpdateRepoRulesetParamsSchema\n  >\n\n  export const ReposUpdateRepoRulesetResponseSchema = RepositoryRulesetSchema\n  export type ReposUpdateRepoRulesetResponse = z.infer<\n    typeof ReposUpdateRepoRulesetResponseSchema\n  >\n\n  export const ReposDeleteRepoRulesetParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.')\n  })\n  export type ReposDeleteRepoRulesetParams = z.infer<\n    typeof ReposDeleteRepoRulesetParamsSchema\n  >\n\n  export type ReposDeleteRepoRulesetResponse = undefined\n\n  export const ReposGetRepoRulesetHistoryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposGetRepoRulesetHistoryParams = z.infer<\n    typeof ReposGetRepoRulesetHistoryParamsSchema\n  >\n\n  export const ReposGetRepoRulesetHistoryResponseSchema =\n    z.array(RulesetVersionSchema)\n  export type ReposGetRepoRulesetHistoryResponse = z.infer<\n    typeof ReposGetRepoRulesetHistoryResponseSchema\n  >\n\n  export const ReposGetRepoRulesetVersionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ruleset_id: z.number().int().describe('The ID of the ruleset.'),\n    version_id: z.number().int().describe('The ID of the version')\n  })\n  export type ReposGetRepoRulesetVersionParams = z.infer<\n    typeof ReposGetRepoRulesetVersionParamsSchema\n  >\n\n  export const ReposGetRepoRulesetVersionResponseSchema =\n    RulesetVersionWithStateSchema\n  export type ReposGetRepoRulesetVersionResponse = z.infer<\n    typeof ReposGetRepoRulesetVersionResponseSchema\n  >\n\n  export const SecretScanningListAlertsForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    state: z\n      .enum(['open', 'resolved'])\n      .describe(\n        'Set to `open` or `resolved` to only list secret scanning alerts in a specific state.'\n      )\n      .optional(),\n    secret_type: z\n      .string()\n      .describe(\n        'A comma-separated list of secret types to return. All default secret patterns are returned. To return generic patterns, pass the token name(s) in the parameter. See \"[Supported secret scanning patterns](https://docs.github.com/enterprise-cloud@latest/code-security/secret-scanning/introduction/supported-secret-scanning-patterns#supported-secrets)\" for a complete list of secret types.'\n      )\n      .optional(),\n    resolution: z\n      .string()\n      .describe(\n        'A comma-separated list of resolutions. Only secret scanning alerts with one of these resolutions are listed. Valid resolutions are `false_positive`, `wont_fix`, `revoked`, `pattern_edited`, `pattern_deleted` or `used_in_tests`.'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe(\n        'The property to sort the results by. `created` means when the alert was created. `updated` means when the alert was updated or resolved.'\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for events before this cursor. To receive an initial cursor on your first request, include an empty \"before\" query string.'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for events after this cursor.  To receive an initial cursor on your first request, include an empty \"after\" query string.'\n      )\n      .optional(),\n    validity: z\n      .string()\n      .describe(\n        'A comma-separated list of validities that, when present, will return alerts that match the validities in this list. Valid options are `active`, `inactive`, and `unknown`.'\n      )\n      .optional(),\n    is_publicly_leaked: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not to filter alerts by the publicly-leaked tag being present.'\n      )\n      .default(false),\n    is_multi_repo: z\n      .boolean()\n      .describe(\n        'A boolean value representing whether or not to filter alerts by the multi-repo tag being present.'\n      )\n      .default(false)\n  })\n  export type SecretScanningListAlertsForRepoParams = z.infer<\n    typeof SecretScanningListAlertsForRepoParamsSchema\n  >\n\n  export const SecretScanningListAlertsForRepoResponseSchema = z.array(\n    SecretScanningAlertSchema\n  )\n  export type SecretScanningListAlertsForRepoResponse = z.infer<\n    typeof SecretScanningListAlertsForRepoResponseSchema\n  >\n\n  export const SecretScanningGetAlertParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      )\n  })\n  export type SecretScanningGetAlertParams = z.infer<\n    typeof SecretScanningGetAlertParamsSchema\n  >\n\n  export const SecretScanningGetAlertResponseSchema = SecretScanningAlertSchema\n  export type SecretScanningGetAlertResponse = z.infer<\n    typeof SecretScanningGetAlertResponseSchema\n  >\n\n  export const SecretScanningUpdateAlertParamsSchema = z.object({\n    state: SecretScanningAlertStateSchema,\n    resolution: SecretScanningAlertResolutionSchema.optional(),\n    resolution_comment: SecretScanningAlertResolutionCommentSchema.optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      )\n  })\n  export type SecretScanningUpdateAlertParams = z.infer<\n    typeof SecretScanningUpdateAlertParamsSchema\n  >\n\n  export const SecretScanningUpdateAlertResponseSchema =\n    SecretScanningAlertSchema\n  export type SecretScanningUpdateAlertResponse = z.infer<\n    typeof SecretScanningUpdateAlertResponseSchema\n  >\n\n  export const SecretScanningListLocationsForAlertParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    alert_number: z\n      .any()\n      .describe(\n        'The number that identifies an alert. You can find this at the end of the URL for a code scanning alert within GitHub, and in the `number` field in the response from the `GET /repos/{owner}/{repo}/code-scanning/alerts` operation.'\n      ),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type SecretScanningListLocationsForAlertParams = z.infer<\n    typeof SecretScanningListLocationsForAlertParamsSchema\n  >\n\n  export const SecretScanningListLocationsForAlertResponseSchema = z\n    .array(SecretScanningLocationSchema)\n    .describe('List of locations where the secret was detected')\n  export type SecretScanningListLocationsForAlertResponse = z.infer<\n    typeof SecretScanningListLocationsForAlertResponseSchema\n  >\n\n  export const SecretScanningCreatePushProtectionBypassParamsSchema = z.object({\n    reason: SecretScanningPushProtectionBypassReasonSchema,\n    placeholder_id: SecretScanningPushProtectionBypassPlaceholderIdSchema,\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type SecretScanningCreatePushProtectionBypassParams = z.infer<\n    typeof SecretScanningCreatePushProtectionBypassParamsSchema\n  >\n\n  export const SecretScanningCreatePushProtectionBypassResponseSchema =\n    SecretScanningPushProtectionBypassSchema\n  export type SecretScanningCreatePushProtectionBypassResponse = z.infer<\n    typeof SecretScanningCreatePushProtectionBypassResponseSchema\n  >\n\n  export const SecretScanningGetScanHistoryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type SecretScanningGetScanHistoryParams = z.infer<\n    typeof SecretScanningGetScanHistoryParamsSchema\n  >\n\n  export const SecretScanningGetScanHistoryResponseSchema =\n    SecretScanningScanHistorySchema\n  export type SecretScanningGetScanHistoryResponse = z.infer<\n    typeof SecretScanningGetScanHistoryResponseSchema\n  >\n\n  export const SecurityAdvisoriesListRepositoryAdvisoriesParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      direction: z\n        .enum(['asc', 'desc'])\n        .describe('The direction to sort the results by.')\n        .default('desc'),\n      sort: z\n        .enum(['created', 'updated', 'published'])\n        .describe('The property to sort the results by.')\n        .default('created'),\n      before: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      after: z\n        .string()\n        .describe(\n          'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .optional(),\n      per_page: z\n        .number()\n        .int()\n        .gte(1)\n        .lte(100)\n        .describe(\n          'The number of advisories to return per page. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      state: z\n        .enum(['triage', 'draft', 'published', 'closed'])\n        .describe(\n          'Filter by state of the repository advisories. Only advisories of this state will be returned.'\n        )\n        .optional()\n    })\n  export type SecurityAdvisoriesListRepositoryAdvisoriesParams = z.infer<\n    typeof SecurityAdvisoriesListRepositoryAdvisoriesParamsSchema\n  >\n\n  export const SecurityAdvisoriesListRepositoryAdvisoriesResponseSchema =\n    z.array(RepositoryAdvisorySchema)\n  export type SecurityAdvisoriesListRepositoryAdvisoriesResponse = z.infer<\n    typeof SecurityAdvisoriesListRepositoryAdvisoriesResponseSchema\n  >\n\n  export const SecurityAdvisoriesCreateRepositoryAdvisoryParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n    .merge(RepositoryAdvisoryCreateSchema)\n  export type SecurityAdvisoriesCreateRepositoryAdvisoryParams = z.infer<\n    typeof SecurityAdvisoriesCreateRepositoryAdvisoryParamsSchema\n  >\n\n  export type SecurityAdvisoriesCreateRepositoryAdvisoryResponse = undefined\n\n  export const SecurityAdvisoriesCreatePrivateVulnerabilityReportParamsSchema =\n    z\n      .object({\n        owner: z\n          .string()\n          .describe(\n            'The account owner of the repository. The name is not case sensitive.'\n          ),\n        repo: z\n          .string()\n          .describe(\n            'The name of the repository without the `.git` extension. The name is not case sensitive.'\n          )\n      })\n      .merge(PrivateVulnerabilityReportCreateSchema)\n  export type SecurityAdvisoriesCreatePrivateVulnerabilityReportParams =\n    z.infer<\n      typeof SecurityAdvisoriesCreatePrivateVulnerabilityReportParamsSchema\n    >\n\n  export type SecurityAdvisoriesCreatePrivateVulnerabilityReportResponse =\n    undefined\n\n  export const SecurityAdvisoriesGetRepositoryAdvisoryParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ghsa_id: z\n      .string()\n      .describe(\n        'The GHSA (GitHub Security Advisory) identifier of the advisory.'\n      )\n  })\n  export type SecurityAdvisoriesGetRepositoryAdvisoryParams = z.infer<\n    typeof SecurityAdvisoriesGetRepositoryAdvisoryParamsSchema\n  >\n\n  export const SecurityAdvisoriesGetRepositoryAdvisoryResponseSchema =\n    RepositoryAdvisorySchema\n  export type SecurityAdvisoriesGetRepositoryAdvisoryResponse = z.infer<\n    typeof SecurityAdvisoriesGetRepositoryAdvisoryResponseSchema\n  >\n\n  export const SecurityAdvisoriesUpdateRepositoryAdvisoryParamsSchema = z\n    .object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      ghsa_id: z\n        .string()\n        .describe(\n          'The GHSA (GitHub Security Advisory) identifier of the advisory.'\n        )\n    })\n    .merge(RepositoryAdvisoryUpdateSchema)\n  export type SecurityAdvisoriesUpdateRepositoryAdvisoryParams = z.infer<\n    typeof SecurityAdvisoriesUpdateRepositoryAdvisoryParamsSchema\n  >\n\n  export const SecurityAdvisoriesUpdateRepositoryAdvisoryResponseSchema =\n    RepositoryAdvisorySchema\n  export type SecurityAdvisoriesUpdateRepositoryAdvisoryResponse = z.infer<\n    typeof SecurityAdvisoriesUpdateRepositoryAdvisoryResponseSchema\n  >\n\n  export const SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        ),\n      ghsa_id: z\n        .string()\n        .describe(\n          'The GHSA (GitHub Security Advisory) identifier of the advisory.'\n        )\n    })\n  export type SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestParams =\n    z.infer<\n      typeof SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestParamsSchema\n    >\n\n  export type SecurityAdvisoriesCreateRepositoryAdvisoryCveRequestResponse =\n    undefined\n\n  export const SecurityAdvisoriesCreateForkParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ghsa_id: z\n      .string()\n      .describe(\n        'The GHSA (GitHub Security Advisory) identifier of the advisory.'\n      )\n  })\n  export type SecurityAdvisoriesCreateForkParams = z.infer<\n    typeof SecurityAdvisoriesCreateForkParamsSchema\n  >\n\n  export type SecurityAdvisoriesCreateForkResponse = undefined\n\n  export const ActivityListStargazersForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListStargazersForRepoParams = z.infer<\n    typeof ActivityListStargazersForRepoParamsSchema\n  >\n\n  export const ActivityListStargazersForRepoResponseSchema = z.union([\n    z.array(SimpleUserSchema),\n    z.array(StargazerSchema)\n  ])\n  export type ActivityListStargazersForRepoResponse = z.infer<\n    typeof ActivityListStargazersForRepoResponseSchema\n  >\n\n  export const ReposGetCodeFrequencyStatsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetCodeFrequencyStatsParams = z.infer<\n    typeof ReposGetCodeFrequencyStatsParamsSchema\n  >\n\n  export const ReposGetCodeFrequencyStatsResponseSchema = z.array(\n    CodeFrequencyStatSchema\n  )\n  export type ReposGetCodeFrequencyStatsResponse = z.infer<\n    typeof ReposGetCodeFrequencyStatsResponseSchema\n  >\n\n  export const ReposGetCommitActivityStatsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetCommitActivityStatsParams = z.infer<\n    typeof ReposGetCommitActivityStatsParamsSchema\n  >\n\n  export const ReposGetCommitActivityStatsResponseSchema =\n    z.array(CommitActivitySchema)\n  export type ReposGetCommitActivityStatsResponse = z.infer<\n    typeof ReposGetCommitActivityStatsResponseSchema\n  >\n\n  export const ReposGetContributorsStatsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetContributorsStatsParams = z.infer<\n    typeof ReposGetContributorsStatsParamsSchema\n  >\n\n  export const ReposGetContributorsStatsResponseSchema = z.array(\n    ContributorActivitySchema\n  )\n  export type ReposGetContributorsStatsResponse = z.infer<\n    typeof ReposGetContributorsStatsResponseSchema\n  >\n\n  export const ReposGetParticipationStatsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetParticipationStatsParams = z.infer<\n    typeof ReposGetParticipationStatsParamsSchema\n  >\n\n  export const ReposGetParticipationStatsResponseSchema =\n    ParticipationStatsSchema\n  export type ReposGetParticipationStatsResponse = z.infer<\n    typeof ReposGetParticipationStatsResponseSchema\n  >\n\n  export const ReposGetPunchCardStatsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetPunchCardStatsParams = z.infer<\n    typeof ReposGetPunchCardStatsParamsSchema\n  >\n\n  export const ReposGetPunchCardStatsResponseSchema = z.array(\n    CodeFrequencyStatSchema\n  )\n  export type ReposGetPunchCardStatsResponse = z.infer<\n    typeof ReposGetPunchCardStatsResponseSchema\n  >\n\n  export const ReposCreateCommitStatusParamsSchema = z.object({\n    state: z\n      .enum(['error', 'failure', 'pending', 'success'])\n      .describe('The state of the status.'),\n    target_url: z\n      .string()\n      .describe(\n        'The target URL to associate with this status. This URL will be linked from the GitHub UI to allow users to easily see the source of the status.  \\nFor example, if your continuous integration system is posting build status, you would want to provide the deep link for the build output for this specific SHA:  \\n`http://ci.example.com/user/repo/build/sha`'\n      )\n      .optional(),\n    description: z\n      .string()\n      .describe('A short description of the status.')\n      .optional(),\n    context: z\n      .string()\n      .describe(\n        'A string label to differentiate this status from the status of other systems. This field is case-insensitive.'\n      )\n      .default('default'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    sha: z.string()\n  })\n  export type ReposCreateCommitStatusParams = z.infer<\n    typeof ReposCreateCommitStatusParamsSchema\n  >\n\n  export type ReposCreateCommitStatusResponse = undefined\n\n  export const ActivityListWatchersForRepoParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListWatchersForRepoParams = z.infer<\n    typeof ActivityListWatchersForRepoParamsSchema\n  >\n\n  export const ActivityListWatchersForRepoResponseSchema =\n    z.array(SimpleUserSchema)\n  export type ActivityListWatchersForRepoResponse = z.infer<\n    typeof ActivityListWatchersForRepoResponseSchema\n  >\n\n  export const ActivityGetRepoSubscriptionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActivityGetRepoSubscriptionParams = z.infer<\n    typeof ActivityGetRepoSubscriptionParamsSchema\n  >\n\n  export const ActivityGetRepoSubscriptionResponseSchema =\n    RepositorySubscriptionSchema\n  export type ActivityGetRepoSubscriptionResponse = z.infer<\n    typeof ActivityGetRepoSubscriptionResponseSchema\n  >\n\n  export const ActivitySetRepoSubscriptionParamsSchema = z.object({\n    subscribed: z\n      .boolean()\n      .describe(\n        'Determines if notifications should be received from this repository.'\n      )\n      .optional(),\n    ignored: z\n      .boolean()\n      .describe(\n        'Determines if all notifications should be blocked from this repository.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActivitySetRepoSubscriptionParams = z.infer<\n    typeof ActivitySetRepoSubscriptionParamsSchema\n  >\n\n  export const ActivitySetRepoSubscriptionResponseSchema =\n    RepositorySubscriptionSchema\n  export type ActivitySetRepoSubscriptionResponse = z.infer<\n    typeof ActivitySetRepoSubscriptionResponseSchema\n  >\n\n  export const ActivityDeleteRepoSubscriptionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActivityDeleteRepoSubscriptionParams = z.infer<\n    typeof ActivityDeleteRepoSubscriptionParamsSchema\n  >\n\n  export type ActivityDeleteRepoSubscriptionResponse = undefined\n\n  export const ReposListTagsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListTagsParams = z.infer<typeof ReposListTagsParamsSchema>\n\n  export const ReposListTagsResponseSchema = z.array(TagSchema)\n  export type ReposListTagsResponse = z.infer<\n    typeof ReposListTagsResponseSchema\n  >\n\n  export const ReposListTagProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposListTagProtectionParams = z.infer<\n    typeof ReposListTagProtectionParamsSchema\n  >\n\n  export const ReposListTagProtectionResponseSchema =\n    z.array(TagProtectionSchema)\n  export type ReposListTagProtectionResponse = z.infer<\n    typeof ReposListTagProtectionResponseSchema\n  >\n\n  export const ReposCreateTagProtectionParamsSchema = z.object({\n    pattern: z\n      .string()\n      .describe(\n        'An optional glob pattern to match against when enforcing tag protection.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateTagProtectionParams = z.infer<\n    typeof ReposCreateTagProtectionParamsSchema\n  >\n\n  export type ReposCreateTagProtectionResponse = undefined\n\n  export const ReposDeleteTagProtectionParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    tag_protection_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the tag protection.')\n  })\n  export type ReposDeleteTagProtectionParams = z.infer<\n    typeof ReposDeleteTagProtectionParamsSchema\n  >\n\n  export type ReposDeleteTagProtectionResponse = undefined\n\n  export const ReposDownloadTarballArchiveParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z.string()\n  })\n  export type ReposDownloadTarballArchiveParams = z.infer<\n    typeof ReposDownloadTarballArchiveParamsSchema\n  >\n\n  export type ReposDownloadTarballArchiveResponse = undefined\n\n  export const ReposListTeamsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListTeamsParams = z.infer<typeof ReposListTeamsParamsSchema>\n\n  export const ReposListTeamsResponseSchema = z.array(TeamSchema)\n  export type ReposListTeamsResponse = z.infer<\n    typeof ReposListTeamsResponseSchema\n  >\n\n  export const ReposGetAllTopicsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type ReposGetAllTopicsParams = z.infer<\n    typeof ReposGetAllTopicsParamsSchema\n  >\n\n  export const ReposGetAllTopicsResponseSchema = TopicSchema\n  export type ReposGetAllTopicsResponse = z.infer<\n    typeof ReposGetAllTopicsResponseSchema\n  >\n\n  export const ReposReplaceAllTopicsParamsSchema = z.object({\n    names: z\n      .array(z.string())\n      .describe(\n        'An array of topics to add to the repository. Pass one or more topics to _replace_ the set of existing topics. Send an empty array (`[]`) to clear all topics from the repository. **Note:** Topic `names` will be saved as lowercase.'\n      ),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposReplaceAllTopicsParams = z.infer<\n    typeof ReposReplaceAllTopicsParamsSchema\n  >\n\n  export const ReposReplaceAllTopicsResponseSchema = TopicSchema\n  export type ReposReplaceAllTopicsResponse = z.infer<\n    typeof ReposReplaceAllTopicsResponseSchema\n  >\n\n  export const ReposGetClonesParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per: z\n      .enum(['day', 'week'])\n      .describe('The time frame to display results for.')\n      .default('day')\n  })\n  export type ReposGetClonesParams = z.infer<typeof ReposGetClonesParamsSchema>\n\n  export const ReposGetClonesResponseSchema = CloneTrafficSchema\n  export type ReposGetClonesResponse = z.infer<\n    typeof ReposGetClonesResponseSchema\n  >\n\n  export const ReposGetTopPathsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetTopPathsParams = z.infer<\n    typeof ReposGetTopPathsParamsSchema\n  >\n\n  export const ReposGetTopPathsResponseSchema = z.array(ContentTrafficSchema)\n  export type ReposGetTopPathsResponse = z.infer<\n    typeof ReposGetTopPathsResponseSchema\n  >\n\n  export const ReposGetTopReferrersParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposGetTopReferrersParams = z.infer<\n    typeof ReposGetTopReferrersParamsSchema\n  >\n\n  export const ReposGetTopReferrersResponseSchema = z.array(\n    ReferrerTrafficSchema\n  )\n  export type ReposGetTopReferrersResponse = z.infer<\n    typeof ReposGetTopReferrersResponseSchema\n  >\n\n  export const ReposGetViewsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    per: z\n      .enum(['day', 'week'])\n      .describe('The time frame to display results for.')\n      .default('day')\n  })\n  export type ReposGetViewsParams = z.infer<typeof ReposGetViewsParamsSchema>\n\n  export const ReposGetViewsResponseSchema = ViewTrafficSchema\n  export type ReposGetViewsResponse = z.infer<\n    typeof ReposGetViewsResponseSchema\n  >\n\n  export const ReposTransferParamsSchema = z.object({\n    new_owner: z\n      .string()\n      .describe(\n        'The username or organization name the repository will be transferred to.'\n      ),\n    new_name: z\n      .string()\n      .describe('The new name to be given to the repository.')\n      .optional(),\n    team_ids: z\n      .array(z.number().int())\n      .describe(\n        'ID of the team or teams to add to the repository. Teams can only be added to organization-owned repositories.'\n      )\n      .optional(),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposTransferParams = z.infer<typeof ReposTransferParamsSchema>\n\n  export type ReposTransferResponse = undefined\n\n  export const ReposCheckVulnerabilityAlertsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCheckVulnerabilityAlertsParams = z.infer<\n    typeof ReposCheckVulnerabilityAlertsParamsSchema\n  >\n\n  export type ReposCheckVulnerabilityAlertsResponse = undefined\n\n  export const ReposEnableVulnerabilityAlertsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposEnableVulnerabilityAlertsParams = z.infer<\n    typeof ReposEnableVulnerabilityAlertsParamsSchema\n  >\n\n  export type ReposEnableVulnerabilityAlertsResponse = undefined\n\n  export const ReposDisableVulnerabilityAlertsParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposDisableVulnerabilityAlertsParams = z.infer<\n    typeof ReposDisableVulnerabilityAlertsParamsSchema\n  >\n\n  export type ReposDisableVulnerabilityAlertsResponse = undefined\n\n  export const ReposDownloadZipballArchiveParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      ),\n    ref: z.string()\n  })\n  export type ReposDownloadZipballArchiveParams = z.infer<\n    typeof ReposDownloadZipballArchiveParamsSchema\n  >\n\n  export type ReposDownloadZipballArchiveResponse = undefined\n\n  export const ReposCreateUsingTemplateParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The organization or person who will own the new repository. To create a new repository in an organization, the authenticated user must be a member of the specified organization.'\n      )\n      .optional(),\n    name: z.string().describe('The name of the new repository.'),\n    description: z\n      .string()\n      .describe('A short description of the new repository.')\n      .optional(),\n    include_all_branches: z\n      .boolean()\n      .describe(\n        'Set to `true` to include the directory structure and files from all branches in the template repository, and not just the default branch. Default: `false`.'\n      )\n      .default(false),\n    private: z\n      .boolean()\n      .describe(\n        'Either `true` to create a new private repository or `false` to create a new public one.'\n      )\n      .default(false),\n    template_owner: z\n      .string()\n      .describe(\n        'The account owner of the template repository. The name is not case sensitive.'\n      ),\n    template_repo: z\n      .string()\n      .describe(\n        'The name of the template repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ReposCreateUsingTemplateParams = z.infer<\n    typeof ReposCreateUsingTemplateParamsSchema\n  >\n\n  export type ReposCreateUsingTemplateResponse = undefined\n\n  export const ReposListPublicParamsSchema = z.object({\n    since: z\n      .number()\n      .int()\n      .describe(\n        'A repository ID. Only return repositories with an ID greater than this ID.'\n      )\n      .optional()\n  })\n  export type ReposListPublicParams = z.infer<\n    typeof ReposListPublicParamsSchema\n  >\n\n  export const ReposListPublicResponseSchema = z.array(MinimalRepositorySchema)\n  export type ReposListPublicResponse = z.infer<\n    typeof ReposListPublicResponseSchema\n  >\n\n  export const SearchCodeParamsSchema = z.object({\n    q: z\n      .string()\n      .describe(\n        'The query contains one or more search keywords and qualifiers. Qualifiers allow you to limit your search to specific areas of GitHub. The REST API supports the same qualifiers as the web interface for GitHub. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query). See \"[Searching code](https://docs.github.com/search-github/searching-on-github/searching-code)\" for a detailed list of qualifiers.'\n      ),\n    sort: z\n      .literal('indexed')\n      .describe(\n        '**This field is closing down.** Sorts the results of your query. Can only be `indexed`, which indicates how recently a file has been indexed by the GitHub search infrastructure. Default: [best match](https://docs.github.com/rest/search/search#ranking-search-results)'\n      )\n      .optional(),\n    order: z\n      .enum(['desc', 'asc'])\n      .describe(\n        '**This field is closing down.** Determines whether the first search result returned is the highest number of matches (`desc`) or lowest number of matches (`asc`). This parameter is ignored unless you provide `sort`. '\n      )\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type SearchCodeParams = z.infer<typeof SearchCodeParamsSchema>\n\n  export const SearchCodeResponseSchema = z.object({\n    total_count: z.number().int(),\n    incomplete_results: z.boolean(),\n    items: z.array(CodeSearchResultItemSchema)\n  })\n  export type SearchCodeResponse = z.infer<typeof SearchCodeResponseSchema>\n\n  export const SearchCommitsParamsSchema = z.object({\n    q: z\n      .string()\n      .describe(\n        'The query contains one or more search keywords and qualifiers. Qualifiers allow you to limit your search to specific areas of GitHub. The REST API supports the same qualifiers as the web interface for GitHub. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query). See \"[Searching commits](https://docs.github.com/search-github/searching-on-github/searching-commits)\" for a detailed list of qualifiers.'\n      ),\n    sort: z\n      .enum(['author-date', 'committer-date'])\n      .describe(\n        'Sorts the results of your query by `author-date` or `committer-date`. Default: [best match](https://docs.github.com/rest/search/search#ranking-search-results)'\n      )\n      .optional(),\n    order: z\n      .enum(['desc', 'asc'])\n      .describe(\n        'Determines whether the first search result returned is the highest number of matches (`desc`) or lowest number of matches (`asc`). This parameter is ignored unless you provide `sort`.'\n      )\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type SearchCommitsParams = z.infer<typeof SearchCommitsParamsSchema>\n\n  export const SearchCommitsResponseSchema = z.object({\n    total_count: z.number().int(),\n    incomplete_results: z.boolean(),\n    items: z.array(CommitSearchResultItemSchema)\n  })\n  export type SearchCommitsResponse = z.infer<\n    typeof SearchCommitsResponseSchema\n  >\n\n  export const SearchIssuesAndPullRequestsParamsSchema = z.object({\n    q: z\n      .string()\n      .describe(\n        'The query contains one or more search keywords and qualifiers. Qualifiers allow you to limit your search to specific areas of GitHub. The REST API supports the same qualifiers as the web interface for GitHub. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query). See \"[Searching issues and pull requests](https://docs.github.com/search-github/searching-on-github/searching-issues-and-pull-requests)\" for a detailed list of qualifiers.'\n      ),\n    sort: z\n      .enum([\n        'comments',\n        'reactions',\n        'reactions-+1',\n        'reactions--1',\n        'reactions-smile',\n        'reactions-thinking_face',\n        'reactions-heart',\n        'reactions-tada',\n        'interactions',\n        'created',\n        'updated'\n      ])\n      .describe(\n        'Sorts the results of your query by the number of `comments`, `reactions`, `reactions-+1`, `reactions--1`, `reactions-smile`, `reactions-thinking_face`, `reactions-heart`, `reactions-tada`, or `interactions`. You can also sort results by how recently the items were `created` or `updated`, Default: [best match](https://docs.github.com/rest/search/search#ranking-search-results)'\n      )\n      .optional(),\n    order: z\n      .enum(['desc', 'asc'])\n      .describe(\n        'Determines whether the first search result returned is the highest number of matches (`desc`) or lowest number of matches (`asc`). This parameter is ignored unless you provide `sort`.'\n      )\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    advanced_search: z\n      .string()\n      .describe(\n        'Set to `true` to use advanced search.\\nExample: `http://api.github.com/search/issues?q={query}&advanced_search=true`'\n      )\n      .optional()\n  })\n  export type SearchIssuesAndPullRequestsParams = z.infer<\n    typeof SearchIssuesAndPullRequestsParamsSchema\n  >\n\n  export const SearchIssuesAndPullRequestsResponseSchema = z.object({\n    total_count: z.number().int(),\n    incomplete_results: z.boolean(),\n    items: z.array(IssueSearchResultItemSchema)\n  })\n  export type SearchIssuesAndPullRequestsResponse = z.infer<\n    typeof SearchIssuesAndPullRequestsResponseSchema\n  >\n\n  export const SearchLabelsParamsSchema = z.object({\n    repository_id: z.number().int().describe('The id of the repository.'),\n    q: z\n      .string()\n      .describe(\n        'The search keywords. This endpoint does not accept qualifiers in the query. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query).'\n      ),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe(\n        'Sorts the results of your query by when the label was `created` or `updated`. Default: [best match](https://docs.github.com/rest/search/search#ranking-search-results)'\n      )\n      .optional(),\n    order: z\n      .enum(['desc', 'asc'])\n      .describe(\n        'Determines whether the first search result returned is the highest number of matches (`desc`) or lowest number of matches (`asc`). This parameter is ignored unless you provide `sort`.'\n      )\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type SearchLabelsParams = z.infer<typeof SearchLabelsParamsSchema>\n\n  export const SearchLabelsResponseSchema = z.object({\n    total_count: z.number().int(),\n    incomplete_results: z.boolean(),\n    items: z.array(LabelSearchResultItemSchema)\n  })\n  export type SearchLabelsResponse = z.infer<typeof SearchLabelsResponseSchema>\n\n  export const SearchReposParamsSchema = z.object({\n    q: z\n      .string()\n      .describe(\n        'The query contains one or more search keywords and qualifiers. Qualifiers allow you to limit your search to specific areas of GitHub. The REST API supports the same qualifiers as the web interface for GitHub. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query). See \"[Searching for repositories](https://docs.github.com/articles/searching-for-repositories/)\" for a detailed list of qualifiers.'\n      ),\n    sort: z\n      .enum(['stars', 'forks', 'help-wanted-issues', 'updated'])\n      .describe(\n        'Sorts the results of your query by number of `stars`, `forks`, or `help-wanted-issues` or how recently the items were `updated`. Default: [best match](https://docs.github.com/rest/search/search#ranking-search-results)'\n      )\n      .optional(),\n    order: z\n      .enum(['desc', 'asc'])\n      .describe(\n        'Determines whether the first search result returned is the highest number of matches (`desc`) or lowest number of matches (`asc`). This parameter is ignored unless you provide `sort`.'\n      )\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type SearchReposParams = z.infer<typeof SearchReposParamsSchema>\n\n  export const SearchReposResponseSchema = z.object({\n    total_count: z.number().int(),\n    incomplete_results: z.boolean(),\n    items: z.array(RepoSearchResultItemSchema)\n  })\n  export type SearchReposResponse = z.infer<typeof SearchReposResponseSchema>\n\n  export const SearchTopicsParamsSchema = z.object({\n    q: z\n      .string()\n      .describe(\n        'The query contains one or more search keywords and qualifiers. Qualifiers allow you to limit your search to specific areas of GitHub. The REST API supports the same qualifiers as the web interface for GitHub. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query).'\n      ),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type SearchTopicsParams = z.infer<typeof SearchTopicsParamsSchema>\n\n  export const SearchTopicsResponseSchema = z.object({\n    total_count: z.number().int(),\n    incomplete_results: z.boolean(),\n    items: z.array(TopicSearchResultItemSchema)\n  })\n  export type SearchTopicsResponse = z.infer<typeof SearchTopicsResponseSchema>\n\n  export const SearchUsersParamsSchema = z.object({\n    q: z\n      .string()\n      .describe(\n        'The query contains one or more search keywords and qualifiers. Qualifiers allow you to limit your search to specific areas of GitHub. The REST API supports the same qualifiers as the web interface for GitHub. To learn more about the format of the query, see [Constructing a search query](https://docs.github.com/rest/search/search#constructing-a-search-query). See \"[Searching users](https://docs.github.com/search-github/searching-on-github/searching-users)\" for a detailed list of qualifiers.'\n      ),\n    sort: z\n      .enum(['followers', 'repositories', 'joined'])\n      .describe(\n        'Sorts the results of your query by number of `followers` or `repositories`, or when the person `joined` GitHub. Default: [best match](https://docs.github.com/rest/search/search#ranking-search-results)'\n      )\n      .optional(),\n    order: z\n      .enum(['desc', 'asc'])\n      .describe(\n        'Determines whether the first search result returned is the highest number of matches (`desc`) or lowest number of matches (`asc`). This parameter is ignored unless you provide `sort`.'\n      )\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type SearchUsersParams = z.infer<typeof SearchUsersParamsSchema>\n\n  export const SearchUsersResponseSchema = z.object({\n    total_count: z.number().int(),\n    incomplete_results: z.boolean(),\n    items: z.array(UserSearchResultItemSchema)\n  })\n  export type SearchUsersResponse = z.infer<typeof SearchUsersResponseSchema>\n\n  export const TeamsGetLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.')\n  })\n  export type TeamsGetLegacyParams = z.infer<typeof TeamsGetLegacyParamsSchema>\n\n  export const TeamsGetLegacyResponseSchema = TeamFullSchema\n  export type TeamsGetLegacyResponse = z.infer<\n    typeof TeamsGetLegacyResponseSchema\n  >\n\n  export const TeamsDeleteLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.')\n  })\n  export type TeamsDeleteLegacyParams = z.infer<\n    typeof TeamsDeleteLegacyParamsSchema\n  >\n\n  export type TeamsDeleteLegacyResponse = undefined\n\n  export const TeamsUpdateLegacyParamsSchema = z.object({\n    name: z.string().describe('The name of the team.'),\n    description: z.string().describe('The description of the team.').optional(),\n    privacy: z\n      .enum(['secret', 'closed'])\n      .describe(\n        'The level of privacy this team should have. Editing teams without specifying this parameter leaves `privacy` intact. The options are:  \\n**For a non-nested team:**  \\n * `secret` - only visible to organization owners and members of this team.  \\n * `closed` - visible to all members of this organization.  \\n**For a parent or child team:**  \\n * `closed` - visible to all members of this organization.'\n      )\n      .optional(),\n    notification_setting: z\n      .enum(['notifications_enabled', 'notifications_disabled'])\n      .describe(\n        'The notification setting the team has chosen. Editing teams without specifying this parameter leaves `notification_setting` intact. The options are: \\n * `notifications_enabled` - team members receive notifications when the team is @mentioned.  \\n * `notifications_disabled` - no one receives notifications.'\n      )\n      .optional(),\n    permission: z\n      .enum(['pull', 'push', 'admin'])\n      .describe(\n        '**Closing down notice**. The permission that new repositories will be added to the team with when none is specified.'\n      )\n      .default('pull'),\n    parent_team_id: z\n      .number()\n      .int()\n      .describe('The ID of a team to set as the parent team.')\n      .optional(),\n    team_id: z.number().int().describe('The unique identifier of the team.')\n  })\n  export type TeamsUpdateLegacyParams = z.infer<\n    typeof TeamsUpdateLegacyParamsSchema\n  >\n\n  export const TeamsUpdateLegacyResponseSchema = TeamFullSchema\n  export type TeamsUpdateLegacyResponse = z.infer<\n    typeof TeamsUpdateLegacyResponseSchema\n  >\n\n  export const TeamsListDiscussionsLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListDiscussionsLegacyParams = z.infer<\n    typeof TeamsListDiscussionsLegacyParamsSchema\n  >\n\n  export const TeamsListDiscussionsLegacyResponseSchema =\n    z.array(TeamDiscussionSchema)\n  export type TeamsListDiscussionsLegacyResponse = z.infer<\n    typeof TeamsListDiscussionsLegacyResponseSchema\n  >\n\n  export const TeamsCreateDiscussionLegacyParamsSchema = z.object({\n    title: z.string().describe(\"The discussion post's title.\"),\n    body: z.string().describe(\"The discussion post's body text.\"),\n    private: z\n      .boolean()\n      .describe(\n        'Private posts are only visible to team members, organization owners, and team maintainers. Public posts are visible to all members of the organization. Set to `true` to create a private post.'\n      )\n      .default(false),\n    team_id: z.number().int().describe('The unique identifier of the team.')\n  })\n  export type TeamsCreateDiscussionLegacyParams = z.infer<\n    typeof TeamsCreateDiscussionLegacyParamsSchema\n  >\n\n  export type TeamsCreateDiscussionLegacyResponse = undefined\n\n  export const TeamsGetDiscussionLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsGetDiscussionLegacyParams = z.infer<\n    typeof TeamsGetDiscussionLegacyParamsSchema\n  >\n\n  export const TeamsGetDiscussionLegacyResponseSchema = TeamDiscussionSchema\n  export type TeamsGetDiscussionLegacyResponse = z.infer<\n    typeof TeamsGetDiscussionLegacyResponseSchema\n  >\n\n  export const TeamsDeleteDiscussionLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsDeleteDiscussionLegacyParams = z.infer<\n    typeof TeamsDeleteDiscussionLegacyParamsSchema\n  >\n\n  export type TeamsDeleteDiscussionLegacyResponse = undefined\n\n  export const TeamsUpdateDiscussionLegacyParamsSchema = z.object({\n    title: z.string().describe(\"The discussion post's title.\").optional(),\n    body: z.string().describe(\"The discussion post's body text.\").optional(),\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsUpdateDiscussionLegacyParams = z.infer<\n    typeof TeamsUpdateDiscussionLegacyParamsSchema\n  >\n\n  export const TeamsUpdateDiscussionLegacyResponseSchema = TeamDiscussionSchema\n  export type TeamsUpdateDiscussionLegacyResponse = z.infer<\n    typeof TeamsUpdateDiscussionLegacyResponseSchema\n  >\n\n  export const TeamsListDiscussionCommentsLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListDiscussionCommentsLegacyParams = z.infer<\n    typeof TeamsListDiscussionCommentsLegacyParamsSchema\n  >\n\n  export const TeamsListDiscussionCommentsLegacyResponseSchema = z.array(\n    TeamDiscussionCommentSchema\n  )\n  export type TeamsListDiscussionCommentsLegacyResponse = z.infer<\n    typeof TeamsListDiscussionCommentsLegacyResponseSchema\n  >\n\n  export const TeamsCreateDiscussionCommentLegacyParamsSchema = z.object({\n    body: z.string().describe(\"The discussion comment's body text.\"),\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type TeamsCreateDiscussionCommentLegacyParams = z.infer<\n    typeof TeamsCreateDiscussionCommentLegacyParamsSchema\n  >\n\n  export type TeamsCreateDiscussionCommentLegacyResponse = undefined\n\n  export const TeamsGetDiscussionCommentLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    comment_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the comment.')\n  })\n  export type TeamsGetDiscussionCommentLegacyParams = z.infer<\n    typeof TeamsGetDiscussionCommentLegacyParamsSchema\n  >\n\n  export const TeamsGetDiscussionCommentLegacyResponseSchema =\n    TeamDiscussionCommentSchema\n  export type TeamsGetDiscussionCommentLegacyResponse = z.infer<\n    typeof TeamsGetDiscussionCommentLegacyResponseSchema\n  >\n\n  export const TeamsDeleteDiscussionCommentLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    comment_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the comment.')\n  })\n  export type TeamsDeleteDiscussionCommentLegacyParams = z.infer<\n    typeof TeamsDeleteDiscussionCommentLegacyParamsSchema\n  >\n\n  export type TeamsDeleteDiscussionCommentLegacyResponse = undefined\n\n  export const TeamsUpdateDiscussionCommentLegacyParamsSchema = z.object({\n    body: z.string().describe(\"The discussion comment's body text.\"),\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    comment_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the comment.')\n  })\n  export type TeamsUpdateDiscussionCommentLegacyParams = z.infer<\n    typeof TeamsUpdateDiscussionCommentLegacyParamsSchema\n  >\n\n  export const TeamsUpdateDiscussionCommentLegacyResponseSchema =\n    TeamDiscussionCommentSchema\n  export type TeamsUpdateDiscussionCommentLegacyResponse = z.infer<\n    typeof TeamsUpdateDiscussionCommentLegacyResponseSchema\n  >\n\n  export const ReactionsListForTeamDiscussionCommentLegacyParamsSchema =\n    z.object({\n      team_id: z.number().int().describe('The unique identifier of the team.'),\n      discussion_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the discussion.'),\n      comment_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the comment.'),\n      content: z\n        .enum([\n          '+1',\n          '-1',\n          'laugh',\n          'confused',\n          'heart',\n          'hooray',\n          'rocket',\n          'eyes'\n        ])\n        .describe(\n          'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to a team discussion comment.'\n        )\n        .optional(),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type ReactionsListForTeamDiscussionCommentLegacyParams = z.infer<\n    typeof ReactionsListForTeamDiscussionCommentLegacyParamsSchema\n  >\n\n  export const ReactionsListForTeamDiscussionCommentLegacyResponseSchema =\n    z.array(ReactionSchema)\n  export type ReactionsListForTeamDiscussionCommentLegacyResponse = z.infer<\n    typeof ReactionsListForTeamDiscussionCommentLegacyResponseSchema\n  >\n\n  export const ReactionsCreateForTeamDiscussionCommentLegacyParamsSchema =\n    z.object({\n      content: z\n        .enum([\n          '+1',\n          '-1',\n          'laugh',\n          'confused',\n          'heart',\n          'hooray',\n          'rocket',\n          'eyes'\n        ])\n        .describe(\n          'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the team discussion comment.'\n        ),\n      team_id: z.number().int().describe('The unique identifier of the team.'),\n      discussion_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the discussion.'),\n      comment_number: z\n        .number()\n        .int()\n        .describe('The number that identifies the comment.')\n    })\n  export type ReactionsCreateForTeamDiscussionCommentLegacyParams = z.infer<\n    typeof ReactionsCreateForTeamDiscussionCommentLegacyParamsSchema\n  >\n\n  export type ReactionsCreateForTeamDiscussionCommentLegacyResponse = undefined\n\n  export const ReactionsListForTeamDiscussionLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.'),\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'Returns a single [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions). Omit this parameter to list all reactions to a team discussion.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReactionsListForTeamDiscussionLegacyParams = z.infer<\n    typeof ReactionsListForTeamDiscussionLegacyParamsSchema\n  >\n\n  export const ReactionsListForTeamDiscussionLegacyResponseSchema =\n    z.array(ReactionSchema)\n  export type ReactionsListForTeamDiscussionLegacyResponse = z.infer<\n    typeof ReactionsListForTeamDiscussionLegacyResponseSchema\n  >\n\n  export const ReactionsCreateForTeamDiscussionLegacyParamsSchema = z.object({\n    content: z\n      .enum([\n        '+1',\n        '-1',\n        'laugh',\n        'confused',\n        'heart',\n        'hooray',\n        'rocket',\n        'eyes'\n      ])\n      .describe(\n        'The [reaction type](https://docs.github.com/rest/reactions/reactions#about-reactions) to add to the team discussion.'\n      ),\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    discussion_number: z\n      .number()\n      .int()\n      .describe('The number that identifies the discussion.')\n  })\n  export type ReactionsCreateForTeamDiscussionLegacyParams = z.infer<\n    typeof ReactionsCreateForTeamDiscussionLegacyParamsSchema\n  >\n\n  export type ReactionsCreateForTeamDiscussionLegacyResponse = undefined\n\n  export const TeamsListPendingInvitationsLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListPendingInvitationsLegacyParams = z.infer<\n    typeof TeamsListPendingInvitationsLegacyParamsSchema\n  >\n\n  export const TeamsListPendingInvitationsLegacyResponseSchema = z.array(\n    OrganizationInvitationSchema\n  )\n  export type TeamsListPendingInvitationsLegacyResponse = z.infer<\n    typeof TeamsListPendingInvitationsLegacyResponseSchema\n  >\n\n  export const TeamsListMembersLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    role: z\n      .enum(['member', 'maintainer', 'all'])\n      .describe('Filters members returned by their role in the team.')\n      .default('all'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListMembersLegacyParams = z.infer<\n    typeof TeamsListMembersLegacyParamsSchema\n  >\n\n  export const TeamsListMembersLegacyResponseSchema = z.array(SimpleUserSchema)\n  export type TeamsListMembersLegacyResponse = z.infer<\n    typeof TeamsListMembersLegacyResponseSchema\n  >\n\n  export const TeamsGetMemberLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsGetMemberLegacyParams = z.infer<\n    typeof TeamsGetMemberLegacyParamsSchema\n  >\n\n  export type TeamsGetMemberLegacyResponse = undefined\n\n  export const TeamsAddMemberLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsAddMemberLegacyParams = z.infer<\n    typeof TeamsAddMemberLegacyParamsSchema\n  >\n\n  export type TeamsAddMemberLegacyResponse = undefined\n\n  export const TeamsRemoveMemberLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsRemoveMemberLegacyParams = z.infer<\n    typeof TeamsRemoveMemberLegacyParamsSchema\n  >\n\n  export type TeamsRemoveMemberLegacyResponse = undefined\n\n  export const TeamsGetMembershipForUserLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsGetMembershipForUserLegacyParams = z.infer<\n    typeof TeamsGetMembershipForUserLegacyParamsSchema\n  >\n\n  export const TeamsGetMembershipForUserLegacyResponseSchema =\n    TeamMembershipSchema\n  export type TeamsGetMembershipForUserLegacyResponse = z.infer<\n    typeof TeamsGetMembershipForUserLegacyResponseSchema\n  >\n\n  export const TeamsAddOrUpdateMembershipForUserLegacyParamsSchema = z.object({\n    role: z\n      .enum(['member', 'maintainer'])\n      .describe('The role that this user should have in the team.')\n      .default('member'),\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsAddOrUpdateMembershipForUserLegacyParams = z.infer<\n    typeof TeamsAddOrUpdateMembershipForUserLegacyParamsSchema\n  >\n\n  export const TeamsAddOrUpdateMembershipForUserLegacyResponseSchema =\n    TeamMembershipSchema\n  export type TeamsAddOrUpdateMembershipForUserLegacyResponse = z.infer<\n    typeof TeamsAddOrUpdateMembershipForUserLegacyResponseSchema\n  >\n\n  export const TeamsRemoveMembershipForUserLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type TeamsRemoveMembershipForUserLegacyParams = z.infer<\n    typeof TeamsRemoveMembershipForUserLegacyParamsSchema\n  >\n\n  export type TeamsRemoveMembershipForUserLegacyResponse = undefined\n\n  export const TeamsListProjectsLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListProjectsLegacyParams = z.infer<\n    typeof TeamsListProjectsLegacyParamsSchema\n  >\n\n  export const TeamsListProjectsLegacyResponseSchema =\n    z.array(TeamProjectSchema)\n  export type TeamsListProjectsLegacyResponse = z.infer<\n    typeof TeamsListProjectsLegacyResponseSchema\n  >\n\n  export const TeamsCheckPermissionsForProjectLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type TeamsCheckPermissionsForProjectLegacyParams = z.infer<\n    typeof TeamsCheckPermissionsForProjectLegacyParamsSchema\n  >\n\n  export const TeamsCheckPermissionsForProjectLegacyResponseSchema =\n    TeamProjectSchema\n  export type TeamsCheckPermissionsForProjectLegacyResponse = z.infer<\n    typeof TeamsCheckPermissionsForProjectLegacyResponseSchema\n  >\n\n  export const TeamsAddOrUpdateProjectPermissionsLegacyParamsSchema = z.object({\n    permission: z\n      .enum(['read', 'write', 'admin'])\n      .describe(\n        'The permission to grant to the team for this project. Default: the team\\'s `permission` attribute will be used to determine what permission to grant the team on this project. Note that, if you choose not to pass any parameters, you\\'ll need to set `Content-Length` to zero when calling this endpoint. For more information, see \"[HTTP method](https://docs.github.com/rest/guides/getting-started-with-the-rest-api#http-method).\"'\n      )\n      .optional(),\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type TeamsAddOrUpdateProjectPermissionsLegacyParams = z.infer<\n    typeof TeamsAddOrUpdateProjectPermissionsLegacyParamsSchema\n  >\n\n  export type TeamsAddOrUpdateProjectPermissionsLegacyResponse = undefined\n\n  export const TeamsRemoveProjectLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    project_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the project.')\n  })\n  export type TeamsRemoveProjectLegacyParams = z.infer<\n    typeof TeamsRemoveProjectLegacyParamsSchema\n  >\n\n  export type TeamsRemoveProjectLegacyResponse = undefined\n\n  export const TeamsListReposLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListReposLegacyParams = z.infer<\n    typeof TeamsListReposLegacyParamsSchema\n  >\n\n  export const TeamsListReposLegacyResponseSchema = z.array(\n    MinimalRepositorySchema\n  )\n  export type TeamsListReposLegacyResponse = z.infer<\n    typeof TeamsListReposLegacyResponseSchema\n  >\n\n  export const TeamsCheckPermissionsForRepoLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type TeamsCheckPermissionsForRepoLegacyParams = z.infer<\n    typeof TeamsCheckPermissionsForRepoLegacyParamsSchema\n  >\n\n  export const TeamsCheckPermissionsForRepoLegacyResponseSchema =\n    TeamRepositorySchema\n  export type TeamsCheckPermissionsForRepoLegacyResponse = z.infer<\n    typeof TeamsCheckPermissionsForRepoLegacyResponseSchema\n  >\n\n  export const TeamsAddOrUpdateRepoPermissionsLegacyParamsSchema = z.object({\n    permission: z\n      .enum(['pull', 'push', 'admin'])\n      .describe(\n        \"The permission to grant the team on this repository. If no permission is specified, the team's `permission` attribute will be used to determine what permission to grant the team on this repository.\"\n      )\n      .optional(),\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type TeamsAddOrUpdateRepoPermissionsLegacyParams = z.infer<\n    typeof TeamsAddOrUpdateRepoPermissionsLegacyParamsSchema\n  >\n\n  export type TeamsAddOrUpdateRepoPermissionsLegacyResponse = undefined\n\n  export const TeamsRemoveRepoLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type TeamsRemoveRepoLegacyParams = z.infer<\n    typeof TeamsRemoveRepoLegacyParamsSchema\n  >\n\n  export type TeamsRemoveRepoLegacyResponse = undefined\n\n  export const TeamsListChildLegacyParamsSchema = z.object({\n    team_id: z.number().int().describe('The unique identifier of the team.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListChildLegacyParams = z.infer<\n    typeof TeamsListChildLegacyParamsSchema\n  >\n\n  export const TeamsListChildLegacyResponseSchema = z.array(TeamSchema)\n  export type TeamsListChildLegacyResponse = z.infer<\n    typeof TeamsListChildLegacyResponseSchema\n  >\n\n  export const UsersGetAuthenticatedParamsSchema = z.object({})\n  export type UsersGetAuthenticatedParams = z.infer<\n    typeof UsersGetAuthenticatedParamsSchema\n  >\n\n  export const UsersGetAuthenticatedResponseSchema = z.union([\n    PrivateUserSchema,\n    PublicUserSchema\n  ])\n  export type UsersGetAuthenticatedResponse = z.infer<\n    typeof UsersGetAuthenticatedResponseSchema\n  >\n\n  export const UsersUpdateAuthenticatedParamsSchema = z.object({\n    name: z.string().describe('The new name of the user.').optional(),\n    email: z\n      .string()\n      .describe('The publicly visible email address of the user.')\n      .optional(),\n    blog: z.string().describe('The new blog URL of the user.').optional(),\n    twitter_username: z\n      .string()\n      .describe('The new Twitter username of the user.')\n      .optional(),\n    company: z.string().describe('The new company of the user.').optional(),\n    location: z.string().describe('The new location of the user.').optional(),\n    hireable: z\n      .boolean()\n      .describe('The new hiring availability of the user.')\n      .optional(),\n    bio: z.string().describe('The new short biography of the user.').optional()\n  })\n  export type UsersUpdateAuthenticatedParams = z.infer<\n    typeof UsersUpdateAuthenticatedParamsSchema\n  >\n\n  export const UsersUpdateAuthenticatedResponseSchema = PrivateUserSchema\n  export type UsersUpdateAuthenticatedResponse = z.infer<\n    typeof UsersUpdateAuthenticatedResponseSchema\n  >\n\n  export const UsersListBlockedByAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListBlockedByAuthenticatedUserParams = z.infer<\n    typeof UsersListBlockedByAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListBlockedByAuthenticatedUserResponseSchema =\n    z.array(SimpleUserSchema)\n  export type UsersListBlockedByAuthenticatedUserResponse = z.infer<\n    typeof UsersListBlockedByAuthenticatedUserResponseSchema\n  >\n\n  export const UsersCheckBlockedParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type UsersCheckBlockedParams = z.infer<\n    typeof UsersCheckBlockedParamsSchema\n  >\n\n  export type UsersCheckBlockedResponse = undefined\n\n  export const UsersBlockParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type UsersBlockParams = z.infer<typeof UsersBlockParamsSchema>\n\n  export type UsersBlockResponse = undefined\n\n  export const UsersUnblockParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type UsersUnblockParams = z.infer<typeof UsersUnblockParamsSchema>\n\n  export type UsersUnblockResponse = undefined\n\n  export const CodespacesListForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    repository_id: z\n      .number()\n      .int()\n      .describe('ID of the Repository to filter on')\n      .optional()\n  })\n  export type CodespacesListForAuthenticatedUserParams = z.infer<\n    typeof CodespacesListForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesListForAuthenticatedUserResponseSchema = z.object({\n    total_count: z.number().int(),\n    codespaces: z.array(CodespaceSchema)\n  })\n  export type CodespacesListForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesListForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesCreateForAuthenticatedUserParamsSchema = z\n    .object({})\n    .and(\n      z.union([\n        z.object({\n          repository_id: z\n            .number()\n            .int()\n            .describe('Repository id for this codespace'),\n          ref: z\n            .string()\n            .describe('Git ref (typically a branch name) for this codespace')\n            .optional(),\n          location: z\n            .string()\n            .describe(\n              'The requested location for a new codespace. Best efforts are made to respect this upon creation. Assigned by IP if not provided.'\n            )\n            .optional(),\n          geo: z\n            .enum(['EuropeWest', 'SoutheastAsia', 'UsEast', 'UsWest'])\n            .describe(\n              'The geographic area for this codespace. If not specified, the value is assigned by IP. This property replaces `location`, which is closing down.'\n            )\n            .optional(),\n          client_ip: z\n            .string()\n            .describe('IP for location auto-detection when proxying a request')\n            .optional(),\n          machine: z\n            .string()\n            .describe('Machine type to use for this codespace')\n            .optional(),\n          devcontainer_path: z\n            .string()\n            .describe(\n              'Path to devcontainer.json config to use for this codespace'\n            )\n            .optional(),\n          multi_repo_permissions_opt_out: z\n            .boolean()\n            .describe(\n              'Whether to authorize requested permissions from devcontainer.json'\n            )\n            .optional(),\n          working_directory: z\n            .string()\n            .describe('Working directory for this codespace')\n            .optional(),\n          idle_timeout_minutes: z\n            .number()\n            .int()\n            .describe('Time in minutes before codespace stops from inactivity')\n            .optional(),\n          display_name: z\n            .string()\n            .describe('Display name for this codespace')\n            .optional(),\n          retention_period_minutes: z\n            .number()\n            .int()\n            .describe(\n              'Duration in minutes after codespace has gone idle in which it will be deleted. Must be integer minutes between 0 and 43200 (30 days).'\n            )\n            .optional()\n        }),\n        z.object({\n          pull_request: z\n            .object({\n              pull_request_number: z\n                .number()\n                .int()\n                .describe('Pull request number'),\n              repository_id: z\n                .number()\n                .int()\n                .describe('Repository id for this codespace')\n            })\n            .describe('Pull request number for this codespace'),\n          location: z\n            .string()\n            .describe(\n              'The requested location for a new codespace. Best efforts are made to respect this upon creation. Assigned by IP if not provided.'\n            )\n            .optional(),\n          geo: z\n            .enum(['EuropeWest', 'SoutheastAsia', 'UsEast', 'UsWest'])\n            .describe(\n              'The geographic area for this codespace. If not specified, the value is assigned by IP. This property replaces `location`, which is closing down.'\n            )\n            .optional(),\n          machine: z\n            .string()\n            .describe('Machine type to use for this codespace')\n            .optional(),\n          devcontainer_path: z\n            .string()\n            .describe(\n              'Path to devcontainer.json config to use for this codespace'\n            )\n            .optional(),\n          working_directory: z\n            .string()\n            .describe('Working directory for this codespace')\n            .optional(),\n          idle_timeout_minutes: z\n            .number()\n            .int()\n            .describe('Time in minutes before codespace stops from inactivity')\n            .optional()\n        })\n      ])\n    )\n  export type CodespacesCreateForAuthenticatedUserParams = z.infer<\n    typeof CodespacesCreateForAuthenticatedUserParamsSchema\n  >\n\n  export type CodespacesCreateForAuthenticatedUserResponse = undefined\n\n  export const CodespacesListSecretsForAuthenticatedUserParamsSchema = z.object(\n    {\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type CodespacesListSecretsForAuthenticatedUserParams = z.infer<\n    typeof CodespacesListSecretsForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesListSecretsForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      secrets: z.array(CodespacesSecretSchema)\n    })\n  export type CodespacesListSecretsForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesListSecretsForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesGetPublicKeyForAuthenticatedUserParamsSchema =\n    z.object({})\n  export type CodespacesGetPublicKeyForAuthenticatedUserParams = z.infer<\n    typeof CodespacesGetPublicKeyForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesGetPublicKeyForAuthenticatedUserResponseSchema =\n    CodespacesUserPublicKeySchema\n  export type CodespacesGetPublicKeyForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesGetPublicKeyForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesGetSecretForAuthenticatedUserParamsSchema = z.object({\n    secret_name: z.string().describe('The name of the secret.')\n  })\n  export type CodespacesGetSecretForAuthenticatedUserParams = z.infer<\n    typeof CodespacesGetSecretForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesGetSecretForAuthenticatedUserResponseSchema =\n    CodespacesSecretSchema\n  export type CodespacesGetSecretForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesGetSecretForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesCreateOrUpdateSecretForAuthenticatedUserParamsSchema =\n    z.object({\n      encrypted_value: z\n        .string()\n        .regex(\n          new RegExp(\n            '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$'\n          )\n        )\n        .describe(\n          'Value for your secret, encrypted with [LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages) using the public key retrieved from the [Get the public key for the authenticated user](https://docs.github.com/rest/codespaces/secrets#get-public-key-for-the-authenticated-user) endpoint.'\n        )\n        .optional(),\n      key_id: z\n        .string()\n        .describe('ID of the key you used to encrypt the secret.'),\n      selected_repository_ids: z\n        .array(z.union([z.number().int(), z.string()]))\n        .describe(\n          'An array of repository ids that can access the user secret. You can manage the list of selected repositories using the [List selected repositories for a user secret](https://docs.github.com/rest/codespaces/secrets#list-selected-repositories-for-a-user-secret), [Set selected repositories for a user secret](https://docs.github.com/rest/codespaces/secrets#set-selected-repositories-for-a-user-secret), and [Remove a selected repository from a user secret](https://docs.github.com/rest/codespaces/secrets#remove-a-selected-repository-from-a-user-secret) endpoints.'\n        )\n        .optional(),\n      secret_name: z.string().describe('The name of the secret.')\n    })\n  export type CodespacesCreateOrUpdateSecretForAuthenticatedUserParams =\n    z.infer<\n      typeof CodespacesCreateOrUpdateSecretForAuthenticatedUserParamsSchema\n    >\n\n  export type CodespacesCreateOrUpdateSecretForAuthenticatedUserResponse =\n    undefined\n\n  export const CodespacesDeleteSecretForAuthenticatedUserParamsSchema =\n    z.object({ secret_name: z.string().describe('The name of the secret.') })\n  export type CodespacesDeleteSecretForAuthenticatedUserParams = z.infer<\n    typeof CodespacesDeleteSecretForAuthenticatedUserParamsSchema\n  >\n\n  export type CodespacesDeleteSecretForAuthenticatedUserResponse = undefined\n\n  export const CodespacesListRepositoriesForSecretForAuthenticatedUserParamsSchema =\n    z.object({ secret_name: z.string().describe('The name of the secret.') })\n  export type CodespacesListRepositoriesForSecretForAuthenticatedUserParams =\n    z.infer<\n      typeof CodespacesListRepositoriesForSecretForAuthenticatedUserParamsSchema\n    >\n\n  export const CodespacesListRepositoriesForSecretForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      repositories: z.array(MinimalRepositorySchema)\n    })\n  export type CodespacesListRepositoriesForSecretForAuthenticatedUserResponse =\n    z.infer<\n      typeof CodespacesListRepositoriesForSecretForAuthenticatedUserResponseSchema\n    >\n\n  export const CodespacesSetRepositoriesForSecretForAuthenticatedUserParamsSchema =\n    z.object({\n      selected_repository_ids: z\n        .array(z.number().int())\n        .describe(\n          'An array of repository ids for which a codespace can access the secret. You can manage the list of selected repositories using the [List selected repositories for a user secret](https://docs.github.com/rest/codespaces/secrets#list-selected-repositories-for-a-user-secret), [Add a selected repository to a user secret](https://docs.github.com/rest/codespaces/secrets#add-a-selected-repository-to-a-user-secret), and [Remove a selected repository from a user secret](https://docs.github.com/rest/codespaces/secrets#remove-a-selected-repository-from-a-user-secret) endpoints.'\n        ),\n      secret_name: z.string().describe('The name of the secret.')\n    })\n  export type CodespacesSetRepositoriesForSecretForAuthenticatedUserParams =\n    z.infer<\n      typeof CodespacesSetRepositoriesForSecretForAuthenticatedUserParamsSchema\n    >\n\n  export type CodespacesSetRepositoriesForSecretForAuthenticatedUserResponse =\n    undefined\n\n  export const CodespacesAddRepositoryForSecretForAuthenticatedUserParamsSchema =\n    z.object({\n      secret_name: z.string().describe('The name of the secret.'),\n      repository_id: z.number().int()\n    })\n  export type CodespacesAddRepositoryForSecretForAuthenticatedUserParams =\n    z.infer<\n      typeof CodespacesAddRepositoryForSecretForAuthenticatedUserParamsSchema\n    >\n\n  export type CodespacesAddRepositoryForSecretForAuthenticatedUserResponse =\n    undefined\n\n  export const CodespacesRemoveRepositoryForSecretForAuthenticatedUserParamsSchema =\n    z.object({\n      secret_name: z.string().describe('The name of the secret.'),\n      repository_id: z.number().int()\n    })\n  export type CodespacesRemoveRepositoryForSecretForAuthenticatedUserParams =\n    z.infer<\n      typeof CodespacesRemoveRepositoryForSecretForAuthenticatedUserParamsSchema\n    >\n\n  export type CodespacesRemoveRepositoryForSecretForAuthenticatedUserResponse =\n    undefined\n\n  export const CodespacesGetForAuthenticatedUserParamsSchema = z.object({\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesGetForAuthenticatedUserParams = z.infer<\n    typeof CodespacesGetForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesGetForAuthenticatedUserResponseSchema = CodespaceSchema\n  export type CodespacesGetForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesGetForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesDeleteForAuthenticatedUserParamsSchema = z.object({\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesDeleteForAuthenticatedUserParams = z.infer<\n    typeof CodespacesDeleteForAuthenticatedUserParamsSchema\n  >\n\n  export type CodespacesDeleteForAuthenticatedUserResponse = undefined\n\n  export const CodespacesUpdateForAuthenticatedUserParamsSchema = z.object({\n    machine: z\n      .string()\n      .describe('A valid machine to transition this codespace to.')\n      .optional(),\n    display_name: z\n      .string()\n      .describe('Display name for this codespace')\n      .optional(),\n    recent_folders: z\n      .array(z.string())\n      .describe(\n        'Recently opened folders inside the codespace. It is currently used by the clients to determine the folder path to load the codespace in.'\n      )\n      .optional(),\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesUpdateForAuthenticatedUserParams = z.infer<\n    typeof CodespacesUpdateForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesUpdateForAuthenticatedUserResponseSchema =\n    CodespaceSchema\n  export type CodespacesUpdateForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesUpdateForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesExportForAuthenticatedUserParamsSchema = z.object({\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesExportForAuthenticatedUserParams = z.infer<\n    typeof CodespacesExportForAuthenticatedUserParamsSchema\n  >\n\n  export type CodespacesExportForAuthenticatedUserResponse = undefined\n\n  export const CodespacesGetExportDetailsForAuthenticatedUserParamsSchema =\n    z.object({\n      codespace_name: z.string().describe('The name of the codespace.'),\n      export_id: z\n        .string()\n        .describe(\n          'The ID of the export operation, or `latest`. Currently only `latest` is currently supported.'\n        )\n    })\n  export type CodespacesGetExportDetailsForAuthenticatedUserParams = z.infer<\n    typeof CodespacesGetExportDetailsForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesGetExportDetailsForAuthenticatedUserResponseSchema =\n    CodespaceExportDetailsSchema\n  export type CodespacesGetExportDetailsForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesGetExportDetailsForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesCodespaceMachinesForAuthenticatedUserParamsSchema =\n    z.object({\n      codespace_name: z.string().describe('The name of the codespace.')\n    })\n  export type CodespacesCodespaceMachinesForAuthenticatedUserParams = z.infer<\n    typeof CodespacesCodespaceMachinesForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesCodespaceMachinesForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      machines: z.array(CodespaceMachineSchema)\n    })\n  export type CodespacesCodespaceMachinesForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesCodespaceMachinesForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesPublishForAuthenticatedUserParamsSchema = z.object({\n    name: z.string().describe('A name for the new repository.').optional(),\n    private: z\n      .boolean()\n      .describe('Whether the new repository should be private.')\n      .default(false),\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesPublishForAuthenticatedUserParams = z.infer<\n    typeof CodespacesPublishForAuthenticatedUserParamsSchema\n  >\n\n  export type CodespacesPublishForAuthenticatedUserResponse = undefined\n\n  export const CodespacesStartForAuthenticatedUserParamsSchema = z.object({\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesStartForAuthenticatedUserParams = z.infer<\n    typeof CodespacesStartForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesStartForAuthenticatedUserResponseSchema =\n    CodespaceSchema\n  export type CodespacesStartForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesStartForAuthenticatedUserResponseSchema\n  >\n\n  export const CodespacesStopForAuthenticatedUserParamsSchema = z.object({\n    codespace_name: z.string().describe('The name of the codespace.')\n  })\n  export type CodespacesStopForAuthenticatedUserParams = z.infer<\n    typeof CodespacesStopForAuthenticatedUserParamsSchema\n  >\n\n  export const CodespacesStopForAuthenticatedUserResponseSchema =\n    CodespaceSchema\n  export type CodespacesStopForAuthenticatedUserResponse = z.infer<\n    typeof CodespacesStopForAuthenticatedUserResponseSchema\n  >\n\n  export const PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserParamsSchema =\n    z.object({})\n  export type PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserParams =\n    z.infer<\n      typeof PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserParamsSchema\n    >\n\n  export const PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserResponseSchema =\n    z.array(PackageSchema)\n  export type PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserResponse =\n    z.infer<\n      typeof PackagesListDockerMigrationConflictingPackagesForAuthenticatedUserResponseSchema\n    >\n\n  export const UsersSetPrimaryEmailVisibilityForAuthenticatedUserParamsSchema =\n    z.object({\n      visibility: z\n        .enum(['public', 'private'])\n        .describe('Denotes whether an email is publicly visible.')\n    })\n  export type UsersSetPrimaryEmailVisibilityForAuthenticatedUserParams =\n    z.infer<\n      typeof UsersSetPrimaryEmailVisibilityForAuthenticatedUserParamsSchema\n    >\n\n  export const UsersSetPrimaryEmailVisibilityForAuthenticatedUserResponseSchema =\n    z.array(EmailSchema)\n  export type UsersSetPrimaryEmailVisibilityForAuthenticatedUserResponse =\n    z.infer<\n      typeof UsersSetPrimaryEmailVisibilityForAuthenticatedUserResponseSchema\n    >\n\n  export const UsersListEmailsForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListEmailsForAuthenticatedUserParams = z.infer<\n    typeof UsersListEmailsForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListEmailsForAuthenticatedUserResponseSchema =\n    z.array(EmailSchema)\n  export type UsersListEmailsForAuthenticatedUserResponse = z.infer<\n    typeof UsersListEmailsForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersAddEmailForAuthenticatedUserParamsSchema = z\n    .object({})\n    .and(\n      z.union([\n        z.object({\n          emails: z\n            .array(z.string())\n            .min(1)\n            .describe(\n              'Adds one or more email addresses to your GitHub account. Must contain at least one email address. **Note:** Alternatively, you can pass a single email address or an `array` of emails addresses directly, but we recommend that you pass an object using the `emails` key.'\n            )\n        }),\n        z.array(z.string()).min(1),\n        z.string()\n      ])\n    )\n  export type UsersAddEmailForAuthenticatedUserParams = z.infer<\n    typeof UsersAddEmailForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersAddEmailForAuthenticatedUserResponse = undefined\n\n  export const UsersDeleteEmailForAuthenticatedUserParamsSchema = z\n    .object({})\n    .and(\n      z.union([\n        z\n          .object({\n            emails: z\n              .array(z.string())\n              .min(1)\n              .describe(\n                'Email addresses associated with the GitHub user account.'\n              )\n          })\n          .describe(\n            'Deletes one or more email addresses from your GitHub account. Must contain at least one email address. **Note:** Alternatively, you can pass a single email address or an `array` of emails addresses directly, but we recommend that you pass an object using the `emails` key.'\n          ),\n        z.array(z.string()).min(1),\n        z.string()\n      ])\n    )\n  export type UsersDeleteEmailForAuthenticatedUserParams = z.infer<\n    typeof UsersDeleteEmailForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersDeleteEmailForAuthenticatedUserResponse = undefined\n\n  export const UsersListFollowersForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListFollowersForAuthenticatedUserParams = z.infer<\n    typeof UsersListFollowersForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListFollowersForAuthenticatedUserResponseSchema =\n    z.array(SimpleUserSchema)\n  export type UsersListFollowersForAuthenticatedUserResponse = z.infer<\n    typeof UsersListFollowersForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersListFollowedByAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListFollowedByAuthenticatedUserParams = z.infer<\n    typeof UsersListFollowedByAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListFollowedByAuthenticatedUserResponseSchema =\n    z.array(SimpleUserSchema)\n  export type UsersListFollowedByAuthenticatedUserResponse = z.infer<\n    typeof UsersListFollowedByAuthenticatedUserResponseSchema\n  >\n\n  export const UsersCheckPersonIsFollowedByAuthenticatedParamsSchema = z.object(\n    { username: z.string().describe('The handle for the GitHub user account.') }\n  )\n  export type UsersCheckPersonIsFollowedByAuthenticatedParams = z.infer<\n    typeof UsersCheckPersonIsFollowedByAuthenticatedParamsSchema\n  >\n\n  export type UsersCheckPersonIsFollowedByAuthenticatedResponse = undefined\n\n  export const UsersFollowParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type UsersFollowParams = z.infer<typeof UsersFollowParamsSchema>\n\n  export type UsersFollowResponse = undefined\n\n  export const UsersUnfollowParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type UsersUnfollowParams = z.infer<typeof UsersUnfollowParamsSchema>\n\n  export type UsersUnfollowResponse = undefined\n\n  export const UsersListGpgKeysForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListGpgKeysForAuthenticatedUserParams = z.infer<\n    typeof UsersListGpgKeysForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListGpgKeysForAuthenticatedUserResponseSchema =\n    z.array(GpgKeySchema)\n  export type UsersListGpgKeysForAuthenticatedUserResponse = z.infer<\n    typeof UsersListGpgKeysForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersCreateGpgKeyForAuthenticatedUserParamsSchema = z.object({\n    name: z.string().describe('A descriptive name for the new key.').optional(),\n    armored_public_key: z\n      .string()\n      .describe('A GPG key in ASCII-armored format.')\n  })\n  export type UsersCreateGpgKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersCreateGpgKeyForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersCreateGpgKeyForAuthenticatedUserResponse = undefined\n\n  export const UsersGetGpgKeyForAuthenticatedUserParamsSchema = z.object({\n    gpg_key_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the GPG key.')\n  })\n  export type UsersGetGpgKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersGetGpgKeyForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersGetGpgKeyForAuthenticatedUserResponseSchema = GpgKeySchema\n  export type UsersGetGpgKeyForAuthenticatedUserResponse = z.infer<\n    typeof UsersGetGpgKeyForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersDeleteGpgKeyForAuthenticatedUserParamsSchema = z.object({\n    gpg_key_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the GPG key.')\n  })\n  export type UsersDeleteGpgKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersDeleteGpgKeyForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersDeleteGpgKeyForAuthenticatedUserResponse = undefined\n\n  export const AppsListInstallationsForAuthenticatedUserParamsSchema = z.object(\n    {\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type AppsListInstallationsForAuthenticatedUserParams = z.infer<\n    typeof AppsListInstallationsForAuthenticatedUserParamsSchema\n  >\n\n  export const AppsListInstallationsForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      installations: z.array(InstallationSchema)\n    })\n  export type AppsListInstallationsForAuthenticatedUserResponse = z.infer<\n    typeof AppsListInstallationsForAuthenticatedUserResponseSchema\n  >\n\n  export const AppsListInstallationReposForAuthenticatedUserParamsSchema =\n    z.object({\n      installation_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the installation.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type AppsListInstallationReposForAuthenticatedUserParams = z.infer<\n    typeof AppsListInstallationReposForAuthenticatedUserParamsSchema\n  >\n\n  export const AppsListInstallationReposForAuthenticatedUserResponseSchema =\n    z.object({\n      total_count: z.number().int(),\n      repository_selection: z.string().optional(),\n      repositories: z.array(RepositorySchema)\n    })\n  export type AppsListInstallationReposForAuthenticatedUserResponse = z.infer<\n    typeof AppsListInstallationReposForAuthenticatedUserResponseSchema\n  >\n\n  export const AppsAddRepoToInstallationForAuthenticatedUserParamsSchema =\n    z.object({\n      installation_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the installation.'),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the repository.')\n    })\n  export type AppsAddRepoToInstallationForAuthenticatedUserParams = z.infer<\n    typeof AppsAddRepoToInstallationForAuthenticatedUserParamsSchema\n  >\n\n  export type AppsAddRepoToInstallationForAuthenticatedUserResponse = undefined\n\n  export const AppsRemoveRepoFromInstallationForAuthenticatedUserParamsSchema =\n    z.object({\n      installation_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the installation.'),\n      repository_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the repository.')\n    })\n  export type AppsRemoveRepoFromInstallationForAuthenticatedUserParams =\n    z.infer<\n      typeof AppsRemoveRepoFromInstallationForAuthenticatedUserParamsSchema\n    >\n\n  export type AppsRemoveRepoFromInstallationForAuthenticatedUserResponse =\n    undefined\n\n  export const InteractionsGetRestrictionsForAuthenticatedUserParamsSchema =\n    z.object({})\n  export type InteractionsGetRestrictionsForAuthenticatedUserParams = z.infer<\n    typeof InteractionsGetRestrictionsForAuthenticatedUserParamsSchema\n  >\n\n  export const InteractionsGetRestrictionsForAuthenticatedUserResponseSchema =\n    z.union([InteractionLimitResponseSchema, z.object({}).strict()])\n  export type InteractionsGetRestrictionsForAuthenticatedUserResponse = z.infer<\n    typeof InteractionsGetRestrictionsForAuthenticatedUserResponseSchema\n  >\n\n  export const InteractionsSetRestrictionsForAuthenticatedUserParamsSchema = InteractionLimitSchema\n  export type InteractionsSetRestrictionsForAuthenticatedUserParams = z.infer<\n    typeof InteractionsSetRestrictionsForAuthenticatedUserParamsSchema\n  >\n\n  export const InteractionsSetRestrictionsForAuthenticatedUserResponseSchema =\n    InteractionLimitResponseSchema\n  export type InteractionsSetRestrictionsForAuthenticatedUserResponse = z.infer<\n    typeof InteractionsSetRestrictionsForAuthenticatedUserResponseSchema\n  >\n\n  export const InteractionsRemoveRestrictionsForAuthenticatedUserParamsSchema =\n    z.object({})\n  export type InteractionsRemoveRestrictionsForAuthenticatedUserParams =\n    z.infer<\n      typeof InteractionsRemoveRestrictionsForAuthenticatedUserParamsSchema\n    >\n\n  export type InteractionsRemoveRestrictionsForAuthenticatedUserResponse =\n    undefined\n\n  export const IssuesListForAuthenticatedUserParamsSchema = z.object({\n    filter: z\n      .enum(['assigned', 'created', 'mentioned', 'subscribed', 'repos', 'all'])\n      .describe(\n        \"Indicates which sorts of issues to return. `assigned` means issues assigned to you. `created` means issues created by you. `mentioned` means issues mentioning you. `subscribed` means issues you're subscribed to updates for. `all` or `repos` means all issues you can see, regardless of participation or creation.\"\n      )\n      .default('assigned'),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Indicates the state of the issues to return.')\n      .default('open'),\n    labels: z\n      .string()\n      .describe(\n        'A list of comma separated label names. Example: `bug,ui,@high`'\n      )\n      .optional(),\n    sort: z\n      .enum(['created', 'updated', 'comments'])\n      .describe('What to sort results by.')\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type IssuesListForAuthenticatedUserParams = z.infer<\n    typeof IssuesListForAuthenticatedUserParamsSchema\n  >\n\n  export const IssuesListForAuthenticatedUserResponseSchema =\n    z.array(IssueSchema)\n  export type IssuesListForAuthenticatedUserResponse = z.infer<\n    typeof IssuesListForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersListPublicSshKeysForAuthenticatedUserParamsSchema =\n    z.object({\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type UsersListPublicSshKeysForAuthenticatedUserParams = z.infer<\n    typeof UsersListPublicSshKeysForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListPublicSshKeysForAuthenticatedUserResponseSchema =\n    z.array(KeySchema)\n  export type UsersListPublicSshKeysForAuthenticatedUserResponse = z.infer<\n    typeof UsersListPublicSshKeysForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersCreatePublicSshKeyForAuthenticatedUserParamsSchema =\n    z.object({\n      title: z\n        .string()\n        .describe('A descriptive name for the new key.')\n        .optional(),\n      key: z\n        .string()\n        .regex(\n          new RegExp('^ssh-(rsa|dss|ed25519) |^ecdsa-sha2-nistp(256|384|521) ')\n        )\n        .describe('The public SSH key to add to your GitHub account.')\n    })\n  export type UsersCreatePublicSshKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersCreatePublicSshKeyForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersCreatePublicSshKeyForAuthenticatedUserResponse = undefined\n\n  export const UsersGetPublicSshKeyForAuthenticatedUserParamsSchema = z.object({\n    key_id: z.number().int().describe('The unique identifier of the key.')\n  })\n  export type UsersGetPublicSshKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersGetPublicSshKeyForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersGetPublicSshKeyForAuthenticatedUserResponseSchema =\n    KeySchema\n  export type UsersGetPublicSshKeyForAuthenticatedUserResponse = z.infer<\n    typeof UsersGetPublicSshKeyForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersDeletePublicSshKeyForAuthenticatedUserParamsSchema =\n    z.object({\n      key_id: z.number().int().describe('The unique identifier of the key.')\n    })\n  export type UsersDeletePublicSshKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersDeletePublicSshKeyForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersDeletePublicSshKeyForAuthenticatedUserResponse = undefined\n\n  export const AppsListSubscriptionsForAuthenticatedUserParamsSchema = z.object(\n    {\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type AppsListSubscriptionsForAuthenticatedUserParams = z.infer<\n    typeof AppsListSubscriptionsForAuthenticatedUserParamsSchema\n  >\n\n  export const AppsListSubscriptionsForAuthenticatedUserResponseSchema =\n    z.array(UserMarketplacePurchaseSchema)\n  export type AppsListSubscriptionsForAuthenticatedUserResponse = z.infer<\n    typeof AppsListSubscriptionsForAuthenticatedUserResponseSchema\n  >\n\n  export const AppsListSubscriptionsForAuthenticatedUserStubbedParamsSchema =\n    z.object({\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type AppsListSubscriptionsForAuthenticatedUserStubbedParams = z.infer<\n    typeof AppsListSubscriptionsForAuthenticatedUserStubbedParamsSchema\n  >\n\n  export const AppsListSubscriptionsForAuthenticatedUserStubbedResponseSchema =\n    z.array(UserMarketplacePurchaseSchema)\n  export type AppsListSubscriptionsForAuthenticatedUserStubbedResponse =\n    z.infer<\n      typeof AppsListSubscriptionsForAuthenticatedUserStubbedResponseSchema\n    >\n\n  export const OrgsListMembershipsForAuthenticatedUserParamsSchema = z.object({\n    state: z\n      .enum(['active', 'pending'])\n      .describe(\n        'Indicates the state of the memberships to return. If not specified, the API returns both active and pending memberships.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListMembershipsForAuthenticatedUserParams = z.infer<\n    typeof OrgsListMembershipsForAuthenticatedUserParamsSchema\n  >\n\n  export const OrgsListMembershipsForAuthenticatedUserResponseSchema =\n    z.array(OrgMembershipSchema)\n  export type OrgsListMembershipsForAuthenticatedUserResponse = z.infer<\n    typeof OrgsListMembershipsForAuthenticatedUserResponseSchema\n  >\n\n  export const OrgsGetMembershipForAuthenticatedUserParamsSchema = z.object({\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsGetMembershipForAuthenticatedUserParams = z.infer<\n    typeof OrgsGetMembershipForAuthenticatedUserParamsSchema\n  >\n\n  export const OrgsGetMembershipForAuthenticatedUserResponseSchema =\n    OrgMembershipSchema\n  export type OrgsGetMembershipForAuthenticatedUserResponse = z.infer<\n    typeof OrgsGetMembershipForAuthenticatedUserResponseSchema\n  >\n\n  export const OrgsUpdateMembershipForAuthenticatedUserParamsSchema = z.object({\n    state: z\n      .literal('active')\n      .describe(\n        'The state that the membership should be in. Only `\"active\"` will be accepted.'\n      ),\n    org: z\n      .string()\n      .describe('The organization name. The name is not case sensitive.')\n  })\n  export type OrgsUpdateMembershipForAuthenticatedUserParams = z.infer<\n    typeof OrgsUpdateMembershipForAuthenticatedUserParamsSchema\n  >\n\n  export const OrgsUpdateMembershipForAuthenticatedUserResponseSchema =\n    OrgMembershipSchema\n  export type OrgsUpdateMembershipForAuthenticatedUserResponse = z.infer<\n    typeof OrgsUpdateMembershipForAuthenticatedUserResponseSchema\n  >\n\n  export const MigrationsListForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type MigrationsListForAuthenticatedUserParams = z.infer<\n    typeof MigrationsListForAuthenticatedUserParamsSchema\n  >\n\n  export const MigrationsListForAuthenticatedUserResponseSchema =\n    z.array(MigrationSchema)\n  export type MigrationsListForAuthenticatedUserResponse = z.infer<\n    typeof MigrationsListForAuthenticatedUserResponseSchema\n  >\n\n  export const MigrationsStartForAuthenticatedUserParamsSchema = z.object({\n    lock_repositories: z\n      .boolean()\n      .describe(\n        'Lock the repositories being migrated at the start of the migration'\n      )\n      .optional(),\n    exclude_metadata: z\n      .boolean()\n      .describe(\n        'Indicates whether metadata should be excluded and only git source should be included for the migration.'\n      )\n      .optional(),\n    exclude_git_data: z\n      .boolean()\n      .describe(\n        'Indicates whether the repository git data should be excluded from the migration.'\n      )\n      .optional(),\n    exclude_attachments: z\n      .boolean()\n      .describe('Do not include attachments in the migration')\n      .optional(),\n    exclude_releases: z\n      .boolean()\n      .describe('Do not include releases in the migration')\n      .optional(),\n    exclude_owner_projects: z\n      .boolean()\n      .describe(\n        'Indicates whether projects owned by the organization or users should be excluded.'\n      )\n      .optional(),\n    org_metadata_only: z\n      .boolean()\n      .describe(\n        'Indicates whether this should only include organization metadata (repositories array should be empty and will ignore other flags).'\n      )\n      .default(false),\n    exclude: z\n      .array(\n        z\n          .literal('repositories')\n          .describe('Allowed values that can be passed to the exclude param.')\n      )\n      .describe(\n        'Exclude attributes from the API response to improve performance'\n      )\n      .optional(),\n    repositories: z.array(\n      z.string().describe('Repository path, owner and name')\n    )\n  })\n  export type MigrationsStartForAuthenticatedUserParams = z.infer<\n    typeof MigrationsStartForAuthenticatedUserParamsSchema\n  >\n\n  export type MigrationsStartForAuthenticatedUserResponse = undefined\n\n  export const MigrationsGetStatusForAuthenticatedUserParamsSchema = z.object({\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.'),\n    exclude: z.array(z.string()).optional()\n  })\n  export type MigrationsGetStatusForAuthenticatedUserParams = z.infer<\n    typeof MigrationsGetStatusForAuthenticatedUserParamsSchema\n  >\n\n  export const MigrationsGetStatusForAuthenticatedUserResponseSchema =\n    MigrationSchema\n  export type MigrationsGetStatusForAuthenticatedUserResponse = z.infer<\n    typeof MigrationsGetStatusForAuthenticatedUserResponseSchema\n  >\n\n  export const MigrationsGetArchiveForAuthenticatedUserParamsSchema = z.object({\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.')\n  })\n  export type MigrationsGetArchiveForAuthenticatedUserParams = z.infer<\n    typeof MigrationsGetArchiveForAuthenticatedUserParamsSchema\n  >\n\n  export type MigrationsGetArchiveForAuthenticatedUserResponse = undefined\n\n  export const MigrationsDeleteArchiveForAuthenticatedUserParamsSchema =\n    z.object({\n      migration_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the migration.')\n    })\n  export type MigrationsDeleteArchiveForAuthenticatedUserParams = z.infer<\n    typeof MigrationsDeleteArchiveForAuthenticatedUserParamsSchema\n  >\n\n  export type MigrationsDeleteArchiveForAuthenticatedUserResponse = undefined\n\n  export const MigrationsUnlockRepoForAuthenticatedUserParamsSchema = z.object({\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.'),\n    repo_name: z.string().describe('repo_name parameter')\n  })\n  export type MigrationsUnlockRepoForAuthenticatedUserParams = z.infer<\n    typeof MigrationsUnlockRepoForAuthenticatedUserParamsSchema\n  >\n\n  export type MigrationsUnlockRepoForAuthenticatedUserResponse = undefined\n\n  export const MigrationsListReposForAuthenticatedUserParamsSchema = z.object({\n    migration_id: z\n      .number()\n      .int()\n      .describe('The unique identifier of the migration.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type MigrationsListReposForAuthenticatedUserParams = z.infer<\n    typeof MigrationsListReposForAuthenticatedUserParamsSchema\n  >\n\n  export const MigrationsListReposForAuthenticatedUserResponseSchema = z.array(\n    MinimalRepositorySchema\n  )\n  export type MigrationsListReposForAuthenticatedUserResponse = z.infer<\n    typeof MigrationsListReposForAuthenticatedUserResponseSchema\n  >\n\n  export const OrgsListForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListForAuthenticatedUserParams = z.infer<\n    typeof OrgsListForAuthenticatedUserParamsSchema\n  >\n\n  export const OrgsListForAuthenticatedUserResponseSchema = z.array(\n    OrganizationSimpleSchema\n  )\n  export type OrgsListForAuthenticatedUserResponse = z.infer<\n    typeof OrgsListForAuthenticatedUserResponseSchema\n  >\n\n  export const PackagesListPackagesForAuthenticatedUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    visibility: z\n      .enum(['public', 'private', 'internal'])\n      .describe(\n        'The selected visibility of the packages.  This parameter is optional and only filters an existing result set.\\n\\nThe `internal` visibility is only supported for GitHub Packages registries that allow for granular permissions. For other ecosystems `internal` is synonymous with `private`.\\nFor the list of GitHub Packages registries that support granular permissions, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type PackagesListPackagesForAuthenticatedUserParams = z.infer<\n    typeof PackagesListPackagesForAuthenticatedUserParamsSchema\n  >\n\n  export const PackagesListPackagesForAuthenticatedUserResponseSchema =\n    z.array(PackageSchema)\n  export type PackagesListPackagesForAuthenticatedUserResponse = z.infer<\n    typeof PackagesListPackagesForAuthenticatedUserResponseSchema\n  >\n\n  export const PackagesGetPackageForAuthenticatedUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.')\n  })\n  export type PackagesGetPackageForAuthenticatedUserParams = z.infer<\n    typeof PackagesGetPackageForAuthenticatedUserParamsSchema\n  >\n\n  export const PackagesGetPackageForAuthenticatedUserResponseSchema =\n    PackageSchema\n  export type PackagesGetPackageForAuthenticatedUserResponse = z.infer<\n    typeof PackagesGetPackageForAuthenticatedUserResponseSchema\n  >\n\n  export const PackagesDeletePackageForAuthenticatedUserParamsSchema = z.object(\n    {\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.')\n    }\n  )\n  export type PackagesDeletePackageForAuthenticatedUserParams = z.infer<\n    typeof PackagesDeletePackageForAuthenticatedUserParamsSchema\n  >\n\n  export type PackagesDeletePackageForAuthenticatedUserResponse = undefined\n\n  export const PackagesRestorePackageForAuthenticatedUserParamsSchema =\n    z.object({\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.'),\n      token: z.string().describe('package token').optional()\n    })\n  export type PackagesRestorePackageForAuthenticatedUserParams = z.infer<\n    typeof PackagesRestorePackageForAuthenticatedUserParamsSchema\n  >\n\n  export type PackagesRestorePackageForAuthenticatedUserResponse = undefined\n\n  export const PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserParamsSchema =\n    z.object({\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.'),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      state: z\n        .enum(['active', 'deleted'])\n        .describe('The state of the package, either active or deleted.')\n        .default('active')\n    })\n  export type PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserParams =\n    z.infer<\n      typeof PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserParamsSchema\n    >\n\n  export const PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserResponseSchema =\n    z.array(PackageVersionSchema)\n  export type PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserResponse =\n    z.infer<\n      typeof PackagesGetAllPackageVersionsForPackageOwnedByAuthenticatedUserResponseSchema\n    >\n\n  export const PackagesGetPackageVersionForAuthenticatedUserParamsSchema =\n    z.object({\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.'),\n      package_version_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the package version.')\n    })\n  export type PackagesGetPackageVersionForAuthenticatedUserParams = z.infer<\n    typeof PackagesGetPackageVersionForAuthenticatedUserParamsSchema\n  >\n\n  export const PackagesGetPackageVersionForAuthenticatedUserResponseSchema =\n    PackageVersionSchema\n  export type PackagesGetPackageVersionForAuthenticatedUserResponse = z.infer<\n    typeof PackagesGetPackageVersionForAuthenticatedUserResponseSchema\n  >\n\n  export const PackagesDeletePackageVersionForAuthenticatedUserParamsSchema =\n    z.object({\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.'),\n      package_version_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the package version.')\n    })\n  export type PackagesDeletePackageVersionForAuthenticatedUserParams = z.infer<\n    typeof PackagesDeletePackageVersionForAuthenticatedUserParamsSchema\n  >\n\n  export type PackagesDeletePackageVersionForAuthenticatedUserResponse =\n    undefined\n\n  export const PackagesRestorePackageVersionForAuthenticatedUserParamsSchema =\n    z.object({\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.'),\n      package_version_id: z\n        .number()\n        .int()\n        .describe('Unique identifier of the package version.')\n    })\n  export type PackagesRestorePackageVersionForAuthenticatedUserParams = z.infer<\n    typeof PackagesRestorePackageVersionForAuthenticatedUserParamsSchema\n  >\n\n  export type PackagesRestorePackageVersionForAuthenticatedUserResponse =\n    undefined\n\n  export const ProjectsCreateForAuthenticatedUserParamsSchema = z.object({\n    name: z.string().describe('Name of the project'),\n    body: z.string().describe('Body of the project').optional()\n  })\n  export type ProjectsCreateForAuthenticatedUserParams = z.infer<\n    typeof ProjectsCreateForAuthenticatedUserParamsSchema\n  >\n\n  export type ProjectsCreateForAuthenticatedUserResponse = undefined\n\n  export const UsersListPublicEmailsForAuthenticatedUserParamsSchema = z.object(\n    {\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type UsersListPublicEmailsForAuthenticatedUserParams = z.infer<\n    typeof UsersListPublicEmailsForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListPublicEmailsForAuthenticatedUserResponseSchema =\n    z.array(EmailSchema)\n  export type UsersListPublicEmailsForAuthenticatedUserResponse = z.infer<\n    typeof UsersListPublicEmailsForAuthenticatedUserResponseSchema\n  >\n\n  export const ReposListForAuthenticatedUserParamsSchema = z.object({\n    visibility: z\n      .enum(['all', 'public', 'private'])\n      .describe('Limit results to repositories with the specified visibility.')\n      .default('all'),\n    affiliation: z\n      .string()\n      .describe(\n        'Comma-separated list of values. Can include:  \\n * `owner`: Repositories that are owned by the authenticated user.  \\n * `collaborator`: Repositories that the user has been added to as a collaborator.  \\n * `organization_member`: Repositories that the user has access to through being a member of an organization. This includes every repository on every team that the user is on.'\n      )\n      .default('owner,collaborator,organization_member'),\n    type: z\n      .enum(['all', 'owner', 'public', 'private', 'member'])\n      .describe(\n        'Limit results to repositories of the specified type. Will cause a `422` error if used in the same request as **visibility** or **affiliation**.'\n      )\n      .default('all'),\n    sort: z\n      .enum(['created', 'updated', 'pushed', 'full_name'])\n      .describe('The property to sort the results by.')\n      .default('full_name'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'The order to sort by. Default: `asc` when using `full_name`, otherwise `desc`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show repositories updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    before: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show repositories updated before the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional()\n  })\n  export type ReposListForAuthenticatedUserParams = z.infer<\n    typeof ReposListForAuthenticatedUserParamsSchema\n  >\n\n  export const ReposListForAuthenticatedUserResponseSchema =\n    z.array(RepositorySchema)\n  export type ReposListForAuthenticatedUserResponse = z.infer<\n    typeof ReposListForAuthenticatedUserResponseSchema\n  >\n\n  export const ReposCreateForAuthenticatedUserParamsSchema = z.object({\n    name: z.string().describe('The name of the repository.'),\n    description: z\n      .string()\n      .describe('A short description of the repository.')\n      .optional(),\n    homepage: z\n      .string()\n      .describe('A URL with more information about the repository.')\n      .optional(),\n    private: z\n      .boolean()\n      .describe('Whether the repository is private.')\n      .default(false),\n    has_issues: z\n      .boolean()\n      .describe('Whether issues are enabled.')\n      .default(true),\n    has_projects: z\n      .boolean()\n      .describe('Whether projects are enabled.')\n      .default(true),\n    has_wiki: z\n      .boolean()\n      .describe('Whether the wiki is enabled.')\n      .default(true),\n    has_discussions: z\n      .boolean()\n      .describe('Whether discussions are enabled.')\n      .default(false),\n    team_id: z\n      .number()\n      .int()\n      .describe(\n        'The id of the team that will be granted access to this repository. This is only valid when creating a repository in an organization.'\n      )\n      .optional(),\n    auto_init: z\n      .boolean()\n      .describe('Whether the repository is initialized with a minimal README.')\n      .default(false),\n    gitignore_template: z\n      .string()\n      .describe('The desired language or platform to apply to the .gitignore.')\n      .optional(),\n    license_template: z\n      .string()\n      .describe(\n        'The license keyword of the open source license for this repository.'\n      )\n      .optional(),\n    allow_squash_merge: z\n      .boolean()\n      .describe('Whether to allow squash merges for pull requests.')\n      .default(true),\n    allow_merge_commit: z\n      .boolean()\n      .describe('Whether to allow merge commits for pull requests.')\n      .default(true),\n    allow_rebase_merge: z\n      .boolean()\n      .describe('Whether to allow rebase merges for pull requests.')\n      .default(true),\n    allow_auto_merge: z\n      .boolean()\n      .describe('Whether to allow Auto-merge to be used on pull requests.')\n      .default(false),\n    delete_branch_on_merge: z\n      .boolean()\n      .describe('Whether to delete head branches when pull requests are merged')\n      .default(false),\n    squash_merge_commit_title: z\n      .enum(['PR_TITLE', 'COMMIT_OR_PR_TITLE'])\n      .describe(\n        \"Required when using `squash_merge_commit_message`.\\n\\nThe default value for a squash merge commit title:\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) or the pull request's title (when more than one commit).\"\n      )\n      .optional(),\n    squash_merge_commit_message: z\n      .enum(['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'])\n      .describe(\n        \"The default value for a squash merge commit message:\\n\\n- `PR_BODY` - default to the pull request's body.\\n- `COMMIT_MESSAGES` - default to the branch's commit messages.\\n- `BLANK` - default to a blank commit message.\"\n      )\n      .optional(),\n    merge_commit_title: z\n      .enum(['PR_TITLE', 'MERGE_MESSAGE'])\n      .describe(\n        \"Required when using `merge_commit_message`.\\n\\nThe default value for a merge commit title.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., Merge pull request #123 from branch-name).\"\n      )\n      .optional(),\n    merge_commit_message: z\n      .enum(['PR_BODY', 'PR_TITLE', 'BLANK'])\n      .describe(\n        \"The default value for a merge commit message.\\n\\n- `PR_TITLE` - default to the pull request's title.\\n- `PR_BODY` - default to the pull request's body.\\n- `BLANK` - default to a blank commit message.\"\n      )\n      .optional(),\n    has_downloads: z\n      .boolean()\n      .describe('Whether downloads are enabled.')\n      .default(true),\n    is_template: z\n      .boolean()\n      .describe(\n        'Whether this repository acts as a template that can be used to generate new repositories.'\n      )\n      .default(false)\n  })\n  export type ReposCreateForAuthenticatedUserParams = z.infer<\n    typeof ReposCreateForAuthenticatedUserParamsSchema\n  >\n\n  export type ReposCreateForAuthenticatedUserResponse = undefined\n\n  export const ReposListInvitationsForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListInvitationsForAuthenticatedUserParams = z.infer<\n    typeof ReposListInvitationsForAuthenticatedUserParamsSchema\n  >\n\n  export const ReposListInvitationsForAuthenticatedUserResponseSchema = z.array(\n    RepositoryInvitationSchema\n  )\n  export type ReposListInvitationsForAuthenticatedUserResponse = z.infer<\n    typeof ReposListInvitationsForAuthenticatedUserResponseSchema\n  >\n\n  export const ReposDeclineInvitationForAuthenticatedUserParamsSchema =\n    z.object({\n      invitation_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the invitation.')\n    })\n  export type ReposDeclineInvitationForAuthenticatedUserParams = z.infer<\n    typeof ReposDeclineInvitationForAuthenticatedUserParamsSchema\n  >\n\n  export type ReposDeclineInvitationForAuthenticatedUserResponse = undefined\n\n  export const ReposAcceptInvitationForAuthenticatedUserParamsSchema = z.object(\n    {\n      invitation_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the invitation.')\n    }\n  )\n  export type ReposAcceptInvitationForAuthenticatedUserParams = z.infer<\n    typeof ReposAcceptInvitationForAuthenticatedUserParamsSchema\n  >\n\n  export type ReposAcceptInvitationForAuthenticatedUserResponse = undefined\n\n  export const UsersListSocialAccountsForAuthenticatedUserParamsSchema =\n    z.object({\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type UsersListSocialAccountsForAuthenticatedUserParams = z.infer<\n    typeof UsersListSocialAccountsForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListSocialAccountsForAuthenticatedUserResponseSchema =\n    z.array(SocialAccountSchema)\n  export type UsersListSocialAccountsForAuthenticatedUserResponse = z.infer<\n    typeof UsersListSocialAccountsForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersAddSocialAccountForAuthenticatedUserParamsSchema = z.object(\n    {\n      account_urls: z\n        .array(z.string())\n        .describe('Full URLs for the social media profiles to add.')\n    }\n  )\n  export type UsersAddSocialAccountForAuthenticatedUserParams = z.infer<\n    typeof UsersAddSocialAccountForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersAddSocialAccountForAuthenticatedUserResponse = undefined\n\n  export const UsersDeleteSocialAccountForAuthenticatedUserParamsSchema =\n    z.object({\n      account_urls: z\n        .array(z.string())\n        .describe('Full URLs for the social media profiles to delete.')\n    })\n  export type UsersDeleteSocialAccountForAuthenticatedUserParams = z.infer<\n    typeof UsersDeleteSocialAccountForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersDeleteSocialAccountForAuthenticatedUserResponse = undefined\n\n  export const UsersListSshSigningKeysForAuthenticatedUserParamsSchema =\n    z.object({\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type UsersListSshSigningKeysForAuthenticatedUserParams = z.infer<\n    typeof UsersListSshSigningKeysForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersListSshSigningKeysForAuthenticatedUserResponseSchema =\n    z.array(SshSigningKeySchema)\n  export type UsersListSshSigningKeysForAuthenticatedUserResponse = z.infer<\n    typeof UsersListSshSigningKeysForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersCreateSshSigningKeyForAuthenticatedUserParamsSchema =\n    z.object({\n      title: z\n        .string()\n        .describe('A descriptive name for the new key.')\n        .optional(),\n      key: z\n        .string()\n        .regex(\n          new RegExp(\n            '^ssh-(rsa|dss|ed25519) |^ecdsa-sha2-nistp(256|384|521) |^(sk-ssh-ed25519|sk-ecdsa-sha2-nistp256)@openssh.com '\n          )\n        )\n        .describe(\n          'The public SSH key to add to your GitHub account. For more information, see \"[Checking for existing SSH keys](https://docs.github.com/authentication/connecting-to-github-with-ssh/checking-for-existing-ssh-keys).\"'\n        )\n    })\n  export type UsersCreateSshSigningKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersCreateSshSigningKeyForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersCreateSshSigningKeyForAuthenticatedUserResponse = undefined\n\n  export const UsersGetSshSigningKeyForAuthenticatedUserParamsSchema = z.object(\n    {\n      ssh_signing_key_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the SSH signing key.')\n    }\n  )\n  export type UsersGetSshSigningKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersGetSshSigningKeyForAuthenticatedUserParamsSchema\n  >\n\n  export const UsersGetSshSigningKeyForAuthenticatedUserResponseSchema =\n    SshSigningKeySchema\n  export type UsersGetSshSigningKeyForAuthenticatedUserResponse = z.infer<\n    typeof UsersGetSshSigningKeyForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersDeleteSshSigningKeyForAuthenticatedUserParamsSchema =\n    z.object({\n      ssh_signing_key_id: z\n        .number()\n        .int()\n        .describe('The unique identifier of the SSH signing key.')\n    })\n  export type UsersDeleteSshSigningKeyForAuthenticatedUserParams = z.infer<\n    typeof UsersDeleteSshSigningKeyForAuthenticatedUserParamsSchema\n  >\n\n  export type UsersDeleteSshSigningKeyForAuthenticatedUserResponse = undefined\n\n  export const ActivityListReposStarredByAuthenticatedUserParamsSchema =\n    z.object({\n      sort: z\n        .enum(['created', 'updated'])\n        .describe(\n          'The property to sort the results by. `created` means when the repository was starred. `updated` means when the repository was last pushed to.'\n        )\n        .default('created'),\n      direction: z\n        .enum(['asc', 'desc'])\n        .describe('The direction to sort the results by.')\n        .default('desc'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type ActivityListReposStarredByAuthenticatedUserParams = z.infer<\n    typeof ActivityListReposStarredByAuthenticatedUserParamsSchema\n  >\n\n  export const ActivityListReposStarredByAuthenticatedUserResponseSchema =\n    z.array(RepositorySchema)\n  export type ActivityListReposStarredByAuthenticatedUserResponse = z.infer<\n    typeof ActivityListReposStarredByAuthenticatedUserResponseSchema\n  >\n\n  export const ActivityCheckRepoIsStarredByAuthenticatedUserParamsSchema =\n    z.object({\n      owner: z\n        .string()\n        .describe(\n          'The account owner of the repository. The name is not case sensitive.'\n        ),\n      repo: z\n        .string()\n        .describe(\n          'The name of the repository without the `.git` extension. The name is not case sensitive.'\n        )\n    })\n  export type ActivityCheckRepoIsStarredByAuthenticatedUserParams = z.infer<\n    typeof ActivityCheckRepoIsStarredByAuthenticatedUserParamsSchema\n  >\n\n  export type ActivityCheckRepoIsStarredByAuthenticatedUserResponse = undefined\n\n  export const ActivityStarRepoForAuthenticatedUserParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActivityStarRepoForAuthenticatedUserParams = z.infer<\n    typeof ActivityStarRepoForAuthenticatedUserParamsSchema\n  >\n\n  export type ActivityStarRepoForAuthenticatedUserResponse = undefined\n\n  export const ActivityUnstarRepoForAuthenticatedUserParamsSchema = z.object({\n    owner: z\n      .string()\n      .describe(\n        'The account owner of the repository. The name is not case sensitive.'\n      ),\n    repo: z\n      .string()\n      .describe(\n        'The name of the repository without the `.git` extension. The name is not case sensitive.'\n      )\n  })\n  export type ActivityUnstarRepoForAuthenticatedUserParams = z.infer<\n    typeof ActivityUnstarRepoForAuthenticatedUserParamsSchema\n  >\n\n  export type ActivityUnstarRepoForAuthenticatedUserResponse = undefined\n\n  export const ActivityListWatchedReposForAuthenticatedUserParamsSchema =\n    z.object({\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    })\n  export type ActivityListWatchedReposForAuthenticatedUserParams = z.infer<\n    typeof ActivityListWatchedReposForAuthenticatedUserParamsSchema\n  >\n\n  export const ActivityListWatchedReposForAuthenticatedUserResponseSchema =\n    z.array(MinimalRepositorySchema)\n  export type ActivityListWatchedReposForAuthenticatedUserResponse = z.infer<\n    typeof ActivityListWatchedReposForAuthenticatedUserResponseSchema\n  >\n\n  export const TeamsListForAuthenticatedUserParamsSchema = z.object({\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type TeamsListForAuthenticatedUserParams = z.infer<\n    typeof TeamsListForAuthenticatedUserParamsSchema\n  >\n\n  export const TeamsListForAuthenticatedUserResponseSchema =\n    z.array(TeamFullSchema)\n  export type TeamsListForAuthenticatedUserResponse = z.infer<\n    typeof TeamsListForAuthenticatedUserResponseSchema\n  >\n\n  export const UsersGetByIdParamsSchema = z.object({\n    account_id: z.number().int().describe('account_id parameter')\n  })\n  export type UsersGetByIdParams = z.infer<typeof UsersGetByIdParamsSchema>\n\n  export const UsersGetByIdResponseSchema = z.union([\n    PrivateUserSchema,\n    PublicUserSchema\n  ])\n  export type UsersGetByIdResponse = z.infer<typeof UsersGetByIdResponseSchema>\n\n  export const UsersListParamsSchema = z.object({\n    since: z\n      .number()\n      .int()\n      .describe('A user ID. Only return users with an ID greater than this ID.')\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type UsersListParams = z.infer<typeof UsersListParamsSchema>\n\n  export const UsersListResponseSchema = z.array(SimpleUserSchema)\n  export type UsersListResponse = z.infer<typeof UsersListResponseSchema>\n\n  export const UsersGetByUsernameParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type UsersGetByUsernameParams = z.infer<\n    typeof UsersGetByUsernameParamsSchema\n  >\n\n  export const UsersGetByUsernameResponseSchema = z.union([\n    PrivateUserSchema,\n    PublicUserSchema\n  ])\n  export type UsersGetByUsernameResponse = z.infer<\n    typeof UsersGetByUsernameResponseSchema\n  >\n\n  export const UsersListAttestationsParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    subject_digest: z.string().describe('Subject Digest'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    before: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    after: z\n      .string()\n      .describe(\n        'A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .optional(),\n    predicate_type: z\n      .string()\n      .describe(\n        'Optional filter for fetching attestations with a given predicate type.\\nThis option accepts `provenance`, `sbom`, or freeform text for custom predicate types.'\n      )\n      .optional()\n  })\n  export type UsersListAttestationsParams = z.infer<\n    typeof UsersListAttestationsParamsSchema\n  >\n\n  export const UsersListAttestationsResponseSchema = z.object({\n    attestations: z\n      .array(\n        z.object({\n          bundle: z\n            .object({\n              mediaType: z.string().optional(),\n              verificationMaterial: z.object({}).catchall(z.any()).optional(),\n              dsseEnvelope: z.object({}).catchall(z.any()).optional()\n            })\n            .describe(\n              \"The attestation's Sigstore Bundle.\\nRefer to the [Sigstore Bundle Specification](https://github.com/sigstore/protobuf-specs/blob/main/protos/sigstore_bundle.proto) for more information.\"\n            )\n            .optional(),\n          repository_id: z.number().int().optional(),\n          bundle_url: z.string().optional()\n        })\n      )\n      .optional()\n  })\n  export type UsersListAttestationsResponse = z.infer<\n    typeof UsersListAttestationsResponseSchema\n  >\n\n  export const PackagesListDockerMigrationConflictingPackagesForUserParamsSchema =\n    z.object({\n      username: z.string().describe('The handle for the GitHub user account.')\n    })\n  export type PackagesListDockerMigrationConflictingPackagesForUserParams =\n    z.infer<\n      typeof PackagesListDockerMigrationConflictingPackagesForUserParamsSchema\n    >\n\n  export const PackagesListDockerMigrationConflictingPackagesForUserResponseSchema =\n    z.array(PackageSchema)\n  export type PackagesListDockerMigrationConflictingPackagesForUserResponse =\n    z.infer<\n      typeof PackagesListDockerMigrationConflictingPackagesForUserResponseSchema\n    >\n\n  export const ActivityListEventsForAuthenticatedUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListEventsForAuthenticatedUserParams = z.infer<\n    typeof ActivityListEventsForAuthenticatedUserParamsSchema\n  >\n\n  export const ActivityListEventsForAuthenticatedUserResponseSchema =\n    z.array(EventSchema)\n  export type ActivityListEventsForAuthenticatedUserResponse = z.infer<\n    typeof ActivityListEventsForAuthenticatedUserResponseSchema\n  >\n\n  export const ActivityListOrgEventsForAuthenticatedUserParamsSchema = z.object(\n    {\n      username: z.string().describe('The handle for the GitHub user account.'),\n      org: z\n        .string()\n        .describe('The organization name. The name is not case sensitive.'),\n      per_page: z\n        .number()\n        .int()\n        .describe(\n          'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(30),\n      page: z\n        .number()\n        .int()\n        .describe(\n          'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n        )\n        .default(1)\n    }\n  )\n  export type ActivityListOrgEventsForAuthenticatedUserParams = z.infer<\n    typeof ActivityListOrgEventsForAuthenticatedUserParamsSchema\n  >\n\n  export const ActivityListOrgEventsForAuthenticatedUserResponseSchema =\n    z.array(EventSchema)\n  export type ActivityListOrgEventsForAuthenticatedUserResponse = z.infer<\n    typeof ActivityListOrgEventsForAuthenticatedUserResponseSchema\n  >\n\n  export const ActivityListPublicEventsForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListPublicEventsForUserParams = z.infer<\n    typeof ActivityListPublicEventsForUserParamsSchema\n  >\n\n  export const ActivityListPublicEventsForUserResponseSchema =\n    z.array(EventSchema)\n  export type ActivityListPublicEventsForUserResponse = z.infer<\n    typeof ActivityListPublicEventsForUserResponseSchema\n  >\n\n  export const UsersListFollowersForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListFollowersForUserParams = z.infer<\n    typeof UsersListFollowersForUserParamsSchema\n  >\n\n  export const UsersListFollowersForUserResponseSchema =\n    z.array(SimpleUserSchema)\n  export type UsersListFollowersForUserResponse = z.infer<\n    typeof UsersListFollowersForUserResponseSchema\n  >\n\n  export const UsersListFollowingForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListFollowingForUserParams = z.infer<\n    typeof UsersListFollowingForUserParamsSchema\n  >\n\n  export const UsersListFollowingForUserResponseSchema =\n    z.array(SimpleUserSchema)\n  export type UsersListFollowingForUserResponse = z.infer<\n    typeof UsersListFollowingForUserResponseSchema\n  >\n\n  export const UsersCheckFollowingForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    target_user: z.string()\n  })\n  export type UsersCheckFollowingForUserParams = z.infer<\n    typeof UsersCheckFollowingForUserParamsSchema\n  >\n\n  export type UsersCheckFollowingForUserResponse = undefined\n\n  export const GistsListForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    since: z\n      .string()\n      .datetime({ offset: true })\n      .describe(\n        'Only show results that were last updated after the given time. This is a timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format: `YYYY-MM-DDTHH:MM:SSZ`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type GistsListForUserParams = z.infer<\n    typeof GistsListForUserParamsSchema\n  >\n\n  export const GistsListForUserResponseSchema = z.array(BaseGistSchema)\n  export type GistsListForUserResponse = z.infer<\n    typeof GistsListForUserResponseSchema\n  >\n\n  export const UsersListGpgKeysForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListGpgKeysForUserParams = z.infer<\n    typeof UsersListGpgKeysForUserParamsSchema\n  >\n\n  export const UsersListGpgKeysForUserResponseSchema = z.array(GpgKeySchema)\n  export type UsersListGpgKeysForUserResponse = z.infer<\n    typeof UsersListGpgKeysForUserResponseSchema\n  >\n\n  export const UsersGetContextForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    subject_type: z\n      .enum(['organization', 'repository', 'issue', 'pull_request'])\n      .describe(\n        \"Identifies which additional information you'd like to receive about the person's hovercard. Can be `organization`, `repository`, `issue`, `pull_request`. **Required** when using `subject_id`.\"\n      )\n      .optional(),\n    subject_id: z\n      .string()\n      .describe(\n        'Uses the ID for the `subject_type` you specified. **Required** when using `subject_type`.'\n      )\n      .optional()\n  })\n  export type UsersGetContextForUserParams = z.infer<\n    typeof UsersGetContextForUserParamsSchema\n  >\n\n  export const UsersGetContextForUserResponseSchema = HovercardSchema\n  export type UsersGetContextForUserResponse = z.infer<\n    typeof UsersGetContextForUserResponseSchema\n  >\n\n  export const AppsGetUserInstallationParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type AppsGetUserInstallationParams = z.infer<\n    typeof AppsGetUserInstallationParamsSchema\n  >\n\n  export const AppsGetUserInstallationResponseSchema = InstallationSchema\n  export type AppsGetUserInstallationResponse = z.infer<\n    typeof AppsGetUserInstallationResponseSchema\n  >\n\n  export const UsersListPublicKeysForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListPublicKeysForUserParams = z.infer<\n    typeof UsersListPublicKeysForUserParamsSchema\n  >\n\n  export const UsersListPublicKeysForUserResponseSchema =\n    z.array(KeySimpleSchema)\n  export type UsersListPublicKeysForUserResponse = z.infer<\n    typeof UsersListPublicKeysForUserResponseSchema\n  >\n\n  export const OrgsListForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type OrgsListForUserParams = z.infer<\n    typeof OrgsListForUserParamsSchema\n  >\n\n  export const OrgsListForUserResponseSchema = z.array(OrganizationSimpleSchema)\n  export type OrgsListForUserResponse = z.infer<\n    typeof OrgsListForUserResponseSchema\n  >\n\n  export const PackagesListPackagesForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    visibility: z\n      .enum(['public', 'private', 'internal'])\n      .describe(\n        'The selected visibility of the packages.  This parameter is optional and only filters an existing result set.\\n\\nThe `internal` visibility is only supported for GitHub Packages registries that allow for granular permissions. For other ecosystems `internal` is synonymous with `private`.\\nFor the list of GitHub Packages registries that support granular permissions, see \"[About permissions for GitHub Packages](https://docs.github.com/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages).\"'\n      )\n      .optional(),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30)\n  })\n  export type PackagesListPackagesForUserParams = z.infer<\n    typeof PackagesListPackagesForUserParamsSchema\n  >\n\n  export const PackagesListPackagesForUserResponseSchema =\n    z.array(PackageSchema)\n  export type PackagesListPackagesForUserResponse = z.infer<\n    typeof PackagesListPackagesForUserResponseSchema\n  >\n\n  export const PackagesGetPackageForUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type PackagesGetPackageForUserParams = z.infer<\n    typeof PackagesGetPackageForUserParamsSchema\n  >\n\n  export const PackagesGetPackageForUserResponseSchema = PackageSchema\n  export type PackagesGetPackageForUserResponse = z.infer<\n    typeof PackagesGetPackageForUserResponseSchema\n  >\n\n  export const PackagesDeletePackageForUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type PackagesDeletePackageForUserParams = z.infer<\n    typeof PackagesDeletePackageForUserParamsSchema\n  >\n\n  export type PackagesDeletePackageForUserResponse = undefined\n\n  export const PackagesRestorePackageForUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    token: z.string().describe('package token').optional()\n  })\n  export type PackagesRestorePackageForUserParams = z.infer<\n    typeof PackagesRestorePackageForUserParamsSchema\n  >\n\n  export type PackagesRestorePackageForUserResponse = undefined\n\n  export const PackagesGetAllPackageVersionsForPackageOwnedByUserParamsSchema =\n    z.object({\n      package_type: z\n        .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n        .describe(\n          \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n        ),\n      package_name: z.string().describe('The name of the package.'),\n      username: z.string().describe('The handle for the GitHub user account.')\n    })\n  export type PackagesGetAllPackageVersionsForPackageOwnedByUserParams =\n    z.infer<\n      typeof PackagesGetAllPackageVersionsForPackageOwnedByUserParamsSchema\n    >\n\n  export const PackagesGetAllPackageVersionsForPackageOwnedByUserResponseSchema =\n    z.array(PackageVersionSchema)\n  export type PackagesGetAllPackageVersionsForPackageOwnedByUserResponse =\n    z.infer<\n      typeof PackagesGetAllPackageVersionsForPackageOwnedByUserResponseSchema\n    >\n\n  export const PackagesGetPackageVersionForUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    package_version_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the package version.'),\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type PackagesGetPackageVersionForUserParams = z.infer<\n    typeof PackagesGetPackageVersionForUserParamsSchema\n  >\n\n  export const PackagesGetPackageVersionForUserResponseSchema =\n    PackageVersionSchema\n  export type PackagesGetPackageVersionForUserResponse = z.infer<\n    typeof PackagesGetPackageVersionForUserResponseSchema\n  >\n\n  export const PackagesDeletePackageVersionForUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    package_version_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the package version.')\n  })\n  export type PackagesDeletePackageVersionForUserParams = z.infer<\n    typeof PackagesDeletePackageVersionForUserParamsSchema\n  >\n\n  export type PackagesDeletePackageVersionForUserResponse = undefined\n\n  export const PackagesRestorePackageVersionForUserParamsSchema = z.object({\n    package_type: z\n      .enum(['npm', 'maven', 'rubygems', 'docker', 'nuget', 'container'])\n      .describe(\n        \"The type of supported package. Packages in GitHub's Gradle registry have the type `maven`. Docker images pushed to GitHub's Container registry (`ghcr.io`) have the type `container`. You can use the type `docker` to find images that were pushed to GitHub's Docker registry (`docker.pkg.github.com`), even if these have now been migrated to the Container registry.\"\n      ),\n    package_name: z.string().describe('The name of the package.'),\n    username: z.string().describe('The handle for the GitHub user account.'),\n    package_version_id: z\n      .number()\n      .int()\n      .describe('Unique identifier of the package version.')\n  })\n  export type PackagesRestorePackageVersionForUserParams = z.infer<\n    typeof PackagesRestorePackageVersionForUserParamsSchema\n  >\n\n  export type PackagesRestorePackageVersionForUserResponse = undefined\n\n  export const ProjectsListForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    state: z\n      .enum(['open', 'closed', 'all'])\n      .describe('Indicates the state of the projects to return.')\n      .default('open'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ProjectsListForUserParams = z.infer<\n    typeof ProjectsListForUserParamsSchema\n  >\n\n  export const ProjectsListForUserResponseSchema = z.array(ProjectSchema)\n  export type ProjectsListForUserResponse = z.infer<\n    typeof ProjectsListForUserResponseSchema\n  >\n\n  export const ActivityListReceivedEventsForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListReceivedEventsForUserParams = z.infer<\n    typeof ActivityListReceivedEventsForUserParamsSchema\n  >\n\n  export const ActivityListReceivedEventsForUserResponseSchema =\n    z.array(EventSchema)\n  export type ActivityListReceivedEventsForUserResponse = z.infer<\n    typeof ActivityListReceivedEventsForUserResponseSchema\n  >\n\n  export const ActivityListReceivedPublicEventsForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListReceivedPublicEventsForUserParams = z.infer<\n    typeof ActivityListReceivedPublicEventsForUserParamsSchema\n  >\n\n  export const ActivityListReceivedPublicEventsForUserResponseSchema =\n    z.array(EventSchema)\n  export type ActivityListReceivedPublicEventsForUserResponse = z.infer<\n    typeof ActivityListReceivedPublicEventsForUserResponseSchema\n  >\n\n  export const ReposListForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    type: z\n      .enum(['all', 'owner', 'member'])\n      .describe('Limit results to repositories of the specified type.')\n      .default('owner'),\n    sort: z\n      .enum(['created', 'updated', 'pushed', 'full_name'])\n      .describe('The property to sort the results by.')\n      .default('full_name'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe(\n        'The order to sort by. Default: `asc` when using `full_name`, otherwise `desc`.'\n      )\n      .optional(),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ReposListForUserParams = z.infer<\n    typeof ReposListForUserParamsSchema\n  >\n\n  export const ReposListForUserResponseSchema = z.array(MinimalRepositorySchema)\n  export type ReposListForUserResponse = z.infer<\n    typeof ReposListForUserResponseSchema\n  >\n\n  export const BillingGetGithubActionsBillingUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type BillingGetGithubActionsBillingUserParams = z.infer<\n    typeof BillingGetGithubActionsBillingUserParamsSchema\n  >\n\n  export const BillingGetGithubActionsBillingUserResponseSchema =\n    ActionsBillingUsageSchema\n  export type BillingGetGithubActionsBillingUserResponse = z.infer<\n    typeof BillingGetGithubActionsBillingUserResponseSchema\n  >\n\n  export const BillingGetGithubPackagesBillingUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type BillingGetGithubPackagesBillingUserParams = z.infer<\n    typeof BillingGetGithubPackagesBillingUserParamsSchema\n  >\n\n  export const BillingGetGithubPackagesBillingUserResponseSchema =\n    PackagesBillingUsageSchema\n  export type BillingGetGithubPackagesBillingUserResponse = z.infer<\n    typeof BillingGetGithubPackagesBillingUserResponseSchema\n  >\n\n  export const BillingGetSharedStorageBillingUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.')\n  })\n  export type BillingGetSharedStorageBillingUserParams = z.infer<\n    typeof BillingGetSharedStorageBillingUserParamsSchema\n  >\n\n  export const BillingGetSharedStorageBillingUserResponseSchema =\n    CombinedBillingUsageSchema\n  export type BillingGetSharedStorageBillingUserResponse = z.infer<\n    typeof BillingGetSharedStorageBillingUserResponseSchema\n  >\n\n  export const UsersListSocialAccountsForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListSocialAccountsForUserParams = z.infer<\n    typeof UsersListSocialAccountsForUserParamsSchema\n  >\n\n  export const UsersListSocialAccountsForUserResponseSchema =\n    z.array(SocialAccountSchema)\n  export type UsersListSocialAccountsForUserResponse = z.infer<\n    typeof UsersListSocialAccountsForUserResponseSchema\n  >\n\n  export const UsersListSshSigningKeysForUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type UsersListSshSigningKeysForUserParams = z.infer<\n    typeof UsersListSshSigningKeysForUserParamsSchema\n  >\n\n  export const UsersListSshSigningKeysForUserResponseSchema =\n    z.array(SshSigningKeySchema)\n  export type UsersListSshSigningKeysForUserResponse = z.infer<\n    typeof UsersListSshSigningKeysForUserResponseSchema\n  >\n\n  export const ActivityListReposStarredByUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    sort: z\n      .enum(['created', 'updated'])\n      .describe(\n        'The property to sort the results by. `created` means when the repository was starred. `updated` means when the repository was last pushed to.'\n      )\n      .default('created'),\n    direction: z\n      .enum(['asc', 'desc'])\n      .describe('The direction to sort the results by.')\n      .default('desc'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListReposStarredByUserParams = z.infer<\n    typeof ActivityListReposStarredByUserParamsSchema\n  >\n\n  export const ActivityListReposStarredByUserResponseSchema = z.union([\n    z.array(StarredRepositorySchema),\n    z.array(RepositorySchema)\n  ])\n  export type ActivityListReposStarredByUserResponse = z.infer<\n    typeof ActivityListReposStarredByUserResponseSchema\n  >\n\n  export const ActivityListReposWatchedByUserParamsSchema = z.object({\n    username: z.string().describe('The handle for the GitHub user account.'),\n    per_page: z\n      .number()\n      .int()\n      .describe(\n        'The number of results per page (max 100). For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(30),\n    page: z\n      .number()\n      .int()\n      .describe(\n        'The page number of the results to fetch. For more information, see \"[Using pagination in the REST API](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api).\"'\n      )\n      .default(1)\n  })\n  export type ActivityListReposWatchedByUserParams = z.infer<\n    typeof ActivityListReposWatchedByUserParamsSchema\n  >\n\n  export const ActivityListReposWatchedByUserResponseSchema = z.array(\n    MinimalRepositorySchema\n  )\n  export type ActivityListReposWatchedByUserResponse = z.infer<\n    typeof ActivityListReposWatchedByUserResponseSchema\n  >\n\n  export const MetaGetAllVersionsParamsSchema = z.object({})\n  export type MetaGetAllVersionsParams = z.infer<\n    typeof MetaGetAllVersionsParamsSchema\n  >\n\n  export const MetaGetAllVersionsResponseSchema = z.array(z.string().date())\n  export type MetaGetAllVersionsResponse = z.infer<\n    typeof MetaGetAllVersionsResponseSchema\n  >\n\n  export const MetaGetZenParamsSchema = z.object({})\n  export type MetaGetZenParams = z.infer<typeof MetaGetZenParamsSchema>\n\n  export type MetaGetZenResponse = undefined\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/notion-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { notion } from './notion'\n\n/**\n * Agentic Notion client.\n *\n * API specification for Notion.\n */\nexport class NotionClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('NOTION_API_KEY'),\n    apiBaseUrl = notion.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'NotionClient missing required \"apiKey\" (defaults to \"NOTION_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: `Bearer ${apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Get current user.\n   */\n  @aiFunction({\n    name: 'notion_get_self',\n    description: `Get current user.`,\n    inputSchema: notion.GetSelfParamsSchema\n  })\n  async getSelf(\n    _params: notion.GetSelfParams\n  ): Promise<notion.GetSelfResponse> {\n    return this.ky.get('/users/me').json<notion.GetSelfResponse>()\n  }\n\n  /**\n   * Get user.\n   */\n  @aiFunction({\n    name: 'notion_get_user',\n    description: `Get user.`,\n    inputSchema: notion.GetUserParamsSchema\n  })\n  async getUser(params: notion.GetUserParams): Promise<notion.GetUserResponse> {\n    return this.ky\n      .get(`/users/${params.user_id}`)\n      .json<notion.GetUserResponse>()\n  }\n\n  /**\n   * List users.\n   */\n  @aiFunction({\n    name: 'notion_list_users',\n    description: `List users.`,\n    inputSchema: notion.ListUsersParamsSchema\n  })\n  async listUsers(\n    params: notion.ListUsersParams\n  ): Promise<notion.ListUsersResponse> {\n    return this.ky\n      .get('/users', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListUsersResponse>()\n  }\n\n  /**\n   * Create page.\n   */\n  @aiFunction({\n    name: 'notion_create_page',\n    description: `Create page.`,\n    inputSchema: notion.CreatePageParamsSchema\n  })\n  async createPage(\n    params: notion.CreatePageParams\n  ): Promise<notion.CreatePageResponse> {\n    return this.ky\n      .post('/pages', {\n        json: pick(params, 'parent', 'properties')\n      })\n      .json<notion.CreatePageResponse>()\n  }\n\n  /**\n   * Get page.\n   */\n  @aiFunction({\n    name: 'notion_get_page',\n    description: `Get page.`,\n    inputSchema: notion.GetPageParamsSchema\n  })\n  async getPage(params: notion.GetPageParams): Promise<notion.GetPageResponse> {\n    return this.ky\n      .get(`/pages/${params.page_id}`, {\n        searchParams: sanitizeSearchParams(pick(params, 'filter_properties'))\n      })\n      .json<notion.GetPageResponse>()\n  }\n\n  /**\n   * Update page.\n   */\n  @aiFunction({\n    name: 'notion_update_page',\n    description: `Update page.`,\n    inputSchema: notion.UpdatePageParamsSchema\n  })\n  async updatePage(\n    params: notion.UpdatePageParams\n  ): Promise<notion.UpdatePageResponse> {\n    return this.ky\n      .patch(`/pages/${params.page_id}`, {\n        json: pick(params, 'properties', 'archived')\n      })\n      .json<notion.UpdatePageResponse>()\n  }\n\n  /**\n   * Get page property.\n   */\n  @aiFunction({\n    name: 'notion_get_page_property',\n    description: `Get page property.`,\n    inputSchema: notion.GetPagePropertyParamsSchema\n  })\n  async getPageProperty(\n    params: notion.GetPagePropertyParams\n  ): Promise<notion.GetPagePropertyResponse> {\n    return this.ky\n      .get(`/pages/${params.page_id}/properties/${params.property_id}`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.GetPagePropertyResponse>()\n  }\n\n  /**\n   * Get block.\n   */\n  @aiFunction({\n    name: 'notion_get_block',\n    description: `Get block.`,\n    inputSchema: notion.GetBlockParamsSchema\n  })\n  async getBlock(\n    params: notion.GetBlockParams\n  ): Promise<notion.GetBlockResponse> {\n    return this.ky\n      .get(`/blocks/${params.block_id}`)\n      .json<notion.GetBlockResponse>()\n  }\n\n  /**\n   * Delete block.\n   */\n  @aiFunction({\n    name: 'notion_delete_block',\n    description: `Delete block.`,\n    inputSchema: notion.DeleteBlockParamsSchema\n  })\n  async deleteBlock(\n    params: notion.DeleteBlockParams\n  ): Promise<notion.DeleteBlockResponse> {\n    return this.ky\n      .delete(`/blocks/${params.block_id}`)\n      .json<notion.DeleteBlockResponse>()\n  }\n\n  /**\n   * Update block.\n   */\n  @aiFunction({\n    name: 'notion_update_block',\n    description: `Update block.`,\n    inputSchema: notion.UpdateBlockParamsSchema\n  })\n  async updateBlock(\n    params: notion.UpdateBlockParams\n  ): Promise<notion.UpdateBlockResponse> {\n    return this.ky\n      .patch(`/blocks/${params.block_id}`, {\n        json: pick(\n          params,\n          'paragraph',\n          'heading_1',\n          'heading_2',\n          'heading_3',\n          'bulleted_list_item',\n          'numbered_list_item',\n          'quote',\n          'to_do',\n          'toggle',\n          'code',\n          'embed',\n          'image',\n          'video',\n          'file',\n          'pdf',\n          'bookmark',\n          'equation',\n          'divider',\n          'table_of_contents',\n          'breadcrumb',\n          'column_list',\n          'column',\n          'link_to_page',\n          'table_row',\n          'archived'\n        )\n      })\n      .json<notion.UpdateBlockResponse>()\n  }\n\n  /**\n   * List block children.\n   */\n  @aiFunction({\n    name: 'notion_list_block_children',\n    description: `List block children.`,\n    inputSchema: notion.ListBlockChildrenParamsSchema\n  })\n  async listBlockChildren(\n    params: notion.ListBlockChildrenParams\n  ): Promise<notion.ListBlockChildrenResponse> {\n    return this.ky\n      .get(`/blocks/${params.block_id}/children`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListBlockChildrenResponse>()\n  }\n\n  /**\n   * Append block children.\n   */\n  @aiFunction({\n    name: 'notion_append_block_children',\n    description: `Append block children.`,\n    inputSchema: notion.AppendBlockChildrenParamsSchema\n  })\n  async appendBlockChildren(\n    params: notion.AppendBlockChildrenParams\n  ): Promise<notion.AppendBlockChildrenResponse> {\n    return this.ky\n      .patch(`/blocks/${params.block_id}/children`, {\n        json: pick(params, 'children')\n      })\n      .json<notion.AppendBlockChildrenResponse>()\n  }\n\n  /**\n   * Get database.\n   */\n  @aiFunction({\n    name: 'notion_get_database',\n    description: `Get database.`,\n    inputSchema: notion.GetDatabaseParamsSchema\n  })\n  async getDatabase(\n    params: notion.GetDatabaseParams\n  ): Promise<notion.GetDatabaseResponse> {\n    return this.ky\n      .get(`/databases/${params.database_id}`)\n      .json<notion.GetDatabaseResponse>()\n  }\n\n  /**\n   * Update database.\n   */\n  @aiFunction({\n    name: 'notion_update_database',\n    description: `Update database.`,\n    inputSchema: notion.UpdateDatabaseParamsSchema\n  })\n  async updateDatabase(\n    params: notion.UpdateDatabaseParams\n  ): Promise<notion.UpdateDatabaseResponse> {\n    return this.ky\n      .patch(`/databases/${params.database_id}`, {\n        json: pick(\n          params,\n          'title',\n          'description',\n          'icon',\n          'cover',\n          'properties',\n          'is_inline',\n          'archived'\n        )\n      })\n      .json<notion.UpdateDatabaseResponse>()\n  }\n\n  /**\n   * Query database.\n   */\n  @aiFunction({\n    name: 'notion_query_database',\n    description: `Query database.`,\n    inputSchema: notion.QueryDatabaseParamsSchema\n  })\n  async queryDatabase(\n    params: notion.QueryDatabaseParams\n  ): Promise<notion.QueryDatabaseResponse> {\n    return this.ky\n      .post(`/databases/${params.database_id}/query`, {\n        searchParams: sanitizeSearchParams(pick(params, 'filter_properties')),\n        json: pick(\n          params,\n          'sorts',\n          'filter',\n          'start_cursor',\n          'page_size',\n          'archived'\n        )\n      })\n      .json<notion.QueryDatabaseResponse>()\n  }\n\n  /**\n   * List databases.\n   */\n  @aiFunction({\n    name: 'notion_list_databases',\n    description: `List databases.`,\n    inputSchema: notion.ListDatabasesParamsSchema\n  })\n  async listDatabases(\n    params: notion.ListDatabasesParams\n  ): Promise<notion.ListDatabasesResponse> {\n    return this.ky\n      .get('/databases', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListDatabasesResponse>()\n  }\n\n  /**\n   * Create database.\n   */\n  @aiFunction({\n    name: 'notion_create_database',\n    description: `Create database.`,\n    inputSchema: notion.CreateDatabaseParamsSchema\n  })\n  async createDatabase(\n    params: notion.CreateDatabaseParams\n  ): Promise<notion.CreateDatabaseResponse> {\n    return this.ky\n      .post('/databases', {\n        json: pick(\n          params,\n          'parent',\n          'properties',\n          'icon',\n          'cover',\n          'title',\n          'description',\n          'is_inline'\n        )\n      })\n      .json<notion.CreateDatabaseResponse>()\n  }\n\n  /**\n   * Search.\n   */\n  @aiFunction({\n    name: 'notion_search',\n    description: `Search.`,\n    inputSchema: notion.SearchParamsSchema\n  })\n  async search(params: notion.SearchParams): Promise<notion.SearchResponse> {\n    return this.ky\n      .post('/search', {\n        json: pick(\n          params,\n          'query',\n          'sort',\n          'filter',\n          'start_cursor',\n          'page_size'\n        )\n      })\n      .json<notion.SearchResponse>()\n  }\n\n  /**\n   * List comments.\n   */\n  @aiFunction({\n    name: 'notion_list_comments',\n    description: `List comments.`,\n    inputSchema: notion.ListCommentsParamsSchema\n  })\n  async listComments(\n    params: notion.ListCommentsParams\n  ): Promise<notion.ListCommentsResponse> {\n    return this.ky\n      .get('/comments', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'block_id', 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListCommentsResponse>()\n  }\n\n  /**\n   * Create comment.\n   */\n  @aiFunction({\n    name: 'notion_create_comment',\n    description: `Create comment.`,\n    // TODO: Improve handling of union params\n    inputSchema: notion.CreateCommentParamsSchema as any\n  })\n  async createComment(\n    params: notion.CreateCommentParams\n  ): Promise<notion.CreateCommentResponse> {\n    return this.ky\n      .post('/comments', {\n        json: params\n      })\n      .json<notion.CreateCommentResponse>()\n  }\n\n  /**\n   * OAuth token.\n   */\n  @aiFunction({\n    name: 'notion_oauth_token',\n    description: `OAuth token.`,\n    inputSchema: notion.OauthTokenParamsSchema\n  })\n  async oauthToken(\n    params: notion.OauthTokenParams\n  ): Promise<notion.OauthTokenResponse> {\n    return this.ky\n      .post('/oauth/token', {\n        json: pick(\n          params,\n          'grant_type',\n          'code',\n          'redirect_uri',\n          'external_account'\n        )\n      })\n      .json<notion.OauthTokenResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/notion.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace notion {\n  export const apiBaseUrl = 'https://api.notion.so'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const UserObjectResponseSchema = z.object({\n    object: z.literal('user'),\n    id: z.string(),\n    type: z.enum(['person', 'bot']),\n    name: z.string(),\n    avatar_url: z.string()\n  })\n  export type UserObjectResponse = z.infer<typeof UserObjectResponseSchema>\n\n  export const AnnotationRequestSchema = z.object({\n    bold: z.boolean().optional(),\n    italic: z.boolean().optional(),\n    strikethrough: z.boolean().optional(),\n    underline: z.boolean().optional(),\n    code: z.boolean().optional(),\n    color: z\n      .enum([\n        'default',\n        'gray',\n        'brown',\n        'orange',\n        'yellow',\n        'green',\n        'blue',\n        'purple',\n        'pink',\n        'red',\n        'gray_background',\n        'brown_background',\n        'orange_background',\n        'yellow_background',\n        'green_background',\n        'blue_background',\n        'purple_background',\n        'pink_background',\n        'red_background'\n      ])\n      .optional()\n  })\n  export type AnnotationRequest = z.infer<typeof AnnotationRequestSchema>\n\n  export const DateRequestSchema = z.object({\n    start: z.string(),\n    end: z.union([z.string(), z.null()]).optional(),\n    time_zone: z.union([z.string(), z.null()]).optional()\n  })\n  export type DateRequest = z.infer<typeof DateRequestSchema>\n\n  export const PageObjectResponseSchema = z.object({\n    object: z.literal('page'),\n    id: z.string(),\n    created_time: z.string(),\n    last_edited_time: z.string(),\n    archived: z.boolean(),\n    url: z.string()\n  })\n  export type PageObjectResponse = z.infer<typeof PageObjectResponseSchema>\n\n  export const PartialPageObjectResponseSchema = z.object({\n    object: z.literal('page'),\n    id: z.string()\n  })\n  export type PartialPageObjectResponse = z.infer<\n    typeof PartialPageObjectResponseSchema\n  >\n\n  export const PropertyItemObjectResponseSchema = z.object({\n    type: z.string(),\n    id: z.string()\n  })\n  export type PropertyItemObjectResponse = z.infer<\n    typeof PropertyItemObjectResponseSchema\n  >\n\n  export const PartialBlockObjectResponseSchema = z.object({\n    object: z.literal('block'),\n    id: z.string()\n  })\n  export type PartialBlockObjectResponse = z.infer<\n    typeof PartialBlockObjectResponseSchema\n  >\n\n  export const BlockObjectResponseSchema = z.object({\n    object: z.literal('block'),\n    id: z.string(),\n    type: z.string(),\n    created_time: z.string(),\n    last_edited_time: z.string(),\n    has_children: z.boolean(),\n    archived: z.boolean()\n  })\n  export type BlockObjectResponse = z.infer<typeof BlockObjectResponseSchema>\n\n  export const TitlePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('title'),\n    title: z.record(z.any())\n  })\n  export type TitlePropertyResponse = z.infer<\n    typeof TitlePropertyResponseSchema\n  >\n\n  export const RichTextPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('rich_text'),\n    rich_text: z.record(z.any())\n  })\n  export type RichTextPropertyResponse = z.infer<\n    typeof RichTextPropertyResponseSchema\n  >\n\n  export const NumberPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('number'),\n    number: z.object({ format: z.string() })\n  })\n  export type NumberPropertyResponse = z.infer<\n    typeof NumberPropertyResponseSchema\n  >\n\n  export const SelectOptionSchema = z.object({\n    id: z.string(),\n    name: z.string(),\n    color: z.string()\n  })\n  export type SelectOption = z.infer<typeof SelectOptionSchema>\n\n  export const DatePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('date'),\n    date: z.record(z.any())\n  })\n  export type DatePropertyResponse = z.infer<typeof DatePropertyResponseSchema>\n\n  export const PeoplePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('people'),\n    people: z.record(z.any())\n  })\n  export type PeoplePropertyResponse = z.infer<\n    typeof PeoplePropertyResponseSchema\n  >\n\n  export const FilePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('files'),\n    files: z.record(z.any())\n  })\n  export type FilePropertyResponse = z.infer<typeof FilePropertyResponseSchema>\n\n  export const CheckboxPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('checkbox'),\n    checkbox: z.record(z.any())\n  })\n  export type CheckboxPropertyResponse = z.infer<\n    typeof CheckboxPropertyResponseSchema\n  >\n\n  export const UrlPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('url'),\n    url: z.record(z.any())\n  })\n  export type UrlPropertyResponse = z.infer<typeof UrlPropertyResponseSchema>\n\n  export const EmailPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('email'),\n    email: z.record(z.any())\n  })\n  export type EmailPropertyResponse = z.infer<\n    typeof EmailPropertyResponseSchema\n  >\n\n  export const PhoneNumberPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('phone_number'),\n    phone_number: z.record(z.any())\n  })\n  export type PhoneNumberPropertyResponse = z.infer<\n    typeof PhoneNumberPropertyResponseSchema\n  >\n\n  export const FormulaPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('formula'),\n    formula: z.object({ expression: z.string() })\n  })\n  export type FormulaPropertyResponse = z.infer<\n    typeof FormulaPropertyResponseSchema\n  >\n\n  export const RelationPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('relation'),\n    relation: z.object({\n      database_id: z.string(),\n      synced_property_name: z.string(),\n      synced_property_id: z.string()\n    })\n  })\n  export type RelationPropertyResponse = z.infer<\n    typeof RelationPropertyResponseSchema\n  >\n\n  export const RollupPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('rollup'),\n    rollup: z.object({\n      relation_property_name: z.string(),\n      relation_property_id: z.string(),\n      rollup_property_name: z.string(),\n      rollup_property_id: z.string(),\n      function: z.string()\n    })\n  })\n  export type RollupPropertyResponse = z.infer<\n    typeof RollupPropertyResponseSchema\n  >\n\n  export const CreatedTimePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('created_time'),\n    created_time: z.record(z.any())\n  })\n  export type CreatedTimePropertyResponse = z.infer<\n    typeof CreatedTimePropertyResponseSchema\n  >\n\n  export const CreatedByPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('created_by'),\n    created_by: z.record(z.any())\n  })\n  export type CreatedByPropertyResponse = z.infer<\n    typeof CreatedByPropertyResponseSchema\n  >\n\n  export const LastEditedTimePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('last_edited_time'),\n    last_edited_time: z.record(z.any())\n  })\n  export type LastEditedTimePropertyResponse = z.infer<\n    typeof LastEditedTimePropertyResponseSchema\n  >\n\n  export const LastEditedByPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('last_edited_by'),\n    last_edited_by: z.record(z.any())\n  })\n  export type LastEditedByPropertyResponse = z.infer<\n    typeof LastEditedByPropertyResponseSchema\n  >\n\n  export const PartialUserObjectResponseSchema = z.object({\n    object: z.literal('user'),\n    id: z.string()\n  })\n  export type PartialUserObjectResponse = z.infer<\n    typeof PartialUserObjectResponseSchema\n  >\n\n  export const AnnotationResponseSchema = z.object({\n    bold: z.boolean(),\n    italic: z.boolean(),\n    strikethrough: z.boolean(),\n    underline: z.boolean(),\n    code: z.boolean(),\n    color: z.enum([\n      'default',\n      'gray',\n      'brown',\n      'orange',\n      'yellow',\n      'green',\n      'blue',\n      'purple',\n      'pink',\n      'red',\n      'gray_background',\n      'brown_background',\n      'orange_background',\n      'yellow_background',\n      'green_background',\n      'blue_background',\n      'purple_background',\n      'pink_background',\n      'red_background'\n    ])\n  })\n  export type AnnotationResponse = z.infer<typeof AnnotationResponseSchema>\n\n  export const DateResponseSchema = z.object({\n    start: z.string(),\n    end: z.union([z.string(), z.null()]),\n    time_zone: z.union([z.string(), z.null()])\n  })\n  export type DateResponse = z.infer<typeof DateResponseSchema>\n\n  export const PropertyUpdateSchemaSchema = z.object({\n    name: z.string().optional(),\n    type: z.string().optional()\n  })\n  export type PropertyUpdateSchema = z.infer<typeof PropertyUpdateSchemaSchema>\n\n  export const TextPropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    does_not_equal: z.string().optional(),\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    starts_with: z.string().optional(),\n    ends_with: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type TextPropertyFilter = z.infer<typeof TextPropertyFilterSchema>\n\n  export const NumberPropertyFilterSchema = z.object({\n    equals: z.number().optional(),\n    does_not_equal: z.number().optional(),\n    greater_than: z.number().optional(),\n    less_than: z.number().optional(),\n    greater_than_or_equal_to: z.number().optional(),\n    less_than_or_equal_to: z.number().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type NumberPropertyFilter = z.infer<typeof NumberPropertyFilterSchema>\n\n  export const CheckboxPropertyFilterSchema = z.object({\n    equals: z.boolean().optional(),\n    does_not_equal: z.boolean().optional()\n  })\n  export type CheckboxPropertyFilter = z.infer<\n    typeof CheckboxPropertyFilterSchema\n  >\n\n  export const SelectPropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    does_not_equal: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type SelectPropertyFilter = z.infer<typeof SelectPropertyFilterSchema>\n\n  export const MultiSelectPropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type MultiSelectPropertyFilter = z.infer<\n    typeof MultiSelectPropertyFilterSchema\n  >\n\n  export const DatePropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    before: z.string().optional(),\n    after: z.string().optional(),\n    on_or_before: z.string().optional(),\n    on_or_after: z.string().optional(),\n    past_week: z.any().optional(),\n    past_month: z.any().optional(),\n    past_year: z.any().optional(),\n    next_week: z.any().optional(),\n    next_month: z.any().optional(),\n    next_year: z.any().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type DatePropertyFilter = z.infer<typeof DatePropertyFilterSchema>\n\n  export const PeoplePropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type PeoplePropertyFilter = z.infer<typeof PeoplePropertyFilterSchema>\n\n  export const FilesPropertyFilterSchema = z.object({\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type FilesPropertyFilter = z.infer<typeof FilesPropertyFilterSchema>\n\n  export const RelationPropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type RelationPropertyFilter = z.infer<\n    typeof RelationPropertyFilterSchema\n  >\n\n  export const PropertySchemaSchema = z.object({\n    type: z.string(),\n    name: z.union([z.string(), z.null()]).optional()\n  })\n  export type PropertySchema = z.infer<typeof PropertySchemaSchema>\n\n  export const SearchParametersSchema = z.object({\n    query: z.string().optional(),\n    sort: z\n      .object({\n        direction: z.enum(['ascending', 'descending']),\n        timestamp: z.literal('last_edited_time')\n      })\n      .optional(),\n    filter: z\n      .object({\n        value: z.enum(['page', 'database']),\n        property: z.literal('object')\n      })\n      .optional(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type SearchParameters = z.infer<typeof SearchParametersSchema>\n\n  export const PartialCommentObjectResponseSchema = z.object({\n    object: z.literal('comment'),\n    id: z.string()\n  })\n  export type PartialCommentObjectResponse = z.infer<\n    typeof PartialCommentObjectResponseSchema\n  >\n\n  export const OauthTokenParametersSchema = z.object({\n    grant_type: z.string(),\n    code: z.string(),\n    redirect_uri: z.string().optional(),\n    external_account: z.object({ key: z.string(), name: z.string() }).optional()\n  })\n  export type OauthTokenParameters = z.infer<typeof OauthTokenParametersSchema>\n\n  export const ListUsersResponseSchema = z.object({\n    results: z.array(UserObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListUsersResponse = z.infer<typeof ListUsersResponseSchema>\n\n  export const PropertyItemListResponseSchema = z.object({\n    results: z.array(PropertyItemObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type PropertyItemListResponse = z.infer<\n    typeof PropertyItemListResponseSchema\n  >\n\n  export const SelectPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('select'),\n    select: z.object({ options: z.array(SelectOptionSchema) })\n  })\n  export type SelectPropertyResponse = z.infer<\n    typeof SelectPropertyResponseSchema\n  >\n\n  export const MultiSelectPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('multi_select'),\n    multi_select: z.object({ options: z.array(SelectOptionSchema) })\n  })\n  export type MultiSelectPropertyResponse = z.infer<\n    typeof MultiSelectPropertyResponseSchema\n  >\n\n  export const TextRichTextItemResponseSchema = z.object({\n    type: z.literal('text'),\n    text: z.object({\n      content: z.string(),\n      link: z.union([z.object({ url: z.string() }), z.null()])\n    }),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type TextRichTextItemResponse = z.infer<\n    typeof TextRichTextItemResponseSchema\n  >\n\n  export const EquationRichTextItemResponseSchema = z.object({\n    type: z.literal('equation'),\n    equation: z.object({ expression: z.string() }),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type EquationRichTextItemResponse = z.infer<\n    typeof EquationRichTextItemResponseSchema\n  >\n\n  export const ListBlockChildrenResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PartialBlockObjectResponseSchema, BlockObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListBlockChildrenResponse = z.infer<\n    typeof ListBlockChildrenResponseSchema\n  >\n\n  export const AppendBlockChildrenResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PartialBlockObjectResponseSchema, BlockObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type AppendBlockChildrenResponse = z.infer<\n    typeof AppendBlockChildrenResponseSchema\n  >\n\n  export const QueryDatabaseResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PageObjectResponseSchema, PartialPageObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type QueryDatabaseResponse = z.infer<\n    typeof QueryDatabaseResponseSchema\n  >\n\n  export const OauthTokenResponseSchema = z.object({\n    access_token: z.string(),\n    token_type: z.literal('bearer'),\n    bot_id: z.string(),\n    workspace_name: z.union([z.string(), z.null()]),\n    workspace_icon: z.union([z.string(), z.null()]),\n    workspace_id: z.string(),\n    owner: z.union([\n      z.object({\n        type: z.literal('user'),\n        user: z.union([\n          UserObjectResponseSchema,\n          PartialUserObjectResponseSchema\n        ])\n      }),\n      z.object({ type: z.literal('workspace'), workspace: z.literal(true) })\n    ]),\n    duplicated_template_id: z.union([z.string(), z.null()])\n  })\n  export type OauthTokenResponse = z.infer<typeof OauthTokenResponseSchema>\n\n  export const RichTextItemRequestSchema = z.union([\n    z.object({\n      text: z.object({\n        content: z.string(),\n        link: z.union([z.object({ url: z.string() }), z.null()]).optional()\n      }),\n      type: z.literal('text').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    }),\n    z.object({\n      mention: z.union([\n        z.object({\n          user: z.union([\n            z.object({ id: z.string() }),\n            UserObjectResponseSchema\n          ])\n        }),\n        z.object({ page: z.object({ id: z.string() }) }),\n        z.object({ database: z.object({ id: z.string() }) }),\n        z.object({ date: DateRequestSchema })\n      ]),\n      type: z.literal('mention').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    }),\n    z.object({\n      equation: z.object({ expression: z.string() }),\n      type: z.literal('equation').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    })\n  ])\n  export type RichTextItemRequest = z.infer<typeof RichTextItemRequestSchema>\n\n  export const CreatePageParametersSchema = z.object({\n    parent: z\n      .record(z.any())\n      .and(\n        z.union([\n          z.object({ type: z.literal('page_id'), page_id: z.string() }),\n          z.object({ type: z.literal('database_id'), database_id: z.string() })\n        ])\n      ),\n    properties: z.record(\n      z.union([\n        z.object({ title: z.array(RichTextItemRequestSchema) }),\n        z.object({ rich_text: z.array(RichTextItemRequestSchema) }),\n        z.object({ number: z.union([z.number(), z.null()]) }),\n        z.object({\n          select: z.union([z.object({ name: z.string() }), z.null()])\n        })\n      ])\n    )\n  })\n  export type CreatePageParameters = z.infer<typeof CreatePageParametersSchema>\n\n  export const UpdatePageParametersSchema = z.object({\n    properties: z\n      .record(\n        z.union([\n          z.object({ title: z.array(RichTextItemRequestSchema) }),\n          z.object({ rich_text: z.array(RichTextItemRequestSchema) }),\n          z.object({ number: z.union([z.number(), z.null()]) }),\n          z.object({\n            select: z.union([z.object({ name: z.string() }), z.null()])\n          })\n        ])\n      )\n      .optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdatePageParameters = z.infer<typeof UpdatePageParametersSchema>\n\n  export const UpdateBlockParametersSchema = z.object({\n    paragraph: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_1: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_2: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_3: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    bulleted_list_item: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    numbered_list_item: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    quote: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    to_do: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        checked: z.boolean().optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    toggle: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    code: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        language: z.string().optional()\n      })\n      .optional(),\n    embed: z.object({ url: z.string().optional() }).optional(),\n    image: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    video: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    file: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    pdf: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    bookmark: z.object({ url: z.string().optional() }).optional(),\n    equation: z.object({ expression: z.string().optional() }).optional(),\n    divider: z.record(z.any()).optional(),\n    table_of_contents: z.object({ color: z.string().optional() }).optional(),\n    breadcrumb: z.record(z.any()).optional(),\n    column_list: z.record(z.any()).optional(),\n    column: z.record(z.any()).optional(),\n    link_to_page: z\n      .object({\n        type: z.enum(['page_id', 'database_id']).optional(),\n        page_id: z.string().optional(),\n        database_id: z.string().optional()\n      })\n      .optional(),\n    table_row: z\n      .object({ cells: z.array(z.array(RichTextItemRequestSchema)).optional() })\n      .optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdateBlockParameters = z.infer<\n    typeof UpdateBlockParametersSchema\n  >\n\n  export const BlockObjectRequestSchema = z.union([\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('paragraph'),\n      paragraph: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_1'),\n      heading_1: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_2'),\n      heading_2: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_3'),\n      heading_3: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('bulleted_list_item'),\n      bulleted_list_item: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('numbered_list_item'),\n      numbered_list_item: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('to_do'),\n      to_do: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        checked: z.boolean(),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('toggle'),\n      toggle: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('code'),\n      code: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        language: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('child_page'),\n      child_page: z.object({ title: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('child_database'),\n      child_database: z.object({ title: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('embed'),\n      embed: z.object({\n        url: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('image'),\n      image: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('video'),\n      video: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('file'),\n      file: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('pdf'),\n      pdf: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('bookmark'),\n      bookmark: z.object({\n        url: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('equation'),\n      equation: z.object({ expression: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('divider'),\n      divider: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table_of_contents'),\n      table_of_contents: z.object({ color: z.string().optional() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('column_list'),\n      column_list: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('column'),\n      column: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('link_to_page'),\n      link_to_page: z.union([\n        z.object({ type: z.literal('page_id'), page_id: z.string() }),\n        z.object({ type: z.literal('database_id'), database_id: z.string() })\n      ])\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table'),\n      table: z.object({\n        table_width: z.number().int(),\n        has_column_header: z.boolean().optional(),\n        has_row_header: z.boolean().optional(),\n        children: z.array(\n          // TODO: Support recursive types for `BlockObjectRequestSchema`.\n          z.any()\n        )\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table_row'),\n      table_row: z.object({\n        cells: z.array(z.array(RichTextItemRequestSchema))\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('synced_block'),\n      synced_block: z.object({\n        synced_from: z\n          .union([\n            z.object({ type: z.literal('block_id'), block_id: z.string() }),\n            z.null()\n          ])\n          .optional(),\n        children: z\n          .array(\n            // TODO: Support recursive types for `BlockObjectRequestSchema`.\n            z.any()\n          )\n          .optional()\n      })\n    })\n  ])\n  export type BlockObjectRequest = z.infer<typeof BlockObjectRequestSchema>\n\n  export const MentionRichTextItemResponseSchema = z.object({\n    type: z.literal('mention'),\n    mention: z.union([\n      z.object({\n        type: z.literal('user'),\n        user: z.union([\n          PartialUserObjectResponseSchema,\n          UserObjectResponseSchema\n        ])\n      }),\n      z.object({ type: z.literal('date'), date: DateResponseSchema }),\n      z.object({\n        type: z.literal('link_preview'),\n        link_preview: z.object({ url: z.string() })\n      }),\n      z.object({ type: z.literal('page'), page: z.object({ id: z.string() }) }),\n      z.object({\n        type: z.literal('database'),\n        database: z.object({ id: z.string() })\n      })\n    ]),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type MentionRichTextItemResponse = z.infer<\n    typeof MentionRichTextItemResponseSchema\n  >\n\n  export const CreateCommentParametersSchema = z.union([\n    z.object({\n      parent: z.object({\n        page_id: z.string(),\n        type: z.literal('page_id').optional()\n      }),\n      rich_text: z.array(RichTextItemRequestSchema)\n    }),\n    z.object({\n      discussion_id: z.string(),\n      rich_text: z.array(RichTextItemRequestSchema)\n    })\n  ])\n  export type CreateCommentParameters = z.infer<\n    typeof CreateCommentParametersSchema\n  >\n\n  export const AppendBlockChildrenParametersSchema = z.object({\n    children: z.array(BlockObjectRequestSchema)\n  })\n  export type AppendBlockChildrenParameters = z.infer<\n    typeof AppendBlockChildrenParametersSchema\n  >\n\n  export const UpdateDatabaseParametersSchema = z.object({\n    title: z.array(RichTextItemRequestSchema).optional(),\n    description: z.array(RichTextItemRequestSchema).optional(),\n    icon: z\n      .union([\n        z.object({ emoji: z.string(), type: z.literal('emoji') }),\n        z.object({\n          external: z.object({ url: z.string() }),\n          type: z.literal('external')\n        }),\n        z.null()\n      ])\n      .optional(),\n    cover: z\n      .union([\n        z.object({\n          external: z.object({ url: z.string() }),\n          type: z.literal('external')\n        }),\n        z.null()\n      ])\n      .optional(),\n    properties: z.record(PropertyUpdateSchemaSchema).optional(),\n    is_inline: z.boolean().optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdateDatabaseParameters = z.infer<\n    typeof UpdateDatabaseParametersSchema\n  >\n\n  export const CreateDatabaseParametersSchema = z.object({\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('database_id'), database_id: z.string() })\n    ]),\n    properties: z.record(PropertySchemaSchema),\n    icon: z\n      .union([\n        z.object({ type: z.literal('emoji'), emoji: z.string() }),\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    cover: z\n      .union([\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    title: z.array(RichTextItemRequestSchema),\n    description: z.array(RichTextItemRequestSchema).optional(),\n    is_inline: z.boolean().optional()\n  })\n  export type CreateDatabaseParameters = z.infer<\n    typeof CreateDatabaseParametersSchema\n  >\n\n  export const RichTextItemResponseSchema = z.union([\n    TextRichTextItemResponseSchema,\n    MentionRichTextItemResponseSchema,\n    EquationRichTextItemResponseSchema\n  ])\n  export type RichTextItemResponse = z.infer<typeof RichTextItemResponseSchema>\n\n  export const CommentObjectResponseSchema = z.object({\n    object: z.literal('comment'),\n    id: z.string(),\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('block_id'), block_id: z.string() })\n    ]),\n    discussion_id: z.string(),\n    rich_text: z.array(RichTextItemResponseSchema),\n    created_by: PartialUserObjectResponseSchema,\n    created_time: z.string(),\n    last_edited_time: z.string()\n  })\n  export type CommentObjectResponse = z.infer<\n    typeof CommentObjectResponseSchema\n  >\n\n  export const PropertyFilterSchema = z.union([\n    z.object({ property: z.string(), title: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), rich_text: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), number: NumberPropertyFilterSchema }),\n    z.object({ property: z.string(), checkbox: CheckboxPropertyFilterSchema }),\n    z.object({ property: z.string(), select: SelectPropertyFilterSchema }),\n    z.object({\n      property: z.string(),\n      multi_select: MultiSelectPropertyFilterSchema\n    }),\n    z.object({ property: z.string(), date: DatePropertyFilterSchema }),\n    z.object({ property: z.string(), people: PeoplePropertyFilterSchema }),\n    z.object({ property: z.string(), files: FilesPropertyFilterSchema }),\n    z.object({ property: z.string(), url: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), email: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), phone_number: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), relation: RelationPropertyFilterSchema }),\n    z.object({ property: z.string(), created_by: PeoplePropertyFilterSchema }),\n    z.object({ property: z.string(), created_time: DatePropertyFilterSchema }),\n    z.object({\n      property: z.string(),\n      last_edited_by: PeoplePropertyFilterSchema\n    }),\n    z.object({\n      property: z.string(),\n      last_edited_time: DatePropertyFilterSchema\n    }),\n    z.object({\n      timestamp: z.enum(['created_time', 'last_edited_time']),\n      created_time: DatePropertyFilterSchema\n    }),\n    z.object({\n      timestamp: z.enum(['created_time', 'last_edited_time']),\n      last_edited_time: DatePropertyFilterSchema\n    })\n  ])\n  export type PropertyFilter = z.infer<typeof PropertyFilterSchema>\n\n  export const ListCommentsResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(CommentObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListCommentsResponse = z.infer<typeof ListCommentsResponseSchema>\n\n  export const CompoundFilterSchema = z.object({\n    and: z.array(PropertyFilterSchema).optional(),\n    or: z.array(PropertyFilterSchema).optional()\n  })\n  export type CompoundFilter = z.infer<typeof CompoundFilterSchema>\n\n  export const QueryDatabaseParametersSchema = z.object({\n    sorts: z\n      .array(\n        z.union([\n          z.object({\n            property: z.string(),\n            direction: z.enum(['ascending', 'descending'])\n          }),\n          z.object({\n            timestamp: z.enum(['created_time', 'last_edited_time']),\n            direction: z.enum(['ascending', 'descending'])\n          })\n        ])\n      )\n      .optional(),\n    filter: z.union([PropertyFilterSchema, CompoundFilterSchema]).optional(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional(),\n    archived: z.boolean().optional()\n  })\n  export type QueryDatabaseParameters = z.infer<\n    typeof QueryDatabaseParametersSchema\n  >\n\n  export const DatabasePropertyConfigResponseSchema = z.union([\n    TitlePropertyResponseSchema,\n    RichTextPropertyResponseSchema,\n    NumberPropertyResponseSchema,\n    SelectPropertyResponseSchema,\n    MultiSelectPropertyResponseSchema,\n    DatePropertyResponseSchema,\n    PeoplePropertyResponseSchema,\n    FilePropertyResponseSchema,\n    CheckboxPropertyResponseSchema,\n    UrlPropertyResponseSchema,\n    EmailPropertyResponseSchema,\n    PhoneNumberPropertyResponseSchema,\n    FormulaPropertyResponseSchema,\n    RelationPropertyResponseSchema,\n    RollupPropertyResponseSchema,\n    CreatedTimePropertyResponseSchema,\n    CreatedByPropertyResponseSchema,\n    LastEditedTimePropertyResponseSchema,\n    LastEditedByPropertyResponseSchema\n  ])\n  export type DatabasePropertyConfigResponse = z.infer<\n    typeof DatabasePropertyConfigResponseSchema\n  >\n\n  export const PartialDatabaseObjectResponseSchema = z.object({\n    object: z.literal('database'),\n    id: z.string(),\n    properties: z.record(DatabasePropertyConfigResponseSchema)\n  })\n  export type PartialDatabaseObjectResponse = z.infer<\n    typeof PartialDatabaseObjectResponseSchema\n  >\n\n  export const DatabaseObjectResponseSchema = z.object({\n    object: z.literal('database'),\n    id: z.string(),\n    cover: z\n      .union([\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    icon: z\n      .union([\n        z.object({ type: z.literal('emoji'), emoji: z.string() }),\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    created_time: z.string(),\n    created_by: PartialUserObjectResponseSchema,\n    last_edited_time: z.string(),\n    last_edited_by: PartialUserObjectResponseSchema,\n    title: z.array(RichTextItemResponseSchema),\n    description: z.array(RichTextItemResponseSchema),\n    is_inline: z.boolean(),\n    properties: z.record(DatabasePropertyConfigResponseSchema),\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('workspace'), workspace: z.literal(true) })\n    ]),\n    url: z.string(),\n    archived: z.boolean()\n  })\n  export type DatabaseObjectResponse = z.infer<\n    typeof DatabaseObjectResponseSchema\n  >\n\n  export const ListDatabasesResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([\n        PartialDatabaseObjectResponseSchema,\n        DatabaseObjectResponseSchema\n      ])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListDatabasesResponse = z.infer<\n    typeof ListDatabasesResponseSchema\n  >\n\n  export const SearchResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([\n        PageObjectResponseSchema,\n        PartialPageObjectResponseSchema,\n        PartialDatabaseObjectResponseSchema,\n        DatabaseObjectResponseSchema\n      ])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type SearchResponse = z.infer<typeof SearchResponseSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetSelfParamsSchema = z.object({})\n  export type GetSelfParams = z.infer<typeof GetSelfParamsSchema>\n\n  export const GetSelfResponseSchema = UserObjectResponseSchema\n  export type GetSelfResponse = z.infer<typeof GetSelfResponseSchema>\n\n  export const GetUserParamsSchema = z.object({ user_id: z.string() })\n  export type GetUserParams = z.infer<typeof GetUserParamsSchema>\n\n  export const GetUserResponseSchema = UserObjectResponseSchema\n  export type GetUserResponse = z.infer<typeof GetUserResponseSchema>\n\n  export const ListUsersParamsSchema = z.object({\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListUsersParams = z.infer<typeof ListUsersParamsSchema>\n\n  export const CreatePageParamsSchema = CreatePageParametersSchema\n  export type CreatePageParams = z.infer<typeof CreatePageParamsSchema>\n\n  export const CreatePageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type CreatePageResponse = z.infer<typeof CreatePageResponseSchema>\n\n  export const GetPageParamsSchema = z.object({\n    page_id: z.string(),\n    filter_properties: z.array(z.string()).optional()\n  })\n  export type GetPageParams = z.infer<typeof GetPageParamsSchema>\n\n  export const GetPageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type GetPageResponse = z.infer<typeof GetPageResponseSchema>\n\n  export const UpdatePageParamsSchema = z\n    .object({ page_id: z.string() })\n    .merge(UpdatePageParametersSchema)\n  export type UpdatePageParams = z.infer<typeof UpdatePageParamsSchema>\n\n  export const UpdatePageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type UpdatePageResponse = z.infer<typeof UpdatePageResponseSchema>\n\n  export const GetPagePropertyParamsSchema = z.object({\n    page_id: z.string(),\n    property_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type GetPagePropertyParams = z.infer<\n    typeof GetPagePropertyParamsSchema\n  >\n\n  export const GetPagePropertyResponseSchema = z.union([\n    PropertyItemObjectResponseSchema,\n    PropertyItemListResponseSchema\n  ])\n  export type GetPagePropertyResponse = z.infer<\n    typeof GetPagePropertyResponseSchema\n  >\n\n  export const GetBlockParamsSchema = z.object({ block_id: z.string() })\n  export type GetBlockParams = z.infer<typeof GetBlockParamsSchema>\n\n  export const GetBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type GetBlockResponse = z.infer<typeof GetBlockResponseSchema>\n\n  export const DeleteBlockParamsSchema = z.object({ block_id: z.string() })\n  export type DeleteBlockParams = z.infer<typeof DeleteBlockParamsSchema>\n\n  export const DeleteBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type DeleteBlockResponse = z.infer<typeof DeleteBlockResponseSchema>\n\n  export const UpdateBlockParamsSchema = z\n    .object({ block_id: z.string() })\n    .merge(UpdateBlockParametersSchema)\n  export type UpdateBlockParams = z.infer<typeof UpdateBlockParamsSchema>\n\n  export const UpdateBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type UpdateBlockResponse = z.infer<typeof UpdateBlockResponseSchema>\n\n  export const ListBlockChildrenParamsSchema = z.object({\n    block_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListBlockChildrenParams = z.infer<\n    typeof ListBlockChildrenParamsSchema\n  >\n\n  export const AppendBlockChildrenParamsSchema = z\n    .object({ block_id: z.string() })\n    .merge(AppendBlockChildrenParametersSchema)\n  export type AppendBlockChildrenParams = z.infer<\n    typeof AppendBlockChildrenParamsSchema\n  >\n\n  export const GetDatabaseParamsSchema = z.object({ database_id: z.string() })\n  export type GetDatabaseParams = z.infer<typeof GetDatabaseParamsSchema>\n\n  export const GetDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type GetDatabaseResponse = z.infer<typeof GetDatabaseResponseSchema>\n\n  export const UpdateDatabaseParamsSchema = z\n    .object({ database_id: z.string() })\n    .merge(UpdateDatabaseParametersSchema)\n  export type UpdateDatabaseParams = z.infer<typeof UpdateDatabaseParamsSchema>\n\n  export const UpdateDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type UpdateDatabaseResponse = z.infer<\n    typeof UpdateDatabaseResponseSchema\n  >\n\n  export const QueryDatabaseParamsSchema = z\n    .object({\n      database_id: z.string(),\n      filter_properties: z.array(z.string()).optional()\n    })\n    .merge(QueryDatabaseParametersSchema)\n  export type QueryDatabaseParams = z.infer<typeof QueryDatabaseParamsSchema>\n\n  export const ListDatabasesParamsSchema = z.object({\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListDatabasesParams = z.infer<typeof ListDatabasesParamsSchema>\n\n  export const CreateDatabaseParamsSchema = CreateDatabaseParametersSchema\n  export type CreateDatabaseParams = z.infer<typeof CreateDatabaseParamsSchema>\n\n  export const CreateDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type CreateDatabaseResponse = z.infer<\n    typeof CreateDatabaseResponseSchema\n  >\n\n  export const SearchParamsSchema = SearchParametersSchema\n  export type SearchParams = z.infer<typeof SearchParamsSchema>\n\n  export const ListCommentsParamsSchema = z.object({\n    block_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListCommentsParams = z.infer<typeof ListCommentsParamsSchema>\n\n  export const CreateCommentParamsSchema = CreateCommentParametersSchema\n  export type CreateCommentParams = z.infer<typeof CreateCommentParamsSchema>\n\n  export const CreateCommentResponseSchema = z.union([\n    CommentObjectResponseSchema,\n    PartialCommentObjectResponseSchema\n  ])\n  export type CreateCommentResponse = z.infer<\n    typeof CreateCommentResponseSchema\n  >\n\n  export const OauthTokenParamsSchema = OauthTokenParametersSchema\n  export type OauthTokenParams = z.infer<typeof OauthTokenParamsSchema>\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/open-meteo-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  AIFunctionsProvider,\n  aiFunction,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { openmeteo } from './open-meteo'\n\n/**\n * Agentic OpenMeteo client.\n *\n * Open-Meteo offers free weather forecast APIs for open-source developers and non-commercial use. No API key is required.\n */\nexport class OpenMeteoClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n   * 7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.\n   */\n  @aiFunction({\n    name: 'open_meteo_get_v1_forecast',\n    description: `7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.`,\n    inputSchema: openmeteo.GetV1ForecastParamsSchema,\n    tags: ['Weather Forecast APIs']\n  })\n  async getV1Forecast(\n    params: openmeteo.GetV1ForecastParams\n  ): Promise<openmeteo.GetV1ForecastResponse> {\n    return this.ky\n      .get('/v1/forecast', {\n        searchParams: sanitizeSearchParams(\n          pick(\n            params,\n            'hourly',\n            'daily',\n            'latitude',\n            'longitude',\n            'current_weather',\n            'temperature_unit',\n            'wind_speed_unit',\n            'timeformat',\n            'timezone',\n            'past_days'\n          )\n        )\n      })\n      .json<openmeteo.GetV1ForecastResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/open-meteo.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace openmeteo {\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  /** For each selected weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps. */\n  export const HourlyResponseSchema = z\n    .object({\n      time: z.array(z.string()),\n      temperature_2m: z.array(z.number()).optional(),\n      relative_humidity_2m: z.array(z.number()).optional(),\n      dew_point_2m: z.array(z.number()).optional(),\n      apparent_temperature: z.array(z.number()).optional(),\n      pressure_msl: z.array(z.number()).optional(),\n      cloud_cover: z.array(z.number()).optional(),\n      cloud_cover_low: z.array(z.number()).optional(),\n      cloud_cover_mid: z.array(z.number()).optional(),\n      cloud_cover_high: z.array(z.number()).optional(),\n      wind_speed_10m: z.array(z.number()).optional(),\n      wind_speed_80m: z.array(z.number()).optional(),\n      wind_speed_120m: z.array(z.number()).optional(),\n      wind_speed_180m: z.array(z.number()).optional(),\n      wind_direction_10m: z.array(z.number()).optional(),\n      wind_direction_80m: z.array(z.number()).optional(),\n      wind_direction_120m: z.array(z.number()).optional(),\n      wind_direction_180m: z.array(z.number()).optional(),\n      wind_gusts_10m: z.array(z.number()).optional(),\n      shortwave_radiation: z.array(z.number()).optional(),\n      direct_radiation: z.array(z.number()).optional(),\n      direct_normal_irradiance: z.array(z.number()).optional(),\n      diffuse_radiation: z.array(z.number()).optional(),\n      vapour_pressure_deficit: z.array(z.number()).optional(),\n      evapotranspiration: z.array(z.number()).optional(),\n      precipitation: z.array(z.number()).optional(),\n      weather_code: z.array(z.number()).optional(),\n      snow_height: z.array(z.number()).optional(),\n      freezing_level_height: z.array(z.number()).optional(),\n      soil_temperature_0cm: z.array(z.number()).optional(),\n      soil_temperature_6cm: z.array(z.number()).optional(),\n      soil_temperature_18cm: z.array(z.number()).optional(),\n      soil_temperature_54cm: z.array(z.number()).optional(),\n      soil_moisture_0_1cm: z.array(z.number()).optional(),\n      soil_moisture_1_3cm: z.array(z.number()).optional(),\n      soil_moisture_3_9cm: z.array(z.number()).optional(),\n      soil_moisture_9_27cm: z.array(z.number()).optional(),\n      soil_moisture_27_81cm: z.array(z.number()).optional()\n    })\n    .describe(\n      'For each selected weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.'\n    )\n  export type HourlyResponse = z.infer<typeof HourlyResponseSchema>\n\n  /** For each selected daily weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps. */\n  export const DailyResponseSchema = z\n    .object({\n      time: z.array(z.string()),\n      temperature_2m_max: z.array(z.number()).optional(),\n      temperature_2m_min: z.array(z.number()).optional(),\n      apparent_temperature_max: z.array(z.number()).optional(),\n      apparent_temperature_min: z.array(z.number()).optional(),\n      precipitation_sum: z.array(z.number()).optional(),\n      precipitation_hours: z.array(z.number()).optional(),\n      weather_code: z.array(z.number()).optional(),\n      sunrise: z.array(z.number()).optional(),\n      sunset: z.array(z.number()).optional(),\n      wind_speed_10m_max: z.array(z.number()).optional(),\n      wind_gusts_10m_max: z.array(z.number()).optional(),\n      wind_direction_10m_dominant: z.array(z.number()).optional(),\n      shortwave_radiation_sum: z.array(z.number()).optional(),\n      uv_index_max: z.array(z.number()).optional(),\n      uv_index_clear_sky_max: z.array(z.number()).optional(),\n      et0_fao_evapotranspiration: z.array(z.number()).optional()\n    })\n    .describe(\n      'For each selected daily weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.'\n    )\n  export type DailyResponse = z.infer<typeof DailyResponseSchema>\n\n  /** Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code */\n  export const CurrentWeatherSchema = z\n    .object({\n      time: z.string(),\n      temperature: z.number(),\n      wind_speed: z.number(),\n      wind_direction: z.number(),\n      weather_code: z.number().int()\n    })\n    .describe(\n      'Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code'\n    )\n  export type CurrentWeather = z.infer<typeof CurrentWeatherSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetV1ForecastParamsSchema = z.object({\n    hourly: z\n      .array(\n        z.enum([\n          'temperature_2m',\n          'relative_humidity_2m',\n          'dew_point_2m',\n          'apparent_temperature',\n          'pressure_msl',\n          'cloud_cover',\n          'cloud_cover_low',\n          'cloud_cover_mid',\n          'cloud_cover_high',\n          'wind_speed_10m',\n          'wind_speed_80m',\n          'wind_speed_120m',\n          'wind_speed_180m',\n          'wind_direction_10m',\n          'wind_direction_80m',\n          'wind_direction_120m',\n          'wind_direction_180m',\n          'wind_gusts_10m',\n          'shortwave_radiation',\n          'direct_radiation',\n          'direct_normal_irradiance',\n          'diffuse_radiation',\n          'vapour_pressure_deficit',\n          'evapotranspiration',\n          'precipitation',\n          'weather_code',\n          'snow_height',\n          'freezing_level_height',\n          'soil_temperature_0cm',\n          'soil_temperature_6cm',\n          'soil_temperature_18cm',\n          'soil_temperature_54cm',\n          'soil_moisture_0_1cm',\n          'soil_moisture_1_3cm',\n          'soil_moisture_3_9cm',\n          'soil_moisture_9_27cm',\n          'soil_moisture_27_81cm'\n        ])\n      )\n      .optional(),\n    daily: z\n      .array(\n        z.enum([\n          'temperature_2m_max',\n          'temperature_2m_min',\n          'apparent_temperature_max',\n          'apparent_temperature_min',\n          'precipitation_sum',\n          'precipitation_hours',\n          'weather_code',\n          'sunrise',\n          'sunset',\n          'wind_speed_10m_max',\n          'wind_gusts_10m_max',\n          'wind_direction_10m_dominant',\n          'shortwave_radiation_sum',\n          'uv_index_max',\n          'uv_index_clear_sky_max',\n          'et0_fao_evapotranspiration'\n        ])\n      )\n      .optional(),\n    /** WGS84 coordinate */\n    latitude: z.number().describe('WGS84 coordinate'),\n    /** WGS84 coordinate */\n    longitude: z.number().describe('WGS84 coordinate'),\n    current_weather: z.boolean().optional(),\n    temperature_unit: z.enum(['celsius', 'fahrenheit']).default('celsius'),\n    wind_speed_unit: z.enum(['kmh', 'ms', 'mph', 'kn']).default('kmh'),\n    /** If format `unixtime` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply `utc_offset_seconds` again to get the correct date. */\n    timeformat: z\n      .enum(['iso8601', 'unixtime'])\n      .describe(\n        'If format `unixtime` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply `utc_offset_seconds` again to get the correct date.'\n      )\n      .default('iso8601'),\n    /** If `timezone` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported. */\n    timezone: z\n      .string()\n      .describe(\n        'If `timezone` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported.'\n      )\n      .optional(),\n    /** If `past_days` is set, yesterdays or the day before yesterdays data are also returned. */\n    past_days: z\n      .union([z.literal(1), z.literal(2)])\n      .describe(\n        'If `past_days` is set, yesterdays or the day before yesterdays data are also returned.'\n      )\n      .optional()\n  })\n  export type GetV1ForecastParams = z.infer<typeof GetV1ForecastParamsSchema>\n\n  export const GetV1ForecastResponseSchema = z.object({\n    /** WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. */\n    latitude: z\n      .number()\n      .describe(\n        'WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.'\n      )\n      .optional(),\n    /** WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away. */\n    longitude: z\n      .number()\n      .describe(\n        'WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.'\n      )\n      .optional(),\n    /** The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect. */\n    elevation: z\n      .number()\n      .describe(\n        'The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.'\n      )\n      .optional(),\n    /** Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements. */\n    generationtime_ms: z\n      .number()\n      .describe(\n        'Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.'\n      )\n      .optional(),\n    /** Applied timezone offset from the &timezone= parameter. */\n    utc_offset_seconds: z\n      .number()\n      .int()\n      .describe('Applied timezone offset from the &timezone= parameter.')\n      .optional(),\n    hourly: HourlyResponseSchema.optional(),\n    /** For each selected weather variable, the unit will be listed here. */\n    hourly_units: z\n      .record(z.string())\n      .describe(\n        'For each selected weather variable, the unit will be listed here.'\n      )\n      .optional(),\n    daily: DailyResponseSchema.optional(),\n    /** For each selected daily weather variable, the unit will be listed here. */\n    daily_units: z\n      .record(z.string())\n      .describe(\n        'For each selected daily weather variable, the unit will be listed here.'\n      )\n      .optional(),\n    current_weather: CurrentWeatherSchema.optional()\n  })\n  export type GetV1ForecastResponse = z.infer<\n    typeof GetV1ForecastResponseSchema\n  >\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/pet-store-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { petstore } from './pet-store'\n\n/**\n * Agentic PetStore client.\n */\nexport class PetStoreClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = petstore.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n   * List all pets.\n   */\n  @aiFunction({\n    name: 'pet_store_list_pets',\n    description: `List all pets.`,\n    inputSchema: petstore.ListPetsParamsSchema,\n    tags: ['pets']\n  })\n  async listPets(\n    params: petstore.ListPetsParams\n  ): Promise<petstore.ListPetsResponse> {\n    return this.ky\n      .get('/pets', {\n        searchParams: sanitizeSearchParams(params)\n      })\n      .json<petstore.ListPetsResponse>()\n  }\n\n  /**\n   * Create a pet.\n   */\n  @aiFunction({\n    name: 'pet_store_create_pets',\n    description: `Create a pet.`,\n    inputSchema: petstore.CreatePetsParamsSchema,\n    tags: ['pets']\n  })\n  async createPets(\n    params: petstore.CreatePetsParams\n  ): Promise<petstore.CreatePetsResponse> {\n    return this.ky\n      .post('/pets', {\n        json: pick(params, 'id', 'name', 'tag')\n      })\n      .json<petstore.CreatePetsResponse>()\n  }\n\n  /**\n   * Info for a specific pet.\n   */\n  @aiFunction({\n    name: 'pet_store_show_pet_by_id',\n    description: `Info for a specific pet.`,\n    inputSchema: petstore.ShowPetByIdParamsSchema,\n    tags: ['pets']\n  })\n  async showPetById(\n    params: petstore.ShowPetByIdParams\n  ): Promise<petstore.ShowPetByIdResponse> {\n    return this.ky\n      .get(`/pets/${params.petId}`)\n      .json<petstore.ShowPetByIdResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/pet-store.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace petstore {\n  export const apiBaseUrl = 'http://petstore.swagger.io/v1'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const PetSchema = z.object({\n    id: z.number().int(),\n    name: z.string(),\n    tag: z.string().optional()\n  })\n  export type Pet = z.infer<typeof PetSchema>\n\n  export const PetsSchema = z.array(PetSchema).max(100)\n  export type Pets = z.infer<typeof PetsSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const ListPetsParamsSchema = z.object({\n    /** How many items to return at one time (max 100) */\n    limit: z\n      .number()\n      .int()\n      .lte(100)\n      .describe('How many items to return at one time (max 100)')\n      .optional()\n  })\n  export type ListPetsParams = z.infer<typeof ListPetsParamsSchema>\n\n  export const ListPetsResponseSchema = PetsSchema\n  export type ListPetsResponse = z.infer<typeof ListPetsResponseSchema>\n\n  export const CreatePetsParamsSchema = PetSchema\n  export type CreatePetsParams = z.infer<typeof CreatePetsParamsSchema>\n\n  export type CreatePetsResponse = undefined\n\n  export const ShowPetByIdParamsSchema = z.object({\n    /** The id of the pet to retrieve */\n    petId: z.string().describe('The id of the pet to retrieve')\n  })\n  export type ShowPetByIdParams = z.infer<typeof ShowPetByIdParamsSchema>\n\n  export const ShowPetByIdResponseSchema = PetSchema\n  export type ShowPetByIdResponse = z.infer<typeof ShowPetByIdResponseSchema>\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/petstore-expanded-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  aiFunction,\n  AIFunctionsProvider,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { petstoreexpanded } from './petstore-expanded'\n\n/**\n * Agentic PetstoreExpanded client.\n *\n * A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification.\n */\nexport class PetstoreExpandedClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = petstoreexpanded.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n * Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\n */\n  @aiFunction({\n    name: 'petstore_expanded_find_pets',\n    description: `Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.`,\n    inputSchema: petstoreexpanded.FindPetsParamsSchema\n  })\n  async findPets(\n    params: petstoreexpanded.FindPetsParams\n  ): Promise<petstoreexpanded.FindPetsResponse> {\n    return this.ky\n      .get('/pets', {\n        searchParams: sanitizeSearchParams(pick(params, 'tags', 'limit'))\n      })\n      .json<petstoreexpanded.FindPetsResponse>()\n  }\n\n  /**\n   * Creates a new pet in the store. Duplicates are allowed.\n   */\n  @aiFunction({\n    name: 'petstore_expanded_add_pet',\n    description: `Creates a new pet in the store. Duplicates are allowed.`,\n    inputSchema: petstoreexpanded.AddPetParamsSchema\n  })\n  async addPet(\n    params: petstoreexpanded.AddPetParams\n  ): Promise<petstoreexpanded.AddPetResponse> {\n    return this.ky\n      .post('/pets', {\n        json: pick(params, 'name', 'tag')\n      })\n      .json<petstoreexpanded.AddPetResponse>()\n  }\n\n  /**\n   * Returns a user based on a single ID, if the user does not have access to the pet.\n   */\n  @aiFunction({\n    name: 'petstore_expanded_find_pet_by_id',\n    description: `Returns a user based on a single ID, if the user does not have access to the pet.`,\n    inputSchema: petstoreexpanded.FindPetByIdParamsSchema\n  })\n  async findPetById(\n    params: petstoreexpanded.FindPetByIdParams\n  ): Promise<petstoreexpanded.FindPetByIdResponse> {\n    return this.ky\n      .get(`/pets/${params.id}`)\n      .json<petstoreexpanded.FindPetByIdResponse>()\n  }\n\n  /**\n   * deletes a single pet based on the ID supplied.\n   */\n  @aiFunction({\n    name: 'petstore_expanded_delete_pet',\n    description: `deletes a single pet based on the ID supplied.`,\n    inputSchema: petstoreexpanded.DeletePetParamsSchema\n  })\n  async deletePet(\n    params: petstoreexpanded.DeletePetParams\n  ): Promise<petstoreexpanded.DeletePetResponse> {\n    return this.ky\n      .delete(`/pets/${params.id}`)\n      .json<petstoreexpanded.DeletePetResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/petstore-expanded.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace petstoreexpanded {\n  export const apiBaseUrl = 'http://petstore.swagger.io/api'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const NewPetSchema = z.object({\n    name: z.string(),\n    tag: z.string().optional()\n  })\n  export type NewPet = z.infer<typeof NewPetSchema>\n\n  export const PetSchema = z.intersection(\n    NewPetSchema,\n    z.object({ id: z.number().int() })\n  )\n  export type Pet = z.infer<typeof PetSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const FindPetsParamsSchema = z.object({\n    /** tags to filter by */\n    tags: z.array(z.string()).describe('tags to filter by').optional(),\n    /** maximum number of results to return */\n    limit: z\n      .number()\n      .int()\n      .describe('maximum number of results to return')\n      .optional()\n  })\n  export type FindPetsParams = z.infer<typeof FindPetsParamsSchema>\n\n  export const FindPetsResponseSchema = z.array(PetSchema)\n  export type FindPetsResponse = z.infer<typeof FindPetsResponseSchema>\n\n  export const AddPetParamsSchema = NewPetSchema\n  export type AddPetParams = z.infer<typeof AddPetParamsSchema>\n\n  export const AddPetResponseSchema = PetSchema\n  export type AddPetResponse = z.infer<typeof AddPetResponseSchema>\n\n  export const FindPetByIdParamsSchema = z.object({\n    /** ID of pet to fetch */\n    id: z.number().int().describe('ID of pet to fetch')\n  })\n  export type FindPetByIdParams = z.infer<typeof FindPetByIdParamsSchema>\n\n  export const FindPetByIdResponseSchema = PetSchema\n  export type FindPetByIdResponse = z.infer<typeof FindPetByIdResponseSchema>\n\n  export const DeletePetParamsSchema = z.object({\n    /** ID of pet to delete */\n    id: z.number().int().describe('ID of pet to delete')\n  })\n  export type DeletePetParams = z.infer<typeof DeletePetParamsSchema>\n\n  export type DeletePetResponse = undefined\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/security-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { aiFunction,AIFunctionsProvider } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport { security } from './security'\n\n/**\n * Agentic Security client.\n *\n * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#securitySchemeObject.\n */\nexport class SecurityClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = security.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n   * `apiKey` auth will be supplied within an `apiKey` query parameter.\n   */\n  @aiFunction({\n    name: 'security_get_anything_api_key',\n    description: `\\`apiKey\\` auth will be supplied within an \\`apiKey\\` query parameter.`,\n    inputSchema: security.GetAnythingApiKeyParamsSchema,\n    tags: ['API Key']\n  })\n  async getAnythingApiKey(\n    _params: security.GetAnythingApiKeyParams\n  ): Promise<security.GetAnythingApiKeyResponse> {\n    return this.ky\n      .get('/anything/apiKey')\n      .json<security.GetAnythingApiKeyResponse>()\n  }\n\n  /**\n   * `apiKey` auth will be supplied within an `api_key` cookie.\n   */\n  @aiFunction({\n    name: 'security_post_anything_api_key',\n    description: `\\`apiKey\\` auth will be supplied within an \\`api_key\\` cookie.`,\n    inputSchema: security.PostAnythingApiKeyParamsSchema,\n    tags: ['API Key']\n  })\n  async postAnythingApiKey(\n    _params: security.PostAnythingApiKeyParams\n  ): Promise<security.PostAnythingApiKeyResponse> {\n    return this.ky\n      .post('/anything/apiKey')\n      .json<security.PostAnythingApiKeyResponse>()\n  }\n\n  /**\n   * `apiKey` auth will be supplied within an `X-API-KEY` header.\n   */\n  @aiFunction({\n    name: 'security_put_anything_api_key',\n    description: `\\`apiKey\\` auth will be supplied within an \\`X-API-KEY\\` header.`,\n    inputSchema: security.PutAnythingApiKeyParamsSchema,\n    tags: ['API Key']\n  })\n  async putAnythingApiKey(\n    _params: security.PutAnythingApiKeyParams\n  ): Promise<security.PutAnythingApiKeyResponse> {\n    return this.ky\n      .put('/anything/apiKey')\n      .json<security.PutAnythingApiKeyResponse>()\n  }\n\n  /**\n * Authentication credentials will be supplied within a `Basic` `Authorization` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.\n */\n  @aiFunction({\n    name: 'security_post_anything_basic',\n    description: `Authentication credentials will be supplied within a \\`Basic\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.`,\n    inputSchema: security.PostAnythingBasicParamsSchema,\n    tags: ['HTTP']\n  })\n  async postAnythingBasic(\n    _params: security.PostAnythingBasicParams\n  ): Promise<security.PostAnythingBasicResponse> {\n    return this.ky\n      .post('/anything/basic')\n      .json<security.PostAnythingBasicResponse>()\n  }\n\n  /**\n * Authentication credentials will be supplied within a `Bearer` `Authorization` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.\n */\n  @aiFunction({\n    name: 'security_post_anything_bearer',\n    description: `Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.`,\n    inputSchema: security.PostAnythingBearerParamsSchema,\n    tags: ['HTTP']\n  })\n  async postAnythingBearer(\n    _params: security.PostAnythingBearerParams\n  ): Promise<security.PostAnythingBearerResponse> {\n    return this.ky\n      .post('/anything/bearer')\n      .json<security.PostAnythingBearerResponse>()\n  }\n\n  /**\n * Authentication credentials will be supplied within a `Bearer` `Authorization` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard `Bearer` authentication token.\n */\n  @aiFunction({\n    name: 'security_put_anything_bearer',\n    description: `Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard \\`Bearer\\` authentication token.`,\n    inputSchema: security.PutAnythingBearerParamsSchema,\n    tags: ['HTTP']\n  })\n  async putAnythingBearer(\n    _params: security.PutAnythingBearerParams\n  ): Promise<security.PutAnythingBearerResponse> {\n    return this.ky\n      .put('/anything/bearer')\n      .json<security.PutAnythingBearerResponse>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_get_anything_oauth2',\n    description: `> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.`,\n    inputSchema: security.GetAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async getAnythingOauth2(\n    _params: security.GetAnythingOauth2Params\n  ): Promise<security.GetAnythingOauth2Response> {\n    return this.ky\n      .get('/anything/oauth2')\n      .json<security.GetAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_post_anything_oauth2',\n    description: `> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.`,\n    inputSchema: security.PostAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async postAnythingOauth2(\n    _params: security.PostAnythingOauth2Params\n  ): Promise<security.PostAnythingOauth2Response> {\n    return this.ky\n      .post('/anything/oauth2')\n      .json<security.PostAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_put_anything_oauth2',\n    description: `> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.`,\n    inputSchema: security.PutAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async putAnythingOauth2(\n    _params: security.PutAnythingOauth2Params\n  ): Promise<security.PutAnythingOauth2Response> {\n    return this.ky\n      .put('/anything/oauth2')\n      .json<security.PutAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_delete_anything_oauth2',\n    description: `> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.`,\n    inputSchema: security.DeleteAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async deleteAnythingOauth2(\n    _params: security.DeleteAnythingOauth2Params\n  ): Promise<security.DeleteAnythingOauth2Response> {\n    return this.ky\n      .delete('/anything/oauth2')\n      .json<security.DeleteAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_patch_anything_oauth2',\n    description: `> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.`,\n    inputSchema: security.PatchAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async patchAnythingOauth2(\n    _params: security.PatchAnythingOauth2Params\n  ): Promise<security.PatchAnythingOauth2Response> {\n    return this.ky\n      .patch('/anything/oauth2')\n      .json<security.PatchAnythingOauth2Response>()\n  }\n\n  /**\n   * 🚧 This is not supported.\n   */\n  @aiFunction({\n    name: 'security_post_anything_open_id_connect',\n    description: `🚧 This is not supported.`,\n    inputSchema: security.PostAnythingOpenIdConnectParamsSchema,\n    tags: ['OpenID Connect']\n  })\n  async postAnythingOpenIdConnect(\n    _params: security.PostAnythingOpenIdConnectParams\n  ): Promise<security.PostAnythingOpenIdConnectResponse> {\n    return this.ky\n      .post('/anything/openIdConnect')\n      .json<security.PostAnythingOpenIdConnectResponse>()\n  }\n\n  /**\n   * This operation does not have any authentication requirements.\n   */\n  @aiFunction({\n    name: 'security_post_anything_no_auth',\n    description: `This operation does not have any authentication requirements.`,\n    inputSchema: security.PostAnythingNoAuthParamsSchema,\n    tags: ['Other']\n  })\n  async postAnythingNoAuth(\n    _params: security.PostAnythingNoAuthParams\n  ): Promise<security.PostAnythingNoAuthResponse> {\n    return this.ky\n      .post('/anything/no-auth')\n      .json<security.PostAnythingNoAuthResponse>()\n  }\n\n  /**\n * The `apiKey` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object.\n */\n  @aiFunction({\n    name: 'security_get_anything_optional_auth',\n    description: `The \\`apiKey\\` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object.`,\n    inputSchema: security.GetAnythingOptionalAuthParamsSchema,\n    tags: ['Other']\n  })\n  async getAnythingOptionalAuth(\n    _params: security.GetAnythingOptionalAuthParams\n  ): Promise<security.GetAnythingOptionalAuthResponse> {\n    return this.ky\n      .get('/anything/optional-auth')\n      .json<security.GetAnythingOptionalAuthResponse>()\n  }\n\n  /**\n   * This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\n   */\n  @aiFunction({\n    name: 'security_post_status401',\n    description: `This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.`,\n    inputSchema: security.PostStatus401ParamsSchema,\n    tags: ['Other']\n  })\n  async postStatus401(\n    _params: security.PostStatus401Params\n  ): Promise<security.PostStatus401Response> {\n    return this.ky.post('/status/401').json<security.PostStatus401Response>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/security.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace security {\n  export const apiBaseUrl = 'https://httpbin.org'\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetAnythingApiKeyParamsSchema = z.object({})\n  export type GetAnythingApiKeyParams = z.infer<\n    typeof GetAnythingApiKeyParamsSchema\n  >\n\n  export type GetAnythingApiKeyResponse = undefined\n\n  export const PostAnythingApiKeyParamsSchema = z.object({})\n  export type PostAnythingApiKeyParams = z.infer<\n    typeof PostAnythingApiKeyParamsSchema\n  >\n\n  export type PostAnythingApiKeyResponse = undefined\n\n  export const PutAnythingApiKeyParamsSchema = z.object({})\n  export type PutAnythingApiKeyParams = z.infer<\n    typeof PutAnythingApiKeyParamsSchema\n  >\n\n  export type PutAnythingApiKeyResponse = undefined\n\n  export const PostAnythingBasicParamsSchema = z.object({})\n  export type PostAnythingBasicParams = z.infer<\n    typeof PostAnythingBasicParamsSchema\n  >\n\n  export type PostAnythingBasicResponse = undefined\n\n  export const PostAnythingBearerParamsSchema = z.object({})\n  export type PostAnythingBearerParams = z.infer<\n    typeof PostAnythingBearerParamsSchema\n  >\n\n  export type PostAnythingBearerResponse = undefined\n\n  export const PutAnythingBearerParamsSchema = z.object({})\n  export type PutAnythingBearerParams = z.infer<\n    typeof PutAnythingBearerParamsSchema\n  >\n\n  export type PutAnythingBearerResponse = undefined\n\n  export const GetAnythingOauth2ParamsSchema = z.object({})\n  export type GetAnythingOauth2Params = z.infer<\n    typeof GetAnythingOauth2ParamsSchema\n  >\n\n  export type GetAnythingOauth2Response = undefined\n\n  export const PostAnythingOauth2ParamsSchema = z.object({})\n  export type PostAnythingOauth2Params = z.infer<\n    typeof PostAnythingOauth2ParamsSchema\n  >\n\n  export type PostAnythingOauth2Response = undefined\n\n  export const PutAnythingOauth2ParamsSchema = z.object({})\n  export type PutAnythingOauth2Params = z.infer<\n    typeof PutAnythingOauth2ParamsSchema\n  >\n\n  export type PutAnythingOauth2Response = undefined\n\n  export const DeleteAnythingOauth2ParamsSchema = z.object({})\n  export type DeleteAnythingOauth2Params = z.infer<\n    typeof DeleteAnythingOauth2ParamsSchema\n  >\n\n  export type DeleteAnythingOauth2Response = undefined\n\n  export const PatchAnythingOauth2ParamsSchema = z.object({})\n  export type PatchAnythingOauth2Params = z.infer<\n    typeof PatchAnythingOauth2ParamsSchema\n  >\n\n  export type PatchAnythingOauth2Response = undefined\n\n  export const PostAnythingOpenIdConnectParamsSchema = z.object({})\n  export type PostAnythingOpenIdConnectParams = z.infer<\n    typeof PostAnythingOpenIdConnectParamsSchema\n  >\n\n  export type PostAnythingOpenIdConnectResponse = undefined\n\n  export const PostAnythingNoAuthParamsSchema = z.object({})\n  export type PostAnythingNoAuthParams = z.infer<\n    typeof PostAnythingNoAuthParamsSchema\n  >\n\n  export type PostAnythingNoAuthResponse = undefined\n\n  export const GetAnythingOptionalAuthParamsSchema = z.object({})\n  export type GetAnythingOptionalAuthParams = z.infer<\n    typeof GetAnythingOptionalAuthParamsSchema\n  >\n\n  export type GetAnythingOptionalAuthResponse = undefined\n\n  export const PostStatus401ParamsSchema = z.object({})\n  export type PostStatus401Params = z.infer<typeof PostStatus401ParamsSchema>\n\n  export type PostStatus401Response = undefined\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/tic-tac-toe-client.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { AIFunctionsProvider, aiFunction } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { tictactoe } from './tic-tac-toe'\n\n/**\n * Agentic TicTacToe client.\n *\n * This API allows writing down marks on a Tic Tac Toe board\nand requesting the state of the board or of individual squares.\n.\n */\nexport class TicTacToeClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n   * Retrieves the current state of the board and the winner.\n   */\n  @aiFunction({\n    name: 'tic_tac_toe_get_board',\n    description: `Retrieves the current state of the board and the winner.`,\n    inputSchema: tictactoe.GetBoardParamsSchema,\n    tags: ['Gameplay']\n  })\n  async getBoard(\n    _params: tictactoe.GetBoardParams\n  ): Promise<tictactoe.GetBoardResponse> {\n    return this.ky.get('/board').json<tictactoe.GetBoardResponse>()\n  }\n\n  /**\n   * Retrieves the requested square.\n   */\n  @aiFunction({\n    name: 'tic_tac_toe_get_square',\n    description: `Retrieves the requested square.`,\n    inputSchema: tictactoe.GetSquareParamsSchema,\n    tags: ['Gameplay']\n  })\n  async getSquare(\n    _params: tictactoe.GetSquareParams\n  ): Promise<tictactoe.GetSquareResponse> {\n    return this.ky\n      .get('/board/{row}/{column}')\n      .json<tictactoe.GetSquareResponse>()\n  }\n\n  /**\n   * Places a mark on the board and retrieves the whole board and the winner (if any).\n   */\n  @aiFunction({\n    name: 'tic_tac_toe_put_square',\n    description: `Places a mark on the board and retrieves the whole board and the winner (if any).`,\n    inputSchema: tictactoe.PutSquareParamsSchema,\n    tags: ['Gameplay']\n  })\n  async putSquare(\n    _params: tictactoe.PutSquareParams\n  ): Promise<tictactoe.PutSquareResponse> {\n    return this.ky\n      .put('/board/{row}/{column}')\n      .json<tictactoe.PutSquareResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/generated/tic-tac-toe.ts",
    "content": "/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace tictactoe {\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  /** Winner of the game. `.` means nobody has won yet. */\n  export const WinnerSchema = z\n    .enum(['.', 'X', 'O'])\n    .describe('Winner of the game. `.` means nobody has won yet.')\n  export type Winner = z.infer<typeof WinnerSchema>\n\n  /** Possible values for a board square. `.` means empty square. */\n  export const MarkSchema = z\n    .enum(['.', 'X', 'O'])\n    .describe('Possible values for a board square. `.` means empty square.')\n  export type Mark = z.infer<typeof MarkSchema>\n\n  export const BoardSchema = z\n    .array(z.array(MarkSchema).min(3).max(3))\n    .min(3)\n    .max(3)\n  export type Board = z.infer<typeof BoardSchema>\n\n  export const StatusSchema = z.object({\n    winner: WinnerSchema.optional(),\n    board: BoardSchema.optional()\n  })\n  export type Status = z.infer<typeof StatusSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetBoardParamsSchema = z.object({})\n  export type GetBoardParams = z.infer<typeof GetBoardParamsSchema>\n\n  export const GetBoardResponseSchema = StatusSchema\n  export type GetBoardResponse = z.infer<typeof GetBoardResponseSchema>\n\n  export const GetSquareParamsSchema = z.object({})\n  export type GetSquareParams = z.infer<typeof GetSquareParamsSchema>\n\n  export const GetSquareResponseSchema = MarkSchema\n  export type GetSquareResponse = z.infer<typeof GetSquareResponseSchema>\n\n  export const PutSquareParamsSchema = MarkSchema\n  export type PutSquareParams = z.infer<typeof PutSquareParamsSchema>\n\n  export const PutSquareResponseSchema = StatusSchema\n  export type PutSquareResponse = z.infer<typeof PutSquareResponseSchema>\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/firecrawl.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"title\": \"Firecrawl API\",\n    \"version\": \"1.0.0\",\n    \"description\": \"API for interacting with Firecrawl services to perform web scraping and crawling tasks.\",\n    \"contact\": {\n      \"name\": \"Firecrawl Support\",\n      \"url\": \"https://firecrawl.dev/support\",\n      \"email\": \"support@firecrawl.dev\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://api.firecrawl.dev/v0\"\n    }\n  ],\n  \"paths\": {\n    \"/scrape\": {\n      \"post\": {\n        \"summary\": \"Scrape a single URL\",\n        \"operationId\": \"scrape\",\n        \"tags\": [\"Scraping\"],\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"The URL to scrape\"\n                  },\n                  \"formats\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"markdown\",\n                        \"html\",\n                        \"rawHtml\",\n                        \"links\",\n                        \"screenshot\",\n                        \"screenshot@fullPage\"\n                      ]\n                    },\n                    \"description\": \"Specific formats to return.\\n\\n - markdown: The page in Markdown format.\\n - html: The page's HTML, trimmed to include only meaningful content.\\n - rawHtml: The page's original HTML.\\n - links: The links on the page.\\n - screenshot: A screenshot of the top of the page.\\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\",\n                    \"default\": [\"markdown\"]\n                  },\n                  \"headers\": {\n                    \"type\": \"object\",\n                    \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\"\n                  },\n                  \"includeTags\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n                  },\n                  \"excludeTags\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n                  },\n                  \"onlyMainContent\": {\n                    \"type\": \"boolean\",\n                    \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                    \"default\": true\n                  },\n                  \"timeout\": {\n                    \"type\": \"integer\",\n                    \"description\": \"Timeout in milliseconds for the request\",\n                    \"default\": 30000\n                  },\n                  \"waitFor\": {\n                    \"type\": \"integer\",\n                    \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                    \"default\": 0\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ScrapeResponse\"\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/crawl\": {\n      \"post\": {\n        \"summary\": \"Crawl multiple URLs based on options\",\n        \"operationId\": \"crawlUrls\",\n        \"tags\": [\"Crawling\"],\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"The base URL to start crawling from\"\n                  },\n                  \"crawlerOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"includes\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"URL patterns to include\"\n                      },\n                      \"excludes\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"URL patterns to exclude\"\n                      },\n                      \"generateImgAltText\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Generate alt text for images using LLMs (must have a paid plan)\",\n                        \"default\": false\n                      },\n                      \"returnOnlyUrls\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.\",\n                        \"default\": false\n                      },\n                      \"maxDepth\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.\"\n                      },\n                      \"mode\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"default\", \"fast\"],\n                        \"description\": \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\",\n                        \"default\": \"default\"\n                      },\n                      \"ignoreSitemap\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Ignore the website sitemap when crawling\",\n                        \"default\": false\n                      },\n                      \"limit\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Maximum number of pages to crawl\",\n                        \"default\": 10000\n                      },\n                      \"allowBackwardCrawling\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\",\n                        \"default\": false\n                      },\n                      \"allowExternalContentLinks\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Allows the crawler to follow links to external websites.\",\n                        \"default\": false\n                      }\n                    }\n                  },\n                  \"pageOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"headers\": {\n                        \"type\": \"object\",\n                        \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\"\n                      },\n                      \"includeHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"default\": false\n                      },\n                      \"includeRawHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"default\": false\n                      },\n                      \"onlyIncludeTags\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n                      },\n                      \"onlyMainContent\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"default\": false\n                      },\n                      \"removeTags\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n                      },\n                      \"replaceAllPathsWithAbsolutePaths\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Replace all relative paths with absolute paths for images and links\",\n                        \"default\": false\n                      },\n                      \"screenshot\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include a screenshot of the top of the page that you are scraping.\",\n                        \"default\": false\n                      },\n                      \"fullPageScreenshot\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include a full page screenshot of the page that you are scraping.\",\n                        \"default\": false\n                      },\n                      \"waitFor\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                        \"default\": 0\n                      }\n                    }\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/CrawlResponse\"\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/search\": {\n      \"post\": {\n        \"summary\": \"Search for a keyword in Google, returns top page results with markdown content for each page\",\n        \"operationId\": \"searchGoogle\",\n        \"tags\": [\"Search\"],\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"query\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"The query to search for\"\n                  },\n                  \"pageOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"onlyMainContent\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"default\": false\n                      },\n                      \"fetchPageContent\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Fetch the content of each page. If false, defaults to a basic fast serp API.\",\n                        \"default\": true\n                      },\n                      \"includeHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"default\": false\n                      },\n                      \"includeRawHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"default\": false\n                      }\n                    }\n                  },\n                  \"searchOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"limit\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Maximum number of results. Max is 20 during beta.\"\n                      }\n                    }\n                  }\n                },\n                \"required\": [\"query\"]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\"\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/crawl/status/{jobId}\": {\n      \"get\": {\n        \"tags\": [\"Crawl\"],\n        \"summary\": \"Get the status of a crawl job\",\n        \"operationId\": \"getCrawlStatus\",\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"jobId\",\n            \"in\": \"path\",\n            \"description\": \"ID of the crawl job\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"status\": {\n                      \"type\": \"string\",\n                      \"description\": \"Status of the job (completed, active, failed, paused)\"\n                    },\n                    \"current\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Current page number\"\n                    },\n                    \"total\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Total number of pages\"\n                    },\n                    \"data\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\"\n                      },\n                      \"description\": \"Data returned from the job (null when it is in progress)\"\n                    },\n                    \"partial_data\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\"\n                      },\n                      \"description\": \"Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in `data`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/crawl/cancel/{jobId}\": {\n      \"delete\": {\n        \"tags\": [\"Crawl\"],\n        \"summary\": \"Cancel a crawl job\",\n        \"operationId\": \"cancelCrawlJob\",\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"jobId\",\n            \"in\": \"path\",\n            \"description\": \"ID of the crawl job\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"status\": {\n                      \"type\": \"string\",\n                      \"description\": \"Returns cancelled.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"securitySchemes\": {\n      \"bearerAuth\": {\n        \"type\": \"http\",\n        \"scheme\": \"bearer\"\n      }\n    },\n    \"schemas\": {\n      \"ScrapeResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"success\": {\n            \"type\": \"boolean\"\n          },\n          \"warning\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"Warning message to let you know of any issues.\"\n          },\n          \"data\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"markdown\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Markdown content of the page if the `markdown` format was specified (default)\"\n              },\n              \"html\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"HTML version of the content on page if the `html` format was specified\"\n              },\n              \"rawHtml\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Raw HTML content of the page if the `rawHtml` format was specified\"\n              },\n              \"links\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"format\": \"uri\"\n                },\n                \"nullable\": true,\n                \"description\": \"Links on the page if the `links` format was specified\"\n              },\n              \"screenshot\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified\"\n              },\n              \"metadata\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"type\": \"string\"\n                  },\n                  \"language\": {\n                    \"type\": \"string\",\n                    \"nullable\": true\n                  },\n                  \"sourceURL\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\"\n                  },\n                  \"<any other metadata> \": {\n                    \"type\": \"string\"\n                  },\n                  \"statusCode\": {\n                    \"type\": \"integer\",\n                    \"description\": \"The status code of the page\"\n                  },\n                  \"error\": {\n                    \"type\": \"string\",\n                    \"nullable\": true,\n                    \"description\": \"The error message of the page\"\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"CrawlStatusResponseObj\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"markdown\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"Markdown content of the page if the `markdown` format was specified (default)\"\n          },\n          \"html\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"HTML version of the content on page if the `html` format was specified\"\n          },\n          \"rawHtml\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"Raw HTML content of the page if the `rawHtml` format was specified\"\n          },\n          \"links\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"nullable\": true,\n            \"description\": \"Links on the page if the `links` format was specified\"\n          },\n          \"screenshot\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified\"\n          },\n          \"metadata\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"title\": {\n                \"type\": \"string\"\n              },\n              \"description\": {\n                \"type\": \"string\"\n              },\n              \"language\": {\n                \"type\": \"string\",\n                \"nullable\": true\n              },\n              \"sourceURL\": {\n                \"type\": \"string\",\n                \"format\": \"uri\"\n              },\n              \"<any other metadata> \": {\n                \"type\": \"string\"\n              },\n              \"statusCode\": {\n                \"type\": \"integer\",\n                \"description\": \"The status code of the page\"\n              },\n              \"error\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"The error message of the page\"\n              }\n            }\n          }\n        }\n      },\n      \"SearchResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"success\": {\n            \"type\": \"boolean\"\n          },\n          \"data\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"markdown\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Markdown content of the page if the `markdown` format was specified (default)\"\n              },\n              \"html\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"HTML version of the content on page if the `html` format was specified\"\n              },\n              \"rawHtml\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Raw HTML content of the page if the `rawHtml` format was specified\"\n              },\n              \"links\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"format\": \"uri\"\n                },\n                \"nullable\": true,\n                \"description\": \"Links on the page if the `links` format was specified\"\n              },\n              \"screenshot\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified\"\n              },\n              \"metadata\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"type\": \"string\"\n                  },\n                  \"language\": {\n                    \"type\": \"string\",\n                    \"nullable\": true\n                  },\n                  \"sourceURL\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\"\n                  },\n                  \"<any other metadata> \": {\n                    \"type\": \"string\"\n                  },\n                  \"statusCode\": {\n                    \"type\": \"integer\",\n                    \"description\": \"The status code of the page\"\n                  },\n                  \"error\": {\n                    \"type\": \"string\",\n                    \"nullable\": true,\n                    \"description\": \"The error message of the page\"\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"CrawlResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"success\": {\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        }\n      }\n    }\n  },\n  \"security\": [\n    {\n      \"bearerAuth\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/notion.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"title\": \"Notion API\",\n    \"version\": \"1.0.0\",\n    \"description\": \"API specification for Notion\"\n  },\n  \"servers\": [{ \"url\": \"https://api.notion.so\" }],\n  \"security\": [{ \"oauth2\": [] }],\n\n  \"paths\": {\n    \"/users/me\": {\n      \"get\": {\n        \"summary\": \"Get current user\",\n        \"operationId\": \"getSelf\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/users/{user_id}\": {\n      \"get\": {\n        \"summary\": \"Get user\",\n        \"operationId\": \"getUser\",\n        \"parameters\": [\n          {\n            \"name\": \"user_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/users\": {\n      \"get\": {\n        \"summary\": \"List users\",\n        \"operationId\": \"listUsers\",\n        \"parameters\": [\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListUsersResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pages\": {\n      \"post\": {\n        \"summary\": \"Create page\",\n        \"operationId\": \"createPage\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreatePageParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pages/{page_id}\": {\n      \"get\": {\n        \"summary\": \"Get page\",\n        \"operationId\": \"getPage\",\n        \"parameters\": [\n          {\n            \"name\": \"page_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"filter_properties\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Update page\",\n        \"operationId\": \"updatePage\",\n        \"parameters\": [\n          {\n            \"name\": \"page_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdatePageParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pages/{page_id}/properties/{property_id}\": {\n      \"get\": {\n        \"summary\": \"Get page property\",\n        \"operationId\": \"getPageProperty\",\n        \"parameters\": [\n          {\n            \"name\": \"page_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"property_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemListResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/blocks/{block_id}\": {\n      \"get\": {\n        \"summary\": \"Get block\",\n        \"operationId\": \"getBlock\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Update block\",\n        \"operationId\": \"updateBlock\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateBlockParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"summary\": \"Delete block\",\n        \"operationId\": \"deleteBlock\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/blocks/{block_id}/children\": {\n      \"get\": {\n        \"summary\": \"List block children\",\n        \"operationId\": \"listBlockChildren\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListBlockChildrenResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Append block children\",\n        \"operationId\": \"appendBlockChildren\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/AppendBlockChildrenParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/AppendBlockChildrenResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/databases/{database_id}\": {\n      \"get\": {\n        \"summary\": \"Get database\",\n        \"operationId\": \"getDatabase\",\n        \"parameters\": [\n          {\n            \"name\": \"database_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Update database\",\n        \"operationId\": \"updateDatabase\",\n        \"parameters\": [\n          {\n            \"name\": \"database_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateDatabaseParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/databases/{database_id}/query\": {\n      \"post\": {\n        \"summary\": \"Query database\",\n        \"operationId\": \"queryDatabase\",\n        \"parameters\": [\n          {\n            \"name\": \"database_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"filter_properties\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/QueryDatabaseParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/QueryDatabaseResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/databases\": {\n      \"get\": {\n        \"summary\": \"List databases\",\n        \"operationId\": \"listDatabases\",\n        \"parameters\": [\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListDatabasesResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"summary\": \"Create database\",\n        \"operationId\": \"createDatabase\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateDatabaseParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/search\": {\n      \"post\": {\n        \"summary\": \"Search\",\n        \"operationId\": \"search\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/SearchParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/comments\": {\n      \"post\": {\n        \"summary\": \"Create comment\",\n        \"operationId\": \"createComment\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateCommentParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/CommentObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialCommentObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"get\": {\n        \"summary\": \"List comments\",\n        \"operationId\": \"listComments\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListCommentsResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/oauth/token\": {\n      \"post\": {\n        \"summary\": \"OAuth token\",\n        \"operationId\": \"oauthToken\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/OauthTokenParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/OauthTokenResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n\n  \"components\": {\n    \"securitySchemes\": {\n      \"oauth2\": {\n        \"type\": \"oauth2\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"scopes\": {},\n            \"authorizationUrl\": \"https://api.notion.com/v1/oauth/authorize\",\n            \"tokenUrl\": \"https://api.notion.com/v1/oauth/token\"\n          }\n        }\n      }\n    },\n    \"schemas\": {\n      \"UserObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"user\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"person\", \"bot\"]\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"avatar_url\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\", \"type\", \"name\", \"avatar_url\"]\n      },\n      \"ListUsersResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/UserObjectResponse\"\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"CreatePageParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"parent\": {\n            \"type\": \"object\",\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"database_id\"]\n                  },\n                  \"database_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"database_id\"]\n              }\n            ]\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"title\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"title\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"rich_text\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\"number\", \"null\"]\n                    }\n                  },\n                  \"required\": [\"number\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"select\": {\n                      \"type\": [\"object\", \"null\"],\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"name\"]\n                    }\n                  },\n                  \"required\": [\"select\"]\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"parent\", \"properties\"]\n      },\n      \"PageObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"page\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          },\n          \"url\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"archived\",\n          \"url\"\n        ]\n      },\n      \"PartialPageObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"page\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"UpdatePageParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"title\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"title\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"rich_text\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\"number\", \"null\"]\n                    }\n                  },\n                  \"required\": [\"number\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"select\": {\n                      \"type\": [\"object\", \"null\"],\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"name\"]\n                    }\n                  },\n                  \"required\": [\"select\"]\n                }\n              ]\n            }\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"PropertyItemObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\", \"id\"]\n      },\n      \"PropertyItemListResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\"\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"PartialBlockObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"block\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"BlockObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"block\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\"\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          },\n          \"has_children\": {\n            \"type\": \"boolean\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"has_children\",\n          \"archived\"\n        ]\n      },\n      \"UpdateBlockParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"paragraph\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"heading_1\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"heading_2\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"heading_3\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"bulleted_list_item\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"numbered_list_item\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"quote\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"to_do\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"checked\": {\n                \"type\": \"boolean\"\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"toggle\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"code\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"language\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"embed\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"image\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"video\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"file\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"pdf\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"bookmark\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"equation\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"divider\": {\n            \"type\": \"object\"\n          },\n          \"table_of_contents\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"breadcrumb\": {\n            \"type\": \"object\"\n          },\n          \"column_list\": {\n            \"type\": \"object\"\n          },\n          \"column\": {\n            \"type\": \"object\"\n          },\n          \"link_to_page\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"page_id\", \"database_id\"]\n              },\n              \"page_id\": {\n                \"type\": \"string\"\n              },\n              \"database_id\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"table_row\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"cells\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                  }\n                }\n              }\n            }\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"ListBlockChildrenResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"AppendBlockChildrenParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"children\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/BlockObjectRequest\"\n            }\n          }\n        },\n        \"required\": [\"children\"]\n      },\n      \"AppendBlockChildrenResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"PartialDatabaseObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"database\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\"\n            }\n          }\n        },\n        \"required\": [\"object\", \"id\", \"properties\"]\n      },\n      \"DatabaseObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"database\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"emoji\"]\n                  },\n                  \"emoji\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"emoji\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n          },\n          \"title\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\"\n            }\n          },\n          \"description\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\"\n            }\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\"\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\"\n            }\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"workspace\"]\n                  },\n                  \"workspace\": {\n                    \"type\": \"boolean\",\n                    \"enum\": [true]\n                  }\n                },\n                \"required\": [\"type\", \"workspace\"]\n              }\n            ]\n          },\n          \"url\": {\n            \"type\": \"string\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"created_by\",\n          \"last_edited_time\",\n          \"last_edited_by\",\n          \"title\",\n          \"description\",\n          \"is_inline\",\n          \"properties\",\n          \"parent\",\n          \"url\",\n          \"archived\"\n        ]\n      },\n      \"UpdateDatabaseParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"description\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"emoji\"]\n                  }\n                },\n                \"required\": [\"emoji\", \"type\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  }\n                },\n                \"required\": [\"external\", \"type\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  }\n                },\n                \"required\": [\"external\", \"type\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertyUpdateSchema\"\n            }\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"QueryDatabaseParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"sorts\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"property\": {\n                      \"type\": \"string\"\n                    },\n                    \"direction\": {\n                      \"type\": \"string\",\n                      \"enum\": [\"ascending\", \"descending\"]\n                    }\n                  },\n                  \"required\": [\"property\", \"direction\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"timestamp\": {\n                      \"type\": \"string\",\n                      \"enum\": [\"created_time\", \"last_edited_time\"]\n                    },\n                    \"direction\": {\n                      \"type\": \"string\",\n                      \"enum\": [\"ascending\", \"descending\"]\n                    }\n                  },\n                  \"required\": [\"timestamp\", \"direction\"]\n                }\n              ]\n            }\n          },\n          \"filter\": {\n            \"oneOf\": [\n              {\n                \"$ref\": \"#/components/schemas/PropertyFilter\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/CompoundFilter\"\n              }\n            ]\n          },\n          \"start_cursor\": {\n            \"type\": \"string\"\n          },\n          \"page_size\": {\n            \"type\": \"integer\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"QueryDatabaseResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"ListDatabasesResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"CreateDatabaseParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"database_id\"]\n                  },\n                  \"database_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"database_id\"]\n              }\n            ]\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertySchema\"\n            }\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"emoji\"]\n                  },\n                  \"emoji\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"emoji\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"title\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"description\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"parent\", \"properties\", \"title\"]\n      },\n      \"SearchParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"query\": {\n            \"type\": \"string\"\n          },\n          \"sort\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"direction\": {\n                \"type\": \"string\",\n                \"enum\": [\"ascending\", \"descending\"]\n              },\n              \"timestamp\": {\n                \"type\": \"string\",\n                \"enum\": [\"last_edited_time\"]\n              }\n            },\n            \"required\": [\"direction\", \"timestamp\"]\n          },\n          \"filter\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"value\": {\n                \"type\": \"string\",\n                \"enum\": [\"page\", \"database\"]\n              },\n              \"property\": {\n                \"type\": \"string\",\n                \"enum\": [\"object\"]\n              }\n            },\n            \"required\": [\"value\", \"property\"]\n          },\n          \"start_cursor\": {\n            \"type\": \"string\"\n          },\n          \"page_size\": {\n            \"type\": \"integer\"\n          }\n        }\n      },\n      \"SearchResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"CreateCommentParameters\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"parent\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  }\n                },\n                \"required\": [\"page_id\"]\n              },\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              }\n            },\n            \"required\": [\"parent\", \"rich_text\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"discussion_id\": {\n                \"type\": \"string\"\n              },\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              }\n            },\n            \"required\": [\"discussion_id\", \"rich_text\"]\n          }\n        ]\n      },\n      \"CommentObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"comment\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"block_id\"]\n                  },\n                  \"block_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"block_id\"]\n              }\n            ]\n          },\n          \"discussion_id\": {\n            \"type\": \"string\"\n          },\n          \"rich_text\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\"\n            }\n          },\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"parent\",\n          \"discussion_id\",\n          \"rich_text\",\n          \"created_by\",\n          \"created_time\",\n          \"last_edited_time\"\n        ]\n      },\n      \"PartialCommentObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"comment\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"ListCommentsResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/CommentObjectResponse\"\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"OauthTokenParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"grant_type\": {\n            \"type\": \"string\"\n          },\n          \"code\": {\n            \"type\": \"string\"\n          },\n          \"redirect_uri\": {\n            \"type\": \"string\"\n          },\n          \"external_account\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"key\": {\n                \"type\": \"string\"\n              },\n              \"name\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"key\", \"name\"]\n          }\n        },\n        \"required\": [\"grant_type\", \"code\"]\n      },\n      \"OauthTokenResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"access_token\": {\n            \"type\": \"string\"\n          },\n          \"token_type\": {\n            \"type\": \"string\",\n            \"enum\": [\"bearer\"]\n          },\n          \"bot_id\": {\n            \"type\": \"string\"\n          },\n          \"workspace_name\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"workspace_icon\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"workspace_id\": {\n            \"type\": \"string\"\n          },\n          \"owner\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"user\"]\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\"type\", \"user\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"workspace\"]\n                  },\n                  \"workspace\": {\n                    \"type\": \"boolean\",\n                    \"enum\": [true]\n                  }\n                },\n                \"required\": [\"type\", \"workspace\"]\n              }\n            ]\n          },\n          \"duplicated_template_id\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\n          \"access_token\",\n          \"token_type\",\n          \"bot_id\",\n          \"workspace_name\",\n          \"workspace_icon\",\n          \"workspace_id\",\n          \"owner\",\n          \"duplicated_template_id\"\n        ]\n      },\n      \"RichTextItemRequest\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"text\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"content\": {\n                    \"type\": \"string\"\n                  },\n                  \"link\": {\n                    \"type\": [\"object\", \"null\"],\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"content\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"text\"]\n              },\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\"\n              }\n            },\n            \"required\": [\"text\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"mention\": {\n                \"oneOf\": [\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"user\": {\n                        \"oneOf\": [\n                          {\n                            \"type\": \"object\",\n                            \"properties\": {\n                              \"id\": {\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"id\"]\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\"user\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"page\": {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"id\"]\n                      }\n                    },\n                    \"required\": [\"page\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"database\": {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"id\"]\n                      }\n                    },\n                    \"required\": [\"database\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"date\": {\n                        \"$ref\": \"#/components/schemas/DateRequest\"\n                      }\n                    },\n                    \"required\": [\"date\"]\n                  }\n                ]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"mention\"]\n              },\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\"\n              }\n            },\n            \"required\": [\"mention\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"equation\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"expression\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"equation\"]\n              },\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\"\n              }\n            },\n            \"required\": [\"equation\"]\n          }\n        ]\n      },\n      \"RichTextItemResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TextRichTextItemResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/MentionRichTextItemResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/EquationRichTextItemResponse\"\n          }\n        ]\n      },\n      \"AnnotationRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\"\n          },\n          \"italic\": {\n            \"type\": \"boolean\"\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\"\n          },\n          \"underline\": {\n            \"type\": \"boolean\"\n          },\n          \"code\": {\n            \"type\": \"boolean\"\n          },\n          \"color\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\"\n            ]\n          }\n        }\n      },\n      \"DateRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"start\": {\n            \"type\": \"string\"\n          },\n          \"end\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"time_zone\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"start\"]\n      },\n      \"TextRichTextItemResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"text\"]\n          },\n          \"text\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"content\": {\n                \"type\": \"string\"\n              },\n              \"link\": {\n                \"type\": [\"object\", \"null\"],\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            },\n            \"required\": [\"content\", \"link\"]\n          },\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\"\n          },\n          \"plain_text\": {\n            \"type\": \"string\"\n          },\n          \"href\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\", \"text\", \"annotations\", \"plain_text\", \"href\"]\n      },\n      \"MentionRichTextItemResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"mention\"]\n          },\n          \"mention\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"user\"]\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\"type\", \"user\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"date\"]\n                  },\n                  \"date\": {\n                    \"$ref\": \"#/components/schemas/DateResponse\"\n                  }\n                },\n                \"required\": [\"type\", \"date\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"link_preview\"]\n                  },\n                  \"link_preview\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"link_preview\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page\"]\n                  },\n                  \"page\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"id\"]\n                  }\n                },\n                \"required\": [\"type\", \"page\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"database\"]\n                  },\n                  \"database\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"id\"]\n                  }\n                },\n                \"required\": [\"type\", \"database\"]\n              }\n            ]\n          },\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\"\n          },\n          \"plain_text\": {\n            \"type\": \"string\"\n          },\n          \"href\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\", \"mention\", \"annotations\", \"plain_text\", \"href\"]\n      },\n      \"EquationRichTextItemResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"equation\"]\n          },\n          \"equation\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"expression\"]\n          },\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\"\n          },\n          \"plain_text\": {\n            \"type\": \"string\"\n          },\n          \"href\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\", \"equation\", \"annotations\", \"plain_text\", \"href\"]\n      },\n      \"AnnotationResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\"\n          },\n          \"italic\": {\n            \"type\": \"boolean\"\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\"\n          },\n          \"underline\": {\n            \"type\": \"boolean\"\n          },\n          \"code\": {\n            \"type\": \"boolean\"\n          },\n          \"color\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\"\n            ]\n          }\n        },\n        \"required\": [\n          \"bold\",\n          \"italic\",\n          \"strikethrough\",\n          \"underline\",\n          \"code\",\n          \"color\"\n        ]\n      },\n      \"DateResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"start\": {\n            \"type\": \"string\"\n          },\n          \"end\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"time_zone\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"start\", \"end\", \"time_zone\"]\n      },\n      \"PartialUserObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"user\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"DatabasePropertyConfigResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TitlePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/RichTextPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/NumberPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/SelectPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/MultiSelectPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/DatePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/PeoplePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/FilePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/CheckboxPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/URLPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/EmailPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/PhoneNumberPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/FormulaPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/RelationPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/RollupPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedTimePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedByPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedTimePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedByPropertyResponse\"\n          }\n        ]\n      },\n      \"TitlePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"title\"]\n          },\n          \"title\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"title\"]\n      },\n      \"RichTextPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"rich_text\"]\n          },\n          \"rich_text\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"rich_text\"]\n      },\n      \"NumberPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"number\"]\n          },\n          \"number\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"format\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"number\"]\n      },\n      \"SelectPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"select\"]\n          },\n          \"select\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"options\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\"\n                }\n              }\n            },\n            \"required\": [\"options\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"select\"]\n      },\n      \"MultiSelectPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"multi_select\"]\n          },\n          \"multi_select\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"options\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\"\n                }\n              }\n            },\n            \"required\": [\"options\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"multi_select\"]\n      },\n      \"DatePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"date\"]\n          },\n          \"date\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"date\"]\n      },\n      \"PeoplePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"people\"]\n          },\n          \"people\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"people\"]\n      },\n      \"FilePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"files\"]\n          },\n          \"files\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"files\"]\n      },\n      \"CheckboxPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"checkbox\"]\n          },\n          \"checkbox\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"checkbox\"]\n      },\n      \"URLPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"url\"]\n          },\n          \"url\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"url\"]\n      },\n      \"EmailPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"email\"]\n          },\n          \"email\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"email\"]\n      },\n      \"PhoneNumberPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"phone_number\"]\n          },\n          \"phone_number\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"phone_number\"]\n      },\n      \"FormulaPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"formula\"]\n          },\n          \"formula\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"expression\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"formula\"]\n      },\n      \"RelationPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"relation\"]\n          },\n          \"relation\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\"\n              },\n              \"synced_property_name\": {\n                \"type\": \"string\"\n              },\n              \"synced_property_id\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\n              \"database_id\",\n              \"synced_property_name\",\n              \"synced_property_id\"\n            ]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"relation\"]\n      },\n      \"RollupPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"rollup\"]\n          },\n          \"rollup\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"relation_property_name\": {\n                \"type\": \"string\"\n              },\n              \"relation_property_id\": {\n                \"type\": \"string\"\n              },\n              \"rollup_property_name\": {\n                \"type\": \"string\"\n              },\n              \"rollup_property_id\": {\n                \"type\": \"string\"\n              },\n              \"function\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\n              \"relation_property_name\",\n              \"relation_property_id\",\n              \"rollup_property_name\",\n\n              \"rollup_property_id\",\n              \"function\"\n            ]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"rollup\"]\n      },\n      \"CreatedTimePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"created_time\"]\n          },\n          \"created_time\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"created_time\"]\n      },\n      \"CreatedByPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"created_by\"]\n          },\n          \"created_by\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"created_by\"]\n      },\n      \"LastEditedTimePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"last_edited_time\"]\n          },\n          \"last_edited_time\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"last_edited_time\"]\n      },\n      \"LastEditedByPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"last_edited_by\"]\n          },\n          \"last_edited_by\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"last_edited_by\"]\n      },\n      \"SelectOption\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"color\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"name\", \"color\"]\n      },\n      \"PropertyUpdateSchema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"PropertySchema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\"]\n      },\n      \"PropertyFilter\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"title\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"title\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"rich_text\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"rich_text\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"number\": {\n                \"$ref\": \"#/components/schemas/NumberPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"number\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"checkbox\": {\n                \"$ref\": \"#/components/schemas/CheckboxPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"checkbox\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"select\": {\n                \"$ref\": \"#/components/schemas/SelectPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"select\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"multi_select\": {\n                \"$ref\": \"#/components/schemas/MultiSelectPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"multi_select\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"date\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"date\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"people\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"people\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"files\": {\n                \"$ref\": \"#/components/schemas/FilesPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"files\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"url\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"email\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"email\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"phone_number\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"phone_number\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"relation\": {\n                \"$ref\": \"#/components/schemas/RelationPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"relation\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"created_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"created_by\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"created_time\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"last_edited_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"last_edited_by\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"last_edited_time\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"timestamp\": {\n                \"type\": \"string\",\n                \"enum\": [\"created_time\", \"last_edited_time\"]\n              },\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"timestamp\", \"created_time\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"timestamp\": {\n                \"type\": \"string\",\n                \"enum\": [\"created_time\", \"last_edited_time\"]\n              },\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"timestamp\", \"last_edited_time\"]\n          }\n        ]\n      },\n      \"TextPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"string\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"string\"\n          },\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"starts_with\": {\n            \"type\": \"string\"\n          },\n          \"ends_with\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"NumberPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"number\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"number\"\n          },\n          \"greater_than\": {\n            \"type\": \"number\"\n          },\n          \"less_than\": {\n            \"type\": \"number\"\n          },\n          \"greater_than_or_equal_to\": {\n            \"type\": \"number\"\n          },\n          \"less_than_or_equal_to\": {\n            \"type\": \"number\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"CheckboxPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"boolean\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"SelectPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"string\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"MultiSelectPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"DatePropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"string\"\n          },\n          \"before\": {\n            \"type\": \"string\"\n          },\n          \"after\": {\n            \"type\": \"string\"\n          },\n          \"on_or_before\": {\n            \"type\": \"string\"\n          },\n          \"on_or_after\": {\n            \"type\": \"string\"\n          },\n          \"past_week\": {},\n          \"past_month\": {},\n          \"past_year\": {},\n          \"next_week\": {},\n          \"next_month\": {},\n          \"next_year\": {},\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"PeoplePropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"FilesPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"RelationPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"CompoundFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"and\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\"\n            }\n          },\n          \"or\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\"\n            }\n          }\n        }\n      },\n      \"BlockObjectRequest\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"paragraph\"]\n              },\n              \"paragraph\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"paragraph\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"heading_1\"]\n              },\n              \"heading_1\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"heading_1\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"heading_2\"]\n              },\n              \"heading_2\": {\n                \"type\": \"object\",\n\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"heading_2\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"heading_3\"]\n              },\n              \"heading_3\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"heading_3\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"bulleted_list_item\"]\n              },\n              \"bulleted_list_item\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"bulleted_list_item\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"numbered_list_item\"]\n              },\n              \"numbered_list_item\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"numbered_list_item\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"to_do\"]\n              },\n              \"to_do\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"checked\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\", \"checked\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"to_do\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"toggle\"]\n              },\n              \"toggle\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"toggle\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"code\"]\n              },\n              \"code\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"language\": {\n                    \"type\": \"string\"\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"rich_text\", \"language\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"code\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"child_page\"]\n              },\n              \"child_page\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"title\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"child_page\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"child_database\"]\n              },\n              \"child_database\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"title\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"child_database\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"embed\"]\n              },\n              \"embed\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"embed\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"image\"]\n              },\n              \"image\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"image\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"video\"]\n              },\n              \"video\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"video\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"file\"]\n              },\n              \"file\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"file\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"pdf\"]\n              },\n              \"pdf\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"pdf\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"bookmark\"]\n              },\n              \"bookmark\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"bookmark\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"equation\"]\n              },\n              \"equation\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"expression\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"equation\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"divider\"]\n              },\n              \"divider\": {\n                \"type\": \"object\"\n              }\n            },\n            \"required\": [\"object\", \"type\", \"divider\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"table_of_contents\"]\n              },\n              \"table_of_contents\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"required\": [\"object\", \"type\", \"table_of_contents\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"column_list\"]\n              },\n              \"column_list\": {\n                \"type\": \"object\"\n              }\n            },\n            \"required\": [\"object\", \"type\", \"column_list\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"column\"]\n              },\n              \"column\": {\n                \"type\": \"object\"\n              }\n            },\n            \"required\": [\"object\", \"type\", \"column\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"link_to_page\"]\n              },\n              \"link_to_page\": {\n                \"oneOf\": [\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"type\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"page_id\"]\n                      },\n                      \"page_id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\", \"page_id\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"type\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"database_id\"]\n                      },\n                      \"database_id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\", \"database_id\"]\n                  }\n                ]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"link_to_page\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"table\"]\n              },\n              \"table\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"table_width\": {\n                    \"type\": \"integer\"\n                  },\n                  \"has_column_header\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"has_row_header\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"table_width\", \"children\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"table\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"table_row\"]\n              },\n              \"table_row\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"cells\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  }\n                },\n                \"required\": [\"cells\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"table_row\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"synced_block\"]\n              },\n              \"synced_block\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"synced_from\": {\n                    \"oneOf\": [\n                      {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"type\": {\n                            \"type\": \"string\",\n                            \"enum\": [\"block_id\"]\n                          },\n                          \"block_id\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\", \"block_id\"]\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\"\n                    }\n                  }\n                }\n              }\n            },\n            \"required\": [\"object\", \"type\", \"synced_block\"]\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/open-meteo.yaml",
    "content": "openapi: 3.0.0\ninfo:\n  title: Open-Meteo APIs\n  description: 'Open-Meteo offers free weather forecast APIs for open-source developers and non-commercial use. No API key is required.'\n  version: '1.0'\n  contact:\n    name: Open-Meteo\n    url: https://open-meteo.com\n    email: info@open-meteo.com\n  license:\n    name: Attribution 4.0 International (CC BY 4.0)\n    url: https://creativecommons.org/licenses/by/4.0/\n  termsOfService: https://open-meteo.com/en/features#terms\npaths:\n  /v1/forecast:\n    servers:\n      - url: https://api.open-meteo.com\n    get:\n      tags:\n        - Weather Forecast APIs\n      summary: 7 day weather forecast for coordinates\n      description: 7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.\n      parameters:\n        - name: hourly\n          in: query\n          explode: false\n          schema:\n            type: array\n            items:\n              type: string\n              enum:\n                - temperature_2m\n                - relative_humidity_2m\n                - dew_point_2m\n                - apparent_temperature\n                - pressure_msl\n                - cloud_cover\n                - cloud_cover_low\n                - cloud_cover_mid\n                - cloud_cover_high\n                - wind_speed_10m\n                - wind_speed_80m\n                - wind_speed_120m\n                - wind_speed_180m\n                - wind_direction_10m\n                - wind_direction_80m\n                - wind_direction_120m\n                - wind_direction_180m\n                - wind_gusts_10m\n                - shortwave_radiation\n                - direct_radiation\n                - direct_normal_irradiance\n                - diffuse_radiation\n                - vapour_pressure_deficit\n                - evapotranspiration\n                - precipitation\n                - weather_code\n                - snow_height\n                - freezing_level_height\n                - soil_temperature_0cm\n                - soil_temperature_6cm\n                - soil_temperature_18cm\n                - soil_temperature_54cm\n                - soil_moisture_0_1cm\n                - soil_moisture_1_3cm\n                - soil_moisture_3_9cm\n                - soil_moisture_9_27cm\n                - soil_moisture_27_81cm\n        - name: daily\n          in: query\n          schema:\n            type: array\n            items:\n              type: string\n              enum:\n                - temperature_2m_max\n                - temperature_2m_min\n                - apparent_temperature_max\n                - apparent_temperature_min\n                - precipitation_sum\n                - precipitation_hours\n                - weather_code\n                - sunrise\n                - sunset\n                - wind_speed_10m_max\n                - wind_gusts_10m_max\n                - wind_direction_10m_dominant\n                - shortwave_radiation_sum\n                - uv_index_max\n                - uv_index_clear_sky_max\n                - et0_fao_evapotranspiration\n        - name: latitude\n          in: query\n          required: true\n          description: 'WGS84 coordinate'\n          schema:\n            type: number\n            format: double\n        - name: longitude\n          in: query\n          required: true\n          description: 'WGS84 coordinate'\n          schema:\n            type: number\n            format: double\n        - name: current_weather\n          in: query\n          schema:\n            type: boolean\n        - name: temperature_unit\n          in: query\n          schema:\n            type: string\n            default: celsius\n            enum:\n              - celsius\n              - fahrenheit\n        - name: wind_speed_unit\n          in: query\n          schema:\n            type: string\n            default: kmh\n            enum:\n              - kmh\n              - ms\n              - mph\n              - kn\n        - name: timeformat\n          in: query\n          description: If format `unixtime` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply `utc_offset_seconds` again to get the correct date.\n          schema:\n            type: string\n            default: iso8601\n            enum:\n              - iso8601\n              - unixtime\n        - name: timezone\n          in: query\n          description: If `timezone` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported.\n          schema:\n            type: string\n        - name: past_days\n          in: query\n          description: If `past_days` is set, yesterdays or the day before yesterdays data are also returned.\n          schema:\n            type: integer\n            enum:\n              - 1\n              - 2\n      responses:\n        '200':\n          description: OK\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  latitude:\n                    type: number\n                    example: 52.52\n                    description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\n                  longitude:\n                    type: number\n                    example: 13.419.52\n                    description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\n                  elevation:\n                    type: number\n                    example: 44.812\n                    description: The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.\n                  generationtime_ms:\n                    type: number\n                    example: 2.2119\n                    description: Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.\n                  utc_offset_seconds:\n                    type: integer\n                    example: 3600\n                    description: Applied timezone offset from the &timezone= parameter.\n                  hourly:\n                    $ref: '#/components/schemas/HourlyResponse'\n                  hourly_units:\n                    type: object\n                    additionalProperties:\n                      type: string\n                    description: For each selected weather variable, the unit will be listed here.\n                  daily:\n                    $ref: '#/components/schemas/DailyResponse'\n                  daily_units:\n                    type: object\n                    additionalProperties:\n                      type: string\n                    description: For each selected daily weather variable, the unit will be listed here.\n                  current_weather:\n                    $ref: '#/components/schemas/CurrentWeather'\n        '400':\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  error:\n                    type: boolean\n                    description: Always set true for errors\n                  reason:\n                    type: string\n                    description: Description of the error\n                    example: 'Latitude must be in range of -90 to 90°. Given: 300'\ncomponents:\n  schemas:\n    HourlyResponse:\n      type: object\n      description: For each selected weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.\n      required:\n        - time\n      properties:\n        time:\n          type: array\n          items:\n            type: string\n        temperature_2m:\n          type: array\n          items:\n            type: number\n        relative_humidity_2m:\n          type: array\n          items:\n            type: number\n        dew_point_2m:\n          type: array\n          items:\n            type: number\n        apparent_temperature:\n          type: array\n          items:\n            type: number\n        pressure_msl:\n          type: array\n          items:\n            type: number\n        cloud_cover:\n          type: array\n          items:\n            type: number\n        cloud_cover_low:\n          type: array\n          items:\n            type: number\n        cloud_cover_mid:\n          type: array\n          items:\n            type: number\n        cloud_cover_high:\n          type: array\n          items:\n            type: number\n        wind_speed_10m:\n          type: array\n          items:\n            type: number\n        wind_speed_80m:\n          type: array\n          items:\n            type: number\n        wind_speed_120m:\n          type: array\n          items:\n            type: number\n        wind_speed_180m:\n          type: array\n          items:\n            type: number\n        wind_direction_10m:\n          type: array\n          items:\n            type: number\n        wind_direction_80m:\n          type: array\n          items:\n            type: number\n        wind_direction_120m:\n          type: array\n          items:\n            type: number\n        wind_direction_180m:\n          type: array\n          items:\n            type: number\n        wind_gusts_10m:\n          type: array\n          items:\n            type: number\n        shortwave_radiation:\n          type: array\n          items:\n            type: number\n        direct_radiation:\n          type: array\n          items:\n            type: number\n        direct_normal_irradiance:\n          type: array\n          items:\n            type: number\n        diffuse_radiation:\n          type: array\n          items:\n            type: number\n        vapour_pressure_deficit:\n          type: array\n          items:\n            type: number\n        evapotranspiration:\n          type: array\n          items:\n            type: number\n        precipitation:\n          type: array\n          items:\n            type: number\n        weather_code:\n          type: array\n          items:\n            type: number\n        snow_height:\n          type: array\n          items:\n            type: number\n        freezing_level_height:\n          type: array\n          items:\n            type: number\n        soil_temperature_0cm:\n          type: array\n          items:\n            type: number\n        soil_temperature_6cm:\n          type: array\n          items:\n            type: number\n        soil_temperature_18cm:\n          type: array\n          items:\n            type: number\n        soil_temperature_54cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_0_1cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_1_3cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_3_9cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_9_27cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_27_81cm:\n          type: array\n          items:\n            type: number\n    DailyResponse:\n      type: object\n      description: For each selected daily weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.\n      properties:\n        time:\n          type: array\n          items:\n            type: string\n        temperature_2m_max:\n          type: array\n          items:\n            type: number\n        temperature_2m_min:\n          type: array\n          items:\n            type: number\n        apparent_temperature_max:\n          type: array\n          items:\n            type: number\n        apparent_temperature_min:\n          type: array\n          items:\n            type: number\n        precipitation_sum:\n          type: array\n          items:\n            type: number\n        precipitation_hours:\n          type: array\n          items:\n            type: number\n        weather_code:\n          type: array\n          items:\n            type: number\n        sunrise:\n          type: array\n          items:\n            type: number\n        sunset:\n          type: array\n          items:\n            type: number\n        wind_speed_10m_max:\n          type: array\n          items:\n            type: number\n        wind_gusts_10m_max:\n          type: array\n          items:\n            type: number\n        wind_direction_10m_dominant:\n          type: array\n          items:\n            type: number\n        shortwave_radiation_sum:\n          type: array\n          items:\n            type: number\n        uv_index_max:\n          type: array\n          items:\n            type: number\n        uv_index_clear_sky_max:\n          type: array\n          items:\n            type: number\n        et0_fao_evapotranspiration:\n          type: array\n          items:\n            type: number\n      required:\n        - time\n    CurrentWeather:\n      type: object\n      description: 'Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code'\n      properties:\n        time:\n          type: string\n        temperature:\n          type: number\n        wind_speed:\n          type: number\n        wind_direction:\n          type: number\n        weather_code:\n          type: integer\n      required:\n        - time\n        - temperature\n        - wind_speed\n        - wind_direction\n        - weather_code\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/pet-store.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"version\": \"1.0.0\",\n    \"title\": \"Swagger Petstore\",\n    \"license\": {\n      \"name\": \"MIT\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/v1\"\n    }\n  ],\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"summary\": \"List all pets\",\n        \"operationId\": \"listPets\",\n        \"tags\": [\"pets\"],\n        \"parameters\": [\n          {\n            \"name\": \"limit\",\n            \"in\": \"query\",\n            \"description\": \"How many items to return at one time (max 100)\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"maximum\": 100,\n              \"format\": \"int32\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A paged array of pets\",\n            \"headers\": {\n              \"x-next\": {\n                \"description\": \"A link to the next page of responses\",\n                \"schema\": {\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pets\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"summary\": \"Create a pet\",\n        \"operationId\": \"createPets\",\n        \"tags\": [\"pets\"],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/Pet\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"Null response\"\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pets/{petId}\": {\n      \"get\": {\n        \"summary\": \"Info for a specific pet\",\n        \"operationId\": \"showPetById\",\n        \"tags\": [\"pets\"],\n        \"parameters\": [\n          {\n            \"name\": \"petId\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"description\": \"The id of the pet to retrieve\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Expected response to a valid request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"Pet\": {\n        \"type\": \"object\",\n        \"required\": [\"id\", \"name\"],\n        \"properties\": {\n          \"id\": {\n            \"type\": \"integer\",\n            \"format\": \"int64\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"tag\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"Pets\": {\n        \"type\": \"array\",\n        \"maxItems\": 100,\n        \"items\": {\n          \"$ref\": \"#/components/schemas/Pet\"\n        }\n      },\n      \"Error\": {\n        \"type\": \"object\",\n        \"required\": [\"code\", \"message\"],\n        \"properties\": {\n          \"code\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"message\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/petstore-expanded.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"version\": \"1.0.0\",\n    \"title\": \"Swagger Petstore\",\n    \"description\": \"A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification\",\n    \"termsOfService\": \"http://swagger.io/terms/\",\n    \"contact\": {\n      \"name\": \"Swagger API Team\",\n      \"email\": \"apiteam@swagger.io\",\n      \"url\": \"http://swagger.io\"\n    },\n    \"license\": {\n      \"name\": \"Apache 2.0\",\n      \"url\": \"https://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/api\"\n    }\n  ],\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"description\": \"Returns all pets from the system that the user has access to\\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\\n\\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\",\n        \"operationId\": \"findPets\",\n        \"parameters\": [\n          {\n            \"name\": \"tags\",\n            \"in\": \"query\",\n            \"description\": \"tags to filter by\",\n            \"required\": false,\n            \"style\": \"form\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          {\n            \"name\": \"limit\",\n            \"in\": \"query\",\n            \"description\": \"maximum number of results to return\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"pet response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/Pet\"\n                  }\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"description\": \"Creates a new pet in the store. Duplicates are allowed\",\n        \"operationId\": \"addPet\",\n        \"requestBody\": {\n          \"description\": \"Pet to add to the store\",\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/NewPet\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"pet response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pets/{id}\": {\n      \"get\": {\n        \"description\": \"Returns a user based on a single ID, if the user does not have access to the pet\",\n        \"operationId\": \"find pet by id\",\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of pet to fetch\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"format\": \"int64\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"pet response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"description\": \"deletes a single pet based on the ID supplied\",\n        \"operationId\": \"deletePet\",\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of pet to delete\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"format\": \"int64\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"pet deleted\"\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"Pet\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/NewPet\"\n          },\n          {\n            \"type\": \"object\",\n            \"required\": [\"id\"],\n            \"properties\": {\n              \"id\": {\n                \"type\": \"integer\",\n                \"format\": \"int64\"\n              }\n            }\n          }\n        ]\n      },\n      \"NewPet\": {\n        \"type\": \"object\",\n        \"required\": [\"name\"],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"tag\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"Error\": {\n        \"type\": \"object\",\n        \"required\": [\"code\", \"message\"],\n        \"properties\": {\n          \"code\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"message\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/readme.json",
    "content": "{\n  \"openapi\": \"3.0.2\",\n  \"info\": {\n    \"description\": \"Create beautiful product and API documentation with our developer friendly platform.\",\n    \"version\": \"4.355.0\",\n    \"title\": \"ReadMe API 🦉\",\n    \"contact\": {\n      \"name\": \"API Support\",\n      \"url\": \"https://docs.readme.com/main/docs/need-more-support\",\n      \"email\": \"support@readme.io\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://dash.readme.com/api/v1\"\n    }\n  ],\n  \"tags\": [\n    {\n      \"name\": \"API Registry\"\n    },\n    {\n      \"name\": \"API Specification\"\n    },\n    {\n      \"name\": \"Apply to ReadMe\"\n    },\n    {\n      \"name\": \"Categories\"\n    },\n    {\n      \"name\": \"Changelog\"\n    },\n    {\n      \"name\": \"Custom Pages\"\n    },\n    {\n      \"name\": \"Docs\"\n    },\n    {\n      \"name\": \"Errors\"\n    },\n    {\n      \"name\": \"Projects\"\n    },\n    {\n      \"name\": \"Version\"\n    }\n  ],\n  \"paths\": {\n    \"/api-registry/{uuid}\": {\n      \"get\": {\n        \"operationId\": \"getAPIRegistry\",\n        \"summary\": \"Retrieve an entry from the API Registry\",\n        \"description\": \"Get an API definition file that's been uploaded to ReadMe.\",\n        \"tags\": [\"API Registry\"],\n        \"parameters\": [\n          {\n            \"name\": \"uuid\",\n            \"in\": \"path\",\n            \"description\": \"An API Registry UUID. This can be found by navigating to your API Reference page and viewing code snippets for Node with the `api` library.\",\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"required\": true\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successfully retrieved API registry entry.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\"\n                }\n              }\n            }\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_REGISTRY_NOTFOUND\"\n          }\n        }\n      }\n    },\n    \"/api-specification\": {\n      \"get\": {\n        \"operationId\": \"getAPISpecification\",\n        \"summary\": \"Get metadata\",\n        \"description\": \"Get API specification metadata.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successfully retrieved API specification metadata.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_VERSION_EMPTY\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"uploadAPISpecification\",\n        \"summary\": \"Upload specification\",\n        \"description\": \"Upload an API specification to ReadMe. Or, to use a newer solution see https://docs.readme.com/main/docs/rdme.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"multipart/form-data\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"spec\": {\n                    \"description\": \"OpenAPI/Swagger file. We accept JSON or YAML.\",\n                    \"type\": \"string\",\n                    \"format\": \"binary\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The API specification was successfully uploaded.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during upload.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_FILE_EMPTY\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID_SCHEMA\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_VERSION_NOTFOUND\"\n                    }\n                  ]\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"408\": {\n            \"$ref\": \"#/components/responses/error_SPEC_TIMEOUT\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/api-specification/{id}\": {\n      \"put\": {\n        \"operationId\": \"updateAPISpecification\",\n        \"summary\": \"Update specification\",\n        \"description\": \"Update an API specification in ReadMe.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of the API specification. The unique ID for each API can be found by navigating to your **API Definitions** page.\",\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"required\": true\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"multipart/form-data\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"spec\": {\n                    \"description\": \"OpenAPI/Swagger file. We accept JSON or YAML.\",\n                    \"type\": \"string\",\n                    \"format\": \"binary\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The API specification was updated.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during upload.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_FILE_EMPTY\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_ID_DUPLICATE\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_ID_INVALID\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID_SCHEMA\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_VERSION_NOTFOUND\"\n                    }\n                  ]\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"description\": \"There is no API specification with that ID.\"\n          },\n          \"408\": {\n            \"$ref\": \"#/components/responses/error_SPEC_TIMEOUT\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteAPISpecification\",\n        \"summary\": \"Delete specification\",\n        \"description\": \"Delete an API specification in ReadMe.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of the API specification. The unique ID for each API can be found by navigating to your **API Definitions** page.\",\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"required\": true\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The API specification was deleted.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_SPEC_ID_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_SPEC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/apply\": {\n      \"get\": {\n        \"operationId\": \"getOpenRoles\",\n        \"summary\": \"Get open roles\",\n        \"description\": \"Returns all the roles we're hiring for at ReadMe!\",\n        \"tags\": [\"Apply to ReadMe\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"All the roles that we're hiring for.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/jobOpening\"\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"operationId\": \"applyToReadMe\",\n        \"summary\": \"Submit your application!\",\n        \"description\": \"This endpoint will let you apply to a job at ReadMe programatically, without having to go through our UI!\",\n        \"tags\": [\"Apply to ReadMe\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/apply\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"You did it!\"\n          }\n        }\n      }\n    },\n    \"/categories\": {\n      \"get\": {\n        \"operationId\": \"getCategories\",\n        \"summary\": \"Get all categories\",\n        \"description\": \"Returns all the categories for a specified version.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The list of categories.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createCategory\",\n        \"summary\": \"Create category\",\n        \"description\": \"Create a new category inside of this project.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"allOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/category\"\n                  },\n                  {\n                    \"required\": [\"title\"]\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The category has successfully been created.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_INVALID\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/categories/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getCategory\",\n        \"summary\": \"Get category\",\n        \"description\": \"Returns the category with this slug.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The category exists and has been returned.\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateCategory\",\n        \"summary\": \"Update category\",\n        \"description\": \"Change the properties of a category.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/category\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The category was successfully updated.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_INVALID\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteCategory\",\n        \"summary\": \"Delete category\",\n        \"description\": \"Delete the category with this slug.\\n>⚠️Heads Up!\\n> This will also delete all of the docs within this category.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The category was deleted.\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/categories/{slug}/docs\": {\n      \"get\": {\n        \"operationId\": \"getCategoryDocs\",\n        \"summary\": \"Get docs for category\",\n        \"description\": \"Returns the docs and children docs within this category.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The category exists and all of the docs have been returned.\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/changelogs\": {\n      \"get\": {\n        \"operationId\": \"getChangelogs\",\n        \"summary\": \"Get changelogs\",\n        \"description\": \"Returns a list of changelogs.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The list of changelogs.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createChangelog\",\n        \"summary\": \"Create changelog\",\n        \"description\": \"Create a new changelog entry.\",\n        \"tags\": [\"Changelog\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/changelog\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The changelog was successfully created.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during creation.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/changelogs/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getChangelog\",\n        \"summary\": \"Get changelog\",\n        \"description\": \"Returns the changelog with this slug.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the changelog title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the changelog \\\"Owlet Update\\\", enter the slug \\\"owlet-update\\\".\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The changelog exists and has been returned.\"\n          },\n          \"404\": {\n            \"description\": \"There is no changelog with that slug.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateChangelog\",\n        \"summary\": \"Update changelog\",\n        \"description\": \"Update a changelog with this slug.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the changelog title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the changelog \\\"Owlet Weekly Update\\\", enter the slug \\\"owlet-weekly-update\\\".\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/changelog\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The changelog was successfully updated.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during update.\"\n          },\n          \"404\": {\n            \"description\": \"There is no changelog with that slug.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteChangelog\",\n        \"summary\": \"Delete changelog\",\n        \"description\": \"Delete the changelog with this slug.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the changelog title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the changelog \\\"Owlet Weekly Update\\\", enter the slug \\\"owlet-weekly-update\\\".\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The changelog was successfully updated.\"\n          },\n          \"404\": {\n            \"description\": \"There is no changelog with that slug.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/custompages\": {\n      \"get\": {\n        \"operationId\": \"getCustomPages\",\n        \"summary\": \"Get custom pages\",\n        \"description\": \"Returns a list of custom pages.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The list of custom pages.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createCustomPage\",\n        \"summary\": \"Create custom page\",\n        \"description\": \"Create a new custom page inside of this project.\",\n        \"tags\": [\"Custom Pages\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/customPage\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The custom page was successfully created.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/custompages/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getCustomPage\",\n        \"summary\": \"Get custom page\",\n        \"description\": \"Returns the custom page with this slug.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The custom page exists and has been returned.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateCustomPage\",\n        \"summary\": \"Update custom page\",\n        \"description\": \"Update a custom page with this slug.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/customPage\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The custom page was successfully updated.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteCustomPage\",\n        \"summary\": \"Delete custom page\",\n        \"description\": \"Delete the custom page with this slug.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The custom page was successfully updated.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getDoc\",\n        \"summary\": \"Get doc\",\n        \"description\": \"Returns the doc with this slug.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The doc exists and has been returned.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateDoc\",\n        \"summary\": \"Update doc\",\n        \"description\": \"Update a doc with this slug.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/docSchemaPut\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The doc was successfully updated.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_DOC_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteDoc\",\n        \"summary\": \"Delete doc\",\n        \"description\": \"Delete the doc with this slug.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The doc was successfully updated.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs/{slug}/production\": {\n      \"get\": {\n        \"operationId\": \"getProductionDoc\",\n        \"summary\": \"Get production doc\",\n        \"description\": \"This is intended for use by enterprise users with staging enabled. This endpoint will return the live version of your document, whereas the standard endpoint will always return staging.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The doc exists and has been returned.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs\": {\n      \"post\": {\n        \"operationId\": \"createDoc\",\n        \"summary\": \"Create doc\",\n        \"description\": \"Create a new doc inside of this project.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/docSchemaPost\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The doc was successfully created.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_DOC_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs/search\": {\n      \"post\": {\n        \"operationId\": \"searchDocs\",\n        \"summary\": \"Search docs\",\n        \"description\": \"Returns all docs that match the search.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"name\": \"search\",\n            \"in\": \"query\",\n            \"description\": \"Search string to look for.\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The search was successful and results were returned.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/\": {\n      \"get\": {\n        \"operationId\": \"getProject\",\n        \"summary\": \"Get metadata about the current project\",\n        \"description\": \"Returns project data for the API key.\",\n        \"tags\": [\"Projects\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Project data\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/condensedProjectData\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/schema\": {\n      \"get\": {\n        \"operationId\": \"getAPISchema\",\n        \"summary\": \"Get our OpenAPI Definition\",\n        \"description\": \"Returns a copy of our OpenAPI Definition.\",\n        \"tags\": [\"API Specification\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OpenAPI Definition data\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": true\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/version\": {\n      \"get\": {\n        \"operationId\": \"getVersions\",\n        \"summary\": \"Get versions\",\n        \"description\": \"Retrieve a list of versions associated with a project API key.\",\n        \"tags\": [\"Version\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A list of versions.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createVersion\",\n        \"summary\": \"Create version\",\n        \"description\": \"Create a new version.\",\n        \"tags\": [\"Version\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/version\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version was successfully created.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during creation.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/error_VERSION_EMPTY\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_VERSION_DUPLICATE\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_VERSION_FORK_EMPTY\"\n                    }\n                  ]\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_FORK_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/version/{versionId}\": {\n      \"get\": {\n        \"operationId\": \"getVersion\",\n        \"summary\": \"Get version\",\n        \"description\": \"Returns the version with this version ID.\",\n        \"tags\": [\"Version\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/versionId\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version exists and has been returned.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateVersion\",\n        \"summary\": \"Update version\",\n        \"description\": \"Update an existing version.\",\n        \"tags\": [\"Version\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/versionId\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/version\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version was successfully updated.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_VERSION_CANT_DEMOTE_STABLE\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteVersion\",\n        \"summary\": \"Delete version\",\n        \"description\": \"Delete a version\",\n        \"tags\": [\"Version\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/versionId\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version was successfully deleted.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_VERSION_CANT_REMOVE_STABLE\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    }\n  },\n  \"components\": {\n    \"securitySchemes\": {\n      \"apiKey\": {\n        \"type\": \"http\",\n        \"scheme\": \"basic\"\n      }\n    },\n    \"headers\": {\n      \"link\": {\n        \"description\": \"Pagination information. See https://docs.readme.com/main/reference/pagination for more information.\",\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      },\n      \"x-total-count\": {\n        \"description\": \"The total amount of results, ignoring pagination. See https://docs.readme.com/main/reference/pagination for more information about pagination.\",\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"parameters\": {\n      \"slug\": {\n        \"name\": \"slug\",\n        \"in\": \"path\",\n        \"description\": \"A URL-safe representation of the page title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the title \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n        \"required\": true,\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      },\n      \"page\": {\n        \"name\": \"page\",\n        \"in\": \"query\",\n        \"description\": \"Used to specify further pages (starts at 1).\",\n        \"schema\": {\n          \"type\": \"integer\",\n          \"default\": 1,\n          \"minimum\": 1\n        }\n      },\n      \"perPage\": {\n        \"name\": \"perPage\",\n        \"in\": \"query\",\n        \"description\": \"Number of items to include in pagination (up to 100, defaults to 10).\",\n        \"schema\": {\n          \"type\": \"integer\",\n          \"default\": 10,\n          \"minimum\": 1,\n          \"maximum\": 100\n        }\n      },\n      \"x-readme-version\": {\n        \"in\": \"header\",\n        \"name\": \"x-readme-version\",\n        \"description\": \"Version number of your docs project, for example, v3.0. By default the main project version is used. To see all valid versions for your docs project call https://docs.readme.com/main/reference/version#getversions.\",\n        \"example\": \"v3.0\",\n        \"required\": false,\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      },\n      \"versionId\": {\n        \"name\": \"versionId\",\n        \"in\": \"path\",\n        \"description\": \"Semver identifier for the project version. For best results, use the formatted `version_clean` value listed in the response from the [Get Versions endpoint](/reference/getversions).\",\n        \"example\": \"v1.0.0\",\n        \"required\": true,\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"responses\": {\n      \"authForbidden\": {\n        \"description\": \"Unauthorized\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/error_APIKEY_MISMATCH\"\n                }\n              ]\n            }\n          }\n        }\n      },\n      \"authUnauthorized\": {\n        \"description\": \"Unauthorized\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/error_APIKEY_EMPTY\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/error_APIKEY_NOTFOUND\"\n                }\n              ]\n            }\n          }\n        }\n      },\n      \"error_APIKEY_EMPTY\": {\n        \"description\": \"An API key was not supplied.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APIKEY_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_APIKEY_MISMATCH\": {\n        \"description\": \"The API key doesn't match the project.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APIKEY_MISMATCH\"\n            }\n          }\n        }\n      },\n      \"error_APIKEY_NOTFOUND\": {\n        \"description\": \"The API key couldn't be located.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APIKEY_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_APPLY_INVALID_EMAIL\": {\n        \"description\": \"You need to provide a valid email.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APPLY_INVALID_EMAIL\"\n            }\n          }\n        }\n      },\n      \"error_APPLY_INVALID_JOB\": {\n        \"description\": \"You need to provide a job.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APPLY_INVALID_JOB\"\n            }\n          }\n        }\n      },\n      \"error_APPLY_INVALID_NAME\": {\n        \"description\": \"You need to provide a name.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APPLY_INVALID_NAME\"\n            }\n          }\n        }\n      },\n      \"error_CATEGORY_INVALID\": {\n        \"description\": \"The category couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CATEGORY_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_CATEGORY_NOTFOUND\": {\n        \"description\": \"The category couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CATEGORY_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_CHANGELOG_INVALID\": {\n        \"description\": \"The changelog couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CHANGELOG_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_CHANGELOG_NOTFOUND\": {\n        \"description\": \"The changelog couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CHANGELOG_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_CUSTOMPAGE_INVALID\": {\n        \"description\": \"The page couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CUSTOMPAGE_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_CUSTOMPAGE_NOTFOUND\": {\n        \"description\": \"The custom page couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CUSTOMPAGE_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_DOC_INVALID\": {\n        \"description\": \"The doc couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_DOC_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_DOC_NOTFOUND\": {\n        \"description\": \"The doc couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_DOC_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_ENDPOINT_NOTFOUND\": {\n        \"description\": \"The endpoint doesn't exist.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_ENDPOINT_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_INTERNAL_ERROR\": {\n        \"description\": \"An unknown error has occurred.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_INTERNAL_ERROR\"\n            }\n          }\n        }\n      },\n      \"error_PROJECT_NEEDSSTAGING\": {\n        \"description\": \"The project does not have staging enabled.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_PROJECT_NEEDSSTAGING\"\n            }\n          }\n        }\n      },\n      \"error_PROJECT_NOTFOUND\": {\n        \"description\": \"The project couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_PROJECT_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_RATE_LIMITED\": {\n        \"description\": \"The request has been rate limited.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_RATE_LIMITED\"\n            }\n          }\n        }\n      },\n      \"error_REGISTRY_INVALID\": {\n        \"description\": \"The registry entry couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_REGISTRY_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_REGISTRY_NOTFOUND\": {\n        \"description\": \"The registry entry couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_REGISTRY_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_FILE_EMPTY\": {\n        \"description\": \"A spec file wasn't included.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_FILE_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_ID_DUPLICATE\": {\n        \"description\": \"The spec ID already tied to another version.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_ID_DUPLICATE\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_ID_INVALID\": {\n        \"description\": \"The spec ID isn't valid.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_ID_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_INVALID\": {\n        \"description\": \"The uploaded spec isn't valid JSON or YAML.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_INVALID_SCHEMA\": {\n        \"description\": \"The uploaded spec has OpenAPI validation errors.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_INVALID_SCHEMA\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_NOTFOUND\": {\n        \"description\": \"The spec couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_TIMEOUT\": {\n        \"description\": \"The spec upload timed out.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_TIMEOUT\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_VERSION_NOTFOUND\": {\n        \"description\": \"The spec version couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_VERSION_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_UNEXPECTED_ERROR\": {\n        \"description\": \"An unknown error has occurred.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_UNEXPECTED_ERROR\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_CANT_DEMOTE_STABLE\": {\n        \"description\": \"A stable version can't be demoted.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_CANT_DEMOTE_STABLE\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_CANT_REMOVE_STABLE\": {\n        \"description\": \"A stable version can't be removed.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_CANT_REMOVE_STABLE\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_DUPLICATE\": {\n        \"description\": \"The version already exists.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_DUPLICATE\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_EMPTY\": {\n        \"description\": \"No version was supplied.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_FORK_EMPTY\": {\n        \"description\": \"New versions need to be forked from an existing version.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_FORK_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_FORK_NOTFOUND\": {\n        \"description\": \"The version couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_FORK_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_INVALID\": {\n        \"description\": \"The version is invalid.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_NOTFOUND\": {\n        \"description\": \"The version couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_NOTFOUND\"\n            }\n          }\n        }\n      }\n    },\n    \"schemas\": {\n      \"baseError\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"error\": {\n            \"type\": \"string\",\n            \"description\": \"An error code unique to the error received.\"\n          },\n          \"message\": {\n            \"type\": \"string\",\n            \"description\": \"The reason why the error occured.\"\n          },\n          \"suggestion\": {\n            \"type\": \"string\",\n            \"description\": \"A helpful suggestion for how to alleviate the error.\"\n          },\n          \"docs\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"A [ReadMe Metrics](https://readme.com/metrics/) log URL where you can see more information the request that you made. If we have metrics URLs unavailable for your request, this URL will be a URL to our API Reference.\",\n            \"example\": \"https://docs.readme.com/logs/6883d0ee-cf79-447a-826f-a48f7d5bdf5f\"\n          },\n          \"help\": {\n            \"type\": \"string\",\n            \"description\": \"Information on where you can receive additional assistance from our wonderful support team.\",\n            \"example\": \"If you need help, email support@readme.io\"\n          },\n          \"poem\": {\n            \"type\": \"array\",\n            \"description\": \"A short poem we wrote you about your error.\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"example\": [\n              \"If you're seeing this error,\",\n              \"Things didn't quite go the way we hoped.\",\n              \"When we tried to process your request,\",\n              \"Maybe trying again it'll work—who knows!\"\n            ]\n          }\n        }\n      },\n      \"apply\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"description\": \"Your full name\",\n            \"default\": \"Your Name\"\n          },\n          \"email\": {\n            \"type\": \"string\",\n            \"format\": \"email\",\n            \"description\": \"A valid email we can reach you at.\",\n            \"default\": \"you@example.com\"\n          },\n          \"job\": {\n            \"type\": \"string\",\n            \"description\": \"The job you're looking to apply for (https://readme.com/careers).\",\n            \"enum\": [\n              \"Front End Engineer\",\n              \"Full Stack Engineer\",\n              \"Head of Product\",\n              \"Head of Solutions Engineering\",\n              \"Product Designer\"\n            ],\n            \"default\": \"Front End Engineer\"\n          },\n          \"pronouns\": {\n            \"type\": \"string\",\n            \"description\": \"Learn more at https://lgbtlifecenter.org/pronouns/\"\n          },\n          \"linkedin\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"What have you been up to the past few years?\"\n          },\n          \"github\": {\n            \"type\": \"string\",\n            \"description\": \"Or Bitbucket, Gitlab or anywhere else your code is hosted!\",\n            \"format\": \"url\"\n          },\n          \"coverLetter\": {\n            \"type\": \"string\",\n            \"format\": \"blob\",\n            \"description\": \"What should we know about you?\"\n          },\n          \"dontReallyApply\": {\n            \"type\": \"boolean\",\n            \"description\": \"Want to play with the API but not actually apply? Set this to true.\",\n            \"default\": false\n          }\n        },\n        \"required\": [\"name\", \"email\", \"job\"]\n      },\n      \"category\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"A short title for the category. This is what will show in the sidebar.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"reference\", \"guide\"],\n            \"default\": \"guide\",\n            \"description\": \"A category can be part of your reference or guide documentation, which is determined by this field.\"\n          }\n        }\n      },\n      \"changelog\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the changelog.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"default\": \"\",\n            \"enum\": [\"\", \"added\", \"fixed\", \"improved\", \"deprecated\", \"removed\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the changelog.\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the changelog.\",\n            \"default\": true\n          }\n        },\n        \"required\": [\"title\", \"body\"]\n      },\n      \"condensedProjectData\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"subdomain\": {\n            \"type\": \"string\"\n          },\n          \"jwtSecret\": {\n            \"type\": \"string\"\n          },\n          \"baseUrl\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"The base URL for the project. If the project is not running under a custom domain, it will be `https://projectSubdomain.readme.io`, otherwise it can either be or `https://example.com` or, in the case of an enterprise child project `https://example.com/projectSubdomain`.\"\n          },\n          \"plan\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"customPage\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the custom page.\"\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body formatted in Markdown (displayed by default).\"\n          },\n          \"html\": {\n            \"type\": \"string\",\n            \"description\": \"Body formatted in HTML (sanitized, only displayed if `htmlmode` is **true**).\"\n          },\n          \"htmlmode\": {\n            \"type\": \"boolean\",\n            \"description\": \"**true** if `html` should be displayed, **false** if `body` should be displayed.\",\n            \"default\": false\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the custom page.\",\n            \"default\": true\n          }\n        },\n        \"required\": [\"title\"]\n      },\n      \"docSchemaPost\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the page.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"description\": \"Type of the page. The available types all show up under the /docs/ URL path of your docs project (also known as the \\\"guides\\\" section). Can be \\\"basic\\\" (most common), \\\"error\\\" (page desribing an API error), or \\\"link\\\" (page that redirects to an external link).\",\n            \"enum\": [\"basic\", \"error\", \"link\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the page, formatted in [ReadMe-flavored Markdown](https://docs.readme.com/rdmd/docs).\"\n          },\n          \"category\": {\n            \"type\": \"string\",\n            \"description\": \"Category ID of the page, which you can get through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories).\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the page.\"\n          },\n          \"order\": {\n            \"type\": \"integer\",\n            \"description\": \"The position of the page in your project sidebar.\",\n            \"example\": 999\n          },\n          \"parentDoc\": {\n            \"type\": \"string\",\n            \"description\": \"The parent doc's ID, if the page is a subpage.\"\n          },\n          \"error\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"code\": {\n                \"type\": \"string\",\n                \"description\": \"The error code for docs with the \\\"error\\\" type.\"\n              }\n            }\n          },\n          \"categorySlug\": {\n            \"type\": \"string\",\n            \"description\": \"The slug of the category this page is associated with. You can get this through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories). This field is an alternative to the `category` field.\"\n          },\n          \"parentDocSlug\": {\n            \"type\": \"string\",\n            \"description\": \"If this page is a subpage, this field will be the slug of the parent document. You can get this through https://docs.readme.com/main/reference/docs#getdoc. This field is an alternative to the `parentDoc` field.\"\n          }\n        },\n        \"oneOf\": [\n          {\n            \"required\": [\"title\", \"category\"],\n            \"title\": \"`category` Parameter\"\n          },\n          {\n            \"required\": [\"title\", \"categorySlug\"],\n            \"title\": \"`categorySlug` Parameter\"\n          }\n        ],\n        \"additionalProperties\": true\n      },\n      \"docSchemaPut\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the page.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"description\": \"Type of the page. The available types all show up under the /docs/ URL path of your docs project (also known as the \\\"guides\\\" section). Can be \\\"basic\\\" (most common), \\\"error\\\" (page desribing an API error), or \\\"link\\\" (page that redirects to an external link).\",\n            \"enum\": [\"basic\", \"error\", \"link\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the page, formatted in [ReadMe-flavored Markdown](https://docs.readme.com/rdmd/docs).\"\n          },\n          \"category\": {\n            \"type\": \"string\",\n            \"description\": \"Category ID of the page, which you can get through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories).\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the page.\"\n          },\n          \"order\": {\n            \"type\": \"integer\",\n            \"description\": \"The position of the page in your project sidebar.\",\n            \"example\": 999\n          },\n          \"parentDoc\": {\n            \"type\": \"string\",\n            \"description\": \"The parent doc's ID, if the page is a subpage.\"\n          },\n          \"error\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"code\": {\n                \"type\": \"string\",\n                \"description\": \"The error code for docs with the \\\"error\\\" type.\"\n              }\n            }\n          },\n          \"categorySlug\": {\n            \"type\": \"string\",\n            \"description\": \"The slug of the category this page is associated with. You can get this through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories). This field is an alternative to the `category` field.\"\n          },\n          \"parentDocSlug\": {\n            \"type\": \"string\",\n            \"description\": \"If this page is a subpage, this field will be the slug of the parent document. You can get this through https://docs.readme.com/main/reference/docs#getdoc. This field is an alternative to the `parentDoc` field.\"\n          }\n        },\n        \"additionalProperties\": true\n      },\n      \"docSchemaResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the page.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"description\": \"Type of the page. The available types all show up under the /docs/ URL path of your docs project (also known as the \\\"guides\\\" section). Can be \\\"basic\\\" (most common), \\\"error\\\" (page desribing an API error), or \\\"link\\\" (page that redirects to an external link).\",\n            \"enum\": [\"basic\", \"error\", \"link\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the page, formatted in [ReadMe-flavored Markdown](https://docs.readme.com/rdmd/docs).\"\n          },\n          \"category\": {\n            \"type\": \"string\",\n            \"description\": \"Category ID of the page, which you can get through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories).\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the page.\"\n          },\n          \"order\": {\n            \"type\": \"integer\",\n            \"description\": \"The position of the page in your project sidebar.\",\n            \"example\": 999\n          },\n          \"parentDoc\": {\n            \"type\": \"string\",\n            \"description\": \"The parent doc's ID, if the page is a subpage.\"\n          },\n          \"error\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"code\": {\n                \"type\": \"string\",\n                \"description\": \"The error code for docs with the \\\"error\\\" type.\"\n              }\n            }\n          }\n        },\n        \"additionalProperties\": true\n      },\n      \"version\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Semantic Version\"\n          },\n          \"codename\": {\n            \"type\": \"string\",\n            \"description\": \"Dubbed name of version.\"\n          },\n          \"from\": {\n            \"type\": \"string\",\n            \"description\": \"Semantic Version to use as the base fork.\"\n          },\n          \"is_stable\": {\n            \"type\": \"boolean\",\n            \"description\": \"Should this be the **main** version?\"\n          },\n          \"is_beta\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"is_hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Should this be publically accessible?\"\n          },\n          \"is_deprecated\": {\n            \"type\": \"boolean\",\n            \"description\": \"Should this be deprecated? Only allowed in PUT operations.\"\n          }\n        },\n        \"required\": [\"version\", \"from\"]\n      },\n      \"jobOpening\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"slug\": {\n            \"type\": \"string\",\n            \"description\": \"A slugified version of the job opening title.\",\n            \"example\": \"api-engineer\"\n          },\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"The job opening position.\",\n            \"example\": \"API Engineer\"\n          },\n          \"description\": {\n            \"type\": \"string\",\n            \"description\": \"The description for this open position. This content is formatted as HTML.\"\n          },\n          \"pullquote\": {\n            \"type\": \"string\",\n            \"description\": \"A short pullquote for the open position.\",\n            \"example\": \"Deeply knowledgeable of the web, HTTP, and the API space.\"\n          },\n          \"location\": {\n            \"type\": \"string\",\n            \"description\": \"Where this position is located at.\",\n            \"example\": \"Remote\"\n          },\n          \"department\": {\n            \"type\": \"string\",\n            \"description\": \"The internal organization you'll be working in.\",\n            \"example\": \"Engineering\"\n          },\n          \"url\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"The place where you can apply for the position!\"\n          }\n        }\n      },\n      \"error_APIKEY_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APIKEY_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APIKEY_MISMATCH\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APIKEY_MISMATCH\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APIKEY_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APIKEY_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APPLY_INVALID_EMAIL\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APPLY_INVALID_EMAIL\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APPLY_INVALID_JOB\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APPLY_INVALID_JOB\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APPLY_INVALID_NAME\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APPLY_INVALID_NAME\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CATEGORY_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CATEGORY_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CATEGORY_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CATEGORY_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CHANGELOG_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CHANGELOG_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CHANGELOG_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CHANGELOG_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CUSTOMPAGE_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CUSTOMPAGE_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CUSTOMPAGE_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CUSTOMPAGE_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_DOC_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"DOC_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_DOC_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"DOC_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_ENDPOINT_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"ENDPOINT_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_INTERNAL_ERROR\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"INTERNAL_ERROR\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_PROJECT_NEEDSSTAGING\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"PROJECT_NEEDSSTAGING\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_PROJECT_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"PROJECT_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_RATE_LIMITED\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"RATE_LIMITED\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_REGISTRY_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"REGISTRY_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_REGISTRY_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"REGISTRY_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_FILE_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_FILE_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_ID_DUPLICATE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_ID_DUPLICATE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_ID_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_ID_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_INVALID_SCHEMA\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_INVALID_SCHEMA\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_TIMEOUT\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_TIMEOUT\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_VERSION_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_VERSION_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_UNEXPECTED_ERROR\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"UNEXPECTED_ERROR\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_CANT_DEMOTE_STABLE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_CANT_DEMOTE_STABLE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_CANT_REMOVE_STABLE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_CANT_REMOVE_STABLE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_DUPLICATE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_DUPLICATE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_FORK_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_FORK_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_FORK_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_FORK_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/security.json",
    "content": "{\n  \"openapi\": \"3.0.3\",\n  \"info\": {\n    \"version\": \"1.0.0\",\n    \"title\": \"Support for different security types\",\n    \"description\": \"https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#securitySchemeObject\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://httpbin.org\"\n    }\n  ],\n  \"tags\": [\n    {\n      \"name\": \"API Key\"\n    },\n    {\n      \"name\": \"HTTP\"\n    },\n    {\n      \"name\": \"OAuth 2\"\n    },\n    {\n      \"name\": \"OpenID Connect\"\n    },\n    {\n      \"name\": \"Other\"\n    }\n  ],\n  \"paths\": {\n    \"/anything/apiKey\": {\n      \"get\": {\n        \"summary\": \"Query parameter\",\n        \"description\": \"`apiKey` auth will be supplied within an `apiKey` query parameter.\",\n        \"tags\": [\"API Key\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"summary\": \"Cookie\",\n        \"description\": \"`apiKey` auth will be supplied within an `api_key` cookie.\",\n        \"tags\": [\"API Key\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_cookie\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"Header\",\n        \"description\": \"`apiKey` auth will be supplied within an `X-API-KEY` header.\",\n        \"tags\": [\"API Key\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": []\n          }\n        ]\n      }\n    },\n    \"/anything/basic\": {\n      \"post\": {\n        \"summary\": \"Basic\",\n        \"description\": \"Authentication credentials will be supplied within a `Basic` `Authorization` header.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"tags\": [\"HTTP\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"basic\": []\n          }\n        ]\n      }\n    },\n    \"/anything/bearer\": {\n      \"post\": {\n        \"summary\": \"Bearer\",\n        \"description\": \"Authentication credentials will be supplied within a `Bearer` `Authorization` header.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"tags\": [\"HTTP\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"bearer\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"Bearer (`jwt` format)\",\n        \"description\": \"Authentication credentials will be supplied within a `Bearer` `Authorization` header, but its data should be controlled as a JWT.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\\n\\n> ℹ️\\n> We currently do not support any special handling for this so they're handled as a standard `Bearer` authentication token.\",\n        \"tags\": [\"HTTP\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"bearer_jwt\": []\n          }\n        ]\n      }\n    },\n    \"/anything/oauth2\": {\n      \"post\": {\n        \"summary\": \"General support (all flow types)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2\": [\"write:things\"]\n          }\n        ]\n      },\n      \"get\": {\n        \"summary\": \"General support (authorizationCode flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_authorizationCode\": [\"write:things\"]\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"General support (clientCredentials flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_clientCredentials\": [\"write:things\"]\n          }\n        ]\n      },\n      \"patch\": {\n        \"summary\": \"General support (implicit flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_implicit\": [\"write:things\"]\n          }\n        ]\n      },\n      \"delete\": {\n        \"summary\": \"General support (password flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_password\": [\"write:things\"]\n          }\n        ]\n      }\n    },\n    \"/anything/openIdConnect\": {\n      \"post\": {\n        \"summary\": \"General support\",\n        \"description\": \"🚧 This is not supported.\",\n        \"tags\": [\"OpenID Connect\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"openIdConnect\": []\n          }\n        ]\n      }\n    },\n    \"/anything/no-auth\": {\n      \"post\": {\n        \"summary\": \"No auth requirements\",\n        \"description\": \"This operation does not have any authentication requirements.\",\n        \"tags\": [\"Other\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        }\n      }\n    },\n    \"/anything/optional-auth\": {\n      \"get\": {\n        \"summary\": \"Optional auth\",\n        \"description\": \"The `apiKey` query parameter auth on this operation is optional.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object\",\n        \"tags\": [\"Other\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": []\n          },\n          {}\n        ]\n      }\n    },\n    \"/status/401\": {\n      \"post\": {\n        \"summary\": \"Forced invalid authentication\",\n        \"description\": \"This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\",\n        \"tags\": [\"Other\"],\n        \"responses\": {\n          \"401\": {\n            \"description\": \"Unauthorized\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": []\n          }\n        ]\n      }\n    }\n  },\n  \"components\": {\n    \"securitySchemes\": {\n      \"apiKey_cookie\": {\n        \"type\": \"apiKey\",\n        \"in\": \"cookie\",\n        \"name\": \"api_key\",\n        \"description\": \"An API key that will be supplied in a named cookie. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\"\n      },\n      \"apiKey_header\": {\n        \"type\": \"apiKey\",\n        \"in\": \"header\",\n        \"name\": \"X-API-KEY\",\n        \"description\": \"An API key that will be supplied in a named header. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\"\n      },\n      \"apiKey_query\": {\n        \"type\": \"apiKey\",\n        \"in\": \"query\",\n        \"name\": \"apiKey\",\n        \"description\": \"An API key that will be supplied in a named query parameter. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\"\n      },\n      \"basic\": {\n        \"type\": \"http\",\n        \"scheme\": \"basic\",\n        \"description\": \"Basic auth that takes a base64'd combination of `user:password`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\"\n      },\n      \"bearer\": {\n        \"type\": \"http\",\n        \"scheme\": \"bearer\",\n        \"description\": \"A bearer token that will be supplied within an `Authentication` header as `bearer <token>`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\"\n      },\n      \"bearer_jwt\": {\n        \"type\": \"http\",\n        \"scheme\": \"bearer\",\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"A bearer token that will be supplied within an `Authentication` header as `bearer <token>`. In this case, the format of the token is specified as JWT. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#jwt-bearer-sample\"\n      },\n      \"oauth2\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          },\n          \"clientCredentials\": {\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          },\n          \"implicit\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          },\n          \"password\": {\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_authorizationCode\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `authorizationCode` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_clientCredentials\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `clientCredentials` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_implicit\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `implicit` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"implicit\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_password\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `password` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"password\": {\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"openIdConnect\": {\n        \"type\": \"openIdConnect\",\n        \"openIdConnectUrl\": \"https://example.com/.well-known/openid-configuration\",\n        \"description\": \"OpenAPI authentication. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/stripe.json",
    "content": "{\n  \"components\": {\n    \"schemas\": {\n      \"account\": {\n        \"description\": \"This is an object representing a Stripe account. You can retrieve it to see\\nproperties on the account like its current requirements or if the account is\\nenabled to make live charges or receive payouts.\\n\\nFor accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection)\\nis `application`, which includes Custom accounts, the properties below are always\\nreturned.\\n\\nFor accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection)\\nis `stripe`, which includes Standard and Express accounts, some properties are only returned\\nuntil you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions)\\nto start Connect Onboarding. Learn about the [differences between accounts](/connect/accounts).\",\n        \"properties\": {\n          \"business_profile\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/account_business_profile\"\n              }\n            ],\n            \"description\": \"Business information about the account.\",\n            \"nullable\": true\n          },\n          \"business_type\": {\n            \"description\": \"The business type. After you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property is only returned for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n            \"enum\": [\n              \"company\",\n              \"government_entity\",\n              \"individual\",\n              \"non_profit\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"capabilities\": {\n            \"$ref\": \"#/components/schemas/account_capabilities\"\n          },\n          \"charges_enabled\": {\n            \"description\": \"Whether the account can process charges.\",\n            \"type\": \"boolean\"\n          },\n          \"company\": {\n            \"$ref\": \"#/components/schemas/legal_entity_company\"\n          },\n          \"controller\": {\n            \"$ref\": \"#/components/schemas/account_unification_account_controller\"\n          },\n          \"country\": {\n            \"description\": \"The account's country.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the account was connected. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"default_currency\": {\n            \"description\": \"Three-letter ISO currency code representing the default currency for the account. This must be a currency that [Stripe supports in the account's country](https://stripe.com/docs/payouts).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"details_submitted\": {\n            \"description\": \"Whether account details have been submitted. Accounts with Stripe Dashboard access, which includes Standard accounts, cannot receive payouts before this is true. Accounts where this is false should be directed to [an onboarding flow](/connect/onboarding) to finish submitting account details.\",\n            \"type\": \"boolean\"\n          },\n          \"email\": {\n            \"description\": \"An email address associated with the account. It's not used for authentication and Stripe doesn't market to this field without explicit approval from the platform.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"external_accounts\": {\n            \"description\": \"External accounts (bank accounts and debit cards) currently attached to this account. External accounts are only returned for requests where `controller[is_controller]` is true.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"The list contains all external accounts that have been attached to the Stripe account. These may be bank accounts or cards.\",\n                \"items\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/bank_account\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/card\"\n                    }\n                  ],\n                  \"title\": \"Polymorphic\",\n                  \"x-stripeBypassValidation\": true\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"ExternalAccountList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"future_requirements\": {\n            \"$ref\": \"#/components/schemas/account_future_requirements\"\n          },\n          \"groups\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/account_group_membership\"\n              }\n            ],\n            \"description\": \"The groups associated with the account.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"individual\": {\n            \"$ref\": \"#/components/schemas/person\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"account\"],\n            \"type\": \"string\"\n          },\n          \"payouts_enabled\": {\n            \"description\": \"Whether the funds in this account can be paid out.\",\n            \"type\": \"boolean\"\n          },\n          \"requirements\": {\n            \"$ref\": \"#/components/schemas/account_requirements\"\n          },\n          \"settings\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/account_settings\"\n              }\n            ],\n            \"description\": \"Options for customizing how the account functions within Stripe.\",\n            \"nullable\": true\n          },\n          \"tos_acceptance\": {\n            \"$ref\": \"#/components/schemas/account_tos_acceptance\"\n          },\n          \"type\": {\n            \"description\": \"The Stripe account type. Can be `standard`, `express`, `custom`, or `none`.\",\n            \"enum\": [\"custom\", \"express\", \"none\", \"standard\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"object\"],\n        \"title\": \"Account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"business_profile\",\n          \"capabilities\",\n          \"company\",\n          \"controller\",\n          \"external_accounts\",\n          \"future_requirements\",\n          \"groups\",\n          \"individual\",\n          \"requirements\",\n          \"settings\",\n          \"tos_acceptance\"\n        ],\n        \"x-resourceId\": \"account\"\n      },\n      \"account_annual_revenue\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"A non-negative integer representing the amount in the [smallest currency unit](/currencies#zero-decimal).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fiscal_year_end\": {\n            \"description\": \"The close-out date of the preceding fiscal year in ISO 8601 format. E.g. 2023-12-31 for the 31st of December, 2023.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountAnnualRevenue\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_bacs_debit_payments_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"display_name\": {\n            \"description\": \"The Bacs Direct Debit display name for this account. For payments made with Bacs Direct Debit, this name appears on the mandate as the statement descriptor. Mobile banking apps display it as the name of the business. To use custom branding, set the Bacs Direct Debit Display Name during or right after creation. Custom branding incurs an additional monthly fee for the platform. The fee appears 5 business days after requesting Bacs. If you don't set the display name before requesting Bacs capability, it's automatically set as \\\"Stripe\\\" and the account is onboarded to Stripe branding, which is free.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"service_user_number\": {\n            \"description\": \"The Bacs Direct Debit Service user number for this account. For payments made with Bacs Direct Debit, this number is a unique identifier of the account with our banking partners.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountBacsDebitPaymentsSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_branding_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"icon\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) An icon for the account. Must be square and at least 128px x 128px.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"logo\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) A logo for the account that will be used in Checkout instead of the icon and without the account's name next to it if provided. Must be at least 128px x 128px.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"primary_color\": {\n            \"description\": \"A CSS hex color value representing the primary branding color for this account\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"secondary_color\": {\n            \"description\": \"A CSS hex color value representing the secondary branding color for this account\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountBrandingSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"icon\", \"logo\"]\n      },\n      \"account_business_profile\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"annual_revenue\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/account_annual_revenue\"\n              }\n            ],\n            \"description\": \"The applicant's gross annual revenue for its preceding fiscal year.\",\n            \"nullable\": true\n          },\n          \"estimated_worker_count\": {\n            \"description\": \"An estimated upper bound of employees, contractors, vendors, etc. currently working for the business.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"mcc\": {\n            \"description\": \"[The merchant category code for the account](/connect/setting-mcc). MCCs are used to classify businesses based on the goods or services they provide.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"monthly_estimated_revenue\": {\n            \"$ref\": \"#/components/schemas/account_monthly_estimated_revenue\"\n          },\n          \"name\": {\n            \"description\": \"The customer-facing business name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_description\": {\n            \"description\": \"Internal-only description of the product sold or service provided by the business. It's used by Stripe for risk and underwriting purposes.\",\n            \"maxLength\": 40000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"support_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"A publicly available mailing address for sending support issues to.\",\n            \"nullable\": true\n          },\n          \"support_email\": {\n            \"description\": \"A publicly available email address for sending support issues to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"support_phone\": {\n            \"description\": \"A publicly available phone number to call with support issues.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"support_url\": {\n            \"description\": \"A publicly available website for handling support issues.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The business's publicly available website.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountBusinessProfile\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"annual_revenue\",\n          \"monthly_estimated_revenue\",\n          \"support_address\"\n        ]\n      },\n      \"account_capabilities\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit_payments\": {\n            \"description\": \"The status of the Canadian pre-authorized debits payments capability of the account, or whether the account can directly process Canadian pre-authorized debits charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"affirm_payments\": {\n            \"description\": \"The status of the Affirm capability of the account, or whether the account can directly process Affirm charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"afterpay_clearpay_payments\": {\n            \"description\": \"The status of the Afterpay Clearpay capability of the account, or whether the account can directly process Afterpay Clearpay charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"alma_payments\": {\n            \"description\": \"The status of the Alma capability of the account, or whether the account can directly process Alma payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"amazon_pay_payments\": {\n            \"description\": \"The status of the AmazonPay capability of the account, or whether the account can directly process AmazonPay payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"au_becs_debit_payments\": {\n            \"description\": \"The status of the BECS Direct Debit (AU) payments capability of the account, or whether the account can directly process BECS Direct Debit (AU) charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"bacs_debit_payments\": {\n            \"description\": \"The status of the Bacs Direct Debits payments capability of the account, or whether the account can directly process Bacs Direct Debits charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"bancontact_payments\": {\n            \"description\": \"The status of the Bancontact payments capability of the account, or whether the account can directly process Bancontact charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"bank_transfer_payments\": {\n            \"description\": \"The status of the customer_balance payments capability of the account, or whether the account can directly process customer_balance charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"blik_payments\": {\n            \"description\": \"The status of the blik payments capability of the account, or whether the account can directly process blik charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"boleto_payments\": {\n            \"description\": \"The status of the boleto payments capability of the account, or whether the account can directly process boleto charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"card_issuing\": {\n            \"description\": \"The status of the card issuing capability of the account, or whether you can use Issuing to distribute funds on cards\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"card_payments\": {\n            \"description\": \"The status of the card payments capability of the account, or whether the account can directly process credit and debit card charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"cartes_bancaires_payments\": {\n            \"description\": \"The status of the Cartes Bancaires payments capability of the account, or whether the account can directly process Cartes Bancaires card charges in EUR currency.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"cashapp_payments\": {\n            \"description\": \"The status of the Cash App Pay capability of the account, or whether the account can directly process Cash App Pay payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"eps_payments\": {\n            \"description\": \"The status of the EPS payments capability of the account, or whether the account can directly process EPS charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"fpx_payments\": {\n            \"description\": \"The status of the FPX payments capability of the account, or whether the account can directly process FPX charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"gb_bank_transfer_payments\": {\n            \"description\": \"The status of the GB customer_balance payments (GBP currency) capability of the account, or whether the account can directly process GB customer_balance charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"giropay_payments\": {\n            \"description\": \"The status of the giropay payments capability of the account, or whether the account can directly process giropay charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"grabpay_payments\": {\n            \"description\": \"The status of the GrabPay payments capability of the account, or whether the account can directly process GrabPay charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"ideal_payments\": {\n            \"description\": \"The status of the iDEAL payments capability of the account, or whether the account can directly process iDEAL charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"india_international_payments\": {\n            \"description\": \"The status of the india_international_payments capability of the account, or whether the account can process international charges (non INR) in India.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"jcb_payments\": {\n            \"description\": \"The status of the JCB payments capability of the account, or whether the account (Japan only) can directly process JCB credit card charges in JPY currency.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"jp_bank_transfer_payments\": {\n            \"description\": \"The status of the Japanese customer_balance payments (JPY currency) capability of the account, or whether the account can directly process Japanese customer_balance charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"kakao_pay_payments\": {\n            \"description\": \"The status of the KakaoPay capability of the account, or whether the account can directly process KakaoPay payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"klarna_payments\": {\n            \"description\": \"The status of the Klarna payments capability of the account, or whether the account can directly process Klarna charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"konbini_payments\": {\n            \"description\": \"The status of the konbini payments capability of the account, or whether the account can directly process konbini charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"kr_card_payments\": {\n            \"description\": \"The status of the KrCard capability of the account, or whether the account can directly process KrCard payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"legacy_payments\": {\n            \"description\": \"The status of the legacy payments capability of the account.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"link_payments\": {\n            \"description\": \"The status of the link_payments capability of the account, or whether the account can directly process Link charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"mobilepay_payments\": {\n            \"description\": \"The status of the MobilePay capability of the account, or whether the account can directly process MobilePay charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"multibanco_payments\": {\n            \"description\": \"The status of the Multibanco payments capability of the account, or whether the account can directly process Multibanco charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"mx_bank_transfer_payments\": {\n            \"description\": \"The status of the Mexican customer_balance payments (MXN currency) capability of the account, or whether the account can directly process Mexican customer_balance charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"naver_pay_payments\": {\n            \"description\": \"The status of the NaverPay capability of the account, or whether the account can directly process NaverPay payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"oxxo_payments\": {\n            \"description\": \"The status of the OXXO payments capability of the account, or whether the account can directly process OXXO charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"p24_payments\": {\n            \"description\": \"The status of the P24 payments capability of the account, or whether the account can directly process P24 charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"pay_by_bank_payments\": {\n            \"description\": \"The status of the pay_by_bank payments capability of the account, or whether the account can directly process pay_by_bank charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"payco_payments\": {\n            \"description\": \"The status of the Payco capability of the account, or whether the account can directly process Payco payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"paynow_payments\": {\n            \"description\": \"The status of the paynow payments capability of the account, or whether the account can directly process paynow charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"promptpay_payments\": {\n            \"description\": \"The status of the promptpay payments capability of the account, or whether the account can directly process promptpay charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"revolut_pay_payments\": {\n            \"description\": \"The status of the RevolutPay capability of the account, or whether the account can directly process RevolutPay payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"samsung_pay_payments\": {\n            \"description\": \"The status of the SamsungPay capability of the account, or whether the account can directly process SamsungPay payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"sepa_bank_transfer_payments\": {\n            \"description\": \"The status of the SEPA customer_balance payments (EUR currency) capability of the account, or whether the account can directly process SEPA customer_balance charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"sepa_debit_payments\": {\n            \"description\": \"The status of the SEPA Direct Debits payments capability of the account, or whether the account can directly process SEPA Direct Debits charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"sofort_payments\": {\n            \"description\": \"The status of the Sofort payments capability of the account, or whether the account can directly process Sofort charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"swish_payments\": {\n            \"description\": \"The status of the Swish capability of the account, or whether the account can directly process Swish payments.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"tax_reporting_us_1099_k\": {\n            \"description\": \"The status of the tax reporting 1099-K (US) capability of the account.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"tax_reporting_us_1099_misc\": {\n            \"description\": \"The status of the tax reporting 1099-MISC (US) capability of the account.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"transfers\": {\n            \"description\": \"The status of the transfers capability of the account, or whether your platform can transfer funds to the account.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"treasury\": {\n            \"description\": \"The status of the banking capability, or whether the account can have bank accounts.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"twint_payments\": {\n            \"description\": \"The status of the TWINT capability of the account, or whether the account can directly process TWINT charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"us_bank_account_ach_payments\": {\n            \"description\": \"The status of the US bank account ACH payments capability of the account, or whether the account can directly process US bank account charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"us_bank_transfer_payments\": {\n            \"description\": \"The status of the US customer_balance payments (USD currency) capability of the account, or whether the account can directly process US customer_balance charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"zip_payments\": {\n            \"description\": \"The status of the Zip capability of the account, or whether the account can directly process Zip charges.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountCapabilities\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_capability_future_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alternatives\": {\n            \"description\": \"Fields that are due and can be satisfied by providing the corresponding alternative fields instead.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_alternative\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"current_deadline\": {\n            \"description\": \"Date on which `future_requirements` becomes the main `requirements` hash and `future_requirements` becomes empty. After the transition, `currently_due` requirements may immediately become `past_due`, but the account may also be given a grace period depending on the capability's enablement state prior to transitioning.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currently_due\": {\n            \"description\": \"Fields that need to be collected to keep the capability enabled. If not collected by `future_requirements[current_deadline]`, these fields will transition to the main `requirements` hash.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"disabled_reason\": {\n            \"description\": \"This is typed as an enum for consistency with `requirements.disabled_reason`, but it safe to assume `future_requirements.disabled_reason` is null because fields in `future_requirements` will never disable the account.\",\n            \"enum\": [\n              \"other\",\n              \"paused.inactivity\",\n              \"pending.onboarding\",\n              \"pending.review\",\n              \"platform_disabled\",\n              \"platform_paused\",\n              \"rejected.inactivity\",\n              \"rejected.other\",\n              \"rejected.unsupported_business\",\n              \"requirements.fields_needed\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"errors\": {\n            \"description\": \"Fields that are `currently_due` and need to be collected again because validation or verification failed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_error\"\n            },\n            \"type\": \"array\"\n          },\n          \"eventually_due\": {\n            \"description\": \"Fields you must collect when all thresholds are reached. As they become required, they appear in `currently_due` as well.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"past_due\": {\n            \"description\": \"Fields that weren't collected by `requirements.current_deadline`. These fields need to be collected to enable the capability on the account. New fields will never appear here; `future_requirements.past_due` will always be a subset of `requirements.past_due`.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"pending_verification\": {\n            \"description\": \"Fields that might become required depending on the results of verification or review. It's an empty array unless an asynchronous verification is pending. If verification fails, these fields move to `eventually_due` or `currently_due`. Fields might appear in `eventually_due` or `currently_due` and in `pending_verification` if verification fails but another verification is still pending.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"currently_due\",\n          \"errors\",\n          \"eventually_due\",\n          \"past_due\",\n          \"pending_verification\"\n        ],\n        \"title\": \"AccountCapabilityFutureRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"alternatives\", \"errors\"]\n      },\n      \"account_capability_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alternatives\": {\n            \"description\": \"Fields that are due and can be satisfied by providing the corresponding alternative fields instead.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_alternative\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"current_deadline\": {\n            \"description\": \"Date by which the fields in `currently_due` must be collected to keep the capability enabled for the account. These fields may disable the capability sooner if the next threshold is reached before they are collected.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currently_due\": {\n            \"description\": \"Fields that need to be collected to keep the capability enabled. If not collected by `current_deadline`, these fields appear in `past_due` as well, and the capability is disabled.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"disabled_reason\": {\n            \"description\": \"Description of why the capability is disabled. [Learn more about handling verification issues](https://stripe.com/docs/connect/handling-api-verification).\",\n            \"enum\": [\n              \"other\",\n              \"paused.inactivity\",\n              \"pending.onboarding\",\n              \"pending.review\",\n              \"platform_disabled\",\n              \"platform_paused\",\n              \"rejected.inactivity\",\n              \"rejected.other\",\n              \"rejected.unsupported_business\",\n              \"requirements.fields_needed\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"errors\": {\n            \"description\": \"Fields that are `currently_due` and need to be collected again because validation or verification failed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_error\"\n            },\n            \"type\": \"array\"\n          },\n          \"eventually_due\": {\n            \"description\": \"Fields you must collect when all thresholds are reached. As they become required, they appear in `currently_due` as well, and `current_deadline` becomes set.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"past_due\": {\n            \"description\": \"Fields that weren't collected by `current_deadline`. These fields need to be collected to enable the capability on the account.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"pending_verification\": {\n            \"description\": \"Fields that might become required depending on the results of verification or review. It's an empty array unless an asynchronous verification is pending. If verification fails, these fields move to `eventually_due`, `currently_due`, or `past_due`. Fields might appear in `eventually_due`, `currently_due`, or `past_due` and in `pending_verification` if verification fails but another verification is still pending.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"currently_due\",\n          \"errors\",\n          \"eventually_due\",\n          \"past_due\",\n          \"pending_verification\"\n        ],\n        \"title\": \"AccountCapabilityRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"alternatives\", \"errors\"]\n      },\n      \"account_card_issuing_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tos_acceptance\": {\n            \"$ref\": \"#/components/schemas/card_issuing_account_terms_of_service\"\n          }\n        },\n        \"title\": \"AccountCardIssuingSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tos_acceptance\"]\n      },\n      \"account_card_payments_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"decline_on\": {\n            \"$ref\": \"#/components/schemas/account_decline_charge_on\"\n          },\n          \"statement_descriptor_prefix\": {\n            \"description\": \"The default text that appears on credit card statements when a charge is made. This field prefixes any dynamic `statement_descriptor` specified on the charge. `statement_descriptor_prefix` is useful for maximizing descriptor space for the dynamic portion.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_prefix_kana\": {\n            \"description\": \"The Kana variation of the default text that appears on credit card statements when a charge is made (Japan only). This field prefixes any dynamic `statement_descriptor_suffix_kana` specified on the charge. `statement_descriptor_prefix_kana` is useful for maximizing descriptor space for the dynamic portion.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_prefix_kanji\": {\n            \"description\": \"The Kanji variation of the default text that appears on credit card statements when a charge is made (Japan only). This field prefixes any dynamic `statement_descriptor_suffix_kanji` specified on the charge. `statement_descriptor_prefix_kanji` is useful for maximizing descriptor space for the dynamic portion.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountCardPaymentsSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"decline_on\"]\n      },\n      \"account_dashboard_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"display_name\": {\n            \"description\": \"The display name for this account. This is used on the Stripe Dashboard to differentiate between accounts.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"timezone\": {\n            \"description\": \"The timezone used in the Stripe Dashboard for this account. A list of possible time zone values is maintained at the [IANA Time Zone Database](http://www.iana.org/time-zones).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountDashboardSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_decline_charge_on\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"avs_failure\": {\n            \"description\": \"Whether Stripe automatically declines charges with an incorrect ZIP or postal code. This setting only applies when a ZIP or postal code is provided and they fail bank verification.\",\n            \"type\": \"boolean\"\n          },\n          \"cvc_failure\": {\n            \"description\": \"Whether Stripe automatically declines charges with an incorrect CVC. This setting only applies when a CVC is provided and it fails bank verification.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"avs_failure\", \"cvc_failure\"],\n        \"title\": \"AccountDeclineChargeOn\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_future_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alternatives\": {\n            \"description\": \"Fields that are due and can be satisfied by providing the corresponding alternative fields instead.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_alternative\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"current_deadline\": {\n            \"description\": \"Date on which `future_requirements` becomes the main `requirements` hash and `future_requirements` becomes empty. After the transition, `currently_due` requirements may immediately become `past_due`, but the account may also be given a grace period depending on its enablement state prior to transitioning.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currently_due\": {\n            \"description\": \"Fields that need to be collected to keep the account enabled. If not collected by `future_requirements[current_deadline]`, these fields will transition to the main `requirements` hash.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"disabled_reason\": {\n            \"description\": \"This is typed as an enum for consistency with `requirements.disabled_reason`.\",\n            \"enum\": [\n              \"action_required.requested_capabilities\",\n              \"listed\",\n              \"other\",\n              \"platform_paused\",\n              \"rejected.fraud\",\n              \"rejected.incomplete_verification\",\n              \"rejected.listed\",\n              \"rejected.other\",\n              \"rejected.platform_fraud\",\n              \"rejected.platform_other\",\n              \"rejected.platform_terms_of_service\",\n              \"rejected.terms_of_service\",\n              \"requirements.past_due\",\n              \"requirements.pending_verification\",\n              \"under_review\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"errors\": {\n            \"description\": \"Fields that are `currently_due` and need to be collected again because validation or verification failed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_error\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"eventually_due\": {\n            \"description\": \"Fields you must collect when all thresholds are reached. As they become required, they appear in `currently_due` as well.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"past_due\": {\n            \"description\": \"Fields that weren't collected by `requirements.current_deadline`. These fields need to be collected to enable the capability on the account. New fields will never appear here; `future_requirements.past_due` will always be a subset of `requirements.past_due`.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"pending_verification\": {\n            \"description\": \"Fields that might become required depending on the results of verification or review. It's an empty array unless an asynchronous verification is pending. If verification fails, these fields move to `eventually_due` or `currently_due`. Fields might appear in `eventually_due` or `currently_due` and in `pending_verification` if verification fails but another verification is still pending.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"AccountFutureRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"alternatives\", \"errors\"]\n      },\n      \"account_group_membership\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payments_pricing\": {\n            \"description\": \"The group the account is in to determine their payments pricing, and null if the account is on customized pricing. [See the Platform pricing tool documentation](https://stripe.com/docs/connect/platform-pricing-tools) for details.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountGroupMembership\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_invoices_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"default_account_tax_ids\": {\n            \"description\": \"The list of default Account Tax IDs to automatically include on invoices. Account Tax IDs get added when an invoice is finalized.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_id\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"AccountInvoicesSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"default_account_tax_ids\"]\n      },\n      \"account_link\": {\n        \"description\": \"Account Links are the means by which a Connect platform grants a connected account permission to access\\nStripe-hosted applications, such as Connect Onboarding.\\n\\nRelated guide: [Connect Onboarding](https://stripe.com/docs/connect/custom/hosted-onboarding)\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which this account link will expire.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"account_link\"],\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL for the account link.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"created\", \"expires_at\", \"object\", \"url\"],\n        \"title\": \"AccountLink\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"account_link\"\n      },\n      \"account_monthly_estimated_revenue\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"A non-negative integer representing how much to charge in the [smallest currency unit](/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\"],\n        \"title\": \"AccountMonthlyEstimatedRevenue\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_payments_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"statement_descriptor\": {\n            \"description\": \"The default text that appears on credit card statements when a charge is made. This field prefixes any dynamic `statement_descriptor` specified on the charge.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_kana\": {\n            \"description\": \"The Kana variation of `statement_descriptor` used for charges in Japan. Japanese statement descriptors have [special requirements](https://docs.stripe.com/get-started/account/statement-descriptors#set-japanese-statement-descriptors).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_kanji\": {\n            \"description\": \"The Kanji variation of `statement_descriptor` used for charges in Japan. Japanese statement descriptors have [special requirements](https://docs.stripe.com/get-started/account/statement-descriptors#set-japanese-statement-descriptors).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountPaymentsSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_payout_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"debit_negative_balances\": {\n            \"description\": \"A Boolean indicating if Stripe should try to reclaim negative balances from an attached bank account. See [Understanding Connect account balances](/connect/account-balances) for details. The default value is `false` when [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts, otherwise `true`.\",\n            \"type\": \"boolean\"\n          },\n          \"schedule\": {\n            \"$ref\": \"#/components/schemas/transfer_schedule\"\n          },\n          \"statement_descriptor\": {\n            \"description\": \"The text that appears on the bank account statement for payouts. If not set, this defaults to the platform's bank descriptor as set in the Dashboard.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"debit_negative_balances\", \"schedule\"],\n        \"title\": \"AccountPayoutSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"schedule\"]\n      },\n      \"account_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alternatives\": {\n            \"description\": \"Fields that are due and can be satisfied by providing the corresponding alternative fields instead.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_alternative\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"current_deadline\": {\n            \"description\": \"Date by which the fields in `currently_due` must be collected to keep the account enabled. These fields may disable the account sooner if the next threshold is reached before they are collected.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currently_due\": {\n            \"description\": \"Fields that need to be collected to keep the account enabled. If not collected by `current_deadline`, these fields appear in `past_due` as well, and the account is disabled.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"disabled_reason\": {\n            \"description\": \"If the account is disabled, this enum describes why. [Learn more about handling verification issues](https://stripe.com/docs/connect/handling-api-verification).\",\n            \"enum\": [\n              \"action_required.requested_capabilities\",\n              \"listed\",\n              \"other\",\n              \"platform_paused\",\n              \"rejected.fraud\",\n              \"rejected.incomplete_verification\",\n              \"rejected.listed\",\n              \"rejected.other\",\n              \"rejected.platform_fraud\",\n              \"rejected.platform_other\",\n              \"rejected.platform_terms_of_service\",\n              \"rejected.terms_of_service\",\n              \"requirements.past_due\",\n              \"requirements.pending_verification\",\n              \"under_review\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"errors\": {\n            \"description\": \"Fields that are `currently_due` and need to be collected again because validation or verification failed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_error\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"eventually_due\": {\n            \"description\": \"Fields you must collect when all thresholds are reached. As they become required, they appear in `currently_due` as well, and `current_deadline` becomes set.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"past_due\": {\n            \"description\": \"Fields that weren't collected by `current_deadline`. These fields need to be collected to enable the account.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"pending_verification\": {\n            \"description\": \"Fields that might become required depending on the results of verification or review. It's an empty array unless an asynchronous verification is pending. If verification fails, these fields move to `eventually_due`, `currently_due`, or `past_due`. Fields might appear in `eventually_due`, `currently_due`, or `past_due` and in `pending_verification` if verification fails but another verification is still pending.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"AccountRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"alternatives\", \"errors\"]\n      },\n      \"account_requirements_alternative\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alternative_fields_due\": {\n            \"description\": \"Fields that can be provided to satisfy all fields in `original_fields_due`.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"original_fields_due\": {\n            \"description\": \"Fields that are due and can be satisfied by providing all fields in `alternative_fields_due`.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"alternative_fields_due\", \"original_fields_due\"],\n        \"title\": \"AccountRequirementsAlternative\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_requirements_error\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"The code for the type of error.\",\n            \"enum\": [\n              \"invalid_address_city_state_postal_code\",\n              \"invalid_address_highway_contract_box\",\n              \"invalid_address_private_mailbox\",\n              \"invalid_business_profile_name\",\n              \"invalid_business_profile_name_denylisted\",\n              \"invalid_company_name_denylisted\",\n              \"invalid_dob_age_over_maximum\",\n              \"invalid_dob_age_under_18\",\n              \"invalid_dob_age_under_minimum\",\n              \"invalid_product_description_length\",\n              \"invalid_product_description_url_match\",\n              \"invalid_representative_country\",\n              \"invalid_statement_descriptor_business_mismatch\",\n              \"invalid_statement_descriptor_denylisted\",\n              \"invalid_statement_descriptor_length\",\n              \"invalid_statement_descriptor_prefix_denylisted\",\n              \"invalid_statement_descriptor_prefix_mismatch\",\n              \"invalid_street_address\",\n              \"invalid_tax_id\",\n              \"invalid_tax_id_format\",\n              \"invalid_tos_acceptance\",\n              \"invalid_url_denylisted\",\n              \"invalid_url_format\",\n              \"invalid_url_web_presence_detected\",\n              \"invalid_url_website_business_information_mismatch\",\n              \"invalid_url_website_empty\",\n              \"invalid_url_website_inaccessible\",\n              \"invalid_url_website_inaccessible_geoblocked\",\n              \"invalid_url_website_inaccessible_password_protected\",\n              \"invalid_url_website_incomplete\",\n              \"invalid_url_website_incomplete_cancellation_policy\",\n              \"invalid_url_website_incomplete_customer_service_details\",\n              \"invalid_url_website_incomplete_legal_restrictions\",\n              \"invalid_url_website_incomplete_refund_policy\",\n              \"invalid_url_website_incomplete_return_policy\",\n              \"invalid_url_website_incomplete_terms_and_conditions\",\n              \"invalid_url_website_incomplete_under_construction\",\n              \"invalid_url_website_other\",\n              \"invalid_value_other\",\n              \"verification_directors_mismatch\",\n              \"verification_document_address_mismatch\",\n              \"verification_document_address_missing\",\n              \"verification_document_corrupt\",\n              \"verification_document_country_not_supported\",\n              \"verification_document_directors_mismatch\",\n              \"verification_document_dob_mismatch\",\n              \"verification_document_duplicate_type\",\n              \"verification_document_expired\",\n              \"verification_document_failed_copy\",\n              \"verification_document_failed_greyscale\",\n              \"verification_document_failed_other\",\n              \"verification_document_failed_test_mode\",\n              \"verification_document_fraudulent\",\n              \"verification_document_id_number_mismatch\",\n              \"verification_document_id_number_missing\",\n              \"verification_document_incomplete\",\n              \"verification_document_invalid\",\n              \"verification_document_issue_or_expiry_date_missing\",\n              \"verification_document_manipulated\",\n              \"verification_document_missing_back\",\n              \"verification_document_missing_front\",\n              \"verification_document_name_mismatch\",\n              \"verification_document_name_missing\",\n              \"verification_document_nationality_mismatch\",\n              \"verification_document_not_readable\",\n              \"verification_document_not_signed\",\n              \"verification_document_not_uploaded\",\n              \"verification_document_photo_mismatch\",\n              \"verification_document_too_large\",\n              \"verification_document_type_not_supported\",\n              \"verification_extraneous_directors\",\n              \"verification_failed_address_match\",\n              \"verification_failed_business_iec_number\",\n              \"verification_failed_document_match\",\n              \"verification_failed_id_number_match\",\n              \"verification_failed_keyed_identity\",\n              \"verification_failed_keyed_match\",\n              \"verification_failed_name_match\",\n              \"verification_failed_other\",\n              \"verification_failed_representative_authority\",\n              \"verification_failed_residential_address\",\n              \"verification_failed_tax_id_match\",\n              \"verification_failed_tax_id_not_issued\",\n              \"verification_missing_directors\",\n              \"verification_missing_executives\",\n              \"verification_missing_owners\",\n              \"verification_requires_additional_memorandum_of_associations\",\n              \"verification_requires_additional_proof_of_registration\",\n              \"verification_supportability\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"reason\": {\n            \"description\": \"An informative message that indicates the error type and provides additional details about the error.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"requirement\": {\n            \"description\": \"The specific user onboarding requirement field (in the requirements hash) that needs to be resolved.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"code\", \"reason\", \"requirement\"],\n        \"title\": \"AccountRequirementsError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_sepa_debit_payments_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"creditor_id\": {\n            \"description\": \"SEPA creditor identifier that identifies the company making the payment.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountSepaDebitPaymentsSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_session\": {\n        \"description\": \"An AccountSession allows a Connect platform to grant access to a connected account in Connect embedded components.\\n\\nWe recommend that you create an AccountSession each time you need to display an embedded component\\nto your user. Do not save AccountSessions to your database as they expire relatively\\nquickly, and cannot be used more than once.\\n\\nRelated guide: [Connect embedded components](https://stripe.com/docs/connect/get-started-connect-embedded-components)\",\n        \"properties\": {\n          \"account\": {\n            \"description\": \"The ID of the account the AccountSession was created for\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"client_secret\": {\n            \"description\": \"The client secret of this AccountSession. Used on the client to set up secure access to the given `account`.\\n\\nThe client secret can be used to provide access to `account` from your frontend. It should not be stored, logged, or exposed to anyone other than the connected account. Make sure that you have TLS enabled on any page that includes the client secret.\\n\\nRefer to our docs to [setup Connect embedded components](https://stripe.com/docs/connect/get-started-connect-embedded-components) and learn about how `client_secret` should be handled.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"components\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_account_session_create_components\"\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which this AccountSession will expire.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"account_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"account\",\n          \"client_secret\",\n          \"components\",\n          \"expires_at\",\n          \"livemode\",\n          \"object\"\n        ],\n        \"title\": \"ConnectEmbeddedMethodAccountSessionCreateMethodAccountSession\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"components\"],\n        \"x-resourceId\": \"account_session\"\n      },\n      \"account_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bacs_debit_payments\": {\n            \"$ref\": \"#/components/schemas/account_bacs_debit_payments_settings\"\n          },\n          \"branding\": {\n            \"$ref\": \"#/components/schemas/account_branding_settings\"\n          },\n          \"card_issuing\": {\n            \"$ref\": \"#/components/schemas/account_card_issuing_settings\"\n          },\n          \"card_payments\": {\n            \"$ref\": \"#/components/schemas/account_card_payments_settings\"\n          },\n          \"dashboard\": {\n            \"$ref\": \"#/components/schemas/account_dashboard_settings\"\n          },\n          \"invoices\": {\n            \"$ref\": \"#/components/schemas/account_invoices_settings\"\n          },\n          \"payments\": {\n            \"$ref\": \"#/components/schemas/account_payments_settings\"\n          },\n          \"payouts\": {\n            \"$ref\": \"#/components/schemas/account_payout_settings\"\n          },\n          \"sepa_debit_payments\": {\n            \"$ref\": \"#/components/schemas/account_sepa_debit_payments_settings\"\n          },\n          \"treasury\": {\n            \"$ref\": \"#/components/schemas/account_treasury_settings\"\n          }\n        },\n        \"required\": [\"branding\", \"card_payments\", \"dashboard\", \"payments\"],\n        \"title\": \"AccountSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"bacs_debit_payments\",\n          \"branding\",\n          \"card_issuing\",\n          \"card_payments\",\n          \"dashboard\",\n          \"invoices\",\n          \"payments\",\n          \"payouts\",\n          \"sepa_debit_payments\",\n          \"treasury\"\n        ]\n      },\n      \"account_terms_of_service\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"date\": {\n            \"description\": \"The Unix timestamp marking when the account representative accepted the service agreement.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ip\": {\n            \"description\": \"The IP address from which the account representative accepted the service agreement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user agent of the browser from which the account representative accepted the service agreement.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountTermsOfService\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_tos_acceptance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"date\": {\n            \"description\": \"The Unix timestamp marking when the account representative accepted their service agreement\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ip\": {\n            \"description\": \"The IP address from which the account representative accepted their service agreement\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"service_agreement\": {\n            \"description\": \"The user's service agreement type\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user agent of the browser from which the account representative accepted their service agreement\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"AccountTOSAcceptance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_treasury_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tos_acceptance\": {\n            \"$ref\": \"#/components/schemas/account_terms_of_service\"\n          }\n        },\n        \"title\": \"AccountTreasurySettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tos_acceptance\"]\n      },\n      \"account_unification_account_controller\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fees\": {\n            \"$ref\": \"#/components/schemas/account_unification_account_controller_fees\"\n          },\n          \"is_controller\": {\n            \"description\": \"`true` if the Connect application retrieving the resource controls the account and can therefore exercise [platform controls](https://stripe.com/docs/connect/platform-controls-for-standard-accounts). Otherwise, this field is null.\",\n            \"type\": \"boolean\"\n          },\n          \"losses\": {\n            \"$ref\": \"#/components/schemas/account_unification_account_controller_losses\"\n          },\n          \"requirement_collection\": {\n            \"description\": \"A value indicating responsibility for collecting requirements on this account. Only returned when the Connect application retrieving the resource controls the account.\",\n            \"enum\": [\"application\", \"stripe\"],\n            \"type\": \"string\"\n          },\n          \"stripe_dashboard\": {\n            \"$ref\": \"#/components/schemas/account_unification_account_controller_stripe_dashboard\"\n          },\n          \"type\": {\n            \"description\": \"The controller type. Can be `application`, if a Connect application controls the account, or `account`, if the account controls itself.\",\n            \"enum\": [\"account\", \"application\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"AccountUnificationAccountController\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"fees\", \"losses\", \"stripe_dashboard\"]\n      },\n      \"account_unification_account_controller_fees\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payer\": {\n            \"description\": \"A value indicating the responsible payer of a bundle of Stripe fees for pricing-control eligible products on this account. Learn more about [fee behavior on connected accounts](https://docs.stripe.com/connect/direct-charges-fee-payer-behavior).\",\n            \"enum\": [\n              \"account\",\n              \"application\",\n              \"application_custom\",\n              \"application_express\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"payer\"],\n        \"title\": \"AccountUnificationAccountControllerFees\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_unification_account_controller_losses\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payments\": {\n            \"description\": \"A value indicating who is liable when this account can't pay back negative balances from payments.\",\n            \"enum\": [\"application\", \"stripe\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"payments\"],\n        \"title\": \"AccountUnificationAccountControllerLosses\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"account_unification_account_controller_stripe_dashboard\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"A value indicating the Stripe dashboard this account has access to independent of the Connect application.\",\n            \"enum\": [\"express\", \"full\", \"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"AccountUnificationAccountControllerStripeDashboard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"address\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"city\": {\n            \"description\": \"City, district, suburb, town, or village.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line1\": {\n            \"description\": \"Address line 1 (e.g., street, PO Box, or company name).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line2\": {\n            \"description\": \"Address line 2 (e.g., apartment, suite, unit, or building).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"postal_code\": {\n            \"description\": \"ZIP or postal code.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"State, county, province, or region.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"Address\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"amazon_pay_underlying_payment_method_funding_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_passthrough_card\"\n          },\n          \"type\": {\n            \"description\": \"funding type of the underlying payment method.\",\n            \"enum\": [\"card\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"amazon_pay_underlying_payment_method_funding_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card\"]\n      },\n      \"api_errors\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"advice_code\": {\n            \"description\": \"For card errors resulting from a card issuer decline, a short string indicating [how to proceed with an error](https://stripe.com/docs/declines#retrying-issuer-declines) if they provide one.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"charge\": {\n            \"description\": \"For card errors, the ID of the failed charge.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"code\": {\n            \"description\": \"For some errors that could be handled programmatically, a short string indicating the [error code](https://stripe.com/docs/error-codes) reported.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"decline_code\": {\n            \"description\": \"For card errors resulting from a card issuer decline, a short string indicating the [card issuer's reason for the decline](https://stripe.com/docs/declines#issuer-declines) if they provide one.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"doc_url\": {\n            \"description\": \"A URL to more information about the [error code](https://stripe.com/docs/error-codes) reported.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"message\": {\n            \"description\": \"A human-readable message providing more details about the error. For card errors, these messages can be shown to your users.\",\n            \"maxLength\": 40000,\n            \"type\": \"string\"\n          },\n          \"network_advice_code\": {\n            \"description\": \"For card errors resulting from a card issuer decline, a 2 digit code which indicates the advice given to merchant by the card network on how to proceed with an error.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"network_decline_code\": {\n            \"description\": \"For card errors resulting from a card issuer decline, a brand specific 2, 3, or 4 digit code which indicates the reason the authorization failed.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"param\": {\n            \"description\": \"If the error is parameter-specific, the parameter related to the error. For example, you can use this to display a message near the correct form field.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"payment_intent\": {\n            \"$ref\": \"#/components/schemas/payment_intent\"\n          },\n          \"payment_method\": {\n            \"$ref\": \"#/components/schemas/payment_method\"\n          },\n          \"payment_method_type\": {\n            \"description\": \"If the error is specific to the type of payment method, the payment method type that had a problem. This field is only populated for invoice-related errors.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"request_log_url\": {\n            \"description\": \"A URL to the request log entry in your dashboard.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"setup_intent\": {\n            \"$ref\": \"#/components/schemas/setup_intent\"\n          },\n          \"source\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/source\"\n              }\n            ],\n            \"description\": \"The [source object](https://stripe.com/docs/api/sources/object) for errors returned on a request involving a source.\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"type\": {\n            \"description\": \"The type of error returned. One of `api_error`, `card_error`, `idempotency_error`, or `invalid_request_error`\",\n            \"enum\": [\n              \"api_error\",\n              \"card_error\",\n              \"idempotency_error\",\n              \"invalid_request_error\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"APIErrors\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"payment_intent\",\n          \"payment_method\",\n          \"setup_intent\",\n          \"source\"\n        ]\n      },\n      \"apple_pay_domain\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"domain_name\": {\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"apple_pay_domain\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"created\", \"domain_name\", \"id\", \"livemode\", \"object\"],\n        \"title\": \"ApplePayDomain\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"apple_pay_domain\"\n      },\n      \"application\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"The name of the application.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"application\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"object\"],\n        \"title\": \"Application\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"application_fee\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"ID of the Stripe account this fee was taken from.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"amount\": {\n            \"description\": \"Amount earned, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"amount_refunded\": {\n            \"description\": \"Amount in cents (or local equivalent) refunded (can be less than the amount attribute on the fee if a partial refund was issued)\",\n            \"type\": \"integer\"\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              }\n            ],\n            \"description\": \"ID of the Connect application that earned the fee.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                }\n              ]\n            }\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"Balance transaction that describes the impact of this collected application fee on your account balance (not including refunds).\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the charge that the application fee was taken from.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"fee_source\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/platform_earning_fee_source\"\n              }\n            ],\n            \"description\": \"Polymorphic source of the application fee. Includes the ID of the object the application fee was created from.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"application_fee\"],\n            \"type\": \"string\"\n          },\n          \"originating_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the corresponding charge on the platform account, if this fee was the result of a charge using the `destination` parameter.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"refunded\": {\n            \"description\": \"Whether the fee has been fully refunded. If the fee is only partially refunded, this attribute will still be false.\",\n            \"type\": \"boolean\"\n          },\n          \"refunds\": {\n            \"description\": \"A list of refunds that have been applied to the fee.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/fee_refund\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"FeeRefundList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          }\n        },\n        \"required\": [\n          \"account\",\n          \"amount\",\n          \"amount_refunded\",\n          \"application\",\n          \"charge\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"refunded\",\n          \"refunds\"\n        ],\n        \"title\": \"PlatformFee\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account\",\n          \"application\",\n          \"balance_transaction\",\n          \"charge\",\n          \"fee_source\",\n          \"originating_transaction\",\n          \"refunds\"\n        ],\n        \"x-resourceId\": \"application_fee\"\n      },\n      \"apps.secret\": {\n        \"description\": \"Secret Store is an API that allows Stripe Apps developers to securely persist secrets for use by UI Extensions and app backends.\\n\\nThe primary resource in Secret Store is a `secret`. Other apps can't view secrets created by an app. Additionally, secrets are scoped to provide further permission control.\\n\\nAll Dashboard users and the app backend share `account` scoped secrets. Use the `account` scope for secrets that don't change per-user, like a third-party API key.\\n\\nA `user` scoped secret is accessible by the app backend and one specific Dashboard user. Use the `user` scope for per-user secrets like per-user OAuth tokens, where different users might have different permissions.\\n\\nRelated guide: [Store data between page reloads](https://stripe.com/docs/stripe-apps/store-auth-data-custom-objects)\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"deleted\": {\n            \"description\": \"If true, indicates that this secret has been deleted\",\n            \"type\": \"boolean\"\n          },\n          \"expires_at\": {\n            \"description\": \"The Unix timestamp for the expiry time of the secret, after which the secret deletes.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"name\": {\n            \"description\": \"A name for the secret that's unique within the scope.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"apps.secret\"],\n            \"type\": \"string\"\n          },\n          \"payload\": {\n            \"description\": \"The plaintext secret value to be stored.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"scope\": {\n            \"$ref\": \"#/components/schemas/secret_service_resource_scope\"\n          }\n        },\n        \"required\": [\"created\", \"id\", \"livemode\", \"name\", \"object\", \"scope\"],\n        \"title\": \"SecretServiceResourceSecret\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"scope\"],\n        \"x-resourceId\": \"apps.secret\"\n      },\n      \"automatic_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disabled_reason\": {\n            \"description\": \"If Stripe disabled automatic tax, this enum describes why.\",\n            \"enum\": [\n              \"finalization_requires_location_inputs\",\n              \"finalization_system_error\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether Stripe automatically computes tax on this invoice. Note that incompatible invoice items (invoice items with manually specified [tax rates](https://stripe.com/docs/api/tax_rates), negative amounts, or `tax_behavior=unspecified`) cannot be added to automatic tax invoices.\",\n            \"type\": \"boolean\"\n          },\n          \"liability\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The account that's liable for tax. If set, the business address and tax registrations required to perform the tax calculation are loaded from this account. The tax transaction is returned in the report of the connected account.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"The status of the most recent automated tax calculation for this invoice.\",\n            \"enum\": [\"complete\", \"failed\", \"requires_location_inputs\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"AutomaticTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"liability\"]\n      },\n      \"balance\": {\n        \"description\": \"This is an object representing your Stripe balance. You can retrieve it to see\\nthe balance currently on your Stripe account.\\n\\nYou can also retrieve the balance history, which contains a list of\\n[transactions](https://stripe.com/docs/reporting/balance-transaction-types) that contributed to the balance\\n(charges, payouts, and so forth).\\n\\nThe available and pending amounts for each currency are broken down further by\\npayment source types.\\n\\nRelated guide: [Understanding Connect account balances](https://stripe.com/docs/connect/account-balances)\",\n        \"properties\": {\n          \"available\": {\n            \"description\": \"Available funds that you can transfer or pay out automatically by Stripe or explicitly through the [Transfers API](https://stripe.com/docs/api#transfers) or [Payouts API](https://stripe.com/docs/api#payouts). You can find the available balance for each currency and payment type in the `source_types` property.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"connect_reserved\": {\n            \"description\": \"Funds held due to negative balances on connected accounts where [account.controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts. You can find the connect reserve balance for each currency and payment type in the `source_types` property.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"instant_available\": {\n            \"description\": \"Funds that you can pay out using Instant Payouts.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_amount_net\"\n            },\n            \"type\": \"array\"\n          },\n          \"issuing\": {\n            \"$ref\": \"#/components/schemas/balance_detail\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"balance\"],\n            \"type\": \"string\"\n          },\n          \"pending\": {\n            \"description\": \"Funds that aren't available in the balance yet. You can find the pending balance for each currency and each payment type in the `source_types` property.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_amount\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"available\", \"livemode\", \"object\", \"pending\"],\n        \"title\": \"Balance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"available\",\n          \"connect_reserved\",\n          \"instant_available\",\n          \"issuing\",\n          \"pending\"\n        ],\n        \"x-resourceId\": \"balance\"\n      },\n      \"balance_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Balance amount.\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"source_types\": {\n            \"$ref\": \"#/components/schemas/balance_amount_by_source_type\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\"],\n        \"title\": \"BalanceAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"source_types\"]\n      },\n      \"balance_amount_by_source_type\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_account\": {\n            \"description\": \"Amount coming from [legacy US ACH payments](https://docs.stripe.com/ach-deprecated).\",\n            \"type\": \"integer\"\n          },\n          \"card\": {\n            \"description\": \"Amount coming from most payment methods, including cards as well as [non-legacy bank debits](https://docs.stripe.com/payments/bank-debits).\",\n            \"type\": \"integer\"\n          },\n          \"fpx\": {\n            \"description\": \"Amount coming from [FPX](https://docs.stripe.com/payments/fpx), a Malaysian payment method.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"BalanceAmountBySourceType\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"balance_amount_net\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Balance amount.\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"net_available\": {\n            \"description\": \"Breakdown of balance by destination.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_net_available\"\n            },\n            \"type\": \"array\"\n          },\n          \"source_types\": {\n            \"$ref\": \"#/components/schemas/balance_amount_by_source_type\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\"],\n        \"title\": \"BalanceAmountNet\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"net_available\", \"source_types\"]\n      },\n      \"balance_detail\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available\": {\n            \"description\": \"Funds that are available for use.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_amount\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"available\"],\n        \"title\": \"BalanceDetail\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"available\"]\n      },\n      \"balance_net_available\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Net balance amount, subtracting fees from platform-set pricing.\",\n            \"type\": \"integer\"\n          },\n          \"destination\": {\n            \"description\": \"ID of the external account for this net balance (not expandable).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"source_types\": {\n            \"$ref\": \"#/components/schemas/balance_amount_by_source_type\"\n          }\n        },\n        \"required\": [\"amount\", \"destination\"],\n        \"title\": \"BalanceNetAvailable\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"source_types\"]\n      },\n      \"balance_transaction\": {\n        \"description\": \"Balance transactions represent funds moving through your Stripe account.\\nStripe creates them for every type of transaction that enters or leaves your Stripe account balance.\\n\\nRelated guide: [Balance transaction types](https://stripe.com/docs/reports/balance-transaction-types)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Gross amount of this transaction (in cents (or local equivalent)). A positive value represents funds charged to another party, and a negative value represents funds sent to another party.\",\n            \"type\": \"integer\"\n          },\n          \"available_on\": {\n            \"description\": \"The date that the transaction's net funds become available in the Stripe balance.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exchange_rate\": {\n            \"description\": \"If applicable, this transaction uses an exchange rate. If money converts from currency A to currency B, then the `amount` in currency A, multipled by the `exchange_rate`, equals the `amount` in currency B. For example, if you charge a customer 10.00 EUR, the PaymentIntent's `amount` is `1000` and `currency` is `eur`. If this converts to 12.34 USD in your Stripe account, the BalanceTransaction's `amount` is `1234`, its `currency` is `usd`, and the `exchange_rate` is `1.234`.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"fee\": {\n            \"description\": \"Fees (in cents (or local equivalent)) paid for this transaction. Represented as a positive integer when assessed.\",\n            \"type\": \"integer\"\n          },\n          \"fee_details\": {\n            \"description\": \"Detailed breakdown of fees (in cents (or local equivalent)) paid for this transaction.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/fee\"\n            },\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"net\": {\n            \"description\": \"Net impact to a Stripe balance (in cents (or local equivalent)). A positive value represents incrementing a Stripe balance, and a negative value decrementing a Stripe balance. You can calculate the net impact of a transaction on a balance by `amount` - `fee`\",\n            \"type\": \"integer\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"balance_transaction\"],\n            \"type\": \"string\"\n          },\n          \"reporting_category\": {\n            \"description\": \"Learn more about how [reporting categories](https://stripe.com/docs/reports/reporting-categories) can help you understand balance transactions from an accounting perspective.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"source\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application_fee\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/connect_collection_transfer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer_cash_balance_transaction\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/dispute\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/fee_refund\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.authorization\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.dispute\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.transaction\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payout\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/refund\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/reserve_transaction\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/tax_deducted_at_source\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/topup\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/transfer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/transfer_reversal\"\n              }\n            ],\n            \"description\": \"This transaction relates to the Stripe object.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application_fee\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/connect_collection_transfer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/customer_cash_balance_transaction\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/dispute\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/fee_refund\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/issuing.dispute\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/issuing.transaction\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/payout\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/refund\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/reserve_transaction\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_deducted_at_source\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/topup\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/transfer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/transfer_reversal\"\n                }\n              ]\n            },\n            \"x-stripeBypassValidation\": true\n          },\n          \"status\": {\n            \"description\": \"The transaction's net funds status in the Stripe balance, which are either `available` or `pending`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Transaction type: `adjustment`, `advance`, `advance_funding`, `anticipation_repayment`, `application_fee`, `application_fee_refund`, `charge`, `climate_order_purchase`, `climate_order_refund`, `connect_collection_transfer`, `contribution`, `issuing_authorization_hold`, `issuing_authorization_release`, `issuing_dispute`, `issuing_transaction`, `obligation_outbound`, `obligation_reversal_inbound`, `payment`, `payment_failure_refund`, `payment_network_reserve_hold`, `payment_network_reserve_release`, `payment_refund`, `payment_reversal`, `payment_unreconciled`, `payout`, `payout_cancel`, `payout_failure`, `payout_minimum_balance_hold`, `payout_minimum_balance_release`, `refund`, `refund_failure`, `reserve_transaction`, `reserved_funds`, `stripe_fee`, `stripe_fx_fee`, `tax_fee`, `topup`, `topup_reversal`, `transfer`, `transfer_cancel`, `transfer_failure`, or `transfer_refund`. Learn more about [balance transaction types and what they represent](https://stripe.com/docs/reports/balance-transaction-types). To classify transactions for accounting purposes, consider `reporting_category` instead.\",\n            \"enum\": [\n              \"adjustment\",\n              \"advance\",\n              \"advance_funding\",\n              \"anticipation_repayment\",\n              \"application_fee\",\n              \"application_fee_refund\",\n              \"charge\",\n              \"climate_order_purchase\",\n              \"climate_order_refund\",\n              \"connect_collection_transfer\",\n              \"contribution\",\n              \"issuing_authorization_hold\",\n              \"issuing_authorization_release\",\n              \"issuing_dispute\",\n              \"issuing_transaction\",\n              \"obligation_outbound\",\n              \"obligation_reversal_inbound\",\n              \"payment\",\n              \"payment_failure_refund\",\n              \"payment_network_reserve_hold\",\n              \"payment_network_reserve_release\",\n              \"payment_refund\",\n              \"payment_reversal\",\n              \"payment_unreconciled\",\n              \"payout\",\n              \"payout_cancel\",\n              \"payout_failure\",\n              \"payout_minimum_balance_hold\",\n              \"payout_minimum_balance_release\",\n              \"refund\",\n              \"refund_failure\",\n              \"reserve_transaction\",\n              \"reserved_funds\",\n              \"stripe_fee\",\n              \"stripe_fx_fee\",\n              \"tax_fee\",\n              \"topup\",\n              \"topup_reversal\",\n              \"transfer\",\n              \"transfer_cancel\",\n              \"transfer_failure\",\n              \"transfer_refund\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"available_on\",\n          \"created\",\n          \"currency\",\n          \"fee\",\n          \"fee_details\",\n          \"id\",\n          \"net\",\n          \"object\",\n          \"reporting_category\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"BalanceTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"fee_details\", \"source\"],\n        \"x-resourceId\": \"balance_transaction\"\n      },\n      \"bank_account\": {\n        \"description\": \"These bank accounts are payment methods on `Customer` objects.\\n\\nOn the other hand [External Accounts](/api#external_accounts) are transfer\\ndestinations on `Account` objects for connected accounts.\\nThey can be bank accounts or debit cards as well, and are documented in the links above.\\n\\nRelated guide: [Bank debits and transfers](/payments/bank-debits-transfers)\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The ID of the account that the bank account is associated with.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"account_holder_name\": {\n            \"description\": \"The name of the person or business that owns the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_holder_type\": {\n            \"description\": \"The type of entity that holds the account. This can be either `individual` or `company`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"The bank account type. This can only be `checking` or `savings` in most countries. In Japan, this can only be `futsu` or `toza`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"available_payout_methods\": {\n            \"description\": \"A set of available payout methods for this bank account. Only values from this set should be passed as the `method` when creating a payout.\",\n            \"items\": {\n              \"enum\": [\"instant\", \"standard\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the routing number (e.g., `WELLS FARGO`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country the bank account is located in.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO code for the currency](https://stripe.com/docs/payouts) paid out to the bank account.\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The ID of the customer that the bank account is associated with.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"default_for_currency\": {\n            \"description\": \"Whether this bank account is the default external account for its currency.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"future_requirements\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/external_account_requirements\"\n              }\n            ],\n            \"description\": \"Information about the [upcoming new requirements for the bank account](https://stripe.com/docs/connect/custom-accounts/future-requirements), including what information needs to be collected, and by when.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"bank_account\"],\n            \"type\": \"string\"\n          },\n          \"requirements\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/external_account_requirements\"\n              }\n            ],\n            \"description\": \"Information about the requirements for the bank account, including what information needs to be collected.\",\n            \"nullable\": true\n          },\n          \"routing_number\": {\n            \"description\": \"The routing transit number for the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"For bank accounts, possible values are `new`, `validated`, `verified`, `verification_failed`, or `errored`. A bank account that hasn't had any activity or validation performed is `new`. If Stripe can determine that the bank account exists, its status will be `validated`. Note that there often isn’t enough information to know (e.g., for smaller credit unions), and the validation is not always run. If customer bank account verification has succeeded, the bank account status will be `verified`. If the verification failed for any reason, such as microdeposit failure, the status will be `verification_failed`. If a payout sent to this bank account fails, we'll set the status to `errored` and will not continue to send [scheduled payouts](https://stripe.com/docs/payouts#payout-schedule) until the bank details are updated.\\n\\nFor external accounts, possible values are `new`, `errored` and `verification_failed`. If a payout fails, the status is set to `errored` and scheduled payouts are stopped until account details are updated. In the US and India, if we can't [verify the owner of the bank account](https://support.stripe.com/questions/bank-account-ownership-verification), we'll set the status to `verification_failed`. Other validations aren't run against external accounts because they're only used for payouts. This means the other statuses don't apply.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"country\", \"currency\", \"id\", \"last4\", \"object\", \"status\"],\n        \"title\": \"BankAccount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account\",\n          \"customer\",\n          \"future_requirements\",\n          \"requirements\"\n        ],\n        \"x-resourceId\": \"bank_account\"\n      },\n      \"bank_connections_resource_accountholder\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The ID of the Stripe account this account belongs to. Should only be present if `account_holder.type` is `account`.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"ID of the Stripe customer this account belongs to. Present if and only if `account_holder.type` is `customer`.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"Type of account holder that this account belongs to.\",\n            \"enum\": [\"account\", \"customer\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"BankConnectionsResourceAccountholder\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account\", \"customer\"]\n      },\n      \"bank_connections_resource_balance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"as_of\": {\n            \"description\": \"The time that the external institution calculated this balance. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"cash\": {\n            \"$ref\": \"#/components/schemas/bank_connections_resource_balance_api_resource_cash_balance\"\n          },\n          \"credit\": {\n            \"$ref\": \"#/components/schemas/bank_connections_resource_balance_api_resource_credit_balance\"\n          },\n          \"current\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"The balances owed to (or by) the account holder, before subtracting any outbound pending transactions or adding any inbound pending transactions.\\n\\nEach key is a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase.\\n\\nEach value is a integer amount. A positive amount indicates money owed to the account holder. A negative amount indicates money owed by the account holder.\",\n            \"type\": \"object\"\n          },\n          \"type\": {\n            \"description\": \"The `type` of the balance. An additional hash is included on the balance with a name matching this value.\",\n            \"enum\": [\"cash\", \"credit\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"as_of\", \"current\", \"type\"],\n        \"title\": \"BankConnectionsResourceBalance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"cash\", \"credit\"]\n      },\n      \"bank_connections_resource_balance_api_resource_cash_balance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"The funds available to the account holder. Typically this is the current balance after subtracting any outbound pending transactions and adding any inbound pending transactions.\\n\\nEach key is a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase.\\n\\nEach value is a integer amount. A positive amount indicates money owed to the account holder. A negative amount indicates money owed by the account holder.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          }\n        },\n        \"title\": \"BankConnectionsResourceBalanceAPIResourceCashBalance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"bank_connections_resource_balance_api_resource_credit_balance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"used\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"The credit that has been used by the account holder.\\n\\nEach key is a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase.\\n\\nEach value is a integer amount. A positive amount indicates money owed to the account holder. A negative amount indicates money owed by the account holder.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          }\n        },\n        \"title\": \"BankConnectionsResourceBalanceAPIResourceCreditBalance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"bank_connections_resource_balance_refresh\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"last_attempted_at\": {\n            \"description\": \"The time at which the last refresh attempt was initiated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"next_refresh_available_at\": {\n            \"description\": \"Time at which the next balance refresh can be initiated. This value will be `null` when `status` is `pending`. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"status\": {\n            \"description\": \"The status of the last refresh attempt.\",\n            \"enum\": [\"failed\", \"pending\", \"succeeded\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"last_attempted_at\", \"status\"],\n        \"title\": \"BankConnectionsResourceBalanceRefresh\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"bank_connections_resource_link_account_session_filters\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_subcategories\": {\n            \"description\": \"Restricts the Session to subcategories of accounts that can be linked. Valid subcategories are: `checking`, `savings`, `mortgage`, `line_of_credit`, `credit_card`.\",\n            \"items\": {\n              \"enum\": [\n                \"checking\",\n                \"credit_card\",\n                \"line_of_credit\",\n                \"mortgage\",\n                \"savings\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"countries\": {\n            \"description\": \"List of countries from which to filter accounts.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"BankConnectionsResourceLinkAccountSessionFilters\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"bank_connections_resource_ownership_refresh\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"last_attempted_at\": {\n            \"description\": \"The time at which the last refresh attempt was initiated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"next_refresh_available_at\": {\n            \"description\": \"Time at which the next ownership refresh can be initiated. This value will be `null` when `status` is `pending`. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"status\": {\n            \"description\": \"The status of the last refresh attempt.\",\n            \"enum\": [\"failed\", \"pending\", \"succeeded\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"last_attempted_at\", \"status\"],\n        \"title\": \"BankConnectionsResourceOwnershipRefresh\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"bank_connections_resource_transaction_refresh\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last_attempted_at\": {\n            \"description\": \"The time at which the last refresh attempt was initiated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"next_refresh_available_at\": {\n            \"description\": \"Time at which the next transaction refresh can be initiated. This value will be `null` when `status` is `pending`. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"status\": {\n            \"description\": \"The status of the last refresh attempt.\",\n            \"enum\": [\"failed\", \"pending\", \"succeeded\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"last_attempted_at\", \"status\"],\n        \"title\": \"BankConnectionsResourceTransactionRefresh\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"bank_connections_resource_transaction_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"posted_at\": {\n            \"description\": \"Time at which this transaction posted. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"void_at\": {\n            \"description\": \"Time at which this transaction was voided. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"BankConnectionsResourceTransactionResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing.alert\": {\n        \"description\": \"A billing alert is a resource that notifies you when a certain usage threshold on a meter is crossed. For example, you might create a billing alert to notify you when a certain user made 100 API requests.\",\n        \"properties\": {\n          \"alert_type\": {\n            \"description\": \"Defines the type of the alert.\",\n            \"enum\": [\"usage_threshold\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.alert\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of the alert. This can be active, inactive or archived.\",\n            \"enum\": [\"active\", \"archived\", \"inactive\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"title\": {\n            \"description\": \"Title of the alert.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"usage_threshold\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/thresholds_resource_usage_threshold_config\"\n              }\n            ],\n            \"description\": \"Encapsulates configuration of the alert to monitor usage on a specific [Billing Meter](https://stripe.com/docs/api/billing/meter).\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"alert_type\", \"id\", \"livemode\", \"object\", \"title\"],\n        \"title\": \"ThresholdsResourceAlert\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"usage_threshold\"],\n        \"x-resourceId\": \"billing.alert\"\n      },\n      \"billing.credit_balance_summary\": {\n        \"description\": \"Indicates the billing credit balance for billing credits granted to a customer.\",\n        \"properties\": {\n          \"balances\": {\n            \"description\": \"The billing credit balances. One entry per credit grant currency. If a customer only has credit grants in a single currency, then this will have a single balance entry.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/credit_balance\"\n            },\n            \"type\": \"array\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The customer the balance is for.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.credit_balance_summary\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"balances\", \"customer\", \"livemode\", \"object\"],\n        \"title\": \"CreditBalanceSummary\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"balances\", \"customer\"],\n        \"x-resourceId\": \"billing.credit_balance_summary\"\n      },\n      \"billing.credit_balance_transaction\": {\n        \"description\": \"A credit balance transaction is a resource representing a transaction (either a credit or a debit) against an existing credit grant.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"credit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/billing_credit_grants_resource_balance_credit\"\n              }\n            ],\n            \"description\": \"Credit details for this credit balance transaction. Only present if type is `credit`.\",\n            \"nullable\": true\n          },\n          \"credit_grant\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/billing.credit_grant\"\n              }\n            ],\n            \"description\": \"The credit grant associated with this credit balance transaction.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/billing.credit_grant\"\n                }\n              ]\n            }\n          },\n          \"debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/billing_credit_grants_resource_balance_debit\"\n              }\n            ],\n            \"description\": \"Debit details for this credit balance transaction. Only present if type is `debit`.\",\n            \"nullable\": true\n          },\n          \"effective_at\": {\n            \"description\": \"The effective time of this credit balance transaction.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.credit_balance_transaction\"],\n            \"type\": \"string\"\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock this credit balance transaction belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"The type of credit balance transaction (credit or debit).\",\n            \"enum\": [\"credit\", \"debit\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"credit_grant\",\n          \"effective_at\",\n          \"id\",\n          \"livemode\",\n          \"object\"\n        ],\n        \"title\": \"CreditBalanceTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"credit\", \"credit_grant\", \"debit\", \"test_clock\"],\n        \"x-resourceId\": \"billing.credit_balance_transaction\"\n      },\n      \"billing.credit_grant\": {\n        \"description\": \"A credit grant is an API resource that documents the allocation of some billing credits to a customer.\\n\\nRelated guide: [Billing credits](https://docs.stripe.com/billing/subscriptions/usage-based/billing-credits)\",\n        \"properties\": {\n          \"amount\": {\n            \"$ref\": \"#/components/schemas/billing_credit_grants_resource_amount\"\n          },\n          \"applicability_config\": {\n            \"$ref\": \"#/components/schemas/billing_credit_grants_resource_applicability_config\"\n          },\n          \"category\": {\n            \"description\": \"The category of this credit grant. This is for tracking purposes and isn't displayed to the customer.\",\n            \"enum\": [\"paid\", \"promotional\"],\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"ID of the customer receiving the billing credits.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"effective_at\": {\n            \"description\": \"The time when the billing credits become effective-when they're eligible for use.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"The time when the billing credits expire. If not present, the billing credits don't expire.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"A descriptive name shown in dashboard.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.credit_grant\"],\n            \"type\": \"string\"\n          },\n          \"priority\": {\n            \"description\": \"The priority for applying this credit grant. The highest priority is 0 and the lowest is 100.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock this credit grant belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          },\n          \"updated\": {\n            \"description\": \"Time at which the object was last updated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"voided_at\": {\n            \"description\": \"The time when this credit grant was voided. If not present, the credit grant hasn't been voided.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"applicability_config\",\n          \"category\",\n          \"created\",\n          \"customer\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"updated\"\n        ],\n        \"title\": \"CreditGrant\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"amount\",\n          \"applicability_config\",\n          \"customer\",\n          \"test_clock\"\n        ],\n        \"x-resourceId\": \"billing.credit_grant\"\n      },\n      \"billing.meter\": {\n        \"description\": \"Meters specify how to aggregate meter events over a billing period. Meter events represent the actions that customers take in your system. Meters attach to prices and form the basis of the bill.\\n\\nRelated guide: [Usage based billing](https://docs.stripe.com/billing/subscriptions/usage-based)\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer_mapping\": {\n            \"$ref\": \"#/components/schemas/billing_meter_resource_customer_mapping_settings\"\n          },\n          \"default_aggregation\": {\n            \"$ref\": \"#/components/schemas/billing_meter_resource_aggregation_settings\"\n          },\n          \"display_name\": {\n            \"description\": \"The meter's name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"event_name\": {\n            \"description\": \"The name of the meter event to record usage for. Corresponds with the `event_name` field on meter events.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"event_time_window\": {\n            \"description\": \"The time window to pre-aggregate meter events for, if any.\",\n            \"enum\": [\"day\", \"hour\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.meter\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The meter's status.\",\n            \"enum\": [\"active\", \"inactive\"],\n            \"type\": \"string\"\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/billing_meter_resource_billing_meter_status_transitions\"\n          },\n          \"updated\": {\n            \"description\": \"Time at which the object was last updated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"value_settings\": {\n            \"$ref\": \"#/components/schemas/billing_meter_resource_billing_meter_value\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"customer_mapping\",\n          \"default_aggregation\",\n          \"display_name\",\n          \"event_name\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"status_transitions\",\n          \"updated\",\n          \"value_settings\"\n        ],\n        \"title\": \"BillingMeter\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"customer_mapping\",\n          \"default_aggregation\",\n          \"status_transitions\",\n          \"value_settings\"\n        ],\n        \"x-resourceId\": \"billing.meter\"\n      },\n      \"billing.meter_event\": {\n        \"description\": \"Meter events represent actions that customers take in your system. You can use meter events to bill a customer based on their usage. Meter events are associated with billing meters, which define both the contents of the event’s payload and how to aggregate those events.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"event_name\": {\n            \"description\": \"The name of the meter event. Corresponds with the `event_name` field on a meter.\",\n            \"maxLength\": 100,\n            \"type\": \"string\"\n          },\n          \"identifier\": {\n            \"description\": \"A unique identifier for the event.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.meter_event\"],\n            \"type\": \"string\"\n          },\n          \"payload\": {\n            \"additionalProperties\": {\n              \"maxLength\": 100,\n              \"type\": \"string\"\n            },\n            \"description\": \"The payload of the event. This contains the fields corresponding to a meter's `customer_mapping.event_payload_key` (default is `stripe_customer_id`) and `value_settings.event_payload_key` (default is `value`). Read more about the [payload](https://stripe.com/docs/billing/subscriptions/usage-based/recording-usage#payload-key-overrides).\",\n            \"type\": \"object\"\n          },\n          \"timestamp\": {\n            \"description\": \"The timestamp passed in when creating the event. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"event_name\",\n          \"identifier\",\n          \"livemode\",\n          \"object\",\n          \"payload\",\n          \"timestamp\"\n        ],\n        \"title\": \"BillingMeterEvent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"billing.meter_event\"\n      },\n      \"billing.meter_event_adjustment\": {\n        \"description\": \"A billing meter event adjustment is a resource that allows you to cancel a meter event. For example, you might create a billing meter event adjustment to cancel a meter event that was created in error or attached to the wrong customer.\",\n        \"properties\": {\n          \"cancel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/billing_meter_resource_billing_meter_event_adjustment_cancel\"\n              }\n            ],\n            \"description\": \"Specifies which event to cancel.\",\n            \"nullable\": true\n          },\n          \"event_name\": {\n            \"description\": \"The name of the meter event. Corresponds with the `event_name` field on a meter.\",\n            \"maxLength\": 100,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.meter_event_adjustment\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The meter event adjustment's status.\",\n            \"enum\": [\"complete\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Specifies whether to cancel a single event or a range of events for a time period. Time period cancellation is not supported yet.\",\n            \"enum\": [\"cancel\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"event_name\", \"livemode\", \"object\", \"status\", \"type\"],\n        \"title\": \"BillingMeterEventAdjustment\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"cancel\"],\n        \"x-resourceId\": \"billing.meter_event_adjustment\"\n      },\n      \"billing.meter_event_summary\": {\n        \"description\": \"A billing meter event summary represents an aggregated view of a customer's billing meter events within a specified timeframe. It indicates how much\\nusage was accrued by a customer for that period.\\n\\nNote: Meters events are aggregated asynchronously so the meter event summaries provide an eventually consistent view of the reported usage.\",\n        \"properties\": {\n          \"aggregated_value\": {\n            \"description\": \"Aggregated value of all the events within `start_time` (inclusive) and `end_time` (inclusive). The aggregation strategy is defined on meter via `default_aggregation`.\",\n            \"type\": \"number\"\n          },\n          \"end_time\": {\n            \"description\": \"End timestamp for this event summary (exclusive). Must be aligned with minute boundaries.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"meter\": {\n            \"description\": \"The meter associated with this event summary.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing.meter_event_summary\"],\n            \"type\": \"string\"\n          },\n          \"start_time\": {\n            \"description\": \"Start timestamp for this event summary (inclusive). Must be aligned with minute boundaries.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"aggregated_value\",\n          \"end_time\",\n          \"id\",\n          \"livemode\",\n          \"meter\",\n          \"object\",\n          \"start_time\"\n        ],\n        \"title\": \"BillingMeterEventSummary\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"billing.meter_event_summary\"\n      },\n      \"billing_clocks_resource_status_details_advancing_status_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"target_frozen_time\": {\n            \"description\": \"The `frozen_time` that the Test Clock is advancing towards.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"target_frozen_time\"],\n        \"title\": \"BillingClocksResourceStatusDetailsAdvancingStatusDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_clocks_resource_status_details_status_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"advancing\": {\n            \"$ref\": \"#/components/schemas/billing_clocks_resource_status_details_advancing_status_details\"\n          }\n        },\n        \"title\": \"BillingClocksResourceStatusDetailsStatusDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"advancing\"]\n      },\n      \"billing_credit_grants_resource_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"monetary\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/billing_credit_grants_resource_monetary_amount\"\n              }\n            ],\n            \"description\": \"The monetary amount.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"The type of this amount. We currently only support `monetary` billing credits.\",\n            \"enum\": [\"monetary\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"BillingCreditGrantsResourceAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"monetary\"]\n      },\n      \"billing_credit_grants_resource_applicability_config\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"scope\": {\n            \"$ref\": \"#/components/schemas/billing_credit_grants_resource_scope\"\n          }\n        },\n        \"required\": [\"scope\"],\n        \"title\": \"BillingCreditGrantsResourceApplicabilityConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"scope\"]\n      },\n      \"billing_credit_grants_resource_applicable_price\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"BillingCreditGrantsResourceApplicablePrice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_credit_grants_resource_balance_credit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"$ref\": \"#/components/schemas/billing_credit_grants_resource_amount\"\n          },\n          \"credits_application_invoice_voided\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/billing_credit_grants_resource_balance_credits_application_invoice_voided\"\n              }\n            ],\n            \"description\": \"Details of the invoice to which the reinstated credits were originally applied. Only present if `type` is `credits_application_invoice_voided`.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"The type of credit transaction.\",\n            \"enum\": [\"credits_application_invoice_voided\", \"credits_granted\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"type\"],\n        \"title\": \"BillingCreditGrantsResourceBalanceCredit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"amount\", \"credits_application_invoice_voided\"]\n      },\n      \"billing_credit_grants_resource_balance_credits_application_invoice_voided\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"The invoice to which the reinstated billing credits were originally applied.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"invoice_line_item\": {\n            \"description\": \"The invoice line item to which the reinstated billing credits were originally applied.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"invoice\", \"invoice_line_item\"],\n        \"title\": \"BillingCreditGrantsResourceBalanceCreditsApplicationInvoiceVoided\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"invoice\"]\n      },\n      \"billing_credit_grants_resource_balance_credits_applied\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"The invoice to which the billing credits were applied.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"invoice_line_item\": {\n            \"description\": \"The invoice line item to which the billing credits were applied.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"invoice\", \"invoice_line_item\"],\n        \"title\": \"BillingCreditGrantsResourceBalanceCreditsApplied\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"invoice\"]\n      },\n      \"billing_credit_grants_resource_balance_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"$ref\": \"#/components/schemas/billing_credit_grants_resource_amount\"\n          },\n          \"credits_applied\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/billing_credit_grants_resource_balance_credits_applied\"\n              }\n            ],\n            \"description\": \"Details of how the billing credits were applied to an invoice. Only present if `type` is `credits_applied`.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"The type of debit transaction.\",\n            \"enum\": [\"credits_applied\", \"credits_expired\", \"credits_voided\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"type\"],\n        \"title\": \"BillingCreditGrantsResourceBalanceDebit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"amount\", \"credits_applied\"]\n      },\n      \"billing_credit_grants_resource_monetary_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"A positive integer representing the amount.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"currency\", \"value\"],\n        \"title\": \"BillingCreditGrantsResourceMonetaryAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_credit_grants_resource_scope\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"price_type\": {\n            \"description\": \"The price type that credit grants can apply to. We currently only support the `metered` price type. This refers to prices that have a [Billing Meter](https://docs.stripe.com/api/billing/meter) attached to them.\",\n            \"enum\": [\"metered\"],\n            \"type\": \"string\"\n          },\n          \"prices\": {\n            \"description\": \"The prices that credit grants can apply to. We currently only support `metered` prices. This refers to prices that have a [Billing Meter](https://docs.stripe.com/api/billing/meter) attached to them.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/billing_credit_grants_resource_applicable_price\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"BillingCreditGrantsResourceScope\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"prices\"]\n      },\n      \"billing_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Billing address.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"Email address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Full name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"Billing phone number (including extension).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"billing_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"billing_meter_resource_aggregation_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"formula\": {\n            \"description\": \"Specifies how events are aggregated.\",\n            \"enum\": [\"count\", \"sum\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"formula\"],\n        \"title\": \"BillingMeterResourceAggregationSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_meter_resource_billing_meter_event_adjustment_cancel\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"identifier\": {\n            \"description\": \"Unique identifier for the event.\",\n            \"maxLength\": 100,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"BillingMeterResourceBillingMeterEventAdjustmentCancel\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_meter_resource_billing_meter_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deactivated_at\": {\n            \"description\": \"The time the meter was deactivated, if any. Measured in seconds since Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"BillingMeterResourceBillingMeterStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_meter_resource_billing_meter_value\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"event_payload_key\": {\n            \"description\": \"The key in the meter event payload to use as the value for this meter.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"event_payload_key\"],\n        \"title\": \"BillingMeterResourceBillingMeterValue\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_meter_resource_customer_mapping_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"event_payload_key\": {\n            \"description\": \"The key in the meter event payload to use for mapping the event to a customer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The method for mapping a meter event to a customer.\",\n            \"enum\": [\"by_id\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"event_payload_key\", \"type\"],\n        \"title\": \"BillingMeterResourceCustomerMappingSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"billing_portal.configuration\": {\n        \"description\": \"A portal configuration describes the functionality and behavior of a portal session.\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Whether the configuration is active and can be used to create portal sessions.\",\n            \"type\": \"boolean\"\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_application\"\n              }\n            ],\n            \"description\": \"ID of the Connect Application that created the configuration.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_application\"\n                }\n              ]\n            }\n          },\n          \"business_profile\": {\n            \"$ref\": \"#/components/schemas/portal_business_profile\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"default_return_url\": {\n            \"description\": \"The default URL to redirect customers to when they click on the portal's link to return to your website. This can be [overriden](https://stripe.com/docs/api/customer_portal/sessions/create#create_portal_session-return_url) when creating the session.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/portal_features\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"is_default\": {\n            \"description\": \"Whether the configuration is the default. If `true`, this configuration can be managed in the Dashboard and portal sessions will use this configuration unless it is overriden when creating the session.\",\n            \"type\": \"boolean\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"login_page\": {\n            \"$ref\": \"#/components/schemas/portal_login_page\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing_portal.configuration\"],\n            \"type\": \"string\"\n          },\n          \"updated\": {\n            \"description\": \"Time at which the object was last updated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"business_profile\",\n          \"created\",\n          \"features\",\n          \"id\",\n          \"is_default\",\n          \"livemode\",\n          \"login_page\",\n          \"object\",\n          \"updated\"\n        ],\n        \"title\": \"PortalConfiguration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application\",\n          \"business_profile\",\n          \"features\",\n          \"login_page\"\n        ],\n        \"x-resourceId\": \"billing_portal.configuration\"\n      },\n      \"billing_portal.session\": {\n        \"description\": \"The Billing customer portal is a Stripe-hosted UI for subscription and\\nbilling management.\\n\\nA portal configuration describes the functionality and features that you\\nwant to provide to your customers through the portal.\\n\\nA portal session describes the instantiation of the customer portal for\\na particular customer. By visiting the session's URL, the customer\\ncan manage their subscriptions and billing details. For security reasons,\\nsessions are short-lived and will expire if the customer does not visit the URL.\\nCreate sessions on-demand when customers intend to manage their subscriptions\\nand billing details.\\n\\nRelated guide: [Customer management](/customer-management)\",\n        \"properties\": {\n          \"configuration\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/billing_portal.configuration\"\n              }\n            ],\n            \"description\": \"The configuration used by this session, describing the features available.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/billing_portal.configuration\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"description\": \"The ID of the customer for this session.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"flow\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_flow\"\n              }\n            ],\n            \"description\": \"Information about a specific flow for the customer to go through. See the [docs](https://stripe.com/docs/customer-management/portal-deep-links) to learn more about using customer portal deep links and flows.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"locale\": {\n            \"description\": \"The IETF language tag of the locale Customer Portal is displayed in. If blank or auto, the customer’s `preferred_locales` or browser’s locale is used.\",\n            \"enum\": [\n              \"auto\",\n              \"bg\",\n              \"cs\",\n              \"da\",\n              \"de\",\n              \"el\",\n              \"en\",\n              \"en-AU\",\n              \"en-CA\",\n              \"en-GB\",\n              \"en-IE\",\n              \"en-IN\",\n              \"en-NZ\",\n              \"en-SG\",\n              \"es\",\n              \"es-419\",\n              \"et\",\n              \"fi\",\n              \"fil\",\n              \"fr\",\n              \"fr-CA\",\n              \"hr\",\n              \"hu\",\n              \"id\",\n              \"it\",\n              \"ja\",\n              \"ko\",\n              \"lt\",\n              \"lv\",\n              \"ms\",\n              \"mt\",\n              \"nb\",\n              \"nl\",\n              \"pl\",\n              \"pt\",\n              \"pt-BR\",\n              \"ro\",\n              \"ru\",\n              \"sk\",\n              \"sl\",\n              \"sv\",\n              \"th\",\n              \"tr\",\n              \"vi\",\n              \"zh\",\n              \"zh-HK\",\n              \"zh-TW\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"billing_portal.session\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"description\": \"The account for which the session was created on behalf of. When specified, only subscriptions and invoices with this `on_behalf_of` account appear in the portal. For more information, see the [docs](https://stripe.com/docs/connect/separate-charges-and-transfers#settlement-merchant). Use the [Accounts API](https://stripe.com/docs/api/accounts/object#account_object-settings-branding) to modify the `on_behalf_of` account's branding settings, which the portal displays.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"return_url\": {\n            \"description\": \"The URL to redirect customers to when they click on the portal's link to return to your website.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The short-lived URL of the session that gives customers access to the customer portal.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"configuration\",\n          \"created\",\n          \"customer\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"url\"\n        ],\n        \"title\": \"PortalSession\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"configuration\", \"flow\"],\n        \"x-resourceId\": \"billing_portal.session\"\n      },\n      \"cancellation_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"comment\": {\n            \"description\": \"Additional comments about why the user canceled the subscription, if the subscription was canceled explicitly by the user.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"feedback\": {\n            \"description\": \"The customer submitted reason for why they canceled, if the subscription was canceled explicitly by the user.\",\n            \"enum\": [\n              \"customer_service\",\n              \"low_quality\",\n              \"missing_features\",\n              \"other\",\n              \"switched_service\",\n              \"too_complex\",\n              \"too_expensive\",\n              \"unused\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"Why this subscription was canceled.\",\n            \"enum\": [\n              \"cancellation_requested\",\n              \"payment_disputed\",\n              \"payment_failed\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CancellationDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"capability\": {\n        \"description\": \"This is an object representing a capability for a Stripe account.\\n\\nRelated guide: [Account capabilities](https://stripe.com/docs/connect/account-capabilities)\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account for which the capability enables functionality.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"future_requirements\": {\n            \"$ref\": \"#/components/schemas/account_capability_future_requirements\"\n          },\n          \"id\": {\n            \"description\": \"The identifier for the capability.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"capability\"],\n            \"type\": \"string\"\n          },\n          \"requested\": {\n            \"description\": \"Whether the capability has been requested.\",\n            \"type\": \"boolean\"\n          },\n          \"requested_at\": {\n            \"description\": \"Time at which the capability was requested. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"requirements\": {\n            \"$ref\": \"#/components/schemas/account_capability_requirements\"\n          },\n          \"status\": {\n            \"description\": \"The status of the capability.\",\n            \"enum\": [\n              \"active\",\n              \"disabled\",\n              \"inactive\",\n              \"pending\",\n              \"unrequested\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"account\", \"id\", \"object\", \"requested\", \"status\"],\n        \"title\": \"AccountCapability\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account\",\n          \"future_requirements\",\n          \"requirements\"\n        ],\n        \"x-resourceId\": \"capability\"\n      },\n      \"card\": {\n        \"description\": \"You can store multiple cards on a customer in order to charge the customer\\nlater. You can also store multiple debit cards on a recipient in order to\\ntransfer to those cards later.\\n\\nRelated guide: [Card payments with Sources](https://stripe.com/docs/sources/cards)\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account this card belongs to. This attribute will not be in the card object if the card belongs to a customer or recipient instead. This property is only available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"address_city\": {\n            \"description\": \"City/District/Suburb/Town/Village.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_country\": {\n            \"description\": \"Billing address country, if provided when creating card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_line1\": {\n            \"description\": \"Address line 1 (Street address/PO Box/Company name).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_line1_check\": {\n            \"description\": \"If `address_line1` was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_line2\": {\n            \"description\": \"Address line 2 (Apartment/Suite/Unit/Building).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_state\": {\n            \"description\": \"State/County/Province/Region.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_zip\": {\n            \"description\": \"ZIP or postal code.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_zip_check\": {\n            \"description\": \"If `address_zip` was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"allow_redisplay\": {\n            \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to “unspecified”.\",\n            \"enum\": [\"always\", \"limited\", \"unspecified\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"available_payout_methods\": {\n            \"description\": \"A set of available payout methods for this card. Only values from this set should be passed as the `method` when creating a payout.\",\n            \"items\": {\n              \"enum\": [\"instant\", \"standard\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"brand\": {\n            \"description\": \"Card brand. Can be `American Express`, `Diners Club`, `Discover`, `Eftpos Australia`, `Girocard`, `JCB`, `MasterCard`, `UnionPay`, `Visa`, or `Unknown`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO code for currency](https://www.iso.org/iso-4217-currency-codes.html) in lowercase. Must be a [supported currency](https://docs.stripe.com/currencies). Only applicable on accounts (not customers or recipients). The card can be used as a transfer destination for funds in this currency. This property is only available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The customer that this card belongs to. This attribute will not be in the card object if the card belongs to an account or recipient instead.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"cvc_check\": {\n            \"description\": \"If a CVC was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`. A result of unchecked indicates that CVC was provided but hasn't been checked yet. Checks are typically performed when attaching a card to a Customer object, or when creating a charge. For more details, see [Check if a card is valid without a charge](https://support.stripe.com/questions/check-if-a-card-is-valid-without-a-charge).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"default_for_currency\": {\n            \"description\": \"Whether this card is the default external account for its currency. This property is only available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"dynamic_last4\": {\n            \"description\": \"(For tokenized numbers only.) The last four digits of the device account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"iin\": {\n            \"description\": \"Issuer identification number of the card.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"Cardholder name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"networks\": {\n            \"$ref\": \"#/components/schemas/token_card_networks\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"card\"],\n            \"type\": \"string\"\n          },\n          \"regulated_status\": {\n            \"description\": \"Status of a card based on the card issuer.\",\n            \"enum\": [\"regulated\", \"unregulated\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"For external accounts that are cards, possible values are `new` and `errored`. If a payout fails, the status is set to `errored` and [scheduled payouts](https://stripe.com/docs/payouts#payout-schedule) are stopped until account details are updated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tokenization_method\": {\n            \"description\": \"If the card number is tokenized, this is the method that was used. Can be `android_pay` (includes Google Pay), `apple_pay`, `masterpass`, `visa_checkout`, or null.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"brand\",\n          \"exp_month\",\n          \"exp_year\",\n          \"funding\",\n          \"id\",\n          \"last4\",\n          \"object\"\n        ],\n        \"title\": \"Card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account\", \"customer\", \"networks\"],\n        \"x-resourceId\": \"card\"\n      },\n      \"card_generated_from_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_present\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_present\"\n          },\n          \"type\": {\n            \"description\": \"The type of payment method transaction-specific details from the transaction that generated this `card` payment method. Always `card_present`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"card_generated_from_payment_method_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card_present\"]\n      },\n      \"card_issuing_account_terms_of_service\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"date\": {\n            \"description\": \"The Unix timestamp marking when the account representative accepted the service agreement.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ip\": {\n            \"description\": \"The IP address from which the account representative accepted the service agreement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user agent of the browser from which the account representative accepted the service agreement.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CardIssuingAccountTermsOfService\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"card_mandate_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"card_mandate_payment_method_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"cash_balance\": {\n        \"description\": \"A customer's `Cash balance` represents real funds. Customers can add funds to their cash balance by sending a bank transfer. These funds can be used for payment and can eventually be paid out to your bank account.\",\n        \"properties\": {\n          \"available\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"A hash of all cash balances available to this customer. You cannot delete a customer with any cash balances, even if the balance is 0. Amounts are represented in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"customer\": {\n            \"description\": \"The ID of the customer whose cash balance this object represents.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"cash_balance\"],\n            \"type\": \"string\"\n          },\n          \"settings\": {\n            \"$ref\": \"#/components/schemas/customer_balance_customer_balance_settings\"\n          }\n        },\n        \"required\": [\"customer\", \"livemode\", \"object\", \"settings\"],\n        \"title\": \"cash_balance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"settings\"],\n        \"x-resourceId\": \"cash_balance\"\n      },\n      \"charge\": {\n        \"description\": \"The `Charge` object represents a single attempt to move money into your Stripe account.\\nPaymentIntent confirmation is the most common way to create Charges, but transferring\\nmoney to a different Stripe account through Connect also creates Charges.\\nSome legacy payment flows create Charges directly, which is not recommended for new integrations.\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount intended to be collected by this payment. A positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or [equivalent in charge currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99).\",\n            \"type\": \"integer\"\n          },\n          \"amount_captured\": {\n            \"description\": \"Amount in cents (or local equivalent) captured (can be less than the amount attribute on the charge if a partial capture was made).\",\n            \"type\": \"integer\"\n          },\n          \"amount_refunded\": {\n            \"description\": \"Amount in cents (or local equivalent) refunded (can be less than the amount attribute on the charge if a partial refund was issued).\",\n            \"type\": \"integer\"\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              }\n            ],\n            \"description\": \"ID of the Connect application that created the charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                }\n              ]\n            }\n          },\n          \"application_fee\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application_fee\"\n              }\n            ],\n            \"description\": \"The application fee (if any) for the charge. [See the Connect documentation](https://stripe.com/docs/connect/direct-charges#collect-fees) for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application_fee\"\n                }\n              ]\n            }\n          },\n          \"application_fee_amount\": {\n            \"description\": \"The amount of the application fee (if any) requested for the charge. [See the Connect documentation](https://stripe.com/docs/connect/direct-charges#collect-fees) for details.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"ID of the balance transaction that describes the impact of this charge on your account balance (not including refunds or disputes).\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"billing_details\": {\n            \"$ref\": \"#/components/schemas/billing_details\"\n          },\n          \"calculated_statement_descriptor\": {\n            \"description\": \"The full statement descriptor that is passed to card networks, and that is displayed on your customers' credit card and bank statements. Allows you to see what the statement descriptor looks like after the static and dynamic portions are combined. This value only exists for card payments.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"captured\": {\n            \"description\": \"If the charge was created without capturing, this Boolean represents whether it is still uncaptured or has since been captured.\",\n            \"type\": \"boolean\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"ID of the customer this charge is for if one exists.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 40000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"disputed\": {\n            \"description\": \"Whether the charge has been disputed.\",\n            \"type\": \"boolean\"\n          },\n          \"failure_balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"ID of the balance transaction that describes the reversal of the balance on your account due to payment failure.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"failure_code\": {\n            \"description\": \"Error code explaining reason for charge failure if available (see [the errors section](https://stripe.com/docs/error-codes) for a list of codes).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"failure_message\": {\n            \"description\": \"Message to user further explaining reason for charge failure if available.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fraud_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/charge_fraud_details\"\n              }\n            ],\n            \"description\": \"Information on fraud assessments for the charge.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"ID of the invoice this charge is for if one exists.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"charge\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) the charge was made on behalf of without triggering an automatic transfer. See the [Connect documentation](https://stripe.com/docs/connect/separate-charges-and-transfers) for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"outcome\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/charge_outcome\"\n              }\n            ],\n            \"description\": \"Details about whether the payment was accepted, and why. See [understanding declines](https://stripe.com/docs/declines) for details.\",\n            \"nullable\": true\n          },\n          \"paid\": {\n            \"description\": \"`true` if the charge succeeded, or was successfully authorized for later capture.\",\n            \"type\": \"boolean\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"ID of the PaymentIntent associated with this charge, if one exists.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"payment_method\": {\n            \"description\": \"ID of the payment method used in this charge.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_method_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details\"\n              }\n            ],\n            \"description\": \"Details about the payment method at the time of the transaction.\",\n            \"nullable\": true\n          },\n          \"radar_options\": {\n            \"$ref\": \"#/components/schemas/radar_radar_options\"\n          },\n          \"receipt_email\": {\n            \"description\": \"This is the email address that the receipt for this charge was sent to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"receipt_number\": {\n            \"description\": \"This is the transaction number that appears on email receipts sent for this charge. This attribute will be `null` until a receipt has been sent.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"receipt_url\": {\n            \"description\": \"This is the URL to view the receipt for this charge. The receipt is kept up-to-date to the latest state of the charge, including any refunds. If the charge is for an Invoice, the receipt will be stylized as an Invoice receipt.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refunded\": {\n            \"description\": \"Whether the charge has been fully refunded. If the charge is only partially refunded, this attribute will still be false.\",\n            \"type\": \"boolean\"\n          },\n          \"refunds\": {\n            \"description\": \"A list of refunds that have been applied to the charge.\",\n            \"nullable\": true,\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"RefundList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"review\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/review\"\n              }\n            ],\n            \"description\": \"ID of the review associated with this charge if one exists.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/review\"\n                }\n              ]\n            }\n          },\n          \"shipping\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping\"\n              }\n            ],\n            \"description\": \"Shipping information for the charge.\",\n            \"nullable\": true\n          },\n          \"source_transfer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/transfer\"\n              }\n            ],\n            \"description\": \"The transfer ID which created this charge. Only present if the charge came from another Stripe account. [See the Connect documentation](https://docs.stripe.com/connect/destination-charges) for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/transfer\"\n                }\n              ]\n            }\n          },\n          \"statement_descriptor\": {\n            \"description\": \"For a non-card charge, text that appears on the customer's statement as the statement descriptor. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\\n\\nFor a card charge, this value is ignored unless you don't specify a `statement_descriptor_suffix`, in which case this value is used as the suffix.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_suffix\": {\n            \"description\": \"Provides information about a card charge. Concatenated to the account's [statement descriptor prefix](https://docs.stripe.com/get-started/account/statement-descriptors#static) to form the complete statement descriptor that appears on the customer's statement. If the account has no prefix value, the suffix is concatenated to the account's statement descriptor.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the payment is either `succeeded`, `pending`, or `failed`.\",\n            \"enum\": [\"failed\", \"pending\", \"succeeded\"],\n            \"type\": \"string\"\n          },\n          \"transfer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/transfer\"\n              }\n            ],\n            \"description\": \"ID of the transfer to the `destination` account (only applicable if the charge was created using the `destination` parameter).\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/transfer\"\n                }\n              ]\n            }\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/charge_transfer_data\"\n              }\n            ],\n            \"description\": \"An optional dictionary including the account to automatically transfer to as part of a destination charge. [See the Connect documentation](https://stripe.com/docs/connect/destination-charges) for details.\",\n            \"nullable\": true\n          },\n          \"transfer_group\": {\n            \"description\": \"A string that identifies this transaction as part of a group. See the [Connect documentation](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-options) for details.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"amount_captured\",\n          \"amount_refunded\",\n          \"billing_details\",\n          \"captured\",\n          \"created\",\n          \"currency\",\n          \"disputed\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"paid\",\n          \"refunded\",\n          \"status\"\n        ],\n        \"title\": \"Charge\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application\",\n          \"application_fee\",\n          \"balance_transaction\",\n          \"billing_details\",\n          \"customer\",\n          \"failure_balance_transaction\",\n          \"fraud_details\",\n          \"invoice\",\n          \"on_behalf_of\",\n          \"outcome\",\n          \"payment_intent\",\n          \"payment_method_details\",\n          \"radar_options\",\n          \"refunds\",\n          \"review\",\n          \"shipping\",\n          \"source_transfer\",\n          \"transfer\",\n          \"transfer_data\"\n        ],\n        \"x-resourceId\": \"charge\"\n      },\n      \"charge_fraud_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"stripe_report\": {\n            \"description\": \"Assessments from Stripe. If set, the value is `fraudulent`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"user_report\": {\n            \"description\": \"Assessments reported by you. If set, possible values of are `safe` and `fraudulent`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"ChargeFraudDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"charge_outcome\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"advice_code\": {\n            \"description\": \"An enumerated value providing a more detailed explanation on [how to proceed with an error](https://stripe.com/docs/declines#retrying-issuer-declines).\",\n            \"enum\": [\n              \"confirm_card_data\",\n              \"do_not_try_again\",\n              \"try_again_later\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network_advice_code\": {\n            \"description\": \"For charges declined by the network, a 2 digit code which indicates the advice returned by the network on how to proceed with an error.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network_decline_code\": {\n            \"description\": \"For charges declined by the network, a brand specific 2, 3, or 4 digit code which indicates the reason the authorization failed.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network_status\": {\n            \"description\": \"Possible values are `approved_by_network`, `declined_by_network`, `not_sent_to_network`, and `reversed_after_approval`. The value `reversed_after_approval` indicates the payment was [blocked by Stripe](https://stripe.com/docs/declines#blocked-payments) after bank authorization, and may temporarily appear as \\\"pending\\\" on a cardholder's statement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"An enumerated value providing a more detailed explanation of the outcome's `type`. Charges blocked by Radar's default block rule have the value `highest_risk_level`. Charges placed in review by Radar's default review rule have the value `elevated_risk_level`. Charges authorized, blocked, or placed in review by custom rules have the value `rule`. See [understanding declines](https://stripe.com/docs/declines) for more details.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"risk_level\": {\n            \"description\": \"Stripe Radar's evaluation of the riskiness of the payment. Possible values for evaluated payments are `normal`, `elevated`, `highest`. For non-card payments, and card-based payments predating the public assignment of risk levels, this field will have the value `not_assessed`. In the event of an error in the evaluation, this field will have the value `unknown`. This field is only available with Radar.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"risk_score\": {\n            \"description\": \"Stripe Radar's evaluation of the riskiness of the payment. Possible values for evaluated payments are between 0 and 100. For non-card payments, card-based payments predating the public assignment of risk scores, or in the event of an error during evaluation, this field will not be present. This field is only available with Radar for Fraud Teams.\",\n            \"type\": \"integer\"\n          },\n          \"rule\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/rule\"\n              }\n            ],\n            \"description\": \"The ID of the Radar rule that matched the payment, if applicable.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/rule\"\n                }\n              ]\n            }\n          },\n          \"seller_message\": {\n            \"description\": \"A human-readable description of the outcome type and reason, designed for you (the recipient of the payment), not your customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Possible values are `authorized`, `manual_review`, `issuer_declined`, `blocked`, and `invalid`. See [understanding declines](https://stripe.com/docs/declines) and [Radar reviews](https://stripe.com/docs/radar/reviews) for details.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"ChargeOutcome\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"rule\"]\n      },\n      \"charge_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount transferred to the destination account, if specified. By default, the entire charge amount is transferred to the destination account.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"ID of an existing, connected Stripe account to transfer funds to if `transfer_data` was specified in the charge request.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"destination\"],\n        \"title\": \"ChargeTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"destination\"]\n      },\n      \"checkout.session\": {\n        \"description\": \"A Checkout Session represents your customer's session as they pay for\\none-time purchases or subscriptions through [Checkout](https://stripe.com/docs/payments/checkout)\\nor [Payment Links](https://stripe.com/docs/payments/payment-links). We recommend creating a\\nnew Session each time your customer attempts to pay.\\n\\nOnce payment is successful, the Checkout Session will contain a reference\\nto the [Customer](https://stripe.com/docs/api/customers), and either the successful\\n[PaymentIntent](https://stripe.com/docs/api/payment_intents) or an active\\n[Subscription](https://stripe.com/docs/api/subscriptions).\\n\\nYou can create a Checkout Session on your server and redirect to its URL\\nto begin Checkout.\\n\\nRelated guide: [Checkout quickstart](https://stripe.com/docs/checkout/quickstart)\",\n        \"properties\": {\n          \"adaptive_pricing\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_adaptive_pricing\"\n              }\n            ],\n            \"description\": \"Settings for price localization with [Adaptive Pricing](https://docs.stripe.com/payments/checkout/adaptive-pricing).\",\n            \"nullable\": true\n          },\n          \"after_expiration\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_after_expiration\"\n              }\n            ],\n            \"description\": \"When set, provides configuration for actions to take if this Checkout Session expires.\",\n            \"nullable\": true\n          },\n          \"allow_promotion_codes\": {\n            \"description\": \"Enables user redeemable promotion codes.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"amount_subtotal\": {\n            \"description\": \"Total of all items before discounts or taxes are applied.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total of all items after discounts and taxes are applied.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"automatic_tax\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_automatic_tax\"\n          },\n          \"billing_address_collection\": {\n            \"description\": \"Describes whether Checkout should collect the customer's billing address. Defaults to `auto`.\",\n            \"enum\": [\"auto\", \"required\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cancel_url\": {\n            \"description\": \"If set, Checkout displays a back button and customers will be directed to this URL if they decide to cancel payment and return to your website.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"client_reference_id\": {\n            \"description\": \"A unique string to reference the Checkout Session. This can be a\\ncustomer ID, a cart ID, or similar, and can be used to reconcile the\\nSession with your internal systems.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"client_secret\": {\n            \"description\": \"Client secret to be used when initializing Stripe.js embedded checkout.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"collected_information\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_collected_information\"\n              }\n            ],\n            \"description\": \"Information about the customer collected within the Checkout Session.\",\n            \"nullable\": true\n          },\n          \"consent\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_consent\"\n              }\n            ],\n            \"description\": \"Results of `consent_collection` for this session.\",\n            \"nullable\": true\n          },\n          \"consent_collection\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_consent_collection\"\n              }\n            ],\n            \"description\": \"When set, provides configuration for the Checkout Session to gather active consent from customers.\",\n            \"nullable\": true\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"currency_conversion\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_currency_conversion\"\n              }\n            ],\n            \"description\": \"Currency conversion details for [Adaptive Pricing](https://docs.stripe.com/payments/checkout/adaptive-pricing) sessions\",\n            \"nullable\": true\n          },\n          \"custom_fields\": {\n            \"description\": \"Collect additional information from your customer using custom fields. Up to 3 fields are supported.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_fields\"\n            },\n            \"type\": \"array\"\n          },\n          \"custom_text\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_text\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The ID of the customer for this Session.\\nFor Checkout Sessions in `subscription` mode or Checkout Sessions with `customer_creation` set as `always` in `payment` mode, Checkout\\nwill create a new customer object based on information provided\\nduring the payment flow unless an existing customer was provided when\\nthe Session was created.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"customer_creation\": {\n            \"description\": \"Configure whether a Checkout Session creates a Customer when the Checkout Session completes.\",\n            \"enum\": [\"always\", \"if_required\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_customer_details\"\n              }\n            ],\n            \"description\": \"The customer details including the customer's tax exempt status and the customer's tax IDs. Customer's address details are not present on Sessions in `setup` mode.\",\n            \"nullable\": true\n          },\n          \"customer_email\": {\n            \"description\": \"If provided, this value will be used when the Customer object is created.\\nIf not provided, customers will be asked to enter their email address.\\nUse this parameter to prefill customer data if you already have an email\\non file. To access information about the customer once the payment flow is\\ncomplete, use the `customer` attribute.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discounts\": {\n            \"description\": \"List of coupons and promotion codes attached to the Checkout Session.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_pages_checkout_session_discount\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which the Checkout Session will expire.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"ID of the invoice created by the Checkout Session, if it exists.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"invoice_creation\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_invoice_creation\"\n              }\n            ],\n            \"description\": \"Details on the state of invoice creation for the Checkout Session.\",\n            \"nullable\": true\n          },\n          \"line_items\": {\n            \"description\": \"The line items purchased by the customer.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"PaymentPagesCheckoutSessionListLineItems\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"locale\": {\n            \"description\": \"The IETF language tag of the locale Checkout is displayed in. If blank or `auto`, the browser's locale is used.\",\n            \"enum\": [\n              \"auto\",\n              \"bg\",\n              \"cs\",\n              \"da\",\n              \"de\",\n              \"el\",\n              \"en\",\n              \"en-GB\",\n              \"es\",\n              \"es-419\",\n              \"et\",\n              \"fi\",\n              \"fil\",\n              \"fr\",\n              \"fr-CA\",\n              \"hr\",\n              \"hu\",\n              \"id\",\n              \"it\",\n              \"ja\",\n              \"ko\",\n              \"lt\",\n              \"lv\",\n              \"ms\",\n              \"mt\",\n              \"nb\",\n              \"nl\",\n              \"pl\",\n              \"pt\",\n              \"pt-BR\",\n              \"ro\",\n              \"ru\",\n              \"sk\",\n              \"sl\",\n              \"sv\",\n              \"th\",\n              \"tr\",\n              \"vi\",\n              \"zh\",\n              \"zh-HK\",\n              \"zh-TW\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"mode\": {\n            \"description\": \"The mode of the Checkout Session.\",\n            \"enum\": [\"payment\", \"setup\", \"subscription\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"checkout.session\"],\n            \"type\": \"string\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"The ID of the PaymentIntent for Checkout Sessions in `payment` mode. You can't confirm or cancel the PaymentIntent for a Checkout Session. To cancel, [expire the Checkout Session](https://stripe.com/docs/api/checkout/sessions/expire) instead.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"payment_link\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_link\"\n              }\n            ],\n            \"description\": \"The ID of the Payment Link that created this Session.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_link\"\n                }\n              ]\n            }\n          },\n          \"payment_method_collection\": {\n            \"description\": \"Configure whether a Checkout Session should collect a payment method. Defaults to `always`.\",\n            \"enum\": [\"always\", \"if_required\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_method_configuration_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_config_biz_payment_method_configuration_details\"\n              }\n            ],\n            \"description\": \"Information about the payment method configuration used for this Checkout session if using dynamic payment methods.\",\n            \"nullable\": true\n          },\n          \"payment_method_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/checkout_session_payment_method_options\"\n              }\n            ],\n            \"description\": \"Payment-method-specific configuration for the PaymentIntent or SetupIntent of this CheckoutSession.\",\n            \"nullable\": true\n          },\n          \"payment_method_types\": {\n            \"description\": \"A list of the types of payment methods (e.g. card) this Checkout\\nSession is allowed to accept.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"payment_status\": {\n            \"description\": \"The payment status of the Checkout Session, one of `paid`, `unpaid`, or `no_payment_required`.\\nYou can use this value to decide when to fulfill your customer's order.\",\n            \"enum\": [\"no_payment_required\", \"paid\", \"unpaid\"],\n            \"type\": \"string\"\n          },\n          \"phone_number_collection\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_phone_number_collection\"\n          },\n          \"recovered_from\": {\n            \"description\": \"The ID of the original expired Checkout Session that triggered the recovery flow.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"redirect_on_completion\": {\n            \"description\": \"This parameter applies to `ui_mode: embedded`. Learn more about the [redirect behavior](https://stripe.com/docs/payments/checkout/custom-success-page?payment-ui=embedded-form) of embedded sessions. Defaults to `always`.\",\n            \"enum\": [\"always\", \"if_required\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"return_url\": {\n            \"description\": \"Applies to Checkout Sessions with `ui_mode: embedded`. The URL to redirect your customer back to after they authenticate or cancel their payment on the payment method's app or site.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"saved_payment_method_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_saved_payment_method_options\"\n              }\n            ],\n            \"description\": \"Controls saved payment method settings for the session. Only available in `payment` and `subscription` mode.\",\n            \"nullable\": true\n          },\n          \"setup_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent\"\n              }\n            ],\n            \"description\": \"The ID of the SetupIntent for Checkout Sessions in `setup` mode. You can't confirm or cancel the SetupIntent for a Checkout Session. To cancel, [expire the Checkout Session](https://stripe.com/docs/api/checkout/sessions/expire) instead.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              ]\n            }\n          },\n          \"shipping_address_collection\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_shipping_address_collection\"\n              }\n            ],\n            \"description\": \"When set, provides configuration for Checkout to collect a shipping address from a customer.\",\n            \"nullable\": true\n          },\n          \"shipping_cost\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_shipping_cost\"\n              }\n            ],\n            \"description\": \"The details of the customer cost of shipping, including the customer chosen ShippingRate.\",\n            \"nullable\": true\n          },\n          \"shipping_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping\"\n              }\n            ],\n            \"description\": \"Shipping information for this Checkout Session.\",\n            \"nullable\": true\n          },\n          \"shipping_options\": {\n            \"description\": \"The shipping rate options applied to this Session.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_pages_checkout_session_shipping_option\"\n            },\n            \"type\": \"array\"\n          },\n          \"status\": {\n            \"description\": \"The status of the Checkout Session, one of `open`, `complete`, or `expired`.\",\n            \"enum\": [\"complete\", \"expired\", \"open\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"submit_type\": {\n            \"description\": \"Describes the type of transaction being performed by Checkout in order to customize\\nrelevant text on the page, such as the submit button. `submit_type` can only be\\nspecified on Checkout Sessions in `payment` mode. If blank or `auto`, `pay` is used.\",\n            \"enum\": [\"auto\", \"book\", \"donate\", \"pay\", \"subscribe\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"subscription\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription\"\n              }\n            ],\n            \"description\": \"The ID of the subscription for Checkout Sessions in `subscription` mode.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              ]\n            }\n          },\n          \"success_url\": {\n            \"description\": \"The URL the customer will be directed to after the payment or\\nsubscription creation is successful.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_id_collection\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_tax_id_collection\"\n          },\n          \"total_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_total_details\"\n              }\n            ],\n            \"description\": \"Tax and discount details for the computed total amount.\",\n            \"nullable\": true\n          },\n          \"ui_mode\": {\n            \"description\": \"The UI mode of the Session. Defaults to `hosted`.\",\n            \"enum\": [\"embedded\", \"hosted\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"url\": {\n            \"description\": \"The URL to the Checkout Session. Redirect customers to this URL to take them to Checkout. If you’re using [Custom Domains](https://stripe.com/docs/payments/checkout/custom-domains), the URL will use your subdomain. Otherwise, it’ll use `checkout.stripe.com.`\\nThis value is only present when the session is active.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"automatic_tax\",\n          \"created\",\n          \"custom_fields\",\n          \"custom_text\",\n          \"expires_at\",\n          \"id\",\n          \"livemode\",\n          \"mode\",\n          \"object\",\n          \"payment_method_types\",\n          \"payment_status\",\n          \"shipping_options\"\n        ],\n        \"title\": \"Session\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"adaptive_pricing\",\n          \"after_expiration\",\n          \"automatic_tax\",\n          \"collected_information\",\n          \"consent\",\n          \"consent_collection\",\n          \"currency_conversion\",\n          \"custom_fields\",\n          \"custom_text\",\n          \"customer\",\n          \"customer_details\",\n          \"discounts\",\n          \"invoice\",\n          \"invoice_creation\",\n          \"line_items\",\n          \"payment_intent\",\n          \"payment_link\",\n          \"payment_method_configuration_details\",\n          \"payment_method_options\",\n          \"phone_number_collection\",\n          \"saved_payment_method_options\",\n          \"setup_intent\",\n          \"shipping_address_collection\",\n          \"shipping_cost\",\n          \"shipping_details\",\n          \"shipping_options\",\n          \"subscription\",\n          \"tax_id_collection\",\n          \"total_details\"\n        ],\n        \"x-resourceId\": \"checkout.session\"\n      },\n      \"checkout_acss_debit_mandate_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom_mandate_url\": {\n            \"description\": \"A URL for custom mandate text\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"default_for\": {\n            \"description\": \"List of Stripe products where this mandate can be selected automatically. Returned when the Session is in `setup` mode.\",\n            \"items\": {\n              \"enum\": [\"invoice\", \"subscription\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"interval_description\": {\n            \"description\": \"Description of the interval. Only required if the 'payment_schedule' parameter is 'interval' or 'combined'.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_schedule\": {\n            \"description\": \"Payment schedule for the mandate.\",\n            \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_type\": {\n            \"description\": \"Transaction type of the mandate.\",\n            \"enum\": [\"business\", \"personal\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutAcssDebitMandateOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_acss_debit_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"currency\": {\n            \"description\": \"Currency supported by the bank account. Returned when the Session is in `setup` mode.\",\n            \"enum\": [\"cad\", \"usd\"],\n            \"type\": \"string\"\n          },\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/checkout_acss_debit_mandate_options\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"CheckoutAcssDebitPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"checkout_affirm_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutAffirmPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_afterpay_clearpay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutAfterpayClearpayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_alipay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutAlipayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_amazon_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutAmazonPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_au_becs_debit_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutAuBecsDebitPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_bacs_debit_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/checkout_payment_method_options_mandate_options_bacs_debit\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutBacsDebitPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"checkout_bancontact_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutBancontactPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_boleto_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after_days\": {\n            \"description\": \"The number of calendar days before a Boleto voucher expires. For example, if you create a Boleto voucher on Monday and you set expires_after_days to 2, the Boleto voucher will expire on Wednesday at 23:59 America/Sao_Paulo time.\",\n            \"type\": \"integer\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"expires_after_days\"],\n        \"title\": \"CheckoutBoletoPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_card_installments_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Indicates if installments are enabled\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"CheckoutCardInstallmentsOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_card_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"installments\": {\n            \"$ref\": \"#/components/schemas/checkout_card_installments_options\"\n          },\n          \"request_extended_authorization\": {\n            \"description\": \"Request ability to [capture beyond the standard authorization validity window](/payments/extended-authorization) for this CheckoutSession.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_incremental_authorization\": {\n            \"description\": \"Request ability to [increment the authorization](/payments/incremental-authorization) for this CheckoutSession.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_multicapture\": {\n            \"description\": \"Request ability to make [multiple captures](/payments/multicapture) for this CheckoutSession.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_overcapture\": {\n            \"description\": \"Request ability to [overcapture](/payments/overcapture) for this CheckoutSession.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_three_d_secure\": {\n            \"description\": \"We strongly recommend that you rely on our SCA Engine to automatically prompt your customers for authentication based on risk level and [other requirements](https://stripe.com/docs/strong-customer-authentication). However, if you wish to request 3D Secure based on logic from your own fraud engine, provide this option. If not provided, this value defaults to `automatic`. Read our guide on [manually requesting 3D Secure](https://stripe.com/docs/payments/3d-secure/authentication-flow#manual-three-ds) for more information on how this configuration interacts with Radar and our SCA Engine.\",\n            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"restrictions\": {\n            \"$ref\": \"#/components/schemas/payment_pages_private_card_payment_method_options_resource_restrictions\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_suffix_kana\": {\n            \"description\": \"Provides information about a card payment that customers see on their statements. Concatenated with the Kana prefix (shortened Kana descriptor) or Kana statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters. On card statements, the *concatenation* of both prefix and suffix (including separators) will appear truncated to 22 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_suffix_kanji\": {\n            \"description\": \"Provides information about a card payment that customers see on their statements. Concatenated with the Kanji prefix (shortened Kanji descriptor) or Kanji statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 17 characters. On card statements, the *concatenation* of both prefix and suffix (including separators) will appear truncated to 17 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"request_three_d_secure\"],\n        \"title\": \"CheckoutCardPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"installments\", \"restrictions\"]\n      },\n      \"checkout_cashapp_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutCashappPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_customer_balance_bank_transfer_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"eu_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/payment_method_options_customer_balance_eu_bank_account\"\n          },\n          \"requested_address_types\": {\n            \"description\": \"List of address types that should be returned in the financial_addresses response. If not specified, all valid types will be returned.\\n\\nPermitted values include: `sort_code`, `zengin`, `iban`, or `spei`.\",\n            \"items\": {\n              \"enum\": [\n                \"aba\",\n                \"iban\",\n                \"sepa\",\n                \"sort_code\",\n                \"spei\",\n                \"swift\",\n                \"zengin\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"type\": {\n            \"description\": \"The bank transfer type that this PaymentIntent is allowed to use for funding Permitted values include: `eu_bank_transfer`, `gb_bank_transfer`, `jp_bank_transfer`, `mx_bank_transfer`, or `us_bank_transfer`.\",\n            \"enum\": [\n              \"eu_bank_transfer\",\n              \"gb_bank_transfer\",\n              \"jp_bank_transfer\",\n              \"mx_bank_transfer\",\n              \"us_bank_transfer\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"CheckoutCustomerBalanceBankTransferPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"eu_bank_transfer\"]\n      },\n      \"checkout_customer_balance_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_transfer\": {\n            \"$ref\": \"#/components/schemas/checkout_customer_balance_bank_transfer_payment_method_options\"\n          },\n          \"funding_type\": {\n            \"description\": \"The funding method type to be used when there are not enough funds in the customer balance. Permitted values include: `bank_transfer`.\",\n            \"enum\": [\"bank_transfer\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutCustomerBalancePaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"bank_transfer\"]\n      },\n      \"checkout_eps_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutEpsPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_fpx_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutFpxPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_giropay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutGiropayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_grab_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutGrabPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_ideal_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutIdealPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_kakao_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutKakaoPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_klarna_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutKlarnaPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_konbini_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after_days\": {\n            \"description\": \"The number of calendar days (between 1 and 60) after which Konbini payment instructions will expire. For example, if a PaymentIntent is confirmed with Konbini and `expires_after_days` set to 2 on Monday JST, the instructions will expire on Wednesday 23:59:59 JST.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutKonbiniPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_kr_card_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutKrCardPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_link_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutLinkPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_mobilepay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutMobilepayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_multibanco_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutMultibancoPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_naver_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutNaverPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_oxxo_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after_days\": {\n            \"description\": \"The number of calendar days before an OXXO invoice expires. For example, if you create an OXXO invoice on Monday and you set expires_after_days to 2, the OXXO invoice will expire on Wednesday at 23:59 America/Mexico_City time.\",\n            \"type\": \"integer\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"expires_after_days\"],\n        \"title\": \"CheckoutOxxoPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_p24_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutP24PaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_payco_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutPaycoPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_payment_method_options_mandate_options_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference_prefix\": {\n            \"description\": \"Prefix used to generate the Mandate reference. Must be at most 12 characters long. Must consist of only uppercase letters, numbers, spaces, or the following special characters: '/', '_', '-', '&', '.'. Cannot begin with 'DDIC' or 'STRIPE'.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"checkout_payment_method_options_mandate_options_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_payment_method_options_mandate_options_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference_prefix\": {\n            \"description\": \"Prefix used to generate the Mandate reference. Must be at most 12 characters long. Must consist of only uppercase letters, numbers, spaces, or the following special characters: '/', '_', '-', '&', '.'. Cannot begin with 'STRIPE'.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"checkout_payment_method_options_mandate_options_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_paynow_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutPaynowPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_paypal_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"preferred_locale\": {\n            \"description\": \"Preferred locale of the PayPal checkout page that the customer is redirected to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"A reference of the PayPal transaction visible to customer which is mapped to PayPal's invoice ID. This must be a globally unique ID if you have configured in your PayPal settings to block multiple payments per invoice ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutPaypalPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_pix_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after_seconds\": {\n            \"description\": \"The number of seconds after which Pix payment will expire.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"CheckoutPixPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_revolut_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutRevolutPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_samsung_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutSamsungPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_sepa_debit_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/checkout_payment_method_options_mandate_options_sepa_debit\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutSepaDebitPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"checkout_session_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/checkout_acss_debit_payment_method_options\"\n          },\n          \"affirm\": {\n            \"$ref\": \"#/components/schemas/checkout_affirm_payment_method_options\"\n          },\n          \"afterpay_clearpay\": {\n            \"$ref\": \"#/components/schemas/checkout_afterpay_clearpay_payment_method_options\"\n          },\n          \"alipay\": {\n            \"$ref\": \"#/components/schemas/checkout_alipay_payment_method_options\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/checkout_amazon_pay_payment_method_options\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/checkout_au_becs_debit_payment_method_options\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/checkout_bacs_debit_payment_method_options\"\n          },\n          \"bancontact\": {\n            \"$ref\": \"#/components/schemas/checkout_bancontact_payment_method_options\"\n          },\n          \"boleto\": {\n            \"$ref\": \"#/components/schemas/checkout_boleto_payment_method_options\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/checkout_card_payment_method_options\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/checkout_cashapp_payment_method_options\"\n          },\n          \"customer_balance\": {\n            \"$ref\": \"#/components/schemas/checkout_customer_balance_payment_method_options\"\n          },\n          \"eps\": {\n            \"$ref\": \"#/components/schemas/checkout_eps_payment_method_options\"\n          },\n          \"fpx\": {\n            \"$ref\": \"#/components/schemas/checkout_fpx_payment_method_options\"\n          },\n          \"giropay\": {\n            \"$ref\": \"#/components/schemas/checkout_giropay_payment_method_options\"\n          },\n          \"grabpay\": {\n            \"$ref\": \"#/components/schemas/checkout_grab_pay_payment_method_options\"\n          },\n          \"ideal\": {\n            \"$ref\": \"#/components/schemas/checkout_ideal_payment_method_options\"\n          },\n          \"kakao_pay\": {\n            \"$ref\": \"#/components/schemas/checkout_kakao_pay_payment_method_options\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/checkout_klarna_payment_method_options\"\n          },\n          \"konbini\": {\n            \"$ref\": \"#/components/schemas/checkout_konbini_payment_method_options\"\n          },\n          \"kr_card\": {\n            \"$ref\": \"#/components/schemas/checkout_kr_card_payment_method_options\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/checkout_link_payment_method_options\"\n          },\n          \"mobilepay\": {\n            \"$ref\": \"#/components/schemas/checkout_mobilepay_payment_method_options\"\n          },\n          \"multibanco\": {\n            \"$ref\": \"#/components/schemas/checkout_multibanco_payment_method_options\"\n          },\n          \"naver_pay\": {\n            \"$ref\": \"#/components/schemas/checkout_naver_pay_payment_method_options\"\n          },\n          \"oxxo\": {\n            \"$ref\": \"#/components/schemas/checkout_oxxo_payment_method_options\"\n          },\n          \"p24\": {\n            \"$ref\": \"#/components/schemas/checkout_p24_payment_method_options\"\n          },\n          \"payco\": {\n            \"$ref\": \"#/components/schemas/checkout_payco_payment_method_options\"\n          },\n          \"paynow\": {\n            \"$ref\": \"#/components/schemas/checkout_paynow_payment_method_options\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/checkout_paypal_payment_method_options\"\n          },\n          \"pix\": {\n            \"$ref\": \"#/components/schemas/checkout_pix_payment_method_options\"\n          },\n          \"revolut_pay\": {\n            \"$ref\": \"#/components/schemas/checkout_revolut_pay_payment_method_options\"\n          },\n          \"samsung_pay\": {\n            \"$ref\": \"#/components/schemas/checkout_samsung_pay_payment_method_options\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/checkout_sepa_debit_payment_method_options\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/checkout_sofort_payment_method_options\"\n          },\n          \"swish\": {\n            \"$ref\": \"#/components/schemas/checkout_swish_payment_method_options\"\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/checkout_us_bank_account_payment_method_options\"\n          }\n        },\n        \"title\": \"CheckoutSessionPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"affirm\",\n          \"afterpay_clearpay\",\n          \"alipay\",\n          \"amazon_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"bancontact\",\n          \"boleto\",\n          \"card\",\n          \"cashapp\",\n          \"customer_balance\",\n          \"eps\",\n          \"fpx\",\n          \"giropay\",\n          \"grabpay\",\n          \"ideal\",\n          \"kakao_pay\",\n          \"klarna\",\n          \"konbini\",\n          \"kr_card\",\n          \"link\",\n          \"mobilepay\",\n          \"multibanco\",\n          \"naver_pay\",\n          \"oxxo\",\n          \"p24\",\n          \"payco\",\n          \"paynow\",\n          \"paypal\",\n          \"pix\",\n          \"revolut_pay\",\n          \"samsung_pay\",\n          \"sepa_debit\",\n          \"sofort\",\n          \"swish\",\n          \"us_bank_account\"\n        ]\n      },\n      \"checkout_sofort_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutSofortPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_swish_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The order reference that will be displayed to customers in the Swish application. Defaults to the `id` of the Payment Intent.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CheckoutSwishPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"checkout_us_bank_account_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"financial_connections\": {\n            \"$ref\": \"#/components/schemas/linked_account_options_us_bank_account\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"CheckoutUsBankAccountPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"financial_connections\"]\n      },\n      \"climate.order\": {\n        \"description\": \"Orders represent your intent to purchase a particular Climate product. When you create an order, the\\npayment is deducted from your merchant balance.\",\n        \"properties\": {\n          \"amount_fees\": {\n            \"description\": \"Total amount of [Frontier](https://frontierclimate.com/)'s service fees in the currency's smallest unit.\",\n            \"type\": \"integer\"\n          },\n          \"amount_subtotal\": {\n            \"description\": \"Total amount of the carbon removal in the currency's smallest unit.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total amount of the order including fees in the currency's smallest unit.\",\n            \"type\": \"integer\"\n          },\n          \"beneficiary\": {\n            \"$ref\": \"#/components/schemas/climate_removals_beneficiary\"\n          },\n          \"canceled_at\": {\n            \"description\": \"Time at which the order was canceled. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cancellation_reason\": {\n            \"description\": \"Reason for the cancellation of this order.\",\n            \"enum\": [\"expired\", \"product_unavailable\", \"requested\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"certificate\": {\n            \"description\": \"For delivered orders, a URL to a delivery certificate for the order.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"confirmed_at\": {\n            \"description\": \"Time at which the order was confirmed. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase, representing the currency for this order.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"delayed_at\": {\n            \"description\": \"Time at which the order's expected_delivery_year was delayed. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"delivered_at\": {\n            \"description\": \"Time at which the order was delivered. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"delivery_details\": {\n            \"description\": \"Details about the delivery of carbon removal for this order.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/climate_removals_order_deliveries\"\n            },\n            \"type\": \"array\"\n          },\n          \"expected_delivery_year\": {\n            \"description\": \"The year this order is expected to be delivered.\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"metric_tons\": {\n            \"description\": \"Quantity of carbon removal that is included in this order.\",\n            \"format\": \"decimal\",\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"climate.order\"],\n            \"type\": \"string\"\n          },\n          \"product\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/climate.product\"\n              }\n            ],\n            \"description\": \"Unique ID for the Climate `Product` this order is purchasing.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/climate.product\"\n                }\n              ]\n            }\n          },\n          \"product_substituted_at\": {\n            \"description\": \"Time at which the order's product was substituted for a different product. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"status\": {\n            \"description\": \"The current status of this order.\",\n            \"enum\": [\n              \"awaiting_funds\",\n              \"canceled\",\n              \"confirmed\",\n              \"delivered\",\n              \"open\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount_fees\",\n          \"amount_subtotal\",\n          \"amount_total\",\n          \"created\",\n          \"currency\",\n          \"delivery_details\",\n          \"expected_delivery_year\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"metric_tons\",\n          \"object\",\n          \"product\",\n          \"status\"\n        ],\n        \"title\": \"ClimateRemovalsOrders\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"beneficiary\", \"delivery_details\", \"product\"],\n        \"x-resourceId\": \"climate.order\"\n      },\n      \"climate.product\": {\n        \"description\": \"A Climate product represents a type of carbon removal unit available for reservation.\\nYou can retrieve it to see the current price and availability.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"current_prices_per_metric_ton\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/climate_removals_products_price\"\n            },\n            \"description\": \"Current prices for a metric ton of carbon removal in a currency's smallest unit.\",\n            \"type\": \"object\"\n          },\n          \"delivery_year\": {\n            \"description\": \"The year in which the carbon removal is expected to be delivered.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object. For convenience, Climate product IDs are human-readable strings\\nthat start with `climsku_`. See [carbon removal inventory](https://stripe.com/docs/climate/orders/carbon-removal-inventory)\\nfor a list of available carbon removal products.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metric_tons_available\": {\n            \"description\": \"The quantity of metric tons available for reservation.\",\n            \"format\": \"decimal\",\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"The Climate product's name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"climate.product\"],\n            \"type\": \"string\"\n          },\n          \"suppliers\": {\n            \"description\": \"The carbon removal suppliers that fulfill orders for this Climate product.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/climate.supplier\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"current_prices_per_metric_ton\",\n          \"id\",\n          \"livemode\",\n          \"metric_tons_available\",\n          \"name\",\n          \"object\",\n          \"suppliers\"\n        ],\n        \"title\": \"ClimateRemovalsProducts\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"current_prices_per_metric_ton\", \"suppliers\"],\n        \"x-resourceId\": \"climate.product\"\n      },\n      \"climate.supplier\": {\n        \"description\": \"A supplier of carbon removal.\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"info_url\": {\n            \"description\": \"Link to a webpage to learn more about the supplier.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"locations\": {\n            \"description\": \"The locations in which this supplier operates.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/climate_removals_location\"\n            },\n            \"type\": \"array\"\n          },\n          \"name\": {\n            \"description\": \"Name of this carbon removal supplier.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object’s type. Objects of the same type share the same value.\",\n            \"enum\": [\"climate.supplier\"],\n            \"type\": \"string\"\n          },\n          \"removal_pathway\": {\n            \"description\": \"The scientific pathway used for carbon removal.\",\n            \"enum\": [\n              \"biomass_carbon_removal_and_storage\",\n              \"direct_air_capture\",\n              \"enhanced_weathering\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"info_url\",\n          \"livemode\",\n          \"locations\",\n          \"name\",\n          \"object\",\n          \"removal_pathway\"\n        ],\n        \"title\": \"ClimateRemovalsSuppliers\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"locations\"],\n        \"x-resourceId\": \"climate.supplier\"\n      },\n      \"climate_removals_beneficiary\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"public_name\": {\n            \"description\": \"Publicly displayable name for the end beneficiary of carbon removal.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"public_name\"],\n        \"title\": \"ClimateRemovalsBeneficiary\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"climate_removals_location\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"city\": {\n            \"description\": \"The city where the supplier is located.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country where the supplier is located.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"latitude\": {\n            \"description\": \"The geographic latitude where the supplier is located.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"longitude\": {\n            \"description\": \"The geographic longitude where the supplier is located.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"region\": {\n            \"description\": \"The state/county/province/region where the supplier is located.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"country\"],\n        \"title\": \"ClimateRemovalsLocation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"climate_removals_order_deliveries\": {\n        \"description\": \"The delivery of a specified quantity of carbon for an order.\",\n        \"properties\": {\n          \"delivered_at\": {\n            \"description\": \"Time at which the delivery occurred. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"location\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/climate_removals_location\"\n              }\n            ],\n            \"description\": \"Specific location of this delivery.\",\n            \"nullable\": true\n          },\n          \"metric_tons\": {\n            \"description\": \"Quantity of carbon removal supplied by this delivery.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"registry_url\": {\n            \"description\": \"Once retired, a URL to the registry entry for the tons from this delivery.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"supplier\": {\n            \"$ref\": \"#/components/schemas/climate.supplier\"\n          }\n        },\n        \"required\": [\"delivered_at\", \"metric_tons\", \"supplier\"],\n        \"title\": \"ClimateRemovalsOrderDeliveries\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"location\", \"supplier\"]\n      },\n      \"climate_removals_products_price\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_fees\": {\n            \"description\": \"Fees for one metric ton of carbon removal in the currency's smallest unit.\",\n            \"type\": \"integer\"\n          },\n          \"amount_subtotal\": {\n            \"description\": \"Subtotal for one metric ton of carbon removal (excluding fees) in the currency's smallest unit.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total for one metric ton of carbon removal (including fees) in the currency's smallest unit.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"amount_fees\", \"amount_subtotal\", \"amount_total\"],\n        \"title\": \"ClimateRemovalsProductsPrice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"confirmation_token\": {\n        \"description\": \"ConfirmationTokens help transport client side data collected by Stripe JS over\\nto your server for confirming a PaymentIntent or SetupIntent. If the confirmation\\nis successful, values present on the ConfirmationToken are written onto the Intent.\\n\\nTo learn more about how to use ConfirmationToken, visit the related guides:\\n- [Finalize payments on the server](https://stripe.com/docs/payments/finalize-payments-on-the-server)\\n- [Build two-step confirmation](https://stripe.com/docs/payments/build-a-two-step-confirmation).\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"Time at which this ConfirmationToken expires and can no longer be used to confirm a PaymentIntent or SetupIntent.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"mandate_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/confirmation_tokens_resource_mandate_data\"\n              }\n            ],\n            \"description\": \"Data used for generating a Mandate.\",\n            \"nullable\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"confirmation_token\"],\n            \"type\": \"string\"\n          },\n          \"payment_intent\": {\n            \"description\": \"ID of the PaymentIntent that this ConfirmationToken was used to confirm, or null if this ConfirmationToken has not yet been used.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_method_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/confirmation_tokens_resource_payment_method_options\"\n              }\n            ],\n            \"description\": \"Payment-method-specific configuration for this ConfirmationToken.\",\n            \"nullable\": true\n          },\n          \"payment_method_preview\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/confirmation_tokens_resource_payment_method_preview\"\n              }\n            ],\n            \"description\": \"Payment details collected by the Payment Element, used to create a PaymentMethod when a PaymentIntent or SetupIntent is confirmed with this ConfirmationToken.\",\n            \"nullable\": true\n          },\n          \"return_url\": {\n            \"description\": \"Return URL used to confirm the Intent.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this ConfirmationToken's payment method.\\n\\nThe presence of this property will [attach the payment method](https://stripe.com/docs/payments/save-during-payment) to the PaymentIntent's Customer, if present, after the PaymentIntent is confirmed and any required actions from the user are complete.\",\n            \"enum\": [\"off_session\", \"on_session\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_intent\": {\n            \"description\": \"ID of the SetupIntent that this ConfirmationToken was used to confirm, or null if this ConfirmationToken has not yet been used.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/confirmation_tokens_resource_shipping\"\n              }\n            ],\n            \"description\": \"Shipping information collected on this ConfirmationToken.\",\n            \"nullable\": true\n          },\n          \"use_stripe_sdk\": {\n            \"description\": \"Indicates whether the Stripe SDK is used to handle confirmation flow. Defaults to `true` on ConfirmationToken.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"created\", \"id\", \"livemode\", \"object\", \"use_stripe_sdk\"],\n        \"title\": \"ConfirmationTokensResourceConfirmationToken\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"mandate_data\",\n          \"payment_method_options\",\n          \"payment_method_preview\",\n          \"shipping\"\n        ],\n        \"x-resourceId\": \"confirmation_token\"\n      },\n      \"confirmation_tokens_resource_mandate_data\": {\n        \"description\": \"Data used for generating a Mandate.\",\n        \"properties\": {\n          \"customer_acceptance\": {\n            \"$ref\": \"#/components/schemas/confirmation_tokens_resource_mandate_data_resource_customer_acceptance\"\n          }\n        },\n        \"required\": [\"customer_acceptance\"],\n        \"title\": \"ConfirmationTokensResourceMandateData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"customer_acceptance\"]\n      },\n      \"confirmation_tokens_resource_mandate_data_resource_customer_acceptance\": {\n        \"description\": \"This hash contains details about the customer acceptance of the Mandate.\",\n        \"properties\": {\n          \"online\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/confirmation_tokens_resource_mandate_data_resource_customer_acceptance_resource_online\"\n              }\n            ],\n            \"description\": \"If this is a Mandate accepted online, this hash contains details about the online acceptance.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"The type of customer acceptance information included with the Mandate.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"ConfirmationTokensResourceMandateDataResourceCustomerAcceptance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"online\"]\n      },\n      \"confirmation_tokens_resource_mandate_data_resource_customer_acceptance_resource_online\": {\n        \"description\": \"This hash contains details about the online acceptance.\",\n        \"properties\": {\n          \"ip_address\": {\n            \"description\": \"The IP address from which the Mandate was accepted by the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user agent of the browser from which the Mandate was accepted by the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"ConfirmationTokensResourceMandateDataResourceCustomerAcceptanceResourceOnline\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"confirmation_tokens_resource_payment_method_options\": {\n        \"description\": \"Payment-method-specific configuration\",\n        \"properties\": {\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/confirmation_tokens_resource_payment_method_options_resource_card\"\n              }\n            ],\n            \"description\": \"This hash contains the card payment method options.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"ConfirmationTokensResourcePaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card\"]\n      },\n      \"confirmation_tokens_resource_payment_method_options_resource_card\": {\n        \"description\": \"This hash contains the card payment method options.\",\n        \"properties\": {\n          \"cvc_token\": {\n            \"description\": \"The `cvc_update` Token collected from the Payment Element.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"ConfirmationTokensResourcePaymentMethodOptionsResourceCard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"confirmation_tokens_resource_payment_method_preview\": {\n        \"description\": \"Details of the PaymentMethod collected by Payment Element\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_acss_debit\"\n          },\n          \"affirm\": {\n            \"$ref\": \"#/components/schemas/payment_method_affirm\"\n          },\n          \"afterpay_clearpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_afterpay_clearpay\"\n          },\n          \"alipay\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_alipay\"\n          },\n          \"allow_redisplay\": {\n            \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to “unspecified”.\",\n            \"enum\": [\"always\", \"limited\", \"unspecified\"],\n            \"type\": \"string\"\n          },\n          \"alma\": {\n            \"$ref\": \"#/components/schemas/payment_method_alma\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_amazon_pay\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_au_becs_debit\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_bacs_debit\"\n          },\n          \"bancontact\": {\n            \"$ref\": \"#/components/schemas/payment_method_bancontact\"\n          },\n          \"billing_details\": {\n            \"$ref\": \"#/components/schemas/billing_details\"\n          },\n          \"blik\": {\n            \"$ref\": \"#/components/schemas/payment_method_blik\"\n          },\n          \"boleto\": {\n            \"$ref\": \"#/components/schemas/payment_method_boleto\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/payment_method_card\"\n          },\n          \"card_present\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_present\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/payment_method_cashapp\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"The ID of the Customer to which this PaymentMethod is saved. This will not be set when the PaymentMethod has not been saved to a Customer.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"customer_balance\": {\n            \"$ref\": \"#/components/schemas/payment_method_customer_balance\"\n          },\n          \"eps\": {\n            \"$ref\": \"#/components/schemas/payment_method_eps\"\n          },\n          \"fpx\": {\n            \"$ref\": \"#/components/schemas/payment_method_fpx\"\n          },\n          \"giropay\": {\n            \"$ref\": \"#/components/schemas/payment_method_giropay\"\n          },\n          \"grabpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_grabpay\"\n          },\n          \"ideal\": {\n            \"$ref\": \"#/components/schemas/payment_method_ideal\"\n          },\n          \"interac_present\": {\n            \"$ref\": \"#/components/schemas/payment_method_interac_present\"\n          },\n          \"kakao_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_kakao_pay\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/payment_method_klarna\"\n          },\n          \"konbini\": {\n            \"$ref\": \"#/components/schemas/payment_method_konbini\"\n          },\n          \"kr_card\": {\n            \"$ref\": \"#/components/schemas/payment_method_kr_card\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/payment_method_link\"\n          },\n          \"mobilepay\": {\n            \"$ref\": \"#/components/schemas/payment_method_mobilepay\"\n          },\n          \"multibanco\": {\n            \"$ref\": \"#/components/schemas/payment_method_multibanco\"\n          },\n          \"naver_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_naver_pay\"\n          },\n          \"oxxo\": {\n            \"$ref\": \"#/components/schemas/payment_method_oxxo\"\n          },\n          \"p24\": {\n            \"$ref\": \"#/components/schemas/payment_method_p24\"\n          },\n          \"pay_by_bank\": {\n            \"$ref\": \"#/components/schemas/payment_method_pay_by_bank\"\n          },\n          \"payco\": {\n            \"$ref\": \"#/components/schemas/payment_method_payco\"\n          },\n          \"paynow\": {\n            \"$ref\": \"#/components/schemas/payment_method_paynow\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/payment_method_paypal\"\n          },\n          \"pix\": {\n            \"$ref\": \"#/components/schemas/payment_method_pix\"\n          },\n          \"promptpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_promptpay\"\n          },\n          \"revolut_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_revolut_pay\"\n          },\n          \"samsung_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_samsung_pay\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_sepa_debit\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/payment_method_sofort\"\n          },\n          \"swish\": {\n            \"$ref\": \"#/components/schemas/payment_method_swish\"\n          },\n          \"twint\": {\n            \"$ref\": \"#/components/schemas/payment_method_twint\"\n          },\n          \"type\": {\n            \"description\": \"The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type.\",\n            \"enum\": [\n              \"acss_debit\",\n              \"affirm\",\n              \"afterpay_clearpay\",\n              \"alipay\",\n              \"alma\",\n              \"amazon_pay\",\n              \"au_becs_debit\",\n              \"bacs_debit\",\n              \"bancontact\",\n              \"blik\",\n              \"boleto\",\n              \"card\",\n              \"card_present\",\n              \"cashapp\",\n              \"customer_balance\",\n              \"eps\",\n              \"fpx\",\n              \"giropay\",\n              \"grabpay\",\n              \"ideal\",\n              \"interac_present\",\n              \"kakao_pay\",\n              \"klarna\",\n              \"konbini\",\n              \"kr_card\",\n              \"link\",\n              \"mobilepay\",\n              \"multibanco\",\n              \"naver_pay\",\n              \"oxxo\",\n              \"p24\",\n              \"pay_by_bank\",\n              \"payco\",\n              \"paynow\",\n              \"paypal\",\n              \"pix\",\n              \"promptpay\",\n              \"revolut_pay\",\n              \"samsung_pay\",\n              \"sepa_debit\",\n              \"sofort\",\n              \"swish\",\n              \"twint\",\n              \"us_bank_account\",\n              \"wechat_pay\",\n              \"zip\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/payment_method_us_bank_account\"\n          },\n          \"wechat_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_wechat_pay\"\n          },\n          \"zip\": {\n            \"$ref\": \"#/components/schemas/payment_method_zip\"\n          }\n        },\n        \"required\": [\"billing_details\", \"type\"],\n        \"title\": \"ConfirmationTokensResourcePaymentMethodPreview\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"affirm\",\n          \"afterpay_clearpay\",\n          \"alipay\",\n          \"alma\",\n          \"amazon_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"bancontact\",\n          \"billing_details\",\n          \"blik\",\n          \"boleto\",\n          \"card\",\n          \"card_present\",\n          \"cashapp\",\n          \"customer\",\n          \"customer_balance\",\n          \"eps\",\n          \"fpx\",\n          \"giropay\",\n          \"grabpay\",\n          \"ideal\",\n          \"interac_present\",\n          \"kakao_pay\",\n          \"klarna\",\n          \"konbini\",\n          \"kr_card\",\n          \"link\",\n          \"mobilepay\",\n          \"multibanco\",\n          \"naver_pay\",\n          \"oxxo\",\n          \"p24\",\n          \"pay_by_bank\",\n          \"payco\",\n          \"paynow\",\n          \"paypal\",\n          \"pix\",\n          \"promptpay\",\n          \"revolut_pay\",\n          \"samsung_pay\",\n          \"sepa_debit\",\n          \"sofort\",\n          \"swish\",\n          \"twint\",\n          \"us_bank_account\",\n          \"wechat_pay\",\n          \"zip\"\n        ]\n      },\n      \"confirmation_tokens_resource_shipping\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"name\": {\n            \"description\": \"Recipient name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"Recipient phone (including extension).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"address\", \"name\"],\n        \"title\": \"ConfirmationTokensResourceShipping\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"connect_account_reference\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The connected account being referenced when `type` is `account`.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"Type of the account referenced.\",\n            \"enum\": [\"account\", \"self\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"ConnectAccountReference\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account\"]\n      },\n      \"connect_collection_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount transferred, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"ID of the account that funds are being collected for.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"connect_collection_transfer\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"currency\",\n          \"destination\",\n          \"id\",\n          \"livemode\",\n          \"object\"\n        ],\n        \"title\": \"ConnectCollectionTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"destination\"]\n      },\n      \"connect_embedded_account_config_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_account_features_claim\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedAccountConfigClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_account_features_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disable_stripe_user_authentication\": {\n            \"description\": \"Disables Stripe user authentication for this embedded component. This value can only be true for accounts where `controller.requirement_collection` is `application`. The default value is the opposite of the `external_account_collection` value. For example, if you don’t set `external_account_collection`, it defaults to true and `disable_stripe_user_authentication` defaults to false.\",\n            \"type\": \"boolean\"\n          },\n          \"external_account_collection\": {\n            \"description\": \"Whether to allow platforms to control bank account collection for their connected accounts. This feature can only be false for accounts where you’re responsible for collecting updated information when requirements are due or change, like custom accounts. Otherwise, bank account collection is determined by compliance requirements. The default value for this feature is `true`.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"disable_stripe_user_authentication\",\n          \"external_account_collection\"\n        ],\n        \"title\": \"ConnectEmbeddedAccountFeaturesClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"connect_embedded_account_session_create_components\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_management\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_account_config_claim\"\n          },\n          \"account_onboarding\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_account_config_claim\"\n          },\n          \"balances\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_payouts_config\"\n          },\n          \"documents\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_base_config_claim\"\n          },\n          \"financial_account\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_financial_account_config_claim\"\n          },\n          \"financial_account_transactions\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_financial_account_transactions_config_claim\"\n          },\n          \"issuing_card\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_issuing_card_config_claim\"\n          },\n          \"issuing_cards_list\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_issuing_cards_list_config_claim\"\n          },\n          \"notification_banner\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_account_config_claim\"\n          },\n          \"payment_details\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_payments_config_claim\"\n          },\n          \"payments\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_payments_config_claim\"\n          },\n          \"payouts\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_payouts_config\"\n          },\n          \"payouts_list\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_base_config_claim\"\n          },\n          \"tax_registrations\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_base_config_claim\"\n          },\n          \"tax_settings\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_base_config_claim\"\n          }\n        },\n        \"required\": [\n          \"account_management\",\n          \"account_onboarding\",\n          \"balances\",\n          \"documents\",\n          \"financial_account\",\n          \"financial_account_transactions\",\n          \"issuing_card\",\n          \"issuing_cards_list\",\n          \"notification_banner\",\n          \"payment_details\",\n          \"payments\",\n          \"payouts\",\n          \"payouts_list\",\n          \"tax_registrations\",\n          \"tax_settings\"\n        ],\n        \"title\": \"ConnectEmbeddedAccountSessionCreateComponents\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account_management\",\n          \"account_onboarding\",\n          \"balances\",\n          \"documents\",\n          \"financial_account\",\n          \"financial_account_transactions\",\n          \"issuing_card\",\n          \"issuing_cards_list\",\n          \"notification_banner\",\n          \"payment_details\",\n          \"payments\",\n          \"payouts\",\n          \"payouts_list\",\n          \"tax_registrations\",\n          \"tax_settings\"\n        ]\n      },\n      \"connect_embedded_base_config_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_base_features\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedBaseConfigClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_base_features\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"ConnectEmbeddedBaseFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"connect_embedded_financial_account_config_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_financial_account_features\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedFinancialAccountConfigClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_financial_account_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disable_stripe_user_authentication\": {\n            \"description\": \"Disables Stripe user authentication for this embedded component. This value can only be true for accounts where `controller.requirement_collection` is `application`. The default value is the opposite of the `external_account_collection` value. For example, if you don’t set `external_account_collection`, it defaults to true and `disable_stripe_user_authentication` defaults to false.\",\n            \"type\": \"boolean\"\n          },\n          \"external_account_collection\": {\n            \"description\": \"Whether to allow external accounts to be linked for money transfer.\",\n            \"type\": \"boolean\"\n          },\n          \"send_money\": {\n            \"description\": \"Whether to allow sending money.\",\n            \"type\": \"boolean\"\n          },\n          \"transfer_balance\": {\n            \"description\": \"Whether to allow transferring balance.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"disable_stripe_user_authentication\",\n          \"external_account_collection\",\n          \"send_money\",\n          \"transfer_balance\"\n        ],\n        \"title\": \"ConnectEmbeddedFinancialAccountFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"connect_embedded_financial_account_transactions_config_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_financial_account_transactions_features\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedFinancialAccountTransactionsConfigClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_financial_account_transactions_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_spend_dispute_management\": {\n            \"description\": \"Whether to allow card spend dispute management features.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"card_spend_dispute_management\"],\n        \"title\": \"ConnectEmbeddedFinancialAccountTransactionsFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"connect_embedded_issuing_card_config_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_issuing_card_features\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedIssuingCardConfigClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_issuing_card_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_management\": {\n            \"description\": \"Whether to allow card management features.\",\n            \"type\": \"boolean\"\n          },\n          \"card_spend_dispute_management\": {\n            \"description\": \"Whether to allow card spend dispute management features.\",\n            \"type\": \"boolean\"\n          },\n          \"cardholder_management\": {\n            \"description\": \"Whether to allow cardholder management features.\",\n            \"type\": \"boolean\"\n          },\n          \"spend_control_management\": {\n            \"description\": \"Whether to allow spend control management features.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"card_management\",\n          \"card_spend_dispute_management\",\n          \"cardholder_management\",\n          \"spend_control_management\"\n        ],\n        \"title\": \"ConnectEmbeddedIssuingCardFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"connect_embedded_issuing_cards_list_config_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_issuing_cards_list_features\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedIssuingCardsListConfigClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_issuing_cards_list_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_management\": {\n            \"description\": \"Whether to allow card management features.\",\n            \"type\": \"boolean\"\n          },\n          \"card_spend_dispute_management\": {\n            \"description\": \"Whether to allow card spend dispute management features.\",\n            \"type\": \"boolean\"\n          },\n          \"cardholder_management\": {\n            \"description\": \"Whether to allow cardholder management features.\",\n            \"type\": \"boolean\"\n          },\n          \"disable_stripe_user_authentication\": {\n            \"description\": \"Disables Stripe user authentication for this embedded component. This feature can only be false for accounts where you’re responsible for collecting updated information when requirements are due or change, like custom accounts.\",\n            \"type\": \"boolean\"\n          },\n          \"spend_control_management\": {\n            \"description\": \"Whether to allow spend control management features.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"card_management\",\n          \"card_spend_dispute_management\",\n          \"cardholder_management\",\n          \"disable_stripe_user_authentication\",\n          \"spend_control_management\"\n        ],\n        \"title\": \"ConnectEmbeddedIssuingCardsListFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"connect_embedded_payments_config_claim\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_payments_features\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedPaymentsConfigClaim\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_payments_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_payments\": {\n            \"description\": \"Whether to allow capturing and cancelling payment intents. This is `true` by default.\",\n            \"type\": \"boolean\"\n          },\n          \"destination_on_behalf_of_charge_management\": {\n            \"description\": \"Whether to allow connected accounts to manage destination charges that are created on behalf of them. This is `false` by default.\",\n            \"type\": \"boolean\"\n          },\n          \"dispute_management\": {\n            \"description\": \"Whether to allow responding to disputes, including submitting evidence and accepting disputes. This is `true` by default.\",\n            \"type\": \"boolean\"\n          },\n          \"refund_management\": {\n            \"description\": \"Whether to allow sending refunds. This is `true` by default.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"capture_payments\",\n          \"destination_on_behalf_of_charge_management\",\n          \"dispute_management\",\n          \"refund_management\"\n        ],\n        \"title\": \"ConnectEmbeddedPaymentsFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"connect_embedded_payouts_config\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the embedded component is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/connect_embedded_payouts_features\"\n          }\n        },\n        \"required\": [\"enabled\", \"features\"],\n        \"title\": \"ConnectEmbeddedPayoutsConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"connect_embedded_payouts_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disable_stripe_user_authentication\": {\n            \"description\": \"Disables Stripe user authentication for this embedded component. This value can only be true for accounts where `controller.requirement_collection` is `application`. The default value is the opposite of the `external_account_collection` value. For example, if you don’t set `external_account_collection`, it defaults to true and `disable_stripe_user_authentication` defaults to false.\",\n            \"type\": \"boolean\"\n          },\n          \"edit_payout_schedule\": {\n            \"description\": \"Whether to allow payout schedule to be changed. Default `true` when Stripe owns Loss Liability, default `false` otherwise.\",\n            \"type\": \"boolean\"\n          },\n          \"external_account_collection\": {\n            \"description\": \"Whether to allow platforms to control bank account collection for their connected accounts. This feature can only be false for accounts where you’re responsible for collecting updated information when requirements are due or change, like custom accounts. Otherwise, bank account collection is determined by compliance requirements. The default value for this feature is `true`.\",\n            \"type\": \"boolean\"\n          },\n          \"instant_payouts\": {\n            \"description\": \"Whether to allow creation of instant payouts. Default `true` when Stripe owns Loss Liability, default `false` otherwise.\",\n            \"type\": \"boolean\"\n          },\n          \"standard_payouts\": {\n            \"description\": \"Whether to allow creation of standard payouts. Default `true` when Stripe owns Loss Liability, default `false` otherwise.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"disable_stripe_user_authentication\",\n          \"edit_payout_schedule\",\n          \"external_account_collection\",\n          \"instant_payouts\",\n          \"standard_payouts\"\n        ],\n        \"title\": \"ConnectEmbeddedPayoutsFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"country_spec\": {\n        \"description\": \"Stripe needs to collect certain pieces of information about each account\\ncreated. These requirements can differ depending on the account's country. The\\nCountry Specs API makes these rules available to your integration.\\n\\nYou can also view the information from this API call as [an online\\nguide](/docs/connect/required-verification-information).\",\n        \"properties\": {\n          \"default_currency\": {\n            \"description\": \"The default currency for this country. This applies to both payment methods and bank accounts.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object. Represented as the ISO country code for this country.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"country_spec\"],\n            \"type\": \"string\"\n          },\n          \"supported_bank_account_currencies\": {\n            \"additionalProperties\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"description\": \"Currencies that can be accepted in the specific country (for transfers).\",\n            \"type\": \"object\"\n          },\n          \"supported_payment_currencies\": {\n            \"description\": \"Currencies that can be accepted in the specified country (for payments).\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"supported_payment_methods\": {\n            \"description\": \"Payment methods available in the specified country. You may need to enable some payment methods (e.g., [ACH](https://stripe.com/docs/ach)) on your account before they appear in this list. The `stripe` payment method refers to [charging through your platform](https://stripe.com/docs/connect/destination-charges).\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"supported_transfer_countries\": {\n            \"description\": \"Countries that can accept transfers from the specified country.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"verification_fields\": {\n            \"$ref\": \"#/components/schemas/country_spec_verification_fields\"\n          }\n        },\n        \"required\": [\n          \"default_currency\",\n          \"id\",\n          \"object\",\n          \"supported_bank_account_currencies\",\n          \"supported_payment_currencies\",\n          \"supported_payment_methods\",\n          \"supported_transfer_countries\",\n          \"verification_fields\"\n        ],\n        \"title\": \"CountrySpec\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"verification_fields\"],\n        \"x-resourceId\": \"country_spec\"\n      },\n      \"country_spec_verification_field_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional\": {\n            \"description\": \"Additional fields which are only required for some users.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"minimum\": {\n            \"description\": \"Fields which every account must eventually provide.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"additional\", \"minimum\"],\n        \"title\": \"CountrySpecVerificationFieldDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"country_spec_verification_fields\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"company\": {\n            \"$ref\": \"#/components/schemas/country_spec_verification_field_details\"\n          },\n          \"individual\": {\n            \"$ref\": \"#/components/schemas/country_spec_verification_field_details\"\n          }\n        },\n        \"required\": [\"company\", \"individual\"],\n        \"title\": \"CountrySpecVerificationFields\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"company\", \"individual\"]\n      },\n      \"coupon\": {\n        \"description\": \"A coupon contains information about a percent-off or amount-off discount you\\nmight want to apply to a customer. Coupons may be applied to [subscriptions](https://stripe.com/docs/api#subscriptions), [invoices](https://stripe.com/docs/api#invoices),\\n[checkout sessions](https://stripe.com/docs/api/checkout/sessions), [quotes](https://stripe.com/docs/api#quotes), and more. Coupons do not work with conventional one-off [charges](https://stripe.com/docs/api#create_charge) or [payment intents](https://stripe.com/docs/api/payment_intents).\",\n        \"properties\": {\n          \"amount_off\": {\n            \"description\": \"Amount (in the `currency` specified) that will be taken off the subtotal of any invoices for this customer.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"applies_to\": {\n            \"$ref\": \"#/components/schemas/coupon_applies_to\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"If `amount_off` has been set, the three-letter [ISO code for the currency](https://stripe.com/docs/currencies) of the amount to take off.\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"currency_options\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/coupon_currency_option\"\n            },\n            \"description\": \"Coupons defined in each available currency option. Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\",\n            \"type\": \"object\"\n          },\n          \"duration\": {\n            \"description\": \"One of `forever`, `once`, and `repeating`. Describes how long a customer who applies this coupon will get the discount.\",\n            \"enum\": [\"forever\", \"once\", \"repeating\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"duration_in_months\": {\n            \"description\": \"If `duration` is `repeating`, the number of months the coupon applies. Null if coupon `duration` is `forever` or `once`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"max_redemptions\": {\n            \"description\": \"Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"Name of the coupon displayed to customers on for instance invoices or receipts.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"coupon\"],\n            \"type\": \"string\"\n          },\n          \"percent_off\": {\n            \"description\": \"Percent that will be taken off the subtotal of any invoices for this customer for the duration of the coupon. For example, a coupon with percent_off of 50 will make a $ (or local equivalent)100 invoice $ (or local equivalent)50 instead.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"redeem_by\": {\n            \"description\": \"Date after which the coupon can no longer be redeemed.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"times_redeemed\": {\n            \"description\": \"Number of times this coupon has been applied to a customer.\",\n            \"type\": \"integer\"\n          },\n          \"valid\": {\n            \"description\": \"Taking account of the above properties, whether this coupon can still be applied to a customer.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"duration\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"times_redeemed\",\n          \"valid\"\n        ],\n        \"title\": \"Coupon\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"applies_to\", \"currency_options\"],\n        \"x-resourceId\": \"coupon\"\n      },\n      \"coupon_applies_to\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"products\": {\n            \"description\": \"A list of product IDs this coupon applies to\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"products\"],\n        \"title\": \"CouponAppliesTo\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"coupon_currency_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_off\": {\n            \"description\": \"Amount (in the `currency` specified) that will be taken off the subtotal of any invoices for this customer.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"amount_off\"],\n        \"title\": \"CouponCurrencyOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"credit_balance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available_balance\": {\n            \"$ref\": \"#/components/schemas/billing_credit_grants_resource_amount\"\n          },\n          \"ledger_balance\": {\n            \"$ref\": \"#/components/schemas/billing_credit_grants_resource_amount\"\n          }\n        },\n        \"required\": [\"available_balance\", \"ledger_balance\"],\n        \"title\": \"CreditBalance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"available_balance\", \"ledger_balance\"]\n      },\n      \"credit_note\": {\n        \"description\": \"Issue a credit note to adjust an invoice's amount after the invoice is finalized.\\n\\nRelated guide: [Credit notes](https://stripe.com/docs/billing/invoices/credit-notes)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of the credit note, including tax.\",\n            \"type\": \"integer\"\n          },\n          \"amount_shipping\": {\n            \"description\": \"This is the sum of all the shipping amounts.\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"ID of the customer.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"customer_balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer_balance_transaction\"\n              }\n            ],\n            \"description\": \"Customer balance transaction related to this credit note.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer_balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"discount_amount\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of discount that was credited.\",\n            \"type\": \"integer\"\n          },\n          \"discount_amounts\": {\n            \"description\": \"The aggregate amounts calculated per discount for all line items.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/discounts_resource_discount_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"effective_at\": {\n            \"description\": \"The date when this credit note is in effect. Same as `created` unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the credit note PDF.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"ID of the invoice.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"lines\": {\n            \"description\": \"Line items that make up the credit note\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/credit_note_line_item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"CreditNoteLinesList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"memo\": {\n            \"description\": \"Customer-facing text that appears on the credit note PDF.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"number\": {\n            \"description\": \"A unique number that identifies this particular credit note and appears on the PDF of the credit note and its associated invoice.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"credit_note\"],\n            \"type\": \"string\"\n          },\n          \"out_of_band_amount\": {\n            \"description\": \"Amount that was credited outside of Stripe.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"pdf\": {\n            \"description\": \"The link to download the PDF of the credit note.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"pretax_credit_amounts\": {\n            \"description\": \"The pretax credit amounts (ex: discount, credit grants, etc) for all line items.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/credit_notes_pretax_credit_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"reason\": {\n            \"description\": \"Reason for issuing this credit note, one of `duplicate`, `fraudulent`, `order_change`, or `product_unsatisfactory`\",\n            \"enum\": [\n              \"duplicate\",\n              \"fraudulent\",\n              \"order_change\",\n              \"product_unsatisfactory\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/refund\"\n              }\n            ],\n            \"description\": \"Refund related to this credit note.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              ]\n            }\n          },\n          \"shipping_cost\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoices_resource_shipping_cost\"\n              }\n            ],\n            \"description\": \"The details of the cost of shipping, including the ShippingRate applied to the invoice.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"Status of this credit note, one of `issued` or `void`. Learn more about [voiding credit notes](https://stripe.com/docs/billing/invoices/credit-notes#voiding).\",\n            \"enum\": [\"issued\", \"void\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"subtotal\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount of the credit note, excluding exclusive tax and invoice level discounts.\",\n            \"type\": \"integer\"\n          },\n          \"subtotal_excluding_tax\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount of the credit note, excluding all tax and invoice level discounts.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"tax_amounts\": {\n            \"description\": \"The aggregate amounts calculated per tax rate for all line items.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/credit_note_tax_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"total\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of the credit note, including tax and all discount.\",\n            \"type\": \"integer\"\n          },\n          \"total_excluding_tax\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of the credit note, excluding tax, but including discounts.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"type\": {\n            \"description\": \"Type of this credit note, one of `pre_payment` or `post_payment`. A `pre_payment` credit note means it was issued when the invoice was open. A `post_payment` credit note means it was issued when the invoice was paid.\",\n            \"enum\": [\"post_payment\", \"pre_payment\"],\n            \"type\": \"string\"\n          },\n          \"voided_at\": {\n            \"description\": \"The time that the credit note was voided.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"amount_shipping\",\n          \"created\",\n          \"currency\",\n          \"customer\",\n          \"discount_amount\",\n          \"discount_amounts\",\n          \"id\",\n          \"invoice\",\n          \"lines\",\n          \"livemode\",\n          \"number\",\n          \"object\",\n          \"pdf\",\n          \"pretax_credit_amounts\",\n          \"status\",\n          \"subtotal\",\n          \"tax_amounts\",\n          \"total\",\n          \"type\"\n        ],\n        \"title\": \"CreditNote\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"customer\",\n          \"customer_balance_transaction\",\n          \"discount_amounts\",\n          \"invoice\",\n          \"lines\",\n          \"pretax_credit_amounts\",\n          \"refund\",\n          \"shipping_cost\",\n          \"tax_amounts\"\n        ],\n        \"x-resourceId\": \"credit_note\"\n      },\n      \"credit_note_line_item\": {\n        \"description\": \"The credit note line item object\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the gross amount being credited for this line item, excluding (exclusive) tax and discounts.\",\n            \"type\": \"integer\"\n          },\n          \"amount_excluding_tax\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount being credited for this line item, excluding all tax and discounts.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"description\": {\n            \"description\": \"Description of the item being credited.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discount_amount\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the discount being credited for this line item.\",\n            \"type\": \"integer\"\n          },\n          \"discount_amounts\": {\n            \"description\": \"The amount of discount calculated per discount for this line item\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/discounts_resource_discount_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice_line_item\": {\n            \"description\": \"ID of the invoice line item being credited\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"credit_note_line_item\"],\n            \"type\": \"string\"\n          },\n          \"pretax_credit_amounts\": {\n            \"description\": \"The pretax credit amounts (ex: discount, credit grants, etc) for this line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/credit_notes_pretax_credit_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"quantity\": {\n            \"description\": \"The number of units of product being credited.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"tax_amounts\": {\n            \"description\": \"The amount of tax calculated per tax rate for this line item\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/credit_note_tax_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"tax_rates\": {\n            \"description\": \"The tax rates which apply to the line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"type\": \"array\"\n          },\n          \"type\": {\n            \"description\": \"The type of the credit note line item, one of `invoice_line_item` or `custom_line_item`. When the type is `invoice_line_item` there is an additional `invoice_line_item` property on the resource the value of which is the id of the credited line item on the invoice.\",\n            \"enum\": [\"custom_line_item\", \"invoice_line_item\"],\n            \"type\": \"string\"\n          },\n          \"unit_amount\": {\n            \"description\": \"The cost of each unit of product being credited.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unit_amount_decimal\": {\n            \"description\": \"Same as `unit_amount`, but contains a decimal value with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"unit_amount_excluding_tax\": {\n            \"description\": \"The amount in cents (or local equivalent) representing the unit amount being credited for this line item, excluding all tax and discounts.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"discount_amount\",\n          \"discount_amounts\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"pretax_credit_amounts\",\n          \"tax_amounts\",\n          \"tax_rates\",\n          \"type\"\n        ],\n        \"title\": \"CreditNoteLineItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"discount_amounts\",\n          \"pretax_credit_amounts\",\n          \"tax_amounts\",\n          \"tax_rates\"\n        ],\n        \"x-resourceId\": \"credit_note_line_item\"\n      },\n      \"credit_note_tax_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount, in cents (or local equivalent), of the tax.\",\n            \"type\": \"integer\"\n          },\n          \"inclusive\": {\n            \"description\": \"Whether this tax amount is inclusive or exclusive.\",\n            \"type\": \"boolean\"\n          },\n          \"tax_rate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/tax_rate\"\n              }\n            ],\n            \"description\": \"The tax rate that was applied to get this tax amount.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/tax_rate\"\n                }\n              ]\n            }\n          },\n          \"taxability_reason\": {\n            \"description\": \"The reasoning behind this tax, for example, if the product is tax exempt. The possible values for this field may be extended as new tax rules are supported.\",\n            \"enum\": [\n              \"customer_exempt\",\n              \"not_collecting\",\n              \"not_subject_to_tax\",\n              \"not_supported\",\n              \"portion_product_exempt\",\n              \"portion_reduced_rated\",\n              \"portion_standard_rated\",\n              \"product_exempt\",\n              \"product_exempt_holiday\",\n              \"proportionally_rated\",\n              \"reduced_rated\",\n              \"reverse_charge\",\n              \"standard_rated\",\n              \"taxable_basis_reduced\",\n              \"zero_rated\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"taxable_amount\": {\n            \"description\": \"The amount on which tax is calculated, in cents (or local equivalent).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"amount\", \"inclusive\", \"tax_rate\"],\n        \"title\": \"CreditNoteTaxAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tax_rate\"]\n      },\n      \"credit_notes_pretax_credit_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount, in cents (or local equivalent), of the pretax credit amount.\",\n            \"type\": \"integer\"\n          },\n          \"credit_balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/billing.credit_balance_transaction\"\n              }\n            ],\n            \"description\": \"The credit balance transaction that was applied to get this pretax credit amount.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/billing.credit_balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"discount\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/discount\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_discount\"\n              }\n            ],\n            \"description\": \"The discount that was applied to get this pretax credit amount.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_discount\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"Type of the pretax credit amount referenced.\",\n            \"enum\": [\"credit_balance_transaction\", \"discount\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"type\"],\n        \"title\": \"CreditNotesPretaxCreditAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"credit_balance_transaction\", \"discount\"]\n      },\n      \"currency_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom_unit_amount\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/custom_unit_amount\"\n              }\n            ],\n            \"description\": \"When set, provides configuration for the amount to be adjusted by the customer during Checkout Sessions and Payment Links.\",\n            \"nullable\": true\n          },\n          \"tax_behavior\": {\n            \"description\": \"Only required if a [default tax behavior](https://stripe.com/docs/tax/products-prices-tax-categories-tax-behavior#setting-a-default-tax-behavior-(recommended)) was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`. Once specified as either `inclusive` or `exclusive`, it cannot be changed.\",\n            \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tiers\": {\n            \"description\": \"Each element represents a pricing tier. This parameter requires `billing_scheme` to be set to `tiered`. See also the documentation for `billing_scheme`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/price_tier\"\n            },\n            \"type\": \"array\"\n          },\n          \"unit_amount\": {\n            \"description\": \"The unit amount in cents (or local equivalent) to be charged, represented as a whole integer if possible. Only set if `billing_scheme=per_unit`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unit_amount_decimal\": {\n            \"description\": \"The unit amount in cents (or local equivalent) to be charged, represented as a decimal string with at most 12 decimal places. Only set if `billing_scheme=per_unit`.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CurrencyOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"custom_unit_amount\", \"tiers\"]\n      },\n      \"custom_unit_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"maximum\": {\n            \"description\": \"The maximum unit amount the customer can specify for this item.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"minimum\": {\n            \"description\": \"The minimum unit amount the customer can specify for this item. Must be at least the minimum charge amount.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"preset\": {\n            \"description\": \"The starting unit amount which can be updated by the customer.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"CustomUnitAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer\": {\n        \"description\": \"This object represents a customer of your business. Use it to [create recurring charges](https://stripe.com/docs/invoicing/customer), [save payment](https://stripe.com/docs/payments/save-during-payment) and contact information,\\nand track payments that belong to the same customer.\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"The customer's address.\",\n            \"nullable\": true\n          },\n          \"balance\": {\n            \"description\": \"The current balance, if any, that's stored on the customer. If negative, the customer has credit to apply to their next invoice. If positive, the customer has an amount owed that's added to their next invoice. The balance only considers amounts that Stripe hasn't successfully applied to any invoice. It doesn't reflect unpaid invoices. This balance is only taken into account after invoices finalize.\",\n            \"type\": \"integer\"\n          },\n          \"cash_balance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/cash_balance\"\n              }\n            ],\n            \"description\": \"The current funds being held by Stripe on behalf of the customer. You can apply these funds towards payment intents when the source is \\\"cash_balance\\\". The `settings[reconciliation_mode]` field describes if these funds apply to these payment intents manually or automatically.\",\n            \"nullable\": true\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) the customer can be charged in for recurring billing purposes.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"default_source\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/source\"\n              }\n            ],\n            \"description\": \"ID of the default payment source for the customer.\\n\\nIf you use payment methods created through the PaymentMethods API, see the [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) field instead.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/bank_account\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/card\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/source\"\n                }\n              ]\n            },\n            \"x-stripeBypassValidation\": true\n          },\n          \"delinquent\": {\n            \"description\": \"Tracks the most recent state change on any invoice belonging to the customer. Paying an invoice or marking it uncollectible via the API will set this field to false. An automatic payment failure or passing the `invoice.due_date` will set this field to `true`.\\n\\nIf an invoice becomes uncollectible by [dunning](https://stripe.com/docs/billing/automatic-collection), `delinquent` doesn't reset to `false`.\\n\\nIf you care whether the customer has paid their most recent subscription invoice, use `subscription.status` instead. Paying or marking uncollectible any customer invoice regardless of whether it is the latest invoice for a subscription will always set this field to `false`.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discount\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/discount\"\n              }\n            ],\n            \"description\": \"Describes the current discount active on the customer, if there is one.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"The customer's email address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice_credit_balance\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"The current multi-currency balances, if any, that's stored on the customer. If positive in a currency, the customer has a credit to apply to their next invoice denominated in that currency. If negative, the customer has an amount owed that's added to their next invoice denominated in that currency. These balances don't apply to unpaid invoices. They solely track amounts that Stripe hasn't successfully applied to any invoice. Stripe only applies a balance in a specific currency to an invoice after that invoice (which is in the same currency) finalizes.\",\n            \"type\": \"object\"\n          },\n          \"invoice_prefix\": {\n            \"description\": \"The prefix for the customer used to generate unique invoice numbers.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"invoice_settings\": {\n            \"$ref\": \"#/components/schemas/invoice_setting_customer_setting\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"The customer's full name or business name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"next_invoice_sequence\": {\n            \"description\": \"The suffix of the customer's next invoice number (for example, 0001). When the account uses account level sequencing, this parameter is ignored in API requests and the field omitted in API responses.\",\n            \"type\": \"integer\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"customer\"],\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"The customer's phone number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_locales\": {\n            \"description\": \"The customer's preferred locales (languages), ordered by preference.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"shipping\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping\"\n              }\n            ],\n            \"description\": \"Mailing and shipping address for the customer. Appears on invoices emailed to this customer.\",\n            \"nullable\": true\n          },\n          \"sources\": {\n            \"description\": \"The customer's payment sources, if any.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/bank_account\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/card\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/source\"\n                    }\n                  ],\n                  \"title\": \"Polymorphic\",\n                  \"x-stripeBypassValidation\": true\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"ApmsSourcesSourceList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"subscriptions\": {\n            \"description\": \"The customer's current subscriptions, if any.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"SubscriptionList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"tax\": {\n            \"$ref\": \"#/components/schemas/customer_tax\"\n          },\n          \"tax_exempt\": {\n            \"description\": \"Describes the customer's tax exemption status, which is `none`, `exempt`, or `reverse`. When set to `reverse`, invoice and receipt PDFs include the following text: **\\\"Reverse charge\\\"**.\",\n            \"enum\": [\"exempt\", \"none\", \"reverse\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_ids\": {\n            \"description\": \"The customer's tax IDs.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"TaxIDsList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock that this customer belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"created\", \"id\", \"livemode\", \"object\"],\n        \"title\": \"Customer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"address\",\n          \"cash_balance\",\n          \"default_source\",\n          \"discount\",\n          \"invoice_settings\",\n          \"shipping\",\n          \"sources\",\n          \"subscriptions\",\n          \"tax\",\n          \"tax_ids\",\n          \"test_clock\"\n        ],\n        \"x-resourceId\": \"customer\"\n      },\n      \"customer_acceptance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"accepted_at\": {\n            \"description\": \"The time that the customer accepts the mandate.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"offline\": {\n            \"$ref\": \"#/components/schemas/offline_acceptance\"\n          },\n          \"online\": {\n            \"$ref\": \"#/components/schemas/online_acceptance\"\n          },\n          \"type\": {\n            \"description\": \"The mandate includes the type of customer acceptance information, such as: `online` or `offline`.\",\n            \"enum\": [\"offline\", \"online\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"customer_acceptance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"offline\", \"online\"]\n      },\n      \"customer_balance_customer_balance_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reconciliation_mode\": {\n            \"description\": \"The configuration for how funds that land in the customer cash balance are reconciled.\",\n            \"enum\": [\"automatic\", \"manual\"],\n            \"type\": \"string\"\n          },\n          \"using_merchant_default\": {\n            \"description\": \"A flag to indicate if reconciliation mode returned is the user's default or is specific to this customer cash balance\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"reconciliation_mode\", \"using_merchant_default\"],\n        \"title\": \"CustomerBalanceCustomerBalanceSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_adjusted_for_overdraft\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"The [Balance Transaction](https://stripe.com/docs/api/balance_transactions/object) that corresponds to funds taken out of your Stripe balance.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"linked_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer_cash_balance_transaction\"\n              }\n            ],\n            \"description\": \"The [Cash Balance Transaction](https://stripe.com/docs/api/cash_balance_transactions/object) that brought the customer balance negative, triggering the clawback of funds.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer_cash_balance_transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"balance_transaction\", \"linked_transaction\"],\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceAdjustedForOverdraft\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"balance_transaction\", \"linked_transaction\"]\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_applied_to_payment_transaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"The [Payment Intent](https://stripe.com/docs/api/payment_intents/object) that funds were applied to.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"payment_intent\"],\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceAppliedToPaymentTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_intent\"]\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_funded_transaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_transfer\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer\"\n          }\n        },\n        \"required\": [\"bank_transfer\"],\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceFundedTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"bank_transfer\"]\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"eu_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_eu_bank_transfer\"\n          },\n          \"gb_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_gb_bank_transfer\"\n          },\n          \"jp_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_jp_bank_transfer\"\n          },\n          \"reference\": {\n            \"description\": \"The user-supplied reference field on the bank transfer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The funding method type used to fund the customer balance. Permitted values include: `eu_bank_transfer`, `gb_bank_transfer`, `jp_bank_transfer`, `mx_bank_transfer`, or `us_bank_transfer`.\",\n            \"enum\": [\n              \"eu_bank_transfer\",\n              \"gb_bank_transfer\",\n              \"jp_bank_transfer\",\n              \"mx_bank_transfer\",\n              \"us_bank_transfer\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"us_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_us_bank_transfer\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceFundedTransactionResourceBankTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"eu_bank_transfer\",\n          \"gb_bank_transfer\",\n          \"jp_bank_transfer\",\n          \"us_bank_transfer\"\n        ]\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_eu_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bic\": {\n            \"description\": \"The BIC of the bank of the sender of the funding.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"iban_last4\": {\n            \"description\": \"The last 4 digits of the IBAN of the sender of the funding.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"sender_name\": {\n            \"description\": \"The full name of the sender, as supplied by the sending bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceFundedTransactionResourceBankTransferResourceEuBankTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_gb_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_number_last4\": {\n            \"description\": \"The last 4 digits of the account number of the sender of the funding.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"sender_name\": {\n            \"description\": \"The full name of the sender, as supplied by the sending bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"sort_code\": {\n            \"description\": \"The sort code of the bank of the sender of the funding\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceFundedTransactionResourceBankTransferResourceGbBankTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_jp_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"sender_bank\": {\n            \"description\": \"The name of the bank of the sender of the funding.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"sender_branch\": {\n            \"description\": \"The name of the bank branch of the sender of the funding.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"sender_name\": {\n            \"description\": \"The full name of the sender, as supplied by the sending bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceFundedTransactionResourceBankTransferResourceJpBankTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_funded_transaction_resource_bank_transfer_resource_us_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"network\": {\n            \"description\": \"The banking network used for this funding.\",\n            \"enum\": [\"ach\", \"domestic_wire_us\", \"swift\"],\n            \"type\": \"string\"\n          },\n          \"sender_name\": {\n            \"description\": \"The full name of the sender, as supplied by the sending bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceFundedTransactionResourceBankTransferResourceUsBankTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_refunded_from_payment_transaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"refund\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/refund\"\n              }\n            ],\n            \"description\": \"The [Refund](https://stripe.com/docs/api/refunds/object) that moved these funds into the customer's cash balance.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"refund\"],\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceRefundedFromPaymentTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"refund\"]\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_transferred_to_balance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"The [Balance Transaction](https://stripe.com/docs/api/balance_transactions/object) that corresponds to funds transferred to your Stripe balance.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"balance_transaction\"],\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceTransferredToBalance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"balance_transaction\"]\n      },\n      \"customer_balance_resource_cash_balance_transaction_resource_unapplied_from_payment_transaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"The [Payment Intent](https://stripe.com/docs/api/payment_intents/object) that funds were unapplied from.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"payment_intent\"],\n        \"title\": \"CustomerBalanceResourceCashBalanceTransactionResourceUnappliedFromPaymentTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_intent\"]\n      },\n      \"customer_balance_transaction\": {\n        \"description\": \"Each customer has a [Balance](https://stripe.com/docs/api/customers/object#customer_object-balance) value,\\nwhich denotes a debit or credit that's automatically applied to their next invoice upon finalization.\\nYou may modify the value directly by using the [update customer API](https://stripe.com/docs/api/customers/update),\\nor by creating a Customer Balance Transaction, which increments or decrements the customer's `balance` by the specified `amount`.\\n\\nRelated guide: [Customer balance](https://stripe.com/docs/billing/customer/balance)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount of the transaction. A negative value is a credit for the customer's balance, and a positive value is a debit to the customer's `balance`.\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"credit_note\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/credit_note\"\n              }\n            ],\n            \"description\": \"The ID of the credit note (if any) related to the transaction.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/credit_note\"\n                }\n              ]\n            }\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"The ID of the customer the transaction belongs to.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"ending_balance\": {\n            \"description\": \"The customer's `balance` after the transaction was applied. A negative value decreases the amount due on the customer's next invoice. A positive value increases the amount due on the customer's next invoice.\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"The ID of the invoice (if any) related to the transaction.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"customer_balance_transaction\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Transaction type: `adjustment`, `applied_to_invoice`, `credit_note`, `initial`, `invoice_overpaid`, `invoice_too_large`, `invoice_too_small`, `unspent_receiver_credit`, or `unapplied_from_invoice`. See the [Customer Balance page](https://stripe.com/docs/billing/customer/balance#types) to learn more about transaction types.\",\n            \"enum\": [\n              \"adjustment\",\n              \"applied_to_invoice\",\n              \"credit_note\",\n              \"initial\",\n              \"invoice_overpaid\",\n              \"invoice_too_large\",\n              \"invoice_too_small\",\n              \"migration\",\n              \"unapplied_from_invoice\",\n              \"unspent_receiver_credit\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"customer\",\n          \"ending_balance\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"type\"\n        ],\n        \"title\": \"CustomerBalanceTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"credit_note\", \"customer\", \"invoice\"],\n        \"x-resourceId\": \"customer_balance_transaction\"\n      },\n      \"customer_cash_balance_transaction\": {\n        \"description\": \"Customers with certain payments enabled have a cash balance, representing funds that were paid\\nby the customer to a merchant, but have not yet been allocated to a payment. Cash Balance Transactions\\nrepresent when funds are moved into or out of this balance. This includes funding by the customer, allocation\\nto payments, and refunds to the customer.\",\n        \"properties\": {\n          \"adjusted_for_overdraft\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_adjusted_for_overdraft\"\n          },\n          \"applied_to_payment\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_applied_to_payment_transaction\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"The customer whose available cash balance changed as a result of this transaction.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"ending_balance\": {\n            \"description\": \"The total available cash balance for the specified currency after this transaction was applied. Represented in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"funded\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_funded_transaction\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"net_amount\": {\n            \"description\": \"The amount by which the cash balance changed, represented in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). A positive value represents funds being added to the cash balance, a negative value represents funds being removed from the cash balance.\",\n            \"type\": \"integer\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"customer_cash_balance_transaction\"],\n            \"type\": \"string\"\n          },\n          \"refunded_from_payment\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_refunded_from_payment_transaction\"\n          },\n          \"transferred_to_balance\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_transferred_to_balance\"\n          },\n          \"type\": {\n            \"description\": \"The type of the cash balance transaction. New types may be added in future. See [Customer Balance](https://stripe.com/docs/payments/customer-balance#types) to learn more about these types.\",\n            \"enum\": [\n              \"adjusted_for_overdraft\",\n              \"applied_to_payment\",\n              \"funded\",\n              \"funding_reversed\",\n              \"refunded_from_payment\",\n              \"return_canceled\",\n              \"return_initiated\",\n              \"transferred_to_balance\",\n              \"unapplied_from_payment\"\n            ],\n            \"type\": \"string\"\n          },\n          \"unapplied_from_payment\": {\n            \"$ref\": \"#/components/schemas/customer_balance_resource_cash_balance_transaction_resource_unapplied_from_payment_transaction\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"currency\",\n          \"customer\",\n          \"ending_balance\",\n          \"id\",\n          \"livemode\",\n          \"net_amount\",\n          \"object\",\n          \"type\"\n        ],\n        \"title\": \"CustomerCashBalanceTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"adjusted_for_overdraft\",\n          \"applied_to_payment\",\n          \"customer\",\n          \"funded\",\n          \"refunded_from_payment\",\n          \"transferred_to_balance\",\n          \"unapplied_from_payment\"\n        ],\n        \"x-resourceId\": \"customer_cash_balance_transaction\"\n      },\n      \"customer_session\": {\n        \"description\": \"A Customer Session allows you to grant Stripe's frontend SDKs (like Stripe.js) client-side access\\ncontrol over a Customer.\\n\\nRelated guides: [Customer Session with the Payment Element](/payments/accept-a-payment-deferred?platform=web&type=payment#save-payment-methods),\\n[Customer Session with the Pricing Table](/payments/checkout/pricing-table#customer-session),\\n[Customer Session with the Buy Button](/payment-links/buy-button#pass-an-existing-customer).\",\n        \"properties\": {\n          \"client_secret\": {\n            \"description\": \"The client secret of this Customer Session. Used on the client to set up secure access to the given `customer`.\\n\\nThe client secret can be used to provide access to `customer` from your frontend. It should not be stored, logged, or exposed to anyone other than the relevant customer. Make sure that you have TLS enabled on any page that includes the client secret.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"components\": {\n            \"$ref\": \"#/components/schemas/customer_session_resource_components\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"The Customer the Customer Session was created for.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which this Customer Session will expire.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"customer_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"client_secret\",\n          \"created\",\n          \"customer\",\n          \"expires_at\",\n          \"livemode\",\n          \"object\"\n        ],\n        \"title\": \"CustomerSessionResourceCustomerSession\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"components\", \"customer\"],\n        \"x-resourceId\": \"customer_session\"\n      },\n      \"customer_session_resource_components\": {\n        \"description\": \"Configuration for the components supported by this Customer Session.\",\n        \"properties\": {\n          \"buy_button\": {\n            \"$ref\": \"#/components/schemas/customer_session_resource_components_resource_buy_button\"\n          },\n          \"payment_element\": {\n            \"$ref\": \"#/components/schemas/customer_session_resource_components_resource_payment_element\"\n          },\n          \"pricing_table\": {\n            \"$ref\": \"#/components/schemas/customer_session_resource_components_resource_pricing_table\"\n          }\n        },\n        \"required\": [\"buy_button\", \"payment_element\", \"pricing_table\"],\n        \"title\": \"CustomerSessionResourceComponents\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"buy_button\", \"payment_element\", \"pricing_table\"]\n      },\n      \"customer_session_resource_components_resource_buy_button\": {\n        \"description\": \"This hash contains whether the buy button is enabled.\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the buy button is enabled.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"CustomerSessionResourceComponentsResourceBuyButton\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_session_resource_components_resource_payment_element\": {\n        \"description\": \"This hash contains whether the Payment Element is enabled and the features it supports.\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the Payment Element is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"features\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/customer_session_resource_components_resource_payment_element_resource_features\"\n              }\n            ],\n            \"description\": \"This hash defines whether the Payment Element supports certain features.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"CustomerSessionResourceComponentsResourcePaymentElement\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"]\n      },\n      \"customer_session_resource_components_resource_payment_element_resource_features\": {\n        \"description\": \"This hash contains the features the Payment Element supports.\",\n        \"properties\": {\n          \"payment_method_allow_redisplay_filters\": {\n            \"description\": \"A list of [`allow_redisplay`](https://docs.stripe.com/api/payment_methods/object#payment_method_object-allow_redisplay) values that controls which saved payment methods the Payment Element displays by filtering to only show payment methods with an `allow_redisplay` value that is present in this list.\\n\\nIf not specified, defaults to [\\\"always\\\"]. In order to display all saved payment methods, specify [\\\"always\\\", \\\"limited\\\", \\\"unspecified\\\"].\",\n            \"items\": {\n              \"enum\": [\"always\", \"limited\", \"unspecified\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"payment_method_redisplay\": {\n            \"description\": \"Controls whether or not the Payment Element shows saved payment methods. This parameter defaults to `disabled`.\",\n            \"enum\": [\"disabled\", \"enabled\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"payment_method_redisplay_limit\": {\n            \"description\": \"Determines the max number of saved payment methods for the Payment Element to display. This parameter defaults to `3`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"payment_method_remove\": {\n            \"description\": \"Controls whether the Payment Element displays the option to remove a saved payment method. This parameter defaults to `disabled`.\\n\\nAllowing buyers to remove their saved payment methods impacts subscriptions that depend on that payment method. Removing the payment method detaches the [`customer` object](https://docs.stripe.com/api/payment_methods/object#payment_method_object-customer) from that [PaymentMethod](https://docs.stripe.com/api/payment_methods).\",\n            \"enum\": [\"disabled\", \"enabled\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"payment_method_save\": {\n            \"description\": \"Controls whether the Payment Element displays a checkbox offering to save a new payment method. This parameter defaults to `disabled`.\\n\\nIf a customer checks the box, the [`allow_redisplay`](https://docs.stripe.com/api/payment_methods/object#payment_method_object-allow_redisplay) value on the PaymentMethod is set to `'always'` at confirmation time. For PaymentIntents, the [`setup_future_usage`](https://docs.stripe.com/api/payment_intents/object#payment_intent_object-setup_future_usage) value is also set to the value defined in `payment_method_save_usage`.\",\n            \"enum\": [\"disabled\", \"enabled\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"payment_method_save_usage\": {\n            \"description\": \"When using PaymentIntents and the customer checks the save checkbox, this field determines the [`setup_future_usage`](https://docs.stripe.com/api/payment_intents/object#payment_intent_object-setup_future_usage) value used to confirm the PaymentIntent.\\n\\nWhen using SetupIntents, directly configure the [`usage`](https://docs.stripe.com/api/setup_intents/object#setup_intent_object-usage) value on SetupIntent creation.\",\n            \"enum\": [\"off_session\", \"on_session\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"payment_method_allow_redisplay_filters\",\n          \"payment_method_redisplay\",\n          \"payment_method_remove\",\n          \"payment_method_save\"\n        ],\n        \"title\": \"CustomerSessionResourceComponentsResourcePaymentElementResourceFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_session_resource_components_resource_pricing_table\": {\n        \"description\": \"This hash contains whether the pricing table is enabled.\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the pricing table is enabled.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"CustomerSessionResourceComponentsResourcePricingTable\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"customer_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"automatic_tax\": {\n            \"description\": \"Surfaces if automatic tax computation is possible given the current customer location information.\",\n            \"enum\": [\n              \"failed\",\n              \"not_collecting\",\n              \"supported\",\n              \"unrecognized_location\"\n            ],\n            \"type\": \"string\"\n          },\n          \"ip_address\": {\n            \"description\": \"A recent IP address of the customer used for tax reporting and tax location inference.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"location\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/customer_tax_location\"\n              }\n            ],\n            \"description\": \"The customer's location as identified by Stripe Tax.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"automatic_tax\"],\n        \"title\": \"CustomerTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"location\"]\n      },\n      \"customer_tax_location\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"The customer's country as identified by Stripe Tax.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"source\": {\n            \"description\": \"The data source used to infer the customer's location.\",\n            \"enum\": [\n              \"billing_address\",\n              \"ip_address\",\n              \"payment_method\",\n              \"shipping_destination\"\n            ],\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"The customer's state, county, province, or region as identified by Stripe Tax.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"country\", \"source\"],\n        \"title\": \"CustomerTaxLocation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"deleted_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"account\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedAccount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_account\"\n      },\n      \"deleted_apple_pay_domain\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"apple_pay_domain\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedApplePayDomain\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_apple_pay_domain\"\n      },\n      \"deleted_application\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"The name of the application.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"application\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedApplication\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"deleted_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"currency\": {\n            \"description\": \"Three-letter [ISO code for the currency](https://stripe.com/docs/payouts) paid out to the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"bank_account\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedBankAccount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"deleted_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"currency\": {\n            \"description\": \"Three-letter [ISO code for the currency](https://stripe.com/docs/payouts) paid out to the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"card\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedCard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"deleted_coupon\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"coupon\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedCoupon\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_coupon\"\n      },\n      \"deleted_customer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"customer\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedCustomer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_customer\"\n      },\n      \"deleted_discount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"checkout_session\": {\n            \"description\": \"The Checkout session that this coupon is applied to, if it is applied to a particular session in payment mode. Will not be present for subscription mode.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"coupon\": {\n            \"$ref\": \"#/components/schemas/coupon\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The ID of the customer associated with this discount.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"The ID of the discount object. Discounts cannot be fetched by ID. Use `expand[]=discounts` in API calls to expand discount IDs in an array.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"description\": \"The invoice that the discount's coupon was applied to, if it was applied directly to a particular invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"invoice_item\": {\n            \"description\": \"The invoice item `id` (or invoice line item `id` for invoice line items of type='subscription') that the discount's coupon was applied to, if it was applied directly to a particular invoice item or invoice line item.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"discount\"],\n            \"type\": \"string\"\n          },\n          \"promotion_code\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/promotion_code\"\n              }\n            ],\n            \"description\": \"The promotion code applied to create this discount.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/promotion_code\"\n                }\n              ]\n            }\n          },\n          \"start\": {\n            \"description\": \"Date that the coupon was applied.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"subscription\": {\n            \"description\": \"The subscription that this coupon is applied to, if it is applied to a particular subscription.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"subscription_item\": {\n            \"description\": \"The subscription item that this coupon is applied to, if it is applied to a particular subscription item.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"coupon\", \"deleted\", \"id\", \"object\", \"start\"],\n        \"title\": \"DeletedDiscount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"coupon\", \"customer\", \"promotion_code\"],\n        \"x-resourceId\": \"deleted_discount\"\n      },\n      \"deleted_external_account\": {\n        \"anyOf\": [\n          {\n            \"$ref\": \"#/components/schemas/deleted_bank_account\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/deleted_card\"\n          }\n        ],\n        \"title\": \"Polymorphic\",\n        \"x-resourceId\": \"deleted_external_account\",\n        \"x-stripeBypassValidation\": true\n      },\n      \"deleted_invoice\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"invoice\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedInvoice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_invoice\"\n      },\n      \"deleted_invoiceitem\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"invoiceitem\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedInvoiceItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_invoiceitem\"\n      },\n      \"deleted_payment_source\": {\n        \"anyOf\": [\n          {\n            \"$ref\": \"#/components/schemas/deleted_bank_account\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/deleted_card\"\n          }\n        ],\n        \"title\": \"Polymorphic\",\n        \"x-resourceId\": \"deleted_payment_source\",\n        \"x-stripeBypassValidation\": true\n      },\n      \"deleted_person\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"person\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedPerson\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_person\"\n      },\n      \"deleted_plan\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"plan\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedPlan\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_plan\"\n      },\n      \"deleted_price\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"price\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedPrice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"deleted_product\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"product\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedProduct\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_product\"\n      },\n      \"deleted_product_feature\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"product_feature\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedProductFeature\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_product_feature\"\n      },\n      \"deleted_radar.value_list\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"radar.value_list\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"RadarListDeletedList\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_radar.value_list\"\n      },\n      \"deleted_radar.value_list_item\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"radar.value_list_item\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"RadarListDeletedListItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_radar.value_list_item\"\n      },\n      \"deleted_subscription_item\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"subscription_item\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedSubscriptionItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_subscription_item\"\n      },\n      \"deleted_tax_id\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax_id\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"deleted_tax_id\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_tax_id\"\n      },\n      \"deleted_terminal.configuration\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"terminal.configuration\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"TerminalConfigurationDeletedConfiguration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_terminal.configuration\"\n      },\n      \"deleted_terminal.location\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"terminal.location\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"TerminalLocationDeletedLocation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_terminal.location\"\n      },\n      \"deleted_terminal.reader\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"terminal.reader\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"TerminalReaderDeletedReader\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_terminal.reader\"\n      },\n      \"deleted_test_helpers.test_clock\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"test_helpers.test_clock\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"DeletedTestClock\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_test_helpers.test_clock\"\n      },\n      \"deleted_webhook_endpoint\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deleted\": {\n            \"description\": \"Always true for a deleted object\",\n            \"enum\": [true],\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"webhook_endpoint\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"deleted\", \"id\", \"object\"],\n        \"title\": \"NotificationWebhookEndpointDeleted\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"deleted_webhook_endpoint\"\n      },\n      \"destination_details_unimplemented\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"destination_details_unimplemented\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"discount\": {\n        \"description\": \"A discount represents the actual application of a [coupon](https://stripe.com/docs/api#coupons) or [promotion code](https://stripe.com/docs/api#promotion_codes).\\nIt contains information about when the discount began, when it will end, and what it is applied to.\\n\\nRelated guide: [Applying discounts to subscriptions](https://stripe.com/docs/billing/subscriptions/discounts)\",\n        \"properties\": {\n          \"checkout_session\": {\n            \"description\": \"The Checkout session that this coupon is applied to, if it is applied to a particular session in payment mode. Will not be present for subscription mode.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"coupon\": {\n            \"$ref\": \"#/components/schemas/coupon\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The ID of the customer associated with this discount.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"end\": {\n            \"description\": \"If the coupon has a duration of `repeating`, the date that this discount will end. If the coupon has a duration of `once` or `forever`, this attribute will be null.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"The ID of the discount object. Discounts cannot be fetched by ID. Use `expand[]=discounts` in API calls to expand discount IDs in an array.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"description\": \"The invoice that the discount's coupon was applied to, if it was applied directly to a particular invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"invoice_item\": {\n            \"description\": \"The invoice item `id` (or invoice line item `id` for invoice line items of type='subscription') that the discount's coupon was applied to, if it was applied directly to a particular invoice item or invoice line item.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"discount\"],\n            \"type\": \"string\"\n          },\n          \"promotion_code\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/promotion_code\"\n              }\n            ],\n            \"description\": \"The promotion code applied to create this discount.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/promotion_code\"\n                }\n              ]\n            }\n          },\n          \"start\": {\n            \"description\": \"Date that the coupon was applied.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"subscription\": {\n            \"description\": \"The subscription that this coupon is applied to, if it is applied to a particular subscription.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"subscription_item\": {\n            \"description\": \"The subscription item that this coupon is applied to, if it is applied to a particular subscription item.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"coupon\", \"id\", \"object\", \"start\"],\n        \"title\": \"Discount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"coupon\", \"customer\", \"promotion_code\"],\n        \"x-resourceId\": \"discount\"\n      },\n      \"discounts_resource_discount_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount, in cents (or local equivalent), of the discount.\",\n            \"type\": \"integer\"\n          },\n          \"discount\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/discount\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_discount\"\n              }\n            ],\n            \"description\": \"The discount that was applied to get this discount amount.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_discount\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"amount\", \"discount\"],\n        \"title\": \"DiscountsResourceDiscountAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"discount\"]\n      },\n      \"discounts_resource_stackable_discount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"coupon\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/coupon\"\n              }\n            ],\n            \"description\": \"ID of the coupon to create a new discount for.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/coupon\"\n                }\n              ]\n            }\n          },\n          \"discount\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/discount\"\n              }\n            ],\n            \"description\": \"ID of an existing discount on the object (or one of its ancestors) to reuse.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              ]\n            }\n          },\n          \"promotion_code\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/promotion_code\"\n              }\n            ],\n            \"description\": \"ID of the promotion code to create a new discount for.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/promotion_code\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"DiscountsResourceStackableDiscount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"coupon\", \"discount\", \"promotion_code\"]\n      },\n      \"dispute\": {\n        \"description\": \"A dispute occurs when a customer questions your charge with their card issuer.\\nWhen this happens, you have the opportunity to respond to the dispute with\\nevidence that shows that the charge is legitimate.\\n\\nRelated guide: [Disputes and fraud](https://stripe.com/docs/disputes)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Disputed amount. Usually the amount of the charge, but it can differ (usually because of currency fluctuation or because only part of the order is disputed).\",\n            \"type\": \"integer\"\n          },\n          \"balance_transactions\": {\n            \"description\": \"List of zero, one, or two balance transactions that show funds withdrawn and reinstated to your Stripe account as a result of this dispute.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_transaction\"\n            },\n            \"type\": \"array\"\n          },\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the charge that's disputed.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"enhanced_eligibility_types\": {\n            \"description\": \"List of eligibility types that are included in `enhanced_evidence`.\",\n            \"items\": {\n              \"enum\": [\"visa_compelling_evidence_3\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"evidence\": {\n            \"$ref\": \"#/components/schemas/dispute_evidence\"\n          },\n          \"evidence_details\": {\n            \"$ref\": \"#/components/schemas/dispute_evidence_details\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"is_charge_refundable\": {\n            \"description\": \"If true, it's still possible to refund the disputed payment. After the payment has been fully refunded, no further funds are withdrawn from your Stripe account as a result of this dispute.\",\n            \"type\": \"boolean\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"dispute\"],\n            \"type\": \"string\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"ID of the PaymentIntent that's disputed.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"payment_method_details\": {\n            \"$ref\": \"#/components/schemas/dispute_payment_method_details\"\n          },\n          \"reason\": {\n            \"description\": \"Reason given by cardholder for dispute. Possible values are `bank_cannot_process`, `check_returned`, `credit_not_processed`, `customer_initiated`, `debit_not_authorized`, `duplicate`, `fraudulent`, `general`, `incorrect_account_details`, `insufficient_funds`, `product_not_received`, `product_unacceptable`, `subscription_canceled`, or `unrecognized`. Learn more about [dispute reasons](https://stripe.com/docs/disputes/categories).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Current status of dispute. Possible values are `warning_needs_response`, `warning_under_review`, `warning_closed`, `needs_response`, `under_review`, `won`, or `lost`.\",\n            \"enum\": [\n              \"lost\",\n              \"needs_response\",\n              \"under_review\",\n              \"warning_closed\",\n              \"warning_needs_response\",\n              \"warning_under_review\",\n              \"won\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"balance_transactions\",\n          \"charge\",\n          \"created\",\n          \"currency\",\n          \"enhanced_eligibility_types\",\n          \"evidence\",\n          \"evidence_details\",\n          \"id\",\n          \"is_charge_refundable\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"reason\",\n          \"status\"\n        ],\n        \"title\": \"Dispute\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"balance_transactions\",\n          \"charge\",\n          \"evidence\",\n          \"evidence_details\",\n          \"payment_intent\",\n          \"payment_method_details\"\n        ],\n        \"x-resourceId\": \"dispute\"\n      },\n      \"dispute_enhanced_eligibility\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"visa_compelling_evidence_3\": {\n            \"$ref\": \"#/components/schemas/dispute_enhanced_eligibility_visa_compelling_evidence3\"\n          },\n          \"visa_compliance\": {\n            \"$ref\": \"#/components/schemas/dispute_enhanced_eligibility_visa_compliance\"\n          }\n        },\n        \"title\": \"DisputeEnhancedEligibility\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"visa_compelling_evidence_3\", \"visa_compliance\"]\n      },\n      \"dispute_enhanced_eligibility_visa_compelling_evidence3\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"required_actions\": {\n            \"description\": \"List of actions required to qualify dispute for Visa Compelling Evidence 3.0 evidence submission.\",\n            \"items\": {\n              \"enum\": [\n                \"missing_customer_identifiers\",\n                \"missing_disputed_transaction_description\",\n                \"missing_merchandise_or_services\",\n                \"missing_prior_undisputed_transaction_description\",\n                \"missing_prior_undisputed_transactions\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"status\": {\n            \"description\": \"Visa Compelling Evidence 3.0 eligibility status.\",\n            \"enum\": [\"not_qualified\", \"qualified\", \"requires_action\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"required_actions\", \"status\"],\n        \"title\": \"DisputeEnhancedEligibilityVisaCompellingEvidence3\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_enhanced_eligibility_visa_compliance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Visa compliance eligibility status.\",\n            \"enum\": [\"fee_acknowledged\", \"requires_fee_acknowledgement\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"DisputeEnhancedEligibilityVisaCompliance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_enhanced_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"visa_compelling_evidence_3\": {\n            \"$ref\": \"#/components/schemas/dispute_enhanced_evidence_visa_compelling_evidence3\"\n          },\n          \"visa_compliance\": {\n            \"$ref\": \"#/components/schemas/dispute_enhanced_evidence_visa_compliance\"\n          }\n        },\n        \"title\": \"DisputeEnhancedEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"visa_compelling_evidence_3\", \"visa_compliance\"]\n      },\n      \"dispute_enhanced_evidence_visa_compelling_evidence3\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disputed_transaction\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/dispute_visa_compelling_evidence3_disputed_transaction\"\n              }\n            ],\n            \"description\": \"Disputed transaction details for Visa Compelling Evidence 3.0 evidence submission.\",\n            \"nullable\": true\n          },\n          \"prior_undisputed_transactions\": {\n            \"description\": \"List of exactly two prior undisputed transaction objects for Visa Compelling Evidence 3.0 evidence submission.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/dispute_visa_compelling_evidence3_prior_undisputed_transaction\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"prior_undisputed_transactions\"],\n        \"title\": \"DisputeEnhancedEvidenceVisaCompellingEvidence3\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"disputed_transaction\",\n          \"prior_undisputed_transactions\"\n        ]\n      },\n      \"dispute_enhanced_evidence_visa_compliance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fee_acknowledged\": {\n            \"description\": \"A field acknowledging the fee incurred when countering a Visa compliance dispute. If this field is set to true, evidence can be submitted for the compliance dispute. Stripe collects a 500 USD (or local equivalent) amount to cover the network costs associated with resolving compliance disputes. Stripe refunds the 500 USD network fee if you win the dispute.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"fee_acknowledged\"],\n        \"title\": \"DisputeEnhancedEvidenceVisaCompliance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"access_activity_log\": {\n            \"description\": \"Any server or activity logs showing proof that the customer accessed or downloaded the purchased digital product. This information should include IP addresses, corresponding timestamps, and any detailed recorded activity.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"billing_address\": {\n            \"description\": \"The billing address provided by the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cancellation_policy\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Your subscription cancellation policy, as shown to the customer.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"cancellation_policy_disclosure\": {\n            \"description\": \"An explanation of how and when the customer was shown your refund policy prior to purchase.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cancellation_rebuttal\": {\n            \"description\": \"A justification for why the customer's subscription was not canceled.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_communication\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Any communication with the customer that you feel is relevant to your case. Examples include emails proving that the customer received the product or service, or demonstrating their use of or satisfaction with the product or service.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"customer_email_address\": {\n            \"description\": \"The email address of the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_name\": {\n            \"description\": \"The name of the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_purchase_ip\": {\n            \"description\": \"The IP address that the customer used when making the purchase.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_signature\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) A relevant document or contract showing the customer's signature.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"duplicate_charge_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Documentation for the prior charge that can uniquely identify the charge, such as a receipt, shipping label, work order, etc. This document should be paired with a similar document from the disputed payment that proves the two payments are separate.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"duplicate_charge_explanation\": {\n            \"description\": \"An explanation of the difference between the disputed charge versus the prior charge that appears to be a duplicate.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"duplicate_charge_id\": {\n            \"description\": \"The Stripe ID for the prior charge which appears to be a duplicate of the disputed charge.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"enhanced_evidence\": {\n            \"$ref\": \"#/components/schemas/dispute_enhanced_evidence\"\n          },\n          \"product_description\": {\n            \"description\": \"A description of the product or service that was sold.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"receipt\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Any receipt or message sent to the customer notifying them of the charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"refund_policy\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Your refund policy, as shown to the customer.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"refund_policy_disclosure\": {\n            \"description\": \"Documentation demonstrating that the customer was shown your refund policy prior to purchase.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_refusal_explanation\": {\n            \"description\": \"A justification for why the customer is not entitled to a refund.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"service_date\": {\n            \"description\": \"The date on which the customer received or began receiving the purchased service, in a clear human-readable format.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"service_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Documentation showing proof that a service was provided to the customer. This could include a copy of a signed contract, work order, or other form of written agreement.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"shipping_address\": {\n            \"description\": \"The address to which a physical product was shipped. You should try to include as complete address information as possible.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_carrier\": {\n            \"description\": \"The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc. If multiple carriers were used for this purchase, please separate them with commas.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_date\": {\n            \"description\": \"The date on which a physical product began its route to the shipping address, in a clear human-readable format.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Documentation showing proof that a product was shipped to the customer at the same address the customer provided to you. This could include a copy of the shipment receipt, shipping label, etc. It should show the customer's full shipping address, if possible.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"shipping_tracking_number\": {\n            \"description\": \"The tracking number for a physical product, obtained from the delivery service. If multiple tracking numbers were generated for this purchase, please separate them with commas.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"uncategorized_file\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Any additional evidence or statements.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"uncategorized_text\": {\n            \"description\": \"Any additional evidence or statements.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"enhanced_evidence\"],\n        \"title\": \"DisputeEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"cancellation_policy\",\n          \"customer_communication\",\n          \"customer_signature\",\n          \"duplicate_charge_documentation\",\n          \"enhanced_evidence\",\n          \"receipt\",\n          \"refund_policy\",\n          \"service_documentation\",\n          \"shipping_documentation\",\n          \"uncategorized_file\"\n        ]\n      },\n      \"dispute_evidence_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"due_by\": {\n            \"description\": \"Date by which evidence must be submitted in order to successfully challenge dispute. Will be 0 if the customer's bank or credit card company doesn't allow a response for this particular dispute.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"enhanced_eligibility\": {\n            \"$ref\": \"#/components/schemas/dispute_enhanced_eligibility\"\n          },\n          \"has_evidence\": {\n            \"description\": \"Whether evidence has been staged for this dispute.\",\n            \"type\": \"boolean\"\n          },\n          \"past_due\": {\n            \"description\": \"Whether the last evidence submission was submitted past the due date. Defaults to `false` if no evidence submissions have occurred. If `true`, then delivery of the latest evidence is *not* guaranteed.\",\n            \"type\": \"boolean\"\n          },\n          \"submission_count\": {\n            \"description\": \"The number of times evidence has been submitted. Typically, you may only submit evidence once.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"enhanced_eligibility\",\n          \"has_evidence\",\n          \"past_due\",\n          \"submission_count\"\n        ],\n        \"title\": \"DisputeEvidenceDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"enhanced_eligibility\"]\n      },\n      \"dispute_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/dispute_payment_method_details_amazon_pay\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/dispute_payment_method_details_card\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/dispute_payment_method_details_klarna\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/dispute_payment_method_details_paypal\"\n          },\n          \"type\": {\n            \"description\": \"Payment method type.\",\n            \"enum\": [\"amazon_pay\", \"card\", \"klarna\", \"paypal\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"DisputePaymentMethodDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"amazon_pay\", \"card\", \"klarna\", \"paypal\"]\n      },\n      \"dispute_payment_method_details_amazon_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"dispute_type\": {\n            \"description\": \"The AmazonPay dispute type, chargeback or claim\",\n            \"enum\": [\"chargeback\", \"claim\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"DisputePaymentMethodDetailsAmazonPay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_payment_method_details_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"case_type\": {\n            \"description\": \"The type of dispute opened. Different case types may have varying fees and financial impact.\",\n            \"enum\": [\"chargeback\", \"inquiry\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"network_reason_code\": {\n            \"description\": \"The card network's specific dispute reason code, which maps to one of Stripe's primary dispute categories to simplify response guidance. The [Network code map](https://stripe.com/docs/disputes/categories#network-code-map) lists all available dispute reason codes by network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"brand\", \"case_type\"],\n        \"title\": \"DisputePaymentMethodDetailsCard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_payment_method_details_klarna\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reason_code\": {\n            \"description\": \"The reason for the dispute as defined by Klarna\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"DisputePaymentMethodDetailsKlarna\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_payment_method_details_paypal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"case_id\": {\n            \"description\": \"The ID of the dispute in PayPal.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason_code\": {\n            \"description\": \"The reason for the dispute as defined by PayPal\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"DisputePaymentMethodDetailsPaypal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_transaction_shipping_address\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"city\": {\n            \"description\": \"City, district, suburb, town, or village.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line1\": {\n            \"description\": \"Address line 1 (e.g., street, PO Box, or company name).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line2\": {\n            \"description\": \"Address line 2 (e.g., apartment, suite, unit, or building).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"postal_code\": {\n            \"description\": \"ZIP or postal code.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"State, county, province, or region.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"DisputeTransactionShippingAddress\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"dispute_visa_compelling_evidence3_disputed_transaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"customer_account_id\": {\n            \"description\": \"User Account ID used to log into business platform. Must be recognizable by the user.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_device_fingerprint\": {\n            \"description\": \"Unique identifier of the cardholder’s device derived from a combination of at least two hardware and software attributes. Must be at least 20 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_device_id\": {\n            \"description\": \"Unique identifier of the cardholder’s device such as a device serial number (e.g., International Mobile Equipment Identity [IMEI]). Must be at least 15 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_email_address\": {\n            \"description\": \"The email address of the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_purchase_ip\": {\n            \"description\": \"The IP address that the customer used when making the purchase.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"merchandise_or_services\": {\n            \"description\": \"Categorization of disputed payment.\",\n            \"enum\": [\"merchandise\", \"services\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_description\": {\n            \"description\": \"A description of the product or service that was sold.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/dispute_transaction_shipping_address\"\n              }\n            ],\n            \"description\": \"The address to which a physical product was shipped. All fields are required for Visa Compelling Evidence 3.0 evidence submission.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"DisputeVisaCompellingEvidence3DisputedTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"shipping_address\"]\n      },\n      \"dispute_visa_compelling_evidence3_prior_undisputed_transaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"charge\": {\n            \"description\": \"Stripe charge ID for the Visa Compelling Evidence 3.0 eligible prior charge.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"customer_account_id\": {\n            \"description\": \"User Account ID used to log into business platform. Must be recognizable by the user.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_device_fingerprint\": {\n            \"description\": \"Unique identifier of the cardholder’s device derived from a combination of at least two hardware and software attributes. Must be at least 20 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_device_id\": {\n            \"description\": \"Unique identifier of the cardholder’s device such as a device serial number (e.g., International Mobile Equipment Identity [IMEI]). Must be at least 15 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_email_address\": {\n            \"description\": \"The email address of the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_purchase_ip\": {\n            \"description\": \"The IP address that the customer used when making the purchase.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_description\": {\n            \"description\": \"A description of the product or service that was sold.\",\n            \"maxLength\": 150000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/dispute_transaction_shipping_address\"\n              }\n            ],\n            \"description\": \"The address to which a physical product was shipped. All fields are required for Visa Compelling Evidence 3.0 evidence submission.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"charge\"],\n        \"title\": \"DisputeVisaCompellingEvidence3PriorUndisputedTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"shipping_address\"]\n      },\n      \"email_sent\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"email_sent_at\": {\n            \"description\": \"The timestamp when the email was sent.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"email_sent_to\": {\n            \"description\": \"The recipient's email address.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"email_sent_at\", \"email_sent_to\"],\n        \"title\": \"EmailSent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"entitlements.active_entitlement\": {\n        \"description\": \"An active entitlement describes access to a feature for a customer.\",\n        \"properties\": {\n          \"feature\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/entitlements.feature\"\n              }\n            ],\n            \"description\": \"The [Feature](https://stripe.com/docs/api/entitlements/feature) that the customer is entitled to.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/entitlements.feature\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"lookup_key\": {\n            \"description\": \"A unique key you provide as your own system identifier. This may be up to 80 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"entitlements.active_entitlement\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"feature\", \"id\", \"livemode\", \"lookup_key\", \"object\"],\n        \"title\": \"ActiveEntitlement\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"feature\"],\n        \"x-resourceId\": \"entitlements.active_entitlement\"\n      },\n      \"entitlements.feature\": {\n        \"description\": \"A feature represents a monetizable ability or functionality in your system.\\nFeatures can be assigned to products, and when those products are purchased, Stripe will create an entitlement to the feature for the purchasing customer.\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Inactive features cannot be attached to new products and will not be returned from the features list endpoint.\",\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"lookup_key\": {\n            \"description\": \"A unique key you provide as your own system identifier. This may be up to 80 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"The feature's name, for your own purpose, not meant to be displayable to the customer.\",\n            \"maxLength\": 80,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"entitlements.feature\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"id\",\n          \"livemode\",\n          \"lookup_key\",\n          \"metadata\",\n          \"name\",\n          \"object\"\n        ],\n        \"title\": \"Feature\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"entitlements.feature\"\n      },\n      \"ephemeral_key\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"expires\": {\n            \"description\": \"Time at which the key will expire. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"ephemeral_key\"],\n            \"type\": \"string\"\n          },\n          \"secret\": {\n            \"description\": \"The key's secret. You can use this value to make authorized requests to the Stripe API.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"created\", \"expires\", \"id\", \"livemode\", \"object\"],\n        \"title\": \"EphemeralKey\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"ephemeral_key\"\n      },\n      \"error\": {\n        \"description\": \"An error response from the Stripe API\",\n        \"properties\": {\n          \"error\": {\n            \"$ref\": \"#/components/schemas/api_errors\"\n          }\n        },\n        \"required\": [\"error\"],\n        \"type\": \"object\"\n      },\n      \"event\": {\n        \"description\": \"Events are our way of letting you know when something interesting happens in\\nyour account. When an interesting event occurs, we create a new `Event`\\nobject. For example, when a charge succeeds, we create a `charge.succeeded`\\nevent, and when an invoice payment attempt fails, we create an\\n`invoice.payment_failed` event. Certain API requests might create multiple\\nevents. For example, if you create a new subscription for a\\ncustomer, you receive both a `customer.subscription.created` event and a\\n`charge.succeeded` event.\\n\\nEvents occur when the state of another API resource changes. The event's data\\nfield embeds the resource's state at the time of the change. For\\nexample, a `charge.succeeded` event contains a charge, and an\\n`invoice.payment_failed` event contains an invoice.\\n\\nAs with other API resources, you can use endpoints to retrieve an\\n[individual event](https://stripe.com/docs/api#retrieve_event) or a [list of events](https://stripe.com/docs/api#list_events)\\nfrom the API. We also have a separate\\n[webhooks](http://en.wikipedia.org/wiki/Webhook) system for sending the\\n`Event` objects directly to an endpoint on your server. You can manage\\nwebhooks in your\\n[account settings](https://dashboard.stripe.com/account/webhooks). Learn how\\nto [listen for events](https://docs.stripe.com/webhooks)\\nso that your integration can automatically trigger reactions.\\n\\nWhen using [Connect](https://docs.stripe.com/connect), you can also receive event notifications\\nthat occur in connected accounts. For these events, there's an\\nadditional `account` attribute in the received `Event` object.\\n\\nWe only guarantee access to events through the [Retrieve Event API](https://stripe.com/docs/api#retrieve_event)\\nfor 30 days.\",\n        \"properties\": {\n          \"account\": {\n            \"description\": \"The connected account that originates the event.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"api_version\": {\n            \"description\": \"The Stripe API version used to render `data`. This property is populated only for events on or after October 31, 2014.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"data\": {\n            \"$ref\": \"#/components/schemas/notification_event_data\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"event\"],\n            \"type\": \"string\"\n          },\n          \"pending_webhooks\": {\n            \"description\": \"Number of webhooks that haven't been successfully delivered (for example, to return a 20x response) to the URLs you specify.\",\n            \"type\": \"integer\"\n          },\n          \"request\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/notification_event_request\"\n              }\n            ],\n            \"description\": \"Information on the API request that triggers the event.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"Description of the event (for example, `invoice.created` or `charge.refunded`).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"data\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"pending_webhooks\",\n          \"type\"\n        ],\n        \"title\": \"NotificationEvent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"data\", \"request\"],\n        \"x-resourceId\": \"event\"\n      },\n      \"exchange_rate\": {\n        \"description\": \"`ExchangeRate` objects allow you to determine the rates that Stripe is currently\\nusing to convert from one currency to another. Since this number is variable\\nthroughout the day, there are various reasons why you might want to know the current\\nrate (for example, to dynamically price an item for a user with a default\\npayment in a foreign currency).\\n\\nPlease refer to our [Exchange Rates API](https://stripe.com/docs/fx-rates) guide for more details.\\n\\n*[Note: this integration path is supported but no longer recommended]* Additionally,\\nyou can guarantee that a charge is made with an exchange rate that you expect is\\ncurrent. To do so, you must pass in the exchange_rate to charges endpoints. If the\\nvalue is no longer up to date, the charge won't go through. Please refer to our\\n[Using with charges](https://stripe.com/docs/exchange-rates) guide for more details.\\n\\n-----\\n\\n&nbsp;\\n\\n*This Exchange Rates API is a Beta Service and is subject to Stripe's terms of service. You may use the API solely for the purpose of transacting on Stripe. For example, the API may be queried in order to:*\\n\\n- *localize prices for processing payments on Stripe*\\n- *reconcile Stripe transactions*\\n- *determine how much money to send to a connected account*\\n- *determine app fees to charge a connected account*\\n\\n*Using this Exchange Rates API beta for any purpose other than to transact on Stripe is strictly prohibited and constitutes a violation of Stripe's terms of service.*\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object. Represented as the three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) in lowercase.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"exchange_rate\"],\n            \"type\": \"string\"\n          },\n          \"rates\": {\n            \"additionalProperties\": {\n              \"type\": \"number\"\n            },\n            \"description\": \"Hash where the keys are supported currencies and the values are the exchange rate at which the base id currency converts to the key currency.\",\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"object\", \"rates\"],\n        \"title\": \"ExchangeRate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"exchange_rate\"\n      },\n      \"external_account\": {\n        \"anyOf\": [\n          {\n            \"$ref\": \"#/components/schemas/bank_account\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/card\"\n          }\n        ],\n        \"title\": \"Polymorphic\",\n        \"x-resourceId\": \"external_account\",\n        \"x-stripeBypassValidation\": true\n      },\n      \"external_account_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"currently_due\": {\n            \"description\": \"Fields that need to be collected to keep the external account enabled. If not collected by `current_deadline`, these fields appear in `past_due` as well, and the account is disabled.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"errors\": {\n            \"description\": \"Fields that are `currently_due` and need to be collected again because validation or verification failed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_error\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"past_due\": {\n            \"description\": \"Fields that weren't collected by `current_deadline`. These fields need to be collected to enable the external account.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"pending_verification\": {\n            \"description\": \"Fields that might become required depending on the results of verification or review. It's an empty array unless an asynchronous verification is pending. If verification fails, these fields move to `eventually_due`, `currently_due`, or `past_due`. Fields might appear in `eventually_due`, `currently_due`, or `past_due` and in `pending_verification` if verification fails but another verification is still pending.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"ExternalAccountRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"errors\"]\n      },\n      \"fee\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount of the fee, in cents.\",\n            \"type\": \"integer\"\n          },\n          \"application\": {\n            \"description\": \"ID of the Connect application that earned the fee.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Type of the fee, one of: `application_fee`, `payment_method_passthrough_fee`, `stripe_fee` or `tax`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\", \"type\"],\n        \"title\": \"Fee\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"fee_refund\": {\n        \"description\": \"`Application Fee Refund` objects allow you to refund an application fee that\\nhas previously been created but not yet refunded. Funds will be refunded to\\nthe Stripe account from which the fee was originally collected.\\n\\nRelated guide: [Refunding application fees](https://stripe.com/docs/connect/destination-charges#refunding-app-fee)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"Balance transaction that describes the impact on your account balance.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"fee\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application_fee\"\n              }\n            ],\n            \"description\": \"ID of the application fee that was refunded.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application_fee\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"fee_refund\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"created\", \"currency\", \"fee\", \"id\", \"object\"],\n        \"title\": \"FeeRefund\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"balance_transaction\", \"fee\"],\n        \"x-resourceId\": \"fee_refund\"\n      },\n      \"file\": {\n        \"description\": \"This object represents files hosted on Stripe's servers. You can upload\\nfiles with the [create file](https://stripe.com/docs/api#create_file) request\\n(for example, when uploading dispute evidence). Stripe also\\ncreates files independently (for example, the results of a [Sigma scheduled\\nquery](#scheduled_queries)).\\n\\nRelated guide: [File upload guide](https://stripe.com/docs/file-upload)\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"The file expires and isn't available at this time in epoch seconds.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"filename\": {\n            \"description\": \"The suitable name for saving the file to a filesystem.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"links\": {\n            \"description\": \"A list of [file links](https://stripe.com/docs/api#file_links) that point at this file.\",\n            \"nullable\": true,\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/file_link\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"pattern\": \"^/v1/file_links\",\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"FileResourceFileLinkList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"file\"],\n            \"type\": \"string\"\n          },\n          \"purpose\": {\n            \"description\": \"The [purpose](https://stripe.com/docs/file-upload#uploading-a-file) of the uploaded file.\",\n            \"enum\": [\n              \"account_requirement\",\n              \"additional_verification\",\n              \"business_icon\",\n              \"business_logo\",\n              \"customer_signature\",\n              \"dispute_evidence\",\n              \"document_provider_identity_document\",\n              \"finance_report_run\",\n              \"financial_account_statement\",\n              \"identity_document\",\n              \"identity_document_downloadable\",\n              \"issuing_regulatory_reporting\",\n              \"pci_document\",\n              \"selfie\",\n              \"sigma_scheduled_query\",\n              \"tax_document_user_upload\",\n              \"terminal_reader_splashscreen\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"size\": {\n            \"description\": \"The size of the file object in bytes.\",\n            \"type\": \"integer\"\n          },\n          \"title\": {\n            \"description\": \"A suitable title for the document.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The returned file type (for example, `csv`, `pdf`, `jpg`, or `png`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"Use your live secret API key to download the file from this URL.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"created\", \"id\", \"object\", \"purpose\", \"size\"],\n        \"title\": \"File\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"links\"],\n        \"x-resourceId\": \"file\"\n      },\n      \"file_link\": {\n        \"description\": \"To share the contents of a `File` object with non-Stripe users, you can\\ncreate a `FileLink`. `FileLink`s contain a URL that you can use to\\nretrieve the contents of the file without authentication.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"expired\": {\n            \"description\": \"Returns if the link is already expired.\",\n            \"type\": \"boolean\"\n          },\n          \"expires_at\": {\n            \"description\": \"Time that the link expires.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"file\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The file object this link points to.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"file_link\"],\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The publicly accessible URL to download the file.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"expired\",\n          \"file\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\"\n        ],\n        \"title\": \"FileLink\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"file\"],\n        \"x-resourceId\": \"file_link\"\n      },\n      \"financial_connections.account\": {\n        \"description\": \"A Financial Connections Account represents an account that exists outside of Stripe, to which you have been granted some degree of access.\",\n        \"properties\": {\n          \"account_holder\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/bank_connections_resource_accountholder\"\n              }\n            ],\n            \"description\": \"The account holder that this account belongs to.\",\n            \"nullable\": true\n          },\n          \"balance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/bank_connections_resource_balance\"\n              }\n            ],\n            \"description\": \"The most recent information about the account's balance.\",\n            \"nullable\": true\n          },\n          \"balance_refresh\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/bank_connections_resource_balance_refresh\"\n              }\n            ],\n            \"description\": \"The state of the most recent attempt to refresh the account balance.\",\n            \"nullable\": true\n          },\n          \"category\": {\n            \"description\": \"The type of the account. Account category is further divided in `subcategory`.\",\n            \"enum\": [\"cash\", \"credit\", \"investment\", \"other\"],\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"display_name\": {\n            \"description\": \"A human-readable name that has been assigned to this account, either by the account holder or by the institution.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"institution_name\": {\n            \"description\": \"The name of the institution that holds this account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last 4 digits of the account number. If present, this will be 4 numeric characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"financial_connections.account\"],\n            \"type\": \"string\"\n          },\n          \"ownership\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/financial_connections.account_ownership\"\n              }\n            ],\n            \"description\": \"The most recent information about the account's owners.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/financial_connections.account_ownership\"\n                }\n              ]\n            }\n          },\n          \"ownership_refresh\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/bank_connections_resource_ownership_refresh\"\n              }\n            ],\n            \"description\": \"The state of the most recent attempt to refresh the account owners.\",\n            \"nullable\": true\n          },\n          \"permissions\": {\n            \"description\": \"The list of permissions granted by this account.\",\n            \"items\": {\n              \"enum\": [\n                \"balances\",\n                \"ownership\",\n                \"payment_method\",\n                \"transactions\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"status\": {\n            \"description\": \"The status of the link to the account.\",\n            \"enum\": [\"active\", \"disconnected\", \"inactive\"],\n            \"type\": \"string\"\n          },\n          \"subcategory\": {\n            \"description\": \"If `category` is `cash`, one of:\\n\\n - `checking`\\n - `savings`\\n - `other`\\n\\nIf `category` is `credit`, one of:\\n\\n - `mortgage`\\n - `line_of_credit`\\n - `credit_card`\\n - `other`\\n\\nIf `category` is `investment` or `other`, this will be `other`.\",\n            \"enum\": [\n              \"checking\",\n              \"credit_card\",\n              \"line_of_credit\",\n              \"mortgage\",\n              \"other\",\n              \"savings\"\n            ],\n            \"type\": \"string\"\n          },\n          \"subscriptions\": {\n            \"description\": \"The list of data refresh subscriptions requested on this account.\",\n            \"items\": {\n              \"enum\": [\"transactions\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"supported_payment_method_types\": {\n            \"description\": \"The [PaymentMethod type](https://stripe.com/docs/api/payment_methods/object#payment_method_object-type)(s) that can be created from this account.\",\n            \"items\": {\n              \"enum\": [\"link\", \"us_bank_account\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"transaction_refresh\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/bank_connections_resource_transaction_refresh\"\n              }\n            ],\n            \"description\": \"The state of the most recent attempt to refresh the account transactions.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\n          \"category\",\n          \"created\",\n          \"id\",\n          \"institution_name\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"subcategory\",\n          \"supported_payment_method_types\"\n        ],\n        \"title\": \"BankConnectionsResourceLinkedAccount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account_holder\",\n          \"balance\",\n          \"balance_refresh\",\n          \"ownership\",\n          \"ownership_refresh\",\n          \"transaction_refresh\"\n        ],\n        \"x-resourceId\": \"financial_connections.account\"\n      },\n      \"financial_connections.account_owner\": {\n        \"description\": \"Describes an owner of an account.\",\n        \"properties\": {\n          \"email\": {\n            \"description\": \"The email address of the owner.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"The full name of the owner.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"financial_connections.account_owner\"],\n            \"type\": \"string\"\n          },\n          \"ownership\": {\n            \"description\": \"The ownership object that this owner belongs to.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"The raw phone number of the owner.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"raw_address\": {\n            \"description\": \"The raw physical address of the owner.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refreshed_at\": {\n            \"description\": \"The timestamp of the refresh that updated this owner.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"id\", \"name\", \"object\", \"ownership\"],\n        \"title\": \"BankConnectionsResourceOwner\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"financial_connections.account_owner\"\n      },\n      \"financial_connections.account_ownership\": {\n        \"description\": \"Describes a snapshot of the owners of an account at a particular point in time.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"financial_connections.account_ownership\"],\n            \"type\": \"string\"\n          },\n          \"owners\": {\n            \"description\": \"A paginated list of owners for this account.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account_owner\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"BankConnectionsResourceOwnerList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          }\n        },\n        \"required\": [\"created\", \"id\", \"object\", \"owners\"],\n        \"title\": \"BankConnectionsResourceOwnership\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"owners\"]\n      },\n      \"financial_connections.session\": {\n        \"description\": \"A Financial Connections Session is the secure way to programmatically launch the client-side Stripe.js modal that lets your users link their accounts.\",\n        \"properties\": {\n          \"account_holder\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/bank_connections_resource_accountholder\"\n              }\n            ],\n            \"description\": \"The account holder for whom accounts are collected in this session.\",\n            \"nullable\": true\n          },\n          \"accounts\": {\n            \"description\": \"The accounts that were collected as part of this Session.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"pattern\": \"^/v1/financial_connections/accounts\",\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"BankConnectionsResourceLinkedAccountList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"client_secret\": {\n            \"description\": \"A value that will be passed to the client to launch the authentication flow.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"filters\": {\n            \"$ref\": \"#/components/schemas/bank_connections_resource_link_account_session_filters\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"financial_connections.session\"],\n            \"type\": \"string\"\n          },\n          \"permissions\": {\n            \"description\": \"Permissions requested for accounts collected during this session.\",\n            \"items\": {\n              \"enum\": [\n                \"balances\",\n                \"ownership\",\n                \"payment_method\",\n                \"transactions\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"prefetch\": {\n            \"description\": \"Data features requested to be retrieved upon account creation.\",\n            \"items\": {\n              \"enum\": [\"balances\", \"ownership\", \"transactions\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"return_url\": {\n            \"description\": \"For webview integrations only. Upon completing OAuth login in the native browser, the user will be redirected to this URL to return to your app.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"accounts\",\n          \"client_secret\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"permissions\"\n        ],\n        \"title\": \"BankConnectionsResourceLinkAccountSession\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_holder\", \"accounts\", \"filters\"],\n        \"x-resourceId\": \"financial_connections.session\"\n      },\n      \"financial_connections.transaction\": {\n        \"description\": \"A Transaction represents a real transaction that affects a Financial Connections Account balance.\",\n        \"properties\": {\n          \"account\": {\n            \"description\": \"The ID of the Financial Connections Account this transaction belongs to.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"amount\": {\n            \"description\": \"The amount of this transaction, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"The description of this transaction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"financial_connections.transaction\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the transaction.\",\n            \"enum\": [\"pending\", \"posted\", \"void\"],\n            \"type\": \"string\"\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/bank_connections_resource_transaction_resource_status_transitions\"\n          },\n          \"transacted_at\": {\n            \"description\": \"Time at which the transaction was transacted. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"transaction_refresh\": {\n            \"description\": \"The token of the transaction refresh that last updated or created this transaction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"updated\": {\n            \"description\": \"Time at which the object was last updated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"account\",\n          \"amount\",\n          \"currency\",\n          \"description\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"status_transitions\",\n          \"transacted_at\",\n          \"transaction_refresh\",\n          \"updated\"\n        ],\n        \"title\": \"BankConnectionsResourceTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_transitions\"],\n        \"x-resourceId\": \"financial_connections.transaction\"\n      },\n      \"financial_reporting_finance_report_run_run_parameters\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"columns\": {\n            \"description\": \"The set of output columns requested for inclusion in the report run.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"connected_account\": {\n            \"description\": \"Connected account ID by which to filter the report run.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"currency\": {\n            \"description\": \"Currency of objects to be included in the report run.\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"interval_end\": {\n            \"description\": \"Ending timestamp of data to be included in the report run. Can be any UTC timestamp between 1 second after the user specified `interval_start` and 1 second before this report's last `data_available_end` value.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"interval_start\": {\n            \"description\": \"Starting timestamp of data to be included in the report run. Can be any UTC timestamp between 1 second after this report's `data_available_start` and 1 second before the user specified `interval_end` value.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"payout\": {\n            \"description\": \"Payout ID by which to filter the report run.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"reporting_category\": {\n            \"description\": \"Category of balance transactions to be included in the report run.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"timezone\": {\n            \"description\": \"Defaults to `Etc/UTC`. The output timezone for all timestamps in the report. A list of possible time zone values is maintained at the [IANA Time Zone Database](http://www.iana.org/time-zones). Has no effect on `interval_start` or `interval_end`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"FinancialReportingFinanceReportRunRunParameters\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"forwarded_request_context\": {\n        \"description\": \"Metadata about the forwarded request.\",\n        \"properties\": {\n          \"destination_duration\": {\n            \"description\": \"The time it took in milliseconds for the destination endpoint to respond.\",\n            \"type\": \"integer\"\n          },\n          \"destination_ip_address\": {\n            \"description\": \"The IP address of the destination.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"destination_duration\", \"destination_ip_address\"],\n        \"title\": \"ForwardedRequestContext\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"forwarded_request_details\": {\n        \"description\": \"Details about the request forwarded to the destination endpoint.\",\n        \"properties\": {\n          \"body\": {\n            \"description\": \"The body payload to send to the destination endpoint.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"headers\": {\n            \"description\": \"The headers to include in the forwarded request. Can be omitted if no additional headers (excluding Stripe-generated ones such as the Content-Type header) should be included.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/forwarded_request_header\"\n            },\n            \"type\": \"array\"\n          },\n          \"http_method\": {\n            \"description\": \"The HTTP method used to call the destination endpoint.\",\n            \"enum\": [\"POST\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"body\", \"headers\", \"http_method\"],\n        \"title\": \"ForwardedRequestDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"headers\"]\n      },\n      \"forwarded_request_header\": {\n        \"description\": \"Header data.\",\n        \"properties\": {\n          \"name\": {\n            \"description\": \"The header name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The header value.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"name\", \"value\"],\n        \"title\": \"ForwardedRequestHeader\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"forwarded_response_details\": {\n        \"description\": \"Details about the response from the destination endpoint.\",\n        \"properties\": {\n          \"body\": {\n            \"description\": \"The response body from the destination endpoint to Stripe.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"headers\": {\n            \"description\": \"HTTP headers that the destination endpoint returned.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/forwarded_request_header\"\n            },\n            \"type\": \"array\"\n          },\n          \"status\": {\n            \"description\": \"The HTTP status code that the destination endpoint returned.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"body\", \"headers\", \"status\"],\n        \"title\": \"ForwardedResponseDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"headers\"]\n      },\n      \"forwarding.request\": {\n        \"description\": \"Instructs Stripe to make a request on your behalf using the destination URL. The destination URL\\nis activated by Stripe at the time of onboarding. Stripe verifies requests with your credentials\\nprovided during onboarding, and injects card details from the payment_method into the request.\\n\\nStripe redacts all sensitive fields and headers, including authentication credentials and card numbers,\\nbefore storing the request and response data in the forwarding Request object, which are subject to a\\n30-day retention period.\\n\\nYou can provide a Stripe idempotency key to make sure that requests with the same key result in only one\\noutbound request. The Stripe idempotency key provided should be unique and different from any idempotency\\nkeys provided on the underlying third-party request.\\n\\nForwarding Requests are synchronous requests that return a response or time out according to\\nStripe’s limits.\\n\\nRelated guide: [Forward card details to third-party API endpoints](https://docs.stripe.com/payments/forwarding).\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"forwarding.request\"],\n            \"type\": \"string\"\n          },\n          \"payment_method\": {\n            \"description\": \"The PaymentMethod to insert into the forwarded request. Forwarding previously consumed PaymentMethods is allowed.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"replacements\": {\n            \"description\": \"The field kinds to be replaced in the forwarded request.\",\n            \"items\": {\n              \"enum\": [\n                \"card_cvc\",\n                \"card_expiry\",\n                \"card_number\",\n                \"cardholder_name\",\n                \"request_signature\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"request_context\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/forwarded_request_context\"\n              }\n            ],\n            \"description\": \"Context about the request from Stripe's servers to the destination endpoint.\",\n            \"nullable\": true\n          },\n          \"request_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/forwarded_request_details\"\n              }\n            ],\n            \"description\": \"The request that was sent to the destination endpoint. We redact any sensitive fields.\",\n            \"nullable\": true\n          },\n          \"response_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/forwarded_response_details\"\n              }\n            ],\n            \"description\": \"The response that the destination endpoint returned to us. We redact any sensitive fields.\",\n            \"nullable\": true\n          },\n          \"url\": {\n            \"description\": \"The destination URL for the forwarded request. Must be supported by the config.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"payment_method\",\n          \"replacements\"\n        ],\n        \"title\": \"ForwardingRequest\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"request_context\",\n          \"request_details\",\n          \"response_details\"\n        ],\n        \"x-resourceId\": \"forwarding.request\"\n      },\n      \"funding_instructions\": {\n        \"description\": \"Each customer has a [`balance`](https://stripe.com/docs/api/customers/object#customer_object-balance) that is\\nautomatically applied to future invoices and payments using the `customer_balance` payment method.\\nCustomers can fund this balance by initiating a bank transfer to any account in the\\n`financial_addresses` field.\\nRelated guide: [Customer balance funding instructions](https://stripe.com/docs/payments/customer-balance/funding-instructions)\",\n        \"properties\": {\n          \"bank_transfer\": {\n            \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"funding_type\": {\n            \"description\": \"The `funding_type` of the returned instructions\",\n            \"enum\": [\"bank_transfer\"],\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"funding_instructions\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"bank_transfer\",\n          \"currency\",\n          \"funding_type\",\n          \"livemode\",\n          \"object\"\n        ],\n        \"title\": \"CustomerBalanceFundingInstructionsCustomerBalanceFundingInstructions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"bank_transfer\"],\n        \"x-resourceId\": \"funding_instructions\"\n      },\n      \"funding_instructions_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"The country of the bank account to fund\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"financial_addresses\": {\n            \"description\": \"A list of financial addresses that can be used to fund a particular balance\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_financial_address\"\n            },\n            \"type\": \"array\"\n          },\n          \"type\": {\n            \"description\": \"The bank_transfer type\",\n            \"enum\": [\"eu_bank_transfer\", \"jp_bank_transfer\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"country\", \"financial_addresses\", \"type\"],\n        \"title\": \"FundingInstructionsBankTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"financial_addresses\"]\n      },\n      \"funding_instructions_bank_transfer_aba_record\": {\n        \"description\": \"ABA Records contain U.S. bank account details per the ABA format.\",\n        \"properties\": {\n          \"account_holder_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"account_holder_name\": {\n            \"description\": \"The account holder name\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"account_number\": {\n            \"description\": \"The ABA account number\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"The account type\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"bank_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"bank_name\": {\n            \"description\": \"The bank name\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"The ABA routing number\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"account_holder_address\",\n          \"account_holder_name\",\n          \"account_number\",\n          \"account_type\",\n          \"bank_address\",\n          \"bank_name\",\n          \"routing_number\"\n        ],\n        \"title\": \"FundingInstructionsBankTransferABARecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_holder_address\", \"bank_address\"]\n      },\n      \"funding_instructions_bank_transfer_financial_address\": {\n        \"description\": \"FinancialAddresses contain identifying information that resolves to a FinancialAccount.\",\n        \"properties\": {\n          \"aba\": {\n            \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_aba_record\"\n          },\n          \"iban\": {\n            \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_iban_record\"\n          },\n          \"sort_code\": {\n            \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_sort_code_record\"\n          },\n          \"spei\": {\n            \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_spei_record\"\n          },\n          \"supported_networks\": {\n            \"description\": \"The payment networks supported by this FinancialAddress\",\n            \"items\": {\n              \"enum\": [\n                \"ach\",\n                \"bacs\",\n                \"domestic_wire_us\",\n                \"fps\",\n                \"sepa\",\n                \"spei\",\n                \"swift\",\n                \"zengin\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"swift\": {\n            \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_swift_record\"\n          },\n          \"type\": {\n            \"description\": \"The type of financial address\",\n            \"enum\": [\"aba\", \"iban\", \"sort_code\", \"spei\", \"swift\", \"zengin\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"zengin\": {\n            \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_zengin_record\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"FundingInstructionsBankTransferFinancialAddress\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"aba\",\n          \"iban\",\n          \"sort_code\",\n          \"spei\",\n          \"swift\",\n          \"zengin\"\n        ]\n      },\n      \"funding_instructions_bank_transfer_iban_record\": {\n        \"description\": \"Iban Records contain E.U. bank account details per the SEPA format.\",\n        \"properties\": {\n          \"account_holder_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"account_holder_name\": {\n            \"description\": \"The name of the person or business that owns the bank account\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"bank_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"bic\": {\n            \"description\": \"The BIC/SWIFT code of the account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"iban\": {\n            \"description\": \"The IBAN of the account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"account_holder_address\",\n          \"account_holder_name\",\n          \"bank_address\",\n          \"bic\",\n          \"country\",\n          \"iban\"\n        ],\n        \"title\": \"FundingInstructionsBankTransferIbanRecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_holder_address\", \"bank_address\"]\n      },\n      \"funding_instructions_bank_transfer_sort_code_record\": {\n        \"description\": \"Sort Code Records contain U.K. bank account details per the sort code format.\",\n        \"properties\": {\n          \"account_holder_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"account_holder_name\": {\n            \"description\": \"The name of the person or business that owns the bank account\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"account_number\": {\n            \"description\": \"The account number\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"bank_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"sort_code\": {\n            \"description\": \"The six-digit sort code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"account_holder_address\",\n          \"account_holder_name\",\n          \"account_number\",\n          \"bank_address\",\n          \"sort_code\"\n        ],\n        \"title\": \"FundingInstructionsBankTransferSortCodeRecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_holder_address\", \"bank_address\"]\n      },\n      \"funding_instructions_bank_transfer_spei_record\": {\n        \"description\": \"SPEI Records contain Mexico bank account details per the SPEI format.\",\n        \"properties\": {\n          \"account_holder_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"account_holder_name\": {\n            \"description\": \"The account holder name\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"bank_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"bank_code\": {\n            \"description\": \"The three-digit bank code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"The short banking institution name\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"clabe\": {\n            \"description\": \"The CLABE number\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"account_holder_address\",\n          \"account_holder_name\",\n          \"bank_address\",\n          \"bank_code\",\n          \"bank_name\",\n          \"clabe\"\n        ],\n        \"title\": \"FundingInstructionsBankTransferSpeiRecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_holder_address\", \"bank_address\"]\n      },\n      \"funding_instructions_bank_transfer_swift_record\": {\n        \"description\": \"SWIFT Records contain U.S. bank account details per the SWIFT format.\",\n        \"properties\": {\n          \"account_holder_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"account_holder_name\": {\n            \"description\": \"The account holder name\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"account_number\": {\n            \"description\": \"The account number\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"The account type\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"bank_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"bank_name\": {\n            \"description\": \"The bank name\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"swift_code\": {\n            \"description\": \"The SWIFT code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"account_holder_address\",\n          \"account_holder_name\",\n          \"account_number\",\n          \"account_type\",\n          \"bank_address\",\n          \"bank_name\",\n          \"swift_code\"\n        ],\n        \"title\": \"FundingInstructionsBankTransferSwiftRecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_holder_address\", \"bank_address\"]\n      },\n      \"funding_instructions_bank_transfer_zengin_record\": {\n        \"description\": \"Zengin Records contain Japan bank account details per the Zengin format.\",\n        \"properties\": {\n          \"account_holder_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"account_holder_name\": {\n            \"description\": \"The account holder name\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_number\": {\n            \"description\": \"The account number\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"The bank account type. In Japan, this can only be `futsu` or `toza`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"bank_code\": {\n            \"description\": \"The bank code of the account\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"The bank name of the account\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"branch_code\": {\n            \"description\": \"The branch code of the account\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"branch_name\": {\n            \"description\": \"The branch name of the account\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"account_holder_address\", \"bank_address\"],\n        \"title\": \"FundingInstructionsBankTransferZenginRecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_holder_address\", \"bank_address\"]\n      },\n      \"gelato_data_document_report_date_of_birth\": {\n        \"description\": \"Point in Time\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"Numerical day between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"Numerical month between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"GelatoDataDocumentReportDateOfBirth\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_data_document_report_expiration_date\": {\n        \"description\": \"Point in Time\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"Numerical day between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"Numerical month between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"GelatoDataDocumentReportExpirationDate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_data_document_report_issued_date\": {\n        \"description\": \"Point in Time\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"Numerical day between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"Numerical month between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"GelatoDataDocumentReportIssuedDate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_data_id_number_report_date\": {\n        \"description\": \"Point in Time\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"Numerical day between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"Numerical month between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"GelatoDataIdNumberReportDate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_data_verified_outputs_date\": {\n        \"description\": \"Point in Time\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"Numerical day between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"Numerical month between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"GelatoDataVerifiedOutputsDate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_document_report\": {\n        \"description\": \"Result from a document check\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Address as it appears in the document.\",\n            \"nullable\": true\n          },\n          \"dob\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_data_document_report_date_of_birth\"\n              }\n            ],\n            \"description\": \"Date of birth as it appears in the document.\",\n            \"nullable\": true\n          },\n          \"error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_document_report_error\"\n              }\n            ],\n            \"description\": \"Details on the verification error. Present when status is `unverified`.\",\n            \"nullable\": true\n          },\n          \"expiration_date\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_data_document_report_expiration_date\"\n              }\n            ],\n            \"description\": \"Expiration date of the document.\",\n            \"nullable\": true\n          },\n          \"files\": {\n            \"description\": \"Array of [File](https://stripe.com/docs/api/files) ids containing images for this document.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"first_name\": {\n            \"description\": \"First name as it appears in the document.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issued_date\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_data_document_report_issued_date\"\n              }\n            ],\n            \"description\": \"Issued date of the document.\",\n            \"nullable\": true\n          },\n          \"issuing_country\": {\n            \"description\": \"Issuing country of the document.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last_name\": {\n            \"description\": \"Last name as it appears in the document.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"number\": {\n            \"description\": \"Document ID number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of this `document` check.\",\n            \"enum\": [\"unverified\", \"verified\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"type\": {\n            \"description\": \"Type of the document.\",\n            \"enum\": [\"driving_license\", \"id_card\", \"passport\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"GelatoDocumentReport\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"address\",\n          \"dob\",\n          \"error\",\n          \"expiration_date\",\n          \"issued_date\"\n        ]\n      },\n      \"gelato_document_report_error\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"A short machine-readable string giving the reason for the verification failure.\",\n            \"enum\": [\n              \"document_expired\",\n              \"document_type_not_supported\",\n              \"document_unverified_other\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"reason\": {\n            \"description\": \"A human-readable message giving the reason for the failure. These messages can be shown to your users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoDocumentReportError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_email_report\": {\n        \"description\": \"Result from a email check\",\n        \"properties\": {\n          \"email\": {\n            \"description\": \"Email to be verified.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_email_report_error\"\n              }\n            ],\n            \"description\": \"Details on the verification error. Present when status is `unverified`.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"Status of this `email` check.\",\n            \"enum\": [\"unverified\", \"verified\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"GelatoEmailReport\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"error\"]\n      },\n      \"gelato_email_report_error\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"A short machine-readable string giving the reason for the verification failure.\",\n            \"enum\": [\"email_unverified_other\", \"email_verification_declined\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"A human-readable message giving the reason for the failure. These messages can be shown to your users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoEmailReportError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_id_number_report\": {\n        \"description\": \"Result from an id_number check\",\n        \"properties\": {\n          \"dob\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_data_id_number_report_date\"\n              }\n            ],\n            \"description\": \"Date of birth.\",\n            \"nullable\": true\n          },\n          \"error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_id_number_report_error\"\n              }\n            ],\n            \"description\": \"Details on the verification error. Present when status is `unverified`.\",\n            \"nullable\": true\n          },\n          \"first_name\": {\n            \"description\": \"First name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id_number\": {\n            \"description\": \"ID number. When `id_number_type` is `us_ssn`, only the last 4 digits are present.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id_number_type\": {\n            \"description\": \"Type of ID number.\",\n            \"enum\": [\"br_cpf\", \"sg_nric\", \"us_ssn\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last_name\": {\n            \"description\": \"Last name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of this `id_number` check.\",\n            \"enum\": [\"unverified\", \"verified\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"GelatoIdNumberReport\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"dob\", \"error\"]\n      },\n      \"gelato_id_number_report_error\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"A short machine-readable string giving the reason for the verification failure.\",\n            \"enum\": [\n              \"id_number_insufficient_document_data\",\n              \"id_number_mismatch\",\n              \"id_number_unverified_other\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"A human-readable message giving the reason for the failure. These messages can be shown to your users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoIdNumberReportError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_phone_report\": {\n        \"description\": \"Result from a phone check\",\n        \"properties\": {\n          \"error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_phone_report_error\"\n              }\n            ],\n            \"description\": \"Details on the verification error. Present when status is `unverified`.\",\n            \"nullable\": true\n          },\n          \"phone\": {\n            \"description\": \"Phone to be verified.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of this `phone` check.\",\n            \"enum\": [\"unverified\", \"verified\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"GelatoPhoneReport\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"error\"]\n      },\n      \"gelato_phone_report_error\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"A short machine-readable string giving the reason for the verification failure.\",\n            \"enum\": [\"phone_unverified_other\", \"phone_verification_declined\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"A human-readable message giving the reason for the failure. These messages can be shown to your users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoPhoneReportError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_provided_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"email\": {\n            \"description\": \"Email of user being verified\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"Phone number of user being verified\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoProvidedDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_report_document_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allowed_types\": {\n            \"description\": \"Array of strings of allowed identity document types. If the provided identity document isn’t one of the allowed types, the verification check will fail with a document_type_not_allowed error code.\",\n            \"items\": {\n              \"enum\": [\"driving_license\", \"id_card\", \"passport\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"require_id_number\": {\n            \"description\": \"Collect an ID number and perform an [ID number check](https://stripe.com/docs/identity/verification-checks?type=id-number) with the document’s extracted name and date of birth.\",\n            \"type\": \"boolean\"\n          },\n          \"require_live_capture\": {\n            \"description\": \"Disable image uploads, identity document images have to be captured using the device’s camera.\",\n            \"type\": \"boolean\"\n          },\n          \"require_matching_selfie\": {\n            \"description\": \"Capture a face image and perform a [selfie check](https://stripe.com/docs/identity/verification-checks?type=selfie) comparing a photo ID and a picture of your user’s face. [Learn more](https://stripe.com/docs/identity/selfie).\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"GelatoReportDocumentOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_report_id_number_options\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"GelatoReportIdNumberOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_selfie_report\": {\n        \"description\": \"Result from a selfie check\",\n        \"properties\": {\n          \"document\": {\n            \"description\": \"ID of the [File](https://stripe.com/docs/api/files) holding the image of the identity document used in this check.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_selfie_report_error\"\n              }\n            ],\n            \"description\": \"Details on the verification error. Present when status is `unverified`.\",\n            \"nullable\": true\n          },\n          \"selfie\": {\n            \"description\": \"ID of the [File](https://stripe.com/docs/api/files) holding the image of the selfie used in this check.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of this `selfie` check.\",\n            \"enum\": [\"unverified\", \"verified\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"GelatoSelfieReport\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"error\"]\n      },\n      \"gelato_selfie_report_error\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"A short machine-readable string giving the reason for the verification failure.\",\n            \"enum\": [\n              \"selfie_document_missing_photo\",\n              \"selfie_face_mismatch\",\n              \"selfie_manipulated\",\n              \"selfie_unverified_other\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"A human-readable message giving the reason for the failure. These messages can be shown to your users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoSelfieReportError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_session_document_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allowed_types\": {\n            \"description\": \"Array of strings of allowed identity document types. If the provided identity document isn’t one of the allowed types, the verification check will fail with a document_type_not_allowed error code.\",\n            \"items\": {\n              \"enum\": [\"driving_license\", \"id_card\", \"passport\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"require_id_number\": {\n            \"description\": \"Collect an ID number and perform an [ID number check](https://stripe.com/docs/identity/verification-checks?type=id-number) with the document’s extracted name and date of birth.\",\n            \"type\": \"boolean\"\n          },\n          \"require_live_capture\": {\n            \"description\": \"Disable image uploads, identity document images have to be captured using the device’s camera.\",\n            \"type\": \"boolean\"\n          },\n          \"require_matching_selfie\": {\n            \"description\": \"Capture a face image and perform a [selfie check](https://stripe.com/docs/identity/verification-checks?type=selfie) comparing a photo ID and a picture of your user’s face. [Learn more](https://stripe.com/docs/identity/selfie).\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"GelatoSessionDocumentOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_session_email_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"require_verification\": {\n            \"description\": \"Request one time password verification of `provided_details.email`.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"GelatoSessionEmailOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_session_id_number_options\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"GelatoSessionIdNumberOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_session_last_error\": {\n        \"description\": \"Shows last VerificationSession error\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"A short machine-readable string giving the reason for the verification or user-session failure.\",\n            \"enum\": [\n              \"abandoned\",\n              \"consent_declined\",\n              \"country_not_supported\",\n              \"device_not_supported\",\n              \"document_expired\",\n              \"document_type_not_supported\",\n              \"document_unverified_other\",\n              \"email_unverified_other\",\n              \"email_verification_declined\",\n              \"id_number_insufficient_document_data\",\n              \"id_number_mismatch\",\n              \"id_number_unverified_other\",\n              \"phone_unverified_other\",\n              \"phone_verification_declined\",\n              \"selfie_document_missing_photo\",\n              \"selfie_face_mismatch\",\n              \"selfie_manipulated\",\n              \"selfie_unverified_other\",\n              \"under_supported_age\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"reason\": {\n            \"description\": \"A message that explains the reason for verification or user-session failure.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoSessionLastError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_session_phone_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"require_verification\": {\n            \"description\": \"Request one time password verification of `provided_details.phone`.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"GelatoSessionPhoneOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"gelato_verification_report_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"document\": {\n            \"$ref\": \"#/components/schemas/gelato_report_document_options\"\n          },\n          \"id_number\": {\n            \"$ref\": \"#/components/schemas/gelato_report_id_number_options\"\n          }\n        },\n        \"title\": \"GelatoVerificationReportOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"document\", \"id_number\"]\n      },\n      \"gelato_verification_session_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"document\": {\n            \"$ref\": \"#/components/schemas/gelato_session_document_options\"\n          },\n          \"email\": {\n            \"$ref\": \"#/components/schemas/gelato_session_email_options\"\n          },\n          \"id_number\": {\n            \"$ref\": \"#/components/schemas/gelato_session_id_number_options\"\n          },\n          \"phone\": {\n            \"$ref\": \"#/components/schemas/gelato_session_phone_options\"\n          }\n        },\n        \"title\": \"GelatoVerificationSessionOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"document\", \"email\", \"id_number\", \"phone\"]\n      },\n      \"gelato_verified_outputs\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"The user's verified address.\",\n            \"nullable\": true\n          },\n          \"dob\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_data_verified_outputs_date\"\n              }\n            ],\n            \"description\": \"The user’s verified date of birth.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"The user's verified email address\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"first_name\": {\n            \"description\": \"The user's verified first name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id_number\": {\n            \"description\": \"The user's verified id number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id_number_type\": {\n            \"description\": \"The user's verified id number type.\",\n            \"enum\": [\"br_cpf\", \"sg_nric\", \"us_ssn\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last_name\": {\n            \"description\": \"The user's verified last name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"The user's verified phone number\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"GelatoVerifiedOutputs\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\", \"dob\"]\n      },\n      \"identity.verification_report\": {\n        \"description\": \"A VerificationReport is the result of an attempt to collect and verify data from a user.\\nThe collection of verification checks performed is determined from the `type` and `options`\\nparameters used. You can find the result of each verification check performed in the\\nappropriate sub-resource: `document`, `id_number`, `selfie`.\\n\\nEach VerificationReport contains a copy of any data collected by the user as well as\\nreference IDs which can be used to access collected images through the [FileUpload](https://stripe.com/docs/api/files)\\nAPI. To configure and create VerificationReports, use the\\n[VerificationSession](https://stripe.com/docs/api/identity/verification_sessions) API.\\n\\nRelated guide: [Accessing verification results](https://stripe.com/docs/identity/verification-sessions#results).\",\n        \"properties\": {\n          \"client_reference_id\": {\n            \"description\": \"A string to reference this user. This can be a customer ID, a session ID, or similar, and can be used to reconcile this verification with your internal systems.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"document\": {\n            \"$ref\": \"#/components/schemas/gelato_document_report\"\n          },\n          \"email\": {\n            \"$ref\": \"#/components/schemas/gelato_email_report\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id_number\": {\n            \"$ref\": \"#/components/schemas/gelato_id_number_report\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"identity.verification_report\"],\n            \"type\": \"string\"\n          },\n          \"options\": {\n            \"$ref\": \"#/components/schemas/gelato_verification_report_options\"\n          },\n          \"phone\": {\n            \"$ref\": \"#/components/schemas/gelato_phone_report\"\n          },\n          \"selfie\": {\n            \"$ref\": \"#/components/schemas/gelato_selfie_report\"\n          },\n          \"type\": {\n            \"description\": \"Type of report.\",\n            \"enum\": [\"document\", \"id_number\", \"verification_flow\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"verification_flow\": {\n            \"description\": \"The configuration token of a verification flow from the dashboard.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"verification_session\": {\n            \"description\": \"ID of the VerificationSession that created this report.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"created\", \"id\", \"livemode\", \"object\", \"type\"],\n        \"title\": \"GelatoVerificationReport\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"document\",\n          \"email\",\n          \"id_number\",\n          \"options\",\n          \"phone\",\n          \"selfie\"\n        ],\n        \"x-resourceId\": \"identity.verification_report\"\n      },\n      \"identity.verification_session\": {\n        \"description\": \"A VerificationSession guides you through the process of collecting and verifying the identities\\nof your users. It contains details about the type of verification, such as what [verification\\ncheck](/docs/identity/verification-checks) to perform. Only create one VerificationSession for\\neach verification in your system.\\n\\nA VerificationSession transitions through [multiple\\nstatuses](/docs/identity/how-sessions-work) throughout its lifetime as it progresses through\\nthe verification flow. The VerificationSession contains the user's verified data after\\nverification checks are complete.\\n\\nRelated guide: [The Verification Sessions API](https://stripe.com/docs/identity/verification-sessions)\",\n        \"properties\": {\n          \"client_reference_id\": {\n            \"description\": \"A string to reference this user. This can be a customer ID, a session ID, or similar, and can be used to reconcile this verification with your internal systems.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"client_secret\": {\n            \"description\": \"The short-lived client secret used by Stripe.js to [show a verification modal](https://stripe.com/docs/js/identity/modal) inside your app. This client secret expires after 24 hours and can only be used once. Don’t store it, log it, embed it in a URL, or expose it to anyone other than the user. Make sure that you have TLS enabled on any page that includes the client secret. Refer to our docs on [passing the client secret to the frontend](https://stripe.com/docs/identity/verification-sessions#client-secret) to learn more.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last_error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_session_last_error\"\n              }\n            ],\n            \"description\": \"If present, this property tells you the last error encountered when processing the verification.\",\n            \"nullable\": true\n          },\n          \"last_verification_report\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/identity.verification_report\"\n              }\n            ],\n            \"description\": \"ID of the most recent VerificationReport. [Learn more about accessing detailed verification results.](https://stripe.com/docs/identity/verification-sessions#results)\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/identity.verification_report\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"identity.verification_session\"],\n            \"type\": \"string\"\n          },\n          \"options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_verification_session_options\"\n              }\n            ],\n            \"description\": \"A set of options for the session’s verification checks.\",\n            \"nullable\": true\n          },\n          \"provided_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_provided_details\"\n              }\n            ],\n            \"description\": \"Details provided about the user being verified. These details may be shown to the user.\",\n            \"nullable\": true\n          },\n          \"redaction\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/verification_session_redaction\"\n              }\n            ],\n            \"description\": \"Redaction status of this VerificationSession. If the VerificationSession is not redacted, this field will be null.\",\n            \"nullable\": true\n          },\n          \"related_customer\": {\n            \"description\": \"Token referencing a Customer resource.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of this VerificationSession. [Learn more about the lifecycle of sessions](https://stripe.com/docs/identity/how-sessions-work).\",\n            \"enum\": [\"canceled\", \"processing\", \"requires_input\", \"verified\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of [verification check](https://stripe.com/docs/identity/verification-checks) to be performed.\",\n            \"enum\": [\"document\", \"id_number\", \"verification_flow\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"url\": {\n            \"description\": \"The short-lived URL that you use to redirect a user to Stripe to submit their identity information. This URL expires after 48 hours and can only be used once. Don’t store it, log it, send it in emails or expose it to anyone other than the user. Refer to our docs on [verifying identity documents](https://stripe.com/docs/identity/verify-identity-documents?platform=web&type=redirect) to learn how to redirect users to Stripe.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verification_flow\": {\n            \"description\": \"The configuration token of a verification flow from the dashboard.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"verified_outputs\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/gelato_verified_outputs\"\n              }\n            ],\n            \"description\": \"The user’s verified data.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"GelatoVerificationSession\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"last_error\",\n          \"last_verification_report\",\n          \"options\",\n          \"provided_details\",\n          \"redaction\",\n          \"verified_outputs\"\n        ],\n        \"x-resourceId\": \"identity.verification_session\"\n      },\n      \"inbound_transfers\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_details\": {\n            \"$ref\": \"#/components/schemas/treasury_shared_resource_billing_details\"\n          },\n          \"type\": {\n            \"description\": \"The type of the payment method used in the InboundTransfer.\",\n            \"enum\": [\"us_bank_account\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/inbound_transfers_payment_method_details_us_bank_account\"\n          }\n        },\n        \"required\": [\"billing_details\", \"type\"],\n        \"title\": \"InboundTransfers\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"billing_details\", \"us_bank_account\"]\n      },\n      \"inbound_transfers_payment_method_details_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_holder_type\": {\n            \"description\": \"Account holder type: individual or company.\",\n            \"enum\": [\"company\", \"individual\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"Account type: checkings or savings. Defaults to checking if omitted.\",\n            \"enum\": [\"checking\", \"savings\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"ID of the mandate used to make this payment.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"network\": {\n            \"description\": \"The network rails used. See the [docs](https://stripe.com/docs/treasury/money-movement/timelines) to learn more about money movement timelines for each network type.\",\n            \"enum\": [\"ach\"],\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"network\"],\n        \"title\": \"inbound_transfers_payment_method_details_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate\"]\n      },\n      \"internal_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Brand of the card used in the transaction\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two digit number representing the card's expiration month\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Two digit number representing the card's expiration year\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"last4\": {\n            \"description\": \"The last 4 digits of the card\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"internal_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice\": {\n        \"description\": \"Invoices are statements of amounts owed by a customer, and are either\\ngenerated one-off, or generated periodically from a subscription.\\n\\nThey contain [invoice items](https://stripe.com/docs/api#invoiceitems), and proration adjustments\\nthat may be caused by subscription upgrades/downgrades (if necessary).\\n\\nIf your invoice is configured to be billed through automatic charges,\\nStripe automatically finalizes your invoice and attempts payment. Note\\nthat finalizing the invoice,\\n[when automatic](https://stripe.com/docs/invoicing/integration/automatic-advancement-collection), does\\nnot happen immediately as the invoice is created. Stripe waits\\nuntil one hour after the last webhook was successfully sent (or the last\\nwebhook timed out after failing). If you (and the platforms you may have\\nconnected to) have no webhooks configured, Stripe waits one hour after\\ncreation to finalize the invoice.\\n\\nIf your invoice is configured to be billed by sending an email, then based on your\\n[email settings](https://dashboard.stripe.com/account/billing/automatic),\\nStripe will email the invoice to your customer and await payment. These\\nemails can contain a link to a hosted page to pay the invoice.\\n\\nStripe applies any customer credit on the account before determining the\\namount due for the invoice (i.e., the amount that will be actually\\ncharged). If the amount due for the invoice is less than Stripe's [minimum allowed charge\\nper currency](/docs/currencies#minimum-and-maximum-charge-amounts), the\\ninvoice is automatically marked paid, and we add the amount due to the\\ncustomer's credit balance which is applied to the next invoice.\\n\\nMore details on the customer's credit balance are\\n[here](https://stripe.com/docs/billing/customer/balance).\\n\\nRelated guide: [Send invoices to customers](https://stripe.com/docs/billing/invoices/sending)\",\n        \"properties\": {\n          \"account_country\": {\n            \"description\": \"The country of the business associated with this invoice, most often the business creating the invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_name\": {\n            \"description\": \"The public name of the business associated with this invoice, most often the business creating the invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_tax_ids\": {\n            \"description\": \"The account tax IDs associated with the invoice. Only editable when the invoice is a draft.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_id\"\n                  },\n                  {\n                    \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"amount_due\": {\n            \"description\": \"Final amount due at this time for this invoice. If the invoice's total is smaller than the minimum charge amount, for example, or if there is account credit that can be applied to the invoice, the `amount_due` may be 0. If there is a positive `starting_balance` for the invoice (the customer owes money), the `amount_due` will also take that into account. The charge that gets generated for the invoice will be for the amount specified in `amount_due`.\",\n            \"type\": \"integer\"\n          },\n          \"amount_paid\": {\n            \"description\": \"The amount, in cents (or local equivalent), that was paid.\",\n            \"type\": \"integer\"\n          },\n          \"amount_remaining\": {\n            \"description\": \"The difference between amount_due and amount_paid, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"amount_shipping\": {\n            \"description\": \"This is the sum of all the shipping amounts.\",\n            \"type\": \"integer\"\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_application\"\n              }\n            ],\n            \"description\": \"ID of the Connect Application that created the invoice.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_application\"\n                }\n              ]\n            }\n          },\n          \"application_fee_amount\": {\n            \"description\": \"The fee in cents (or local equivalent) that will be applied to the invoice and transferred to the application owner's Stripe account when the invoice is paid.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"attempt_count\": {\n            \"description\": \"Number of payment attempts made for this invoice, from the perspective of the payment retry schedule. Any payment attempt counts as the first attempt, and subsequently only automatic retries increment the attempt count. In other words, manual payment attempts after the first attempt do not affect the retry schedule. If a failure is returned with a non-retryable return code, the invoice can no longer be retried unless a new payment method is obtained. Retries will continue to be scheduled, and attempt_count will continue to increment, but retries will only be executed if a new payment method is obtained.\",\n            \"type\": \"integer\"\n          },\n          \"attempted\": {\n            \"description\": \"Whether an attempt has been made to pay the invoice. An invoice is not attempted until 1 hour after the `invoice.created` webhook, for example, so you might not want to display that invoice as unpaid to your users.\",\n            \"type\": \"boolean\"\n          },\n          \"auto_advance\": {\n            \"description\": \"Controls whether Stripe performs [automatic collection](https://stripe.com/docs/invoicing/integration/automatic-advancement-collection) of the invoice. If `false`, the invoice's state doesn't automatically advance without an explicit action.\",\n            \"type\": \"boolean\"\n          },\n          \"automatic_tax\": {\n            \"$ref\": \"#/components/schemas/automatic_tax\"\n          },\n          \"automatically_finalizes_at\": {\n            \"description\": \"The time when this invoice is currently scheduled to be automatically finalized. The field will be `null` if the invoice is not scheduled to finalize in the future. If the invoice is not in the draft state, this field will always be `null` - see `finalized_at` for the time when an already-finalized invoice was finalized.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"billing_reason\": {\n            \"description\": \"Indicates the reason why the invoice was created.\\n\\n* `manual`: Unrelated to a subscription, for example, created via the invoice editor.\\n* `subscription`: No longer in use. Applies to subscriptions from before May 2018 where no distinction was made between updates, cycles, and thresholds.\\n* `subscription_create`: A new subscription was created.\\n* `subscription_cycle`: A subscription advanced into a new period.\\n* `subscription_threshold`: A subscription reached a billing threshold.\\n* `subscription_update`: A subscription was updated.\\n* `upcoming`: Reserved for simulated invoices, per the upcoming invoice endpoint.\",\n            \"enum\": [\n              \"automatic_pending_invoice_item_invoice\",\n              \"manual\",\n              \"quote_accept\",\n              \"subscription\",\n              \"subscription_create\",\n              \"subscription_cycle\",\n              \"subscription_threshold\",\n              \"subscription_update\",\n              \"upcoming\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the latest charge generated for this invoice, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"collection_method\": {\n            \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this invoice using the default source attached to the customer. When sending an invoice, Stripe will email this invoice to the customer with payment instructions.\",\n            \"enum\": [\"charge_automatically\", \"send_invoice\"],\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"custom_fields\": {\n            \"description\": \"Custom fields displayed on the invoice.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoice_setting_custom_field\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The ID of the customer who will be billed.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"customer_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"The customer's address. Until the invoice is finalized, this field will equal `customer.address`. Once the invoice is finalized, this field will no longer be updated.\",\n            \"nullable\": true\n          },\n          \"customer_email\": {\n            \"description\": \"The customer's email. Until the invoice is finalized, this field will equal `customer.email`. Once the invoice is finalized, this field will no longer be updated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_name\": {\n            \"description\": \"The customer's name. Until the invoice is finalized, this field will equal `customer.name`. Once the invoice is finalized, this field will no longer be updated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_phone\": {\n            \"description\": \"The customer's phone number. Until the invoice is finalized, this field will equal `customer.phone`. Once the invoice is finalized, this field will no longer be updated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_shipping\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping\"\n              }\n            ],\n            \"description\": \"The customer's shipping information. Until the invoice is finalized, this field will equal `customer.shipping`. Once the invoice is finalized, this field will no longer be updated.\",\n            \"nullable\": true\n          },\n          \"customer_tax_exempt\": {\n            \"description\": \"The customer's tax exempt status. Until the invoice is finalized, this field will equal `customer.tax_exempt`. Once the invoice is finalized, this field will no longer be updated.\",\n            \"enum\": [\"exempt\", \"none\", \"reverse\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_tax_ids\": {\n            \"description\": \"The customer's tax IDs. Until the invoice is finalized, this field will contain the same tax IDs as `customer.tax_ids`. Once the invoice is finalized, this field will no longer be updated.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoices_resource_invoice_tax_id\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"default_payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the default payment method for the invoice. It must belong to the customer associated with the invoice. If not set, defaults to the subscription's default payment method, if any, or to the default payment method in the customer's invoice settings.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"default_source\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/source\"\n              }\n            ],\n            \"description\": \"ID of the default payment source for the invoice. It must belong to the customer associated with the invoice and be in a chargeable state. If not set, defaults to the subscription's default source, if any, or to the customer's default source.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/bank_account\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/card\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/source\"\n                }\n              ]\n            },\n            \"x-stripeBypassValidation\": true\n          },\n          \"default_tax_rates\": {\n            \"description\": \"The tax rates applied to this invoice, if any.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"type\": \"array\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users. Referenced as 'memo' in the Dashboard.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discount\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/discount\"\n              }\n            ],\n            \"description\": \"Describes the current discount applied to this invoice, if there is one. Not populated if there are multiple discounts.\",\n            \"nullable\": true\n          },\n          \"discounts\": {\n            \"description\": \"The discounts applied to the invoice. Line item discounts are applied before invoice discounts. Use `expand[]=discounts` to expand each discount.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_discount\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/discount\"\n                  },\n                  {\n                    \"$ref\": \"#/components/schemas/deleted_discount\"\n                  }\n                ]\n              }\n            },\n            \"type\": \"array\"\n          },\n          \"due_date\": {\n            \"description\": \"The date on which payment for this invoice is due. This value will be `null` for invoices where `collection_method=charge_automatically`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"effective_at\": {\n            \"description\": \"The date when this invoice is in effect. Same as `finalized_at` unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the invoice PDF and receipt.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ending_balance\": {\n            \"description\": \"Ending customer balance after the invoice is finalized. Invoices are finalized approximately an hour after successful webhook delivery or when payment collection is attempted for the invoice. If the invoice has not been finalized yet, this will be null.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"footer\": {\n            \"description\": \"Footer displayed on the invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"from_invoice\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoices_resource_from_invoice\"\n              }\n            ],\n            \"description\": \"Details of the invoice that was cloned. See the [revision documentation](https://stripe.com/docs/invoicing/invoice-revisions) for more details.\",\n            \"nullable\": true\n          },\n          \"hosted_invoice_url\": {\n            \"description\": \"The URL for the hosted invoice page, which allows customers to view and pay an invoice. If the invoice has not been finalized yet, this will be null.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object. This property is always present unless the invoice is an upcoming invoice. See [Retrieve an upcoming invoice](https://stripe.com/docs/api/invoices/upcoming) for more details.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice_pdf\": {\n            \"description\": \"The link to download the PDF for the invoice. If the invoice has not been finalized yet, this will be null.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuer\": {\n            \"$ref\": \"#/components/schemas/connect_account_reference\"\n          },\n          \"last_finalization_error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/api_errors\"\n              }\n            ],\n            \"description\": \"The error encountered during the previous attempt to finalize the invoice. This field is cleared when the invoice is successfully finalized.\",\n            \"nullable\": true\n          },\n          \"latest_revision\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"The ID of the most recent non-draft revision of this invoice\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"lines\": {\n            \"description\": \"The individual line items that make up the invoice. `lines` is sorted as follows: (1) pending invoice items (including prorations) in reverse chronological order, (2) subscription items in reverse chronological order, and (3) invoice items added after invoice creation in chronological order.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/line_item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"InvoiceLinesList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"next_payment_attempt\": {\n            \"description\": \"The time at which payment will next be attempted. This value will be `null` for invoices where `collection_method=send_invoice`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"number\": {\n            \"description\": \"A unique, identifying string that appears on emails sent to the customer for this invoice. This starts with the customer's unique invoice_prefix if it is specified.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"invoice\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the [Invoices with Connect](https://stripe.com/docs/billing/invoices/connect) documentation for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"paid\": {\n            \"description\": \"Whether payment was successfully collected for this invoice. An invoice can be paid (most commonly) with a charge or with credit from the customer's account balance.\",\n            \"type\": \"boolean\"\n          },\n          \"paid_out_of_band\": {\n            \"description\": \"Returns true if the invoice was manually marked paid, returns false if the invoice hasn't been paid yet or was paid on Stripe.\",\n            \"type\": \"boolean\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"The PaymentIntent associated with this invoice. The PaymentIntent is generated when the invoice is finalized, and can then be used to pay the invoice. Note that voiding an invoice will cancel the PaymentIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"payment_settings\": {\n            \"$ref\": \"#/components/schemas/invoices_payment_settings\"\n          },\n          \"period_end\": {\n            \"description\": \"End of the usage period during which invoice items were added to this invoice. This looks back one period for a subscription invoice. Use the [line item period](/api/invoices/line_item#invoice_line_item_object-period) to get the service period for each price.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"period_start\": {\n            \"description\": \"Start of the usage period during which invoice items were added to this invoice. This looks back one period for a subscription invoice. Use the [line item period](/api/invoices/line_item#invoice_line_item_object-period) to get the service period for each price.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"post_payment_credit_notes_amount\": {\n            \"description\": \"Total amount of all post-payment credit notes issued for this invoice.\",\n            \"type\": \"integer\"\n          },\n          \"pre_payment_credit_notes_amount\": {\n            \"description\": \"Total amount of all pre-payment credit notes issued for this invoice.\",\n            \"type\": \"integer\"\n          },\n          \"quote\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/quote\"\n              }\n            ],\n            \"description\": \"The quote this invoice was generated from.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              ]\n            }\n          },\n          \"receipt_number\": {\n            \"description\": \"This is the transaction number that appears on email receipts sent for this invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"rendering\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoices_resource_invoice_rendering\"\n              }\n            ],\n            \"description\": \"The rendering-related settings that control how the invoice is displayed on customer-facing surfaces such as PDF and Hosted Invoice Page.\",\n            \"nullable\": true\n          },\n          \"shipping_cost\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoices_resource_shipping_cost\"\n              }\n            ],\n            \"description\": \"The details of the cost of shipping, including the ShippingRate applied on the invoice.\",\n            \"nullable\": true\n          },\n          \"shipping_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping\"\n              }\n            ],\n            \"description\": \"Shipping details for the invoice. The Invoice PDF will use the `shipping_details` value if it is set, otherwise the PDF will render the shipping address from the customer.\",\n            \"nullable\": true\n          },\n          \"starting_balance\": {\n            \"description\": \"Starting customer balance before the invoice is finalized. If the invoice has not been finalized yet, this will be the current customer balance. For revision invoices, this also includes any customer balance that was applied to the original invoice.\",\n            \"type\": \"integer\"\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Extra information about an invoice for the customer's credit card statement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the invoice, one of `draft`, `open`, `paid`, `uncollectible`, or `void`. [Learn more](https://stripe.com/docs/billing/invoices/workflow#workflow-overview)\",\n            \"enum\": [\"draft\", \"open\", \"paid\", \"uncollectible\", \"void\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/invoices_resource_status_transitions\"\n          },\n          \"subscription\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription\"\n              }\n            ],\n            \"description\": \"The subscription that this invoice was prepared for, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              ]\n            }\n          },\n          \"subscription_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_details_data\"\n              }\n            ],\n            \"description\": \"Details about the subscription that created this invoice.\",\n            \"nullable\": true\n          },\n          \"subscription_proration_date\": {\n            \"description\": \"Only set for upcoming invoices that preview prorations. The time used to calculate prorations.\",\n            \"type\": \"integer\"\n          },\n          \"subtotal\": {\n            \"description\": \"Total of all subscriptions, invoice items, and prorations on the invoice before any invoice level discount or exclusive tax is applied. Item discounts are already incorporated\",\n            \"type\": \"integer\"\n          },\n          \"subtotal_excluding_tax\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the subtotal of the invoice before any invoice level discount or tax is applied. Item discounts are already incorporated\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"tax\": {\n            \"description\": \"The amount of tax on this invoice. This is the sum of all the tax amounts on this invoice.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock this invoice belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          },\n          \"threshold_reason\": {\n            \"$ref\": \"#/components/schemas/invoice_threshold_reason\"\n          },\n          \"total\": {\n            \"description\": \"Total after discounts and taxes.\",\n            \"type\": \"integer\"\n          },\n          \"total_discount_amounts\": {\n            \"description\": \"The aggregate amounts calculated per discount across all line items.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/discounts_resource_discount_amount\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"total_excluding_tax\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of the invoice including all discounts but excluding all tax.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"total_pretax_credit_amounts\": {\n            \"description\": \"Contains pretax credit amounts (ex: discount, credit grants, etc) that apply to this invoice. This is a combined list of total_pretax_credit_amounts across all invoice line items.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoices_resource_pretax_credit_amount\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"total_tax_amounts\": {\n            \"description\": \"The aggregate amounts calculated per tax rate for all line items.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoice_tax_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_transfer_data\"\n              }\n            ],\n            \"description\": \"The account (if any) the payment will be attributed to for tax reporting, and where funds from the payment will be transferred to for the invoice.\",\n            \"nullable\": true\n          },\n          \"webhooks_delivered_at\": {\n            \"description\": \"Invoices are automatically paid or sent 1 hour after webhooks are delivered, or until all webhook delivery attempts have [been exhausted](https://stripe.com/docs/billing/webhooks#understand). This field tracks the time when webhooks for this invoice were successfully delivered. If the invoice had no webhooks to deliver, this will be set while the invoice is being created.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount_due\",\n          \"amount_paid\",\n          \"amount_remaining\",\n          \"amount_shipping\",\n          \"attempt_count\",\n          \"attempted\",\n          \"automatic_tax\",\n          \"collection_method\",\n          \"created\",\n          \"currency\",\n          \"default_tax_rates\",\n          \"discounts\",\n          \"issuer\",\n          \"lines\",\n          \"livemode\",\n          \"object\",\n          \"paid\",\n          \"paid_out_of_band\",\n          \"payment_settings\",\n          \"period_end\",\n          \"period_start\",\n          \"post_payment_credit_notes_amount\",\n          \"pre_payment_credit_notes_amount\",\n          \"starting_balance\",\n          \"status_transitions\",\n          \"subtotal\",\n          \"total\",\n          \"total_tax_amounts\"\n        ],\n        \"title\": \"Invoice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account_tax_ids\",\n          \"application\",\n          \"automatic_tax\",\n          \"charge\",\n          \"custom_fields\",\n          \"customer\",\n          \"customer_address\",\n          \"customer_shipping\",\n          \"customer_tax_ids\",\n          \"default_payment_method\",\n          \"default_source\",\n          \"default_tax_rates\",\n          \"discount\",\n          \"discounts\",\n          \"from_invoice\",\n          \"issuer\",\n          \"last_finalization_error\",\n          \"latest_revision\",\n          \"lines\",\n          \"on_behalf_of\",\n          \"payment_intent\",\n          \"payment_settings\",\n          \"quote\",\n          \"rendering\",\n          \"shipping_cost\",\n          \"shipping_details\",\n          \"status_transitions\",\n          \"subscription\",\n          \"subscription_details\",\n          \"test_clock\",\n          \"threshold_reason\",\n          \"total_discount_amounts\",\n          \"total_pretax_credit_amounts\",\n          \"total_tax_amounts\",\n          \"transfer_data\"\n        ],\n        \"x-resourceId\": \"invoice\"\n      },\n      \"invoice_installments_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether Installments are enabled for this Invoice.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"invoice_installments_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_item_threshold_reason\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"line_item_ids\": {\n            \"description\": \"The IDs of the line items that triggered the threshold invoice.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"usage_gte\": {\n            \"description\": \"The quantity threshold boundary that applied to the given line item.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"line_item_ids\", \"usage_gte\"],\n        \"title\": \"InvoiceItemThresholdReason\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_line_item_period\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"end\": {\n            \"description\": \"The end of the period, which must be greater than or equal to the start. This value is inclusive.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"start\": {\n            \"description\": \"The start of the period. This value is inclusive.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"end\", \"start\"],\n        \"title\": \"InvoiceLineItemPeriod\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_mandate_options_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount to be charged for future payments.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"amount_type\": {\n            \"description\": \"One of `fixed` or `maximum`. If `fixed`, the `amount` param refers to the exact amount to be charged in future payments. If `maximum`, the amount charged can be up to the value passed for the `amount` param.\",\n            \"enum\": [\"fixed\", \"maximum\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"A description of the mandate or subscription that is meant to be displayed to the customer.\",\n            \"maxLength\": 200,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"invoice_mandate_options_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_payment_method_options_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/invoice_payment_method_options_acss_debit_mandate_options\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"invoice_payment_method_options_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"invoice_payment_method_options_acss_debit_mandate_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"transaction_type\": {\n            \"description\": \"Transaction type of the mandate.\",\n            \"enum\": [\"business\", \"personal\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"invoice_payment_method_options_acss_debit_mandate_options\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_payment_method_options_bancontact\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"preferred_language\": {\n            \"description\": \"Preferred language of the Bancontact authorization page that the customer is redirected to.\",\n            \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"preferred_language\"],\n        \"title\": \"invoice_payment_method_options_bancontact\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_payment_method_options_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"installments\": {\n            \"$ref\": \"#/components/schemas/invoice_installments_card\"\n          },\n          \"request_three_d_secure\": {\n            \"description\": \"We strongly recommend that you rely on our SCA Engine to automatically prompt your customers for authentication based on risk level and [other requirements](https://stripe.com/docs/strong-customer-authentication). However, if you wish to request 3D Secure based on logic from your own fraud engine, provide this option. Read our guide on [manually requesting 3D Secure](https://stripe.com/docs/payments/3d-secure/authentication-flow#manual-three-ds) for more information on how this configuration interacts with Radar and our SCA Engine.\",\n            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"invoice_payment_method_options_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"installments\"]\n      },\n      \"invoice_payment_method_options_customer_balance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_transfer\": {\n            \"$ref\": \"#/components/schemas/invoice_payment_method_options_customer_balance_bank_transfer\"\n          },\n          \"funding_type\": {\n            \"description\": \"The funding method type to be used when there are not enough funds in the customer balance. Permitted values include: `bank_transfer`.\",\n            \"enum\": [\"bank_transfer\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"invoice_payment_method_options_customer_balance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"bank_transfer\"]\n      },\n      \"invoice_payment_method_options_customer_balance_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"eu_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/invoice_payment_method_options_customer_balance_bank_transfer_eu_bank_transfer\"\n          },\n          \"type\": {\n            \"description\": \"The bank transfer type that can be used for funding. Permitted values include: `eu_bank_transfer`, `gb_bank_transfer`, `jp_bank_transfer`, `mx_bank_transfer`, or `us_bank_transfer`.\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"invoice_payment_method_options_customer_balance_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"eu_bank_transfer\"]\n      },\n      \"invoice_payment_method_options_customer_balance_bank_transfer_eu_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"The desired country code of the bank account information. Permitted values include: `BE`, `DE`, `ES`, `FR`, `IE`, or `NL`.\",\n            \"enum\": [\"BE\", \"DE\", \"ES\", \"FR\", \"IE\", \"NL\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"country\"],\n        \"title\": \"invoice_payment_method_options_customer_balance_bank_transfer_eu_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_payment_method_options_konbini\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"invoice_payment_method_options_konbini\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_payment_method_options_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"invoice_payment_method_options_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_payment_method_options_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"financial_connections\": {\n            \"$ref\": \"#/components/schemas/invoice_payment_method_options_us_bank_account_linked_account_options\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"invoice_payment_method_options_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"financial_connections\"]\n      },\n      \"invoice_payment_method_options_us_bank_account_linked_account_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"filters\": {\n            \"$ref\": \"#/components/schemas/invoice_payment_method_options_us_bank_account_linked_account_options_filters\"\n          },\n          \"permissions\": {\n            \"description\": \"The list of permissions to request. The `payment_method` permission must be included.\",\n            \"items\": {\n              \"enum\": [\n                \"balances\",\n                \"ownership\",\n                \"payment_method\",\n                \"transactions\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"prefetch\": {\n            \"description\": \"Data features requested to be retrieved upon account creation.\",\n            \"items\": {\n              \"enum\": [\"balances\", \"ownership\", \"transactions\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"invoice_payment_method_options_us_bank_account_linked_account_options\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"filters\"]\n      },\n      \"invoice_payment_method_options_us_bank_account_linked_account_options_filters\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_subcategories\": {\n            \"description\": \"The account subcategories to use to filter for possible accounts to link. Valid subcategories are `checking` and `savings`.\",\n            \"items\": {\n              \"enum\": [\"checking\", \"savings\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"invoice_payment_method_options_us_bank_account_linked_account_options_filters\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_rendering_pdf\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"page_size\": {\n            \"description\": \"Page size of invoice pdf. Options include a4, letter, and auto. If set to auto, page size will be switched to a4 or letter based on customer locale.\",\n            \"enum\": [\"a4\", \"auto\", \"letter\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"InvoiceRenderingPdf\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_rendering_template\": {\n        \"description\": \"Invoice Rendering Templates are used to configure how invoices are rendered on surfaces like the PDF. Invoice Rendering Templates\\ncan be created from within the Dashboard, and they can be used over the API when creating invoices.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"nickname\": {\n            \"description\": \"A brief description of the template, hidden from customers\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"invoice_rendering_template\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the template, one of `active` or `archived`.\",\n            \"enum\": [\"active\", \"archived\"],\n            \"type\": \"string\"\n          },\n          \"version\": {\n            \"description\": \"Version of this template; version increases by one when an update on the template changes any field that controls invoice rendering\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"version\"\n        ],\n        \"title\": \"InvoiceRenderingTemplate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"invoice_rendering_template\"\n      },\n      \"invoice_setting_checkout_rendering_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_tax_display\": {\n            \"description\": \"How line-item prices and amounts will be displayed with respect to tax on invoice PDFs.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"invoice_setting_checkout_rendering_options\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_setting_custom_field\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"name\": {\n            \"description\": \"The name of the custom field.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The value of the custom field.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"name\", \"value\"],\n        \"title\": \"InvoiceSettingCustomField\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_setting_customer_rendering_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_tax_display\": {\n            \"description\": \"How line-item prices and amounts will be displayed with respect to tax on invoice PDFs.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"template\": {\n            \"description\": \"ID of the invoice rendering template to be used for this customer's invoices. If set, the template will be used on all invoices for this customer unless a template is set directly on the invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"InvoiceSettingCustomerRenderingOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoice_setting_customer_setting\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom_fields\": {\n            \"description\": \"Default custom fields to be displayed on invoices for this customer.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoice_setting_custom_field\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"default_payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of a payment method that's attached to the customer, to be used as the customer's default payment method for subscriptions and invoices.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"footer\": {\n            \"description\": \"Default footer to be displayed on invoices for this customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"rendering_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_setting_customer_rendering_options\"\n              }\n            ],\n            \"description\": \"Default options for invoice PDF rendering for this customer.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"InvoiceSettingCustomerSetting\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"custom_fields\",\n          \"default_payment_method\",\n          \"rendering_options\"\n        ]\n      },\n      \"invoice_setting_quote_setting\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"days_until_due\": {\n            \"description\": \"Number of days within which a customer must pay invoices generated by this quote. This value will be `null` for quotes where `collection_method=charge_automatically`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"issuer\": {\n            \"$ref\": \"#/components/schemas/connect_account_reference\"\n          }\n        },\n        \"required\": [\"issuer\"],\n        \"title\": \"InvoiceSettingQuoteSetting\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"issuer\"]\n      },\n      \"invoice_setting_subscription_schedule_phase_setting\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_tax_ids\": {\n            \"description\": \"The account tax IDs associated with this phase of the subscription schedule. Will be set on invoices generated by this phase of the subscription schedule.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_id\"\n                  },\n                  {\n                    \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"days_until_due\": {\n            \"description\": \"Number of days within which a customer must pay invoices generated by this subscription schedule. This value will be `null` for subscription schedules where `billing=charge_automatically`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"issuer\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"InvoiceSettingSubscriptionSchedulePhaseSetting\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_tax_ids\", \"issuer\"]\n      },\n      \"invoice_setting_subscription_schedule_setting\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_tax_ids\": {\n            \"description\": \"The account tax IDs associated with the subscription schedule. Will be set on invoices generated by the subscription schedule.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_id\"\n                  },\n                  {\n                    \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"days_until_due\": {\n            \"description\": \"Number of days within which a customer must pay invoices generated by this subscription schedule. This value will be `null` for subscription schedules where `billing=charge_automatically`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"issuer\": {\n            \"$ref\": \"#/components/schemas/connect_account_reference\"\n          }\n        },\n        \"required\": [\"issuer\"],\n        \"title\": \"InvoiceSettingSubscriptionScheduleSetting\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_tax_ids\", \"issuer\"]\n      },\n      \"invoice_tax_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount, in cents (or local equivalent), of the tax.\",\n            \"type\": \"integer\"\n          },\n          \"inclusive\": {\n            \"description\": \"Whether this tax amount is inclusive or exclusive.\",\n            \"type\": \"boolean\"\n          },\n          \"tax_rate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/tax_rate\"\n              }\n            ],\n            \"description\": \"The tax rate that was applied to get this tax amount.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/tax_rate\"\n                }\n              ]\n            }\n          },\n          \"taxability_reason\": {\n            \"description\": \"The reasoning behind this tax, for example, if the product is tax exempt. The possible values for this field may be extended as new tax rules are supported.\",\n            \"enum\": [\n              \"customer_exempt\",\n              \"not_collecting\",\n              \"not_subject_to_tax\",\n              \"not_supported\",\n              \"portion_product_exempt\",\n              \"portion_reduced_rated\",\n              \"portion_standard_rated\",\n              \"product_exempt\",\n              \"product_exempt_holiday\",\n              \"proportionally_rated\",\n              \"reduced_rated\",\n              \"reverse_charge\",\n              \"standard_rated\",\n              \"taxable_basis_reduced\",\n              \"zero_rated\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"taxable_amount\": {\n            \"description\": \"The amount on which tax is calculated, in cents (or local equivalent).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"amount\", \"inclusive\", \"tax_rate\"],\n        \"title\": \"InvoiceTaxAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tax_rate\"]\n      },\n      \"invoice_threshold_reason\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_gte\": {\n            \"description\": \"The total invoice amount threshold boundary if it triggered the threshold invoice.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"item_reasons\": {\n            \"description\": \"Indicates which line items triggered a threshold invoice.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoice_item_threshold_reason\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"item_reasons\"],\n        \"title\": \"InvoiceThresholdReason\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"item_reasons\"]\n      },\n      \"invoice_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount in cents (or local equivalent) that will be transferred to the destination account when the invoice is paid. By default, the entire amount is transferred to the destination.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account where funds from the payment will be transferred to upon payment success.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"destination\"],\n        \"title\": \"InvoiceTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"destination\"]\n      },\n      \"invoiceitem\": {\n        \"description\": \"Invoice Items represent the component lines of an [invoice](https://stripe.com/docs/api/invoices). An invoice item is added to an\\ninvoice by creating or updating it with an `invoice` field, at which point it will be included as\\n[an invoice line item](https://stripe.com/docs/api/invoices/line_item) within\\n[invoice.lines](https://stripe.com/docs/api/invoices/object#invoice_object-lines).\\n\\nInvoice Items can be created before you are ready to actually send the invoice. This can be particularly useful when combined\\nwith a [subscription](https://stripe.com/docs/api/subscriptions). Sometimes you want to add a charge or credit to a customer, but actually charge\\nor credit the customer’s card only at the end of a regular billing cycle. This is useful for combining several charges\\n(to minimize per-transaction fees), or for having Stripe tabulate your usage-based billing totals.\\n\\nRelated guides: [Integrate with the Invoicing API](https://stripe.com/docs/invoicing/integration), [Subscription Invoices](https://stripe.com/docs/billing/invoices/subscription#adding-upcoming-invoice-items).\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in the `currency` specified) of the invoice item. This should always be equal to `unit_amount * quantity`.\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The ID of the customer who will be billed when this invoice item is billed.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"date\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discountable\": {\n            \"description\": \"If true, discounts will apply to this invoice item. Always false for prorations.\",\n            \"type\": \"boolean\"\n          },\n          \"discounts\": {\n            \"description\": \"The discounts which apply to the invoice item. Item discounts are applied before invoice discounts. Use `expand[]=discounts` to expand each discount.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/discount\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"The ID of the invoice this invoice item belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"invoiceitem\"],\n            \"type\": \"string\"\n          },\n          \"period\": {\n            \"$ref\": \"#/components/schemas/invoice_line_item_period\"\n          },\n          \"price\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/price\"\n              }\n            ],\n            \"description\": \"The price of the invoice item.\",\n            \"nullable\": true\n          },\n          \"proration\": {\n            \"description\": \"Whether the invoice item was created automatically as a proration adjustment when the customer switched plans.\",\n            \"type\": \"boolean\"\n          },\n          \"quantity\": {\n            \"description\": \"Quantity of units for the invoice item. If the invoice item is a proration, the quantity of the subscription that the proration was computed for.\",\n            \"type\": \"integer\"\n          },\n          \"subscription\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription\"\n              }\n            ],\n            \"description\": \"The subscription that this invoice item has been created for, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              ]\n            }\n          },\n          \"subscription_item\": {\n            \"description\": \"The subscription item that this invoice item has been created for, if any.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"tax_rates\": {\n            \"description\": \"The tax rates which apply to the invoice item. When set, the `default_tax_rates` on the invoice do not apply to this invoice item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock this invoice item belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          },\n          \"unit_amount\": {\n            \"description\": \"Unit amount (in the `currency` specified) of the invoice item.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unit_amount_decimal\": {\n            \"description\": \"Same as `unit_amount`, but contains a decimal value with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"currency\",\n          \"customer\",\n          \"date\",\n          \"discountable\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"period\",\n          \"proration\",\n          \"quantity\"\n        ],\n        \"title\": \"InvoiceItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"customer\",\n          \"discounts\",\n          \"invoice\",\n          \"period\",\n          \"price\",\n          \"subscription\",\n          \"tax_rates\",\n          \"test_clock\"\n        ],\n        \"x-resourceId\": \"invoiceitem\"\n      },\n      \"invoices_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_acss_debit\"\n              }\n            ],\n            \"description\": \"If paying by `acss_debit`, this sub-hash contains details about the Canadian pre-authorized debit payment method options to pass to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"bancontact\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_bancontact\"\n              }\n            ],\n            \"description\": \"If paying by `bancontact`, this sub-hash contains details about the Bancontact payment method options to pass to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_card\"\n              }\n            ],\n            \"description\": \"If paying by `card`, this sub-hash contains details about the Card payment method options to pass to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"customer_balance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_customer_balance\"\n              }\n            ],\n            \"description\": \"If paying by `customer_balance`, this sub-hash contains details about the Bank transfer payment method options to pass to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"konbini\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_konbini\"\n              }\n            ],\n            \"description\": \"If paying by `konbini`, this sub-hash contains details about the Konbini payment method options to pass to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_sepa_debit\"\n              }\n            ],\n            \"description\": \"If paying by `sepa_debit`, this sub-hash contains details about the SEPA Direct Debit payment method options to pass to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"us_bank_account\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_us_bank_account\"\n              }\n            ],\n            \"description\": \"If paying by `us_bank_account`, this sub-hash contains details about the ACH direct debit payment method options to pass to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"InvoicesPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"bancontact\",\n          \"card\",\n          \"customer_balance\",\n          \"konbini\",\n          \"sepa_debit\",\n          \"us_bank_account\"\n        ]\n      },\n      \"invoices_payment_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"default_mandate\": {\n            \"description\": \"ID of the mandate to be used for this invoice. It must correspond to the payment method used to pay the invoice, including the invoice's default_payment_method or default_source, if set.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_method_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoices_payment_method_options\"\n              }\n            ],\n            \"description\": \"Payment-method-specific configuration to provide to the invoice’s PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"payment_method_types\": {\n            \"description\": \"The list of payment method types (e.g. card) to provide to the invoice’s PaymentIntent. If not set, Stripe attempts to automatically determine the types to use by looking at the invoice’s default payment method, the subscription’s default payment method, the customer’s default payment method, and your [invoice template settings](https://dashboard.stripe.com/settings/billing/invoice).\",\n            \"items\": {\n              \"enum\": [\n                \"ach_credit_transfer\",\n                \"ach_debit\",\n                \"acss_debit\",\n                \"amazon_pay\",\n                \"au_becs_debit\",\n                \"bacs_debit\",\n                \"bancontact\",\n                \"boleto\",\n                \"card\",\n                \"cashapp\",\n                \"customer_balance\",\n                \"eps\",\n                \"fpx\",\n                \"giropay\",\n                \"grabpay\",\n                \"ideal\",\n                \"jp_credit_transfer\",\n                \"kakao_pay\",\n                \"konbini\",\n                \"kr_card\",\n                \"link\",\n                \"multibanco\",\n                \"naver_pay\",\n                \"p24\",\n                \"payco\",\n                \"paynow\",\n                \"paypal\",\n                \"promptpay\",\n                \"revolut_pay\",\n                \"sepa_credit_transfer\",\n                \"sepa_debit\",\n                \"sofort\",\n                \"swish\",\n                \"us_bank_account\",\n                \"wechat_pay\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"InvoicesPaymentSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_method_options\"]\n      },\n      \"invoices_resource_from_invoice\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"action\": {\n            \"description\": \"The relation between this invoice and the cloned invoice\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"The invoice that was cloned.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"action\", \"invoice\"],\n        \"title\": \"InvoicesResourceFromInvoice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"invoice\"]\n      },\n      \"invoices_resource_invoice_rendering\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_tax_display\": {\n            \"description\": \"How line-item prices and amounts will be displayed with respect to tax on invoice PDFs.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"pdf\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_rendering_pdf\"\n              }\n            ],\n            \"description\": \"Invoice pdf rendering options\",\n            \"nullable\": true\n          },\n          \"template\": {\n            \"description\": \"ID of the rendering template that the invoice is formatted by.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"template_version\": {\n            \"description\": \"Version of the rendering template that the invoice is using.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"InvoicesResourceInvoiceRendering\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"pdf\"]\n      },\n      \"invoices_resource_invoice_tax_id\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"The type of the tax ID, one of `ad_nrt`, `ar_cuit`, `eu_vat`, `bo_tin`, `br_cnpj`, `br_cpf`, `cn_tin`, `co_nit`, `cr_tin`, `do_rcn`, `ec_ruc`, `eu_oss_vat`, `hr_oib`, `pe_ruc`, `ro_tin`, `rs_pib`, `sv_nit`, `uy_ruc`, `ve_rif`, `vn_tin`, `gb_vat`, `nz_gst`, `au_abn`, `au_arn`, `in_gst`, `no_vat`, `no_voec`, `za_vat`, `ch_vat`, `mx_rfc`, `sg_uen`, `ru_inn`, `ru_kpp`, `ca_bn`, `hk_br`, `es_cif`, `tw_vat`, `th_vat`, `jp_cn`, `jp_rn`, `jp_trn`, `li_uid`, `li_vat`, `my_itn`, `us_ein`, `kr_brn`, `ca_qst`, `ca_gst_hst`, `ca_pst_bc`, `ca_pst_mb`, `ca_pst_sk`, `my_sst`, `sg_gst`, `ae_trn`, `cl_tin`, `sa_vat`, `id_npwp`, `my_frp`, `il_vat`, `ge_vat`, `ua_vat`, `is_vat`, `bg_uic`, `hu_tin`, `si_tin`, `ke_pin`, `tr_tin`, `eg_tin`, `ph_tin`, `al_tin`, `bh_vat`, `kz_bin`, `ng_tin`, `om_vat`, `de_stn`, `ch_uid`, `tz_vat`, `uz_vat`, `uz_tin`, `md_vat`, `ma_vat`, `by_tin`, `ao_tin`, `bs_tin`, `bb_tin`, `cd_nif`, `mr_nif`, `me_pib`, `zw_tin`, `ba_tin`, `gn_nif`, `mk_vat`, `sr_fin`, `sn_ninea`, `am_tin`, `np_pan`, `tj_tin`, `ug_tin`, `zm_tin`, `kh_tin`, or `unknown`\",\n            \"enum\": [\n              \"ad_nrt\",\n              \"ae_trn\",\n              \"al_tin\",\n              \"am_tin\",\n              \"ao_tin\",\n              \"ar_cuit\",\n              \"au_abn\",\n              \"au_arn\",\n              \"ba_tin\",\n              \"bb_tin\",\n              \"bg_uic\",\n              \"bh_vat\",\n              \"bo_tin\",\n              \"br_cnpj\",\n              \"br_cpf\",\n              \"bs_tin\",\n              \"by_tin\",\n              \"ca_bn\",\n              \"ca_gst_hst\",\n              \"ca_pst_bc\",\n              \"ca_pst_mb\",\n              \"ca_pst_sk\",\n              \"ca_qst\",\n              \"cd_nif\",\n              \"ch_uid\",\n              \"ch_vat\",\n              \"cl_tin\",\n              \"cn_tin\",\n              \"co_nit\",\n              \"cr_tin\",\n              \"de_stn\",\n              \"do_rcn\",\n              \"ec_ruc\",\n              \"eg_tin\",\n              \"es_cif\",\n              \"eu_oss_vat\",\n              \"eu_vat\",\n              \"gb_vat\",\n              \"ge_vat\",\n              \"gn_nif\",\n              \"hk_br\",\n              \"hr_oib\",\n              \"hu_tin\",\n              \"id_npwp\",\n              \"il_vat\",\n              \"in_gst\",\n              \"is_vat\",\n              \"jp_cn\",\n              \"jp_rn\",\n              \"jp_trn\",\n              \"ke_pin\",\n              \"kh_tin\",\n              \"kr_brn\",\n              \"kz_bin\",\n              \"li_uid\",\n              \"li_vat\",\n              \"ma_vat\",\n              \"md_vat\",\n              \"me_pib\",\n              \"mk_vat\",\n              \"mr_nif\",\n              \"mx_rfc\",\n              \"my_frp\",\n              \"my_itn\",\n              \"my_sst\",\n              \"ng_tin\",\n              \"no_vat\",\n              \"no_voec\",\n              \"np_pan\",\n              \"nz_gst\",\n              \"om_vat\",\n              \"pe_ruc\",\n              \"ph_tin\",\n              \"ro_tin\",\n              \"rs_pib\",\n              \"ru_inn\",\n              \"ru_kpp\",\n              \"sa_vat\",\n              \"sg_gst\",\n              \"sg_uen\",\n              \"si_tin\",\n              \"sn_ninea\",\n              \"sr_fin\",\n              \"sv_nit\",\n              \"th_vat\",\n              \"tj_tin\",\n              \"tr_tin\",\n              \"tw_vat\",\n              \"tz_vat\",\n              \"ua_vat\",\n              \"ug_tin\",\n              \"unknown\",\n              \"us_ein\",\n              \"uy_ruc\",\n              \"uz_tin\",\n              \"uz_vat\",\n              \"ve_rif\",\n              \"vn_tin\",\n              \"za_vat\",\n              \"zm_tin\",\n              \"zw_tin\"\n            ],\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The value of the tax ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"InvoicesResourceInvoiceTaxID\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoices_resource_line_items_credited_items\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"invoice\": {\n            \"description\": \"Invoice containing the credited invoice line items\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice_line_items\": {\n            \"description\": \"Credited invoice line items\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"invoice\", \"invoice_line_items\"],\n        \"title\": \"InvoicesResourceLineItemsCreditedItems\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"invoices_resource_line_items_proration_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"credited_items\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoices_resource_line_items_credited_items\"\n              }\n            ],\n            \"description\": \"For a credit proration `line_item`, the original debit line_items to which the credit proration applies.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"InvoicesResourceLineItemsProrationDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"credited_items\"]\n      },\n      \"invoices_resource_pretax_credit_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount, in cents (or local equivalent), of the pretax credit amount.\",\n            \"type\": \"integer\"\n          },\n          \"credit_balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/billing.credit_balance_transaction\"\n              }\n            ],\n            \"description\": \"The credit balance transaction that was applied to get this pretax credit amount.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/billing.credit_balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"discount\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/discount\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_discount\"\n              }\n            ],\n            \"description\": \"The discount that was applied to get this pretax credit amount.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_discount\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"Type of the pretax credit amount referenced.\",\n            \"enum\": [\"credit_balance_transaction\", \"discount\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"amount\", \"type\"],\n        \"title\": \"InvoicesResourcePretaxCreditAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"credit_balance_transaction\", \"discount\"]\n      },\n      \"invoices_resource_shipping_cost\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_subtotal\": {\n            \"description\": \"Total shipping cost before any taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"Total tax amount applied due to shipping costs. If no tax was applied, defaults to 0.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total shipping cost after taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"shipping_rate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/shipping_rate\"\n              }\n            ],\n            \"description\": \"The ID of the ShippingRate for this invoice.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/shipping_rate\"\n                }\n              ]\n            }\n          },\n          \"taxes\": {\n            \"description\": \"The taxes applied to the shipping rate.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_tax_amount\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"amount_subtotal\", \"amount_tax\", \"amount_total\"],\n        \"title\": \"InvoicesResourceShippingCost\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"shipping_rate\", \"taxes\"]\n      },\n      \"invoices_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"finalized_at\": {\n            \"description\": \"The time that the invoice draft was finalized.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"marked_uncollectible_at\": {\n            \"description\": \"The time that the invoice was marked uncollectible.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"paid_at\": {\n            \"description\": \"The time that the invoice was paid.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"voided_at\": {\n            \"description\": \"The time that the invoice was voided.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"InvoicesResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing.authorization\": {\n        \"description\": \"When an [issued card](https://stripe.com/docs/issuing) is used to make a purchase, an Issuing `Authorization`\\nobject is created. [Authorizations](https://stripe.com/docs/issuing/purchases/authorizations) must be approved for the\\npurchase to be completed successfully.\\n\\nRelated guide: [Issued card authorizations](https://stripe.com/docs/issuing/purchases/authorizations)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The total amount that was authorized or rejected. This amount is in `currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). `amount` should be the same as `merchant_amount`, unless `currency` and `merchant_currency` are different.\",\n            \"type\": \"integer\"\n          },\n          \"amount_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_amount_details\"\n              }\n            ],\n            \"description\": \"Detailed breakdown of amount components. These amounts are denominated in `currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"nullable\": true\n          },\n          \"approved\": {\n            \"description\": \"Whether the authorization has been approved.\",\n            \"type\": \"boolean\"\n          },\n          \"authorization_method\": {\n            \"description\": \"How the card details were provided.\",\n            \"enum\": [\"chip\", \"contactless\", \"keyed_in\", \"online\", \"swipe\"],\n            \"type\": \"string\"\n          },\n          \"balance_transactions\": {\n            \"description\": \"List of balance transactions associated with this authorization.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_transaction\"\n            },\n            \"type\": \"array\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/issuing.card\"\n          },\n          \"cardholder\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.cardholder\"\n              }\n            ],\n            \"description\": \"The cardholder to whom this authorization belongs.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.cardholder\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"The currency of the cardholder. This currency can be different from the currency presented at authorization and the `merchant_currency` field on this authorization. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"fleet\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_fleet_data\"\n              }\n            ],\n            \"description\": \"Fleet-specific information for authorizations using Fleet cards.\",\n            \"nullable\": true\n          },\n          \"fraud_challenges\": {\n            \"description\": \"Fraud challenges sent to the cardholder, if this authorization was declined for fraud risk reasons.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/issuing_authorization_fraud_challenge\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"fuel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_fuel_data\"\n              }\n            ],\n            \"description\": \"Information about fuel that was purchased with this transaction. Typically this information is received from the merchant after the authorization has been approved and the fuel dispensed.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"merchant_amount\": {\n            \"description\": \"The total amount that was authorized or rejected. This amount is in the `merchant_currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). `merchant_amount` should be the same as `amount`, unless `merchant_currency` and `currency` are different.\",\n            \"type\": \"integer\"\n          },\n          \"merchant_currency\": {\n            \"description\": \"The local currency that was presented to the cardholder for the authorization. This currency can be different from the cardholder currency and the `currency` field on this authorization. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"merchant_data\": {\n            \"$ref\": \"#/components/schemas/issuing_authorization_merchant_data\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"network_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_network_data\"\n              }\n            ],\n            \"description\": \"Details about the authorization, such as identifiers, set by the card network.\",\n            \"nullable\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.authorization\"],\n            \"type\": \"string\"\n          },\n          \"pending_request\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_pending_request\"\n              }\n            ],\n            \"description\": \"The pending authorization request. This field will only be non-null during an `issuing_authorization.request` webhook.\",\n            \"nullable\": true\n          },\n          \"request_history\": {\n            \"description\": \"History of every time a `pending_request` authorization was approved/declined, either by you directly or by Stripe (e.g. based on your spending_controls). If the merchant changes the authorization by performing an incremental authorization, you can look at this field to see the previous requests for the authorization. This field can be helpful in determining why a given authorization was approved/declined.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/issuing_authorization_request\"\n            },\n            \"type\": \"array\"\n          },\n          \"status\": {\n            \"description\": \"The current status of the authorization in its lifecycle.\",\n            \"enum\": [\"closed\", \"pending\", \"reversed\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"token\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.token\"\n              }\n            ],\n            \"description\": \"[Token](https://stripe.com/docs/api/issuing/tokens/object) object used for this authorization. If a network token was not used for this authorization, this field will be null.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.token\"\n                }\n              ]\n            }\n          },\n          \"transactions\": {\n            \"description\": \"List of [transactions](https://stripe.com/docs/api/issuing/transactions) associated with this authorization.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/issuing.transaction\"\n            },\n            \"type\": \"array\"\n          },\n          \"treasury\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_treasury\"\n              }\n            ],\n            \"description\": \"[Treasury](https://stripe.com/docs/api/treasury) details related to this authorization if it was created on a [FinancialAccount](https://stripe.com/docs/api/treasury/financial_accounts).\",\n            \"nullable\": true\n          },\n          \"verification_data\": {\n            \"$ref\": \"#/components/schemas/issuing_authorization_verification_data\"\n          },\n          \"verified_by_fraud_challenge\": {\n            \"description\": \"Whether the authorization bypassed fraud risk checks because the cardholder has previously completed a fraud challenge on a similar high-risk authorization from the same merchant.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"wallet\": {\n            \"description\": \"The digital wallet used for this transaction. One of `apple_pay`, `google_pay`, or `samsung_pay`. Will populate as `null` when no digital wallet was utilized.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"approved\",\n          \"authorization_method\",\n          \"balance_transactions\",\n          \"card\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"merchant_amount\",\n          \"merchant_currency\",\n          \"merchant_data\",\n          \"metadata\",\n          \"object\",\n          \"request_history\",\n          \"status\",\n          \"transactions\",\n          \"verification_data\"\n        ],\n        \"title\": \"IssuingAuthorization\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"amount_details\",\n          \"balance_transactions\",\n          \"card\",\n          \"cardholder\",\n          \"fleet\",\n          \"fraud_challenges\",\n          \"fuel\",\n          \"merchant_data\",\n          \"network_data\",\n          \"pending_request\",\n          \"request_history\",\n          \"token\",\n          \"transactions\",\n          \"treasury\",\n          \"verification_data\"\n        ],\n        \"x-resourceId\": \"issuing.authorization\"\n      },\n      \"issuing.card\": {\n        \"description\": \"You can [create physical or virtual cards](https://stripe.com/docs/issuing) that are issued to cardholders.\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"The brand of the card.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"cancellation_reason\": {\n            \"description\": \"The reason why the card was canceled.\",\n            \"enum\": [\"design_rejected\", \"lost\", \"stolen\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"cardholder\": {\n            \"$ref\": \"#/components/schemas/issuing.cardholder\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Supported currencies are `usd` in the US, `eur` in the EU, and `gbp` in the UK.\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"cvc\": {\n            \"description\": \"The card's CVC. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with [the `expand` parameter](https://stripe.com/docs/api/expanding_objects). Additionally, it's only available via the [\\\"Retrieve a card\\\" endpoint](https://stripe.com/docs/api/issuing/cards/retrieve), not via \\\"List all cards\\\" or any other endpoint.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"The expiration month of the card.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"The expiration year of the card.\",\n            \"type\": \"integer\"\n          },\n          \"financial_account\": {\n            \"description\": \"The financial account this card is attached to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last 4 digits of the card number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"number\": {\n            \"description\": \"The full unredacted card number. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with [the `expand` parameter](https://stripe.com/docs/api/expanding_objects). Additionally, it's only available via the [\\\"Retrieve a card\\\" endpoint](https://stripe.com/docs/api/issuing/cards/retrieve), not via \\\"List all cards\\\" or any other endpoint.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.card\"],\n            \"type\": \"string\"\n          },\n          \"personalization_design\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n              }\n            ],\n            \"description\": \"The personalization design object belonging to this card.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                }\n              ]\n            }\n          },\n          \"replaced_by\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.card\"\n              }\n            ],\n            \"description\": \"The latest card that replaces this card, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              ]\n            }\n          },\n          \"replacement_for\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.card\"\n              }\n            ],\n            \"description\": \"The card this card replaces, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              ]\n            }\n          },\n          \"replacement_reason\": {\n            \"description\": \"The reason why the previous card needed to be replaced.\",\n            \"enum\": [\"damaged\", \"expired\", \"lost\", \"stolen\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"shipping\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_card_shipping\"\n              }\n            ],\n            \"description\": \"Where and how the card will be shipped.\",\n            \"nullable\": true\n          },\n          \"spending_controls\": {\n            \"$ref\": \"#/components/schemas/issuing_card_authorization_controls\"\n          },\n          \"status\": {\n            \"description\": \"Whether authorizations can be approved on this card. May be blocked from activating cards depending on past-due Cardholder requirements. Defaults to `inactive`.\",\n            \"enum\": [\"active\", \"canceled\", \"inactive\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"type\": {\n            \"description\": \"The type of the card.\",\n            \"enum\": [\"physical\", \"virtual\"],\n            \"type\": \"string\"\n          },\n          \"wallets\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_card_wallets\"\n              }\n            ],\n            \"description\": \"Information relating to digital wallets (like Apple Pay and Google Pay).\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\n          \"brand\",\n          \"cardholder\",\n          \"created\",\n          \"currency\",\n          \"exp_month\",\n          \"exp_year\",\n          \"id\",\n          \"last4\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"spending_controls\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"IssuingCard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"cardholder\",\n          \"personalization_design\",\n          \"replaced_by\",\n          \"replacement_for\",\n          \"shipping\",\n          \"spending_controls\",\n          \"wallets\"\n        ],\n        \"x-resourceId\": \"issuing.card\"\n      },\n      \"issuing.cardholder\": {\n        \"description\": \"An Issuing `Cardholder` object represents an individual or business entity who is [issued](https://stripe.com/docs/issuing) cards.\\n\\nRelated guide: [How to create a cardholder](https://stripe.com/docs/issuing/cards/virtual/issue-cards#create-cardholder)\",\n        \"properties\": {\n          \"billing\": {\n            \"$ref\": \"#/components/schemas/issuing_cardholder_address\"\n          },\n          \"company\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_company\"\n              }\n            ],\n            \"description\": \"Additional information about a `company` cardholder.\",\n            \"nullable\": true\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"email\": {\n            \"description\": \"The cardholder's email address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"individual\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_individual\"\n              }\n            ],\n            \"description\": \"Additional information about an `individual` cardholder.\",\n            \"nullable\": true\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"The cardholder's name. This will be printed on cards issued to them.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.cardholder\"],\n            \"type\": \"string\"\n          },\n          \"phone_number\": {\n            \"description\": \"The cardholder's phone number. This is required for all cardholders who will be creating EU cards. See the [3D Secure documentation](https://stripe.com/docs/issuing/3d-secure#when-is-3d-secure-applied) for more details.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_locales\": {\n            \"description\": \"The cardholder’s preferred locales (languages), ordered by preference. Locales can be `de`, `en`, `es`, `fr`, or `it`.\\n This changes the language of the [3D Secure flow](https://stripe.com/docs/issuing/3d-secure) and one-time password messages sent to the cardholder.\",\n            \"items\": {\n              \"enum\": [\"de\", \"en\", \"es\", \"fr\", \"it\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"requirements\": {\n            \"$ref\": \"#/components/schemas/issuing_cardholder_requirements\"\n          },\n          \"spending_controls\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_authorization_controls\"\n              }\n            ],\n            \"description\": \"Rules that control spending across this cardholder's cards. Refer to our [documentation](https://stripe.com/docs/issuing/controls/spending-controls) for more details.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"Specifies whether to permit authorizations on this cardholder's cards.\",\n            \"enum\": [\"active\", \"blocked\", \"inactive\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"One of `individual` or `company`. See [Choose a cardholder type](https://stripe.com/docs/issuing/other/choose-cardholder) for more details.\",\n            \"enum\": [\"company\", \"individual\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\n          \"billing\",\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"name\",\n          \"object\",\n          \"requirements\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"IssuingCardholder\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"billing\",\n          \"company\",\n          \"individual\",\n          \"requirements\",\n          \"spending_controls\"\n        ],\n        \"x-resourceId\": \"issuing.cardholder\"\n      },\n      \"issuing.dispute\": {\n        \"description\": \"As a [card issuer](https://stripe.com/docs/issuing), you can dispute transactions that the cardholder does not recognize, suspects to be fraudulent, or has other issues with.\\n\\nRelated guide: [Issuing disputes](https://stripe.com/docs/issuing/purchases/disputes)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Disputed amount in the card's currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). Usually the amount of the `transaction`, but can differ (usually because of currency fluctuation).\",\n            \"type\": \"integer\"\n          },\n          \"balance_transactions\": {\n            \"description\": \"List of balance transactions associated with the dispute.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/balance_transaction\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"The currency the `transaction` was made in.\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"evidence\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_evidence\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"loss_reason\": {\n            \"description\": \"The enum that describes the dispute loss outcome. If the dispute is not lost, this field will be absent. New enum values may be added in the future, so be sure to handle unknown values.\",\n            \"enum\": [\n              \"cardholder_authentication_issuer_liability\",\n              \"eci5_token_transaction_with_tavv\",\n              \"excess_disputes_in_timeframe\",\n              \"has_not_met_the_minimum_dispute_amount_requirements\",\n              \"invalid_duplicate_dispute\",\n              \"invalid_incorrect_amount_dispute\",\n              \"invalid_no_authorization\",\n              \"invalid_use_of_disputes\",\n              \"merchandise_delivered_or_shipped\",\n              \"merchandise_or_service_as_described\",\n              \"not_cancelled\",\n              \"other\",\n              \"refund_issued\",\n              \"submitted_beyond_allowable_time_limit\",\n              \"transaction_3ds_required\",\n              \"transaction_approved_after_prior_fraud_dispute\",\n              \"transaction_authorized\",\n              \"transaction_electronically_read\",\n              \"transaction_qualifies_for_visa_easy_payment_service\",\n              \"transaction_unattended\"\n            ],\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.dispute\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Current status of the dispute.\",\n            \"enum\": [\"expired\", \"lost\", \"submitted\", \"unsubmitted\", \"won\"],\n            \"type\": \"string\"\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.transaction\"\n              }\n            ],\n            \"description\": \"The transaction being disputed.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.transaction\"\n                }\n              ]\n            }\n          },\n          \"treasury\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_dispute_treasury\"\n              }\n            ],\n            \"description\": \"[Treasury](https://stripe.com/docs/api/treasury) details related to this dispute if it was created on a [FinancialAccount](/docs/api/treasury/financial_accounts\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"evidence\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"status\",\n          \"transaction\"\n        ],\n        \"title\": \"IssuingDispute\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"balance_transactions\",\n          \"evidence\",\n          \"transaction\",\n          \"treasury\"\n        ],\n        \"x-resourceId\": \"issuing.dispute\"\n      },\n      \"issuing.personalization_design\": {\n        \"description\": \"A Personalization Design is a logical grouping of a Physical Bundle, card logo, and carrier text that represents a product line.\",\n        \"properties\": {\n          \"card_logo\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The file for the card logo to use with physical bundles that support card logos. Must have a `purpose` value of `issuing_logo`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"carrier_text\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_personalization_design_carrier_text\"\n              }\n            ],\n            \"description\": \"Hash containing carrier text, for use with physical bundles that support carrier text.\",\n            \"nullable\": true\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"lookup_key\": {\n            \"description\": \"A lookup key used to retrieve personalization designs dynamically from a static string. This may be up to 200 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"Friendly display name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.personalization_design\"],\n            \"type\": \"string\"\n          },\n          \"physical_bundle\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.physical_bundle\"\n              }\n            ],\n            \"description\": \"The physical bundle object belonging to this personalization design.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.physical_bundle\"\n                }\n              ]\n            }\n          },\n          \"preferences\": {\n            \"$ref\": \"#/components/schemas/issuing_personalization_design_preferences\"\n          },\n          \"rejection_reasons\": {\n            \"$ref\": \"#/components/schemas/issuing_personalization_design_rejection_reasons\"\n          },\n          \"status\": {\n            \"description\": \"Whether this personalization design can be used to create cards.\",\n            \"enum\": [\"active\", \"inactive\", \"rejected\", \"review\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"physical_bundle\",\n          \"preferences\",\n          \"rejection_reasons\",\n          \"status\"\n        ],\n        \"title\": \"IssuingPersonalizationDesign\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"card_logo\",\n          \"carrier_text\",\n          \"physical_bundle\",\n          \"preferences\",\n          \"rejection_reasons\"\n        ],\n        \"x-resourceId\": \"issuing.personalization_design\"\n      },\n      \"issuing.physical_bundle\": {\n        \"description\": \"A Physical Bundle represents the bundle of physical items - card stock, carrier letter, and envelope - that is shipped to a cardholder when you create a physical card.\",\n        \"properties\": {\n          \"features\": {\n            \"$ref\": \"#/components/schemas/issuing_physical_bundle_features\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"name\": {\n            \"description\": \"Friendly display name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.physical_bundle\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Whether this physical bundle can be used to create cards.\",\n            \"enum\": [\"active\", \"inactive\", \"review\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Whether this physical bundle is a standard Stripe offering or custom-made for you.\",\n            \"enum\": [\"custom\", \"standard\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"features\",\n          \"id\",\n          \"livemode\",\n          \"name\",\n          \"object\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"IssuingPhysicalBundle\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"features\"],\n        \"x-resourceId\": \"issuing.physical_bundle\"\n      },\n      \"issuing.settlement\": {\n        \"description\": \"When a non-stripe BIN is used, any use of an [issued card](https://stripe.com/docs/issuing) must be settled directly with the card network. The net amount owed is represented by an Issuing `Settlement` object.\",\n        \"properties\": {\n          \"bin\": {\n            \"description\": \"The Bank Identification Number reflecting this settlement record.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"clearing_date\": {\n            \"description\": \"The date that the transactions are cleared and posted to user's accounts.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"interchange_fees\": {\n            \"description\": \"The total interchange received as reimbursement for the transactions.\",\n            \"type\": \"integer\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"net_total\": {\n            \"description\": \"The total net amount required to settle with the network.\",\n            \"type\": \"integer\"\n          },\n          \"network\": {\n            \"description\": \"The card network for this settlement report. One of [\\\"visa\\\", \\\"maestro\\\"]\",\n            \"enum\": [\"maestro\", \"visa\"],\n            \"type\": \"string\"\n          },\n          \"network_fees\": {\n            \"description\": \"The total amount of fees owed to the network.\",\n            \"type\": \"integer\"\n          },\n          \"network_settlement_identifier\": {\n            \"description\": \"The Settlement Identification Number assigned by the network.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.settlement\"],\n            \"type\": \"string\"\n          },\n          \"settlement_service\": {\n            \"description\": \"One of `international` or `uk_national_net`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The current processing status of this settlement.\",\n            \"enum\": [\"complete\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"transaction_count\": {\n            \"description\": \"The total number of transactions reflected in this settlement.\",\n            \"type\": \"integer\"\n          },\n          \"transaction_volume\": {\n            \"description\": \"The total transaction amount reflected in this settlement.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"bin\",\n          \"clearing_date\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"interchange_fees\",\n          \"livemode\",\n          \"metadata\",\n          \"net_total\",\n          \"network\",\n          \"network_fees\",\n          \"network_settlement_identifier\",\n          \"object\",\n          \"settlement_service\",\n          \"status\",\n          \"transaction_count\",\n          \"transaction_volume\"\n        ],\n        \"title\": \"IssuingSettlement\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"issuing.settlement\"\n      },\n      \"issuing.token\": {\n        \"description\": \"An issuing token object is created when an issued card is added to a digital wallet. As a [card issuer](https://stripe.com/docs/issuing), you can [view and manage these tokens](https://stripe.com/docs/issuing/controls/token-management) through Stripe.\",\n        \"properties\": {\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.card\"\n              }\n            ],\n            \"description\": \"Card associated with this token.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"device_fingerprint\": {\n            \"description\": \"The hashed ID derived from the device ID from the card network associated with the token.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the token.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"network\": {\n            \"description\": \"The token service provider / card network associated with the token.\",\n            \"enum\": [\"mastercard\", \"visa\"],\n            \"type\": \"string\"\n          },\n          \"network_data\": {\n            \"$ref\": \"#/components/schemas/issuing_network_token_network_data\"\n          },\n          \"network_updated_at\": {\n            \"description\": \"Time at which the token was last updated by the card network. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.token\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The usage state of the token.\",\n            \"enum\": [\"active\", \"deleted\", \"requested\", \"suspended\"],\n            \"type\": \"string\"\n          },\n          \"wallet_provider\": {\n            \"description\": \"The digital wallet for this token, if one was used.\",\n            \"enum\": [\"apple_pay\", \"google_pay\", \"samsung_pay\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"card\",\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"network\",\n          \"network_updated_at\",\n          \"object\",\n          \"status\"\n        ],\n        \"title\": \"IssuingNetworkToken\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card\", \"network_data\"],\n        \"x-resourceId\": \"issuing.token\"\n      },\n      \"issuing.transaction\": {\n        \"description\": \"Any use of an [issued card](https://stripe.com/docs/issuing) that results in funds entering or leaving\\nyour Stripe account, such as a completed purchase or refund, is represented by an Issuing\\n`Transaction` object.\\n\\nRelated guide: [Issued card transactions](https://stripe.com/docs/issuing/purchases/transactions)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The transaction amount, which will be reflected in your balance. This amount is in your currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"amount_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_amount_details\"\n              }\n            ],\n            \"description\": \"Detailed breakdown of amount components. These amounts are denominated in `currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"nullable\": true\n          },\n          \"authorization\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.authorization\"\n              }\n            ],\n            \"description\": \"The `Authorization` object that led to this transaction.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              ]\n            }\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"ID of the [balance transaction](https://stripe.com/docs/api/balance_transactions) associated with this transaction.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.card\"\n              }\n            ],\n            \"description\": \"The card used to make this transaction.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              ]\n            }\n          },\n          \"cardholder\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.cardholder\"\n              }\n            ],\n            \"description\": \"The cardholder to whom this transaction belongs.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.cardholder\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"dispute\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.dispute\"\n              }\n            ],\n            \"description\": \"If you've disputed the transaction, the ID of the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.dispute\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"merchant_amount\": {\n            \"description\": \"The amount that the merchant will receive, denominated in `merchant_currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). It will be different from `amount` if the merchant is taking payment in a different currency.\",\n            \"type\": \"integer\"\n          },\n          \"merchant_currency\": {\n            \"description\": \"The currency with which the merchant is taking payment.\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"merchant_data\": {\n            \"$ref\": \"#/components/schemas/issuing_authorization_merchant_data\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"network_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_network_data\"\n              }\n            ],\n            \"description\": \"Details about the transaction, such as processing dates, set by the card network.\",\n            \"nullable\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"issuing.transaction\"],\n            \"type\": \"string\"\n          },\n          \"purchase_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_purchase_details\"\n              }\n            ],\n            \"description\": \"Additional purchase information that is optionally provided by the merchant.\",\n            \"nullable\": true\n          },\n          \"token\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/issuing.token\"\n              }\n            ],\n            \"description\": \"[Token](https://stripe.com/docs/api/issuing/tokens/object) object used for this transaction. If a network token was not used for this transaction, this field will be null.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/issuing.token\"\n                }\n              ]\n            }\n          },\n          \"treasury\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_treasury\"\n              }\n            ],\n            \"description\": \"[Treasury](https://stripe.com/docs/api/treasury) details related to this transaction if it was created on a [FinancialAccount](/docs/api/treasury/financial_accounts\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"The nature of the transaction.\",\n            \"enum\": [\"capture\", \"refund\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"wallet\": {\n            \"description\": \"The digital wallet used for this transaction. One of `apple_pay`, `google_pay`, or `samsung_pay`.\",\n            \"enum\": [\"apple_pay\", \"google_pay\", \"samsung_pay\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"card\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"merchant_amount\",\n          \"merchant_currency\",\n          \"merchant_data\",\n          \"metadata\",\n          \"object\",\n          \"type\"\n        ],\n        \"title\": \"IssuingTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"amount_details\",\n          \"authorization\",\n          \"balance_transaction\",\n          \"card\",\n          \"cardholder\",\n          \"dispute\",\n          \"merchant_data\",\n          \"network_data\",\n          \"purchase_details\",\n          \"token\",\n          \"treasury\"\n        ],\n        \"x-resourceId\": \"issuing.transaction\"\n      },\n      \"issuing_authorization_amount_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"atm_fee\": {\n            \"description\": \"The fee charged by the ATM for the cash withdrawal.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cashback_amount\": {\n            \"description\": \"The amount of cash requested by the cardholder.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationAmountDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_authentication_exemption\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"claimed_by\": {\n            \"description\": \"The entity that requested the exemption, either the acquiring merchant or the Issuing user.\",\n            \"enum\": [\"acquirer\", \"issuer\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The specific exemption claimed for this authorization.\",\n            \"enum\": [\n              \"low_value_transaction\",\n              \"transaction_risk_analysis\",\n              \"unknown\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"claimed_by\", \"type\"],\n        \"title\": \"IssuingAuthorizationAuthenticationExemption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_fleet_cardholder_prompt_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alphanumeric_id\": {\n            \"description\": \"[Deprecated] An alphanumeric ID, though typical point of sales only support numeric entry. The card program can be configured to prompt for a vehicle ID, driver ID, or generic ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"driver_id\": {\n            \"description\": \"Driver ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"odometer\": {\n            \"description\": \"Odometer reading.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unspecified_id\": {\n            \"description\": \"An alphanumeric ID. This field is used when a vehicle ID, driver ID, or generic ID is entered by the cardholder, but the merchant or card network did not specify the prompt type.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_id\": {\n            \"description\": \"User ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"vehicle_number\": {\n            \"description\": \"Vehicle number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationFleetCardholderPromptData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_fleet_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"cardholder_prompt_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_fleet_cardholder_prompt_data\"\n              }\n            ],\n            \"description\": \"Answers to prompts presented to the cardholder at the point of sale. Prompted fields vary depending on the configuration of your physical fleet cards. Typical points of sale support only numeric entry.\",\n            \"nullable\": true\n          },\n          \"purchase_type\": {\n            \"description\": \"The type of purchase.\",\n            \"enum\": [\n              \"fuel_and_non_fuel_purchase\",\n              \"fuel_purchase\",\n              \"non_fuel_purchase\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reported_breakdown\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_fleet_reported_breakdown\"\n              }\n            ],\n            \"description\": \"More information about the total amount. Typically this information is received from the merchant after the authorization has been approved and the fuel dispensed. This information is not guaranteed to be accurate as some merchants may provide unreliable data.\",\n            \"nullable\": true\n          },\n          \"service_type\": {\n            \"description\": \"The type of fuel service.\",\n            \"enum\": [\"full_service\", \"non_fuel_transaction\", \"self_service\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationFleetData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"cardholder_prompt_data\", \"reported_breakdown\"]\n      },\n      \"issuing_authorization_fleet_fuel_price_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"gross_amount_decimal\": {\n            \"description\": \"Gross fuel amount that should equal Fuel Quantity multiplied by Fuel Unit Cost, inclusive of taxes.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationFleetFuelPriceData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_fleet_non_fuel_price_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"gross_amount_decimal\": {\n            \"description\": \"Gross non-fuel amount that should equal the sum of the line items, inclusive of taxes.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationFleetNonFuelPriceData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_fleet_reported_breakdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fuel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_fleet_fuel_price_data\"\n              }\n            ],\n            \"description\": \"Breakdown of fuel portion of the purchase.\",\n            \"nullable\": true\n          },\n          \"non_fuel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_fleet_non_fuel_price_data\"\n              }\n            ],\n            \"description\": \"Breakdown of non-fuel portion of the purchase.\",\n            \"nullable\": true\n          },\n          \"tax\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_fleet_tax_data\"\n              }\n            ],\n            \"description\": \"Information about tax included in this transaction.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"IssuingAuthorizationFleetReportedBreakdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"fuel\", \"non_fuel\", \"tax\"]\n      },\n      \"issuing_authorization_fleet_tax_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"local_amount_decimal\": {\n            \"description\": \"Amount of state or provincial Sales Tax included in the transaction amount. `null` if not reported by merchant or not subject to tax.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"national_amount_decimal\": {\n            \"description\": \"Amount of national Sales Tax or VAT included in the transaction amount. `null` if not reported by merchant or not subject to tax.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationFleetTaxData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_fraud_challenge\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"channel\": {\n            \"description\": \"The method by which the fraud challenge was delivered to the cardholder.\",\n            \"enum\": [\"sms\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the fraud challenge.\",\n            \"enum\": [\n              \"expired\",\n              \"pending\",\n              \"rejected\",\n              \"undeliverable\",\n              \"verified\"\n            ],\n            \"type\": \"string\"\n          },\n          \"undeliverable_reason\": {\n            \"description\": \"If the challenge is not deliverable, the reason why.\",\n            \"enum\": [\"no_phone_number\", \"unsupported_phone_number\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"channel\", \"status\"],\n        \"title\": \"IssuingAuthorizationFraudChallenge\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_fuel_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"industry_product_code\": {\n            \"description\": \"[Conexxus Payment System Product Code](https://www.conexxus.org/conexxus-payment-system-product-codes) identifying the primary fuel product purchased.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"quantity_decimal\": {\n            \"description\": \"The quantity of `unit`s of fuel that was dispensed, represented as a decimal string with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of fuel that was purchased.\",\n            \"enum\": [\n              \"diesel\",\n              \"other\",\n              \"unleaded_plus\",\n              \"unleaded_regular\",\n              \"unleaded_super\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"unit\": {\n            \"description\": \"The units for `quantity_decimal`.\",\n            \"enum\": [\n              \"charging_minute\",\n              \"imperial_gallon\",\n              \"kilogram\",\n              \"kilowatt_hour\",\n              \"liter\",\n              \"other\",\n              \"pound\",\n              \"us_gallon\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"unit_cost_decimal\": {\n            \"description\": \"The cost in cents per each unit of fuel, represented as a decimal string with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationFuelData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_merchant_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"category\": {\n            \"description\": \"A categorization of the seller's type of business. See our [merchant categories guide](https://stripe.com/docs/issuing/merchant-categories) for a list of possible values.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"category_code\": {\n            \"description\": \"The merchant category code for the seller’s business\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"city\": {\n            \"description\": \"City where the seller is located\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Country where the seller is located\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Name of the seller\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network_id\": {\n            \"description\": \"Identifier assigned to the seller by the card network. Different card networks may assign different network_id fields to the same merchant.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"postal_code\": {\n            \"description\": \"Postal code where the seller is located\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"State where the seller is located\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_id\": {\n            \"description\": \"The seller's tax identification number. Currently populated for French merchants only.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terminal_id\": {\n            \"description\": \"An ID assigned by the seller to the location of the sale.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"URL provided by the merchant on a 3DS request\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"category\", \"category_code\", \"network_id\"],\n        \"title\": \"IssuingAuthorizationMerchantData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_network_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acquiring_institution_id\": {\n            \"description\": \"Identifier assigned to the acquirer by the card network. Sometimes this value is not provided by the network; in this case, the value will be `null`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"system_trace_audit_number\": {\n            \"description\": \"The System Trace Audit Number (STAN) is a 6-digit identifier assigned by the acquirer. Prefer `network_data.transaction_id` if present, unless you have special requirements.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_id\": {\n            \"description\": \"Unique identifier for the authorization assigned by the card network used to match subsequent messages, disputes, and transactions.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingAuthorizationNetworkData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_pending_request\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The additional amount Stripe will hold if the authorization is approved, in the card's [currency](https://stripe.com/docs/api#issuing_authorization_object-pending-request-currency) and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"amount_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_amount_details\"\n              }\n            ],\n            \"description\": \"Detailed breakdown of amount components. These amounts are denominated in `currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"nullable\": true\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"is_amount_controllable\": {\n            \"description\": \"If set `true`, you may provide [amount](https://stripe.com/docs/api/issuing/authorizations/approve#approve_issuing_authorization-amount) to control how much to hold for the authorization.\",\n            \"type\": \"boolean\"\n          },\n          \"merchant_amount\": {\n            \"description\": \"The amount the merchant is requesting to be authorized in the `merchant_currency`. The amount is in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"merchant_currency\": {\n            \"description\": \"The local currency the merchant is requesting to authorize.\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"network_risk_score\": {\n            \"description\": \"The card network's estimate of the likelihood that an authorization is fraudulent. Takes on values between 1 and 99.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"currency\",\n          \"is_amount_controllable\",\n          \"merchant_amount\",\n          \"merchant_currency\"\n        ],\n        \"title\": \"IssuingAuthorizationPendingRequest\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"amount_details\"]\n      },\n      \"issuing_authorization_request\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The `pending_request.amount` at the time of the request, presented in your card's currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). Stripe held this amount from your account to fund the authorization if the request was approved.\",\n            \"type\": \"integer\"\n          },\n          \"amount_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_amount_details\"\n              }\n            ],\n            \"description\": \"Detailed breakdown of amount components. These amounts are denominated in `currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"nullable\": true\n          },\n          \"approved\": {\n            \"description\": \"Whether this request was approved.\",\n            \"type\": \"boolean\"\n          },\n          \"authorization_code\": {\n            \"description\": \"A code created by Stripe which is shared with the merchant to validate the authorization. This field will be populated if the authorization message was approved. The code typically starts with the letter \\\"S\\\", followed by a six-digit number. For example, \\\"S498162\\\". Please note that the code is not guaranteed to be unique across authorizations.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"merchant_amount\": {\n            \"description\": \"The `pending_request.merchant_amount` at the time of the request, presented in the `merchant_currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"merchant_currency\": {\n            \"description\": \"The currency that was collected by the merchant and presented to the cardholder for the authorization. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"network_risk_score\": {\n            \"description\": \"The card network's estimate of the likelihood that an authorization is fraudulent. Takes on values between 1 and 99.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"reason\": {\n            \"description\": \"When an authorization is approved or declined by you or by Stripe, this field provides additional detail on the reason for the outcome.\",\n            \"enum\": [\n              \"account_disabled\",\n              \"card_active\",\n              \"card_canceled\",\n              \"card_expired\",\n              \"card_inactive\",\n              \"cardholder_blocked\",\n              \"cardholder_inactive\",\n              \"cardholder_verification_required\",\n              \"insecure_authorization_method\",\n              \"insufficient_funds\",\n              \"not_allowed\",\n              \"pin_blocked\",\n              \"spending_controls\",\n              \"suspected_fraud\",\n              \"verification_failed\",\n              \"webhook_approved\",\n              \"webhook_declined\",\n              \"webhook_error\",\n              \"webhook_timeout\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"reason_message\": {\n            \"description\": \"If the `request_history.reason` is `webhook_error` because the direct webhook response is invalid (for example, parsing errors or missing parameters), we surface a more detailed error message via this field.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"requested_at\": {\n            \"description\": \"Time when the card network received an authorization request from the acquirer in UTC. Referred to by networks as transmission time.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"approved\",\n          \"created\",\n          \"currency\",\n          \"merchant_amount\",\n          \"merchant_currency\",\n          \"reason\"\n        ],\n        \"title\": \"IssuingAuthorizationRequest\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"amount_details\"]\n      },\n      \"issuing_authorization_three_d_secure\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"result\": {\n            \"description\": \"The outcome of the 3D Secure authentication request.\",\n            \"enum\": [\n              \"attempt_acknowledged\",\n              \"authenticated\",\n              \"failed\",\n              \"required\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"result\"],\n        \"title\": \"IssuingAuthorizationThreeDSecure\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_treasury\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"received_credits\": {\n            \"description\": \"The array of [ReceivedCredits](https://stripe.com/docs/api/treasury/received_credits) associated with this authorization\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"received_debits\": {\n            \"description\": \"The array of [ReceivedDebits](https://stripe.com/docs/api/treasury/received_debits) associated with this authorization\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"transaction\": {\n            \"description\": \"The Treasury [Transaction](https://stripe.com/docs/api/treasury/transactions) associated with this authorization\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"received_credits\", \"received_debits\"],\n        \"title\": \"IssuingAuthorizationTreasury\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_authorization_verification_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address_line1_check\": {\n            \"description\": \"Whether the cardholder provided an address first line and if it matched the cardholder’s `billing.address.line1`.\",\n            \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n            \"type\": \"string\"\n          },\n          \"address_postal_code_check\": {\n            \"description\": \"Whether the cardholder provided a postal code and if it matched the cardholder’s `billing.address.postal_code`.\",\n            \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n            \"type\": \"string\"\n          },\n          \"authentication_exemption\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_authentication_exemption\"\n              }\n            ],\n            \"description\": \"The exemption applied to this authorization.\",\n            \"nullable\": true\n          },\n          \"cvc_check\": {\n            \"description\": \"Whether the cardholder provided a CVC and if it matched Stripe’s record.\",\n            \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n            \"type\": \"string\"\n          },\n          \"expiry_check\": {\n            \"description\": \"Whether the cardholder provided an expiry date and if it matched Stripe’s record.\",\n            \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n            \"type\": \"string\"\n          },\n          \"postal_code\": {\n            \"description\": \"The postal code submitted as part of the authorization used for postal code verification.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"three_d_secure\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_authorization_three_d_secure\"\n              }\n            ],\n            \"description\": \"3D Secure details.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\n          \"address_line1_check\",\n          \"address_postal_code_check\",\n          \"cvc_check\",\n          \"expiry_check\"\n        ],\n        \"title\": \"IssuingAuthorizationVerificationData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"authentication_exemption\", \"three_d_secure\"]\n      },\n      \"issuing_card_apple_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"eligible\": {\n            \"description\": \"Apple Pay Eligibility\",\n            \"type\": \"boolean\"\n          },\n          \"ineligible_reason\": {\n            \"description\": \"Reason the card is ineligible for Apple Pay\",\n            \"enum\": [\n              \"missing_agreement\",\n              \"missing_cardholder_contact\",\n              \"unsupported_region\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"eligible\"],\n        \"title\": \"IssuingCardApplePay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_card_authorization_controls\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allowed_categories\": {\n            \"description\": \"Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations to allow. All other categories will be blocked. Cannot be set with `blocked_categories`.\",\n            \"items\": {\n              \"enum\": [\n                \"ac_refrigeration_repair\",\n                \"accounting_bookkeeping_services\",\n                \"advertising_services\",\n                \"agricultural_cooperative\",\n                \"airlines_air_carriers\",\n                \"airports_flying_fields\",\n                \"ambulance_services\",\n                \"amusement_parks_carnivals\",\n                \"antique_reproductions\",\n                \"antique_shops\",\n                \"aquariums\",\n                \"architectural_surveying_services\",\n                \"art_dealers_and_galleries\",\n                \"artists_supply_and_craft_shops\",\n                \"auto_and_home_supply_stores\",\n                \"auto_body_repair_shops\",\n                \"auto_paint_shops\",\n                \"auto_service_shops\",\n                \"automated_cash_disburse\",\n                \"automated_fuel_dispensers\",\n                \"automobile_associations\",\n                \"automotive_parts_and_accessories_stores\",\n                \"automotive_tire_stores\",\n                \"bail_and_bond_payments\",\n                \"bakeries\",\n                \"bands_orchestras\",\n                \"barber_and_beauty_shops\",\n                \"betting_casino_gambling\",\n                \"bicycle_shops\",\n                \"billiard_pool_establishments\",\n                \"boat_dealers\",\n                \"boat_rentals_and_leases\",\n                \"book_stores\",\n                \"books_periodicals_and_newspapers\",\n                \"bowling_alleys\",\n                \"bus_lines\",\n                \"business_secretarial_schools\",\n                \"buying_shopping_services\",\n                \"cable_satellite_and_other_pay_television_and_radio\",\n                \"camera_and_photographic_supply_stores\",\n                \"candy_nut_and_confectionery_stores\",\n                \"car_and_truck_dealers_new_used\",\n                \"car_and_truck_dealers_used_only\",\n                \"car_rental_agencies\",\n                \"car_washes\",\n                \"carpentry_services\",\n                \"carpet_upholstery_cleaning\",\n                \"caterers\",\n                \"charitable_and_social_service_organizations_fundraising\",\n                \"chemicals_and_allied_products\",\n                \"child_care_services\",\n                \"childrens_and_infants_wear_stores\",\n                \"chiropodists_podiatrists\",\n                \"chiropractors\",\n                \"cigar_stores_and_stands\",\n                \"civic_social_fraternal_associations\",\n                \"cleaning_and_maintenance\",\n                \"clothing_rental\",\n                \"colleges_universities\",\n                \"commercial_equipment\",\n                \"commercial_footwear\",\n                \"commercial_photography_art_and_graphics\",\n                \"commuter_transport_and_ferries\",\n                \"computer_network_services\",\n                \"computer_programming\",\n                \"computer_repair\",\n                \"computer_software_stores\",\n                \"computers_peripherals_and_software\",\n                \"concrete_work_services\",\n                \"construction_materials\",\n                \"consulting_public_relations\",\n                \"correspondence_schools\",\n                \"cosmetic_stores\",\n                \"counseling_services\",\n                \"country_clubs\",\n                \"courier_services\",\n                \"court_costs\",\n                \"credit_reporting_agencies\",\n                \"cruise_lines\",\n                \"dairy_products_stores\",\n                \"dance_hall_studios_schools\",\n                \"dating_escort_services\",\n                \"dentists_orthodontists\",\n                \"department_stores\",\n                \"detective_agencies\",\n                \"digital_goods_applications\",\n                \"digital_goods_games\",\n                \"digital_goods_large_volume\",\n                \"digital_goods_media\",\n                \"direct_marketing_catalog_merchant\",\n                \"direct_marketing_combination_catalog_and_retail_merchant\",\n                \"direct_marketing_inbound_telemarketing\",\n                \"direct_marketing_insurance_services\",\n                \"direct_marketing_other\",\n                \"direct_marketing_outbound_telemarketing\",\n                \"direct_marketing_subscription\",\n                \"direct_marketing_travel\",\n                \"discount_stores\",\n                \"doctors\",\n                \"door_to_door_sales\",\n                \"drapery_window_covering_and_upholstery_stores\",\n                \"drinking_places\",\n                \"drug_stores_and_pharmacies\",\n                \"drugs_drug_proprietaries_and_druggist_sundries\",\n                \"dry_cleaners\",\n                \"durable_goods\",\n                \"duty_free_stores\",\n                \"eating_places_restaurants\",\n                \"educational_services\",\n                \"electric_razor_stores\",\n                \"electric_vehicle_charging\",\n                \"electrical_parts_and_equipment\",\n                \"electrical_services\",\n                \"electronics_repair_shops\",\n                \"electronics_stores\",\n                \"elementary_secondary_schools\",\n                \"emergency_services_gcas_visa_use_only\",\n                \"employment_temp_agencies\",\n                \"equipment_rental\",\n                \"exterminating_services\",\n                \"family_clothing_stores\",\n                \"fast_food_restaurants\",\n                \"financial_institutions\",\n                \"fines_government_administrative_entities\",\n                \"fireplace_fireplace_screens_and_accessories_stores\",\n                \"floor_covering_stores\",\n                \"florists\",\n                \"florists_supplies_nursery_stock_and_flowers\",\n                \"freezer_and_locker_meat_provisioners\",\n                \"fuel_dealers_non_automotive\",\n                \"funeral_services_crematories\",\n                \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                \"furniture_repair_refinishing\",\n                \"furriers_and_fur_shops\",\n                \"general_services\",\n                \"gift_card_novelty_and_souvenir_shops\",\n                \"glass_paint_and_wallpaper_stores\",\n                \"glassware_crystal_stores\",\n                \"golf_courses_public\",\n                \"government_licensed_horse_dog_racing_us_region_only\",\n                \"government_licensed_online_casions_online_gambling_us_region_only\",\n                \"government_owned_lotteries_non_us_region\",\n                \"government_owned_lotteries_us_region_only\",\n                \"government_services\",\n                \"grocery_stores_supermarkets\",\n                \"hardware_equipment_and_supplies\",\n                \"hardware_stores\",\n                \"health_and_beauty_spas\",\n                \"hearing_aids_sales_and_supplies\",\n                \"heating_plumbing_a_c\",\n                \"hobby_toy_and_game_shops\",\n                \"home_supply_warehouse_stores\",\n                \"hospitals\",\n                \"hotels_motels_and_resorts\",\n                \"household_appliance_stores\",\n                \"industrial_supplies\",\n                \"information_retrieval_services\",\n                \"insurance_default\",\n                \"insurance_underwriting_premiums\",\n                \"intra_company_purchases\",\n                \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                \"landscaping_services\",\n                \"laundries\",\n                \"laundry_cleaning_services\",\n                \"legal_services_attorneys\",\n                \"luggage_and_leather_goods_stores\",\n                \"lumber_building_materials_stores\",\n                \"manual_cash_disburse\",\n                \"marinas_service_and_supplies\",\n                \"marketplaces\",\n                \"masonry_stonework_and_plaster\",\n                \"massage_parlors\",\n                \"medical_and_dental_labs\",\n                \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                \"medical_services\",\n                \"membership_organizations\",\n                \"mens_and_boys_clothing_and_accessories_stores\",\n                \"mens_womens_clothing_stores\",\n                \"metal_service_centers\",\n                \"miscellaneous\",\n                \"miscellaneous_apparel_and_accessory_shops\",\n                \"miscellaneous_auto_dealers\",\n                \"miscellaneous_business_services\",\n                \"miscellaneous_food_stores\",\n                \"miscellaneous_general_merchandise\",\n                \"miscellaneous_general_services\",\n                \"miscellaneous_home_furnishing_specialty_stores\",\n                \"miscellaneous_publishing_and_printing\",\n                \"miscellaneous_recreation_services\",\n                \"miscellaneous_repair_shops\",\n                \"miscellaneous_specialty_retail\",\n                \"mobile_home_dealers\",\n                \"motion_picture_theaters\",\n                \"motor_freight_carriers_and_trucking\",\n                \"motor_homes_dealers\",\n                \"motor_vehicle_supplies_and_new_parts\",\n                \"motorcycle_shops_and_dealers\",\n                \"motorcycle_shops_dealers\",\n                \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                \"news_dealers_and_newsstands\",\n                \"non_fi_money_orders\",\n                \"non_fi_stored_value_card_purchase_load\",\n                \"nondurable_goods\",\n                \"nurseries_lawn_and_garden_supply_stores\",\n                \"nursing_personal_care\",\n                \"office_and_commercial_furniture\",\n                \"opticians_eyeglasses\",\n                \"optometrists_ophthalmologist\",\n                \"orthopedic_goods_prosthetic_devices\",\n                \"osteopaths\",\n                \"package_stores_beer_wine_and_liquor\",\n                \"paints_varnishes_and_supplies\",\n                \"parking_lots_garages\",\n                \"passenger_railways\",\n                \"pawn_shops\",\n                \"pet_shops_pet_food_and_supplies\",\n                \"petroleum_and_petroleum_products\",\n                \"photo_developing\",\n                \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                \"photographic_studios\",\n                \"picture_video_production\",\n                \"piece_goods_notions_and_other_dry_goods\",\n                \"plumbing_heating_equipment_and_supplies\",\n                \"political_organizations\",\n                \"postal_services_government_only\",\n                \"precious_stones_and_metals_watches_and_jewelry\",\n                \"professional_services\",\n                \"public_warehousing_and_storage\",\n                \"quick_copy_repro_and_blueprint\",\n                \"railroads\",\n                \"real_estate_agents_and_managers_rentals\",\n                \"record_stores\",\n                \"recreational_vehicle_rentals\",\n                \"religious_goods_stores\",\n                \"religious_organizations\",\n                \"roofing_siding_sheet_metal\",\n                \"secretarial_support_services\",\n                \"security_brokers_dealers\",\n                \"service_stations\",\n                \"sewing_needlework_fabric_and_piece_goods_stores\",\n                \"shoe_repair_hat_cleaning\",\n                \"shoe_stores\",\n                \"small_appliance_repair\",\n                \"snowmobile_dealers\",\n                \"special_trade_services\",\n                \"specialty_cleaning\",\n                \"sporting_goods_stores\",\n                \"sporting_recreation_camps\",\n                \"sports_and_riding_apparel_stores\",\n                \"sports_clubs_fields\",\n                \"stamp_and_coin_stores\",\n                \"stationary_office_supplies_printing_and_writing_paper\",\n                \"stationery_stores_office_and_school_supply_stores\",\n                \"swimming_pools_sales\",\n                \"t_ui_travel_germany\",\n                \"tailors_alterations\",\n                \"tax_payments_government_agencies\",\n                \"tax_preparation_services\",\n                \"taxicabs_limousines\",\n                \"telecommunication_equipment_and_telephone_sales\",\n                \"telecommunication_services\",\n                \"telegraph_services\",\n                \"tent_and_awning_shops\",\n                \"testing_laboratories\",\n                \"theatrical_ticket_agencies\",\n                \"timeshares\",\n                \"tire_retreading_and_repair\",\n                \"tolls_bridge_fees\",\n                \"tourist_attractions_and_exhibits\",\n                \"towing_services\",\n                \"trailer_parks_campgrounds\",\n                \"transportation_services\",\n                \"travel_agencies_tour_operators\",\n                \"truck_stop_iteration\",\n                \"truck_utility_trailer_rentals\",\n                \"typesetting_plate_making_and_related_services\",\n                \"typewriter_stores\",\n                \"u_s_federal_government_agencies_or_departments\",\n                \"uniforms_commercial_clothing\",\n                \"used_merchandise_and_secondhand_stores\",\n                \"utilities\",\n                \"variety_stores\",\n                \"veterinary_services\",\n                \"video_amusement_game_supplies\",\n                \"video_game_arcades\",\n                \"video_tape_rental_stores\",\n                \"vocational_trade_schools\",\n                \"watch_jewelry_repair\",\n                \"welding_repair\",\n                \"wholesale_clubs\",\n                \"wig_and_toupee_stores\",\n                \"wires_money_orders\",\n                \"womens_accessory_and_specialty_shops\",\n                \"womens_ready_to_wear_stores\",\n                \"wrecking_and_salvage_yards\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"allowed_merchant_countries\": {\n            \"description\": \"Array of strings containing representing countries from which authorizations will be allowed. Authorizations from merchants in all other countries will be declined. Country codes should be ISO 3166 alpha-2 country codes (e.g. `US`). Cannot be set with `blocked_merchant_countries`. Provide an empty value to unset this control.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"blocked_categories\": {\n            \"description\": \"Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations to decline. All other categories will be allowed. Cannot be set with `allowed_categories`.\",\n            \"items\": {\n              \"enum\": [\n                \"ac_refrigeration_repair\",\n                \"accounting_bookkeeping_services\",\n                \"advertising_services\",\n                \"agricultural_cooperative\",\n                \"airlines_air_carriers\",\n                \"airports_flying_fields\",\n                \"ambulance_services\",\n                \"amusement_parks_carnivals\",\n                \"antique_reproductions\",\n                \"antique_shops\",\n                \"aquariums\",\n                \"architectural_surveying_services\",\n                \"art_dealers_and_galleries\",\n                \"artists_supply_and_craft_shops\",\n                \"auto_and_home_supply_stores\",\n                \"auto_body_repair_shops\",\n                \"auto_paint_shops\",\n                \"auto_service_shops\",\n                \"automated_cash_disburse\",\n                \"automated_fuel_dispensers\",\n                \"automobile_associations\",\n                \"automotive_parts_and_accessories_stores\",\n                \"automotive_tire_stores\",\n                \"bail_and_bond_payments\",\n                \"bakeries\",\n                \"bands_orchestras\",\n                \"barber_and_beauty_shops\",\n                \"betting_casino_gambling\",\n                \"bicycle_shops\",\n                \"billiard_pool_establishments\",\n                \"boat_dealers\",\n                \"boat_rentals_and_leases\",\n                \"book_stores\",\n                \"books_periodicals_and_newspapers\",\n                \"bowling_alleys\",\n                \"bus_lines\",\n                \"business_secretarial_schools\",\n                \"buying_shopping_services\",\n                \"cable_satellite_and_other_pay_television_and_radio\",\n                \"camera_and_photographic_supply_stores\",\n                \"candy_nut_and_confectionery_stores\",\n                \"car_and_truck_dealers_new_used\",\n                \"car_and_truck_dealers_used_only\",\n                \"car_rental_agencies\",\n                \"car_washes\",\n                \"carpentry_services\",\n                \"carpet_upholstery_cleaning\",\n                \"caterers\",\n                \"charitable_and_social_service_organizations_fundraising\",\n                \"chemicals_and_allied_products\",\n                \"child_care_services\",\n                \"childrens_and_infants_wear_stores\",\n                \"chiropodists_podiatrists\",\n                \"chiropractors\",\n                \"cigar_stores_and_stands\",\n                \"civic_social_fraternal_associations\",\n                \"cleaning_and_maintenance\",\n                \"clothing_rental\",\n                \"colleges_universities\",\n                \"commercial_equipment\",\n                \"commercial_footwear\",\n                \"commercial_photography_art_and_graphics\",\n                \"commuter_transport_and_ferries\",\n                \"computer_network_services\",\n                \"computer_programming\",\n                \"computer_repair\",\n                \"computer_software_stores\",\n                \"computers_peripherals_and_software\",\n                \"concrete_work_services\",\n                \"construction_materials\",\n                \"consulting_public_relations\",\n                \"correspondence_schools\",\n                \"cosmetic_stores\",\n                \"counseling_services\",\n                \"country_clubs\",\n                \"courier_services\",\n                \"court_costs\",\n                \"credit_reporting_agencies\",\n                \"cruise_lines\",\n                \"dairy_products_stores\",\n                \"dance_hall_studios_schools\",\n                \"dating_escort_services\",\n                \"dentists_orthodontists\",\n                \"department_stores\",\n                \"detective_agencies\",\n                \"digital_goods_applications\",\n                \"digital_goods_games\",\n                \"digital_goods_large_volume\",\n                \"digital_goods_media\",\n                \"direct_marketing_catalog_merchant\",\n                \"direct_marketing_combination_catalog_and_retail_merchant\",\n                \"direct_marketing_inbound_telemarketing\",\n                \"direct_marketing_insurance_services\",\n                \"direct_marketing_other\",\n                \"direct_marketing_outbound_telemarketing\",\n                \"direct_marketing_subscription\",\n                \"direct_marketing_travel\",\n                \"discount_stores\",\n                \"doctors\",\n                \"door_to_door_sales\",\n                \"drapery_window_covering_and_upholstery_stores\",\n                \"drinking_places\",\n                \"drug_stores_and_pharmacies\",\n                \"drugs_drug_proprietaries_and_druggist_sundries\",\n                \"dry_cleaners\",\n                \"durable_goods\",\n                \"duty_free_stores\",\n                \"eating_places_restaurants\",\n                \"educational_services\",\n                \"electric_razor_stores\",\n                \"electric_vehicle_charging\",\n                \"electrical_parts_and_equipment\",\n                \"electrical_services\",\n                \"electronics_repair_shops\",\n                \"electronics_stores\",\n                \"elementary_secondary_schools\",\n                \"emergency_services_gcas_visa_use_only\",\n                \"employment_temp_agencies\",\n                \"equipment_rental\",\n                \"exterminating_services\",\n                \"family_clothing_stores\",\n                \"fast_food_restaurants\",\n                \"financial_institutions\",\n                \"fines_government_administrative_entities\",\n                \"fireplace_fireplace_screens_and_accessories_stores\",\n                \"floor_covering_stores\",\n                \"florists\",\n                \"florists_supplies_nursery_stock_and_flowers\",\n                \"freezer_and_locker_meat_provisioners\",\n                \"fuel_dealers_non_automotive\",\n                \"funeral_services_crematories\",\n                \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                \"furniture_repair_refinishing\",\n                \"furriers_and_fur_shops\",\n                \"general_services\",\n                \"gift_card_novelty_and_souvenir_shops\",\n                \"glass_paint_and_wallpaper_stores\",\n                \"glassware_crystal_stores\",\n                \"golf_courses_public\",\n                \"government_licensed_horse_dog_racing_us_region_only\",\n                \"government_licensed_online_casions_online_gambling_us_region_only\",\n                \"government_owned_lotteries_non_us_region\",\n                \"government_owned_lotteries_us_region_only\",\n                \"government_services\",\n                \"grocery_stores_supermarkets\",\n                \"hardware_equipment_and_supplies\",\n                \"hardware_stores\",\n                \"health_and_beauty_spas\",\n                \"hearing_aids_sales_and_supplies\",\n                \"heating_plumbing_a_c\",\n                \"hobby_toy_and_game_shops\",\n                \"home_supply_warehouse_stores\",\n                \"hospitals\",\n                \"hotels_motels_and_resorts\",\n                \"household_appliance_stores\",\n                \"industrial_supplies\",\n                \"information_retrieval_services\",\n                \"insurance_default\",\n                \"insurance_underwriting_premiums\",\n                \"intra_company_purchases\",\n                \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                \"landscaping_services\",\n                \"laundries\",\n                \"laundry_cleaning_services\",\n                \"legal_services_attorneys\",\n                \"luggage_and_leather_goods_stores\",\n                \"lumber_building_materials_stores\",\n                \"manual_cash_disburse\",\n                \"marinas_service_and_supplies\",\n                \"marketplaces\",\n                \"masonry_stonework_and_plaster\",\n                \"massage_parlors\",\n                \"medical_and_dental_labs\",\n                \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                \"medical_services\",\n                \"membership_organizations\",\n                \"mens_and_boys_clothing_and_accessories_stores\",\n                \"mens_womens_clothing_stores\",\n                \"metal_service_centers\",\n                \"miscellaneous\",\n                \"miscellaneous_apparel_and_accessory_shops\",\n                \"miscellaneous_auto_dealers\",\n                \"miscellaneous_business_services\",\n                \"miscellaneous_food_stores\",\n                \"miscellaneous_general_merchandise\",\n                \"miscellaneous_general_services\",\n                \"miscellaneous_home_furnishing_specialty_stores\",\n                \"miscellaneous_publishing_and_printing\",\n                \"miscellaneous_recreation_services\",\n                \"miscellaneous_repair_shops\",\n                \"miscellaneous_specialty_retail\",\n                \"mobile_home_dealers\",\n                \"motion_picture_theaters\",\n                \"motor_freight_carriers_and_trucking\",\n                \"motor_homes_dealers\",\n                \"motor_vehicle_supplies_and_new_parts\",\n                \"motorcycle_shops_and_dealers\",\n                \"motorcycle_shops_dealers\",\n                \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                \"news_dealers_and_newsstands\",\n                \"non_fi_money_orders\",\n                \"non_fi_stored_value_card_purchase_load\",\n                \"nondurable_goods\",\n                \"nurseries_lawn_and_garden_supply_stores\",\n                \"nursing_personal_care\",\n                \"office_and_commercial_furniture\",\n                \"opticians_eyeglasses\",\n                \"optometrists_ophthalmologist\",\n                \"orthopedic_goods_prosthetic_devices\",\n                \"osteopaths\",\n                \"package_stores_beer_wine_and_liquor\",\n                \"paints_varnishes_and_supplies\",\n                \"parking_lots_garages\",\n                \"passenger_railways\",\n                \"pawn_shops\",\n                \"pet_shops_pet_food_and_supplies\",\n                \"petroleum_and_petroleum_products\",\n                \"photo_developing\",\n                \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                \"photographic_studios\",\n                \"picture_video_production\",\n                \"piece_goods_notions_and_other_dry_goods\",\n                \"plumbing_heating_equipment_and_supplies\",\n                \"political_organizations\",\n                \"postal_services_government_only\",\n                \"precious_stones_and_metals_watches_and_jewelry\",\n                \"professional_services\",\n                \"public_warehousing_and_storage\",\n                \"quick_copy_repro_and_blueprint\",\n                \"railroads\",\n                \"real_estate_agents_and_managers_rentals\",\n                \"record_stores\",\n                \"recreational_vehicle_rentals\",\n                \"religious_goods_stores\",\n                \"religious_organizations\",\n                \"roofing_siding_sheet_metal\",\n                \"secretarial_support_services\",\n                \"security_brokers_dealers\",\n                \"service_stations\",\n                \"sewing_needlework_fabric_and_piece_goods_stores\",\n                \"shoe_repair_hat_cleaning\",\n                \"shoe_stores\",\n                \"small_appliance_repair\",\n                \"snowmobile_dealers\",\n                \"special_trade_services\",\n                \"specialty_cleaning\",\n                \"sporting_goods_stores\",\n                \"sporting_recreation_camps\",\n                \"sports_and_riding_apparel_stores\",\n                \"sports_clubs_fields\",\n                \"stamp_and_coin_stores\",\n                \"stationary_office_supplies_printing_and_writing_paper\",\n                \"stationery_stores_office_and_school_supply_stores\",\n                \"swimming_pools_sales\",\n                \"t_ui_travel_germany\",\n                \"tailors_alterations\",\n                \"tax_payments_government_agencies\",\n                \"tax_preparation_services\",\n                \"taxicabs_limousines\",\n                \"telecommunication_equipment_and_telephone_sales\",\n                \"telecommunication_services\",\n                \"telegraph_services\",\n                \"tent_and_awning_shops\",\n                \"testing_laboratories\",\n                \"theatrical_ticket_agencies\",\n                \"timeshares\",\n                \"tire_retreading_and_repair\",\n                \"tolls_bridge_fees\",\n                \"tourist_attractions_and_exhibits\",\n                \"towing_services\",\n                \"trailer_parks_campgrounds\",\n                \"transportation_services\",\n                \"travel_agencies_tour_operators\",\n                \"truck_stop_iteration\",\n                \"truck_utility_trailer_rentals\",\n                \"typesetting_plate_making_and_related_services\",\n                \"typewriter_stores\",\n                \"u_s_federal_government_agencies_or_departments\",\n                \"uniforms_commercial_clothing\",\n                \"used_merchandise_and_secondhand_stores\",\n                \"utilities\",\n                \"variety_stores\",\n                \"veterinary_services\",\n                \"video_amusement_game_supplies\",\n                \"video_game_arcades\",\n                \"video_tape_rental_stores\",\n                \"vocational_trade_schools\",\n                \"watch_jewelry_repair\",\n                \"welding_repair\",\n                \"wholesale_clubs\",\n                \"wig_and_toupee_stores\",\n                \"wires_money_orders\",\n                \"womens_accessory_and_specialty_shops\",\n                \"womens_ready_to_wear_stores\",\n                \"wrecking_and_salvage_yards\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"blocked_merchant_countries\": {\n            \"description\": \"Array of strings containing representing countries from which authorizations will be declined. Country codes should be ISO 3166 alpha-2 country codes (e.g. `US`). Cannot be set with `allowed_merchant_countries`. Provide an empty value to unset this control.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"spending_limits\": {\n            \"description\": \"Limit spending with amount-based rules that apply across any cards this card replaced (i.e., its `replacement_for` card and _that_ card's `replacement_for` card, up the chain).\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/issuing_card_spending_limit\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"spending_limits_currency\": {\n            \"description\": \"Currency of the amounts within `spending_limits`. Always the same as the currency of the card.\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingCardAuthorizationControls\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"spending_limits\"]\n      },\n      \"issuing_card_google_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"eligible\": {\n            \"description\": \"Google Pay Eligibility\",\n            \"type\": \"boolean\"\n          },\n          \"ineligible_reason\": {\n            \"description\": \"Reason the card is ineligible for Google Pay\",\n            \"enum\": [\n              \"missing_agreement\",\n              \"missing_cardholder_contact\",\n              \"unsupported_region\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"eligible\"],\n        \"title\": \"IssuingCardGooglePay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_card_shipping\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"address_validation\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_card_shipping_address_validation\"\n              }\n            ],\n            \"description\": \"Address validation details for the shipment.\",\n            \"nullable\": true\n          },\n          \"carrier\": {\n            \"description\": \"The delivery company that shipped a card.\",\n            \"enum\": [\"dhl\", \"fedex\", \"royal_mail\", \"usps\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customs\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_card_shipping_customs\"\n              }\n            ],\n            \"description\": \"Additional information that may be required for clearing customs.\",\n            \"nullable\": true\n          },\n          \"eta\": {\n            \"description\": \"A unix timestamp representing a best estimate of when the card will be delivered.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"name\": {\n            \"description\": \"Recipient name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"phone_number\": {\n            \"description\": \"The phone number of the receiver of the shipment. Our courier partners will use this number to contact you in the event of card delivery issues. For individual shipments to the EU/UK, if this field is empty, we will provide them with the phone number provided when the cardholder was initially created.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"require_signature\": {\n            \"description\": \"Whether a signature is required for card delivery. This feature is only supported for US users. Standard shipping service does not support signature on delivery. The default value for standard shipping service is false and for express and priority services is true.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"service\": {\n            \"description\": \"Shipment service, such as `standard` or `express`.\",\n            \"enum\": [\"express\", \"priority\", \"standard\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"status\": {\n            \"description\": \"The delivery status of the card.\",\n            \"enum\": [\n              \"canceled\",\n              \"delivered\",\n              \"failure\",\n              \"pending\",\n              \"returned\",\n              \"shipped\",\n              \"submitted\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tracking_number\": {\n            \"description\": \"A tracking number for a card shipment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tracking_url\": {\n            \"description\": \"A link to the shipping carrier's site where you can view detailed information about a card shipment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Packaging options.\",\n            \"enum\": [\"bulk\", \"individual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"address\", \"name\", \"service\", \"type\"],\n        \"title\": \"IssuingCardShipping\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\", \"address_validation\", \"customs\"]\n      },\n      \"issuing_card_shipping_address_validation\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mode\": {\n            \"description\": \"The address validation capabilities to use.\",\n            \"enum\": [\n              \"disabled\",\n              \"normalization_only\",\n              \"validation_and_normalization\"\n            ],\n            \"type\": \"string\"\n          },\n          \"normalized_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"The normalized shipping address.\",\n            \"nullable\": true\n          },\n          \"result\": {\n            \"description\": \"The validation result for the shipping address.\",\n            \"enum\": [\n              \"indeterminate\",\n              \"likely_deliverable\",\n              \"likely_undeliverable\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"mode\"],\n        \"title\": \"IssuingCardShippingAddressValidation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"normalized_address\"]\n      },\n      \"issuing_card_shipping_customs\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"eori_number\": {\n            \"description\": \"A registration number used for customs in Europe. See [https://www.gov.uk/eori](https://www.gov.uk/eori) for the UK and [https://ec.europa.eu/taxation_customs/business/customs-procedures-import-and-export/customs-procedures/economic-operators-registration-and-identification-number-eori_en](https://ec.europa.eu/taxation_customs/business/customs-procedures-import-and-export/customs-procedures/economic-operators-registration-and-identification-number-eori_en) for the EU.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingCardShippingCustoms\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_card_spending_limit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Maximum amount allowed to spend per interval. This amount is in the card's currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"categories\": {\n            \"description\": \"Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) this limit applies to. Omitting this field will apply the limit to all categories.\",\n            \"items\": {\n              \"enum\": [\n                \"ac_refrigeration_repair\",\n                \"accounting_bookkeeping_services\",\n                \"advertising_services\",\n                \"agricultural_cooperative\",\n                \"airlines_air_carriers\",\n                \"airports_flying_fields\",\n                \"ambulance_services\",\n                \"amusement_parks_carnivals\",\n                \"antique_reproductions\",\n                \"antique_shops\",\n                \"aquariums\",\n                \"architectural_surveying_services\",\n                \"art_dealers_and_galleries\",\n                \"artists_supply_and_craft_shops\",\n                \"auto_and_home_supply_stores\",\n                \"auto_body_repair_shops\",\n                \"auto_paint_shops\",\n                \"auto_service_shops\",\n                \"automated_cash_disburse\",\n                \"automated_fuel_dispensers\",\n                \"automobile_associations\",\n                \"automotive_parts_and_accessories_stores\",\n                \"automotive_tire_stores\",\n                \"bail_and_bond_payments\",\n                \"bakeries\",\n                \"bands_orchestras\",\n                \"barber_and_beauty_shops\",\n                \"betting_casino_gambling\",\n                \"bicycle_shops\",\n                \"billiard_pool_establishments\",\n                \"boat_dealers\",\n                \"boat_rentals_and_leases\",\n                \"book_stores\",\n                \"books_periodicals_and_newspapers\",\n                \"bowling_alleys\",\n                \"bus_lines\",\n                \"business_secretarial_schools\",\n                \"buying_shopping_services\",\n                \"cable_satellite_and_other_pay_television_and_radio\",\n                \"camera_and_photographic_supply_stores\",\n                \"candy_nut_and_confectionery_stores\",\n                \"car_and_truck_dealers_new_used\",\n                \"car_and_truck_dealers_used_only\",\n                \"car_rental_agencies\",\n                \"car_washes\",\n                \"carpentry_services\",\n                \"carpet_upholstery_cleaning\",\n                \"caterers\",\n                \"charitable_and_social_service_organizations_fundraising\",\n                \"chemicals_and_allied_products\",\n                \"child_care_services\",\n                \"childrens_and_infants_wear_stores\",\n                \"chiropodists_podiatrists\",\n                \"chiropractors\",\n                \"cigar_stores_and_stands\",\n                \"civic_social_fraternal_associations\",\n                \"cleaning_and_maintenance\",\n                \"clothing_rental\",\n                \"colleges_universities\",\n                \"commercial_equipment\",\n                \"commercial_footwear\",\n                \"commercial_photography_art_and_graphics\",\n                \"commuter_transport_and_ferries\",\n                \"computer_network_services\",\n                \"computer_programming\",\n                \"computer_repair\",\n                \"computer_software_stores\",\n                \"computers_peripherals_and_software\",\n                \"concrete_work_services\",\n                \"construction_materials\",\n                \"consulting_public_relations\",\n                \"correspondence_schools\",\n                \"cosmetic_stores\",\n                \"counseling_services\",\n                \"country_clubs\",\n                \"courier_services\",\n                \"court_costs\",\n                \"credit_reporting_agencies\",\n                \"cruise_lines\",\n                \"dairy_products_stores\",\n                \"dance_hall_studios_schools\",\n                \"dating_escort_services\",\n                \"dentists_orthodontists\",\n                \"department_stores\",\n                \"detective_agencies\",\n                \"digital_goods_applications\",\n                \"digital_goods_games\",\n                \"digital_goods_large_volume\",\n                \"digital_goods_media\",\n                \"direct_marketing_catalog_merchant\",\n                \"direct_marketing_combination_catalog_and_retail_merchant\",\n                \"direct_marketing_inbound_telemarketing\",\n                \"direct_marketing_insurance_services\",\n                \"direct_marketing_other\",\n                \"direct_marketing_outbound_telemarketing\",\n                \"direct_marketing_subscription\",\n                \"direct_marketing_travel\",\n                \"discount_stores\",\n                \"doctors\",\n                \"door_to_door_sales\",\n                \"drapery_window_covering_and_upholstery_stores\",\n                \"drinking_places\",\n                \"drug_stores_and_pharmacies\",\n                \"drugs_drug_proprietaries_and_druggist_sundries\",\n                \"dry_cleaners\",\n                \"durable_goods\",\n                \"duty_free_stores\",\n                \"eating_places_restaurants\",\n                \"educational_services\",\n                \"electric_razor_stores\",\n                \"electric_vehicle_charging\",\n                \"electrical_parts_and_equipment\",\n                \"electrical_services\",\n                \"electronics_repair_shops\",\n                \"electronics_stores\",\n                \"elementary_secondary_schools\",\n                \"emergency_services_gcas_visa_use_only\",\n                \"employment_temp_agencies\",\n                \"equipment_rental\",\n                \"exterminating_services\",\n                \"family_clothing_stores\",\n                \"fast_food_restaurants\",\n                \"financial_institutions\",\n                \"fines_government_administrative_entities\",\n                \"fireplace_fireplace_screens_and_accessories_stores\",\n                \"floor_covering_stores\",\n                \"florists\",\n                \"florists_supplies_nursery_stock_and_flowers\",\n                \"freezer_and_locker_meat_provisioners\",\n                \"fuel_dealers_non_automotive\",\n                \"funeral_services_crematories\",\n                \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                \"furniture_repair_refinishing\",\n                \"furriers_and_fur_shops\",\n                \"general_services\",\n                \"gift_card_novelty_and_souvenir_shops\",\n                \"glass_paint_and_wallpaper_stores\",\n                \"glassware_crystal_stores\",\n                \"golf_courses_public\",\n                \"government_licensed_horse_dog_racing_us_region_only\",\n                \"government_licensed_online_casions_online_gambling_us_region_only\",\n                \"government_owned_lotteries_non_us_region\",\n                \"government_owned_lotteries_us_region_only\",\n                \"government_services\",\n                \"grocery_stores_supermarkets\",\n                \"hardware_equipment_and_supplies\",\n                \"hardware_stores\",\n                \"health_and_beauty_spas\",\n                \"hearing_aids_sales_and_supplies\",\n                \"heating_plumbing_a_c\",\n                \"hobby_toy_and_game_shops\",\n                \"home_supply_warehouse_stores\",\n                \"hospitals\",\n                \"hotels_motels_and_resorts\",\n                \"household_appliance_stores\",\n                \"industrial_supplies\",\n                \"information_retrieval_services\",\n                \"insurance_default\",\n                \"insurance_underwriting_premiums\",\n                \"intra_company_purchases\",\n                \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                \"landscaping_services\",\n                \"laundries\",\n                \"laundry_cleaning_services\",\n                \"legal_services_attorneys\",\n                \"luggage_and_leather_goods_stores\",\n                \"lumber_building_materials_stores\",\n                \"manual_cash_disburse\",\n                \"marinas_service_and_supplies\",\n                \"marketplaces\",\n                \"masonry_stonework_and_plaster\",\n                \"massage_parlors\",\n                \"medical_and_dental_labs\",\n                \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                \"medical_services\",\n                \"membership_organizations\",\n                \"mens_and_boys_clothing_and_accessories_stores\",\n                \"mens_womens_clothing_stores\",\n                \"metal_service_centers\",\n                \"miscellaneous\",\n                \"miscellaneous_apparel_and_accessory_shops\",\n                \"miscellaneous_auto_dealers\",\n                \"miscellaneous_business_services\",\n                \"miscellaneous_food_stores\",\n                \"miscellaneous_general_merchandise\",\n                \"miscellaneous_general_services\",\n                \"miscellaneous_home_furnishing_specialty_stores\",\n                \"miscellaneous_publishing_and_printing\",\n                \"miscellaneous_recreation_services\",\n                \"miscellaneous_repair_shops\",\n                \"miscellaneous_specialty_retail\",\n                \"mobile_home_dealers\",\n                \"motion_picture_theaters\",\n                \"motor_freight_carriers_and_trucking\",\n                \"motor_homes_dealers\",\n                \"motor_vehicle_supplies_and_new_parts\",\n                \"motorcycle_shops_and_dealers\",\n                \"motorcycle_shops_dealers\",\n                \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                \"news_dealers_and_newsstands\",\n                \"non_fi_money_orders\",\n                \"non_fi_stored_value_card_purchase_load\",\n                \"nondurable_goods\",\n                \"nurseries_lawn_and_garden_supply_stores\",\n                \"nursing_personal_care\",\n                \"office_and_commercial_furniture\",\n                \"opticians_eyeglasses\",\n                \"optometrists_ophthalmologist\",\n                \"orthopedic_goods_prosthetic_devices\",\n                \"osteopaths\",\n                \"package_stores_beer_wine_and_liquor\",\n                \"paints_varnishes_and_supplies\",\n                \"parking_lots_garages\",\n                \"passenger_railways\",\n                \"pawn_shops\",\n                \"pet_shops_pet_food_and_supplies\",\n                \"petroleum_and_petroleum_products\",\n                \"photo_developing\",\n                \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                \"photographic_studios\",\n                \"picture_video_production\",\n                \"piece_goods_notions_and_other_dry_goods\",\n                \"plumbing_heating_equipment_and_supplies\",\n                \"political_organizations\",\n                \"postal_services_government_only\",\n                \"precious_stones_and_metals_watches_and_jewelry\",\n                \"professional_services\",\n                \"public_warehousing_and_storage\",\n                \"quick_copy_repro_and_blueprint\",\n                \"railroads\",\n                \"real_estate_agents_and_managers_rentals\",\n                \"record_stores\",\n                \"recreational_vehicle_rentals\",\n                \"religious_goods_stores\",\n                \"religious_organizations\",\n                \"roofing_siding_sheet_metal\",\n                \"secretarial_support_services\",\n                \"security_brokers_dealers\",\n                \"service_stations\",\n                \"sewing_needlework_fabric_and_piece_goods_stores\",\n                \"shoe_repair_hat_cleaning\",\n                \"shoe_stores\",\n                \"small_appliance_repair\",\n                \"snowmobile_dealers\",\n                \"special_trade_services\",\n                \"specialty_cleaning\",\n                \"sporting_goods_stores\",\n                \"sporting_recreation_camps\",\n                \"sports_and_riding_apparel_stores\",\n                \"sports_clubs_fields\",\n                \"stamp_and_coin_stores\",\n                \"stationary_office_supplies_printing_and_writing_paper\",\n                \"stationery_stores_office_and_school_supply_stores\",\n                \"swimming_pools_sales\",\n                \"t_ui_travel_germany\",\n                \"tailors_alterations\",\n                \"tax_payments_government_agencies\",\n                \"tax_preparation_services\",\n                \"taxicabs_limousines\",\n                \"telecommunication_equipment_and_telephone_sales\",\n                \"telecommunication_services\",\n                \"telegraph_services\",\n                \"tent_and_awning_shops\",\n                \"testing_laboratories\",\n                \"theatrical_ticket_agencies\",\n                \"timeshares\",\n                \"tire_retreading_and_repair\",\n                \"tolls_bridge_fees\",\n                \"tourist_attractions_and_exhibits\",\n                \"towing_services\",\n                \"trailer_parks_campgrounds\",\n                \"transportation_services\",\n                \"travel_agencies_tour_operators\",\n                \"truck_stop_iteration\",\n                \"truck_utility_trailer_rentals\",\n                \"typesetting_plate_making_and_related_services\",\n                \"typewriter_stores\",\n                \"u_s_federal_government_agencies_or_departments\",\n                \"uniforms_commercial_clothing\",\n                \"used_merchandise_and_secondhand_stores\",\n                \"utilities\",\n                \"variety_stores\",\n                \"veterinary_services\",\n                \"video_amusement_game_supplies\",\n                \"video_game_arcades\",\n                \"video_tape_rental_stores\",\n                \"vocational_trade_schools\",\n                \"watch_jewelry_repair\",\n                \"welding_repair\",\n                \"wholesale_clubs\",\n                \"wig_and_toupee_stores\",\n                \"wires_money_orders\",\n                \"womens_accessory_and_specialty_shops\",\n                \"womens_ready_to_wear_stores\",\n                \"wrecking_and_salvage_yards\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"interval\": {\n            \"description\": \"Interval (or event) to which the amount applies.\",\n            \"enum\": [\n              \"all_time\",\n              \"daily\",\n              \"monthly\",\n              \"per_authorization\",\n              \"weekly\",\n              \"yearly\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"interval\"],\n        \"title\": \"IssuingCardSpendingLimit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_card_wallets\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"apple_pay\": {\n            \"$ref\": \"#/components/schemas/issuing_card_apple_pay\"\n          },\n          \"google_pay\": {\n            \"$ref\": \"#/components/schemas/issuing_card_google_pay\"\n          },\n          \"primary_account_identifier\": {\n            \"description\": \"Unique identifier for a card used with digital wallets\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"apple_pay\", \"google_pay\"],\n        \"title\": \"IssuingCardWallets\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"apple_pay\", \"google_pay\"]\n      },\n      \"issuing_cardholder_address\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          }\n        },\n        \"required\": [\"address\"],\n        \"title\": \"IssuingCardholderAddress\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"issuing_cardholder_authorization_controls\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allowed_categories\": {\n            \"description\": \"Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations to allow. All other categories will be blocked. Cannot be set with `blocked_categories`.\",\n            \"items\": {\n              \"enum\": [\n                \"ac_refrigeration_repair\",\n                \"accounting_bookkeeping_services\",\n                \"advertising_services\",\n                \"agricultural_cooperative\",\n                \"airlines_air_carriers\",\n                \"airports_flying_fields\",\n                \"ambulance_services\",\n                \"amusement_parks_carnivals\",\n                \"antique_reproductions\",\n                \"antique_shops\",\n                \"aquariums\",\n                \"architectural_surveying_services\",\n                \"art_dealers_and_galleries\",\n                \"artists_supply_and_craft_shops\",\n                \"auto_and_home_supply_stores\",\n                \"auto_body_repair_shops\",\n                \"auto_paint_shops\",\n                \"auto_service_shops\",\n                \"automated_cash_disburse\",\n                \"automated_fuel_dispensers\",\n                \"automobile_associations\",\n                \"automotive_parts_and_accessories_stores\",\n                \"automotive_tire_stores\",\n                \"bail_and_bond_payments\",\n                \"bakeries\",\n                \"bands_orchestras\",\n                \"barber_and_beauty_shops\",\n                \"betting_casino_gambling\",\n                \"bicycle_shops\",\n                \"billiard_pool_establishments\",\n                \"boat_dealers\",\n                \"boat_rentals_and_leases\",\n                \"book_stores\",\n                \"books_periodicals_and_newspapers\",\n                \"bowling_alleys\",\n                \"bus_lines\",\n                \"business_secretarial_schools\",\n                \"buying_shopping_services\",\n                \"cable_satellite_and_other_pay_television_and_radio\",\n                \"camera_and_photographic_supply_stores\",\n                \"candy_nut_and_confectionery_stores\",\n                \"car_and_truck_dealers_new_used\",\n                \"car_and_truck_dealers_used_only\",\n                \"car_rental_agencies\",\n                \"car_washes\",\n                \"carpentry_services\",\n                \"carpet_upholstery_cleaning\",\n                \"caterers\",\n                \"charitable_and_social_service_organizations_fundraising\",\n                \"chemicals_and_allied_products\",\n                \"child_care_services\",\n                \"childrens_and_infants_wear_stores\",\n                \"chiropodists_podiatrists\",\n                \"chiropractors\",\n                \"cigar_stores_and_stands\",\n                \"civic_social_fraternal_associations\",\n                \"cleaning_and_maintenance\",\n                \"clothing_rental\",\n                \"colleges_universities\",\n                \"commercial_equipment\",\n                \"commercial_footwear\",\n                \"commercial_photography_art_and_graphics\",\n                \"commuter_transport_and_ferries\",\n                \"computer_network_services\",\n                \"computer_programming\",\n                \"computer_repair\",\n                \"computer_software_stores\",\n                \"computers_peripherals_and_software\",\n                \"concrete_work_services\",\n                \"construction_materials\",\n                \"consulting_public_relations\",\n                \"correspondence_schools\",\n                \"cosmetic_stores\",\n                \"counseling_services\",\n                \"country_clubs\",\n                \"courier_services\",\n                \"court_costs\",\n                \"credit_reporting_agencies\",\n                \"cruise_lines\",\n                \"dairy_products_stores\",\n                \"dance_hall_studios_schools\",\n                \"dating_escort_services\",\n                \"dentists_orthodontists\",\n                \"department_stores\",\n                \"detective_agencies\",\n                \"digital_goods_applications\",\n                \"digital_goods_games\",\n                \"digital_goods_large_volume\",\n                \"digital_goods_media\",\n                \"direct_marketing_catalog_merchant\",\n                \"direct_marketing_combination_catalog_and_retail_merchant\",\n                \"direct_marketing_inbound_telemarketing\",\n                \"direct_marketing_insurance_services\",\n                \"direct_marketing_other\",\n                \"direct_marketing_outbound_telemarketing\",\n                \"direct_marketing_subscription\",\n                \"direct_marketing_travel\",\n                \"discount_stores\",\n                \"doctors\",\n                \"door_to_door_sales\",\n                \"drapery_window_covering_and_upholstery_stores\",\n                \"drinking_places\",\n                \"drug_stores_and_pharmacies\",\n                \"drugs_drug_proprietaries_and_druggist_sundries\",\n                \"dry_cleaners\",\n                \"durable_goods\",\n                \"duty_free_stores\",\n                \"eating_places_restaurants\",\n                \"educational_services\",\n                \"electric_razor_stores\",\n                \"electric_vehicle_charging\",\n                \"electrical_parts_and_equipment\",\n                \"electrical_services\",\n                \"electronics_repair_shops\",\n                \"electronics_stores\",\n                \"elementary_secondary_schools\",\n                \"emergency_services_gcas_visa_use_only\",\n                \"employment_temp_agencies\",\n                \"equipment_rental\",\n                \"exterminating_services\",\n                \"family_clothing_stores\",\n                \"fast_food_restaurants\",\n                \"financial_institutions\",\n                \"fines_government_administrative_entities\",\n                \"fireplace_fireplace_screens_and_accessories_stores\",\n                \"floor_covering_stores\",\n                \"florists\",\n                \"florists_supplies_nursery_stock_and_flowers\",\n                \"freezer_and_locker_meat_provisioners\",\n                \"fuel_dealers_non_automotive\",\n                \"funeral_services_crematories\",\n                \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                \"furniture_repair_refinishing\",\n                \"furriers_and_fur_shops\",\n                \"general_services\",\n                \"gift_card_novelty_and_souvenir_shops\",\n                \"glass_paint_and_wallpaper_stores\",\n                \"glassware_crystal_stores\",\n                \"golf_courses_public\",\n                \"government_licensed_horse_dog_racing_us_region_only\",\n                \"government_licensed_online_casions_online_gambling_us_region_only\",\n                \"government_owned_lotteries_non_us_region\",\n                \"government_owned_lotteries_us_region_only\",\n                \"government_services\",\n                \"grocery_stores_supermarkets\",\n                \"hardware_equipment_and_supplies\",\n                \"hardware_stores\",\n                \"health_and_beauty_spas\",\n                \"hearing_aids_sales_and_supplies\",\n                \"heating_plumbing_a_c\",\n                \"hobby_toy_and_game_shops\",\n                \"home_supply_warehouse_stores\",\n                \"hospitals\",\n                \"hotels_motels_and_resorts\",\n                \"household_appliance_stores\",\n                \"industrial_supplies\",\n                \"information_retrieval_services\",\n                \"insurance_default\",\n                \"insurance_underwriting_premiums\",\n                \"intra_company_purchases\",\n                \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                \"landscaping_services\",\n                \"laundries\",\n                \"laundry_cleaning_services\",\n                \"legal_services_attorneys\",\n                \"luggage_and_leather_goods_stores\",\n                \"lumber_building_materials_stores\",\n                \"manual_cash_disburse\",\n                \"marinas_service_and_supplies\",\n                \"marketplaces\",\n                \"masonry_stonework_and_plaster\",\n                \"massage_parlors\",\n                \"medical_and_dental_labs\",\n                \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                \"medical_services\",\n                \"membership_organizations\",\n                \"mens_and_boys_clothing_and_accessories_stores\",\n                \"mens_womens_clothing_stores\",\n                \"metal_service_centers\",\n                \"miscellaneous\",\n                \"miscellaneous_apparel_and_accessory_shops\",\n                \"miscellaneous_auto_dealers\",\n                \"miscellaneous_business_services\",\n                \"miscellaneous_food_stores\",\n                \"miscellaneous_general_merchandise\",\n                \"miscellaneous_general_services\",\n                \"miscellaneous_home_furnishing_specialty_stores\",\n                \"miscellaneous_publishing_and_printing\",\n                \"miscellaneous_recreation_services\",\n                \"miscellaneous_repair_shops\",\n                \"miscellaneous_specialty_retail\",\n                \"mobile_home_dealers\",\n                \"motion_picture_theaters\",\n                \"motor_freight_carriers_and_trucking\",\n                \"motor_homes_dealers\",\n                \"motor_vehicle_supplies_and_new_parts\",\n                \"motorcycle_shops_and_dealers\",\n                \"motorcycle_shops_dealers\",\n                \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                \"news_dealers_and_newsstands\",\n                \"non_fi_money_orders\",\n                \"non_fi_stored_value_card_purchase_load\",\n                \"nondurable_goods\",\n                \"nurseries_lawn_and_garden_supply_stores\",\n                \"nursing_personal_care\",\n                \"office_and_commercial_furniture\",\n                \"opticians_eyeglasses\",\n                \"optometrists_ophthalmologist\",\n                \"orthopedic_goods_prosthetic_devices\",\n                \"osteopaths\",\n                \"package_stores_beer_wine_and_liquor\",\n                \"paints_varnishes_and_supplies\",\n                \"parking_lots_garages\",\n                \"passenger_railways\",\n                \"pawn_shops\",\n                \"pet_shops_pet_food_and_supplies\",\n                \"petroleum_and_petroleum_products\",\n                \"photo_developing\",\n                \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                \"photographic_studios\",\n                \"picture_video_production\",\n                \"piece_goods_notions_and_other_dry_goods\",\n                \"plumbing_heating_equipment_and_supplies\",\n                \"political_organizations\",\n                \"postal_services_government_only\",\n                \"precious_stones_and_metals_watches_and_jewelry\",\n                \"professional_services\",\n                \"public_warehousing_and_storage\",\n                \"quick_copy_repro_and_blueprint\",\n                \"railroads\",\n                \"real_estate_agents_and_managers_rentals\",\n                \"record_stores\",\n                \"recreational_vehicle_rentals\",\n                \"religious_goods_stores\",\n                \"religious_organizations\",\n                \"roofing_siding_sheet_metal\",\n                \"secretarial_support_services\",\n                \"security_brokers_dealers\",\n                \"service_stations\",\n                \"sewing_needlework_fabric_and_piece_goods_stores\",\n                \"shoe_repair_hat_cleaning\",\n                \"shoe_stores\",\n                \"small_appliance_repair\",\n                \"snowmobile_dealers\",\n                \"special_trade_services\",\n                \"specialty_cleaning\",\n                \"sporting_goods_stores\",\n                \"sporting_recreation_camps\",\n                \"sports_and_riding_apparel_stores\",\n                \"sports_clubs_fields\",\n                \"stamp_and_coin_stores\",\n                \"stationary_office_supplies_printing_and_writing_paper\",\n                \"stationery_stores_office_and_school_supply_stores\",\n                \"swimming_pools_sales\",\n                \"t_ui_travel_germany\",\n                \"tailors_alterations\",\n                \"tax_payments_government_agencies\",\n                \"tax_preparation_services\",\n                \"taxicabs_limousines\",\n                \"telecommunication_equipment_and_telephone_sales\",\n                \"telecommunication_services\",\n                \"telegraph_services\",\n                \"tent_and_awning_shops\",\n                \"testing_laboratories\",\n                \"theatrical_ticket_agencies\",\n                \"timeshares\",\n                \"tire_retreading_and_repair\",\n                \"tolls_bridge_fees\",\n                \"tourist_attractions_and_exhibits\",\n                \"towing_services\",\n                \"trailer_parks_campgrounds\",\n                \"transportation_services\",\n                \"travel_agencies_tour_operators\",\n                \"truck_stop_iteration\",\n                \"truck_utility_trailer_rentals\",\n                \"typesetting_plate_making_and_related_services\",\n                \"typewriter_stores\",\n                \"u_s_federal_government_agencies_or_departments\",\n                \"uniforms_commercial_clothing\",\n                \"used_merchandise_and_secondhand_stores\",\n                \"utilities\",\n                \"variety_stores\",\n                \"veterinary_services\",\n                \"video_amusement_game_supplies\",\n                \"video_game_arcades\",\n                \"video_tape_rental_stores\",\n                \"vocational_trade_schools\",\n                \"watch_jewelry_repair\",\n                \"welding_repair\",\n                \"wholesale_clubs\",\n                \"wig_and_toupee_stores\",\n                \"wires_money_orders\",\n                \"womens_accessory_and_specialty_shops\",\n                \"womens_ready_to_wear_stores\",\n                \"wrecking_and_salvage_yards\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"allowed_merchant_countries\": {\n            \"description\": \"Array of strings containing representing countries from which authorizations will be allowed. Authorizations from merchants in all other countries will be declined. Country codes should be ISO 3166 alpha-2 country codes (e.g. `US`). Cannot be set with `blocked_merchant_countries`. Provide an empty value to unset this control.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"blocked_categories\": {\n            \"description\": \"Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) of authorizations to decline. All other categories will be allowed. Cannot be set with `allowed_categories`.\",\n            \"items\": {\n              \"enum\": [\n                \"ac_refrigeration_repair\",\n                \"accounting_bookkeeping_services\",\n                \"advertising_services\",\n                \"agricultural_cooperative\",\n                \"airlines_air_carriers\",\n                \"airports_flying_fields\",\n                \"ambulance_services\",\n                \"amusement_parks_carnivals\",\n                \"antique_reproductions\",\n                \"antique_shops\",\n                \"aquariums\",\n                \"architectural_surveying_services\",\n                \"art_dealers_and_galleries\",\n                \"artists_supply_and_craft_shops\",\n                \"auto_and_home_supply_stores\",\n                \"auto_body_repair_shops\",\n                \"auto_paint_shops\",\n                \"auto_service_shops\",\n                \"automated_cash_disburse\",\n                \"automated_fuel_dispensers\",\n                \"automobile_associations\",\n                \"automotive_parts_and_accessories_stores\",\n                \"automotive_tire_stores\",\n                \"bail_and_bond_payments\",\n                \"bakeries\",\n                \"bands_orchestras\",\n                \"barber_and_beauty_shops\",\n                \"betting_casino_gambling\",\n                \"bicycle_shops\",\n                \"billiard_pool_establishments\",\n                \"boat_dealers\",\n                \"boat_rentals_and_leases\",\n                \"book_stores\",\n                \"books_periodicals_and_newspapers\",\n                \"bowling_alleys\",\n                \"bus_lines\",\n                \"business_secretarial_schools\",\n                \"buying_shopping_services\",\n                \"cable_satellite_and_other_pay_television_and_radio\",\n                \"camera_and_photographic_supply_stores\",\n                \"candy_nut_and_confectionery_stores\",\n                \"car_and_truck_dealers_new_used\",\n                \"car_and_truck_dealers_used_only\",\n                \"car_rental_agencies\",\n                \"car_washes\",\n                \"carpentry_services\",\n                \"carpet_upholstery_cleaning\",\n                \"caterers\",\n                \"charitable_and_social_service_organizations_fundraising\",\n                \"chemicals_and_allied_products\",\n                \"child_care_services\",\n                \"childrens_and_infants_wear_stores\",\n                \"chiropodists_podiatrists\",\n                \"chiropractors\",\n                \"cigar_stores_and_stands\",\n                \"civic_social_fraternal_associations\",\n                \"cleaning_and_maintenance\",\n                \"clothing_rental\",\n                \"colleges_universities\",\n                \"commercial_equipment\",\n                \"commercial_footwear\",\n                \"commercial_photography_art_and_graphics\",\n                \"commuter_transport_and_ferries\",\n                \"computer_network_services\",\n                \"computer_programming\",\n                \"computer_repair\",\n                \"computer_software_stores\",\n                \"computers_peripherals_and_software\",\n                \"concrete_work_services\",\n                \"construction_materials\",\n                \"consulting_public_relations\",\n                \"correspondence_schools\",\n                \"cosmetic_stores\",\n                \"counseling_services\",\n                \"country_clubs\",\n                \"courier_services\",\n                \"court_costs\",\n                \"credit_reporting_agencies\",\n                \"cruise_lines\",\n                \"dairy_products_stores\",\n                \"dance_hall_studios_schools\",\n                \"dating_escort_services\",\n                \"dentists_orthodontists\",\n                \"department_stores\",\n                \"detective_agencies\",\n                \"digital_goods_applications\",\n                \"digital_goods_games\",\n                \"digital_goods_large_volume\",\n                \"digital_goods_media\",\n                \"direct_marketing_catalog_merchant\",\n                \"direct_marketing_combination_catalog_and_retail_merchant\",\n                \"direct_marketing_inbound_telemarketing\",\n                \"direct_marketing_insurance_services\",\n                \"direct_marketing_other\",\n                \"direct_marketing_outbound_telemarketing\",\n                \"direct_marketing_subscription\",\n                \"direct_marketing_travel\",\n                \"discount_stores\",\n                \"doctors\",\n                \"door_to_door_sales\",\n                \"drapery_window_covering_and_upholstery_stores\",\n                \"drinking_places\",\n                \"drug_stores_and_pharmacies\",\n                \"drugs_drug_proprietaries_and_druggist_sundries\",\n                \"dry_cleaners\",\n                \"durable_goods\",\n                \"duty_free_stores\",\n                \"eating_places_restaurants\",\n                \"educational_services\",\n                \"electric_razor_stores\",\n                \"electric_vehicle_charging\",\n                \"electrical_parts_and_equipment\",\n                \"electrical_services\",\n                \"electronics_repair_shops\",\n                \"electronics_stores\",\n                \"elementary_secondary_schools\",\n                \"emergency_services_gcas_visa_use_only\",\n                \"employment_temp_agencies\",\n                \"equipment_rental\",\n                \"exterminating_services\",\n                \"family_clothing_stores\",\n                \"fast_food_restaurants\",\n                \"financial_institutions\",\n                \"fines_government_administrative_entities\",\n                \"fireplace_fireplace_screens_and_accessories_stores\",\n                \"floor_covering_stores\",\n                \"florists\",\n                \"florists_supplies_nursery_stock_and_flowers\",\n                \"freezer_and_locker_meat_provisioners\",\n                \"fuel_dealers_non_automotive\",\n                \"funeral_services_crematories\",\n                \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                \"furniture_repair_refinishing\",\n                \"furriers_and_fur_shops\",\n                \"general_services\",\n                \"gift_card_novelty_and_souvenir_shops\",\n                \"glass_paint_and_wallpaper_stores\",\n                \"glassware_crystal_stores\",\n                \"golf_courses_public\",\n                \"government_licensed_horse_dog_racing_us_region_only\",\n                \"government_licensed_online_casions_online_gambling_us_region_only\",\n                \"government_owned_lotteries_non_us_region\",\n                \"government_owned_lotteries_us_region_only\",\n                \"government_services\",\n                \"grocery_stores_supermarkets\",\n                \"hardware_equipment_and_supplies\",\n                \"hardware_stores\",\n                \"health_and_beauty_spas\",\n                \"hearing_aids_sales_and_supplies\",\n                \"heating_plumbing_a_c\",\n                \"hobby_toy_and_game_shops\",\n                \"home_supply_warehouse_stores\",\n                \"hospitals\",\n                \"hotels_motels_and_resorts\",\n                \"household_appliance_stores\",\n                \"industrial_supplies\",\n                \"information_retrieval_services\",\n                \"insurance_default\",\n                \"insurance_underwriting_premiums\",\n                \"intra_company_purchases\",\n                \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                \"landscaping_services\",\n                \"laundries\",\n                \"laundry_cleaning_services\",\n                \"legal_services_attorneys\",\n                \"luggage_and_leather_goods_stores\",\n                \"lumber_building_materials_stores\",\n                \"manual_cash_disburse\",\n                \"marinas_service_and_supplies\",\n                \"marketplaces\",\n                \"masonry_stonework_and_plaster\",\n                \"massage_parlors\",\n                \"medical_and_dental_labs\",\n                \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                \"medical_services\",\n                \"membership_organizations\",\n                \"mens_and_boys_clothing_and_accessories_stores\",\n                \"mens_womens_clothing_stores\",\n                \"metal_service_centers\",\n                \"miscellaneous\",\n                \"miscellaneous_apparel_and_accessory_shops\",\n                \"miscellaneous_auto_dealers\",\n                \"miscellaneous_business_services\",\n                \"miscellaneous_food_stores\",\n                \"miscellaneous_general_merchandise\",\n                \"miscellaneous_general_services\",\n                \"miscellaneous_home_furnishing_specialty_stores\",\n                \"miscellaneous_publishing_and_printing\",\n                \"miscellaneous_recreation_services\",\n                \"miscellaneous_repair_shops\",\n                \"miscellaneous_specialty_retail\",\n                \"mobile_home_dealers\",\n                \"motion_picture_theaters\",\n                \"motor_freight_carriers_and_trucking\",\n                \"motor_homes_dealers\",\n                \"motor_vehicle_supplies_and_new_parts\",\n                \"motorcycle_shops_and_dealers\",\n                \"motorcycle_shops_dealers\",\n                \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                \"news_dealers_and_newsstands\",\n                \"non_fi_money_orders\",\n                \"non_fi_stored_value_card_purchase_load\",\n                \"nondurable_goods\",\n                \"nurseries_lawn_and_garden_supply_stores\",\n                \"nursing_personal_care\",\n                \"office_and_commercial_furniture\",\n                \"opticians_eyeglasses\",\n                \"optometrists_ophthalmologist\",\n                \"orthopedic_goods_prosthetic_devices\",\n                \"osteopaths\",\n                \"package_stores_beer_wine_and_liquor\",\n                \"paints_varnishes_and_supplies\",\n                \"parking_lots_garages\",\n                \"passenger_railways\",\n                \"pawn_shops\",\n                \"pet_shops_pet_food_and_supplies\",\n                \"petroleum_and_petroleum_products\",\n                \"photo_developing\",\n                \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                \"photographic_studios\",\n                \"picture_video_production\",\n                \"piece_goods_notions_and_other_dry_goods\",\n                \"plumbing_heating_equipment_and_supplies\",\n                \"political_organizations\",\n                \"postal_services_government_only\",\n                \"precious_stones_and_metals_watches_and_jewelry\",\n                \"professional_services\",\n                \"public_warehousing_and_storage\",\n                \"quick_copy_repro_and_blueprint\",\n                \"railroads\",\n                \"real_estate_agents_and_managers_rentals\",\n                \"record_stores\",\n                \"recreational_vehicle_rentals\",\n                \"religious_goods_stores\",\n                \"religious_organizations\",\n                \"roofing_siding_sheet_metal\",\n                \"secretarial_support_services\",\n                \"security_brokers_dealers\",\n                \"service_stations\",\n                \"sewing_needlework_fabric_and_piece_goods_stores\",\n                \"shoe_repair_hat_cleaning\",\n                \"shoe_stores\",\n                \"small_appliance_repair\",\n                \"snowmobile_dealers\",\n                \"special_trade_services\",\n                \"specialty_cleaning\",\n                \"sporting_goods_stores\",\n                \"sporting_recreation_camps\",\n                \"sports_and_riding_apparel_stores\",\n                \"sports_clubs_fields\",\n                \"stamp_and_coin_stores\",\n                \"stationary_office_supplies_printing_and_writing_paper\",\n                \"stationery_stores_office_and_school_supply_stores\",\n                \"swimming_pools_sales\",\n                \"t_ui_travel_germany\",\n                \"tailors_alterations\",\n                \"tax_payments_government_agencies\",\n                \"tax_preparation_services\",\n                \"taxicabs_limousines\",\n                \"telecommunication_equipment_and_telephone_sales\",\n                \"telecommunication_services\",\n                \"telegraph_services\",\n                \"tent_and_awning_shops\",\n                \"testing_laboratories\",\n                \"theatrical_ticket_agencies\",\n                \"timeshares\",\n                \"tire_retreading_and_repair\",\n                \"tolls_bridge_fees\",\n                \"tourist_attractions_and_exhibits\",\n                \"towing_services\",\n                \"trailer_parks_campgrounds\",\n                \"transportation_services\",\n                \"travel_agencies_tour_operators\",\n                \"truck_stop_iteration\",\n                \"truck_utility_trailer_rentals\",\n                \"typesetting_plate_making_and_related_services\",\n                \"typewriter_stores\",\n                \"u_s_federal_government_agencies_or_departments\",\n                \"uniforms_commercial_clothing\",\n                \"used_merchandise_and_secondhand_stores\",\n                \"utilities\",\n                \"variety_stores\",\n                \"veterinary_services\",\n                \"video_amusement_game_supplies\",\n                \"video_game_arcades\",\n                \"video_tape_rental_stores\",\n                \"vocational_trade_schools\",\n                \"watch_jewelry_repair\",\n                \"welding_repair\",\n                \"wholesale_clubs\",\n                \"wig_and_toupee_stores\",\n                \"wires_money_orders\",\n                \"womens_accessory_and_specialty_shops\",\n                \"womens_ready_to_wear_stores\",\n                \"wrecking_and_salvage_yards\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"blocked_merchant_countries\": {\n            \"description\": \"Array of strings containing representing countries from which authorizations will be declined. Country codes should be ISO 3166 alpha-2 country codes (e.g. `US`). Cannot be set with `allowed_merchant_countries`. Provide an empty value to unset this control.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"spending_limits\": {\n            \"description\": \"Limit spending with amount-based rules that apply across this cardholder's cards.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/issuing_cardholder_spending_limit\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"spending_limits_currency\": {\n            \"description\": \"Currency of the amounts within `spending_limits`.\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingCardholderAuthorizationControls\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"spending_limits\"]\n      },\n      \"issuing_cardholder_card_issuing\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"user_terms_acceptance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_user_terms_acceptance\"\n              }\n            ],\n            \"description\": \"Information about cardholder acceptance of Celtic [Authorized User Terms](https://stripe.com/docs/issuing/cards#accept-authorized-user-terms). Required for cards backed by a Celtic program.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"IssuingCardholderCardIssuing\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"user_terms_acceptance\"]\n      },\n      \"issuing_cardholder_company\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tax_id_provided\": {\n            \"description\": \"Whether the company's business ID number was provided.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"tax_id_provided\"],\n        \"title\": \"IssuingCardholderCompany\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_cardholder_id_document\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"back\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The back of a document returned by a [file upload](https://stripe.com/docs/api#create_file) with a `purpose` value of `identity_document`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"front\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The front of a document returned by a [file upload](https://stripe.com/docs/api#create_file) with a `purpose` value of `identity_document`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"IssuingCardholderIdDocument\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"back\", \"front\"]\n      },\n      \"issuing_cardholder_individual\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_issuing\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_card_issuing\"\n              }\n            ],\n            \"description\": \"Information related to the card_issuing program for this cardholder.\",\n            \"nullable\": true\n          },\n          \"dob\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_individual_dob\"\n              }\n            ],\n            \"description\": \"The date of birth of this cardholder.\",\n            \"nullable\": true\n          },\n          \"first_name\": {\n            \"description\": \"The first name of this cardholder. Required before activating Cards. This field cannot contain any numbers, special characters (except periods, commas, hyphens, spaces and apostrophes) or non-latin letters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last_name\": {\n            \"description\": \"The last name of this cardholder. Required before activating Cards. This field cannot contain any numbers, special characters (except periods, commas, hyphens, spaces and apostrophes) or non-latin letters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verification\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_verification\"\n              }\n            ],\n            \"description\": \"Government-issued ID document for this cardholder.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"IssuingCardholderIndividual\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card_issuing\", \"dob\", \"verification\"]\n      },\n      \"issuing_cardholder_individual_dob\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"The day of birth, between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"The month of birth, between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year of birth.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingCardholderIndividualDOB\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_cardholder_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disabled_reason\": {\n            \"description\": \"If `disabled_reason` is present, all cards will decline authorizations with `cardholder_verification_required` reason.\",\n            \"enum\": [\n              \"listed\",\n              \"rejected.listed\",\n              \"requirements.past_due\",\n              \"under_review\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"past_due\": {\n            \"description\": \"Array of fields that need to be collected in order to verify and re-enable the cardholder.\",\n            \"items\": {\n              \"enum\": [\n                \"company.tax_id\",\n                \"individual.card_issuing.user_terms_acceptance.date\",\n                \"individual.card_issuing.user_terms_acceptance.ip\",\n                \"individual.dob.day\",\n                \"individual.dob.month\",\n                \"individual.dob.year\",\n                \"individual.first_name\",\n                \"individual.last_name\",\n                \"individual.verification.document\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"IssuingCardholderRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_cardholder_spending_limit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Maximum amount allowed to spend per interval. This amount is in the card's currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"categories\": {\n            \"description\": \"Array of strings containing [categories](https://stripe.com/docs/api#issuing_authorization_object-merchant_data-category) this limit applies to. Omitting this field will apply the limit to all categories.\",\n            \"items\": {\n              \"enum\": [\n                \"ac_refrigeration_repair\",\n                \"accounting_bookkeeping_services\",\n                \"advertising_services\",\n                \"agricultural_cooperative\",\n                \"airlines_air_carriers\",\n                \"airports_flying_fields\",\n                \"ambulance_services\",\n                \"amusement_parks_carnivals\",\n                \"antique_reproductions\",\n                \"antique_shops\",\n                \"aquariums\",\n                \"architectural_surveying_services\",\n                \"art_dealers_and_galleries\",\n                \"artists_supply_and_craft_shops\",\n                \"auto_and_home_supply_stores\",\n                \"auto_body_repair_shops\",\n                \"auto_paint_shops\",\n                \"auto_service_shops\",\n                \"automated_cash_disburse\",\n                \"automated_fuel_dispensers\",\n                \"automobile_associations\",\n                \"automotive_parts_and_accessories_stores\",\n                \"automotive_tire_stores\",\n                \"bail_and_bond_payments\",\n                \"bakeries\",\n                \"bands_orchestras\",\n                \"barber_and_beauty_shops\",\n                \"betting_casino_gambling\",\n                \"bicycle_shops\",\n                \"billiard_pool_establishments\",\n                \"boat_dealers\",\n                \"boat_rentals_and_leases\",\n                \"book_stores\",\n                \"books_periodicals_and_newspapers\",\n                \"bowling_alleys\",\n                \"bus_lines\",\n                \"business_secretarial_schools\",\n                \"buying_shopping_services\",\n                \"cable_satellite_and_other_pay_television_and_radio\",\n                \"camera_and_photographic_supply_stores\",\n                \"candy_nut_and_confectionery_stores\",\n                \"car_and_truck_dealers_new_used\",\n                \"car_and_truck_dealers_used_only\",\n                \"car_rental_agencies\",\n                \"car_washes\",\n                \"carpentry_services\",\n                \"carpet_upholstery_cleaning\",\n                \"caterers\",\n                \"charitable_and_social_service_organizations_fundraising\",\n                \"chemicals_and_allied_products\",\n                \"child_care_services\",\n                \"childrens_and_infants_wear_stores\",\n                \"chiropodists_podiatrists\",\n                \"chiropractors\",\n                \"cigar_stores_and_stands\",\n                \"civic_social_fraternal_associations\",\n                \"cleaning_and_maintenance\",\n                \"clothing_rental\",\n                \"colleges_universities\",\n                \"commercial_equipment\",\n                \"commercial_footwear\",\n                \"commercial_photography_art_and_graphics\",\n                \"commuter_transport_and_ferries\",\n                \"computer_network_services\",\n                \"computer_programming\",\n                \"computer_repair\",\n                \"computer_software_stores\",\n                \"computers_peripherals_and_software\",\n                \"concrete_work_services\",\n                \"construction_materials\",\n                \"consulting_public_relations\",\n                \"correspondence_schools\",\n                \"cosmetic_stores\",\n                \"counseling_services\",\n                \"country_clubs\",\n                \"courier_services\",\n                \"court_costs\",\n                \"credit_reporting_agencies\",\n                \"cruise_lines\",\n                \"dairy_products_stores\",\n                \"dance_hall_studios_schools\",\n                \"dating_escort_services\",\n                \"dentists_orthodontists\",\n                \"department_stores\",\n                \"detective_agencies\",\n                \"digital_goods_applications\",\n                \"digital_goods_games\",\n                \"digital_goods_large_volume\",\n                \"digital_goods_media\",\n                \"direct_marketing_catalog_merchant\",\n                \"direct_marketing_combination_catalog_and_retail_merchant\",\n                \"direct_marketing_inbound_telemarketing\",\n                \"direct_marketing_insurance_services\",\n                \"direct_marketing_other\",\n                \"direct_marketing_outbound_telemarketing\",\n                \"direct_marketing_subscription\",\n                \"direct_marketing_travel\",\n                \"discount_stores\",\n                \"doctors\",\n                \"door_to_door_sales\",\n                \"drapery_window_covering_and_upholstery_stores\",\n                \"drinking_places\",\n                \"drug_stores_and_pharmacies\",\n                \"drugs_drug_proprietaries_and_druggist_sundries\",\n                \"dry_cleaners\",\n                \"durable_goods\",\n                \"duty_free_stores\",\n                \"eating_places_restaurants\",\n                \"educational_services\",\n                \"electric_razor_stores\",\n                \"electric_vehicle_charging\",\n                \"electrical_parts_and_equipment\",\n                \"electrical_services\",\n                \"electronics_repair_shops\",\n                \"electronics_stores\",\n                \"elementary_secondary_schools\",\n                \"emergency_services_gcas_visa_use_only\",\n                \"employment_temp_agencies\",\n                \"equipment_rental\",\n                \"exterminating_services\",\n                \"family_clothing_stores\",\n                \"fast_food_restaurants\",\n                \"financial_institutions\",\n                \"fines_government_administrative_entities\",\n                \"fireplace_fireplace_screens_and_accessories_stores\",\n                \"floor_covering_stores\",\n                \"florists\",\n                \"florists_supplies_nursery_stock_and_flowers\",\n                \"freezer_and_locker_meat_provisioners\",\n                \"fuel_dealers_non_automotive\",\n                \"funeral_services_crematories\",\n                \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                \"furniture_repair_refinishing\",\n                \"furriers_and_fur_shops\",\n                \"general_services\",\n                \"gift_card_novelty_and_souvenir_shops\",\n                \"glass_paint_and_wallpaper_stores\",\n                \"glassware_crystal_stores\",\n                \"golf_courses_public\",\n                \"government_licensed_horse_dog_racing_us_region_only\",\n                \"government_licensed_online_casions_online_gambling_us_region_only\",\n                \"government_owned_lotteries_non_us_region\",\n                \"government_owned_lotteries_us_region_only\",\n                \"government_services\",\n                \"grocery_stores_supermarkets\",\n                \"hardware_equipment_and_supplies\",\n                \"hardware_stores\",\n                \"health_and_beauty_spas\",\n                \"hearing_aids_sales_and_supplies\",\n                \"heating_plumbing_a_c\",\n                \"hobby_toy_and_game_shops\",\n                \"home_supply_warehouse_stores\",\n                \"hospitals\",\n                \"hotels_motels_and_resorts\",\n                \"household_appliance_stores\",\n                \"industrial_supplies\",\n                \"information_retrieval_services\",\n                \"insurance_default\",\n                \"insurance_underwriting_premiums\",\n                \"intra_company_purchases\",\n                \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                \"landscaping_services\",\n                \"laundries\",\n                \"laundry_cleaning_services\",\n                \"legal_services_attorneys\",\n                \"luggage_and_leather_goods_stores\",\n                \"lumber_building_materials_stores\",\n                \"manual_cash_disburse\",\n                \"marinas_service_and_supplies\",\n                \"marketplaces\",\n                \"masonry_stonework_and_plaster\",\n                \"massage_parlors\",\n                \"medical_and_dental_labs\",\n                \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                \"medical_services\",\n                \"membership_organizations\",\n                \"mens_and_boys_clothing_and_accessories_stores\",\n                \"mens_womens_clothing_stores\",\n                \"metal_service_centers\",\n                \"miscellaneous\",\n                \"miscellaneous_apparel_and_accessory_shops\",\n                \"miscellaneous_auto_dealers\",\n                \"miscellaneous_business_services\",\n                \"miscellaneous_food_stores\",\n                \"miscellaneous_general_merchandise\",\n                \"miscellaneous_general_services\",\n                \"miscellaneous_home_furnishing_specialty_stores\",\n                \"miscellaneous_publishing_and_printing\",\n                \"miscellaneous_recreation_services\",\n                \"miscellaneous_repair_shops\",\n                \"miscellaneous_specialty_retail\",\n                \"mobile_home_dealers\",\n                \"motion_picture_theaters\",\n                \"motor_freight_carriers_and_trucking\",\n                \"motor_homes_dealers\",\n                \"motor_vehicle_supplies_and_new_parts\",\n                \"motorcycle_shops_and_dealers\",\n                \"motorcycle_shops_dealers\",\n                \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                \"news_dealers_and_newsstands\",\n                \"non_fi_money_orders\",\n                \"non_fi_stored_value_card_purchase_load\",\n                \"nondurable_goods\",\n                \"nurseries_lawn_and_garden_supply_stores\",\n                \"nursing_personal_care\",\n                \"office_and_commercial_furniture\",\n                \"opticians_eyeglasses\",\n                \"optometrists_ophthalmologist\",\n                \"orthopedic_goods_prosthetic_devices\",\n                \"osteopaths\",\n                \"package_stores_beer_wine_and_liquor\",\n                \"paints_varnishes_and_supplies\",\n                \"parking_lots_garages\",\n                \"passenger_railways\",\n                \"pawn_shops\",\n                \"pet_shops_pet_food_and_supplies\",\n                \"petroleum_and_petroleum_products\",\n                \"photo_developing\",\n                \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                \"photographic_studios\",\n                \"picture_video_production\",\n                \"piece_goods_notions_and_other_dry_goods\",\n                \"plumbing_heating_equipment_and_supplies\",\n                \"political_organizations\",\n                \"postal_services_government_only\",\n                \"precious_stones_and_metals_watches_and_jewelry\",\n                \"professional_services\",\n                \"public_warehousing_and_storage\",\n                \"quick_copy_repro_and_blueprint\",\n                \"railroads\",\n                \"real_estate_agents_and_managers_rentals\",\n                \"record_stores\",\n                \"recreational_vehicle_rentals\",\n                \"religious_goods_stores\",\n                \"religious_organizations\",\n                \"roofing_siding_sheet_metal\",\n                \"secretarial_support_services\",\n                \"security_brokers_dealers\",\n                \"service_stations\",\n                \"sewing_needlework_fabric_and_piece_goods_stores\",\n                \"shoe_repair_hat_cleaning\",\n                \"shoe_stores\",\n                \"small_appliance_repair\",\n                \"snowmobile_dealers\",\n                \"special_trade_services\",\n                \"specialty_cleaning\",\n                \"sporting_goods_stores\",\n                \"sporting_recreation_camps\",\n                \"sports_and_riding_apparel_stores\",\n                \"sports_clubs_fields\",\n                \"stamp_and_coin_stores\",\n                \"stationary_office_supplies_printing_and_writing_paper\",\n                \"stationery_stores_office_and_school_supply_stores\",\n                \"swimming_pools_sales\",\n                \"t_ui_travel_germany\",\n                \"tailors_alterations\",\n                \"tax_payments_government_agencies\",\n                \"tax_preparation_services\",\n                \"taxicabs_limousines\",\n                \"telecommunication_equipment_and_telephone_sales\",\n                \"telecommunication_services\",\n                \"telegraph_services\",\n                \"tent_and_awning_shops\",\n                \"testing_laboratories\",\n                \"theatrical_ticket_agencies\",\n                \"timeshares\",\n                \"tire_retreading_and_repair\",\n                \"tolls_bridge_fees\",\n                \"tourist_attractions_and_exhibits\",\n                \"towing_services\",\n                \"trailer_parks_campgrounds\",\n                \"transportation_services\",\n                \"travel_agencies_tour_operators\",\n                \"truck_stop_iteration\",\n                \"truck_utility_trailer_rentals\",\n                \"typesetting_plate_making_and_related_services\",\n                \"typewriter_stores\",\n                \"u_s_federal_government_agencies_or_departments\",\n                \"uniforms_commercial_clothing\",\n                \"used_merchandise_and_secondhand_stores\",\n                \"utilities\",\n                \"variety_stores\",\n                \"veterinary_services\",\n                \"video_amusement_game_supplies\",\n                \"video_game_arcades\",\n                \"video_tape_rental_stores\",\n                \"vocational_trade_schools\",\n                \"watch_jewelry_repair\",\n                \"welding_repair\",\n                \"wholesale_clubs\",\n                \"wig_and_toupee_stores\",\n                \"wires_money_orders\",\n                \"womens_accessory_and_specialty_shops\",\n                \"womens_ready_to_wear_stores\",\n                \"wrecking_and_salvage_yards\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"interval\": {\n            \"description\": \"Interval (or event) to which the amount applies.\",\n            \"enum\": [\n              \"all_time\",\n              \"daily\",\n              \"monthly\",\n              \"per_authorization\",\n              \"weekly\",\n              \"yearly\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"interval\"],\n        \"title\": \"IssuingCardholderSpendingLimit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_cardholder_user_terms_acceptance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"date\": {\n            \"description\": \"The Unix timestamp marking when the cardholder accepted the Authorized User Terms.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ip\": {\n            \"description\": \"The IP address from which the cardholder accepted the Authorized User Terms.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user agent of the browser from which the cardholder accepted the Authorized User Terms.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingCardholderUserTermsAcceptance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_cardholder_verification\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"document\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_cardholder_id_document\"\n              }\n            ],\n            \"description\": \"An identifying document, either a passport or local ID card.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"IssuingCardholderVerification\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"document\"]\n      },\n      \"issuing_dispute_canceled_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"canceled_at\": {\n            \"description\": \"Date when order was canceled.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cancellation_policy_provided\": {\n            \"description\": \"Whether the cardholder was provided with a cancellation policy.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"cancellation_reason\": {\n            \"description\": \"Reason for canceling the order.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"expected_at\": {\n            \"description\": \"Date when the cardholder expected to receive the product.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_description\": {\n            \"description\": \"Description of the merchandise or service that was purchased.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_type\": {\n            \"description\": \"Whether the product was a merchandise or service.\",\n            \"enum\": [\"merchandise\", \"service\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"return_status\": {\n            \"description\": \"Result of cardholder's attempt to return the product.\",\n            \"enum\": [\"merchant_rejected\", \"successful\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"returned_at\": {\n            \"description\": \"Date when the product was returned or attempted to be returned.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingDisputeCanceledEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_documentation\"]\n      },\n      \"issuing_dispute_duplicate_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"card_statement\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Copy of the card statement showing that the product had already been paid for.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"cash_receipt\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Copy of the receipt showing that the product had been paid for in cash.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"check_image\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Image of the front and back of the check that was used to pay for the product.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"original_transaction\": {\n            \"description\": \"Transaction (e.g., ipi_...) that the disputed transaction is a duplicate of. Of the two or more transactions that are copies of each other, this is original undisputed one.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingDisputeDuplicateEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"additional_documentation\",\n          \"card_statement\",\n          \"cash_receipt\",\n          \"check_image\"\n        ]\n      },\n      \"issuing_dispute_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"canceled\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_canceled_evidence\"\n          },\n          \"duplicate\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_duplicate_evidence\"\n          },\n          \"fraudulent\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_fraudulent_evidence\"\n          },\n          \"merchandise_not_as_described\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_merchandise_not_as_described_evidence\"\n          },\n          \"no_valid_authorization\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_no_valid_authorization_evidence\"\n          },\n          \"not_received\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_not_received_evidence\"\n          },\n          \"other\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_other_evidence\"\n          },\n          \"reason\": {\n            \"description\": \"The reason for filing the dispute. Its value will match the field containing the evidence.\",\n            \"enum\": [\n              \"canceled\",\n              \"duplicate\",\n              \"fraudulent\",\n              \"merchandise_not_as_described\",\n              \"no_valid_authorization\",\n              \"not_received\",\n              \"other\",\n              \"service_not_as_described\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"service_not_as_described\": {\n            \"$ref\": \"#/components/schemas/issuing_dispute_service_not_as_described_evidence\"\n          }\n        },\n        \"required\": [\"reason\"],\n        \"title\": \"IssuingDisputeEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"canceled\",\n          \"duplicate\",\n          \"fraudulent\",\n          \"merchandise_not_as_described\",\n          \"no_valid_authorization\",\n          \"not_received\",\n          \"other\",\n          \"service_not_as_described\"\n        ]\n      },\n      \"issuing_dispute_fraudulent_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingDisputeFraudulentEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_documentation\"]\n      },\n      \"issuing_dispute_merchandise_not_as_described_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"received_at\": {\n            \"description\": \"Date when the product was received.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"return_description\": {\n            \"description\": \"Description of the cardholder's attempt to return the product.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"return_status\": {\n            \"description\": \"Result of cardholder's attempt to return the product.\",\n            \"enum\": [\"merchant_rejected\", \"successful\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"returned_at\": {\n            \"description\": \"Date when the product was returned or attempted to be returned.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingDisputeMerchandiseNotAsDescribedEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_documentation\"]\n      },\n      \"issuing_dispute_no_valid_authorization_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingDisputeNoValidAuthorizationEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_documentation\"]\n      },\n      \"issuing_dispute_not_received_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"expected_at\": {\n            \"description\": \"Date when the cardholder expected to receive the product.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_description\": {\n            \"description\": \"Description of the merchandise or service that was purchased.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_type\": {\n            \"description\": \"Whether the product was a merchandise or service.\",\n            \"enum\": [\"merchandise\", \"service\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingDisputeNotReceivedEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_documentation\"]\n      },\n      \"issuing_dispute_other_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_description\": {\n            \"description\": \"Description of the merchandise or service that was purchased.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"product_type\": {\n            \"description\": \"Whether the product was a merchandise or service.\",\n            \"enum\": [\"merchandise\", \"service\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingDisputeOtherEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_documentation\"]\n      },\n      \"issuing_dispute_service_not_as_described_evidence\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_documentation\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"(ID of a [file upload](https://stripe.com/docs/guides/file-upload)) Additional documentation supporting the dispute.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"canceled_at\": {\n            \"description\": \"Date when order was canceled.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cancellation_reason\": {\n            \"description\": \"Reason for canceling the order.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"explanation\": {\n            \"description\": \"Explanation of why the cardholder is disputing this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"received_at\": {\n            \"description\": \"Date when the product was received.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingDisputeServiceNotAsDescribedEvidence\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_documentation\"]\n      },\n      \"issuing_dispute_treasury\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"debit_reversal\": {\n            \"description\": \"The Treasury [DebitReversal](https://stripe.com/docs/api/treasury/debit_reversals) representing this Issuing dispute\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"received_debit\": {\n            \"description\": \"The Treasury [ReceivedDebit](https://stripe.com/docs/api/treasury/received_debits) that is being disputed.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"received_debit\"],\n        \"title\": \"IssuingDisputeTreasury\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_network_token_address\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"line1\": {\n            \"description\": \"The street address of the cardholder tokenizing the card.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"postal_code\": {\n            \"description\": \"The postal code of the cardholder tokenizing the card.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"line1\", \"postal_code\"],\n        \"title\": \"IssuingNetworkTokenAddress\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_network_token_device\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"device_fingerprint\": {\n            \"description\": \"An obfuscated ID derived from the device ID.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"ip_address\": {\n            \"description\": \"The IP address of the device at provisioning time.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"location\": {\n            \"description\": \"The geographic latitude/longitude coordinates of the device at provisioning time. The format is [+-]decimal/[+-]decimal.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"The name of the device used for tokenization.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"phone_number\": {\n            \"description\": \"The phone number of the device used for tokenization.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of device used for tokenization.\",\n            \"enum\": [\"other\", \"phone\", \"watch\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingNetworkTokenDevice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_network_token_mastercard\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_reference_id\": {\n            \"description\": \"A unique reference ID from MasterCard to represent the card account number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"token_reference_id\": {\n            \"description\": \"The network-unique identifier for the token.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"token_requestor_id\": {\n            \"description\": \"The ID of the entity requesting tokenization, specific to MasterCard.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"token_requestor_name\": {\n            \"description\": \"The name of the entity requesting tokenization, if known. This is directly provided from MasterCard.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"token_reference_id\", \"token_requestor_id\"],\n        \"title\": \"IssuingNetworkTokenMastercard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_network_token_network_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"device\": {\n            \"$ref\": \"#/components/schemas/issuing_network_token_device\"\n          },\n          \"mastercard\": {\n            \"$ref\": \"#/components/schemas/issuing_network_token_mastercard\"\n          },\n          \"type\": {\n            \"description\": \"The network that the token is associated with. An additional hash is included with a name matching this value, containing tokenization data specific to the card network.\",\n            \"enum\": [\"mastercard\", \"visa\"],\n            \"type\": \"string\"\n          },\n          \"visa\": {\n            \"$ref\": \"#/components/schemas/issuing_network_token_visa\"\n          },\n          \"wallet_provider\": {\n            \"$ref\": \"#/components/schemas/issuing_network_token_wallet_provider\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"IssuingNetworkTokenNetworkData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"device\",\n          \"mastercard\",\n          \"visa\",\n          \"wallet_provider\"\n        ]\n      },\n      \"issuing_network_token_visa\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_reference_id\": {\n            \"description\": \"A unique reference ID from Visa to represent the card account number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"token_reference_id\": {\n            \"description\": \"The network-unique identifier for the token.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"token_requestor_id\": {\n            \"description\": \"The ID of the entity requesting tokenization, specific to Visa.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"token_risk_score\": {\n            \"description\": \"Degree of risk associated with the token between `01` and `99`, with higher number indicating higher risk. A `00` value indicates the token was not scored by Visa.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"card_reference_id\",\n          \"token_reference_id\",\n          \"token_requestor_id\"\n        ],\n        \"title\": \"IssuingNetworkTokenVisa\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_network_token_wallet_provider\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_id\": {\n            \"description\": \"The wallet provider-given account ID of the digital wallet the token belongs to.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"account_trust_score\": {\n            \"description\": \"An evaluation on the trustworthiness of the wallet account between 1 and 5. A higher score indicates more trustworthy.\",\n            \"type\": \"integer\"\n          },\n          \"card_number_source\": {\n            \"description\": \"The method used for tokenizing a card.\",\n            \"enum\": [\"app\", \"manual\", \"on_file\", \"other\"],\n            \"type\": \"string\"\n          },\n          \"cardholder_address\": {\n            \"$ref\": \"#/components/schemas/issuing_network_token_address\"\n          },\n          \"cardholder_name\": {\n            \"description\": \"The name of the cardholder tokenizing the card.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"device_trust_score\": {\n            \"description\": \"An evaluation on the trustworthiness of the device. A higher score indicates more trustworthy.\",\n            \"type\": \"integer\"\n          },\n          \"hashed_account_email_address\": {\n            \"description\": \"The hashed email address of the cardholder's account with the wallet provider.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"reason_codes\": {\n            \"description\": \"The reasons for suggested tokenization given by the card network.\",\n            \"items\": {\n              \"enum\": [\n                \"account_card_too_new\",\n                \"account_recently_changed\",\n                \"account_too_new\",\n                \"account_too_new_since_launch\",\n                \"additional_device\",\n                \"data_expired\",\n                \"defer_id_v_decision\",\n                \"device_recently_lost\",\n                \"good_activity_history\",\n                \"has_suspended_tokens\",\n                \"high_risk\",\n                \"inactive_account\",\n                \"long_account_tenure\",\n                \"low_account_score\",\n                \"low_device_score\",\n                \"low_phone_number_score\",\n                \"network_service_error\",\n                \"outside_home_territory\",\n                \"provisioning_cardholder_mismatch\",\n                \"provisioning_device_and_cardholder_mismatch\",\n                \"provisioning_device_mismatch\",\n                \"same_device_no_prior_authentication\",\n                \"same_device_successful_prior_authentication\",\n                \"software_update\",\n                \"suspicious_activity\",\n                \"too_many_different_cardholders\",\n                \"too_many_recent_attempts\",\n                \"too_many_recent_tokens\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"suggested_decision\": {\n            \"description\": \"The recommendation on responding to the tokenization request.\",\n            \"enum\": [\"approve\", \"decline\", \"require_auth\"],\n            \"type\": \"string\"\n          },\n          \"suggested_decision_version\": {\n            \"description\": \"The version of the standard for mapping reason codes followed by the wallet provider.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingNetworkTokenWalletProvider\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"cardholder_address\"]\n      },\n      \"issuing_personalization_design_carrier_text\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"footer_body\": {\n            \"description\": \"The footer body text of the carrier letter.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"footer_title\": {\n            \"description\": \"The footer title text of the carrier letter.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"header_body\": {\n            \"description\": \"The header body text of the carrier letter.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"header_title\": {\n            \"description\": \"The header title text of the carrier letter.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingPersonalizationDesignCarrierText\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_personalization_design_preferences\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"is_default\": {\n            \"description\": \"Whether we use this personalization design to create cards when one isn't specified. A connected account uses the Connect platform's default design if no personalization design is set as the default design.\",\n            \"type\": \"boolean\"\n          },\n          \"is_platform_default\": {\n            \"description\": \"Whether this personalization design is used to create cards when one is not specified and a default for this connected account does not exist.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"is_default\"],\n        \"title\": \"IssuingPersonalizationDesignPreferences\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_personalization_design_rejection_reasons\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_logo\": {\n            \"description\": \"The reason(s) the card logo was rejected.\",\n            \"items\": {\n              \"enum\": [\n                \"geographic_location\",\n                \"inappropriate\",\n                \"network_name\",\n                \"non_binary_image\",\n                \"non_fiat_currency\",\n                \"other\",\n                \"other_entity\",\n                \"promotional_material\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"carrier_text\": {\n            \"description\": \"The reason(s) the carrier text was rejected.\",\n            \"items\": {\n              \"enum\": [\n                \"geographic_location\",\n                \"inappropriate\",\n                \"network_name\",\n                \"non_fiat_currency\",\n                \"other\",\n                \"other_entity\",\n                \"promotional_material\"\n              ],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"IssuingPersonalizationDesignRejectionReasons\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_physical_bundle_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card_logo\": {\n            \"description\": \"The policy for how to use card logo images in a card design with this physical bundle.\",\n            \"enum\": [\"optional\", \"required\", \"unsupported\"],\n            \"type\": \"string\"\n          },\n          \"carrier_text\": {\n            \"description\": \"The policy for how to use carrier letter text in a card design with this physical bundle.\",\n            \"enum\": [\"optional\", \"required\", \"unsupported\"],\n            \"type\": \"string\"\n          },\n          \"second_line\": {\n            \"description\": \"The policy for how to use a second line on a card with this physical bundle.\",\n            \"enum\": [\"optional\", \"required\", \"unsupported\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"card_logo\", \"carrier_text\", \"second_line\"],\n        \"title\": \"IssuingPhysicalBundleFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_amount_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"atm_fee\": {\n            \"description\": \"The fee charged by the ATM for the cash withdrawal.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cashback_amount\": {\n            \"description\": \"The amount of cash requested by the cardholder.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingTransactionAmountDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_fleet_cardholder_prompt_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"driver_id\": {\n            \"description\": \"Driver ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"odometer\": {\n            \"description\": \"Odometer reading.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unspecified_id\": {\n            \"description\": \"An alphanumeric ID. This field is used when a vehicle ID, driver ID, or generic ID is entered by the cardholder, but the merchant or card network did not specify the prompt type.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_id\": {\n            \"description\": \"User ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"vehicle_number\": {\n            \"description\": \"Vehicle number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionFleetCardholderPromptData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_fleet_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"cardholder_prompt_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_fleet_cardholder_prompt_data\"\n              }\n            ],\n            \"description\": \"Answers to prompts presented to cardholder at point of sale.\",\n            \"nullable\": true\n          },\n          \"purchase_type\": {\n            \"description\": \"The type of purchase. One of `fuel_purchase`, `non_fuel_purchase`, or `fuel_and_non_fuel_purchase`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reported_breakdown\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_fleet_reported_breakdown\"\n              }\n            ],\n            \"description\": \"More information about the total amount. This information is not guaranteed to be accurate as some merchants may provide unreliable data.\",\n            \"nullable\": true\n          },\n          \"service_type\": {\n            \"description\": \"The type of fuel service. One of `non_fuel_transaction`, `full_service`, or `self_service`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionFleetData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"cardholder_prompt_data\", \"reported_breakdown\"]\n      },\n      \"issuing_transaction_fleet_fuel_price_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"gross_amount_decimal\": {\n            \"description\": \"Gross fuel amount that should equal Fuel Volume multipled by Fuel Unit Cost, inclusive of taxes.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionFleetFuelPriceData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_fleet_non_fuel_price_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"gross_amount_decimal\": {\n            \"description\": \"Gross non-fuel amount that should equal the sum of the line items, inclusive of taxes.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionFleetNonFuelPriceData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_fleet_reported_breakdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fuel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_fleet_fuel_price_data\"\n              }\n            ],\n            \"description\": \"Breakdown of fuel portion of the purchase.\",\n            \"nullable\": true\n          },\n          \"non_fuel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_fleet_non_fuel_price_data\"\n              }\n            ],\n            \"description\": \"Breakdown of non-fuel portion of the purchase.\",\n            \"nullable\": true\n          },\n          \"tax\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_fleet_tax_data\"\n              }\n            ],\n            \"description\": \"Information about tax included in this transaction.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"IssuingTransactionFleetReportedBreakdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"fuel\", \"non_fuel\", \"tax\"]\n      },\n      \"issuing_transaction_fleet_tax_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"local_amount_decimal\": {\n            \"description\": \"Amount of state or provincial Sales Tax included in the transaction amount. Null if not reported by merchant or not subject to tax.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"national_amount_decimal\": {\n            \"description\": \"Amount of national Sales Tax or VAT included in the transaction amount. Null if not reported by merchant or not subject to tax.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionFleetTaxData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_flight_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"departure_at\": {\n            \"description\": \"The time that the flight departed.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"passenger_name\": {\n            \"description\": \"The name of the passenger.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refundable\": {\n            \"description\": \"Whether the ticket is refundable.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"segments\": {\n            \"description\": \"The legs of the trip.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/issuing_transaction_flight_data_leg\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"travel_agency\": {\n            \"description\": \"The travel agency that issued the ticket.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionFlightData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"segments\"]\n      },\n      \"issuing_transaction_flight_data_leg\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"arrival_airport_code\": {\n            \"description\": \"The three-letter IATA airport code of the flight's destination.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"carrier\": {\n            \"description\": \"The airline carrier code.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"departure_airport_code\": {\n            \"description\": \"The three-letter IATA airport code that the flight departed from.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"flight_number\": {\n            \"description\": \"The flight number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"service_class\": {\n            \"description\": \"The flight's service class.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"stopover_allowed\": {\n            \"description\": \"Whether a stopover is allowed on this flight.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"IssuingTransactionFlightDataLeg\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_fuel_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"industry_product_code\": {\n            \"description\": \"[Conexxus Payment System Product Code](https://www.conexxus.org/conexxus-payment-system-product-codes) identifying the primary fuel product purchased.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"quantity_decimal\": {\n            \"description\": \"The quantity of `unit`s of fuel that was dispensed, represented as a decimal string with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of fuel that was purchased. One of `diesel`, `unleaded_plus`, `unleaded_regular`, `unleaded_super`, or `other`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"unit\": {\n            \"description\": \"The units for `quantity_decimal`. One of `charging_minute`, `imperial_gallon`, `kilogram`, `kilowatt_hour`, `liter`, `pound`, `us_gallon`, or `other`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"unit_cost_decimal\": {\n            \"description\": \"The cost in cents per each unit of fuel, represented as a decimal string with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\", \"unit\", \"unit_cost_decimal\"],\n        \"title\": \"IssuingTransactionFuelData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_lodging_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"check_in_at\": {\n            \"description\": \"The time of checking into the lodging.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"nights\": {\n            \"description\": \"The number of nights stayed at the lodging.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingTransactionLodgingData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_network_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"authorization_code\": {\n            \"description\": \"A code created by Stripe which is shared with the merchant to validate the authorization. This field will be populated if the authorization message was approved. The code typically starts with the letter \\\"S\\\", followed by a six-digit number. For example, \\\"S498162\\\". Please note that the code is not guaranteed to be unique across authorizations.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"processing_date\": {\n            \"description\": \"The date the transaction was processed by the card network. This can be different from the date the seller recorded the transaction depending on when the acquirer submits the transaction to the network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_id\": {\n            \"description\": \"Unique identifier for the authorization assigned by the card network used to match subsequent messages, disputes, and transactions.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionNetworkData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_purchase_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fleet\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_fleet_data\"\n              }\n            ],\n            \"description\": \"Fleet-specific information for transactions using Fleet cards.\",\n            \"nullable\": true\n          },\n          \"flight\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_flight_data\"\n              }\n            ],\n            \"description\": \"Information about the flight that was purchased with this transaction.\",\n            \"nullable\": true\n          },\n          \"fuel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_fuel_data\"\n              }\n            ],\n            \"description\": \"Information about fuel that was purchased with this transaction.\",\n            \"nullable\": true\n          },\n          \"lodging\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/issuing_transaction_lodging_data\"\n              }\n            ],\n            \"description\": \"Information about lodging that was purchased with this transaction.\",\n            \"nullable\": true\n          },\n          \"receipt\": {\n            \"description\": \"The line items in the purchase.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/issuing_transaction_receipt_data\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"reference\": {\n            \"description\": \"A merchant-specific order number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionPurchaseDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"fleet\", \"flight\", \"fuel\", \"lodging\", \"receipt\"]\n      },\n      \"issuing_transaction_receipt_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"description\": {\n            \"description\": \"The description of the item. The maximum length of this field is 26 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"quantity\": {\n            \"description\": \"The quantity of the item.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"total\": {\n            \"description\": \"The total for this line item in cents.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unit_cost\": {\n            \"description\": \"The unit cost of the item in cents.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"IssuingTransactionReceiptData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"issuing_transaction_treasury\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"received_credit\": {\n            \"description\": \"The Treasury [ReceivedCredit](https://stripe.com/docs/api/treasury/received_credits) representing this Issuing transaction if it is a refund\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"received_debit\": {\n            \"description\": \"The Treasury [ReceivedDebit](https://stripe.com/docs/api/treasury/received_debits) representing this Issuing transaction if it is a capture\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"IssuingTransactionTreasury\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"item\": {\n        \"description\": \"A line item.\",\n        \"properties\": {\n          \"amount_discount\": {\n            \"description\": \"Total discount amount applied. If no discounts were applied, defaults to 0.\",\n            \"type\": \"integer\"\n          },\n          \"amount_subtotal\": {\n            \"description\": \"Total before any discounts or taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"Total tax amount applied. If no tax was applied, defaults to 0.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total after discounts and taxes.\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users. Defaults to product name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discounts\": {\n            \"description\": \"The discounts applied to the line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_discount_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"item\"],\n            \"type\": \"string\"\n          },\n          \"price\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/price\"\n              }\n            ],\n            \"description\": \"The price used to generate the line item.\",\n            \"nullable\": true\n          },\n          \"quantity\": {\n            \"description\": \"The quantity of products being purchased.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"taxes\": {\n            \"description\": \"The taxes applied to the line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_tax_amount\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"amount_discount\",\n          \"amount_subtotal\",\n          \"amount_tax\",\n          \"amount_total\",\n          \"currency\",\n          \"id\",\n          \"object\"\n        ],\n        \"title\": \"LineItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"discounts\", \"price\", \"taxes\"],\n        \"x-resourceId\": \"item\"\n      },\n      \"klarna_address\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"The payer address country\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"klarna_address\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"klarna_payer_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/klarna_address\"\n              }\n            ],\n            \"description\": \"The payer's address\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"klarna_payer_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"legal_entity_company\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"address_kana\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_japan_address\"\n              }\n            ],\n            \"description\": \"The Kana variation of the company's primary address (Japan only).\",\n            \"nullable\": true\n          },\n          \"address_kanji\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_japan_address\"\n              }\n            ],\n            \"description\": \"The Kanji variation of the company's primary address (Japan only).\",\n            \"nullable\": true\n          },\n          \"directors_provided\": {\n            \"description\": \"Whether the company's directors have been provided. This Boolean will be `true` if you've manually indicated that all directors are provided via [the `directors_provided` parameter](https://stripe.com/docs/api/accounts/update#update_account-company-directors_provided).\",\n            \"type\": \"boolean\"\n          },\n          \"directorship_declaration\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_directorship_declaration\"\n              }\n            ],\n            \"description\": \"This hash is used to attest that the director information provided to Stripe is both current and correct.\",\n            \"nullable\": true\n          },\n          \"executives_provided\": {\n            \"description\": \"Whether the company's executives have been provided. This Boolean will be `true` if you've manually indicated that all executives are provided via [the `executives_provided` parameter](https://stripe.com/docs/api/accounts/update#update_account-company-executives_provided), or if Stripe determined that sufficient executives were provided.\",\n            \"type\": \"boolean\"\n          },\n          \"export_license_id\": {\n            \"description\": \"The export license ID number of the company, also referred as Import Export Code (India only).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"export_purpose_code\": {\n            \"description\": \"The purpose code to use for export transactions (India only).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"The company's legal name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name_kana\": {\n            \"description\": \"The Kana variation of the company's legal name (Japan only).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name_kanji\": {\n            \"description\": \"The Kanji variation of the company's legal name (Japan only).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"owners_provided\": {\n            \"description\": \"Whether the company's owners have been provided. This Boolean will be `true` if you've manually indicated that all owners are provided via [the `owners_provided` parameter](https://stripe.com/docs/api/accounts/update#update_account-company-owners_provided), or if Stripe determined that sufficient owners were provided. Stripe determines ownership requirements using both the number of owners provided and their total percent ownership (calculated by adding the `percent_ownership` of each owner together).\",\n            \"type\": \"boolean\"\n          },\n          \"ownership_declaration\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_ubo_declaration\"\n              }\n            ],\n            \"description\": \"This hash is used to attest that the beneficial owner information provided to Stripe is both current and correct.\",\n            \"nullable\": true\n          },\n          \"ownership_exemption_reason\": {\n            \"enum\": [\n              \"qualified_entity_exceeds_ownership_threshold\",\n              \"qualifies_as_financial_institution\"\n            ],\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"The company's phone number (used for verification).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"structure\": {\n            \"description\": \"The category identifying the legal structure of the company or legal entity. See [Business structure](https://stripe.com/docs/connect/identity-verification#business-structure) for more details.\",\n            \"enum\": [\n              \"free_zone_establishment\",\n              \"free_zone_llc\",\n              \"government_instrumentality\",\n              \"governmental_unit\",\n              \"incorporated_non_profit\",\n              \"incorporated_partnership\",\n              \"limited_liability_partnership\",\n              \"llc\",\n              \"multi_member_llc\",\n              \"private_company\",\n              \"private_corporation\",\n              \"private_partnership\",\n              \"public_company\",\n              \"public_corporation\",\n              \"public_partnership\",\n              \"registered_charity\",\n              \"single_member_llc\",\n              \"sole_establishment\",\n              \"sole_proprietorship\",\n              \"tax_exempt_government_instrumentality\",\n              \"unincorporated_association\",\n              \"unincorporated_non_profit\",\n              \"unincorporated_partnership\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"tax_id_provided\": {\n            \"description\": \"Whether the company's business ID number was provided.\",\n            \"type\": \"boolean\"\n          },\n          \"tax_id_registrar\": {\n            \"description\": \"The jurisdiction in which the `tax_id` is registered (Germany-based companies only).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"vat_id_provided\": {\n            \"description\": \"Whether the company's business VAT number was provided.\",\n            \"type\": \"boolean\"\n          },\n          \"verification\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_company_verification\"\n              }\n            ],\n            \"description\": \"Information on the verification state of the company.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"LegalEntityCompany\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"address\",\n          \"address_kana\",\n          \"address_kanji\",\n          \"directorship_declaration\",\n          \"ownership_declaration\",\n          \"verification\"\n        ]\n      },\n      \"legal_entity_company_verification\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"document\": {\n            \"$ref\": \"#/components/schemas/legal_entity_company_verification_document\"\n          }\n        },\n        \"required\": [\"document\"],\n        \"title\": \"LegalEntityCompanyVerification\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"document\"]\n      },\n      \"legal_entity_company_verification_document\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"back\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The back of a document returned by a [file upload](https://stripe.com/docs/api#create_file) with a `purpose` value of `additional_verification`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"details\": {\n            \"description\": \"A user-displayable string describing the verification state of this document.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"details_code\": {\n            \"description\": \"One of `document_corrupt`, `document_expired`, `document_failed_copy`, `document_failed_greyscale`, `document_failed_other`, `document_failed_test_mode`, `document_fraudulent`, `document_incomplete`, `document_invalid`, `document_manipulated`, `document_not_readable`, `document_not_uploaded`, `document_type_not_supported`, or `document_too_large`. A machine-readable code specifying the verification state for this document.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"front\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The front of a document returned by a [file upload](https://stripe.com/docs/api#create_file) with a `purpose` value of `additional_verification`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"LegalEntityCompanyVerificationDocument\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"back\", \"front\"]\n      },\n      \"legal_entity_directorship_declaration\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"date\": {\n            \"description\": \"The Unix timestamp marking when the directorship declaration attestation was made.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ip\": {\n            \"description\": \"The IP address from which the directorship declaration attestation was made.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user-agent string from the browser where the directorship declaration attestation was made.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"LegalEntityDirectorshipDeclaration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"legal_entity_dob\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"The day of birth, between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"The month of birth, between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year of birth.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"LegalEntityDOB\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"legal_entity_japan_address\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"city\": {\n            \"description\": \"City/Ward.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line1\": {\n            \"description\": \"Block/Building number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line2\": {\n            \"description\": \"Building details.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"postal_code\": {\n            \"description\": \"ZIP or postal code.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"Prefecture.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"town\": {\n            \"description\": \"Town/cho-me.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"LegalEntityJapanAddress\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"legal_entity_person_verification\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"additional_document\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_person_verification_document\"\n              }\n            ],\n            \"description\": \"A document showing address, either a passport, local ID card, or utility bill from a well-known utility company.\",\n            \"nullable\": true\n          },\n          \"details\": {\n            \"description\": \"A user-displayable string describing the verification state for the person. For example, this may say \\\"Provided identity information could not be verified\\\".\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"details_code\": {\n            \"description\": \"One of `document_address_mismatch`, `document_dob_mismatch`, `document_duplicate_type`, `document_id_number_mismatch`, `document_name_mismatch`, `document_nationality_mismatch`, `failed_keyed_identity`, or `failed_other`. A machine-readable code specifying the verification state for the person.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"document\": {\n            \"$ref\": \"#/components/schemas/legal_entity_person_verification_document\"\n          },\n          \"status\": {\n            \"description\": \"The state of verification for the person. Possible values are `unverified`, `pending`, or `verified`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"LegalEntityPersonVerification\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"additional_document\", \"document\"]\n      },\n      \"legal_entity_person_verification_document\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"back\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The back of an ID returned by a [file upload](https://stripe.com/docs/api#create_file) with a `purpose` value of `identity_document`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          },\n          \"details\": {\n            \"description\": \"A user-displayable string describing the verification state of this document. For example, if a document is uploaded and the picture is too fuzzy, this may say \\\"Identity document is too unclear to read\\\".\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"details_code\": {\n            \"description\": \"One of `document_corrupt`, `document_country_not_supported`, `document_expired`, `document_failed_copy`, `document_failed_other`, `document_failed_test_mode`, `document_fraudulent`, `document_failed_greyscale`, `document_incomplete`, `document_invalid`, `document_manipulated`, `document_missing_back`, `document_missing_front`, `document_not_readable`, `document_not_uploaded`, `document_photo_mismatch`, `document_too_large`, or `document_type_not_supported`. A machine-readable code specifying the verification state for this document.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"front\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The front of an ID returned by a [file upload](https://stripe.com/docs/api#create_file) with a `purpose` value of `identity_document`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"LegalEntityPersonVerificationDocument\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"back\", \"front\"]\n      },\n      \"legal_entity_ubo_declaration\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"date\": {\n            \"description\": \"The Unix timestamp marking when the beneficial owner attestation was made.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ip\": {\n            \"description\": \"The IP address from which the beneficial owner attestation was made.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user-agent string from the browser where the beneficial owner attestation was made.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"LegalEntityUBODeclaration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"line_item\": {\n        \"description\": \"Invoice Line Items represent the individual lines within an [invoice](https://stripe.com/docs/api/invoices) and only exist within the context of an invoice.\\n\\nEach line item is backed by either an [invoice item](https://stripe.com/docs/api/invoiceitems) or a [subscription item](https://stripe.com/docs/api/subscription_items).\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"amount_excluding_tax\": {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount for this line item, excluding all tax and discounts.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discount_amounts\": {\n            \"description\": \"The amount of discount calculated per discount for this line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/discounts_resource_discount_amount\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"discountable\": {\n            \"description\": \"If true, discounts will apply to this line item. Always false for prorations.\",\n            \"type\": \"boolean\"\n          },\n          \"discounts\": {\n            \"description\": \"The discounts applied to the invoice line item. Line item discounts are applied before invoice discounts. Use `expand[]=discounts` to expand each discount.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/discount\"\n                  }\n                ]\n              }\n            },\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"description\": \"The ID of the invoice that contains this line item.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"invoice_item\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoiceitem\"\n              }\n            ],\n            \"description\": \"The ID of the [invoice item](https://stripe.com/docs/api/invoiceitems) associated with this line item if any.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoiceitem\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Note that for line items with `type=subscription`, `metadata` reflects the current metadata from the subscription associated with the line item, unless the invoice line was directly updated with different metadata after creation.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"line_item\"],\n            \"type\": \"string\"\n          },\n          \"period\": {\n            \"$ref\": \"#/components/schemas/invoice_line_item_period\"\n          },\n          \"pretax_credit_amounts\": {\n            \"description\": \"Contains pretax credit amounts (ex: discount, credit grants, etc) that apply to this line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoices_resource_pretax_credit_amount\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"price\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/price\"\n              }\n            ],\n            \"description\": \"The price of the line item.\",\n            \"nullable\": true\n          },\n          \"proration\": {\n            \"description\": \"Whether this is a proration.\",\n            \"type\": \"boolean\"\n          },\n          \"proration_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoices_resource_line_items_proration_details\"\n              }\n            ],\n            \"description\": \"Additional details for proration line items\",\n            \"nullable\": true\n          },\n          \"quantity\": {\n            \"description\": \"The quantity of the subscription, if the line item is a subscription or a proration.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"subscription\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription\"\n              }\n            ],\n            \"description\": \"The subscription that the invoice item pertains to, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              ]\n            }\n          },\n          \"subscription_item\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription_item\"\n              }\n            ],\n            \"description\": \"The subscription item that generated this line item. Left empty if the line item is not an explicit result of a subscription.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription_item\"\n                }\n              ]\n            }\n          },\n          \"tax_amounts\": {\n            \"description\": \"The amount of tax calculated per tax rate for this line item\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoice_tax_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"tax_rates\": {\n            \"description\": \"The tax rates which apply to the line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"type\": \"array\"\n          },\n          \"type\": {\n            \"description\": \"A string identifying the type of the source of this line item, either an `invoiceitem` or a `subscription`.\",\n            \"enum\": [\"invoiceitem\", \"subscription\"],\n            \"type\": \"string\"\n          },\n          \"unit_amount_excluding_tax\": {\n            \"description\": \"The amount in cents (or local equivalent) representing the unit amount for this line item, excluding all tax and discounts.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"currency\",\n          \"discountable\",\n          \"discounts\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"period\",\n          \"proration\",\n          \"tax_amounts\",\n          \"tax_rates\",\n          \"type\"\n        ],\n        \"title\": \"InvoiceLineItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"discount_amounts\",\n          \"discounts\",\n          \"invoice_item\",\n          \"period\",\n          \"pretax_credit_amounts\",\n          \"price\",\n          \"proration_details\",\n          \"subscription\",\n          \"subscription_item\",\n          \"tax_amounts\",\n          \"tax_rates\"\n        ],\n        \"x-resourceId\": \"line_item\"\n      },\n      \"line_items_discount_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount discounted.\",\n            \"type\": \"integer\"\n          },\n          \"discount\": {\n            \"$ref\": \"#/components/schemas/discount\"\n          }\n        },\n        \"required\": [\"amount\", \"discount\"],\n        \"title\": \"LineItemsDiscountAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"discount\"]\n      },\n      \"line_items_tax_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount of tax applied for this rate.\",\n            \"type\": \"integer\"\n          },\n          \"rate\": {\n            \"$ref\": \"#/components/schemas/tax_rate\"\n          },\n          \"taxability_reason\": {\n            \"description\": \"The reasoning behind this tax, for example, if the product is tax exempt. The possible values for this field may be extended as new tax rules are supported.\",\n            \"enum\": [\n              \"customer_exempt\",\n              \"not_collecting\",\n              \"not_subject_to_tax\",\n              \"not_supported\",\n              \"portion_product_exempt\",\n              \"portion_reduced_rated\",\n              \"portion_standard_rated\",\n              \"product_exempt\",\n              \"product_exempt_holiday\",\n              \"proportionally_rated\",\n              \"reduced_rated\",\n              \"reverse_charge\",\n              \"standard_rated\",\n              \"taxable_basis_reduced\",\n              \"zero_rated\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"taxable_amount\": {\n            \"description\": \"The amount on which tax is calculated, in cents (or local equivalent).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"amount\", \"rate\"],\n        \"title\": \"LineItemsTaxAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"rate\"]\n      },\n      \"linked_account_options_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"filters\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_us_bank_account_linked_account_options_filters\"\n          },\n          \"permissions\": {\n            \"description\": \"The list of permissions to request. The `payment_method` permission must be included.\",\n            \"items\": {\n              \"enum\": [\n                \"balances\",\n                \"ownership\",\n                \"payment_method\",\n                \"transactions\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"prefetch\": {\n            \"description\": \"Data features requested to be retrieved upon account creation.\",\n            \"items\": {\n              \"enum\": [\"balances\", \"ownership\", \"transactions\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"return_url\": {\n            \"description\": \"For webview integrations only. Upon completing OAuth login in the native browser, the user will be redirected to this URL to return to your app.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"linked_account_options_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"filters\"]\n      },\n      \"login_link\": {\n        \"description\": \"Login Links are single-use URLs for a connected account to access the Express Dashboard. The connected account's [account.controller.stripe_dashboard.type](/api/accounts/object#account_object-controller-stripe_dashboard-type) must be `express` to have access to the Express Dashboard.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"login_link\"],\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL for the login link.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"created\", \"object\", \"url\"],\n        \"title\": \"LoginLink\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"login_link\"\n      },\n      \"mandate\": {\n        \"description\": \"A Mandate is a record of the permission that your customer gives you to debit their payment method.\",\n        \"properties\": {\n          \"customer_acceptance\": {\n            \"$ref\": \"#/components/schemas/customer_acceptance\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"multi_use\": {\n            \"$ref\": \"#/components/schemas/mandate_multi_use\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"mandate\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"description\": \"The account (if any) that the mandate is intended for.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the payment method associated with this mandate.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"payment_method_details\": {\n            \"$ref\": \"#/components/schemas/mandate_payment_method_details\"\n          },\n          \"single_use\": {\n            \"$ref\": \"#/components/schemas/mandate_single_use\"\n          },\n          \"status\": {\n            \"description\": \"The mandate status indicates whether or not you can use it to initiate a payment.\",\n            \"enum\": [\"active\", \"inactive\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of the mandate.\",\n            \"enum\": [\"multi_use\", \"single_use\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"customer_acceptance\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"payment_method\",\n          \"payment_method_details\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"Mandate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"customer_acceptance\",\n          \"multi_use\",\n          \"payment_method\",\n          \"payment_method_details\",\n          \"single_use\"\n        ],\n        \"x-resourceId\": \"mandate\"\n      },\n      \"mandate_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"default_for\": {\n            \"description\": \"List of Stripe products where this mandate can be selected automatically.\",\n            \"items\": {\n              \"enum\": [\"invoice\", \"subscription\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"interval_description\": {\n            \"description\": \"Description of the interval. Only required if the 'payment_schedule' parameter is 'interval' or 'combined'.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_schedule\": {\n            \"description\": \"Payment schedule for the mandate.\",\n            \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n            \"type\": \"string\"\n          },\n          \"transaction_type\": {\n            \"description\": \"Transaction type of the mandate.\",\n            \"enum\": [\"business\", \"personal\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"payment_schedule\", \"transaction_type\"],\n        \"title\": \"mandate_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_amazon_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"mandate_amazon_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_au_becs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"url\": {\n            \"description\": \"The URL of the mandate. This URL generally contains sensitive information about the customer and should be shared with them exclusively.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"url\"],\n        \"title\": \"mandate_au_becs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"network_status\": {\n            \"description\": \"The status of the mandate on the Bacs network. Can be one of `pending`, `revoked`, `refused`, or `accepted`.\",\n            \"enum\": [\"accepted\", \"pending\", \"refused\", \"revoked\"],\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"The unique reference identifying the mandate on the Bacs network.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"revocation_reason\": {\n            \"description\": \"When the mandate is revoked on the Bacs network this field displays the reason for the revocation.\",\n            \"enum\": [\n              \"account_closed\",\n              \"bank_account_restricted\",\n              \"bank_ownership_changed\",\n              \"could_not_process\",\n              \"debit_not_authorized\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL that will contain the mandate that the customer has signed.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"network_status\", \"reference\", \"url\"],\n        \"title\": \"mandate_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_cashapp\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"mandate_cashapp\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_kakao_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"mandate_kakao_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_kr_card\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"mandate_kr_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_link\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"mandate_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_multi_use\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"mandate_multi_use\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/mandate_acss_debit\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/mandate_amazon_pay\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/mandate_au_becs_debit\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/mandate_bacs_debit\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/card_mandate_payment_method_details\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/mandate_cashapp\"\n          },\n          \"kakao_pay\": {\n            \"$ref\": \"#/components/schemas/mandate_kakao_pay\"\n          },\n          \"kr_card\": {\n            \"$ref\": \"#/components/schemas/mandate_kr_card\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/mandate_link\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/mandate_paypal\"\n          },\n          \"revolut_pay\": {\n            \"$ref\": \"#/components/schemas/mandate_revolut_pay\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/mandate_sepa_debit\"\n          },\n          \"type\": {\n            \"description\": \"This mandate corresponds with a specific payment method type. The `payment_method_details` includes an additional hash with the same name and contains mandate information that's specific to that payment method.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/mandate_us_bank_account\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"mandate_payment_method_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"amazon_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"card\",\n          \"cashapp\",\n          \"kakao_pay\",\n          \"kr_card\",\n          \"link\",\n          \"paypal\",\n          \"revolut_pay\",\n          \"sepa_debit\",\n          \"us_bank_account\"\n        ]\n      },\n      \"mandate_paypal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_agreement_id\": {\n            \"description\": \"The PayPal Billing Agreement ID (BAID). This is an ID generated by PayPal which represents the mandate between the merchant and the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payer_id\": {\n            \"description\": \"PayPal account PayerID. This identifier uniquely identifies the PayPal customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"mandate_paypal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_revolut_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"mandate_revolut_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The unique reference of the mandate.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL of the mandate. This URL generally contains sensitive information about the customer and should be shared with them exclusively.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"reference\", \"url\"],\n        \"title\": \"mandate_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_single_use\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount of the payment on a single use mandate.\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"The currency of the payment on a single use mandate.\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\"],\n        \"title\": \"mandate_single_use\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"mandate_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"collection_method\": {\n            \"description\": \"Mandate collection method\",\n            \"enum\": [\"paper\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"mandate_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"networks\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available\": {\n            \"description\": \"All networks available for selection via [payment_method_options.card.network](/api/payment_intents/confirm#confirm_payment_intent-payment_method_options-card-network).\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"preferred\": {\n            \"description\": \"The preferred network for co-branded cards. Can be `cartes_bancaires`, `mastercard`, `visa` or `invalid_preference` if requested network is not valid for the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"available\"],\n        \"title\": \"networks\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"notification_event_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"object\": {\n            \"description\": \"Object containing the API resource relevant to the event. For example, an `invoice.created` event will have a full [invoice object](https://stripe.com/docs/api#invoice_object) as the value of the object key.\",\n            \"type\": \"object\"\n          },\n          \"previous_attributes\": {\n            \"description\": \"Object containing the names of the updated attributes and their values prior to the event (only included in events of type `*.updated`). If an array attribute has any updated elements, this object contains the entire array. In Stripe API versions 2017-04-06 or earlier, an updated array attribute in this object includes only the updated array elements.\",\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"object\"],\n        \"title\": \"NotificationEventData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"notification_event_request\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"ID of the API request that caused the event. If null, the event was automatic (e.g., Stripe's automatic subscription handling). Request logs are available in the [dashboard](https://dashboard.stripe.com/logs), but currently not in the API.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"idempotency_key\": {\n            \"description\": \"The idempotency key transmitted during the request, if any. *Note: This property is populated only for events on or after May 23, 2017*.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"NotificationEventRequest\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"offline_acceptance\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"offline_acceptance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"online_acceptance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"ip_address\": {\n            \"description\": \"The customer accepts the mandate from this IP address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The customer accepts the mandate using the user agent of the browser.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"online_acceptance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"outbound_payments_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_details\": {\n            \"$ref\": \"#/components/schemas/treasury_shared_resource_billing_details\"\n          },\n          \"financial_account\": {\n            \"$ref\": \"#/components/schemas/outbound_payments_payment_method_details_financial_account\"\n          },\n          \"type\": {\n            \"description\": \"The type of the payment method used in the OutboundPayment.\",\n            \"enum\": [\"financial_account\", \"us_bank_account\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/outbound_payments_payment_method_details_us_bank_account\"\n          }\n        },\n        \"required\": [\"billing_details\", \"type\"],\n        \"title\": \"OutboundPaymentsPaymentMethodDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"billing_details\",\n          \"financial_account\",\n          \"us_bank_account\"\n        ]\n      },\n      \"outbound_payments_payment_method_details_financial_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Token of the FinancialAccount.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"network\": {\n            \"description\": \"The rails used to send funds.\",\n            \"enum\": [\"stripe\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"network\"],\n        \"title\": \"outbound_payments_payment_method_details_financial_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"outbound_payments_payment_method_details_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_holder_type\": {\n            \"description\": \"Account holder type: individual or company.\",\n            \"enum\": [\"company\", \"individual\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"Account type: checkings or savings. Defaults to checking if omitted.\",\n            \"enum\": [\"checking\", \"savings\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"ID of the mandate used to make this payment.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"network\": {\n            \"description\": \"The network rails used. See the [docs](https://stripe.com/docs/treasury/money-movement/timelines) to learn more about money movement timelines for each network type.\",\n            \"enum\": [\"ach\", \"us_domestic_wire\"],\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"network\"],\n        \"title\": \"outbound_payments_payment_method_details_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate\"]\n      },\n      \"outbound_transfers_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_details\": {\n            \"$ref\": \"#/components/schemas/treasury_shared_resource_billing_details\"\n          },\n          \"financial_account\": {\n            \"$ref\": \"#/components/schemas/outbound_transfers_payment_method_details_financial_account\"\n          },\n          \"type\": {\n            \"description\": \"The type of the payment method used in the OutboundTransfer.\",\n            \"enum\": [\"financial_account\", \"us_bank_account\"],\n            \"type\": \"string\"\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/outbound_transfers_payment_method_details_us_bank_account\"\n          }\n        },\n        \"required\": [\"billing_details\", \"type\"],\n        \"title\": \"OutboundTransfersPaymentMethodDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"billing_details\",\n          \"financial_account\",\n          \"us_bank_account\"\n        ]\n      },\n      \"outbound_transfers_payment_method_details_financial_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Token of the FinancialAccount.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"network\": {\n            \"description\": \"The rails used to send funds.\",\n            \"enum\": [\"stripe\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"network\"],\n        \"title\": \"outbound_transfers_payment_method_details_financial_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"outbound_transfers_payment_method_details_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_holder_type\": {\n            \"description\": \"Account holder type: individual or company.\",\n            \"enum\": [\"company\", \"individual\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"Account type: checkings or savings. Defaults to checking if omitted.\",\n            \"enum\": [\"checking\", \"savings\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"ID of the mandate used to make this payment.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"network\": {\n            \"description\": \"The network rails used. See the [docs](https://stripe.com/docs/treasury/money-movement/timelines) to learn more about money movement timelines for each network type.\",\n            \"enum\": [\"ach\", \"us_domestic_wire\"],\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"network\"],\n        \"title\": \"outbound_transfers_payment_method_details_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate\"]\n      },\n      \"package_dimensions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"height\": {\n            \"description\": \"Height, in inches.\",\n            \"type\": \"number\"\n          },\n          \"length\": {\n            \"description\": \"Length, in inches.\",\n            \"type\": \"number\"\n          },\n          \"weight\": {\n            \"description\": \"Weight, in ounces.\",\n            \"type\": \"number\"\n          },\n          \"width\": {\n            \"description\": \"Width, in inches.\",\n            \"type\": \"number\"\n          }\n        },\n        \"required\": [\"height\", \"length\", \"weight\", \"width\"],\n        \"title\": \"PackageDimensions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_amount_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tip\": {\n            \"$ref\": \"#/components/schemas/payment_flows_amount_details_client_resource_tip\"\n          }\n        },\n        \"title\": \"PaymentFlowsAmountDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tip\"]\n      },\n      \"payment_flows_amount_details_client\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tip\": {\n            \"$ref\": \"#/components/schemas/payment_flows_amount_details_client_resource_tip\"\n          }\n        },\n        \"title\": \"PaymentFlowsAmountDetailsClient\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tip\"]\n      },\n      \"payment_flows_amount_details_client_resource_tip\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Portion of the amount that corresponds to a tip.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PaymentFlowsAmountDetailsClientResourceTip\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_automatic_payment_methods_payment_intent\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allow_redirects\": {\n            \"description\": \"Controls whether this PaymentIntent will accept redirect-based payment methods.\\n\\nRedirect-based payment methods may require your customer to be redirected to a payment method's app or site for authentication or additional steps. To [confirm](https://stripe.com/docs/api/payment_intents/confirm) this PaymentIntent, you may be required to provide a `return_url` to redirect customers back to your site after they authenticate or complete the payment.\",\n            \"enum\": [\"always\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"enabled\": {\n            \"description\": \"Automatically calculates compatible payment methods\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentFlowsAutomaticPaymentMethodsPaymentIntent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_automatic_payment_methods_setup_intent\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allow_redirects\": {\n            \"description\": \"Controls whether this SetupIntent will accept redirect-based payment methods.\\n\\nRedirect-based payment methods may require your customer to be redirected to a payment method's app or site for authentication or additional steps. To [confirm](https://stripe.com/docs/api/setup_intents/confirm) this SetupIntent, you may be required to provide a `return_url` to redirect customers back to your site after they authenticate or complete the setup.\",\n            \"enum\": [\"always\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"enabled\": {\n            \"description\": \"Automatically calculates compatible payment methods\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"PaymentFlowsAutomaticPaymentMethodsSetupIntent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_installment_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\"\n          },\n          \"plan\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_installments_plan\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentFlowsInstallmentOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"plan\"]\n      },\n      \"payment_flows_private_payment_methods_alipay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsAlipay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_alipay_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"Uniquely identifies this particular Alipay account. You can use this attribute to check whether two Alipay accounts are the same.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular Alipay account. You can use this attribute to check whether two Alipay accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_id\": {\n            \"description\": \"Transaction ID of this particular Alipay transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsAlipayDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_card_details_api_resource_enterprise_features_extended_authorization_extended_authorization\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Indicates whether or not the capture window is extended beyond the standard authorization.\",\n            \"enum\": [\"disabled\", \"enabled\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsCardDetailsAPIResourceEnterpriseFeaturesExtendedAuthorizationExtendedAuthorization\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_card_details_api_resource_enterprise_features_incremental_authorization_incremental_authorization\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Indicates whether or not the incremental authorization feature is supported.\",\n            \"enum\": [\"available\", \"unavailable\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsCardDetailsAPIResourceEnterpriseFeaturesIncrementalAuthorizationIncrementalAuthorization\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_card_details_api_resource_enterprise_features_overcapture_overcapture\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"maximum_amount_capturable\": {\n            \"description\": \"The maximum amount that can be captured.\",\n            \"type\": \"integer\"\n          },\n          \"status\": {\n            \"description\": \"Indicates whether or not the authorized amount can be over-captured.\",\n            \"enum\": [\"available\", \"unavailable\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"maximum_amount_capturable\", \"status\"],\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsCardDetailsAPIResourceEnterpriseFeaturesOvercaptureOvercapture\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_card_details_api_resource_multicapture\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Indicates whether or not multiple captures are supported.\",\n            \"enum\": [\"available\", \"unavailable\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsCardDetailsAPIResourceMulticapture\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_card_present_common_wallet\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"The type of mobile wallet, one of `apple_pay`, `google_pay`, `samsung_pay`, or `unknown`.\",\n            \"enum\": [\"apple_pay\", \"google_pay\", \"samsung_pay\", \"unknown\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsCardPresentCommonWallet\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_kakao_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsKakaoPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_klarna_dob\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"day\": {\n            \"description\": \"The day of birth, between 1 and 31.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"The month of birth, between 1 and 12.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"year\": {\n            \"description\": \"The four-digit year of birth.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsKlarnaDOB\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_naver_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsNaverPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_payco_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsPaycoPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_samsung_pay_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsSamsungPayPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_flows_private_payment_methods_us_bank_account_linked_account_options_filters\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_subcategories\": {\n            \"description\": \"The account subcategories to use to filter for possible accounts to link. Valid subcategories are `checking` and `savings`.\",\n            \"items\": {\n              \"enum\": [\"checking\", \"savings\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"PaymentFlowsPrivatePaymentMethodsUsBankAccountLinkedAccountOptionsFilters\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent\": {\n        \"description\": \"A PaymentIntent guides you through the process of collecting a payment from your customer.\\nWe recommend that you create exactly one PaymentIntent for each order or\\ncustomer session in your system. You can reference the PaymentIntent later to\\nsee the history of payment attempts for a particular session.\\n\\nA PaymentIntent transitions through\\n[multiple statuses](https://stripe.com/docs/payments/intents#intent-statuses)\\nthroughout its lifetime as it interfaces with Stripe.js to perform\\nauthentication flows and ultimately creates at most one successful charge.\\n\\nRelated guide: [Payment Intents API](https://stripe.com/docs/payments/payment-intents)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount intended to be collected by this PaymentIntent. A positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or [equivalent in charge currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99).\",\n            \"type\": \"integer\"\n          },\n          \"amount_capturable\": {\n            \"description\": \"Amount that can be captured from this PaymentIntent.\",\n            \"type\": \"integer\"\n          },\n          \"amount_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_amount_details\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_amount_details_client\"\n              }\n            ]\n          },\n          \"amount_received\": {\n            \"description\": \"Amount that this PaymentIntent collects.\",\n            \"type\": \"integer\"\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              }\n            ],\n            \"description\": \"ID of the Connect application that created the PaymentIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                }\n              ]\n            }\n          },\n          \"application_fee_amount\": {\n            \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total payment amount. For more information, see the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"automatic_payment_methods\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_automatic_payment_methods_payment_intent\"\n              }\n            ],\n            \"description\": \"Settings to configure compatible payment methods from the [Stripe Dashboard](https://dashboard.stripe.com/settings/payment_methods)\",\n            \"nullable\": true\n          },\n          \"canceled_at\": {\n            \"description\": \"Populated when `status` is `canceled`, this is the time at which the PaymentIntent was canceled. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cancellation_reason\": {\n            \"description\": \"Reason for cancellation of this PaymentIntent, either user-provided (`duplicate`, `fraudulent`, `requested_by_customer`, or `abandoned`) or generated by Stripe internally (`failed_invoice`, `void_invoice`, or `automatic`).\",\n            \"enum\": [\n              \"abandoned\",\n              \"automatic\",\n              \"duplicate\",\n              \"failed_invoice\",\n              \"fraudulent\",\n              \"requested_by_customer\",\n              \"void_invoice\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"automatic\", \"automatic_async\", \"manual\"],\n            \"type\": \"string\"\n          },\n          \"client_secret\": {\n            \"description\": \"The client secret of this PaymentIntent. Used for client-side retrieval using a publishable key. \\n\\nThe client secret can be used to complete a payment from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.\\n\\nRefer to our docs to [accept a payment](https://stripe.com/docs/payments/accept-a-payment?ui=elements) and learn about how `client_secret` should be handled.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"confirmation_method\": {\n            \"description\": \"Describes whether we can confirm this PaymentIntent automatically, or if it requires customer action to confirm the payment.\",\n            \"enum\": [\"automatic\", \"manual\"],\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"ID of the Customer this PaymentIntent belongs to, if one exists.\\n\\nPayment methods attached to other Customers cannot be used with this PaymentIntent.\\n\\nIf [setup_future_usage](https://stripe.com/docs/api#payment_intent_object-setup_future_usage) is set and this PaymentIntent's payment method is not `card_present`, then the payment method attaches to the Customer after the PaymentIntent has been confirmed and any required actions from the user are complete. If the payment method is `card_present` and isn't a digital wallet, then a [generated_card](https://docs.stripe.com/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card is created and attached to the Customer instead.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"ID of the invoice that created this PaymentIntent, if it exists.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"last_payment_error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/api_errors\"\n              }\n            ],\n            \"description\": \"The payment error encountered in the previous PaymentIntent confirmation. It will be cleared if the PaymentIntent is later updated for any reason.\",\n            \"nullable\": true\n          },\n          \"latest_charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the latest [Charge object](https://stripe.com/docs/api/charges) created by this PaymentIntent. This property is `null` until PaymentIntent confirmation is attempted.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Learn more about [storing information in metadata](https://stripe.com/docs/payments/payment-intents/creating-payment-intents#storing-information-in-metadata).\",\n            \"type\": \"object\"\n          },\n          \"next_action\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_next_action\"\n              }\n            ],\n            \"description\": \"If present, this property tells you what actions you need to take in order for your customer to fulfill a payment using the provided source.\",\n            \"nullable\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"payment_intent\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) for which the funds of the PaymentIntent are intended. See the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts) for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the payment method used in this PaymentIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"payment_method_configuration_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_config_biz_payment_method_configuration_details\"\n              }\n            ],\n            \"description\": \"Information about the [payment method configuration](https://stripe.com/docs/api/payment_method_configurations) used for this PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"payment_method_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options\"\n              }\n            ],\n            \"description\": \"Payment-method-specific configuration for this PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"payment_method_types\": {\n            \"description\": \"The list of payment method types (e.g. card) that this PaymentIntent is allowed to use.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"processing\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_processing\"\n              }\n            ],\n            \"description\": \"If present, this property tells you about the processing state of the payment.\",\n            \"nullable\": true\n          },\n          \"receipt_email\": {\n            \"description\": \"Email address that the receipt for the resulting payment will be sent to. If `receipt_email` is specified for a payment in live mode, a receipt will be sent regardless of your [email settings](https://dashboard.stripe.com/account/emails).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"review\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/review\"\n              }\n            ],\n            \"description\": \"ID of the review associated with this PaymentIntent, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/review\"\n                }\n              ]\n            }\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"off_session\", \"on_session\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping\"\n              }\n            ],\n            \"description\": \"Shipping information for this PaymentIntent.\",\n            \"nullable\": true\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Text that appears on the customer's statement as the statement descriptor for a non-card charge. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\\n\\nSetting this value for a card charge returns an error. For card charges, set the [statement_descriptor_suffix](https://docs.stripe.com/get-started/account/statement-descriptors#dynamic) instead.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_suffix\": {\n            \"description\": \"Provides information about a card charge. Concatenated to the account's [statement descriptor prefix](https://docs.stripe.com/get-started/account/statement-descriptors#static) to form the complete statement descriptor that appears on the customer's statement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of this PaymentIntent, one of `requires_payment_method`, `requires_confirmation`, `requires_action`, `processing`, `requires_capture`, `canceled`, or `succeeded`. Read more about each PaymentIntent [status](https://stripe.com/docs/payments/intents#intent-statuses).\",\n            \"enum\": [\n              \"canceled\",\n              \"processing\",\n              \"requires_action\",\n              \"requires_capture\",\n              \"requires_confirmation\",\n              \"requires_payment_method\",\n              \"succeeded\"\n            ],\n            \"type\": \"string\"\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/transfer_data\"\n              }\n            ],\n            \"description\": \"The data that automatically creates a Transfer after the payment finalizes. Learn more about the [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n            \"nullable\": true\n          },\n          \"transfer_group\": {\n            \"description\": \"A string that identifies the resulting payment as part of a group. Learn more about the [use case for connected accounts](https://stripe.com/docs/connect/separate-charges-and-transfers).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"capture_method\",\n          \"confirmation_method\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"payment_method_types\",\n          \"status\"\n        ],\n        \"title\": \"PaymentIntent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"amount_details\",\n          \"application\",\n          \"automatic_payment_methods\",\n          \"customer\",\n          \"invoice\",\n          \"last_payment_error\",\n          \"latest_charge\",\n          \"next_action\",\n          \"on_behalf_of\",\n          \"payment_method\",\n          \"payment_method_configuration_details\",\n          \"payment_method_options\",\n          \"processing\",\n          \"review\",\n          \"shipping\",\n          \"transfer_data\"\n        ],\n        \"x-resourceId\": \"payment_intent\"\n      },\n      \"payment_intent_card_processing\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"customer_notification\": {\n            \"$ref\": \"#/components/schemas/payment_intent_processing_customer_notification\"\n          }\n        },\n        \"title\": \"PaymentIntentCardProcessing\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"customer_notification\"]\n      },\n      \"payment_intent_next_action\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alipay_handle_redirect\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_alipay_handle_redirect\"\n          },\n          \"boleto_display_details\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_boleto\"\n          },\n          \"card_await_notification\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_card_await_notification\"\n          },\n          \"cashapp_handle_redirect_or_display_qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_cashapp_handle_redirect_or_display_qr_code\"\n          },\n          \"display_bank_transfer_instructions\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_display_bank_transfer_instructions\"\n          },\n          \"konbini_display_details\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_konbini\"\n          },\n          \"multibanco_display_details\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_display_multibanco_details\"\n          },\n          \"oxxo_display_details\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_display_oxxo_details\"\n          },\n          \"paynow_display_qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_paynow_display_qr_code\"\n          },\n          \"pix_display_qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_pix_display_qr_code\"\n          },\n          \"promptpay_display_qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_promptpay_display_qr_code\"\n          },\n          \"redirect_to_url\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_redirect_to_url\"\n          },\n          \"swish_handle_redirect_or_display_qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_swish_handle_redirect_or_display_qr_code\"\n          },\n          \"type\": {\n            \"description\": \"Type of the next action to perform, one of `redirect_to_url`, `use_stripe_sdk`, `alipay_handle_redirect`, `oxxo_display_details`, or `verify_with_microdeposits`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"use_stripe_sdk\": {\n            \"description\": \"When confirming a PaymentIntent with Stripe.js, Stripe.js depends on the contents of this dictionary to invoke authentication flows. The shape of the contents is subject to change and is only intended to be used by Stripe.js.\",\n            \"type\": \"object\"\n          },\n          \"verify_with_microdeposits\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_verify_with_microdeposits\"\n          },\n          \"wechat_pay_display_qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_wechat_pay_display_qr_code\"\n          },\n          \"wechat_pay_redirect_to_android_app\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_wechat_pay_redirect_to_android_app\"\n          },\n          \"wechat_pay_redirect_to_ios_app\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_wechat_pay_redirect_to_ios_app\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentIntentNextAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"alipay_handle_redirect\",\n          \"boleto_display_details\",\n          \"card_await_notification\",\n          \"cashapp_handle_redirect_or_display_qr_code\",\n          \"display_bank_transfer_instructions\",\n          \"konbini_display_details\",\n          \"multibanco_display_details\",\n          \"oxxo_display_details\",\n          \"paynow_display_qr_code\",\n          \"pix_display_qr_code\",\n          \"promptpay_display_qr_code\",\n          \"redirect_to_url\",\n          \"swish_handle_redirect_or_display_qr_code\",\n          \"verify_with_microdeposits\",\n          \"wechat_pay_display_qr_code\",\n          \"wechat_pay_redirect_to_android_app\",\n          \"wechat_pay_redirect_to_ios_app\"\n        ]\n      },\n      \"payment_intent_next_action_alipay_handle_redirect\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"native_data\": {\n            \"description\": \"The native data to be used with Alipay SDK you must redirect your customer to in order to authenticate the payment in an Android App.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"native_url\": {\n            \"description\": \"The native URL you must redirect your customer to in order to authenticate the payment in an iOS App.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"return_url\": {\n            \"description\": \"If the customer does not exit their browser while authenticating, they will be redirected to this specified URL after completion.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL you must redirect your customer to in order to authenticate the payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentIntentNextActionAlipayHandleRedirect\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_boleto\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_at\": {\n            \"description\": \"The timestamp after which the boleto expires.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"hosted_voucher_url\": {\n            \"description\": \"The URL to the hosted boleto voucher page, which allows customers to view the boleto voucher.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"number\": {\n            \"description\": \"The boleto number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"pdf\": {\n            \"description\": \"The URL to the downloadable boleto voucher PDF.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_next_action_boleto\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_card_await_notification\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"charge_attempt_at\": {\n            \"description\": \"The time that payment will be attempted. If customer approval is required, they need to provide approval before this time.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"customer_approval_required\": {\n            \"description\": \"For payments greater than INR 15000, the customer must provide explicit approval of the payment with their bank. For payments of lower amount, no customer action is required.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"PaymentIntentNextActionCardAwaitNotification\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_cashapp_handle_redirect_or_display_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"hosted_instructions_url\": {\n            \"description\": \"The URL to the hosted Cash App Pay instructions page, which allows customers to view the QR code, and supports QR code refreshing on expiration.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"mobile_auth_url\": {\n            \"description\": \"The url for mobile redirect based auth\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_cashapp_qr_code\"\n          }\n        },\n        \"required\": [\"hosted_instructions_url\", \"mobile_auth_url\", \"qr_code\"],\n        \"title\": \"PaymentIntentNextActionCashappHandleRedirectOrDisplayQrCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"qr_code\"]\n      },\n      \"payment_intent_next_action_cashapp_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_at\": {\n            \"description\": \"The date (unix timestamp) when the QR code expires.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"image_url_png\": {\n            \"description\": \"The image_url_png string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_svg\": {\n            \"description\": \"The image_url_svg string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"expires_at\", \"image_url_png\", \"image_url_svg\"],\n        \"title\": \"PaymentIntentNextActionCashappQRCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_display_bank_transfer_instructions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_remaining\": {\n            \"description\": \"The remaining amount that needs to be transferred to complete the payment.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"financial_addresses\": {\n            \"description\": \"A list of financial addresses that can be used to fund the customer balance\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/funding_instructions_bank_transfer_financial_address\"\n            },\n            \"type\": \"array\"\n          },\n          \"hosted_instructions_url\": {\n            \"description\": \"A link to a hosted page that guides your customer through completing the transfer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"A string identifying this payment. Instruct your customer to include this code in the reference or memo field of their bank transfer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Type of bank transfer\",\n            \"enum\": [\n              \"eu_bank_transfer\",\n              \"gb_bank_transfer\",\n              \"jp_bank_transfer\",\n              \"mx_bank_transfer\",\n              \"us_bank_transfer\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentIntentNextActionDisplayBankTransferInstructions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"financial_addresses\"]\n      },\n      \"payment_intent_next_action_display_multibanco_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"entity\": {\n            \"description\": \"Entity number associated with this Multibanco payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which the Multibanco voucher expires.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"hosted_voucher_url\": {\n            \"description\": \"The URL for the hosted Multibanco voucher page, which allows customers to view a Multibanco voucher.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"Reference number associated with this Multibanco payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentIntentNextActionDisplayMultibancoDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_display_oxxo_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after\": {\n            \"description\": \"The timestamp after which the OXXO voucher expires.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"hosted_voucher_url\": {\n            \"description\": \"The URL for the hosted OXXO voucher page, which allows customers to view and print an OXXO voucher.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"number\": {\n            \"description\": \"OXXO reference number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentIntentNextActionDisplayOxxoDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_konbini\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_at\": {\n            \"description\": \"The timestamp at which the pending Konbini payment expires.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"hosted_voucher_url\": {\n            \"description\": \"The URL for the Konbini payment instructions page, which allows customers to view and print a Konbini voucher.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"stores\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_konbini_stores\"\n          }\n        },\n        \"required\": [\"expires_at\", \"stores\"],\n        \"title\": \"payment_intent_next_action_konbini\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"stores\"]\n      },\n      \"payment_intent_next_action_konbini_familymart\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"confirmation_number\": {\n            \"description\": \"The confirmation number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"payment_code\": {\n            \"description\": \"The payment code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"payment_code\"],\n        \"title\": \"payment_intent_next_action_konbini_familymart\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_konbini_lawson\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"confirmation_number\": {\n            \"description\": \"The confirmation number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"payment_code\": {\n            \"description\": \"The payment code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"payment_code\"],\n        \"title\": \"payment_intent_next_action_konbini_lawson\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_konbini_ministop\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"confirmation_number\": {\n            \"description\": \"The confirmation number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"payment_code\": {\n            \"description\": \"The payment code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"payment_code\"],\n        \"title\": \"payment_intent_next_action_konbini_ministop\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_konbini_seicomart\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"confirmation_number\": {\n            \"description\": \"The confirmation number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"payment_code\": {\n            \"description\": \"The payment code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"payment_code\"],\n        \"title\": \"payment_intent_next_action_konbini_seicomart\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_konbini_stores\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"familymart\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_next_action_konbini_familymart\"\n              }\n            ],\n            \"description\": \"FamilyMart instruction details.\",\n            \"nullable\": true\n          },\n          \"lawson\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_next_action_konbini_lawson\"\n              }\n            ],\n            \"description\": \"Lawson instruction details.\",\n            \"nullable\": true\n          },\n          \"ministop\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_next_action_konbini_ministop\"\n              }\n            ],\n            \"description\": \"Ministop instruction details.\",\n            \"nullable\": true\n          },\n          \"seicomart\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_next_action_konbini_seicomart\"\n              }\n            ],\n            \"description\": \"Seicomart instruction details.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_intent_next_action_konbini_stores\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"familymart\", \"lawson\", \"ministop\", \"seicomart\"]\n      },\n      \"payment_intent_next_action_paynow_display_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"data\": {\n            \"description\": \"The raw data string used to generate QR code, it should be used together with QR code library.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"hosted_instructions_url\": {\n            \"description\": \"The URL to the hosted PayNow instructions page, which allows customers to view the PayNow QR code.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"image_url_png\": {\n            \"description\": \"The image_url_png string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_svg\": {\n            \"description\": \"The image_url_svg string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"data\", \"image_url_png\", \"image_url_svg\"],\n        \"title\": \"PaymentIntentNextActionPaynowDisplayQrCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_pix_display_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"data\": {\n            \"description\": \"The raw data string used to generate QR code, it should be used together with QR code library.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"expires_at\": {\n            \"description\": \"The date (unix timestamp) when the PIX expires.\",\n            \"type\": \"integer\"\n          },\n          \"hosted_instructions_url\": {\n            \"description\": \"The URL to the hosted pix instructions page, which allows customers to view the pix QR code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_png\": {\n            \"description\": \"The image_url_png string used to render png QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_svg\": {\n            \"description\": \"The image_url_svg string used to render svg QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentIntentNextActionPixDisplayQrCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_promptpay_display_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"data\": {\n            \"description\": \"The raw data string used to generate QR code, it should be used together with QR code library.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"hosted_instructions_url\": {\n            \"description\": \"The URL to the hosted PromptPay instructions page, which allows customers to view the PromptPay QR code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_png\": {\n            \"description\": \"The PNG path used to render the QR code, can be used as the source in an HTML img tag\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_svg\": {\n            \"description\": \"The SVG path used to render the QR code, can be used as the source in an HTML img tag\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"data\",\n          \"hosted_instructions_url\",\n          \"image_url_png\",\n          \"image_url_svg\"\n        ],\n        \"title\": \"PaymentIntentNextActionPromptpayDisplayQrCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_redirect_to_url\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"return_url\": {\n            \"description\": \"If the customer does not exit their browser while authenticating, they will be redirected to this specified URL after completion.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL you must redirect your customer to in order to authenticate the payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentIntentNextActionRedirectToUrl\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_swish_handle_redirect_or_display_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"hosted_instructions_url\": {\n            \"description\": \"The URL to the hosted Swish instructions page, which allows customers to view the QR code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_swish_qr_code\"\n          }\n        },\n        \"required\": [\"hosted_instructions_url\", \"qr_code\"],\n        \"title\": \"PaymentIntentNextActionSwishHandleRedirectOrDisplayQrCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"qr_code\"]\n      },\n      \"payment_intent_next_action_swish_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"data\": {\n            \"description\": \"The raw data string used to generate QR code, it should be used together with QR code library.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_png\": {\n            \"description\": \"The image_url_png string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_svg\": {\n            \"description\": \"The image_url_svg string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"data\", \"image_url_png\", \"image_url_svg\"],\n        \"title\": \"PaymentIntentNextActionSwishQRCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_verify_with_microdeposits\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"arrival_date\": {\n            \"description\": \"The timestamp when the microdeposits are expected to land.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"hosted_verification_url\": {\n            \"description\": \"The URL for the hosted verification page, which allows customers to verify their bank account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"microdeposit_type\": {\n            \"description\": \"The type of the microdeposit sent to the customer. Used to distinguish between different verification methods.\",\n            \"enum\": [\"amounts\", \"descriptor_code\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"arrival_date\", \"hosted_verification_url\"],\n        \"title\": \"PaymentIntentNextActionVerifyWithMicrodeposits\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_wechat_pay_display_qr_code\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"data\": {\n            \"description\": \"The data being used to generate QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"hosted_instructions_url\": {\n            \"description\": \"The URL to the hosted WeChat Pay instructions page, which allows customers to view the WeChat Pay QR code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_data_url\": {\n            \"description\": \"The base64 image data for a pre-generated QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_png\": {\n            \"description\": \"The image_url_png string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"image_url_svg\": {\n            \"description\": \"The image_url_svg string used to render QR code\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"data\",\n          \"hosted_instructions_url\",\n          \"image_data_url\",\n          \"image_url_png\",\n          \"image_url_svg\"\n        ],\n        \"title\": \"PaymentIntentNextActionWechatPayDisplayQrCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_wechat_pay_redirect_to_android_app\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"app_id\": {\n            \"description\": \"app_id is the APP ID registered on WeChat open platform\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"nonce_str\": {\n            \"description\": \"nonce_str is a random string\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"package\": {\n            \"description\": \"package is static value\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"partner_id\": {\n            \"description\": \"an unique merchant ID assigned by WeChat Pay\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"prepay_id\": {\n            \"description\": \"an unique trading ID assigned by WeChat Pay\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sign\": {\n            \"description\": \"A signature\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"timestamp\": {\n            \"description\": \"Specifies the current time in epoch format\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"app_id\",\n          \"nonce_str\",\n          \"package\",\n          \"partner_id\",\n          \"prepay_id\",\n          \"sign\",\n          \"timestamp\"\n        ],\n        \"title\": \"PaymentIntentNextActionWechatPayRedirectToAndroidApp\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_next_action_wechat_pay_redirect_to_ios_app\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"native_url\": {\n            \"description\": \"An universal link that redirect to WeChat Pay app\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"native_url\"],\n        \"title\": \"PaymentIntentNextActionWechatPayRedirectToIOSApp\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_acss_debit\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"affirm\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_affirm\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"afterpay_clearpay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_afterpay_clearpay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"alipay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_alipay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"alma\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_alma\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"amazon_pay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_amazon_pay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"au_becs_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_au_becs_debit\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"bacs_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_bacs_debit\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"bancontact\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_bancontact\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"blik\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_blik\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"boleto\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_boleto\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"card_present\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_card_present\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"cashapp\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_cashapp\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"customer_balance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_customer_balance\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"eps\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_eps\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"fpx\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_fpx\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"giropay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_giropay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"grabpay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_grabpay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"ideal\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_ideal\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"interac_present\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_interac_present\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"kakao_pay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_kakao_pay_payment_method_options\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"klarna\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_klarna\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"konbini\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_konbini\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"kr_card\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_kr_card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"link\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_link\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"mobilepay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_mobilepay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"multibanco\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_multibanco\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"naver_pay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_naver_pay_payment_method_options\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"oxxo\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_oxxo\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"p24\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_p24\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"pay_by_bank\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_pay_by_bank\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"payco\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_payco_payment_method_options\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"paynow\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_paynow\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"paypal\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_paypal\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"pix\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_pix\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"promptpay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_promptpay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"revolut_pay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_revolut_pay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"samsung_pay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_samsung_pay_payment_method_options\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_sepa_debit\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"sofort\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_sofort\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"swish\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_swish\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"twint\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_twint\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"us_bank_account\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_us_bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"wechat_pay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_wechat_pay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"zip\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_zip\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          }\n        },\n        \"title\": \"PaymentIntentPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"affirm\",\n          \"afterpay_clearpay\",\n          \"alipay\",\n          \"alma\",\n          \"amazon_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"bancontact\",\n          \"blik\",\n          \"boleto\",\n          \"card\",\n          \"card_present\",\n          \"cashapp\",\n          \"customer_balance\",\n          \"eps\",\n          \"fpx\",\n          \"giropay\",\n          \"grabpay\",\n          \"ideal\",\n          \"interac_present\",\n          \"kakao_pay\",\n          \"klarna\",\n          \"konbini\",\n          \"kr_card\",\n          \"link\",\n          \"mobilepay\",\n          \"multibanco\",\n          \"naver_pay\",\n          \"oxxo\",\n          \"p24\",\n          \"pay_by_bank\",\n          \"payco\",\n          \"paynow\",\n          \"paypal\",\n          \"pix\",\n          \"promptpay\",\n          \"revolut_pay\",\n          \"samsung_pay\",\n          \"sepa_debit\",\n          \"sofort\",\n          \"swish\",\n          \"twint\",\n          \"us_bank_account\",\n          \"wechat_pay\",\n          \"zip\"\n        ]\n      },\n      \"payment_intent_payment_method_options_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_mandate_options_acss_debit\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"payment_intent_payment_method_options_au_becs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_au_becs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_mandate_options_bacs_debit\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"payment_intent_payment_method_options_blik\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_blik\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"installments\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_card_installments\"\n              }\n            ],\n            \"description\": \"Installment details for this payment (Mexico only).\\n\\nFor more information, see the [installments integration guide](https://stripe.com/docs/payments/installments).\",\n            \"nullable\": true\n          },\n          \"mandate_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_options_card_mandate_options\"\n              }\n            ],\n            \"description\": \"Configuration options for setting up an eMandate for cards issued in India.\",\n            \"nullable\": true\n          },\n          \"network\": {\n            \"description\": \"Selected network to process this payment intent on. Depends on the available networks of the card attached to the payment intent. Can be only set confirm-time.\",\n            \"enum\": [\n              \"amex\",\n              \"cartes_bancaires\",\n              \"diners\",\n              \"discover\",\n              \"eftpos_au\",\n              \"girocard\",\n              \"interac\",\n              \"jcb\",\n              \"link\",\n              \"mastercard\",\n              \"unionpay\",\n              \"unknown\",\n              \"visa\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"request_extended_authorization\": {\n            \"description\": \"Request ability to [capture beyond the standard authorization validity window](https://stripe.com/docs/payments/extended-authorization) for this PaymentIntent.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_incremental_authorization\": {\n            \"description\": \"Request ability to [increment the authorization](https://stripe.com/docs/payments/incremental-authorization) for this PaymentIntent.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_multicapture\": {\n            \"description\": \"Request ability to make [multiple captures](https://stripe.com/docs/payments/multicapture) for this PaymentIntent.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_overcapture\": {\n            \"description\": \"Request ability to [overcapture](https://stripe.com/docs/payments/overcapture) for this PaymentIntent.\",\n            \"enum\": [\"if_available\", \"never\"],\n            \"type\": \"string\"\n          },\n          \"request_three_d_secure\": {\n            \"description\": \"We strongly recommend that you rely on our SCA Engine to automatically prompt your customers for authentication based on risk level and [other requirements](https://stripe.com/docs/strong-customer-authentication). However, if you wish to request 3D Secure based on logic from your own fraud engine, provide this option. If not provided, this value defaults to `automatic`. Read our guide on [manually requesting 3D Secure](https://stripe.com/docs/payments/3d-secure/authentication-flow#manual-three-ds) for more information on how this configuration interacts with Radar and our SCA Engine.\",\n            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"require_cvc_recollection\": {\n            \"description\": \"When enabled, using a card that is attached to a customer will require the CVC to be provided again (i.e. using the cvc_token parameter).\",\n            \"type\": \"boolean\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_suffix_kana\": {\n            \"description\": \"Provides information about a card payment that customers see on their statements. Concatenated with the Kana prefix (shortened Kana descriptor) or Kana statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 22 characters. On card statements, the *concatenation* of both prefix and suffix (including separators) will appear truncated to 22 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_suffix_kanji\": {\n            \"description\": \"Provides information about a card payment that customers see on their statements. Concatenated with the Kanji prefix (shortened Kanji descriptor) or Kanji statement descriptor that’s set on the account to form the complete statement descriptor. Maximum 17 characters. On card statements, the *concatenation* of both prefix and suffix (including separators) will appear truncated to 17 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"installments\", \"mandate_options\"]\n      },\n      \"payment_intent_payment_method_options_eps\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_eps\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_link\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_mandate_options_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom_mandate_url\": {\n            \"description\": \"A URL for custom mandate text\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"interval_description\": {\n            \"description\": \"Description of the interval. Only required if the 'payment_schedule' parameter is 'interval' or 'combined'.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_schedule\": {\n            \"description\": \"Payment schedule for the mandate.\",\n            \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_type\": {\n            \"description\": \"Transaction type of the mandate.\",\n            \"enum\": [\"business\", \"personal\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_mandate_options_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_mandate_options_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference_prefix\": {\n            \"description\": \"Prefix used to generate the Mandate reference. Must be at most 12 characters long. Must consist of only uppercase letters, numbers, spaces, or the following special characters: '/', '_', '-', '&', '.'. Cannot begin with 'DDIC' or 'STRIPE'.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_mandate_options_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_mandate_options_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference_prefix\": {\n            \"description\": \"Prefix used to generate the Mandate reference. Must be at most 12 characters long. Must consist of only uppercase letters, numbers, spaces, or the following special characters: '/', '_', '-', '&', '.'. Cannot begin with 'STRIPE'.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_mandate_options_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_mobilepay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_mobilepay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/payment_intent_payment_method_options_mandate_options_sepa_debit\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"payment_intent_payment_method_options_swish\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"A reference for this payment to be displayed in the Swish app.\",\n            \"maxLength\": 35,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_swish\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_payment_method_options_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"financial_connections\": {\n            \"$ref\": \"#/components/schemas/linked_account_options_us_bank_account\"\n          },\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/payment_method_options_us_bank_account_mandate_options\"\n          },\n          \"preferred_settlement_speed\": {\n            \"description\": \"Preferred transaction settlement speed\",\n            \"enum\": [\"fastest\", \"standard\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"target_date\": {\n            \"description\": \"Controls when Stripe will attempt to debit the funds from the customer's account. The date must be a string in YYYY-MM-DD format. The date must be in the future and between 3 and 15 calendar days from now.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_intent_payment_method_options_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"financial_connections\", \"mandate_options\"]\n      },\n      \"payment_intent_processing\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card\": {\n            \"$ref\": \"#/components/schemas/payment_intent_card_processing\"\n          },\n          \"type\": {\n            \"description\": \"Type of the payment method for which payment is in `processing` state, one of `card`.\",\n            \"enum\": [\"card\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentIntentProcessing\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card\"]\n      },\n      \"payment_intent_processing_customer_notification\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"approval_requested\": {\n            \"description\": \"Whether customer approval has been requested for this payment. For payments greater than INR 15000 or mandate amount, the customer must provide explicit approval of the payment with their bank.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"completes_at\": {\n            \"description\": \"If customer approval is required, they need to provide approval before this time.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PaymentIntentProcessingCustomerNotification\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_intent_type_specific_payment_method_options_client\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\", \"manual_preferred\"],\n            \"type\": \"string\"\n          },\n          \"installments\": {\n            \"$ref\": \"#/components/schemas/payment_flows_installment_options\"\n          },\n          \"request_incremental_authorization_support\": {\n            \"description\": \"Request ability to [increment](https://stripe.com/docs/terminal/features/incremental-authorizations) this PaymentIntent if the combination of MCC and card brand is eligible. Check [incremental_authorization_supported](https://stripe.com/docs/api/charges/object#charge_object-payment_method_details-card_present-incremental_authorization_supported) in the [Confirm](https://stripe.com/docs/api/payment_intents/confirm) response to verify support.\",\n            \"type\": \"boolean\"\n          },\n          \"require_cvc_recollection\": {\n            \"description\": \"When enabled, using a card that is attached to a customer will require the CVC to be provided again (i.e. using the cvc_token parameter).\",\n            \"type\": \"boolean\"\n          },\n          \"routing\": {\n            \"$ref\": \"#/components/schemas/payment_method_options_card_present_routing\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"PaymentIntentTypeSpecificPaymentMethodOptionsClient\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"installments\", \"routing\"]\n      },\n      \"payment_link\": {\n        \"description\": \"A payment link is a shareable URL that will take your customers to a hosted payment page. A payment link can be shared and used multiple times.\\n\\nWhen a customer opens a payment link it will open a new [checkout session](https://stripe.com/docs/api/checkout/sessions) to render the payment page. You can use [checkout session events](https://stripe.com/docs/api/events/types#event_types-checkout.session.completed) to track payments through payment links.\\n\\nRelated guide: [Payment Links API](https://stripe.com/docs/payment-links)\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Whether the payment link's `url` is active. If `false`, customers visiting the URL will be shown a page saying that the link has been deactivated.\",\n            \"type\": \"boolean\"\n          },\n          \"after_completion\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_after_completion\"\n          },\n          \"allow_promotion_codes\": {\n            \"description\": \"Whether user redeemable promotion codes are enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_application\"\n              }\n            ],\n            \"description\": \"The ID of the Connect application that created the Payment Link.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_application\"\n                }\n              ]\n            }\n          },\n          \"application_fee_amount\": {\n            \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"application_fee_percent\": {\n            \"description\": \"This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"automatic_tax\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_automatic_tax\"\n          },\n          \"billing_address_collection\": {\n            \"description\": \"Configuration for collecting the customer's billing address. Defaults to `auto`.\",\n            \"enum\": [\"auto\", \"required\"],\n            \"type\": \"string\"\n          },\n          \"consent_collection\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_consent_collection\"\n              }\n            ],\n            \"description\": \"When set, provides configuration to gather active consent from customers.\",\n            \"nullable\": true\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"custom_fields\": {\n            \"description\": \"Collect additional information from your customer using custom fields. Up to 3 fields are supported.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_links_resource_custom_fields\"\n            },\n            \"type\": \"array\"\n          },\n          \"custom_text\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_custom_text\"\n          },\n          \"customer_creation\": {\n            \"description\": \"Configuration for Customer creation during checkout.\",\n            \"enum\": [\"always\", \"if_required\"],\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"inactive_message\": {\n            \"description\": \"The custom message to be displayed to a customer when a payment link is no longer active.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"invoice_creation\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_invoice_creation\"\n              }\n            ],\n            \"description\": \"Configuration for creating invoice for payment mode payment links.\",\n            \"nullable\": true\n          },\n          \"line_items\": {\n            \"description\": \"The line items representing what is being sold.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"PaymentLinksResourceListLineItems\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"payment_link\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account on behalf of which to charge. See the [Connect documentation](https://support.stripe.com/questions/sending-invoices-on-behalf-of-connected-accounts) for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"payment_intent_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_payment_intent_data\"\n              }\n            ],\n            \"description\": \"Indicates the parameters to be passed to PaymentIntent creation during checkout.\",\n            \"nullable\": true\n          },\n          \"payment_method_collection\": {\n            \"description\": \"Configuration for collecting a payment method during checkout. Defaults to `always`.\",\n            \"enum\": [\"always\", \"if_required\"],\n            \"type\": \"string\"\n          },\n          \"payment_method_types\": {\n            \"description\": \"The list of payment method types that customers can use. When `null`, Stripe will dynamically show relevant payment methods you've enabled in your [payment method settings](https://dashboard.stripe.com/settings/payment_methods).\",\n            \"items\": {\n              \"enum\": [\n                \"affirm\",\n                \"afterpay_clearpay\",\n                \"alipay\",\n                \"alma\",\n                \"au_becs_debit\",\n                \"bacs_debit\",\n                \"bancontact\",\n                \"blik\",\n                \"boleto\",\n                \"card\",\n                \"cashapp\",\n                \"eps\",\n                \"fpx\",\n                \"giropay\",\n                \"grabpay\",\n                \"ideal\",\n                \"klarna\",\n                \"konbini\",\n                \"link\",\n                \"mobilepay\",\n                \"multibanco\",\n                \"oxxo\",\n                \"p24\",\n                \"pay_by_bank\",\n                \"paynow\",\n                \"paypal\",\n                \"pix\",\n                \"promptpay\",\n                \"sepa_debit\",\n                \"sofort\",\n                \"swish\",\n                \"twint\",\n                \"us_bank_account\",\n                \"wechat_pay\",\n                \"zip\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"phone_number_collection\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_phone_number_collection\"\n          },\n          \"restrictions\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_restrictions\"\n              }\n            ],\n            \"description\": \"Settings that restrict the usage of a payment link.\",\n            \"nullable\": true\n          },\n          \"shipping_address_collection\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_shipping_address_collection\"\n              }\n            ],\n            \"description\": \"Configuration for collecting the customer's shipping address.\",\n            \"nullable\": true\n          },\n          \"shipping_options\": {\n            \"description\": \"The shipping rate options applied to the session.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_links_resource_shipping_option\"\n            },\n            \"type\": \"array\"\n          },\n          \"submit_type\": {\n            \"description\": \"Indicates the type of transaction being performed which customizes relevant text on the page, such as the submit button.\",\n            \"enum\": [\"auto\", \"book\", \"donate\", \"pay\", \"subscribe\"],\n            \"type\": \"string\"\n          },\n          \"subscription_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_subscription_data\"\n              }\n            ],\n            \"description\": \"When creating a subscription, the specified configuration data will be used. There must be at least one line item with a recurring price to use `subscription_data`.\",\n            \"nullable\": true\n          },\n          \"tax_id_collection\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_tax_id_collection\"\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_transfer_data\"\n              }\n            ],\n            \"description\": \"The account (if any) the payments will be attributed to for tax reporting, and where funds from each payment will be transferred to.\",\n            \"nullable\": true\n          },\n          \"url\": {\n            \"description\": \"The public URL that can be shared with customers.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"after_completion\",\n          \"allow_promotion_codes\",\n          \"automatic_tax\",\n          \"billing_address_collection\",\n          \"currency\",\n          \"custom_fields\",\n          \"custom_text\",\n          \"customer_creation\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"payment_method_collection\",\n          \"phone_number_collection\",\n          \"shipping_options\",\n          \"submit_type\",\n          \"tax_id_collection\",\n          \"url\"\n        ],\n        \"title\": \"PaymentLink\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"after_completion\",\n          \"application\",\n          \"automatic_tax\",\n          \"consent_collection\",\n          \"custom_fields\",\n          \"custom_text\",\n          \"invoice_creation\",\n          \"line_items\",\n          \"on_behalf_of\",\n          \"payment_intent_data\",\n          \"phone_number_collection\",\n          \"restrictions\",\n          \"shipping_address_collection\",\n          \"shipping_options\",\n          \"subscription_data\",\n          \"tax_id_collection\",\n          \"transfer_data\"\n        ],\n        \"x-resourceId\": \"payment_link\"\n      },\n      \"payment_links_resource_after_completion\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"hosted_confirmation\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_completion_behavior_confirmation_page\"\n          },\n          \"redirect\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_completion_behavior_redirect\"\n          },\n          \"type\": {\n            \"description\": \"The specified behavior after the purchase is complete.\",\n            \"enum\": [\"hosted_confirmation\", \"redirect\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentLinksResourceAfterCompletion\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"hosted_confirmation\", \"redirect\"]\n      },\n      \"payment_links_resource_automatic_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"If `true`, tax will be calculated automatically using the customer's location.\",\n            \"type\": \"boolean\"\n          },\n          \"liability\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The account that's liable for tax. If set, the business address and tax registrations required to perform the tax calculation are loaded from this account. The tax transaction is returned in the report of the connected account.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentLinksResourceAutomaticTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"liability\"]\n      },\n      \"payment_links_resource_completed_sessions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"count\": {\n            \"description\": \"The current number of checkout sessions that have been completed on the payment link which count towards the `completed_sessions` restriction to be met.\",\n            \"type\": \"integer\"\n          },\n          \"limit\": {\n            \"description\": \"The maximum number of checkout sessions that can be completed for the `completed_sessions` restriction to be met.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"count\", \"limit\"],\n        \"title\": \"PaymentLinksResourceCompletedSessions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_completion_behavior_confirmation_page\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom_message\": {\n            \"description\": \"The custom message that is displayed to the customer after the purchase is complete.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentLinksResourceCompletionBehaviorConfirmationPage\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_completion_behavior_redirect\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"url\": {\n            \"description\": \"The URL the customer will be redirected to after the purchase is complete.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"url\"],\n        \"title\": \"PaymentLinksResourceCompletionBehaviorRedirect\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_consent_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payment_method_reuse_agreement\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_payment_method_reuse_agreement\"\n              }\n            ],\n            \"description\": \"Settings related to the payment method reuse text shown in the Checkout UI.\",\n            \"nullable\": true\n          },\n          \"promotions\": {\n            \"description\": \"If set to `auto`, enables the collection of customer consent for promotional communications.\",\n            \"enum\": [\"auto\", \"none\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terms_of_service\": {\n            \"description\": \"If set to `required`, it requires cutomers to accept the terms of service before being able to pay. If set to `none`, customers won't be shown a checkbox to accept the terms of service.\",\n            \"enum\": [\"none\", \"required\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentLinksResourceConsentCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_method_reuse_agreement\"]\n      },\n      \"payment_links_resource_custom_fields\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"dropdown\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_custom_fields_dropdown\"\n          },\n          \"key\": {\n            \"description\": \"String of your choice that your integration can use to reconcile this field. Must be unique to this field, alphanumeric, and up to 200 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"label\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_custom_fields_label\"\n          },\n          \"numeric\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_custom_fields_numeric\"\n          },\n          \"optional\": {\n            \"description\": \"Whether the customer is required to complete the field before completing the Checkout Session. Defaults to `false`.\",\n            \"type\": \"boolean\"\n          },\n          \"text\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_custom_fields_text\"\n          },\n          \"type\": {\n            \"description\": \"The type of the field.\",\n            \"enum\": [\"dropdown\", \"numeric\", \"text\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"key\", \"label\", \"optional\", \"type\"],\n        \"title\": \"PaymentLinksResourceCustomFields\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"dropdown\", \"label\", \"numeric\", \"text\"]\n      },\n      \"payment_links_resource_custom_fields_dropdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"options\": {\n            \"description\": \"The options available for the customer to select. Up to 200 options allowed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_links_resource_custom_fields_dropdown_option\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"options\"],\n        \"title\": \"PaymentLinksResourceCustomFieldsDropdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"options\"]\n      },\n      \"payment_links_resource_custom_fields_dropdown_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"label\": {\n            \"description\": \"The label for the option, displayed to the customer. Up to 100 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The value for this option, not displayed to the customer, used by your integration to reconcile the option selected by the customer. Must be unique to this option, alphanumeric, and up to 100 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"label\", \"value\"],\n        \"title\": \"PaymentLinksResourceCustomFieldsDropdownOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_custom_fields_label\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom\": {\n            \"description\": \"Custom text for the label, displayed to the customer. Up to 50 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of the label.\",\n            \"enum\": [\"custom\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentLinksResourceCustomFieldsLabel\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_custom_fields_numeric\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"maximum_length\": {\n            \"description\": \"The maximum character length constraint for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"minimum_length\": {\n            \"description\": \"The minimum character length requirement for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PaymentLinksResourceCustomFieldsNumeric\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_custom_fields_text\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"maximum_length\": {\n            \"description\": \"The maximum character length constraint for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"minimum_length\": {\n            \"description\": \"The minimum character length requirement for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PaymentLinksResourceCustomFieldsText\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_custom_text\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"after_submit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed after the payment confirmation button.\",\n            \"nullable\": true\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed alongside shipping address collection.\",\n            \"nullable\": true\n          },\n          \"submit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed alongside the payment confirmation button.\",\n            \"nullable\": true\n          },\n          \"terms_of_service_acceptance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed in place of the default terms of service agreement text.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"PaymentLinksResourceCustomText\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"after_submit\",\n          \"shipping_address\",\n          \"submit\",\n          \"terms_of_service_acceptance\"\n        ]\n      },\n      \"payment_links_resource_custom_text_position\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"message\": {\n            \"description\": \"Text may be up to 1200 characters in length.\",\n            \"maxLength\": 500,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"message\"],\n        \"title\": \"PaymentLinksResourceCustomTextPosition\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_invoice_creation\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Enable creating an invoice on successful payment.\",\n            \"type\": \"boolean\"\n          },\n          \"invoice_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_links_resource_invoice_settings\"\n              }\n            ],\n            \"description\": \"Configuration for the invoice. Default invoice values will be used if unspecified.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentLinksResourceInvoiceCreation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"invoice_data\"]\n      },\n      \"payment_links_resource_invoice_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_tax_ids\": {\n            \"description\": \"The account tax IDs associated with the invoice.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_id\"\n                  },\n                  {\n                    \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"custom_fields\": {\n            \"description\": \"A list of up to 4 custom fields to be displayed on the invoice.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoice_setting_custom_field\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"footer\": {\n            \"description\": \"Footer to be displayed on the invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuer\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n            \"nullable\": true\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"rendering_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_setting_checkout_rendering_options\"\n              }\n            ],\n            \"description\": \"Options for invoice PDF rendering.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"PaymentLinksResourceInvoiceSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account_tax_ids\",\n          \"custom_fields\",\n          \"issuer\",\n          \"rendering_options\"\n        ]\n      },\n      \"payment_links_resource_payment_intent_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Indicates when the funds will be captured from the customer's account.\",\n            \"enum\": [\"automatic\", \"automatic_async\", \"manual\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that will set metadata on [Payment Intents](https://stripe.com/docs/api/payment_intents) generated from this payment link.\",\n            \"type\": \"object\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with the payment method collected during checkout.\",\n            \"enum\": [\"off_session\", \"on_session\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"description\": \"For a non-card payment, information about the charge that appears on the customer's statement when this payment succeeds in creating a charge.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor_suffix\": {\n            \"description\": \"For a card payment, information about the charge that appears on the customer's statement when this payment succeeds in creating a charge. Concatenated with the account's statement descriptor prefix to form the complete statement descriptor.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transfer_group\": {\n            \"description\": \"A string that identifies the resulting payment as part of a group. See the PaymentIntents [use case for connected accounts](https://stripe.com/docs/connect/separate-charges-and-transfers) for details.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"metadata\"],\n        \"title\": \"PaymentLinksResourcePaymentIntentData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_payment_method_reuse_agreement\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"position\": {\n            \"description\": \"Determines the position and visibility of the payment method reuse agreement in the UI. When set to `auto`, Stripe's defaults will be used.\\n\\nWhen set to `hidden`, the payment method reuse agreement text will always be hidden in the UI.\",\n            \"enum\": [\"auto\", \"hidden\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"position\"],\n        \"title\": \"PaymentLinksResourcePaymentMethodReuseAgreement\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_phone_number_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"If `true`, a phone number will be collected during checkout.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentLinksResourcePhoneNumberCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_restrictions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"completed_sessions\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_completed_sessions\"\n          }\n        },\n        \"required\": [\"completed_sessions\"],\n        \"title\": \"PaymentLinksResourceRestrictions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"completed_sessions\"]\n      },\n      \"payment_links_resource_shipping_address_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allowed_countries\": {\n            \"description\": \"An array of two-letter ISO country codes representing which countries Checkout should provide as options for shipping locations. Unsupported country codes: `AS, CX, CC, CU, HM, IR, KP, MH, FM, NF, MP, PW, SD, SY, UM, VI`.\",\n            \"items\": {\n              \"enum\": [\n                \"AC\",\n                \"AD\",\n                \"AE\",\n                \"AF\",\n                \"AG\",\n                \"AI\",\n                \"AL\",\n                \"AM\",\n                \"AO\",\n                \"AQ\",\n                \"AR\",\n                \"AT\",\n                \"AU\",\n                \"AW\",\n                \"AX\",\n                \"AZ\",\n                \"BA\",\n                \"BB\",\n                \"BD\",\n                \"BE\",\n                \"BF\",\n                \"BG\",\n                \"BH\",\n                \"BI\",\n                \"BJ\",\n                \"BL\",\n                \"BM\",\n                \"BN\",\n                \"BO\",\n                \"BQ\",\n                \"BR\",\n                \"BS\",\n                \"BT\",\n                \"BV\",\n                \"BW\",\n                \"BY\",\n                \"BZ\",\n                \"CA\",\n                \"CD\",\n                \"CF\",\n                \"CG\",\n                \"CH\",\n                \"CI\",\n                \"CK\",\n                \"CL\",\n                \"CM\",\n                \"CN\",\n                \"CO\",\n                \"CR\",\n                \"CV\",\n                \"CW\",\n                \"CY\",\n                \"CZ\",\n                \"DE\",\n                \"DJ\",\n                \"DK\",\n                \"DM\",\n                \"DO\",\n                \"DZ\",\n                \"EC\",\n                \"EE\",\n                \"EG\",\n                \"EH\",\n                \"ER\",\n                \"ES\",\n                \"ET\",\n                \"FI\",\n                \"FJ\",\n                \"FK\",\n                \"FO\",\n                \"FR\",\n                \"GA\",\n                \"GB\",\n                \"GD\",\n                \"GE\",\n                \"GF\",\n                \"GG\",\n                \"GH\",\n                \"GI\",\n                \"GL\",\n                \"GM\",\n                \"GN\",\n                \"GP\",\n                \"GQ\",\n                \"GR\",\n                \"GS\",\n                \"GT\",\n                \"GU\",\n                \"GW\",\n                \"GY\",\n                \"HK\",\n                \"HN\",\n                \"HR\",\n                \"HT\",\n                \"HU\",\n                \"ID\",\n                \"IE\",\n                \"IL\",\n                \"IM\",\n                \"IN\",\n                \"IO\",\n                \"IQ\",\n                \"IS\",\n                \"IT\",\n                \"JE\",\n                \"JM\",\n                \"JO\",\n                \"JP\",\n                \"KE\",\n                \"KG\",\n                \"KH\",\n                \"KI\",\n                \"KM\",\n                \"KN\",\n                \"KR\",\n                \"KW\",\n                \"KY\",\n                \"KZ\",\n                \"LA\",\n                \"LB\",\n                \"LC\",\n                \"LI\",\n                \"LK\",\n                \"LR\",\n                \"LS\",\n                \"LT\",\n                \"LU\",\n                \"LV\",\n                \"LY\",\n                \"MA\",\n                \"MC\",\n                \"MD\",\n                \"ME\",\n                \"MF\",\n                \"MG\",\n                \"MK\",\n                \"ML\",\n                \"MM\",\n                \"MN\",\n                \"MO\",\n                \"MQ\",\n                \"MR\",\n                \"MS\",\n                \"MT\",\n                \"MU\",\n                \"MV\",\n                \"MW\",\n                \"MX\",\n                \"MY\",\n                \"MZ\",\n                \"NA\",\n                \"NC\",\n                \"NE\",\n                \"NG\",\n                \"NI\",\n                \"NL\",\n                \"NO\",\n                \"NP\",\n                \"NR\",\n                \"NU\",\n                \"NZ\",\n                \"OM\",\n                \"PA\",\n                \"PE\",\n                \"PF\",\n                \"PG\",\n                \"PH\",\n                \"PK\",\n                \"PL\",\n                \"PM\",\n                \"PN\",\n                \"PR\",\n                \"PS\",\n                \"PT\",\n                \"PY\",\n                \"QA\",\n                \"RE\",\n                \"RO\",\n                \"RS\",\n                \"RU\",\n                \"RW\",\n                \"SA\",\n                \"SB\",\n                \"SC\",\n                \"SD\",\n                \"SE\",\n                \"SG\",\n                \"SH\",\n                \"SI\",\n                \"SJ\",\n                \"SK\",\n                \"SL\",\n                \"SM\",\n                \"SN\",\n                \"SO\",\n                \"SR\",\n                \"SS\",\n                \"ST\",\n                \"SV\",\n                \"SX\",\n                \"SZ\",\n                \"TA\",\n                \"TC\",\n                \"TD\",\n                \"TF\",\n                \"TG\",\n                \"TH\",\n                \"TJ\",\n                \"TK\",\n                \"TL\",\n                \"TM\",\n                \"TN\",\n                \"TO\",\n                \"TR\",\n                \"TT\",\n                \"TV\",\n                \"TW\",\n                \"TZ\",\n                \"UA\",\n                \"UG\",\n                \"US\",\n                \"UY\",\n                \"UZ\",\n                \"VA\",\n                \"VC\",\n                \"VE\",\n                \"VG\",\n                \"VN\",\n                \"VU\",\n                \"WF\",\n                \"WS\",\n                \"XK\",\n                \"YE\",\n                \"YT\",\n                \"ZA\",\n                \"ZM\",\n                \"ZW\",\n                \"ZZ\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"allowed_countries\"],\n        \"title\": \"PaymentLinksResourceShippingAddressCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_shipping_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"shipping_amount\": {\n            \"description\": \"A non-negative integer in cents representing how much to charge.\",\n            \"type\": \"integer\"\n          },\n          \"shipping_rate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/shipping_rate\"\n              }\n            ],\n            \"description\": \"The ID of the Shipping Rate to use for this shipping option.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/shipping_rate\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"shipping_amount\", \"shipping_rate\"],\n        \"title\": \"PaymentLinksResourceShippingOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"shipping_rate\"]\n      },\n      \"payment_links_resource_subscription_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"description\": {\n            \"description\": \"The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"invoice_settings\": {\n            \"$ref\": \"#/components/schemas/payment_links_resource_subscription_data_invoice_settings\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that will set metadata on [Subscriptions](https://stripe.com/docs/api/subscriptions) generated from this payment link.\",\n            \"type\": \"object\"\n          },\n          \"trial_period_days\": {\n            \"description\": \"Integer representing the number of trial period days before the customer is charged for the first time.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"trial_settings\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscriptions_trials_resource_trial_settings\"\n              }\n            ],\n            \"description\": \"Settings related to subscription trials.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"invoice_settings\", \"metadata\"],\n        \"title\": \"PaymentLinksResourceSubscriptionData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"invoice_settings\", \"trial_settings\"]\n      },\n      \"payment_links_resource_subscription_data_invoice_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"issuer\": {\n            \"$ref\": \"#/components/schemas/connect_account_reference\"\n          }\n        },\n        \"required\": [\"issuer\"],\n        \"title\": \"PaymentLinksResourceSubscriptionDataInvoiceSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"issuer\"]\n      },\n      \"payment_links_resource_tax_id_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Indicates whether tax ID collection is enabled for the session.\",\n            \"type\": \"boolean\"\n          },\n          \"required\": {\n            \"enum\": [\"if_supported\", \"never\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"enabled\", \"required\"],\n        \"title\": \"PaymentLinksResourceTaxIdCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_links_resource_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount in cents (or local equivalent) that will be transferred to the destination account. By default, the entire amount is transferred to the destination.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The connected account receiving the transfer.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"destination\"],\n        \"title\": \"PaymentLinksResourceTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"destination\"]\n      },\n      \"payment_method\": {\n        \"description\": \"PaymentMethod objects represent your customer's payment instruments.\\nYou can use them with [PaymentIntents](https://stripe.com/docs/payments/payment-intents) to collect payments or save them to\\nCustomer objects to store instrument details for future payments.\\n\\nRelated guides: [Payment Methods](https://stripe.com/docs/payments/payment-methods) and [More Payment Scenarios](https://stripe.com/docs/payments/more-payment-scenarios).\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_acss_debit\"\n          },\n          \"affirm\": {\n            \"$ref\": \"#/components/schemas/payment_method_affirm\"\n          },\n          \"afterpay_clearpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_afterpay_clearpay\"\n          },\n          \"alipay\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_alipay\"\n          },\n          \"allow_redisplay\": {\n            \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to “unspecified”.\",\n            \"enum\": [\"always\", \"limited\", \"unspecified\"],\n            \"type\": \"string\"\n          },\n          \"alma\": {\n            \"$ref\": \"#/components/schemas/payment_method_alma\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_amazon_pay\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_au_becs_debit\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_bacs_debit\"\n          },\n          \"bancontact\": {\n            \"$ref\": \"#/components/schemas/payment_method_bancontact\"\n          },\n          \"billing_details\": {\n            \"$ref\": \"#/components/schemas/billing_details\"\n          },\n          \"blik\": {\n            \"$ref\": \"#/components/schemas/payment_method_blik\"\n          },\n          \"boleto\": {\n            \"$ref\": \"#/components/schemas/payment_method_boleto\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/payment_method_card\"\n          },\n          \"card_present\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_present\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/payment_method_cashapp\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"The ID of the Customer to which this PaymentMethod is saved. This will not be set when the PaymentMethod has not been saved to a Customer.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"customer_balance\": {\n            \"$ref\": \"#/components/schemas/payment_method_customer_balance\"\n          },\n          \"eps\": {\n            \"$ref\": \"#/components/schemas/payment_method_eps\"\n          },\n          \"fpx\": {\n            \"$ref\": \"#/components/schemas/payment_method_fpx\"\n          },\n          \"giropay\": {\n            \"$ref\": \"#/components/schemas/payment_method_giropay\"\n          },\n          \"grabpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_grabpay\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"ideal\": {\n            \"$ref\": \"#/components/schemas/payment_method_ideal\"\n          },\n          \"interac_present\": {\n            \"$ref\": \"#/components/schemas/payment_method_interac_present\"\n          },\n          \"kakao_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_kakao_pay\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/payment_method_klarna\"\n          },\n          \"konbini\": {\n            \"$ref\": \"#/components/schemas/payment_method_konbini\"\n          },\n          \"kr_card\": {\n            \"$ref\": \"#/components/schemas/payment_method_kr_card\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/payment_method_link\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"mobilepay\": {\n            \"$ref\": \"#/components/schemas/payment_method_mobilepay\"\n          },\n          \"multibanco\": {\n            \"$ref\": \"#/components/schemas/payment_method_multibanco\"\n          },\n          \"naver_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_naver_pay\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"payment_method\"],\n            \"type\": \"string\"\n          },\n          \"oxxo\": {\n            \"$ref\": \"#/components/schemas/payment_method_oxxo\"\n          },\n          \"p24\": {\n            \"$ref\": \"#/components/schemas/payment_method_p24\"\n          },\n          \"pay_by_bank\": {\n            \"$ref\": \"#/components/schemas/payment_method_pay_by_bank\"\n          },\n          \"payco\": {\n            \"$ref\": \"#/components/schemas/payment_method_payco\"\n          },\n          \"paynow\": {\n            \"$ref\": \"#/components/schemas/payment_method_paynow\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/payment_method_paypal\"\n          },\n          \"pix\": {\n            \"$ref\": \"#/components/schemas/payment_method_pix\"\n          },\n          \"promptpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_promptpay\"\n          },\n          \"radar_options\": {\n            \"$ref\": \"#/components/schemas/radar_radar_options\"\n          },\n          \"revolut_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_revolut_pay\"\n          },\n          \"samsung_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_samsung_pay\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_sepa_debit\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/payment_method_sofort\"\n          },\n          \"swish\": {\n            \"$ref\": \"#/components/schemas/payment_method_swish\"\n          },\n          \"twint\": {\n            \"$ref\": \"#/components/schemas/payment_method_twint\"\n          },\n          \"type\": {\n            \"description\": \"The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type.\",\n            \"enum\": [\n              \"acss_debit\",\n              \"affirm\",\n              \"afterpay_clearpay\",\n              \"alipay\",\n              \"alma\",\n              \"amazon_pay\",\n              \"au_becs_debit\",\n              \"bacs_debit\",\n              \"bancontact\",\n              \"blik\",\n              \"boleto\",\n              \"card\",\n              \"card_present\",\n              \"cashapp\",\n              \"customer_balance\",\n              \"eps\",\n              \"fpx\",\n              \"giropay\",\n              \"grabpay\",\n              \"ideal\",\n              \"interac_present\",\n              \"kakao_pay\",\n              \"klarna\",\n              \"konbini\",\n              \"kr_card\",\n              \"link\",\n              \"mobilepay\",\n              \"multibanco\",\n              \"naver_pay\",\n              \"oxxo\",\n              \"p24\",\n              \"pay_by_bank\",\n              \"payco\",\n              \"paynow\",\n              \"paypal\",\n              \"pix\",\n              \"promptpay\",\n              \"revolut_pay\",\n              \"samsung_pay\",\n              \"sepa_debit\",\n              \"sofort\",\n              \"swish\",\n              \"twint\",\n              \"us_bank_account\",\n              \"wechat_pay\",\n              \"zip\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/payment_method_us_bank_account\"\n          },\n          \"wechat_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_wechat_pay\"\n          },\n          \"zip\": {\n            \"$ref\": \"#/components/schemas/payment_method_zip\"\n          }\n        },\n        \"required\": [\n          \"billing_details\",\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"type\"\n        ],\n        \"title\": \"PaymentMethod\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"affirm\",\n          \"afterpay_clearpay\",\n          \"alipay\",\n          \"alma\",\n          \"amazon_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"bancontact\",\n          \"billing_details\",\n          \"blik\",\n          \"boleto\",\n          \"card\",\n          \"card_present\",\n          \"cashapp\",\n          \"customer\",\n          \"customer_balance\",\n          \"eps\",\n          \"fpx\",\n          \"giropay\",\n          \"grabpay\",\n          \"ideal\",\n          \"interac_present\",\n          \"kakao_pay\",\n          \"klarna\",\n          \"konbini\",\n          \"kr_card\",\n          \"link\",\n          \"mobilepay\",\n          \"multibanco\",\n          \"naver_pay\",\n          \"oxxo\",\n          \"p24\",\n          \"pay_by_bank\",\n          \"payco\",\n          \"paynow\",\n          \"paypal\",\n          \"pix\",\n          \"promptpay\",\n          \"radar_options\",\n          \"revolut_pay\",\n          \"samsung_pay\",\n          \"sepa_debit\",\n          \"sofort\",\n          \"swish\",\n          \"twint\",\n          \"us_bank_account\",\n          \"wechat_pay\",\n          \"zip\"\n        ],\n        \"x-resourceId\": \"payment_method\"\n      },\n      \"payment_method_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"institution_number\": {\n            \"description\": \"Institution number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transit_number\": {\n            \"description\": \"Transit number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_affirm\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_affirm\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_afterpay_clearpay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_afterpay_clearpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_alma\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_alma\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_amazon_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_amazon_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_au_becs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bsb_number\": {\n            \"description\": \"Six-digit number identifying bank and branch associated with this bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_au_becs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"sort_code\": {\n            \"description\": \"Sort code of the bank account. (e.g., `10-20-30`)\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_bancontact\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_bancontact\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_blik\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_blik\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_boleto\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tax_id\": {\n            \"description\": \"Uniquely identifies the customer tax id (CNPJ or CPF)\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"tax_id\"],\n        \"title\": \"payment_method_boleto\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"checks\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_card_checks\"\n              }\n            ],\n            \"description\": \"Checks on Card address and CVC if provided.\",\n            \"nullable\": true\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"display_brand\": {\n            \"description\": \"The brand to use when displaying the card, this accounts for customer's brand choice on dual-branded cards. Can be `american_express`, `cartes_bancaires`, `diners_club`, `discover`, `eftpos_australia`, `interac`, `jcb`, `mastercard`, `union_pay`, `visa`, or `other` and may contain more values in the future.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"generated_from\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_card_generated_card\"\n              }\n            ],\n            \"description\": \"Details of the original PaymentMethod that created this object.\",\n            \"nullable\": true\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"networks\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/networks\"\n              }\n            ],\n            \"description\": \"Contains information about card networks that can be used to process the payment.\",\n            \"nullable\": true\n          },\n          \"regulated_status\": {\n            \"description\": \"Status of a card based on the card issuer.\",\n            \"enum\": [\"regulated\", \"unregulated\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"three_d_secure_usage\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/three_d_secure_usage\"\n              }\n            ],\n            \"description\": \"Contains details on how this Card may be used for 3D Secure authentication.\",\n            \"nullable\": true\n          },\n          \"wallet\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_card_wallet\"\n              }\n            ],\n            \"description\": \"If this Card is part of a card wallet, this contains the details of the card wallet.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"brand\", \"exp_month\", \"exp_year\", \"funding\", \"last4\"],\n        \"title\": \"payment_method_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"checks\",\n          \"generated_from\",\n          \"networks\",\n          \"three_d_secure_usage\",\n          \"wallet\"\n        ]\n      },\n      \"payment_method_card_checks\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address_line1_check\": {\n            \"description\": \"If a address line1 was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_postal_code_check\": {\n            \"description\": \"If a address postal code was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cvc_check\": {\n            \"description\": \"If a CVC was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_card_checks\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card_generated_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"charge\": {\n            \"description\": \"The charge that created this object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_method_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/card_generated_from_payment_method_details\"\n              }\n            ],\n            \"description\": \"Transaction-specific details of the payment method used in the payment.\",\n            \"nullable\": true\n          },\n          \"setup_attempt\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_attempt\"\n              }\n            ],\n            \"description\": \"The ID of the SetupAttempt that generated this PaymentMethod, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/setup_attempt\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"payment_method_card_generated_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_method_details\", \"setup_attempt\"]\n      },\n      \"payment_method_card_present\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"brand_product\": {\n            \"description\": \"The [product code](https://stripe.com/docs/card-product-codes) that identifies the specific program or product associated with a card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cardholder_name\": {\n            \"description\": \"The cardholder name as read from the card, in [ISO 7813](https://en.wikipedia.org/wiki/ISO/IEC_7813) format. May include alphanumeric characters, special characters and first/last name separator (`/`). In some cases, the cardholder name may not be available depending on how the issuer has configured the card. Cardholder name is typically not available on swipe or contactless payments, such as those made with Apple Pay and Google Pay.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"A high-level description of the type of cards issued in this range.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuer\": {\n            \"description\": \"The name of the card's issuing bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"networks\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_card_present_networks\"\n              }\n            ],\n            \"description\": \"Contains information about card networks that can be used to process the payment.\",\n            \"nullable\": true\n          },\n          \"offline\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_present_offline\"\n              }\n            ],\n            \"description\": \"Details about payment methods collected offline.\",\n            \"nullable\": true\n          },\n          \"preferred_locales\": {\n            \"description\": \"EMV tag 5F2D. Preferred languages specified by the integrated circuit chip.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"read_method\": {\n            \"description\": \"How card details were read in this transaction.\",\n            \"enum\": [\n              \"contact_emv\",\n              \"contactless_emv\",\n              \"contactless_magstripe_mode\",\n              \"magnetic_stripe_fallback\",\n              \"magnetic_stripe_track2\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"wallet\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_card_present_common_wallet\"\n          }\n        },\n        \"required\": [\"exp_month\", \"exp_year\"],\n        \"title\": \"payment_method_card_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"networks\", \"offline\", \"wallet\"]\n      },\n      \"payment_method_card_present_networks\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available\": {\n            \"description\": \"All networks available for selection via [payment_method_options.card.network](/api/payment_intents/confirm#confirm_payment_intent-payment_method_options-card-network).\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"preferred\": {\n            \"description\": \"The preferred network for the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"available\"],\n        \"title\": \"payment_method_card_present_networks\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card_wallet\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amex_express_checkout\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_wallet_amex_express_checkout\"\n          },\n          \"apple_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_wallet_apple_pay\"\n          },\n          \"dynamic_last4\": {\n            \"description\": \"(For tokenized numbers only.) The last four digits of the device account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"google_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_wallet_google_pay\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_wallet_link\"\n          },\n          \"masterpass\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_wallet_masterpass\"\n          },\n          \"samsung_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_wallet_samsung_pay\"\n          },\n          \"type\": {\n            \"description\": \"The type of the card wallet, one of `amex_express_checkout`, `apple_pay`, `google_pay`, `masterpass`, `samsung_pay`, `visa_checkout`, or `link`. An additional hash is included on the Wallet subhash with a name matching this value. It contains additional information specific to the card wallet type.\",\n            \"enum\": [\n              \"amex_express_checkout\",\n              \"apple_pay\",\n              \"google_pay\",\n              \"link\",\n              \"masterpass\",\n              \"samsung_pay\",\n              \"visa_checkout\"\n            ],\n            \"type\": \"string\"\n          },\n          \"visa_checkout\": {\n            \"$ref\": \"#/components/schemas/payment_method_card_wallet_visa_checkout\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"payment_method_card_wallet\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"amex_express_checkout\",\n          \"apple_pay\",\n          \"google_pay\",\n          \"link\",\n          \"masterpass\",\n          \"samsung_pay\",\n          \"visa_checkout\"\n        ]\n      },\n      \"payment_method_card_wallet_amex_express_checkout\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_card_wallet_amex_express_checkout\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card_wallet_apple_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_card_wallet_apple_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card_wallet_google_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_card_wallet_google_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card_wallet_link\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_card_wallet_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card_wallet_masterpass\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_card_wallet_masterpass\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"billing_address\", \"shipping_address\"]\n      },\n      \"payment_method_card_wallet_samsung_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_card_wallet_samsung_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_card_wallet_visa_checkout\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_card_wallet_visa_checkout\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"billing_address\", \"shipping_address\"]\n      },\n      \"payment_method_cashapp\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"A unique and immutable identifier assigned by Cash App to every buyer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cashtag\": {\n            \"description\": \"A public identifier for buyers using Cash App.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_cashapp\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_config_biz_payment_method_configuration_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"ID of the payment method configuration used.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"parent\": {\n            \"description\": \"ID of the parent payment method configuration used.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\"],\n        \"title\": \"PaymentMethodConfigBizPaymentMethodConfigurationDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_config_resource_display_preference\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"overridable\": {\n            \"description\": \"For child configs, whether or not the account's preference will be observed. If `false`, the parent configuration's default is used.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"preference\": {\n            \"description\": \"The account's display preference.\",\n            \"enum\": [\"none\", \"off\", \"on\"],\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The effective display preference value.\",\n            \"enum\": [\"off\", \"on\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"preference\", \"value\"],\n        \"title\": \"PaymentMethodConfigResourceDisplayPreference\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_config_resource_payment_method_properties\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available\": {\n            \"description\": \"Whether this payment method may be offered at checkout. True if `display_preference` is `on` and the payment method's capability is active.\",\n            \"type\": \"boolean\"\n          },\n          \"display_preference\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_display_preference\"\n          }\n        },\n        \"required\": [\"available\", \"display_preference\"],\n        \"title\": \"PaymentMethodConfigResourcePaymentMethodProperties\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"display_preference\"]\n      },\n      \"payment_method_configuration\": {\n        \"description\": \"PaymentMethodConfigurations control which payment methods are displayed to your customers when you don't explicitly specify payment method types. You can have multiple configurations with different sets of payment methods for different scenarios.\\n\\nThere are two types of PaymentMethodConfigurations. Which is used depends on the [charge type](https://stripe.com/docs/connect/charges):\\n\\n**Direct** configurations apply to payments created on your account, including Connect destination charges, Connect separate charges and transfers, and payments not involving Connect.\\n\\n**Child** configurations apply to payments created on your connected accounts using direct charges, and charges with the on_behalf_of parameter.\\n\\nChild configurations have a `parent` that sets default values and controls which settings connected accounts may override. You can specify a parent ID at payment time, and Stripe will automatically resolve the connected account’s associated child configuration. Parent configurations are [managed in the dashboard](https://dashboard.stripe.com/settings/payment_methods/connected_accounts) and are not available in this API.\\n\\nRelated guides:\\n- [Payment Method Configurations API](https://stripe.com/docs/connect/payment-method-configurations)\\n- [Multiple configurations on dynamic payment methods](https://stripe.com/docs/payments/multiple-payment-method-configs)\\n- [Multiple configurations for your Connect accounts](https://stripe.com/docs/connect/multiple-payment-method-configurations)\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"active\": {\n            \"description\": \"Whether the configuration can be used for new payments.\",\n            \"type\": \"boolean\"\n          },\n          \"affirm\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"afterpay_clearpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"alipay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"alma\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"apple_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"application\": {\n            \"description\": \"For child configs, the Connect application associated with the configuration.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"bancontact\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"blik\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"boleto\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"cartes_bancaires\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"customer_balance\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"eps\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"fpx\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"giropay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"google_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"grabpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"ideal\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"is_default\": {\n            \"description\": \"The default configuration is used whenever a payment method configuration is not specified.\",\n            \"type\": \"boolean\"\n          },\n          \"jcb\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"konbini\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"mobilepay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"multibanco\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"name\": {\n            \"description\": \"The configuration's name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"payment_method_configuration\"],\n            \"type\": \"string\"\n          },\n          \"oxxo\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"p24\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"parent\": {\n            \"description\": \"For child configs, the configuration's parent configuration.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"pay_by_bank\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"paynow\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"promptpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"revolut_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"swish\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"twint\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"wechat_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          },\n          \"zip\": {\n            \"$ref\": \"#/components/schemas/payment_method_config_resource_payment_method_properties\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"id\",\n          \"is_default\",\n          \"livemode\",\n          \"name\",\n          \"object\"\n        ],\n        \"title\": \"PaymentMethodConfigResourcePaymentMethodConfiguration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"affirm\",\n          \"afterpay_clearpay\",\n          \"alipay\",\n          \"alma\",\n          \"amazon_pay\",\n          \"apple_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"bancontact\",\n          \"blik\",\n          \"boleto\",\n          \"card\",\n          \"cartes_bancaires\",\n          \"cashapp\",\n          \"customer_balance\",\n          \"eps\",\n          \"fpx\",\n          \"giropay\",\n          \"google_pay\",\n          \"grabpay\",\n          \"ideal\",\n          \"jcb\",\n          \"klarna\",\n          \"konbini\",\n          \"link\",\n          \"mobilepay\",\n          \"multibanco\",\n          \"oxxo\",\n          \"p24\",\n          \"pay_by_bank\",\n          \"paynow\",\n          \"paypal\",\n          \"promptpay\",\n          \"revolut_pay\",\n          \"sepa_debit\",\n          \"sofort\",\n          \"swish\",\n          \"twint\",\n          \"us_bank_account\",\n          \"wechat_pay\",\n          \"zip\"\n        ],\n        \"x-resourceId\": \"payment_method_configuration\"\n      },\n      \"payment_method_customer_balance\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_customer_balance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"ach_credit_transfer\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_ach_credit_transfer\"\n          },\n          \"ach_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_ach_debit\"\n          },\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_acss_debit\"\n          },\n          \"affirm\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_affirm\"\n          },\n          \"afterpay_clearpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_afterpay_clearpay\"\n          },\n          \"alipay\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_alipay_details\"\n          },\n          \"alma\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_alma\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_amazon_pay\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_au_becs_debit\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_bacs_debit\"\n          },\n          \"bancontact\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_bancontact\"\n          },\n          \"blik\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_blik\"\n          },\n          \"boleto\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_boleto\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card\"\n          },\n          \"card_present\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_present\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_cashapp\"\n          },\n          \"customer_balance\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_customer_balance\"\n          },\n          \"eps\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_eps\"\n          },\n          \"fpx\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_fpx\"\n          },\n          \"giropay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_giropay\"\n          },\n          \"grabpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_grabpay\"\n          },\n          \"ideal\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_ideal\"\n          },\n          \"interac_present\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_interac_present\"\n          },\n          \"kakao_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_kakao_pay\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_klarna\"\n          },\n          \"konbini\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_konbini\"\n          },\n          \"kr_card\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_kr_card\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_link\"\n          },\n          \"mobilepay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_mobilepay\"\n          },\n          \"multibanco\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_multibanco\"\n          },\n          \"naver_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_naver_pay\"\n          },\n          \"oxxo\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_oxxo\"\n          },\n          \"p24\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_p24\"\n          },\n          \"pay_by_bank\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_pay_by_bank\"\n          },\n          \"payco\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_payco\"\n          },\n          \"paynow\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_paynow\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_paypal\"\n          },\n          \"pix\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_pix\"\n          },\n          \"promptpay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_promptpay\"\n          },\n          \"revolut_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_revolut_pay\"\n          },\n          \"samsung_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_samsung_pay\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_sepa_debit\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_sofort\"\n          },\n          \"stripe_account\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_stripe_account\"\n          },\n          \"swish\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_swish\"\n          },\n          \"twint\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_twint\"\n          },\n          \"type\": {\n            \"description\": \"The type of transaction-specific details of the payment method used in the payment. See [PaymentMethod.type](https://stripe.com/docs/api/payment_methods/object#payment_method_object-type) for the full list of possible types.\\nAn additional hash is included on `payment_method_details` with a name matching this value.\\nIt contains information specific to the payment method.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_us_bank_account\"\n          },\n          \"wechat\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_wechat\"\n          },\n          \"wechat_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_wechat_pay\"\n          },\n          \"zip\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_zip\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"payment_method_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"ach_credit_transfer\",\n          \"ach_debit\",\n          \"acss_debit\",\n          \"affirm\",\n          \"afterpay_clearpay\",\n          \"alipay\",\n          \"alma\",\n          \"amazon_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"bancontact\",\n          \"blik\",\n          \"boleto\",\n          \"card\",\n          \"card_present\",\n          \"cashapp\",\n          \"customer_balance\",\n          \"eps\",\n          \"fpx\",\n          \"giropay\",\n          \"grabpay\",\n          \"ideal\",\n          \"interac_present\",\n          \"kakao_pay\",\n          \"klarna\",\n          \"konbini\",\n          \"kr_card\",\n          \"link\",\n          \"mobilepay\",\n          \"multibanco\",\n          \"naver_pay\",\n          \"oxxo\",\n          \"p24\",\n          \"pay_by_bank\",\n          \"payco\",\n          \"paynow\",\n          \"paypal\",\n          \"pix\",\n          \"promptpay\",\n          \"revolut_pay\",\n          \"samsung_pay\",\n          \"sepa_debit\",\n          \"sofort\",\n          \"stripe_account\",\n          \"swish\",\n          \"twint\",\n          \"us_bank_account\",\n          \"wechat\",\n          \"wechat_pay\",\n          \"zip\"\n        ]\n      },\n      \"payment_method_details_ach_credit_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_number\": {\n            \"description\": \"Account number to transfer funds to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the routing number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing transit number for the bank account to transfer funds to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"swift_code\": {\n            \"description\": \"SWIFT code of the bank associated with the routing number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_ach_credit_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_ach_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_holder_type\": {\n            \"description\": \"Type of entity that holds the account. This can be either `individual` or `company`.\",\n            \"enum\": [\"company\", \"individual\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country the bank account is located in.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing transit number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_ach_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"institution_number\": {\n            \"description\": \"Institution number of the bank account\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"description\": \"ID of the mandate used to make this payment.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"transit_number\": {\n            \"description\": \"Transit number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_affirm\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"transaction_id\": {\n            \"description\": \"The Affirm transaction ID associated with this payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_affirm\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_afterpay_clearpay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"order_id\": {\n            \"description\": \"The Afterpay order ID associated with this payment intent.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"Order identifier shown to the merchant in Afterpay’s online portal.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_afterpay_clearpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_alma\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_alma\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_amazon_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"funding\": {\n            \"$ref\": \"#/components/schemas/amazon_pay_underlying_payment_method_funding_details\"\n          }\n        },\n        \"title\": \"payment_method_details_amazon_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"funding\"]\n      },\n      \"payment_method_details_au_becs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bsb_number\": {\n            \"description\": \"Bank-State-Branch number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"description\": \"ID of the mandate used to make this payment.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_au_becs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"description\": \"ID of the mandate used to make this payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"sort_code\": {\n            \"description\": \"Sort code of the bank account. (e.g., `10-20-30`)\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_bancontact\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_code\": {\n            \"description\": \"Bank code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"Bank Identifier Code of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"The ID of the SEPA Direct Debit PaymentMethod which was generated by this Charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"generated_sepa_debit_mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"The mandate for the SEPA Direct Debit PaymentMethod which was generated by this Charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"iban_last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_language\": {\n            \"description\": \"Preferred language of the Bancontact authorization page that the customer is redirected to.\\nCan be one of `en`, `de`, `fr`, or `nl`\",\n            \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by Bancontact directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_bancontact\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"generated_sepa_debit\",\n          \"generated_sepa_debit_mandate\"\n        ]\n      },\n      \"payment_method_details_blik\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"A unique and immutable identifier assigned by BLIK to every buyer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_blik\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_boleto\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tax_id\": {\n            \"description\": \"The tax ID of the customer (CPF for individuals consumers or CNPJ for businesses consumers)\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"tax_id\"],\n        \"title\": \"payment_method_details_boleto\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_authorized\": {\n            \"description\": \"The authorized amount.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"authorization_code\": {\n            \"description\": \"Authorization code on the charge.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"brand\": {\n            \"description\": \"Card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"capture_before\": {\n            \"description\": \"When using manual capture, a future timestamp at which the charge will be automatically refunded if uncaptured.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"checks\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_checks\"\n              }\n            ],\n            \"description\": \"Check results by Card networks on Card address and CVC at time of payment.\",\n            \"nullable\": true\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"type\": \"integer\"\n          },\n          \"extended_authorization\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_card_details_api_resource_enterprise_features_extended_authorization_extended_authorization\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"incremental_authorization\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_card_details_api_resource_enterprise_features_incremental_authorization_incremental_authorization\"\n          },\n          \"installments\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_installments\"\n              }\n            ],\n            \"description\": \"Installment details for this payment (Mexico only).\\n\\nFor more information, see the [installments integration guide](https://stripe.com/docs/payments/installments).\",\n            \"nullable\": true\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"description\": \"ID of the mandate used to make this payment or created by it.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"multicapture\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_card_details_api_resource_multicapture\"\n          },\n          \"network\": {\n            \"description\": \"Identifies which network this charge was processed on. Can be `amex`, `cartes_bancaires`, `diners`, `discover`, `eftpos_au`, `interac`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network_token\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_network_token\"\n              }\n            ],\n            \"description\": \"If this card has network token credentials, this contains the details of the network token credentials.\",\n            \"nullable\": true\n          },\n          \"network_transaction_id\": {\n            \"description\": \"This is used by the financial networks to identify a transaction. Visa calls this the Transaction ID, Mastercard calls this the Trace ID, and American Express calls this the Acquirer Reference Data. This value will be present if it is returned by the financial network in the authorization response, and null otherwise.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"overcapture\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_card_details_api_resource_enterprise_features_overcapture_overcapture\"\n          },\n          \"regulated_status\": {\n            \"description\": \"Status of a card based on the card issuer.\",\n            \"enum\": [\"regulated\", \"unregulated\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"three_d_secure\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/three_d_secure_details_charge\"\n              }\n            ],\n            \"description\": \"Populated if this transaction used 3D Secure authentication.\",\n            \"nullable\": true\n          },\n          \"wallet\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_wallet\"\n              }\n            ],\n            \"description\": \"If this Card is part of a card wallet, this contains the details of the card wallet.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"exp_month\", \"exp_year\"],\n        \"title\": \"payment_method_details_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"checks\",\n          \"extended_authorization\",\n          \"incremental_authorization\",\n          \"installments\",\n          \"multicapture\",\n          \"network_token\",\n          \"overcapture\",\n          \"three_d_secure\",\n          \"wallet\"\n        ]\n      },\n      \"payment_method_details_card_checks\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address_line1_check\": {\n            \"description\": \"If a address line1 was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_postal_code_check\": {\n            \"description\": \"If a address postal code was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cvc_check\": {\n            \"description\": \"If a CVC was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_card_checks\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_installments\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"plan\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_installments_plan\"\n              }\n            ],\n            \"description\": \"Installment plan selected for the payment.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_details_card_installments\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"plan\"]\n      },\n      \"payment_method_details_card_installments_plan\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"count\": {\n            \"description\": \"For `fixed_count` installment plans, this is the number of installment payments your customer will make to their credit card.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"interval\": {\n            \"description\": \"For `fixed_count` installment plans, this is the interval between installment payments your customer will make to their credit card.\\nOne of `month`.\",\n            \"enum\": [\"month\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Type of installment plan, one of `fixed_count`.\",\n            \"enum\": [\"fixed_count\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"payment_method_details_card_installments_plan\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_network_token\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"used\": {\n            \"description\": \"Indicates if Stripe used a network token, either user provided or Stripe managed when processing the transaction.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"used\"],\n        \"title\": \"payment_method_details_card_network_token\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_present\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_authorized\": {\n            \"description\": \"The authorized amount\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"brand\": {\n            \"description\": \"Card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"brand_product\": {\n            \"description\": \"The [product code](https://stripe.com/docs/card-product-codes) that identifies the specific program or product associated with a card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"capture_before\": {\n            \"description\": \"When using manual capture, a future timestamp after which the charge will be automatically refunded if uncaptured.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"cardholder_name\": {\n            \"description\": \"The cardholder name as read from the card, in [ISO 7813](https://en.wikipedia.org/wiki/ISO/IEC_7813) format. May include alphanumeric characters, special characters and first/last name separator (`/`). In some cases, the cardholder name may not be available depending on how the issuer has configured the card. Cardholder name is typically not available on swipe or contactless payments, such as those made with Apple Pay and Google Pay.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"A high-level description of the type of cards issued in this range.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"emv_auth_data\": {\n            \"description\": \"Authorization response cryptogram.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_card\": {\n            \"description\": \"ID of a card PaymentMethod generated from the card_present PaymentMethod that may be attached to a Customer for future transactions. Only present if it was possible to generate a card PaymentMethod.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"incremental_authorization_supported\": {\n            \"description\": \"Whether this [PaymentIntent](https://stripe.com/docs/api/payment_intents) is eligible for incremental authorizations. Request support using [request_incremental_authorization_support](https://stripe.com/docs/api/payment_intents/create#create_payment_intent-payment_method_options-card_present-request_incremental_authorization_support).\",\n            \"type\": \"boolean\"\n          },\n          \"issuer\": {\n            \"description\": \"The name of the card's issuing bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network\": {\n            \"description\": \"Identifies which network this charge was processed on. Can be `amex`, `cartes_bancaires`, `diners`, `discover`, `eftpos_au`, `interac`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network_transaction_id\": {\n            \"description\": \"This is used by the financial networks to identify a transaction. Visa calls this the Transaction ID, Mastercard calls this the Trace ID, and American Express calls this the Acquirer Reference Data. This value will be present if it is returned by the financial network in the authorization response, and null otherwise.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"offline\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_present_offline\"\n              }\n            ],\n            \"description\": \"Details about payments collected offline.\",\n            \"nullable\": true\n          },\n          \"overcapture_supported\": {\n            \"description\": \"Defines whether the authorized amount can be over-captured or not\",\n            \"type\": \"boolean\"\n          },\n          \"preferred_locales\": {\n            \"description\": \"EMV tag 5F2D. Preferred languages specified by the integrated circuit chip.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"read_method\": {\n            \"description\": \"How card details were read in this transaction.\",\n            \"enum\": [\n              \"contact_emv\",\n              \"contactless_emv\",\n              \"contactless_magstripe_mode\",\n              \"magnetic_stripe_fallback\",\n              \"magnetic_stripe_track2\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"receipt\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_present_receipt\"\n              }\n            ],\n            \"description\": \"A collection of fields required to be displayed on receipts. Only required for EMV transactions.\",\n            \"nullable\": true\n          },\n          \"wallet\": {\n            \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_card_present_common_wallet\"\n          }\n        },\n        \"required\": [\n          \"exp_month\",\n          \"exp_year\",\n          \"incremental_authorization_supported\",\n          \"overcapture_supported\"\n        ],\n        \"title\": \"payment_method_details_card_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"offline\", \"receipt\", \"wallet\"]\n      },\n      \"payment_method_details_card_present_offline\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"stored_at\": {\n            \"description\": \"Time at which the payment was collected while offline\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"type\": {\n            \"description\": \"The method used to process this payment method offline. Only deferred is allowed.\",\n            \"enum\": [\"deferred\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_card_present_offline\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_present_receipt\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_type\": {\n            \"description\": \"The type of account being debited or credited\",\n            \"enum\": [\"checking\", \"credit\", \"prepaid\", \"unknown\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"application_cryptogram\": {\n            \"description\": \"EMV tag 9F26, cryptogram generated by the integrated circuit chip.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"application_preferred_name\": {\n            \"description\": \"Mnenomic of the Application Identifier.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"authorization_code\": {\n            \"description\": \"Identifier for this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"authorization_response_code\": {\n            \"description\": \"EMV tag 8A. A code returned by the card issuer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cardholder_verification_method\": {\n            \"description\": \"Describes the method used by the cardholder to verify ownership of the card. One of the following: `approval`, `failure`, `none`, `offline_pin`, `offline_pin_and_signature`, `online_pin`, or `signature`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"dedicated_file_name\": {\n            \"description\": \"EMV tag 84. Similar to the application identifier stored on the integrated circuit chip.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terminal_verification_results\": {\n            \"description\": \"The outcome of a series of EMV functions performed by the card reader.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_status_information\": {\n            \"description\": \"An indication of various EMV functions performed during the transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_card_present_receipt\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_wallet\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amex_express_checkout\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_amex_express_checkout\"\n          },\n          \"apple_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_apple_pay\"\n          },\n          \"dynamic_last4\": {\n            \"description\": \"(For tokenized numbers only.) The last four digits of the device account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"google_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_google_pay\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_link\"\n          },\n          \"masterpass\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_masterpass\"\n          },\n          \"samsung_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_samsung_pay\"\n          },\n          \"type\": {\n            \"description\": \"The type of the card wallet, one of `amex_express_checkout`, `apple_pay`, `google_pay`, `masterpass`, `samsung_pay`, `visa_checkout`, or `link`. An additional hash is included on the Wallet subhash with a name matching this value. It contains additional information specific to the card wallet type.\",\n            \"enum\": [\n              \"amex_express_checkout\",\n              \"apple_pay\",\n              \"google_pay\",\n              \"link\",\n              \"masterpass\",\n              \"samsung_pay\",\n              \"visa_checkout\"\n            ],\n            \"type\": \"string\"\n          },\n          \"visa_checkout\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_visa_checkout\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"payment_method_details_card_wallet\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"amex_express_checkout\",\n          \"apple_pay\",\n          \"google_pay\",\n          \"link\",\n          \"masterpass\",\n          \"samsung_pay\",\n          \"visa_checkout\"\n        ]\n      },\n      \"payment_method_details_card_wallet_amex_express_checkout\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_card_wallet_amex_express_checkout\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_wallet_apple_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_card_wallet_apple_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_wallet_google_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_card_wallet_google_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_wallet_link\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_card_wallet_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_wallet_masterpass\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_details_card_wallet_masterpass\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"billing_address\", \"shipping_address\"]\n      },\n      \"payment_method_details_card_wallet_samsung_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_card_wallet_samsung_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_card_wallet_visa_checkout\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified billing address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"Owner's verified email. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's verified shipping address. Values are verified or provided by the wallet directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_details_card_wallet_visa_checkout\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"billing_address\", \"shipping_address\"]\n      },\n      \"payment_method_details_cashapp\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"A unique and immutable identifier assigned by Cash App to every buyer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cashtag\": {\n            \"description\": \"A public identifier for buyers using Cash App.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_cashapp\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_customer_balance\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_customer_balance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_eps\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank. Should be one of `arzte_und_apotheker_bank`, `austrian_anadi_bank_ag`, `bank_austria`, `bankhaus_carl_spangler`, `bankhaus_schelhammer_und_schattera_ag`, `bawag_psk_ag`, `bks_bank_ag`, `brull_kallmus_bank_ag`, `btv_vier_lander_bank`, `capital_bank_grawe_gruppe_ag`, `deutsche_bank_ag`, `dolomitenbank`, `easybank_ag`, `erste_bank_und_sparkassen`, `hypo_alpeadriabank_international_ag`, `hypo_noe_lb_fur_niederosterreich_u_wien`, `hypo_oberosterreich_salzburg_steiermark`, `hypo_tirol_bank_ag`, `hypo_vorarlberg_bank_ag`, `hypo_bank_burgenland_aktiengesellschaft`, `marchfelder_bank`, `oberbank_ag`, `raiffeisen_bankengruppe_osterreich`, `schoellerbank_ag`, `sparda_bank_wien`, `volksbank_gruppe`, `volkskreditbank_ag`, or `vr_bank_braunau`.\",\n            \"enum\": [\n              \"arzte_und_apotheker_bank\",\n              \"austrian_anadi_bank_ag\",\n              \"bank_austria\",\n              \"bankhaus_carl_spangler\",\n              \"bankhaus_schelhammer_und_schattera_ag\",\n              \"bawag_psk_ag\",\n              \"bks_bank_ag\",\n              \"brull_kallmus_bank_ag\",\n              \"btv_vier_lander_bank\",\n              \"capital_bank_grawe_gruppe_ag\",\n              \"deutsche_bank_ag\",\n              \"dolomitenbank\",\n              \"easybank_ag\",\n              \"erste_bank_und_sparkassen\",\n              \"hypo_alpeadriabank_international_ag\",\n              \"hypo_bank_burgenland_aktiengesellschaft\",\n              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n              \"hypo_oberosterreich_salzburg_steiermark\",\n              \"hypo_tirol_bank_ag\",\n              \"hypo_vorarlberg_bank_ag\",\n              \"marchfelder_bank\",\n              \"oberbank_ag\",\n              \"raiffeisen_bankengruppe_osterreich\",\n              \"schoellerbank_ag\",\n              \"sparda_bank_wien\",\n              \"volksbank_gruppe\",\n              \"volkskreditbank_ag\",\n              \"vr_bank_braunau\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by EPS directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\\nEPS rarely provides this information so the attribute is usually empty.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_eps\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_fpx\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank. Can be one of `affin_bank`, `agrobank`, `alliance_bank`, `ambank`, `bank_islam`, `bank_muamalat`, `bank_rakyat`, `bsn`, `cimb`, `hong_leong_bank`, `hsbc`, `kfh`, `maybank2u`, `ocbc`, `public_bank`, `rhb`, `standard_chartered`, `uob`, `deutsche_bank`, `maybank2e`, `pb_enterprise`, or `bank_of_china`.\",\n            \"enum\": [\n              \"affin_bank\",\n              \"agrobank\",\n              \"alliance_bank\",\n              \"ambank\",\n              \"bank_islam\",\n              \"bank_muamalat\",\n              \"bank_of_china\",\n              \"bank_rakyat\",\n              \"bsn\",\n              \"cimb\",\n              \"deutsche_bank\",\n              \"hong_leong_bank\",\n              \"hsbc\",\n              \"kfh\",\n              \"maybank2e\",\n              \"maybank2u\",\n              \"ocbc\",\n              \"pb_enterprise\",\n              \"public_bank\",\n              \"rhb\",\n              \"standard_chartered\",\n              \"uob\"\n            ],\n            \"type\": \"string\"\n          },\n          \"transaction_id\": {\n            \"description\": \"Unique transaction id generated by FPX for every request from the merchant\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"bank\"],\n        \"title\": \"payment_method_details_fpx\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_giropay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_code\": {\n            \"description\": \"Bank code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"Bank Identifier Code of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by Giropay directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\\nGiropay rarely provides this information so the attribute is usually empty.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_giropay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_grabpay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"transaction_id\": {\n            \"description\": \"Unique transaction id generated by GrabPay\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_grabpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_ideal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank. Can be one of `abn_amro`, `asn_bank`, `bunq`, `handelsbanken`, `ing`, `knab`, `moneyou`, `n26`, `nn`, `rabobank`, `regiobank`, `revolut`, `sns_bank`, `triodos_bank`, `van_lanschot`, or `yoursafe`.\",\n            \"enum\": [\n              \"abn_amro\",\n              \"asn_bank\",\n              \"bunq\",\n              \"handelsbanken\",\n              \"ing\",\n              \"knab\",\n              \"moneyou\",\n              \"n26\",\n              \"nn\",\n              \"rabobank\",\n              \"regiobank\",\n              \"revolut\",\n              \"sns_bank\",\n              \"triodos_bank\",\n              \"van_lanschot\",\n              \"yoursafe\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"The Bank Identifier Code of the customer's bank.\",\n            \"enum\": [\n              \"ABNANL2A\",\n              \"ASNBNL21\",\n              \"BITSNL2A\",\n              \"BUNQNL2A\",\n              \"FVLBNL22\",\n              \"HANDNL2A\",\n              \"INGBNL2A\",\n              \"KNABNL2H\",\n              \"MOYONL21\",\n              \"NNBANL2G\",\n              \"NTSBDEB1\",\n              \"RABONL2U\",\n              \"RBRBNL21\",\n              \"REVOIE23\",\n              \"REVOLT21\",\n              \"SNSBNL2A\",\n              \"TRIONL2U\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"The ID of the SEPA Direct Debit PaymentMethod which was generated by this Charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"generated_sepa_debit_mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"The mandate for the SEPA Direct Debit PaymentMethod which was generated by this Charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"iban_last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by iDEAL directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_ideal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"generated_sepa_debit\",\n          \"generated_sepa_debit_mandate\"\n        ]\n      },\n      \"payment_method_details_interac_present\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Card brand. Can be `interac`, `mastercard` or `visa`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cardholder_name\": {\n            \"description\": \"The cardholder name as read from the card, in [ISO 7813](https://en.wikipedia.org/wiki/ISO/IEC_7813) format. May include alphanumeric characters, special characters and first/last name separator (`/`). In some cases, the cardholder name may not be available depending on how the issuer has configured the card. Cardholder name is typically not available on swipe or contactless payments, such as those made with Apple Pay and Google Pay.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"A high-level description of the type of cards issued in this range.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"emv_auth_data\": {\n            \"description\": \"Authorization response cryptogram.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_card\": {\n            \"description\": \"ID of a card PaymentMethod generated from the card_present PaymentMethod that may be attached to a Customer for future transactions. Only present if it was possible to generate a card PaymentMethod.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuer\": {\n            \"description\": \"The name of the card's issuing bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network\": {\n            \"description\": \"Identifies which network this charge was processed on. Can be `amex`, `cartes_bancaires`, `diners`, `discover`, `eftpos_au`, `interac`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network_transaction_id\": {\n            \"description\": \"This is used by the financial networks to identify a transaction. Visa calls this the Transaction ID, Mastercard calls this the Trace ID, and American Express calls this the Acquirer Reference Data. This value will be present if it is returned by the financial network in the authorization response, and null otherwise.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_locales\": {\n            \"description\": \"EMV tag 5F2D. Preferred languages specified by the integrated circuit chip.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"read_method\": {\n            \"description\": \"How card details were read in this transaction.\",\n            \"enum\": [\n              \"contact_emv\",\n              \"contactless_emv\",\n              \"contactless_magstripe_mode\",\n              \"magnetic_stripe_fallback\",\n              \"magnetic_stripe_track2\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"receipt\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_interac_present_receipt\"\n              }\n            ],\n            \"description\": \"A collection of fields required to be displayed on receipts. Only required for EMV transactions.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"exp_month\", \"exp_year\"],\n        \"title\": \"payment_method_details_interac_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"receipt\"]\n      },\n      \"payment_method_details_interac_present_receipt\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_type\": {\n            \"description\": \"The type of account being debited or credited\",\n            \"enum\": [\"checking\", \"savings\", \"unknown\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"application_cryptogram\": {\n            \"description\": \"EMV tag 9F26, cryptogram generated by the integrated circuit chip.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"application_preferred_name\": {\n            \"description\": \"Mnenomic of the Application Identifier.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"authorization_code\": {\n            \"description\": \"Identifier for this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"authorization_response_code\": {\n            \"description\": \"EMV tag 8A. A code returned by the card issuer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cardholder_verification_method\": {\n            \"description\": \"Describes the method used by the cardholder to verify ownership of the card. One of the following: `approval`, `failure`, `none`, `offline_pin`, `offline_pin_and_signature`, `online_pin`, or `signature`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"dedicated_file_name\": {\n            \"description\": \"EMV tag 84. Similar to the application identifier stored on the integrated circuit chip.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terminal_verification_results\": {\n            \"description\": \"The outcome of a series of EMV functions performed by the card reader.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_status_information\": {\n            \"description\": \"An indication of various EMV functions performed during the transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_interac_present_receipt\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_kakao_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"A unique identifier for the buyer as determined by the local payment processor.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_kakao_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_klarna\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payer_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/klarna_payer_details\"\n              }\n            ],\n            \"description\": \"The payer details for this transaction.\",\n            \"nullable\": true\n          },\n          \"payment_method_category\": {\n            \"description\": \"The Klarna payment method used for this transaction.\\nCan be one of `pay_later`, `pay_now`, `pay_with_financing`, or `pay_in_installments`\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_locale\": {\n            \"description\": \"Preferred language of the Klarna authorization page that the customer is redirected to.\\nCan be one of `de-AT`, `en-AT`, `nl-BE`, `fr-BE`, `en-BE`, `de-DE`, `en-DE`, `da-DK`, `en-DK`, `es-ES`, `en-ES`, `fi-FI`, `sv-FI`, `en-FI`, `en-GB`, `en-IE`, `it-IT`, `en-IT`, `nl-NL`, `en-NL`, `nb-NO`, `en-NO`, `sv-SE`, `en-SE`, `en-US`, `es-US`, `fr-FR`, `en-FR`, `cs-CZ`, `en-CZ`, `ro-RO`, `en-RO`, `el-GR`, `en-GR`, `en-AU`, `en-NZ`, `en-CA`, `fr-CA`, `pl-PL`, `en-PL`, `pt-PT`, `en-PT`, `de-CH`, `fr-CH`, `it-CH`, or `en-CH`\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_klarna\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payer_details\"]\n      },\n      \"payment_method_details_konbini\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"store\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_konbini_store\"\n              }\n            ],\n            \"description\": \"If the payment succeeded, this contains the details of the convenience store where the payment was completed.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_details_konbini\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"store\"]\n      },\n      \"payment_method_details_konbini_store\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"chain\": {\n            \"description\": \"The name of the convenience store chain where the payment was completed.\",\n            \"enum\": [\"familymart\", \"lawson\", \"ministop\", \"seicomart\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_konbini_store\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_kr_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"The local credit or debit card brand.\",\n            \"enum\": [\n              \"bc\",\n              \"citi\",\n              \"hana\",\n              \"hyundai\",\n              \"jeju\",\n              \"jeonbuk\",\n              \"kakaobank\",\n              \"kbank\",\n              \"kdbbank\",\n              \"kookmin\",\n              \"kwangju\",\n              \"lotte\",\n              \"mg\",\n              \"nh\",\n              \"post\",\n              \"samsung\",\n              \"savingsbank\",\n              \"shinhan\",\n              \"shinhyup\",\n              \"suhyup\",\n              \"tossbank\",\n              \"woori\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"buyer_id\": {\n            \"description\": \"A unique identifier for the buyer as determined by the local payment processor.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card. This may not be present for American Express cards.\",\n            \"maxLength\": 4,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_kr_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_link\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the funding source country beneath the Link payment.\\nYou could use this attribute to get a sense of international fees.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_mobilepay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/internal_card\"\n              }\n            ],\n            \"description\": \"Internal card details\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_details_mobilepay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card\"]\n      },\n      \"payment_method_details_multibanco\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"entity\": {\n            \"description\": \"Entity number associated with this Multibanco payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"Reference number associated with this Multibanco payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_multibanco\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_naver_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"A unique identifier for the buyer as determined by the local payment processor.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_naver_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_oxxo\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"number\": {\n            \"description\": \"OXXO reference number\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_oxxo\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_p24\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank. Can be one of `ing`, `citi_handlowy`, `tmobile_usbugi_bankowe`, `plus_bank`, `etransfer_pocztowy24`, `banki_spbdzielcze`, `bank_nowy_bfg_sa`, `getin_bank`, `velobank`, `blik`, `noble_pay`, `ideabank`, `envelobank`, `santander_przelew24`, `nest_przelew`, `mbank_mtransfer`, `inteligo`, `pbac_z_ipko`, `bnp_paribas`, `credit_agricole`, `toyota_bank`, `bank_pekao_sa`, `volkswagen_bank`, `bank_millennium`, `alior_bank`, or `boz`.\",\n            \"enum\": [\n              \"alior_bank\",\n              \"bank_millennium\",\n              \"bank_nowy_bfg_sa\",\n              \"bank_pekao_sa\",\n              \"banki_spbdzielcze\",\n              \"blik\",\n              \"bnp_paribas\",\n              \"boz\",\n              \"citi_handlowy\",\n              \"credit_agricole\",\n              \"envelobank\",\n              \"etransfer_pocztowy24\",\n              \"getin_bank\",\n              \"ideabank\",\n              \"ing\",\n              \"inteligo\",\n              \"mbank_mtransfer\",\n              \"nest_przelew\",\n              \"noble_pay\",\n              \"pbac_z_ipko\",\n              \"plus_bank\",\n              \"santander_przelew24\",\n              \"tmobile_usbugi_bankowe\",\n              \"toyota_bank\",\n              \"velobank\",\n              \"volkswagen_bank\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"Unique reference for this Przelewy24 payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by Przelewy24 directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\\nPrzelewy24 rarely provides this information so the attribute is usually empty.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_p24\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_passthrough_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_passthrough_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_pay_by_bank\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_pay_by_bank\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_payco\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"A unique identifier for the buyer as determined by the local payment processor.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_payco\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_paynow\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"Reference number associated with this PayNow payment\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_paynow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_paypal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the buyer's country. Values are provided by PayPal directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payer_email\": {\n            \"description\": \"Owner's email. Values are provided by PayPal directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payer_id\": {\n            \"description\": \"PayPal account PayerID. This identifier uniquely identifies the PayPal customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payer_name\": {\n            \"description\": \"Owner's full name. Values provided by PayPal directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"seller_protection\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/paypal_seller_protection\"\n              }\n            ],\n            \"description\": \"The level of protection offered as defined by PayPal Seller Protection for Merchants, for this transaction.\",\n            \"nullable\": true\n          },\n          \"transaction_id\": {\n            \"description\": \"A unique ID generated by PayPal for this transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_paypal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"seller_protection\"]\n      },\n      \"payment_method_details_pix\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_transaction_id\": {\n            \"description\": \"Unique transaction id generated by BCB\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_pix\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_promptpay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"Bill reference generated by PromptPay\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_promptpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_revolut_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"funding\": {\n            \"$ref\": \"#/components/schemas/revolut_pay_underlying_payment_method_funding_details\"\n          }\n        },\n        \"title\": \"payment_method_details_revolut_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"funding\"]\n      },\n      \"payment_method_details_samsung_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"buyer_id\": {\n            \"description\": \"A unique identifier for the buyer as determined by the local payment processor.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_samsung_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_code\": {\n            \"description\": \"Bank code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"branch_code\": {\n            \"description\": \"Branch code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country the bank account is located in.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"description\": \"Find the ID of the mandate used for this payment under the [payment_method_details.sepa_debit.mandate](https://stripe.com/docs/api/charges/object#charge_object-payment_method_details-sepa_debit-mandate) property on the Charge. Use this mandate ID to [retrieve the Mandate](https://stripe.com/docs/api/mandates/retrieve).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_sofort\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_code\": {\n            \"description\": \"Bank code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"Bank Identifier Code of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country the bank account is located in.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"The ID of the SEPA Direct Debit PaymentMethod which was generated by this Charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"generated_sepa_debit_mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"The mandate for the SEPA Direct Debit PaymentMethod which was generated by this Charge.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"iban_last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_language\": {\n            \"description\": \"Preferred language of the SOFORT authorization page that the customer is redirected to.\\nCan be one of `de`, `en`, `es`, `fr`, `it`, `nl`, or `pl`\",\n            \"enum\": [\"de\", \"en\", \"es\", \"fr\", \"it\", \"nl\", \"pl\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by SOFORT directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_sofort\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"generated_sepa_debit\",\n          \"generated_sepa_debit_mandate\"\n        ]\n      },\n      \"payment_method_details_stripe_account\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_stripe_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_swish\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies the payer's Swish account. You can use this attribute to check whether two Swish transactions were paid for by the same payer\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_reference\": {\n            \"description\": \"Payer bank reference number for the payment\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_phone_last4\": {\n            \"description\": \"The last four digits of the Swish account phone number\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_swish\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_twint\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_twint\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_holder_type\": {\n            \"description\": \"Account holder type: individual or company.\",\n            \"enum\": [\"company\", \"individual\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"Account type: checkings or savings. Defaults to checking if omitted.\",\n            \"enum\": [\"checking\", \"savings\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"ID of the mandate used to make this payment.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"payment_reference\": {\n            \"description\": \"Reference number to locate ACH payments with customer's bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate\"]\n      },\n      \"payment_method_details_wechat\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_wechat\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_wechat_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular WeChat Pay account. You can use this attribute to check whether two WeChat accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_id\": {\n            \"description\": \"Transaction ID of this particular WeChat Pay transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_details_wechat_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_details_zip\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_details_zip\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_domain\": {\n        \"description\": \"A payment method domain represents a web domain that you have registered with Stripe.\\nStripe Elements use registered payment method domains to control where certain payment methods are shown.\\n\\nRelated guide: [Payment method domains](https://stripe.com/docs/payments/payment-methods/pmd-registration).\",\n        \"properties\": {\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_domain_resource_payment_method_status\"\n          },\n          \"apple_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_domain_resource_payment_method_status\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"domain_name\": {\n            \"description\": \"The domain name that this payment method domain object represents.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether this payment method domain is enabled. If the domain is not enabled, payment methods that require a payment method domain will not appear in Elements.\",\n            \"type\": \"boolean\"\n          },\n          \"google_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_domain_resource_payment_method_status\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/payment_method_domain_resource_payment_method_status\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"payment_method_domain\"],\n            \"type\": \"string\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/payment_method_domain_resource_payment_method_status\"\n          }\n        },\n        \"required\": [\n          \"amazon_pay\",\n          \"apple_pay\",\n          \"created\",\n          \"domain_name\",\n          \"enabled\",\n          \"google_pay\",\n          \"id\",\n          \"link\",\n          \"livemode\",\n          \"object\",\n          \"paypal\"\n        ],\n        \"title\": \"PaymentMethodDomainResourcePaymentMethodDomain\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"amazon_pay\",\n          \"apple_pay\",\n          \"google_pay\",\n          \"link\",\n          \"paypal\"\n        ],\n        \"x-resourceId\": \"payment_method_domain\"\n      },\n      \"payment_method_domain_resource_payment_method_status\": {\n        \"description\": \"Indicates the status of a specific payment method on a payment method domain.\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"The status of the payment method on the domain.\",\n            \"enum\": [\"active\", \"inactive\"],\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"$ref\": \"#/components/schemas/payment_method_domain_resource_payment_method_status_details\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"PaymentMethodDomainResourcePaymentMethodStatus\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_details\"]\n      },\n      \"payment_method_domain_resource_payment_method_status_details\": {\n        \"description\": \"Contains additional details about the status of a payment method for a specific payment method domain.\",\n        \"properties\": {\n          \"error_message\": {\n            \"description\": \"The error message associated with the status of the payment method on the domain.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"error_message\"],\n        \"title\": \"PaymentMethodDomainResourcePaymentMethodStatusDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_eps\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank. Should be one of `arzte_und_apotheker_bank`, `austrian_anadi_bank_ag`, `bank_austria`, `bankhaus_carl_spangler`, `bankhaus_schelhammer_und_schattera_ag`, `bawag_psk_ag`, `bks_bank_ag`, `brull_kallmus_bank_ag`, `btv_vier_lander_bank`, `capital_bank_grawe_gruppe_ag`, `deutsche_bank_ag`, `dolomitenbank`, `easybank_ag`, `erste_bank_und_sparkassen`, `hypo_alpeadriabank_international_ag`, `hypo_noe_lb_fur_niederosterreich_u_wien`, `hypo_oberosterreich_salzburg_steiermark`, `hypo_tirol_bank_ag`, `hypo_vorarlberg_bank_ag`, `hypo_bank_burgenland_aktiengesellschaft`, `marchfelder_bank`, `oberbank_ag`, `raiffeisen_bankengruppe_osterreich`, `schoellerbank_ag`, `sparda_bank_wien`, `volksbank_gruppe`, `volkskreditbank_ag`, or `vr_bank_braunau`.\",\n            \"enum\": [\n              \"arzte_und_apotheker_bank\",\n              \"austrian_anadi_bank_ag\",\n              \"bank_austria\",\n              \"bankhaus_carl_spangler\",\n              \"bankhaus_schelhammer_und_schattera_ag\",\n              \"bawag_psk_ag\",\n              \"bks_bank_ag\",\n              \"brull_kallmus_bank_ag\",\n              \"btv_vier_lander_bank\",\n              \"capital_bank_grawe_gruppe_ag\",\n              \"deutsche_bank_ag\",\n              \"dolomitenbank\",\n              \"easybank_ag\",\n              \"erste_bank_und_sparkassen\",\n              \"hypo_alpeadriabank_international_ag\",\n              \"hypo_bank_burgenland_aktiengesellschaft\",\n              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n              \"hypo_oberosterreich_salzburg_steiermark\",\n              \"hypo_tirol_bank_ag\",\n              \"hypo_vorarlberg_bank_ag\",\n              \"marchfelder_bank\",\n              \"oberbank_ag\",\n              \"raiffeisen_bankengruppe_osterreich\",\n              \"schoellerbank_ag\",\n              \"sparda_bank_wien\",\n              \"volksbank_gruppe\",\n              \"volkskreditbank_ag\",\n              \"vr_bank_braunau\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_eps\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_fpx\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank, if provided. Can be one of `affin_bank`, `agrobank`, `alliance_bank`, `ambank`, `bank_islam`, `bank_muamalat`, `bank_rakyat`, `bsn`, `cimb`, `hong_leong_bank`, `hsbc`, `kfh`, `maybank2u`, `ocbc`, `public_bank`, `rhb`, `standard_chartered`, `uob`, `deutsche_bank`, `maybank2e`, `pb_enterprise`, or `bank_of_china`.\",\n            \"enum\": [\n              \"affin_bank\",\n              \"agrobank\",\n              \"alliance_bank\",\n              \"ambank\",\n              \"bank_islam\",\n              \"bank_muamalat\",\n              \"bank_of_china\",\n              \"bank_rakyat\",\n              \"bsn\",\n              \"cimb\",\n              \"deutsche_bank\",\n              \"hong_leong_bank\",\n              \"hsbc\",\n              \"kfh\",\n              \"maybank2e\",\n              \"maybank2u\",\n              \"ocbc\",\n              \"pb_enterprise\",\n              \"public_bank\",\n              \"rhb\",\n              \"standard_chartered\",\n              \"uob\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"bank\"],\n        \"title\": \"payment_method_fpx\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_giropay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_giropay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_grabpay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_grabpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_ideal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank, if provided. Can be one of `abn_amro`, `asn_bank`, `bunq`, `handelsbanken`, `ing`, `knab`, `moneyou`, `n26`, `nn`, `rabobank`, `regiobank`, `revolut`, `sns_bank`, `triodos_bank`, `van_lanschot`, or `yoursafe`.\",\n            \"enum\": [\n              \"abn_amro\",\n              \"asn_bank\",\n              \"bunq\",\n              \"handelsbanken\",\n              \"ing\",\n              \"knab\",\n              \"moneyou\",\n              \"n26\",\n              \"nn\",\n              \"rabobank\",\n              \"regiobank\",\n              \"revolut\",\n              \"sns_bank\",\n              \"triodos_bank\",\n              \"van_lanschot\",\n              \"yoursafe\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"The Bank Identifier Code of the customer's bank, if the bank was provided.\",\n            \"enum\": [\n              \"ABNANL2A\",\n              \"ASNBNL21\",\n              \"BITSNL2A\",\n              \"BUNQNL2A\",\n              \"FVLBNL22\",\n              \"HANDNL2A\",\n              \"INGBNL2A\",\n              \"KNABNL2H\",\n              \"MOYONL21\",\n              \"NNBANL2G\",\n              \"NTSBDEB1\",\n              \"RABONL2U\",\n              \"RBRBNL21\",\n              \"REVOIE23\",\n              \"REVOLT21\",\n              \"SNSBNL2A\",\n              \"TRIONL2U\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_ideal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_interac_present\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Card brand. Can be `interac`, `mastercard` or `visa`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cardholder_name\": {\n            \"description\": \"The cardholder name as read from the card, in [ISO 7813](https://en.wikipedia.org/wiki/ISO/IEC_7813) format. May include alphanumeric characters, special characters and first/last name separator (`/`). In some cases, the cardholder name may not be available depending on how the issuer has configured the card. Cardholder name is typically not available on swipe or contactless payments, such as those made with Apple Pay and Google Pay.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"A high-level description of the type of cards issued in this range.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuer\": {\n            \"description\": \"The name of the card's issuing bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"networks\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_card_present_networks\"\n              }\n            ],\n            \"description\": \"Contains information about card networks that can be used to process the payment.\",\n            \"nullable\": true\n          },\n          \"preferred_locales\": {\n            \"description\": \"EMV tag 5F2D. Preferred languages specified by the integrated circuit chip.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"read_method\": {\n            \"description\": \"How card details were read in this transaction.\",\n            \"enum\": [\n              \"contact_emv\",\n              \"contactless_emv\",\n              \"contactless_magstripe_mode\",\n              \"magnetic_stripe_fallback\",\n              \"magnetic_stripe_track2\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"exp_month\", \"exp_year\"],\n        \"title\": \"payment_method_interac_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"networks\"]\n      },\n      \"payment_method_kakao_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_kakao_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_klarna\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"dob\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_private_payment_methods_klarna_dob\"\n              }\n            ],\n            \"description\": \"The customer's date of birth, if provided.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_klarna\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"dob\"]\n      },\n      \"payment_method_konbini\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_konbini\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_kr_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"The local credit or debit card brand.\",\n            \"enum\": [\n              \"bc\",\n              \"citi\",\n              \"hana\",\n              \"hyundai\",\n              \"jeju\",\n              \"jeonbuk\",\n              \"kakaobank\",\n              \"kbank\",\n              \"kdbbank\",\n              \"kookmin\",\n              \"kwangju\",\n              \"lotte\",\n              \"mg\",\n              \"nh\",\n              \"post\",\n              \"samsung\",\n              \"savingsbank\",\n              \"shinhan\",\n              \"shinhyup\",\n              \"suhyup\",\n              \"tossbank\",\n              \"woori\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card. This may not be present for American Express cards.\",\n            \"maxLength\": 4,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_kr_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_link\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"email\": {\n            \"description\": \"Account owner's email address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_mobilepay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_mobilepay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_multibanco\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_multibanco\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_naver_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"funding\": {\n            \"description\": \"Whether to fund this transaction with Naver Pay points or a card.\",\n            \"enum\": [\"card\", \"points\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"funding\"],\n        \"title\": \"payment_method_naver_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_affirm\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"preferred_locale\": {\n            \"description\": \"Preferred language of the Affirm authorization page that the customer is redirected to.\",\n            \"maxLength\": 30,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_affirm\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_afterpay_clearpay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"An internal identifier or reference that this payment corresponds to. You must limit the identifier to 128 characters, and it can only contain letters, numbers, underscores, backslashes, and dashes.\\nThis field differs from the statement descriptor and item name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_method_options_afterpay_clearpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_alipay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_alipay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_alma\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_alma\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_amazon_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_amazon_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_bancontact\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"preferred_language\": {\n            \"description\": \"Preferred language of the Bancontact authorization page that the customer is redirected to.\",\n            \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"preferred_language\"],\n        \"title\": \"payment_method_options_bancontact\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_boleto\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after_days\": {\n            \"description\": \"The number of calendar days before a Boleto voucher expires. For example, if you create a Boleto voucher on Monday and you set expires_after_days to 2, the Boleto voucher will expire on Wednesday at 23:59 America/Sao_Paulo time.\",\n            \"type\": \"integer\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"expires_after_days\"],\n        \"title\": \"payment_method_options_boleto\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_card_installments\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available_plans\": {\n            \"description\": \"Installment plans that may be selected for this PaymentIntent.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_method_details_card_installments_plan\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether Installments are enabled for this PaymentIntent.\",\n            \"type\": \"boolean\"\n          },\n          \"plan\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_installments_plan\"\n              }\n            ],\n            \"description\": \"Installment plan selected for this PaymentIntent.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"payment_method_options_card_installments\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"available_plans\", \"plan\"]\n      },\n      \"payment_method_options_card_mandate_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount to be charged for future payments.\",\n            \"type\": \"integer\"\n          },\n          \"amount_type\": {\n            \"description\": \"One of `fixed` or `maximum`. If `fixed`, the `amount` param refers to the exact amount to be charged in future payments. If `maximum`, the amount charged can be up to the value passed for the `amount` param.\",\n            \"enum\": [\"fixed\", \"maximum\"],\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"A description of the mandate or subscription that is meant to be displayed to the customer.\",\n            \"maxLength\": 200,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"end_date\": {\n            \"description\": \"End date of the mandate or subscription. If not provided, the mandate will be active until canceled. If provided, end date should be after start date.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"interval\": {\n            \"description\": \"Specifies payment frequency. One of `day`, `week`, `month`, `year`, or `sporadic`.\",\n            \"enum\": [\"day\", \"month\", \"sporadic\", \"week\", \"year\"],\n            \"type\": \"string\"\n          },\n          \"interval_count\": {\n            \"description\": \"The number of intervals between payments. For example, `interval=month` and `interval_count=3` indicates one payment every three months. Maximum of one year interval allowed (1 year, 12 months, or 52 weeks). This parameter is optional when `interval=sporadic`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"reference\": {\n            \"description\": \"Unique identifier for the mandate or subscription.\",\n            \"maxLength\": 80,\n            \"type\": \"string\"\n          },\n          \"start_date\": {\n            \"description\": \"Start date of the mandate or subscription. Start date should not be lesser than yesterday.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"supported_types\": {\n            \"description\": \"Specifies the type of mandates supported. Possible values are `india`.\",\n            \"items\": {\n              \"enum\": [\"india\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"amount_type\",\n          \"interval\",\n          \"reference\",\n          \"start_date\"\n        ],\n        \"title\": \"payment_method_options_card_mandate_options\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_card_present\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"request_extended_authorization\": {\n            \"description\": \"Request ability to capture this payment beyond the standard [authorization validity window](https://stripe.com/docs/terminal/features/extended-authorizations#authorization-validity)\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"request_incremental_authorization_support\": {\n            \"description\": \"Request ability to [increment](https://stripe.com/docs/terminal/features/incremental-authorizations) this PaymentIntent if the combination of MCC and card brand is eligible. Check [incremental_authorization_supported](https://stripe.com/docs/api/charges/object#charge_object-payment_method_details-card_present-incremental_authorization_supported) in the [Confirm](https://stripe.com/docs/api/payment_intents/confirm) response to verify support.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"routing\": {\n            \"$ref\": \"#/components/schemas/payment_method_options_card_present_routing\"\n          }\n        },\n        \"title\": \"payment_method_options_card_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"routing\"]\n      },\n      \"payment_method_options_card_present_routing\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"requested_priority\": {\n            \"description\": \"Requested routing priority\",\n            \"enum\": [\"domestic\", \"international\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_card_present_routing\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_cashapp\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_cashapp\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_customer_balance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_transfer\": {\n            \"$ref\": \"#/components/schemas/payment_method_options_customer_balance_bank_transfer\"\n          },\n          \"funding_type\": {\n            \"description\": \"The funding method type to be used when there are not enough funds in the customer balance. Permitted values include: `bank_transfer`.\",\n            \"enum\": [\"bank_transfer\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_customer_balance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"bank_transfer\"]\n      },\n      \"payment_method_options_customer_balance_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"eu_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/payment_method_options_customer_balance_eu_bank_account\"\n          },\n          \"requested_address_types\": {\n            \"description\": \"List of address types that should be returned in the financial_addresses response. If not specified, all valid types will be returned.\\n\\nPermitted values include: `sort_code`, `zengin`, `iban`, or `spei`.\",\n            \"items\": {\n              \"enum\": [\n                \"aba\",\n                \"iban\",\n                \"sepa\",\n                \"sort_code\",\n                \"spei\",\n                \"swift\",\n                \"zengin\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"type\": {\n            \"description\": \"The bank transfer type that this PaymentIntent is allowed to use for funding Permitted values include: `eu_bank_transfer`, `gb_bank_transfer`, `jp_bank_transfer`, `mx_bank_transfer`, or `us_bank_transfer`.\",\n            \"enum\": [\n              \"eu_bank_transfer\",\n              \"gb_bank_transfer\",\n              \"jp_bank_transfer\",\n              \"mx_bank_transfer\",\n              \"us_bank_transfer\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_method_options_customer_balance_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"eu_bank_transfer\"]\n      },\n      \"payment_method_options_customer_balance_eu_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"The desired country code of the bank account information. Permitted values include: `BE`, `DE`, `ES`, `FR`, `IE`, or `NL`.\",\n            \"enum\": [\"BE\", \"DE\", \"ES\", \"FR\", \"IE\", \"NL\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"country\"],\n        \"title\": \"payment_method_options_customer_balance_eu_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_fpx\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_fpx\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_giropay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_giropay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_grabpay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_grabpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_ideal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_ideal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_interac_present\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_options_interac_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_klarna\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"preferred_locale\": {\n            \"description\": \"Preferred locale of the Klarna checkout page that the customer is redirected to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_method_options_klarna\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_konbini\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"confirmation_number\": {\n            \"description\": \"An optional 10 to 11 digit numeric-only string determining the confirmation code at applicable convenience stores.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"expires_after_days\": {\n            \"description\": \"The number of calendar days (between 1 and 60) after which Konbini payment instructions will expire. For example, if a PaymentIntent is confirmed with Konbini and `expires_after_days` set to 2 on Monday JST, the instructions will expire on Wednesday 23:59:59 JST.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which the Konbini payment instructions will expire. Only one of `expires_after_days` or `expires_at` may be set.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"product_description\": {\n            \"description\": \"A product descriptor of up to 22 characters, which will appear to customers at the convenience store.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_konbini\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_kr_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_kr_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_multibanco\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_multibanco\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_oxxo\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after_days\": {\n            \"description\": \"The number of calendar days before an OXXO invoice expires. For example, if you create an OXXO invoice on Monday and you set expires_after_days to 2, the OXXO invoice will expire on Wednesday at 23:59 America/Mexico_City time.\",\n            \"type\": \"integer\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"expires_after_days\"],\n        \"title\": \"payment_method_options_oxxo\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_p24\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_p24\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_pay_by_bank\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_options_pay_by_bank\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_paynow\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_paynow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_paypal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"preferred_locale\": {\n            \"description\": \"Preferred locale of the PayPal checkout page that the customer is redirected to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"A reference of the PayPal transaction visible to customer which is mapped to PayPal's invoice ID. This must be a globally unique ID if you have configured in your PayPal settings to block multiple payments per invoice ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_paypal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_pix\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"expires_after_seconds\": {\n            \"description\": \"The number of seconds (between 10 and 1209600) after which Pix payment will expire.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which the Pix expires.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_pix\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_promptpay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_promptpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_revolut_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"capture_method\": {\n            \"description\": \"Controls when the funds will be captured from the customer's account.\",\n            \"enum\": [\"manual\"],\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_revolut_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_sofort\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"preferred_language\": {\n            \"description\": \"Preferred language of the SOFORT authorization page that the customer is redirected to.\",\n            \"enum\": [\"de\", \"en\", \"es\", \"fr\", \"it\", \"nl\", \"pl\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\", \"off_session\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_sofort\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_twint\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_twint\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_us_bank_account_mandate_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"collection_method\": {\n            \"description\": \"Mandate collection method\",\n            \"enum\": [\"paper\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_method_options_us_bank_account_mandate_options\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_wechat_pay\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"app_id\": {\n            \"description\": \"The app ID registered with WeChat Pay. Only required when client is ios or android.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"client\": {\n            \"description\": \"The client type that the end customer will pay from\",\n            \"enum\": [\"android\", \"ios\", \"web\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_wechat_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_options_zip\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"setup_future_usage\": {\n            \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n            \"enum\": [\"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_options_zip\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_oxxo\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_oxxo\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_p24\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank, if provided.\",\n            \"enum\": [\n              \"alior_bank\",\n              \"bank_millennium\",\n              \"bank_nowy_bfg_sa\",\n              \"bank_pekao_sa\",\n              \"banki_spbdzielcze\",\n              \"blik\",\n              \"bnp_paribas\",\n              \"boz\",\n              \"citi_handlowy\",\n              \"credit_agricole\",\n              \"envelobank\",\n              \"etransfer_pocztowy24\",\n              \"getin_bank\",\n              \"ideabank\",\n              \"ing\",\n              \"inteligo\",\n              \"mbank_mtransfer\",\n              \"nest_przelew\",\n              \"noble_pay\",\n              \"pbac_z_ipko\",\n              \"plus_bank\",\n              \"santander_przelew24\",\n              \"tmobile_usbugi_bankowe\",\n              \"toyota_bank\",\n              \"velobank\",\n              \"volkswagen_bank\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"payment_method_p24\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_pay_by_bank\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_pay_by_bank\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_payco\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_payco\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_paynow\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_paynow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_paypal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the buyer's country. Values are provided by PayPal directly (if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payer_email\": {\n            \"description\": \"Owner's email. Values are provided by PayPal directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payer_id\": {\n            \"description\": \"PayPal account PayerID. This identifier uniquely identifies the PayPal customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_paypal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_pix\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_pix\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_promptpay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_promptpay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_revolut_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_revolut_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_samsung_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_samsung_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_code\": {\n            \"description\": \"Bank code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"branch_code\": {\n            \"description\": \"Branch code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country the bank account is located in.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_from\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/sepa_debit_generated_from\"\n              }\n            ],\n            \"description\": \"Information about the object that generated this PaymentMethod.\",\n            \"nullable\": true\n          },\n          \"last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"generated_from\"]\n      },\n      \"payment_method_sofort\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country the bank account is located in.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_sofort\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_swish\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_swish\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_twint\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_twint\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_holder_type\": {\n            \"description\": \"Account holder type: individual or company.\",\n            \"enum\": [\"company\", \"individual\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_type\": {\n            \"description\": \"Account type: checkings or savings. Defaults to checking if omitted.\",\n            \"enum\": [\"checking\", \"savings\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"The name of the bank.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"financial_connections_account\": {\n            \"description\": \"The ID of the Financial Connections Account used to create the payment method.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"networks\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/us_bank_account_networks\"\n              }\n            ],\n            \"description\": \"Contains information about US bank account networks that can be used.\",\n            \"nullable\": true\n          },\n          \"routing_number\": {\n            \"description\": \"Routing number of the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_us_bank_account_status_details\"\n              }\n            ],\n            \"description\": \"Contains information about the future reusability of this PaymentMethod.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"payment_method_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"networks\", \"status_details\"]\n      },\n      \"payment_method_us_bank_account_blocked\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"network_code\": {\n            \"description\": \"The ACH network code that resulted in this block.\",\n            \"enum\": [\n              \"R02\",\n              \"R03\",\n              \"R04\",\n              \"R05\",\n              \"R07\",\n              \"R08\",\n              \"R10\",\n              \"R11\",\n              \"R16\",\n              \"R20\",\n              \"R29\",\n              \"R31\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"The reason why this PaymentMethod's fingerprint has been blocked\",\n            \"enum\": [\n              \"bank_account_closed\",\n              \"bank_account_frozen\",\n              \"bank_account_invalid_details\",\n              \"bank_account_restricted\",\n              \"bank_account_unusable\",\n              \"debit_not_authorized\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"payment_method_us_bank_account_blocked\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_us_bank_account_status_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"blocked\": {\n            \"$ref\": \"#/components/schemas/payment_method_us_bank_account_blocked\"\n          }\n        },\n        \"title\": \"payment_method_us_bank_account_status_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"blocked\"]\n      },\n      \"payment_method_wechat_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_wechat_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_method_zip\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"payment_method_zip\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_adaptive_pricing\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether Adaptive Pricing is enabled.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentPagesCheckoutSessionAdaptivePricing\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_after_expiration\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"recovery\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_after_expiration_recovery\"\n              }\n            ],\n            \"description\": \"When set, configuration used to recover the Checkout Session on expiry.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionAfterExpiration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"recovery\"]\n      },\n      \"payment_pages_checkout_session_after_expiration_recovery\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allow_promotion_codes\": {\n            \"description\": \"Enables user redeemable promotion codes on the recovered Checkout Sessions. Defaults to `false`\",\n            \"type\": \"boolean\"\n          },\n          \"enabled\": {\n            \"description\": \"If `true`, a recovery url will be generated to recover this Checkout Session if it\\nexpires before a transaction is completed. It will be attached to the\\nCheckout Session object upon expiration.\",\n            \"type\": \"boolean\"\n          },\n          \"expires_at\": {\n            \"description\": \"The timestamp at which the recovery URL will expire.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"url\": {\n            \"description\": \"URL that creates a new Checkout Session when clicked that is a copy of this expired Checkout Session\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"allow_promotion_codes\", \"enabled\"],\n        \"title\": \"PaymentPagesCheckoutSessionAfterExpirationRecovery\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_automatic_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Indicates whether automatic tax is enabled for the session\",\n            \"type\": \"boolean\"\n          },\n          \"liability\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The account that's liable for tax. If set, the business address and tax registrations required to perform the tax calculation are loaded from this account. The tax transaction is returned in the report of the connected account.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"The status of the most recent automated tax calculation for this session.\",\n            \"enum\": [\"complete\", \"failed\", \"requires_location_inputs\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentPagesCheckoutSessionAutomaticTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"liability\"]\n      },\n      \"payment_pages_checkout_session_collected_information\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"shipping_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping\"\n              }\n            ],\n            \"description\": \"Shipping information for this Checkout Session.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionCollectedInformation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"shipping_details\"]\n      },\n      \"payment_pages_checkout_session_consent\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"promotions\": {\n            \"description\": \"If `opt_in`, the customer consents to receiving promotional communications\\nfrom the merchant about this Checkout Session.\",\n            \"enum\": [\"opt_in\", \"opt_out\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terms_of_service\": {\n            \"description\": \"If `accepted`, the customer in this Checkout Session has agreed to the merchant's terms of service.\",\n            \"enum\": [\"accepted\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionConsent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_consent_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payment_method_reuse_agreement\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_payment_method_reuse_agreement\"\n              }\n            ],\n            \"description\": \"If set to `hidden`, it will hide legal text related to the reuse of a payment method.\",\n            \"nullable\": true\n          },\n          \"promotions\": {\n            \"description\": \"If set to `auto`, enables the collection of customer consent for promotional communications. The Checkout\\nSession will determine whether to display an option to opt into promotional communication\\nfrom the merchant depending on the customer's locale. Only available to US merchants.\",\n            \"enum\": [\"auto\", \"none\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terms_of_service\": {\n            \"description\": \"If set to `required`, it requires customers to accept the terms of service before being able to pay.\",\n            \"enum\": [\"none\", \"required\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionConsentCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_method_reuse_agreement\"]\n      },\n      \"payment_pages_checkout_session_currency_conversion\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_subtotal\": {\n            \"description\": \"Total of all items in source currency before discounts or taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total of all items in source currency after discounts and taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"fx_rate\": {\n            \"description\": \"Exchange rate used to convert source currency amounts to customer currency amounts\",\n            \"format\": \"decimal\",\n            \"type\": \"string\"\n          },\n          \"source_currency\": {\n            \"description\": \"Creation currency of the CheckoutSession before localization\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount_subtotal\",\n          \"amount_total\",\n          \"fx_rate\",\n          \"source_currency\"\n        ],\n        \"title\": \"PaymentPagesCheckoutSessionCurrencyConversion\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_custom_fields\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"dropdown\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_fields_dropdown\"\n          },\n          \"key\": {\n            \"description\": \"String of your choice that your integration can use to reconcile this field. Must be unique to this field, alphanumeric, and up to 200 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"label\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_fields_label\"\n          },\n          \"numeric\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_fields_numeric\"\n          },\n          \"optional\": {\n            \"description\": \"Whether the customer is required to complete the field before completing the Checkout Session. Defaults to `false`.\",\n            \"type\": \"boolean\"\n          },\n          \"text\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_fields_text\"\n          },\n          \"type\": {\n            \"description\": \"The type of the field.\",\n            \"enum\": [\"dropdown\", \"numeric\", \"text\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"key\", \"label\", \"optional\", \"type\"],\n        \"title\": \"PaymentPagesCheckoutSessionCustomFields\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"dropdown\", \"label\", \"numeric\", \"text\"]\n      },\n      \"payment_pages_checkout_session_custom_fields_dropdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"default_value\": {\n            \"description\": \"The value that will pre-fill on the payment page.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"options\": {\n            \"description\": \"The options available for the customer to select. Up to 200 options allowed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_fields_option\"\n            },\n            \"type\": \"array\"\n          },\n          \"value\": {\n            \"description\": \"The option selected by the customer. This will be the `value` for the option.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"options\"],\n        \"title\": \"PaymentPagesCheckoutSessionCustomFieldsDropdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"options\"]\n      },\n      \"payment_pages_checkout_session_custom_fields_label\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom\": {\n            \"description\": \"Custom text for the label, displayed to the customer. Up to 50 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of the label.\",\n            \"enum\": [\"custom\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentPagesCheckoutSessionCustomFieldsLabel\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_custom_fields_numeric\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"default_value\": {\n            \"description\": \"The value that will pre-fill the field on the payment page.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"maximum_length\": {\n            \"description\": \"The maximum character length constraint for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"minimum_length\": {\n            \"description\": \"The minimum character length requirement for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"value\": {\n            \"description\": \"The value entered by the customer, containing only digits.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionCustomFieldsNumeric\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_custom_fields_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"label\": {\n            \"description\": \"The label for the option, displayed to the customer. Up to 100 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The value for this option, not displayed to the customer, used by your integration to reconcile the option selected by the customer. Must be unique to this option, alphanumeric, and up to 100 characters.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"label\", \"value\"],\n        \"title\": \"PaymentPagesCheckoutSessionCustomFieldsOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_custom_fields_text\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"default_value\": {\n            \"description\": \"The value that will pre-fill the field on the payment page.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"maximum_length\": {\n            \"description\": \"The maximum character length constraint for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"minimum_length\": {\n            \"description\": \"The minimum character length requirement for the customer's input.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"value\": {\n            \"description\": \"The value entered by the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionCustomFieldsText\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_custom_text\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"after_submit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed after the payment confirmation button.\",\n            \"nullable\": true\n          },\n          \"shipping_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed alongside shipping address collection.\",\n            \"nullable\": true\n          },\n          \"submit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed alongside the payment confirmation button.\",\n            \"nullable\": true\n          },\n          \"terms_of_service_acceptance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_pages_checkout_session_custom_text_position\"\n              }\n            ],\n            \"description\": \"Custom text that should be displayed in place of the default terms of service agreement text.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionCustomText\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"after_submit\",\n          \"shipping_address\",\n          \"submit\",\n          \"terms_of_service_acceptance\"\n        ]\n      },\n      \"payment_pages_checkout_session_custom_text_position\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"message\": {\n            \"description\": \"Text may be up to 1200 characters in length.\",\n            \"maxLength\": 500,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"message\"],\n        \"title\": \"PaymentPagesCheckoutSessionCustomTextPosition\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_customer_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"The customer's address after a completed Checkout Session. Note: This property is populated only for sessions on or after March 30, 2022.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"The email associated with the Customer, if one exists, on the Checkout Session after a completed Checkout Session or at time of session expiry.\\nOtherwise, if the customer has consented to promotional content, this value is the most recent valid email provided by the customer on the Checkout form.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"The customer's name after a completed Checkout Session. Note: This property is populated only for sessions on or after March 30, 2022.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"The customer's phone number after a completed Checkout Session.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_exempt\": {\n            \"description\": \"The customer’s tax exempt status after a completed Checkout Session.\",\n            \"enum\": [\"exempt\", \"none\", \"reverse\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_ids\": {\n            \"description\": \"The customer’s tax IDs after a completed Checkout Session.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/payment_pages_checkout_session_tax_id\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionCustomerDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\", \"tax_ids\"]\n      },\n      \"payment_pages_checkout_session_discount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"coupon\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/coupon\"\n              }\n            ],\n            \"description\": \"Coupon attached to the Checkout Session.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/coupon\"\n                }\n              ]\n            }\n          },\n          \"promotion_code\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/promotion_code\"\n              }\n            ],\n            \"description\": \"Promotion code attached to the Checkout Session.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/promotion_code\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionDiscount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"coupon\", \"promotion_code\"]\n      },\n      \"payment_pages_checkout_session_invoice_creation\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Indicates whether invoice creation is enabled for the Checkout Session.\",\n            \"type\": \"boolean\"\n          },\n          \"invoice_data\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_invoice_settings\"\n          }\n        },\n        \"required\": [\"enabled\", \"invoice_data\"],\n        \"title\": \"PaymentPagesCheckoutSessionInvoiceCreation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"invoice_data\"]\n      },\n      \"payment_pages_checkout_session_invoice_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_tax_ids\": {\n            \"description\": \"The account tax IDs associated with the invoice.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_id\"\n                  },\n                  {\n                    \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"custom_fields\": {\n            \"description\": \"Custom fields displayed on the invoice.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/invoice_setting_custom_field\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"footer\": {\n            \"description\": \"Footer displayed on the invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuer\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n            \"nullable\": true\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"rendering_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_setting_checkout_rendering_options\"\n              }\n            ],\n            \"description\": \"Options for invoice PDF rendering.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionInvoiceSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"account_tax_ids\",\n          \"custom_fields\",\n          \"issuer\",\n          \"rendering_options\"\n        ]\n      },\n      \"payment_pages_checkout_session_payment_method_reuse_agreement\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"position\": {\n            \"description\": \"Determines the position and visibility of the payment method reuse agreement in the UI. When set to `auto`, Stripe's defaults will be used.\\n\\nWhen set to `hidden`, the payment method reuse agreement text will always be hidden in the UI.\",\n            \"enum\": [\"auto\", \"hidden\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"position\"],\n        \"title\": \"PaymentPagesCheckoutSessionPaymentMethodReuseAgreement\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_phone_number_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Indicates whether phone number collection is enabled for the session\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PaymentPagesCheckoutSessionPhoneNumberCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_saved_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allow_redisplay_filters\": {\n            \"description\": \"Uses the `allow_redisplay` value of each saved payment method to filter the set presented to a returning customer. By default, only saved payment methods with ’allow_redisplay: ‘always’ are shown in Checkout.\",\n            \"items\": {\n              \"enum\": [\"always\", \"limited\", \"unspecified\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"payment_method_remove\": {\n            \"description\": \"Enable customers to choose if they wish to remove their saved payment methods. Disabled by default.\",\n            \"enum\": [\"disabled\", \"enabled\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_method_save\": {\n            \"description\": \"Enable customers to choose if they wish to save their payment method for future use. Disabled by default.\",\n            \"enum\": [\"disabled\", \"enabled\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PaymentPagesCheckoutSessionSavedPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_shipping_address_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allowed_countries\": {\n            \"description\": \"An array of two-letter ISO country codes representing which countries Checkout should provide as options for\\nshipping locations. Unsupported country codes: `AS, CX, CC, CU, HM, IR, KP, MH, FM, NF, MP, PW, SY, UM, VI`.\",\n            \"items\": {\n              \"enum\": [\n                \"AC\",\n                \"AD\",\n                \"AE\",\n                \"AF\",\n                \"AG\",\n                \"AI\",\n                \"AL\",\n                \"AM\",\n                \"AO\",\n                \"AQ\",\n                \"AR\",\n                \"AT\",\n                \"AU\",\n                \"AW\",\n                \"AX\",\n                \"AZ\",\n                \"BA\",\n                \"BB\",\n                \"BD\",\n                \"BE\",\n                \"BF\",\n                \"BG\",\n                \"BH\",\n                \"BI\",\n                \"BJ\",\n                \"BL\",\n                \"BM\",\n                \"BN\",\n                \"BO\",\n                \"BQ\",\n                \"BR\",\n                \"BS\",\n                \"BT\",\n                \"BV\",\n                \"BW\",\n                \"BY\",\n                \"BZ\",\n                \"CA\",\n                \"CD\",\n                \"CF\",\n                \"CG\",\n                \"CH\",\n                \"CI\",\n                \"CK\",\n                \"CL\",\n                \"CM\",\n                \"CN\",\n                \"CO\",\n                \"CR\",\n                \"CV\",\n                \"CW\",\n                \"CY\",\n                \"CZ\",\n                \"DE\",\n                \"DJ\",\n                \"DK\",\n                \"DM\",\n                \"DO\",\n                \"DZ\",\n                \"EC\",\n                \"EE\",\n                \"EG\",\n                \"EH\",\n                \"ER\",\n                \"ES\",\n                \"ET\",\n                \"FI\",\n                \"FJ\",\n                \"FK\",\n                \"FO\",\n                \"FR\",\n                \"GA\",\n                \"GB\",\n                \"GD\",\n                \"GE\",\n                \"GF\",\n                \"GG\",\n                \"GH\",\n                \"GI\",\n                \"GL\",\n                \"GM\",\n                \"GN\",\n                \"GP\",\n                \"GQ\",\n                \"GR\",\n                \"GS\",\n                \"GT\",\n                \"GU\",\n                \"GW\",\n                \"GY\",\n                \"HK\",\n                \"HN\",\n                \"HR\",\n                \"HT\",\n                \"HU\",\n                \"ID\",\n                \"IE\",\n                \"IL\",\n                \"IM\",\n                \"IN\",\n                \"IO\",\n                \"IQ\",\n                \"IS\",\n                \"IT\",\n                \"JE\",\n                \"JM\",\n                \"JO\",\n                \"JP\",\n                \"KE\",\n                \"KG\",\n                \"KH\",\n                \"KI\",\n                \"KM\",\n                \"KN\",\n                \"KR\",\n                \"KW\",\n                \"KY\",\n                \"KZ\",\n                \"LA\",\n                \"LB\",\n                \"LC\",\n                \"LI\",\n                \"LK\",\n                \"LR\",\n                \"LS\",\n                \"LT\",\n                \"LU\",\n                \"LV\",\n                \"LY\",\n                \"MA\",\n                \"MC\",\n                \"MD\",\n                \"ME\",\n                \"MF\",\n                \"MG\",\n                \"MK\",\n                \"ML\",\n                \"MM\",\n                \"MN\",\n                \"MO\",\n                \"MQ\",\n                \"MR\",\n                \"MS\",\n                \"MT\",\n                \"MU\",\n                \"MV\",\n                \"MW\",\n                \"MX\",\n                \"MY\",\n                \"MZ\",\n                \"NA\",\n                \"NC\",\n                \"NE\",\n                \"NG\",\n                \"NI\",\n                \"NL\",\n                \"NO\",\n                \"NP\",\n                \"NR\",\n                \"NU\",\n                \"NZ\",\n                \"OM\",\n                \"PA\",\n                \"PE\",\n                \"PF\",\n                \"PG\",\n                \"PH\",\n                \"PK\",\n                \"PL\",\n                \"PM\",\n                \"PN\",\n                \"PR\",\n                \"PS\",\n                \"PT\",\n                \"PY\",\n                \"QA\",\n                \"RE\",\n                \"RO\",\n                \"RS\",\n                \"RU\",\n                \"RW\",\n                \"SA\",\n                \"SB\",\n                \"SC\",\n                \"SD\",\n                \"SE\",\n                \"SG\",\n                \"SH\",\n                \"SI\",\n                \"SJ\",\n                \"SK\",\n                \"SL\",\n                \"SM\",\n                \"SN\",\n                \"SO\",\n                \"SR\",\n                \"SS\",\n                \"ST\",\n                \"SV\",\n                \"SX\",\n                \"SZ\",\n                \"TA\",\n                \"TC\",\n                \"TD\",\n                \"TF\",\n                \"TG\",\n                \"TH\",\n                \"TJ\",\n                \"TK\",\n                \"TL\",\n                \"TM\",\n                \"TN\",\n                \"TO\",\n                \"TR\",\n                \"TT\",\n                \"TV\",\n                \"TW\",\n                \"TZ\",\n                \"UA\",\n                \"UG\",\n                \"US\",\n                \"UY\",\n                \"UZ\",\n                \"VA\",\n                \"VC\",\n                \"VE\",\n                \"VG\",\n                \"VN\",\n                \"VU\",\n                \"WF\",\n                \"WS\",\n                \"XK\",\n                \"YE\",\n                \"YT\",\n                \"ZA\",\n                \"ZM\",\n                \"ZW\",\n                \"ZZ\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"allowed_countries\"],\n        \"title\": \"PaymentPagesCheckoutSessionShippingAddressCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_shipping_cost\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_subtotal\": {\n            \"description\": \"Total shipping cost before any discounts or taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"Total tax amount applied due to shipping costs. If no tax was applied, defaults to 0.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total shipping cost after discounts and taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"shipping_rate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/shipping_rate\"\n              }\n            ],\n            \"description\": \"The ID of the ShippingRate for this order.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/shipping_rate\"\n                }\n              ]\n            }\n          },\n          \"taxes\": {\n            \"description\": \"The taxes applied to the shipping rate.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_tax_amount\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"amount_subtotal\", \"amount_tax\", \"amount_total\"],\n        \"title\": \"PaymentPagesCheckoutSessionShippingCost\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"shipping_rate\", \"taxes\"]\n      },\n      \"payment_pages_checkout_session_shipping_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"shipping_amount\": {\n            \"description\": \"A non-negative integer in cents representing how much to charge.\",\n            \"type\": \"integer\"\n          },\n          \"shipping_rate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/shipping_rate\"\n              }\n            ],\n            \"description\": \"The shipping rate.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/shipping_rate\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"shipping_amount\", \"shipping_rate\"],\n        \"title\": \"PaymentPagesCheckoutSessionShippingOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"shipping_rate\"]\n      },\n      \"payment_pages_checkout_session_tax_id\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"The type of the tax ID, one of `ad_nrt`, `ar_cuit`, `eu_vat`, `bo_tin`, `br_cnpj`, `br_cpf`, `cn_tin`, `co_nit`, `cr_tin`, `do_rcn`, `ec_ruc`, `eu_oss_vat`, `hr_oib`, `pe_ruc`, `ro_tin`, `rs_pib`, `sv_nit`, `uy_ruc`, `ve_rif`, `vn_tin`, `gb_vat`, `nz_gst`, `au_abn`, `au_arn`, `in_gst`, `no_vat`, `no_voec`, `za_vat`, `ch_vat`, `mx_rfc`, `sg_uen`, `ru_inn`, `ru_kpp`, `ca_bn`, `hk_br`, `es_cif`, `tw_vat`, `th_vat`, `jp_cn`, `jp_rn`, `jp_trn`, `li_uid`, `li_vat`, `my_itn`, `us_ein`, `kr_brn`, `ca_qst`, `ca_gst_hst`, `ca_pst_bc`, `ca_pst_mb`, `ca_pst_sk`, `my_sst`, `sg_gst`, `ae_trn`, `cl_tin`, `sa_vat`, `id_npwp`, `my_frp`, `il_vat`, `ge_vat`, `ua_vat`, `is_vat`, `bg_uic`, `hu_tin`, `si_tin`, `ke_pin`, `tr_tin`, `eg_tin`, `ph_tin`, `al_tin`, `bh_vat`, `kz_bin`, `ng_tin`, `om_vat`, `de_stn`, `ch_uid`, `tz_vat`, `uz_vat`, `uz_tin`, `md_vat`, `ma_vat`, `by_tin`, `ao_tin`, `bs_tin`, `bb_tin`, `cd_nif`, `mr_nif`, `me_pib`, `zw_tin`, `ba_tin`, `gn_nif`, `mk_vat`, `sr_fin`, `sn_ninea`, `am_tin`, `np_pan`, `tj_tin`, `ug_tin`, `zm_tin`, `kh_tin`, or `unknown`\",\n            \"enum\": [\n              \"ad_nrt\",\n              \"ae_trn\",\n              \"al_tin\",\n              \"am_tin\",\n              \"ao_tin\",\n              \"ar_cuit\",\n              \"au_abn\",\n              \"au_arn\",\n              \"ba_tin\",\n              \"bb_tin\",\n              \"bg_uic\",\n              \"bh_vat\",\n              \"bo_tin\",\n              \"br_cnpj\",\n              \"br_cpf\",\n              \"bs_tin\",\n              \"by_tin\",\n              \"ca_bn\",\n              \"ca_gst_hst\",\n              \"ca_pst_bc\",\n              \"ca_pst_mb\",\n              \"ca_pst_sk\",\n              \"ca_qst\",\n              \"cd_nif\",\n              \"ch_uid\",\n              \"ch_vat\",\n              \"cl_tin\",\n              \"cn_tin\",\n              \"co_nit\",\n              \"cr_tin\",\n              \"de_stn\",\n              \"do_rcn\",\n              \"ec_ruc\",\n              \"eg_tin\",\n              \"es_cif\",\n              \"eu_oss_vat\",\n              \"eu_vat\",\n              \"gb_vat\",\n              \"ge_vat\",\n              \"gn_nif\",\n              \"hk_br\",\n              \"hr_oib\",\n              \"hu_tin\",\n              \"id_npwp\",\n              \"il_vat\",\n              \"in_gst\",\n              \"is_vat\",\n              \"jp_cn\",\n              \"jp_rn\",\n              \"jp_trn\",\n              \"ke_pin\",\n              \"kh_tin\",\n              \"kr_brn\",\n              \"kz_bin\",\n              \"li_uid\",\n              \"li_vat\",\n              \"ma_vat\",\n              \"md_vat\",\n              \"me_pib\",\n              \"mk_vat\",\n              \"mr_nif\",\n              \"mx_rfc\",\n              \"my_frp\",\n              \"my_itn\",\n              \"my_sst\",\n              \"ng_tin\",\n              \"no_vat\",\n              \"no_voec\",\n              \"np_pan\",\n              \"nz_gst\",\n              \"om_vat\",\n              \"pe_ruc\",\n              \"ph_tin\",\n              \"ro_tin\",\n              \"rs_pib\",\n              \"ru_inn\",\n              \"ru_kpp\",\n              \"sa_vat\",\n              \"sg_gst\",\n              \"sg_uen\",\n              \"si_tin\",\n              \"sn_ninea\",\n              \"sr_fin\",\n              \"sv_nit\",\n              \"th_vat\",\n              \"tj_tin\",\n              \"tr_tin\",\n              \"tw_vat\",\n              \"tz_vat\",\n              \"ua_vat\",\n              \"ug_tin\",\n              \"unknown\",\n              \"us_ein\",\n              \"uy_ruc\",\n              \"uz_tin\",\n              \"uz_vat\",\n              \"ve_rif\",\n              \"vn_tin\",\n              \"za_vat\",\n              \"zm_tin\",\n              \"zw_tin\"\n            ],\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The value of the tax ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PaymentPagesCheckoutSessionTaxID\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_tax_id_collection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Indicates whether tax ID collection is enabled for the session\",\n            \"type\": \"boolean\"\n          },\n          \"required\": {\n            \"description\": \"Indicates whether a tax ID is required on the payment page\",\n            \"enum\": [\"if_supported\", \"never\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"enabled\", \"required\"],\n        \"title\": \"PaymentPagesCheckoutSessionTaxIDCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_pages_checkout_session_total_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_discount\": {\n            \"description\": \"This is the sum of all the discounts.\",\n            \"type\": \"integer\"\n          },\n          \"amount_shipping\": {\n            \"description\": \"This is the sum of all the shipping amounts.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"This is the sum of all the tax amounts.\",\n            \"type\": \"integer\"\n          },\n          \"breakdown\": {\n            \"$ref\": \"#/components/schemas/payment_pages_checkout_session_total_details_resource_breakdown\"\n          }\n        },\n        \"required\": [\"amount_discount\", \"amount_tax\"],\n        \"title\": \"PaymentPagesCheckoutSessionTotalDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"breakdown\"]\n      },\n      \"payment_pages_checkout_session_total_details_resource_breakdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"discounts\": {\n            \"description\": \"The aggregated discounts.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_discount_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"taxes\": {\n            \"description\": \"The aggregated tax amounts by rate.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_tax_amount\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"discounts\", \"taxes\"],\n        \"title\": \"PaymentPagesCheckoutSessionTotalDetailsResourceBreakdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"discounts\", \"taxes\"]\n      },\n      \"payment_pages_private_card_payment_method_options_resource_restrictions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brands_blocked\": {\n            \"description\": \"Specify the card brands to block in the Checkout Session. If a customer enters or selects a card belonging to a blocked brand, they can't complete the Session.\",\n            \"items\": {\n              \"enum\": [\n                \"american_express\",\n                \"discover_global_network\",\n                \"mastercard\",\n                \"visa\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"PaymentPagesPrivateCardPaymentMethodOptionsResourceRestrictions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"payment_source\": {\n        \"anyOf\": [\n          {\n            \"$ref\": \"#/components/schemas/account\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/bank_account\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/card\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/source\"\n          }\n        ],\n        \"title\": \"Polymorphic\",\n        \"x-resourceId\": \"payment_source\",\n        \"x-stripeBypassValidation\": true\n      },\n      \"payout\": {\n        \"description\": \"A `Payout` object is created when you receive funds from Stripe, or when you\\ninitiate a payout to either a bank account or debit card of a [connected\\nStripe account](/docs/connect/bank-debit-card-payouts). You can retrieve individual payouts,\\nand list all payouts. Payouts are made on [varying\\nschedules](/docs/connect/manage-payout-schedule), depending on your country and\\nindustry.\\n\\nRelated guide: [Receiving payouts](https://stripe.com/docs/payouts)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount (in cents (or local equivalent)) that transfers to your bank account or debit card.\",\n            \"type\": \"integer\"\n          },\n          \"application_fee\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application_fee\"\n              }\n            ],\n            \"description\": \"The application fee (if any) for the payout. [See the Connect documentation](https://stripe.com/docs/connect/instant-payouts#monetization-and-fees) for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application_fee\"\n                }\n              ]\n            }\n          },\n          \"application_fee_amount\": {\n            \"description\": \"The amount of the application fee (if any) requested for the payout. [See the Connect documentation](https://stripe.com/docs/connect/instant-payouts#monetization-and-fees) for details.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"arrival_date\": {\n            \"description\": \"Date that you can expect the payout to arrive in the bank. This factors in delays to account for weekends or bank holidays.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"automatic\": {\n            \"description\": \"Returns `true` if the payout is created by an [automated payout schedule](https://stripe.com/docs/payouts#payout-schedule) and `false` if it's [requested manually](https://stripe.com/docs/payouts#manual-payouts).\",\n            \"type\": \"boolean\"\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"ID of the balance transaction that describes the impact of this payout on your account balance.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_card\"\n              }\n            ],\n            \"description\": \"ID of the bank account or card the payout is sent to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/bank_account\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/card\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_bank_account\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_card\"\n                }\n              ]\n            },\n            \"x-stripeBypassValidation\": true\n          },\n          \"failure_balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"If the payout fails or cancels, this is the ID of the balance transaction that reverses the initial balance transaction and returns the funds from the failed payout back in your balance.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"failure_code\": {\n            \"description\": \"Error code that provides a reason for a payout failure, if available. View our [list of failure codes](https://stripe.com/docs/api#payout_failures).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"failure_message\": {\n            \"description\": \"Message that provides the reason for a payout failure, if available.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"method\": {\n            \"description\": \"The method used to send this payout, which can be `standard` or `instant`. `instant` is supported for payouts to debit cards and bank accounts in certain countries. Learn more about [bank support for Instant Payouts](https://stripe.com/docs/payouts/instant-payouts-banks).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"payout\"],\n            \"type\": \"string\"\n          },\n          \"original_payout\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payout\"\n              }\n            ],\n            \"description\": \"If the payout reverses another, this is the ID of the original payout.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payout\"\n                }\n              ]\n            }\n          },\n          \"reconciliation_status\": {\n            \"description\": \"If `completed`, you can use the [Balance Transactions API](https://stripe.com/docs/api/balance_transactions/list#balance_transaction_list-payout) to list all balance transactions that are paid out in this payout.\",\n            \"enum\": [\"completed\", \"in_progress\", \"not_applicable\"],\n            \"type\": \"string\"\n          },\n          \"reversed_by\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payout\"\n              }\n            ],\n            \"description\": \"If the payout reverses, this is the ID of the payout that reverses this payout.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payout\"\n                }\n              ]\n            }\n          },\n          \"source_type\": {\n            \"description\": \"The source balance this payout came from, which can be one of the following: `card`, `fpx`, or `bank_account`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Extra information about a payout that displays on the user's bank statement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Current status of the payout: `paid`, `pending`, `in_transit`, `canceled` or `failed`. A payout is `pending` until it's submitted to the bank, when it becomes `in_transit`. The status changes to `paid` if the transaction succeeds, or to `failed` or `canceled` (within 5 business days). Some payouts that fail might initially show as `paid`, then change to `failed`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"trace_id\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payouts_trace_id\"\n              }\n            ],\n            \"description\": \"A value that generates from the beneficiary's bank that allows users to track payouts with their bank. Banks might call this a \\\"reference number\\\" or something similar.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"Can be `bank_account` or `card`.\",\n            \"enum\": [\"bank_account\", \"card\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"arrival_date\",\n          \"automatic\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"method\",\n          \"object\",\n          \"reconciliation_status\",\n          \"source_type\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"Payout\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application_fee\",\n          \"balance_transaction\",\n          \"destination\",\n          \"failure_balance_transaction\",\n          \"original_payout\",\n          \"reversed_by\",\n          \"trace_id\"\n        ],\n        \"x-resourceId\": \"payout\"\n      },\n      \"payouts_trace_id\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Possible values are `pending`, `supported`, and `unsupported`. When `payout.status` is `pending` or `in_transit`, this will be `pending`. When the payout transitions to `paid`, `failed`, or `canceled`, this status will become `supported` or `unsupported` shortly after in most cases. In some cases, this may appear as `pending` for up to 10 days after `arrival_date` until transitioning to `supported` or `unsupported`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The trace ID value if `trace_id.status` is `supported`, otherwise `nil`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"PayoutsTraceID\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"paypal_seller_protection\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"dispute_categories\": {\n            \"description\": \"An array of conditions that are covered for the transaction, if applicable.\",\n            \"items\": {\n              \"enum\": [\"fraudulent\", \"product_not_received\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"status\": {\n            \"description\": \"Indicates whether the transaction is eligible for PayPal's seller protection.\",\n            \"enum\": [\"eligible\", \"not_eligible\", \"partially_eligible\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"paypal_seller_protection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"period\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"end\": {\n            \"description\": \"The end date of this usage period. All usage up to and including this point in time is included.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"start\": {\n            \"description\": \"The start date of this usage period. All usage after this point in time is included.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"Period\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"person\": {\n        \"description\": \"This is an object representing a person associated with a Stripe account.\\n\\nA platform cannot access a person for an account where [account.controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`, which includes Standard and Express accounts, after creating an Account Link or Account Session to start Connect onboarding.\\n\\nSee the [Standard onboarding](/connect/standard-accounts) or [Express onboarding](/connect/express-accounts) documentation for information about prefilling information and account onboarding steps. Learn more about [handling identity verification with the API](/connect/handling-api-verification#person-information).\",\n        \"properties\": {\n          \"account\": {\n            \"description\": \"The account the person is associated with.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"additional_tos_acceptances\": {\n            \"$ref\": \"#/components/schemas/person_additional_tos_acceptances\"\n          },\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"address_kana\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_japan_address\"\n              }\n            ],\n            \"nullable\": true\n          },\n          \"address_kanji\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/legal_entity_japan_address\"\n              }\n            ],\n            \"nullable\": true\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"dob\": {\n            \"$ref\": \"#/components/schemas/legal_entity_dob\"\n          },\n          \"email\": {\n            \"description\": \"The person's email address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"first_name\": {\n            \"description\": \"The person's first name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"first_name_kana\": {\n            \"description\": \"The Kana variation of the person's first name (Japan only).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"first_name_kanji\": {\n            \"description\": \"The Kanji variation of the person's first name (Japan only).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"full_name_aliases\": {\n            \"description\": \"A list of alternate names or aliases that the person is known by.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"future_requirements\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/person_future_requirements\"\n              }\n            ],\n            \"nullable\": true\n          },\n          \"gender\": {\n            \"description\": \"The person's gender.\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id_number_provided\": {\n            \"description\": \"Whether the person's `id_number` was provided. True if either the full ID number was provided or if only the required part of the ID number was provided (ex. last four of an individual's SSN for the US indicated by `ssn_last_4_provided`).\",\n            \"type\": \"boolean\"\n          },\n          \"id_number_secondary_provided\": {\n            \"description\": \"Whether the person's `id_number_secondary` was provided.\",\n            \"type\": \"boolean\"\n          },\n          \"last_name\": {\n            \"description\": \"The person's last name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last_name_kana\": {\n            \"description\": \"The Kana variation of the person's last name (Japan only).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last_name_kanji\": {\n            \"description\": \"The Kanji variation of the person's last name (Japan only).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"maiden_name\": {\n            \"description\": \"The person's maiden name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"nationality\": {\n            \"description\": \"The country where the person is a national.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"person\"],\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"The person's phone number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"political_exposure\": {\n            \"description\": \"Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction.\",\n            \"enum\": [\"existing\", \"none\"],\n            \"type\": \"string\"\n          },\n          \"registered_address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"relationship\": {\n            \"$ref\": \"#/components/schemas/person_relationship\"\n          },\n          \"requirements\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/person_requirements\"\n              }\n            ],\n            \"nullable\": true\n          },\n          \"ssn_last_4_provided\": {\n            \"description\": \"Whether the last four digits of the person's Social Security number have been provided (U.S. only).\",\n            \"type\": \"boolean\"\n          },\n          \"verification\": {\n            \"$ref\": \"#/components/schemas/legal_entity_person_verification\"\n          }\n        },\n        \"required\": [\"account\", \"created\", \"id\", \"object\"],\n        \"title\": \"Person\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"additional_tos_acceptances\",\n          \"address\",\n          \"address_kana\",\n          \"address_kanji\",\n          \"dob\",\n          \"future_requirements\",\n          \"registered_address\",\n          \"relationship\",\n          \"requirements\",\n          \"verification\"\n        ],\n        \"x-resourceId\": \"person\"\n      },\n      \"person_additional_tos_acceptance\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"date\": {\n            \"description\": \"The Unix timestamp marking when the legal guardian accepted the service agreement.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"ip\": {\n            \"description\": \"The IP address from which the legal guardian accepted the service agreement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"user_agent\": {\n            \"description\": \"The user agent of the browser from which the legal guardian accepted the service agreement.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PersonAdditionalTOSAcceptance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"person_additional_tos_acceptances\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/person_additional_tos_acceptance\"\n              }\n            ],\n            \"description\": \"Details on the legal guardian's acceptance of the main Stripe service agreement.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"PersonAdditionalTOSAcceptances\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account\"]\n      },\n      \"person_future_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alternatives\": {\n            \"description\": \"Fields that are due and can be satisfied by providing the corresponding alternative fields instead.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_alternative\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"currently_due\": {\n            \"description\": \"Fields that need to be collected to keep the person's account enabled. If not collected by the account's `future_requirements[current_deadline]`, these fields will transition to the main `requirements` hash, and may immediately become `past_due`, but the account may also be given a grace period depending on the account's enablement state prior to transition.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"errors\": {\n            \"description\": \"Fields that are `currently_due` and need to be collected again because validation or verification failed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_error\"\n            },\n            \"type\": \"array\"\n          },\n          \"eventually_due\": {\n            \"description\": \"Fields you must collect when all thresholds are reached. As they become required, they appear in `currently_due` as well, and the account's `future_requirements[current_deadline]` becomes set.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"past_due\": {\n            \"description\": \"Fields that weren't collected by the account's `requirements.current_deadline`. These fields need to be collected to enable the person's account. New fields will never appear here; `future_requirements.past_due` will always be a subset of `requirements.past_due`.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"pending_verification\": {\n            \"description\": \"Fields that might become required depending on the results of verification or review. It's an empty array unless an asynchronous verification is pending. If verification fails, these fields move to `eventually_due` or `currently_due`. Fields might appear in `eventually_due` or `currently_due` and in `pending_verification` if verification fails but another verification is still pending.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"currently_due\",\n          \"errors\",\n          \"eventually_due\",\n          \"past_due\",\n          \"pending_verification\"\n        ],\n        \"title\": \"PersonFutureRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"alternatives\", \"errors\"]\n      },\n      \"person_relationship\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"authorizer\": {\n            \"description\": \"Whether the person is the authorizer of the account's representative.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"director\": {\n            \"description\": \"Whether the person is a director of the account's legal entity. Directors are typically members of the governing board of the company, or responsible for ensuring the company meets its regulatory obligations.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"executive\": {\n            \"description\": \"Whether the person has significant responsibility to control, manage, or direct the organization.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"legal_guardian\": {\n            \"description\": \"Whether the person is the legal guardian of the account's representative.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"owner\": {\n            \"description\": \"Whether the person is an owner of the account’s legal entity.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"percent_ownership\": {\n            \"description\": \"The percent owned by the person of the account's legal entity.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"representative\": {\n            \"description\": \"Whether the person is authorized as the primary representative of the account. This is the person nominated by the business to provide information about themselves, and general information about the account. There can only be one representative at any given time. At the time the account is created, this person should be set to the person responsible for opening the account.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"title\": {\n            \"description\": \"The person's title (e.g., CEO, Support Engineer).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PersonRelationship\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"person_requirements\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"alternatives\": {\n            \"description\": \"Fields that are due and can be satisfied by providing the corresponding alternative fields instead.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_alternative\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"currently_due\": {\n            \"description\": \"Fields that need to be collected to keep the person's account enabled. If not collected by the account's `current_deadline`, these fields appear in `past_due` as well, and the account is disabled.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"errors\": {\n            \"description\": \"Fields that are `currently_due` and need to be collected again because validation or verification failed.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/account_requirements_error\"\n            },\n            \"type\": \"array\"\n          },\n          \"eventually_due\": {\n            \"description\": \"Fields you must collect when all thresholds are reached. As they become required, they appear in `currently_due` as well, and the account's `current_deadline` becomes set.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"past_due\": {\n            \"description\": \"Fields that weren't collected by the account's `current_deadline`. These fields need to be collected to enable the person's account.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"pending_verification\": {\n            \"description\": \"Fields that might become required depending on the results of verification or review. It's an empty array unless an asynchronous verification is pending. If verification fails, these fields move to `eventually_due`, `currently_due`, or `past_due`. Fields might appear in `eventually_due`, `currently_due`, or `past_due` and in `pending_verification` if verification fails but another verification is still pending.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"currently_due\",\n          \"errors\",\n          \"eventually_due\",\n          \"past_due\",\n          \"pending_verification\"\n        ],\n        \"title\": \"PersonRequirements\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"alternatives\", \"errors\"]\n      },\n      \"plan\": {\n        \"description\": \"You can now model subscriptions more flexibly using the [Prices API](https://stripe.com/docs/api#prices). It replaces the Plans API and is backwards compatible to simplify your migration.\\n\\nPlans define the base price, currency, and billing cycle for recurring purchases of products.\\n[Products](https://stripe.com/docs/api#products) help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme.\\n\\nFor example, you might have a single \\\"gold\\\" product that has plans for $10/month, $100/year, €9/month, and €90/year.\\n\\nRelated guides: [Set up a subscription](https://stripe.com/docs/billing/subscriptions/set-up-subscription) and more about [products and prices](https://stripe.com/docs/products-prices/overview).\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Whether the plan can be used for new purchases.\",\n            \"type\": \"boolean\"\n          },\n          \"aggregate_usage\": {\n            \"description\": \"Specifies a usage aggregation strategy for plans of `usage_type=metered`. Allowed values are `sum` for summing up all usage during a period, `last_during_period` for using the last usage record reported within a period, `last_ever` for using the last usage record ever (across period bounds) or `max` which uses the usage record with the maximum reported usage during a period. Defaults to `sum`.\",\n            \"enum\": [\"last_during_period\", \"last_ever\", \"max\", \"sum\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"amount\": {\n            \"description\": \"The unit amount in cents (or local equivalent) to be charged, represented as a whole integer if possible. Only set if `billing_scheme=per_unit`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"amount_decimal\": {\n            \"description\": \"The unit amount in cents (or local equivalent) to be charged, represented as a decimal string with at most 12 decimal places. Only set if `billing_scheme=per_unit`.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"billing_scheme\": {\n            \"description\": \"Describes how to compute the price per period. Either `per_unit` or `tiered`. `per_unit` indicates that the fixed amount (specified in `amount`) will be charged per unit in `quantity` (for plans with `usage_type=licensed`), or per unit of total usage (for plans with `usage_type=metered`). `tiered` indicates that the unit pricing will be computed using a tiering strategy as defined using the `tiers` and `tiers_mode` attributes.\",\n            \"enum\": [\"per_unit\", \"tiered\"],\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"interval\": {\n            \"description\": \"The frequency at which a subscription is billed. One of `day`, `week`, `month` or `year`.\",\n            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n            \"type\": \"string\"\n          },\n          \"interval_count\": {\n            \"description\": \"The number of intervals (specified in the `interval` attribute) between subscription billings. For example, `interval=month` and `interval_count=3` bills every 3 months.\",\n            \"type\": \"integer\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"meter\": {\n            \"description\": \"The meter tracking the usage of a metered price\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"nickname\": {\n            \"description\": \"A brief description of the plan, hidden from customers.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"plan\"],\n            \"type\": \"string\"\n          },\n          \"product\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/product\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_product\"\n              }\n            ],\n            \"description\": \"The product whose pricing this plan determines.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/product\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_product\"\n                }\n              ]\n            }\n          },\n          \"tiers\": {\n            \"description\": \"Each element represents a pricing tier. This parameter requires `billing_scheme` to be set to `tiered`. See also the documentation for `billing_scheme`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/plan_tier\"\n            },\n            \"type\": \"array\"\n          },\n          \"tiers_mode\": {\n            \"description\": \"Defines if the tiering price should be `graduated` or `volume` based. In `volume`-based tiering, the maximum quantity within a period determines the per unit price. In `graduated` tiering, pricing can change as the quantity grows.\",\n            \"enum\": [\"graduated\", \"volume\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transform_usage\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/transform_usage\"\n              }\n            ],\n            \"description\": \"Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with `tiers`.\",\n            \"nullable\": true\n          },\n          \"trial_period_days\": {\n            \"description\": \"Default number of trial days when subscribing a customer to this plan using [`trial_from_plan=true`](https://stripe.com/docs/api#create_subscription-trial_from_plan).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"usage_type\": {\n            \"description\": \"Configures how the quantity per period should be determined. Can be either `metered` or `licensed`. `licensed` automatically bills the `quantity` set when adding it to a subscription. `metered` aggregates the total usage based on usage records. Defaults to `licensed`.\",\n            \"enum\": [\"licensed\", \"metered\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"billing_scheme\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"interval\",\n          \"interval_count\",\n          \"livemode\",\n          \"object\",\n          \"usage_type\"\n        ],\n        \"title\": \"Plan\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"product\", \"tiers\", \"transform_usage\"],\n        \"x-resourceId\": \"plan\"\n      },\n      \"plan_tier\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"flat_amount\": {\n            \"description\": \"Price for the entire tier.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"flat_amount_decimal\": {\n            \"description\": \"Same as `flat_amount`, but contains a decimal value with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"unit_amount\": {\n            \"description\": \"Per unit price for units relevant to the tier.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unit_amount_decimal\": {\n            \"description\": \"Same as `unit_amount`, but contains a decimal value with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"up_to\": {\n            \"description\": \"Up to and including to this quantity will be contained in the tier.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PlanTier\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"platform_earning_fee_source\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"charge\": {\n            \"description\": \"Charge ID that created this application fee.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"payout\": {\n            \"description\": \"Payout ID that created this application fee.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Type of object that created the application fee, either `charge` or `payout`.\",\n            \"enum\": [\"charge\", \"payout\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PlatformEarningFeeSource\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_business_profile\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"headline\": {\n            \"description\": \"The messaging shown to customers in the portal.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"privacy_policy_url\": {\n            \"description\": \"A link to the business’s publicly available privacy policy.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terms_of_service_url\": {\n            \"description\": \"A link to the business’s publicly available terms of service.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PortalBusinessProfile\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_customer_update\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"allowed_updates\": {\n            \"description\": \"The types of customer updates that are supported. When empty, customers are not updateable.\",\n            \"items\": {\n              \"enum\": [\n                \"address\",\n                \"email\",\n                \"name\",\n                \"phone\",\n                \"shipping\",\n                \"tax_id\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether the feature is enabled.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"allowed_updates\", \"enabled\"],\n        \"title\": \"PortalCustomerUpdate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_features\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"customer_update\": {\n            \"$ref\": \"#/components/schemas/portal_customer_update\"\n          },\n          \"invoice_history\": {\n            \"$ref\": \"#/components/schemas/portal_invoice_list\"\n          },\n          \"payment_method_update\": {\n            \"$ref\": \"#/components/schemas/portal_payment_method_update\"\n          },\n          \"subscription_cancel\": {\n            \"$ref\": \"#/components/schemas/portal_subscription_cancel\"\n          },\n          \"subscription_update\": {\n            \"$ref\": \"#/components/schemas/portal_subscription_update\"\n          }\n        },\n        \"required\": [\n          \"customer_update\",\n          \"invoice_history\",\n          \"payment_method_update\",\n          \"subscription_cancel\",\n          \"subscription_update\"\n        ],\n        \"title\": \"PortalFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"customer_update\",\n          \"invoice_history\",\n          \"payment_method_update\",\n          \"subscription_cancel\",\n          \"subscription_update\"\n        ]\n      },\n      \"portal_flows_after_completion_hosted_confirmation\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom_message\": {\n            \"description\": \"A custom message to display to the customer after the flow is completed.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PortalFlowsAfterCompletionHostedConfirmation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_flows_after_completion_redirect\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"return_url\": {\n            \"description\": \"The URL the customer will be redirected to after the flow is completed.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"return_url\"],\n        \"title\": \"PortalFlowsAfterCompletionRedirect\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_flows_coupon_offer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"coupon\": {\n            \"description\": \"The ID of the coupon to be offered.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"coupon\"],\n        \"title\": \"PortalFlowsCouponOffer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_flows_flow\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"after_completion\": {\n            \"$ref\": \"#/components/schemas/portal_flows_flow_after_completion\"\n          },\n          \"subscription_cancel\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_flow_subscription_cancel\"\n              }\n            ],\n            \"description\": \"Configuration when `flow.type=subscription_cancel`.\",\n            \"nullable\": true\n          },\n          \"subscription_update\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_flow_subscription_update\"\n              }\n            ],\n            \"description\": \"Configuration when `flow.type=subscription_update`.\",\n            \"nullable\": true\n          },\n          \"subscription_update_confirm\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_flow_subscription_update_confirm\"\n              }\n            ],\n            \"description\": \"Configuration when `flow.type=subscription_update_confirm`.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"Type of flow that the customer will go through.\",\n            \"enum\": [\n              \"payment_method_update\",\n              \"subscription_cancel\",\n              \"subscription_update\",\n              \"subscription_update_confirm\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"after_completion\", \"type\"],\n        \"title\": \"PortalFlowsFlow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"after_completion\",\n          \"subscription_cancel\",\n          \"subscription_update\",\n          \"subscription_update_confirm\"\n        ]\n      },\n      \"portal_flows_flow_after_completion\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"hosted_confirmation\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_after_completion_hosted_confirmation\"\n              }\n            ],\n            \"description\": \"Configuration when `after_completion.type=hosted_confirmation`.\",\n            \"nullable\": true\n          },\n          \"redirect\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_after_completion_redirect\"\n              }\n            ],\n            \"description\": \"Configuration when `after_completion.type=redirect`.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"The specified type of behavior after the flow is completed.\",\n            \"enum\": [\"hosted_confirmation\", \"portal_homepage\", \"redirect\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PortalFlowsFlowAfterCompletion\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"hosted_confirmation\", \"redirect\"]\n      },\n      \"portal_flows_flow_subscription_cancel\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"retention\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_retention\"\n              }\n            ],\n            \"description\": \"Specify a retention strategy to be used in the cancellation flow.\",\n            \"nullable\": true\n          },\n          \"subscription\": {\n            \"description\": \"The ID of the subscription to be canceled.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"subscription\"],\n        \"title\": \"PortalFlowsFlowSubscriptionCancel\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"retention\"]\n      },\n      \"portal_flows_flow_subscription_update\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"subscription\": {\n            \"description\": \"The ID of the subscription to be updated.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"subscription\"],\n        \"title\": \"PortalFlowsFlowSubscriptionUpdate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_flows_flow_subscription_update_confirm\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"discounts\": {\n            \"description\": \"The coupon or promotion code to apply to this subscription update. Currently, only up to one may be specified.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/portal_flows_subscription_update_confirm_discount\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"items\": {\n            \"description\": \"The [subscription item](https://stripe.com/docs/api/subscription_items) to be updated through this flow. Currently, only up to one may be specified and subscriptions with multiple items are not updatable.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/portal_flows_subscription_update_confirm_item\"\n            },\n            \"type\": \"array\"\n          },\n          \"subscription\": {\n            \"description\": \"The ID of the subscription to be updated.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"items\", \"subscription\"],\n        \"title\": \"PortalFlowsFlowSubscriptionUpdateConfirm\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"discounts\", \"items\"]\n      },\n      \"portal_flows_retention\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"coupon_offer\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/portal_flows_coupon_offer\"\n              }\n            ],\n            \"description\": \"Configuration when `retention.type=coupon_offer`.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"Type of retention strategy that will be used.\",\n            \"enum\": [\"coupon_offer\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PortalFlowsRetention\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"coupon_offer\"]\n      },\n      \"portal_flows_subscription_update_confirm_discount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"coupon\": {\n            \"description\": \"The ID of the coupon to apply to this subscription update.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"promotion_code\": {\n            \"description\": \"The ID of a promotion code to apply to this subscription update.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"PortalFlowsSubscriptionUpdateConfirmDiscount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_flows_subscription_update_confirm_item\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"The ID of the [subscription item](https://stripe.com/docs/api/subscriptions/object#subscription_object-items-data-id) to be updated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"price\": {\n            \"description\": \"The price the customer should subscribe to through this flow. The price must also be included in the configuration's [`features.subscription_update.products`](https://stripe.com/docs/api/customer_portal/configuration#portal_configuration_object-features-subscription_update-products).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"quantity\": {\n            \"description\": \"[Quantity](https://stripe.com/docs/subscriptions/quantities) for this item that the customer should subscribe to through this flow.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PortalFlowsSubscriptionUpdateConfirmItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_invoice_list\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the feature is enabled.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PortalInvoiceList\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_login_page\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"If `true`, a shareable `url` will be generated that will take your customers to a hosted login page for the customer portal.\\n\\nIf `false`, the previously generated `url`, if any, will be deactivated.\",\n            \"type\": \"boolean\"\n          },\n          \"url\": {\n            \"description\": \"A shareable URL to the hosted portal login page. Your customers will be able to log in with their [email](https://stripe.com/docs/api/customers/object#customer_object-email) and receive a link to their customer portal.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PortalLoginPage\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_payment_method_update\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the feature is enabled.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"PortalPaymentMethodUpdate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_resource_schedule_update_at_period_end\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"conditions\": {\n            \"description\": \"List of conditions. When any condition is true, an update will be scheduled at the end of the current period.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/portal_resource_schedule_update_at_period_end_condition\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"conditions\"],\n        \"title\": \"PortalResourceScheduleUpdateAtPeriodEnd\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"conditions\"]\n      },\n      \"portal_resource_schedule_update_at_period_end_condition\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"The type of condition.\",\n            \"enum\": [\"decreasing_item_amount\", \"shortening_interval\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"PortalResourceScheduleUpdateAtPeriodEndCondition\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_subscription_cancel\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"cancellation_reason\": {\n            \"$ref\": \"#/components/schemas/portal_subscription_cancellation_reason\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether the feature is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"mode\": {\n            \"description\": \"Whether to cancel subscriptions immediately or at the end of the billing period.\",\n            \"enum\": [\"at_period_end\", \"immediately\"],\n            \"type\": \"string\"\n          },\n          \"proration_behavior\": {\n            \"description\": \"Whether to create prorations when canceling subscriptions. Possible values are `none` and `create_prorations`.\",\n            \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"cancellation_reason\",\n          \"enabled\",\n          \"mode\",\n          \"proration_behavior\"\n        ],\n        \"title\": \"PortalSubscriptionCancel\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"cancellation_reason\"]\n      },\n      \"portal_subscription_cancellation_reason\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Whether the feature is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"options\": {\n            \"description\": \"Which cancellation reasons will be given as options to the customer.\",\n            \"items\": {\n              \"enum\": [\n                \"customer_service\",\n                \"low_quality\",\n                \"missing_features\",\n                \"other\",\n                \"switched_service\",\n                \"too_complex\",\n                \"too_expensive\",\n                \"unused\"\n              ],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"enabled\", \"options\"],\n        \"title\": \"PortalSubscriptionCancellationReason\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"portal_subscription_update\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"default_allowed_updates\": {\n            \"description\": \"The types of subscription updates that are supported for items listed in the `products` attribute. When empty, subscriptions are not updateable.\",\n            \"items\": {\n              \"enum\": [\"price\", \"promotion_code\", \"quantity\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether the feature is enabled.\",\n            \"type\": \"boolean\"\n          },\n          \"products\": {\n            \"description\": \"The list of up to 10 products that support subscription updates.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/portal_subscription_update_product\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"proration_behavior\": {\n            \"description\": \"Determines how to handle prorations resulting from subscription updates. Valid values are `none`, `create_prorations`, and `always_invoice`. Defaults to a value of `none` if you don't set it during creation.\",\n            \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n            \"type\": \"string\"\n          },\n          \"schedule_at_period_end\": {\n            \"$ref\": \"#/components/schemas/portal_resource_schedule_update_at_period_end\"\n          }\n        },\n        \"required\": [\n          \"default_allowed_updates\",\n          \"enabled\",\n          \"proration_behavior\",\n          \"schedule_at_period_end\"\n        ],\n        \"title\": \"PortalSubscriptionUpdate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"products\", \"schedule_at_period_end\"]\n      },\n      \"portal_subscription_update_product\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"prices\": {\n            \"description\": \"The list of price IDs which, when subscribed to, a subscription can be updated.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"product\": {\n            \"description\": \"The product ID.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"prices\", \"product\"],\n        \"title\": \"PortalSubscriptionUpdateProduct\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"price\": {\n        \"description\": \"Prices define the unit cost, currency, and (optional) billing cycle for both recurring and one-time purchases of products.\\n[Products](https://stripe.com/docs/api#products) help you track inventory or provisioning, and prices help you track payment terms. Different physical goods or levels of service should be represented by products, and pricing options should be represented by prices. This approach lets you change prices without having to change your provisioning scheme.\\n\\nFor example, you might have a single \\\"gold\\\" product that has prices for $10/month, $100/year, and €9 once.\\n\\nRelated guides: [Set up a subscription](https://stripe.com/docs/billing/subscriptions/set-up-subscription), [create an invoice](https://stripe.com/docs/billing/invoices/create), and more about [products and prices](https://stripe.com/docs/products-prices/overview).\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Whether the price can be used for new purchases.\",\n            \"type\": \"boolean\"\n          },\n          \"billing_scheme\": {\n            \"description\": \"Describes how to compute the price per period. Either `per_unit` or `tiered`. `per_unit` indicates that the fixed amount (specified in `unit_amount` or `unit_amount_decimal`) will be charged per unit in `quantity` (for prices with `usage_type=licensed`), or per unit of total usage (for prices with `usage_type=metered`). `tiered` indicates that the unit pricing will be computed using a tiering strategy as defined using the `tiers` and `tiers_mode` attributes.\",\n            \"enum\": [\"per_unit\", \"tiered\"],\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"currency_options\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/currency_option\"\n            },\n            \"description\": \"Prices defined in each available currency option. Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\",\n            \"type\": \"object\"\n          },\n          \"custom_unit_amount\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/custom_unit_amount\"\n              }\n            ],\n            \"description\": \"When set, provides configuration for the amount to be adjusted by the customer during Checkout Sessions and Payment Links.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"lookup_key\": {\n            \"description\": \"A lookup key used to retrieve prices dynamically from a static string. This may be up to 200 characters.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"nickname\": {\n            \"description\": \"A brief description of the price, hidden from customers.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"price\"],\n            \"type\": \"string\"\n          },\n          \"product\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/product\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_product\"\n              }\n            ],\n            \"description\": \"The ID of the product this price is associated with.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/product\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_product\"\n                }\n              ]\n            }\n          },\n          \"recurring\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/recurring\"\n              }\n            ],\n            \"description\": \"The recurring components of a price such as `interval` and `usage_type`.\",\n            \"nullable\": true\n          },\n          \"tax_behavior\": {\n            \"description\": \"Only required if a [default tax behavior](https://stripe.com/docs/tax/products-prices-tax-categories-tax-behavior#setting-a-default-tax-behavior-(recommended)) was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`. Once specified as either `inclusive` or `exclusive`, it cannot be changed.\",\n            \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tiers\": {\n            \"description\": \"Each element represents a pricing tier. This parameter requires `billing_scheme` to be set to `tiered`. See also the documentation for `billing_scheme`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/price_tier\"\n            },\n            \"type\": \"array\"\n          },\n          \"tiers_mode\": {\n            \"description\": \"Defines if the tiering price should be `graduated` or `volume` based. In `volume`-based tiering, the maximum quantity within a period determines the per unit price. In `graduated` tiering, pricing can change as the quantity grows.\",\n            \"enum\": [\"graduated\", \"volume\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transform_quantity\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/transform_quantity\"\n              }\n            ],\n            \"description\": \"Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with `tiers`.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"One of `one_time` or `recurring` depending on whether the price is for a one-time purchase or a recurring (subscription) purchase.\",\n            \"enum\": [\"one_time\", \"recurring\"],\n            \"type\": \"string\"\n          },\n          \"unit_amount\": {\n            \"description\": \"The unit amount in cents (or local equivalent) to be charged, represented as a whole integer if possible. Only set if `billing_scheme=per_unit`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unit_amount_decimal\": {\n            \"description\": \"The unit amount in cents (or local equivalent) to be charged, represented as a decimal string with at most 12 decimal places. Only set if `billing_scheme=per_unit`.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"billing_scheme\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"product\",\n          \"type\"\n        ],\n        \"title\": \"Price\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"currency_options\",\n          \"custom_unit_amount\",\n          \"product\",\n          \"recurring\",\n          \"tiers\",\n          \"transform_quantity\"\n        ],\n        \"x-resourceId\": \"price\"\n      },\n      \"price_tier\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"flat_amount\": {\n            \"description\": \"Price for the entire tier.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"flat_amount_decimal\": {\n            \"description\": \"Same as `flat_amount`, but contains a decimal value with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"unit_amount\": {\n            \"description\": \"Per unit price for units relevant to the tier.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"unit_amount_decimal\": {\n            \"description\": \"Same as `unit_amount`, but contains a decimal value with at most 12 decimal places.\",\n            \"format\": \"decimal\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"up_to\": {\n            \"description\": \"Up to and including to this quantity will be contained in the tier.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"PriceTier\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"product\": {\n        \"description\": \"Products describe the specific goods or services you offer to your customers.\\nFor example, you might offer a Standard and Premium version of your goods or service; each version would be a separate Product.\\nThey can be used in conjunction with [Prices](https://stripe.com/docs/api#prices) to configure pricing in Payment Links, Checkout, and Subscriptions.\\n\\nRelated guides: [Set up a subscription](https://stripe.com/docs/billing/subscriptions/set-up-subscription),\\n[share a Payment Link](https://stripe.com/docs/payment-links),\\n[accept payments with Checkout](https://stripe.com/docs/payments/accept-a-payment#create-product-prices-upfront),\\nand more about [Products and Prices](https://stripe.com/docs/products-prices/overview)\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Whether the product is currently available for purchase.\",\n            \"type\": \"boolean\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"default_price\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/price\"\n              }\n            ],\n            \"description\": \"The ID of the [Price](https://stripe.com/docs/api/prices) object that is the default price for this product.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/price\"\n                }\n              ]\n            }\n          },\n          \"description\": {\n            \"description\": \"The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"images\": {\n            \"description\": \"A list of up to 8 URLs of images for this product, meant to be displayable to the customer.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"marketing_features\": {\n            \"description\": \"A list of up to 15 marketing features for this product. These are displayed in [pricing tables](https://stripe.com/docs/payments/checkout/pricing-table).\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/product_marketing_feature\"\n            },\n            \"type\": \"array\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"The product's name, meant to be displayable to the customer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"product\"],\n            \"type\": \"string\"\n          },\n          \"package_dimensions\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/package_dimensions\"\n              }\n            ],\n            \"description\": \"The dimensions of this product for shipping purposes.\",\n            \"nullable\": true\n          },\n          \"shippable\": {\n            \"description\": \"Whether this product is shipped (i.e., physical goods).\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Extra information about a product which will appear on your customer's credit card statement. In the case that multiple products are billed at once, the first statement descriptor will be used. Only used for subscription payments.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_code\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/tax_code\"\n              }\n            ],\n            \"description\": \"A [tax code](https://stripe.com/docs/tax/tax-categories) ID.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/tax_code\"\n                }\n              ]\n            }\n          },\n          \"unit_label\": {\n            \"description\": \"A label that represents units of this product. When set, this will be included in customers' receipts, invoices, Checkout, and the customer portal.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"updated\": {\n            \"description\": \"Time at which the object was last updated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"url\": {\n            \"description\": \"A URL of a publicly-accessible webpage for this product.\",\n            \"maxLength\": 2048,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"created\",\n          \"id\",\n          \"images\",\n          \"livemode\",\n          \"marketing_features\",\n          \"metadata\",\n          \"name\",\n          \"object\",\n          \"updated\"\n        ],\n        \"title\": \"Product\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"default_price\",\n          \"marketing_features\",\n          \"package_dimensions\",\n          \"tax_code\"\n        ],\n        \"x-resourceId\": \"product\"\n      },\n      \"product_feature\": {\n        \"description\": \"A product_feature represents an attachment between a feature and a product.\\nWhen a product is purchased that has a feature attached, Stripe will create an entitlement to the feature for the purchasing customer.\",\n        \"properties\": {\n          \"entitlement_feature\": {\n            \"$ref\": \"#/components/schemas/entitlements.feature\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"product_feature\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"entitlement_feature\", \"id\", \"livemode\", \"object\"],\n        \"title\": \"ProductFeature\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"entitlement_feature\"],\n        \"x-resourceId\": \"product_feature\"\n      },\n      \"product_marketing_feature\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"name\": {\n            \"description\": \"The marketing feature name. Up to 80 characters long.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"ProductMarketingFeature\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"promotion_code\": {\n        \"description\": \"A Promotion Code represents a customer-redeemable code for a [coupon](https://stripe.com/docs/api#coupons). It can be used to\\ncreate multiple codes for a single coupon.\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Whether the promotion code is currently active. A promotion code is only active if the coupon is also valid.\",\n            \"type\": \"boolean\"\n          },\n          \"code\": {\n            \"description\": \"The customer-facing code. Regardless of case, this code must be unique across all active promotion codes for each customer. Valid characters are lower case letters (a-z), upper case letters (A-Z), and digits (0-9).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"coupon\": {\n            \"$ref\": \"#/components/schemas/coupon\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The customer that this promotion code can be used by.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"expires_at\": {\n            \"description\": \"Date at which the promotion code can no longer be redeemed.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"max_redemptions\": {\n            \"description\": \"Maximum number of times this promotion code can be redeemed.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"promotion_code\"],\n            \"type\": \"string\"\n          },\n          \"restrictions\": {\n            \"$ref\": \"#/components/schemas/promotion_codes_resource_restrictions\"\n          },\n          \"times_redeemed\": {\n            \"description\": \"Number of times this promotion code has been used.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"code\",\n          \"coupon\",\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"restrictions\",\n          \"times_redeemed\"\n        ],\n        \"title\": \"PromotionCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"coupon\", \"customer\", \"restrictions\"],\n        \"x-resourceId\": \"promotion_code\"\n      },\n      \"promotion_code_currency_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"minimum_amount\": {\n            \"description\": \"Minimum amount required to redeem this Promotion Code into a Coupon (e.g., a purchase must be $100 or more to work).\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"minimum_amount\"],\n        \"title\": \"PromotionCodeCurrencyOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"promotion_codes_resource_restrictions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"currency_options\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/promotion_code_currency_option\"\n            },\n            \"description\": \"Promotion code restrictions defined in each available currency option. Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\",\n            \"type\": \"object\"\n          },\n          \"first_time_transaction\": {\n            \"description\": \"A Boolean indicating if the Promotion Code should only be redeemed for Customers without any successful payments or invoices\",\n            \"type\": \"boolean\"\n          },\n          \"minimum_amount\": {\n            \"description\": \"Minimum amount required to redeem this Promotion Code into a Coupon (e.g., a purchase must be $100 or more to work).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"minimum_amount_currency\": {\n            \"description\": \"Three-letter [ISO code](https://stripe.com/docs/currencies) for minimum_amount\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"first_time_transaction\"],\n        \"title\": \"PromotionCodesResourceRestrictions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"currency_options\"]\n      },\n      \"quote\": {\n        \"description\": \"A Quote is a way to model prices that you'd like to provide to a customer.\\nOnce accepted, it will automatically create an invoice, subscription or subscription schedule.\",\n        \"properties\": {\n          \"amount_subtotal\": {\n            \"description\": \"Total before any discounts or taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total after discounts and taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_application\"\n              }\n            ],\n            \"description\": \"ID of the Connect Application that created the quote.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_application\"\n                }\n              ]\n            }\n          },\n          \"application_fee_amount\": {\n            \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. Only applicable if there are no line items with recurring prices on the quote.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"application_fee_percent\": {\n            \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. Only applicable if there are line items with recurring prices on the quote.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"automatic_tax\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_automatic_tax\"\n          },\n          \"collection_method\": {\n            \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay invoices at the end of the subscription cycle or on finalization using the default payment method attached to the subscription or customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`. Defaults to `charge_automatically`.\",\n            \"enum\": [\"charge_automatically\", \"send_invoice\"],\n            \"type\": \"string\"\n          },\n          \"computed\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_computed\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The customer which this quote belongs to. A customer is required before finalizing the quote. Once specified, it cannot be changed.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"default_tax_rates\": {\n            \"description\": \"The tax rates applied to this quote.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_rate\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_rate\"\n                  }\n                ]\n              }\n            },\n            \"type\": \"array\"\n          },\n          \"description\": {\n            \"description\": \"A description that will be displayed on the quote PDF.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discounts\": {\n            \"description\": \"The discounts applied to this quote.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/discount\"\n                  }\n                ]\n              }\n            },\n            \"type\": \"array\"\n          },\n          \"expires_at\": {\n            \"description\": \"The date on which the quote will be canceled if in `open` or `draft` status. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"footer\": {\n            \"description\": \"A footer that will be displayed on the quote PDF.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"from_quote\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/quotes_resource_from_quote\"\n              }\n            ],\n            \"description\": \"Details of the quote that was cloned. See the [cloning documentation](https://stripe.com/docs/quotes/clone) for more details.\",\n            \"nullable\": true\n          },\n          \"header\": {\n            \"description\": \"A header that will be displayed on the quote PDF.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_invoice\"\n              }\n            ],\n            \"description\": \"The invoice that was created from this quote.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_invoice\"\n                }\n              ]\n            }\n          },\n          \"invoice_settings\": {\n            \"$ref\": \"#/components/schemas/invoice_setting_quote_setting\"\n          },\n          \"line_items\": {\n            \"description\": \"A list of items the customer is being quoted for.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"QuotesResourceListLineItems\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"number\": {\n            \"description\": \"A unique number that identifies this particular quote. This number is assigned once the quote is [finalized](https://stripe.com/docs/quotes/overview#finalize).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"quote\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account on behalf of which to charge. See the [Connect documentation](https://support.stripe.com/questions/sending-invoices-on-behalf-of-connected-accounts) for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"status\": {\n            \"description\": \"The status of the quote.\",\n            \"enum\": [\"accepted\", \"canceled\", \"draft\", \"open\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_status_transitions\"\n          },\n          \"subscription\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription\"\n              }\n            ],\n            \"description\": \"The subscription that was created or updated from this quote.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              ]\n            }\n          },\n          \"subscription_data\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_subscription_data_subscription_data\"\n          },\n          \"subscription_schedule\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription_schedule\"\n              }\n            ],\n            \"description\": \"The subscription schedule that was created or updated from this quote.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription_schedule\"\n                }\n              ]\n            }\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock this quote belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          },\n          \"total_details\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_total_details\"\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/quotes_resource_transfer_data\"\n              }\n            ],\n            \"description\": \"The account (if any) the payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the invoices.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\n          \"amount_subtotal\",\n          \"amount_total\",\n          \"automatic_tax\",\n          \"collection_method\",\n          \"computed\",\n          \"created\",\n          \"discounts\",\n          \"expires_at\",\n          \"id\",\n          \"invoice_settings\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"status\",\n          \"status_transitions\",\n          \"subscription_data\",\n          \"total_details\"\n        ],\n        \"title\": \"Quote\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application\",\n          \"automatic_tax\",\n          \"computed\",\n          \"customer\",\n          \"default_tax_rates\",\n          \"discounts\",\n          \"from_quote\",\n          \"invoice\",\n          \"invoice_settings\",\n          \"line_items\",\n          \"on_behalf_of\",\n          \"status_transitions\",\n          \"subscription\",\n          \"subscription_data\",\n          \"subscription_schedule\",\n          \"test_clock\",\n          \"total_details\",\n          \"transfer_data\"\n        ],\n        \"x-resourceId\": \"quote\"\n      },\n      \"quotes_resource_automatic_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Automatically calculate taxes\",\n            \"type\": \"boolean\"\n          },\n          \"liability\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The account that's liable for tax. If set, the business address and tax registrations required to perform the tax calculation are loaded from this account. The tax transaction is returned in the report of the connected account.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"The status of the most recent automated tax calculation for this quote.\",\n            \"enum\": [\"complete\", \"failed\", \"requires_location_inputs\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"QuotesResourceAutomaticTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"liability\"]\n      },\n      \"quotes_resource_computed\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"recurring\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/quotes_resource_recurring\"\n              }\n            ],\n            \"description\": \"The definitive totals and line items the customer will be charged on a recurring basis. Takes into account the line items with recurring prices and discounts with `duration=forever` coupons only. Defaults to `null` if no inputted line items with recurring prices.\",\n            \"nullable\": true\n          },\n          \"upfront\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_upfront\"\n          }\n        },\n        \"required\": [\"upfront\"],\n        \"title\": \"QuotesResourceComputed\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"recurring\", \"upfront\"]\n      },\n      \"quotes_resource_from_quote\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"is_revision\": {\n            \"description\": \"Whether this quote is a revision of a different quote.\",\n            \"type\": \"boolean\"\n          },\n          \"quote\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/quote\"\n              }\n            ],\n            \"description\": \"The quote that was cloned.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"is_revision\", \"quote\"],\n        \"title\": \"QuotesResourceFromQuote\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"quote\"]\n      },\n      \"quotes_resource_recurring\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_subtotal\": {\n            \"description\": \"Total before any discounts or taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total after discounts and taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"interval\": {\n            \"description\": \"The frequency at which a subscription is billed. One of `day`, `week`, `month` or `year`.\",\n            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n            \"type\": \"string\"\n          },\n          \"interval_count\": {\n            \"description\": \"The number of intervals (specified in the `interval` attribute) between subscription billings. For example, `interval=month` and `interval_count=3` bills every 3 months.\",\n            \"type\": \"integer\"\n          },\n          \"total_details\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_total_details\"\n          }\n        },\n        \"required\": [\n          \"amount_subtotal\",\n          \"amount_total\",\n          \"interval\",\n          \"interval_count\",\n          \"total_details\"\n        ],\n        \"title\": \"QuotesResourceRecurring\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"total_details\"]\n      },\n      \"quotes_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"accepted_at\": {\n            \"description\": \"The time that the quote was accepted. Measured in seconds since Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"canceled_at\": {\n            \"description\": \"The time that the quote was canceled. Measured in seconds since Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"finalized_at\": {\n            \"description\": \"The time that the quote was finalized. Measured in seconds since Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"QuotesResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"quotes_resource_subscription_data_subscription_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"description\": {\n            \"description\": \"The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"effective_date\": {\n            \"description\": \"When creating a new subscription, the date of which the subscription schedule will start after the quote is accepted. This date is ignored if it is in the past when the quote is accepted. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that will set metadata on the subscription or subscription schedule when the quote is accepted. If a recurring price is included in `line_items`, this field will be passed to the resulting subscription's `metadata` field. If `subscription_data.effective_date` is used, this field will be passed to the resulting subscription schedule's `phases.metadata` field. Unlike object-level metadata, this field is declarative. Updates will clear prior values.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"trial_period_days\": {\n            \"description\": \"Integer representing the number of trial period days before the customer is charged for the first time.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"QuotesResourceSubscriptionDataSubscriptionData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"quotes_resource_total_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_discount\": {\n            \"description\": \"This is the sum of all the discounts.\",\n            \"type\": \"integer\"\n          },\n          \"amount_shipping\": {\n            \"description\": \"This is the sum of all the shipping amounts.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"This is the sum of all the tax amounts.\",\n            \"type\": \"integer\"\n          },\n          \"breakdown\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_total_details_resource_breakdown\"\n          }\n        },\n        \"required\": [\"amount_discount\", \"amount_tax\"],\n        \"title\": \"QuotesResourceTotalDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"breakdown\"]\n      },\n      \"quotes_resource_total_details_resource_breakdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"discounts\": {\n            \"description\": \"The aggregated discounts.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_discount_amount\"\n            },\n            \"type\": \"array\"\n          },\n          \"taxes\": {\n            \"description\": \"The aggregated tax amounts by rate.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/line_items_tax_amount\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"discounts\", \"taxes\"],\n        \"title\": \"QuotesResourceTotalDetailsResourceBreakdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"discounts\", \"taxes\"]\n      },\n      \"quotes_resource_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount in cents (or local equivalent) that will be transferred to the destination account when the invoice is paid. By default, the entire amount is transferred to the destination.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"amount_percent\": {\n            \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the destination account. By default, the entire amount will be transferred to the destination.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account where funds from the payment will be transferred to upon payment success.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"destination\"],\n        \"title\": \"QuotesResourceTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"destination\"]\n      },\n      \"quotes_resource_upfront\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_subtotal\": {\n            \"description\": \"Total before any discounts or taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"amount_total\": {\n            \"description\": \"Total after discounts and taxes are applied.\",\n            \"type\": \"integer\"\n          },\n          \"line_items\": {\n            \"description\": \"The line items that will appear on the next invoice after this quote is accepted. This does not include pending invoice items that exist on the customer but may still be included in the next invoice.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"QuotesResourceListLineItems\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"total_details\": {\n            \"$ref\": \"#/components/schemas/quotes_resource_total_details\"\n          }\n        },\n        \"required\": [\"amount_subtotal\", \"amount_total\", \"total_details\"],\n        \"title\": \"QuotesResourceUpfront\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"line_items\", \"total_details\"]\n      },\n      \"radar.early_fraud_warning\": {\n        \"description\": \"An early fraud warning indicates that the card issuer has notified us that a\\ncharge may be fraudulent.\\n\\nRelated guide: [Early fraud warnings](https://stripe.com/docs/disputes/measuring#early-fraud-warnings)\",\n        \"properties\": {\n          \"actionable\": {\n            \"description\": \"An EFW is actionable if it has not received a dispute and has not been fully refunded. You may wish to proactively refund a charge that receives an EFW, in order to avoid receiving a dispute later.\",\n            \"type\": \"boolean\"\n          },\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the charge this early fraud warning is for, optionally expanded.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"fraud_type\": {\n            \"description\": \"The type of fraud labelled by the issuer. One of `card_never_received`, `fraudulent_card_application`, `made_with_counterfeit_card`, `made_with_lost_card`, `made_with_stolen_card`, `misc`, `unauthorized_use_of_card`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"radar.early_fraud_warning\"],\n            \"type\": \"string\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"ID of the Payment Intent this early fraud warning is for, optionally expanded.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"actionable\",\n          \"charge\",\n          \"created\",\n          \"fraud_type\",\n          \"id\",\n          \"livemode\",\n          \"object\"\n        ],\n        \"title\": \"RadarEarlyFraudWarning\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"charge\", \"payment_intent\"],\n        \"x-resourceId\": \"radar.early_fraud_warning\"\n      },\n      \"radar.value_list\": {\n        \"description\": \"Value lists allow you to group values together which can then be referenced in rules.\\n\\nRelated guide: [Default Stripe lists](https://stripe.com/docs/radar/lists#managing-list-items)\",\n        \"properties\": {\n          \"alias\": {\n            \"description\": \"The name of the value list for use in rules.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"created_by\": {\n            \"description\": \"The name or email address of the user who created this value list.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"item_type\": {\n            \"description\": \"The type of items in the value list. One of `card_fingerprint`, `us_bank_account_fingerprint`, `sepa_debit_fingerprint`, `card_bin`, `email`, `ip_address`, `country`, `string`, `case_sensitive_string`, or `customer_id`.\",\n            \"enum\": [\n              \"card_bin\",\n              \"card_fingerprint\",\n              \"case_sensitive_string\",\n              \"country\",\n              \"customer_id\",\n              \"email\",\n              \"ip_address\",\n              \"sepa_debit_fingerprint\",\n              \"string\",\n              \"us_bank_account_fingerprint\"\n            ],\n            \"type\": \"string\"\n          },\n          \"list_items\": {\n            \"description\": \"List of items contained within this value list.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/radar.value_list_item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"RadarListListItemList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"name\": {\n            \"description\": \"The name of the value list.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"radar.value_list\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"alias\",\n          \"created\",\n          \"created_by\",\n          \"id\",\n          \"item_type\",\n          \"list_items\",\n          \"livemode\",\n          \"metadata\",\n          \"name\",\n          \"object\"\n        ],\n        \"title\": \"RadarListList\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"list_items\"],\n        \"x-resourceId\": \"radar.value_list\"\n      },\n      \"radar.value_list_item\": {\n        \"description\": \"Value list items allow you to add specific values to a given Radar value list, which can then be used in rules.\\n\\nRelated guide: [Managing list items](https://stripe.com/docs/radar/lists#managing-list-items)\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"created_by\": {\n            \"description\": \"The name or email address of the user who added this item to the value list.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"radar.value_list_item\"],\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The value of the item.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"value_list\": {\n            \"description\": \"The identifier of the value list this item belongs to.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"created_by\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"value\",\n          \"value_list\"\n        ],\n        \"title\": \"RadarListListItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"radar.value_list_item\"\n      },\n      \"radar_radar_options\": {\n        \"description\": \"Options to configure Radar. See [Radar Session](https://stripe.com/docs/radar/radar-session) for more information.\",\n        \"properties\": {\n          \"session\": {\n            \"description\": \"A [Radar Session](https://stripe.com/docs/radar/radar-session) is a snapshot of the browser metadata and device details that help Radar make more accurate predictions on your payments.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"RadarRadarOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"radar_review_resource_location\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"city\": {\n            \"description\": \"The city where the payment originated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country where the payment originated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"latitude\": {\n            \"description\": \"The geographic latitude where the payment originated.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"longitude\": {\n            \"description\": \"The geographic longitude where the payment originated.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"region\": {\n            \"description\": \"The state/county/province/region where the payment originated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"RadarReviewResourceLocation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"radar_review_resource_session\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"browser\": {\n            \"description\": \"The browser used in this browser session (e.g., `Chrome`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"device\": {\n            \"description\": \"Information about the device used for the browser session (e.g., `Samsung SM-G930T`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"platform\": {\n            \"description\": \"The platform for the browser session (e.g., `Macintosh`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"version\": {\n            \"description\": \"The version for the browser session (e.g., `61.0.3163.100`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"RadarReviewResourceSession\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"received_payment_method_details_financial_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"The FinancialAccount ID.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"network\": {\n            \"description\": \"The rails the ReceivedCredit was sent over. A FinancialAccount can only send funds over `stripe`.\",\n            \"enum\": [\"stripe\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"network\"],\n        \"title\": \"received_payment_method_details_financial_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"recurring\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"aggregate_usage\": {\n            \"description\": \"Specifies a usage aggregation strategy for prices of `usage_type=metered`. Defaults to `sum`.\",\n            \"enum\": [\"last_during_period\", \"last_ever\", \"max\", \"sum\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"interval\": {\n            \"description\": \"The frequency at which a subscription is billed. One of `day`, `week`, `month` or `year`.\",\n            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n            \"type\": \"string\"\n          },\n          \"interval_count\": {\n            \"description\": \"The number of intervals (specified in the `interval` attribute) between subscription billings. For example, `interval=month` and `interval_count=3` bills every 3 months.\",\n            \"type\": \"integer\"\n          },\n          \"meter\": {\n            \"description\": \"The meter tracking the usage of a metered price\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"usage_type\": {\n            \"description\": \"Configures how the quantity per period should be determined. Can be either `metered` or `licensed`. `licensed` automatically bills the `quantity` set when adding it to a subscription. `metered` aggregates the total usage based on usage records. Defaults to `licensed`.\",\n            \"enum\": [\"licensed\", \"metered\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"interval\", \"interval_count\", \"usage_type\"],\n        \"title\": \"Recurring\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund\": {\n        \"description\": \"Refund objects allow you to refund a previously created charge that isn't\\nrefunded yet. Funds are refunded to the credit or debit card that's\\ninitially charged.\\n\\nRelated guide: [Refunds](https://stripe.com/docs/refunds)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"Balance transaction that describes the impact on your account balance.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the charge that's refunded.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. You can use this for displaying to users (available on non-card refunds only).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"destination_details\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details\"\n          },\n          \"failure_balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"After the refund fails, this balance transaction describes the adjustment made on your account balance that reverses the initial balance transaction.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"failure_reason\": {\n            \"description\": \"Provides the reason for the refund failure. Possible values are: `lost_or_stolen_card`, `expired_or_canceled_card`, `charge_for_pending_refund_disputed`, `insufficient_funds`, `declined`, `merchant_request`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"instructions_email\": {\n            \"description\": \"For payment methods without native refund support (for example, Konbini, PromptPay), provide an email address for the customer to receive refund instructions.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"next_action\": {\n            \"$ref\": \"#/components/schemas/refund_next_action\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"refund\"],\n            \"type\": \"string\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"ID of the PaymentIntent that's refunded.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"reason\": {\n            \"description\": \"Reason for the refund, which is either user-provided (`duplicate`, `fraudulent`, or `requested_by_customer`) or generated by Stripe internally (`expired_uncaptured_charge`).\",\n            \"enum\": [\n              \"duplicate\",\n              \"expired_uncaptured_charge\",\n              \"fraudulent\",\n              \"requested_by_customer\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"receipt_number\": {\n            \"description\": \"This is the transaction number that appears on email receipts sent for this refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"source_transfer_reversal\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/transfer_reversal\"\n              }\n            ],\n            \"description\": \"The transfer reversal that's associated with the refund. Only present if the charge came from another Stripe account.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/transfer_reversal\"\n                }\n              ]\n            }\n          },\n          \"status\": {\n            \"description\": \"Status of the refund. This can be `pending`, `requires_action`, `succeeded`, `failed`, or `canceled`. Learn more about [failed refunds](https://stripe.com/docs/refunds#failed-refunds).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transfer_reversal\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/transfer_reversal\"\n              }\n            ],\n            \"description\": \"This refers to the transfer reversal object if the accompanying transfer reverses. This is only applicable if the charge was created using the destination parameter.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/transfer_reversal\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"amount\", \"created\", \"currency\", \"id\", \"object\"],\n        \"title\": \"Refund\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"balance_transaction\",\n          \"charge\",\n          \"destination_details\",\n          \"failure_balance_transaction\",\n          \"next_action\",\n          \"payment_intent\",\n          \"source_transfer_reversal\",\n          \"transfer_reversal\"\n        ],\n        \"x-resourceId\": \"refund\"\n      },\n      \"refund_destination_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"affirm\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"afterpay_clearpay\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"alipay\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"alma\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"au_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"blik\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_blik\"\n          },\n          \"br_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_br_bank_transfer\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_card\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"customer_cash_balance\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"eps\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"eu_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_eu_bank_transfer\"\n          },\n          \"gb_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_gb_bank_transfer\"\n          },\n          \"giropay\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"grabpay\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"jp_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_jp_bank_transfer\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"multibanco\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_multibanco\"\n          },\n          \"mx_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_mx_bank_transfer\"\n          },\n          \"p24\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_p24\"\n          },\n          \"paynow\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"pix\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"revolut\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"swish\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_swish\"\n          },\n          \"th_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_th_bank_transfer\"\n          },\n          \"type\": {\n            \"description\": \"The type of transaction-specific details of the payment method used in the refund (e.g., `card`). An additional hash is included on `destination_details` with a name matching this value. It contains information specific to the refund transaction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"us_bank_transfer\": {\n            \"$ref\": \"#/components/schemas/refund_destination_details_us_bank_transfer\"\n          },\n          \"wechat_pay\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          },\n          \"zip\": {\n            \"$ref\": \"#/components/schemas/destination_details_unimplemented\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"refund_destination_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"affirm\",\n          \"afterpay_clearpay\",\n          \"alipay\",\n          \"alma\",\n          \"amazon_pay\",\n          \"au_bank_transfer\",\n          \"blik\",\n          \"br_bank_transfer\",\n          \"card\",\n          \"cashapp\",\n          \"customer_cash_balance\",\n          \"eps\",\n          \"eu_bank_transfer\",\n          \"gb_bank_transfer\",\n          \"giropay\",\n          \"grabpay\",\n          \"jp_bank_transfer\",\n          \"klarna\",\n          \"multibanco\",\n          \"mx_bank_transfer\",\n          \"p24\",\n          \"paynow\",\n          \"paypal\",\n          \"pix\",\n          \"revolut\",\n          \"sofort\",\n          \"swish\",\n          \"th_bank_transfer\",\n          \"us_bank_transfer\",\n          \"wechat_pay\",\n          \"zip\"\n        ]\n      },\n      \"refund_destination_details_blik\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"network_decline_code\": {\n            \"description\": \"For refunds declined by the network, a decline code provided by the network which indicates the reason the refund failed.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_blik\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_br_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_br_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"Value of the reference number assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference number on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"reference_type\": {\n            \"description\": \"Type of the reference number assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of refund. This can be `refund`, `reversal`, or `pending`.\",\n            \"enum\": [\"pending\", \"refund\", \"reversal\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"refund_destination_details_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_eu_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_eu_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_gb_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_gb_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_jp_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_jp_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_multibanco\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_multibanco\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_mx_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_mx_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_p24\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_p24\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_swish\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"network_decline_code\": {\n            \"description\": \"For refunds declined by the network, a decline code provided by the network which indicates the reason the refund failed.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_swish\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_th_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_th_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_destination_details_us_bank_transfer\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"The reference assigned to the refund.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference_status\": {\n            \"description\": \"Status of the reference on the refund. This can be `pending`, `available` or `unavailable`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"refund_destination_details_us_bank_transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"refund_next_action\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"display_details\": {\n            \"$ref\": \"#/components/schemas/refund_next_action_display_details\"\n          },\n          \"type\": {\n            \"description\": \"Type of the next action to perform.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"RefundNextAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"display_details\"]\n      },\n      \"refund_next_action_display_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"email_sent\": {\n            \"$ref\": \"#/components/schemas/email_sent\"\n          },\n          \"expires_at\": {\n            \"description\": \"The expiry timestamp.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"email_sent\", \"expires_at\"],\n        \"title\": \"RefundNextActionDisplayDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"email_sent\"]\n      },\n      \"reporting.report_run\": {\n        \"description\": \"The Report Run object represents an instance of a report type generated with\\nspecific run parameters. Once the object is created, Stripe begins processing the report.\\nWhen the report has finished running, it will give you a reference to a file\\nwhere you can retrieve your results. For an overview, see\\n[API Access to Reports](https://stripe.com/docs/reporting/statements/api).\\n\\nNote that certain report types can only be run based on your live-mode data (not test-mode\\ndata), and will error when queried without a [live-mode API key](https://stripe.com/docs/keys#test-live-modes).\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"error\": {\n            \"description\": \"If something should go wrong during the run, a message about the failure (populated when\\n `status=failed`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"`true` if the report is run on live mode data and `false` if it is run on test mode data.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"reporting.report_run\"],\n            \"type\": \"string\"\n          },\n          \"parameters\": {\n            \"$ref\": \"#/components/schemas/financial_reporting_finance_report_run_run_parameters\"\n          },\n          \"report_type\": {\n            \"description\": \"The ID of the [report type](https://stripe.com/docs/reports/report-types) to run, such as `\\\"balance.summary.1\\\"`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"result\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The file object representing the result of the report run (populated when\\n `status=succeeded`).\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"Status of this report run. This will be `pending` when the run is initially created.\\n When the run finishes, this will be set to `succeeded` and the `result` field will be populated.\\n Rarely, we may encounter an error, at which point this will be set to `failed` and the `error` field will be populated.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"succeeded_at\": {\n            \"description\": \"Timestamp at which this run successfully finished (populated when\\n `status=succeeded`). Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"parameters\",\n          \"report_type\",\n          \"status\"\n        ],\n        \"title\": \"reporting_report_run\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"parameters\", \"result\"],\n        \"x-resourceId\": \"reporting.report_run\"\n      },\n      \"reporting.report_type\": {\n        \"description\": \"The Report Type resource corresponds to a particular type of report, such as\\nthe \\\"Activity summary\\\" or \\\"Itemized payouts\\\" reports. These objects are\\nidentified by an ID belonging to a set of enumerated values. See\\n[API Access to Reports documentation](https://stripe.com/docs/reporting/statements/api)\\nfor those Report Type IDs, along with required and optional parameters.\\n\\nNote that certain report types can only be run based on your live-mode data (not test-mode\\ndata), and will error when queried without a [live-mode API key](https://stripe.com/docs/keys#test-live-modes).\",\n        \"properties\": {\n          \"data_available_end\": {\n            \"description\": \"Most recent time for which this Report Type is available. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"data_available_start\": {\n            \"description\": \"Earliest time for which this Report Type is available. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"default_columns\": {\n            \"description\": \"List of column names that are included by default when this Report Type gets run. (If the Report Type doesn't support the `columns` parameter, this will be null.)\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"The [ID of the Report Type](https://stripe.com/docs/reporting/statements/api#available-report-types), such as `balance.summary.1`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"name\": {\n            \"description\": \"Human-readable name of the Report Type\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"reporting.report_type\"],\n            \"type\": \"string\"\n          },\n          \"updated\": {\n            \"description\": \"When this Report Type was latest updated. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"version\": {\n            \"description\": \"Version of the Report Type. Different versions report with the same ID will have the same purpose, but may take different run parameters or have different result schemas.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"data_available_end\",\n          \"data_available_start\",\n          \"id\",\n          \"livemode\",\n          \"name\",\n          \"object\",\n          \"updated\",\n          \"version\"\n        ],\n        \"title\": \"reporting_report_type\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"reporting.report_type\"\n      },\n      \"reserve_transaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"reserve_transaction\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\", \"id\", \"object\"],\n        \"title\": \"ReserveTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"review\": {\n        \"description\": \"Reviews can be used to supplement automated fraud detection with human expertise.\\n\\nLearn more about [Radar](/radar) and reviewing payments\\n[here](https://stripe.com/docs/radar/reviews).\",\n        \"properties\": {\n          \"billing_zip\": {\n            \"description\": \"The ZIP or postal code of the card used, if applicable.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"The charge associated with this review.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"closed_reason\": {\n            \"description\": \"The reason the review was closed, or null if it has not yet been closed. One of `approved`, `refunded`, `refunded_as_fraud`, `disputed`, or `redacted`.\",\n            \"enum\": [\n              \"approved\",\n              \"disputed\",\n              \"redacted\",\n              \"refunded\",\n              \"refunded_as_fraud\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"ip_address\": {\n            \"description\": \"The IP address where the payment originated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"ip_address_location\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/radar_review_resource_location\"\n              }\n            ],\n            \"description\": \"Information related to the location of the payment. Note that this information is an approximation and attempts to locate the nearest population center - it should not be used to determine a specific address.\",\n            \"nullable\": true\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"review\"],\n            \"type\": \"string\"\n          },\n          \"open\": {\n            \"description\": \"If `true`, the review needs action.\",\n            \"type\": \"boolean\"\n          },\n          \"opened_reason\": {\n            \"description\": \"The reason the review was opened. One of `rule` or `manual`.\",\n            \"enum\": [\"manual\", \"rule\"],\n            \"type\": \"string\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"The PaymentIntent ID associated with this review, if one exists.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"reason\": {\n            \"description\": \"The reason the review is currently open or closed. One of `rule`, `manual`, `approved`, `refunded`, `refunded_as_fraud`, `disputed`, or `redacted`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"session\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/radar_review_resource_session\"\n              }\n            ],\n            \"description\": \"Information related to the browsing session of the user who initiated the payment.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"open\",\n          \"opened_reason\",\n          \"reason\"\n        ],\n        \"title\": \"RadarReview\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"charge\",\n          \"ip_address_location\",\n          \"payment_intent\",\n          \"session\"\n        ],\n        \"x-resourceId\": \"review\"\n      },\n      \"revolut_pay_underlying_payment_method_funding_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"card\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_passthrough_card\"\n          },\n          \"type\": {\n            \"description\": \"funding type of the underlying payment method.\",\n            \"enum\": [\"card\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"revolut_pay_underlying_payment_method_funding_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"card\"]\n      },\n      \"rule\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"action\": {\n            \"description\": \"The action taken on the payment.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"predicate\": {\n            \"description\": \"The predicate to evaluate the payment against.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"action\", \"id\", \"predicate\"],\n        \"title\": \"RadarRule\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"scheduled_query_run\": {\n        \"description\": \"If you have [scheduled a Sigma query](https://stripe.com/docs/sigma/scheduled-queries), you'll\\nreceive a `sigma.scheduled_query_run.created` webhook each time the query\\nruns. The webhook contains a `ScheduledQueryRun` object, which you can use to\\nretrieve the query results.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"data_load_time\": {\n            \"description\": \"When the query was run, Sigma contained a snapshot of your Stripe data at this time.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"error\": {\n            \"$ref\": \"#/components/schemas/sigma_scheduled_query_run_error\"\n          },\n          \"file\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"The file object representing the results of the query.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"scheduled_query_run\"],\n            \"type\": \"string\"\n          },\n          \"result_available_until\": {\n            \"description\": \"Time at which the result expires and is no longer available for download.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"sql\": {\n            \"description\": \"SQL for the query.\",\n            \"maxLength\": 100000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The query's execution status, which will be `completed` for successful runs, and `canceled`, `failed`, or `timed_out` otherwise.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"title\": {\n            \"description\": \"Title of the query.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"data_load_time\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"result_available_until\",\n          \"sql\",\n          \"status\",\n          \"title\"\n        ],\n        \"title\": \"ScheduledQueryRun\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"error\", \"file\"],\n        \"x-resourceId\": \"scheduled_query_run\"\n      },\n      \"schedules_phase_automatic_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disabled_reason\": {\n            \"description\": \"If Stripe disabled automatic tax, this enum describes why.\",\n            \"enum\": [\"requires_location_inputs\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether Stripe automatically computes tax on invoices created during this phase.\",\n            \"type\": \"boolean\"\n          },\n          \"liability\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The account that's liable for tax. If set, the business address and tax registrations required to perform the tax calculation are loaded from this account. The tax transaction is returned in the report of the connected account.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"SchedulesPhaseAutomaticTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"liability\"]\n      },\n      \"secret_service_resource_scope\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"The secret scope type.\",\n            \"enum\": [\"account\", \"user\"],\n            \"type\": \"string\"\n          },\n          \"user\": {\n            \"description\": \"The user ID, if type is set to \\\"user\\\"\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"SecretServiceResourceScope\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"sepa_debit_generated_from\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"The ID of the Charge that generated this PaymentMethod, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"setup_attempt\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_attempt\"\n              }\n            ],\n            \"description\": \"The ID of the SetupAttempt that generated this PaymentMethod, if any.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/setup_attempt\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"sepa_debit_generated_from\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"charge\", \"setup_attempt\"]\n      },\n      \"setup_attempt\": {\n        \"description\": \"A SetupAttempt describes one attempted confirmation of a SetupIntent,\\nwhether that confirmation is successful or unsuccessful. You can use\\nSetupAttempts to inspect details of a specific attempt at setting up a\\npayment method using a SetupIntent.\",\n        \"properties\": {\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              }\n            ],\n            \"description\": \"The value of [application](https://stripe.com/docs/api/setup_intents/object#setup_intent_object-application) on the SetupIntent at the time of this confirmation.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                }\n              ]\n            }\n          },\n          \"attach_to_self\": {\n            \"description\": \"If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.\\n\\nIt can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.\",\n            \"type\": \"boolean\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"The value of [customer](https://stripe.com/docs/api/setup_intents/object#setup_intent_object-customer) on the SetupIntent at the time of this confirmation.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"flow_directions\": {\n            \"description\": \"Indicates the directions of money movement for which this payment method is intended to be used.\\n\\nInclude `inbound` if you intend to use the payment method as the origin to pull funds from. Include `outbound` if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.\",\n            \"items\": {\n              \"enum\": [\"inbound\", \"outbound\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"setup_attempt\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The value of [on_behalf_of](https://stripe.com/docs/api/setup_intents/object#setup_intent_object-on_behalf_of) on the SetupIntent at the time of this confirmation.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the payment method used with this SetupAttempt.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"payment_method_details\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details\"\n          },\n          \"setup_error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/api_errors\"\n              }\n            ],\n            \"description\": \"The error encountered during this attempt to confirm the SetupIntent, if any.\",\n            \"nullable\": true\n          },\n          \"setup_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent\"\n              }\n            ],\n            \"description\": \"ID of the SetupIntent that this attempt belongs to.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              ]\n            }\n          },\n          \"status\": {\n            \"description\": \"Status of this SetupAttempt, one of `requires_confirmation`, `requires_action`, `processing`, `succeeded`, `failed`, or `abandoned`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"usage\": {\n            \"description\": \"The value of [usage](https://stripe.com/docs/api/setup_intents/object#setup_intent_object-usage) on the SetupIntent at the time of this confirmation, one of `off_session` or `on_session`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"payment_method\",\n          \"payment_method_details\",\n          \"setup_intent\",\n          \"status\",\n          \"usage\"\n        ],\n        \"title\": \"PaymentFlowsSetupIntentSetupAttempt\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application\",\n          \"customer\",\n          \"on_behalf_of\",\n          \"payment_method\",\n          \"payment_method_details\",\n          \"setup_error\",\n          \"setup_intent\"\n        ],\n        \"x-resourceId\": \"setup_attempt\"\n      },\n      \"setup_attempt_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_acss_debit\"\n          },\n          \"amazon_pay\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_amazon_pay\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_au_becs_debit\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_bacs_debit\"\n          },\n          \"bancontact\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_bancontact\"\n          },\n          \"boleto\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_boleto\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_card\"\n          },\n          \"card_present\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_card_present\"\n          },\n          \"cashapp\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_cashapp\"\n          },\n          \"ideal\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_ideal\"\n          },\n          \"kakao_pay\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_kakao_pay\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_klarna\"\n          },\n          \"kr_card\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_kr_card\"\n          },\n          \"link\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_link\"\n          },\n          \"paypal\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_paypal\"\n          },\n          \"revolut_pay\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_revolut_pay\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_sepa_debit\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_sofort\"\n          },\n          \"type\": {\n            \"description\": \"The type of the payment method used in the SetupIntent (e.g., `card`). An additional hash is included on `payment_method_details` with a name matching this value. It contains confirmation-specific information for the payment method.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_us_bank_account\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"SetupAttemptPaymentMethodDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"amazon_pay\",\n          \"au_becs_debit\",\n          \"bacs_debit\",\n          \"bancontact\",\n          \"boleto\",\n          \"card\",\n          \"card_present\",\n          \"cashapp\",\n          \"ideal\",\n          \"kakao_pay\",\n          \"klarna\",\n          \"kr_card\",\n          \"link\",\n          \"paypal\",\n          \"revolut_pay\",\n          \"sepa_debit\",\n          \"sofort\",\n          \"us_bank_account\"\n        ]\n      },\n      \"setup_attempt_payment_method_details_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_amazon_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_amazon_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_au_becs_debit\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_au_becs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_bancontact\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_code\": {\n            \"description\": \"Bank code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"Bank Identifier Code of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"The ID of the SEPA Direct Debit PaymentMethod which was generated by this SetupAttempt.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"generated_sepa_debit_mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"The mandate for the SEPA Direct Debit PaymentMethod which was generated by this SetupAttempt.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"iban_last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_language\": {\n            \"description\": \"Preferred language of the Bancontact authorization page that the customer is redirected to.\\nCan be one of `en`, `de`, `fr`, or `nl`\",\n            \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by Bancontact directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_attempt_payment_method_details_bancontact\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"generated_sepa_debit\",\n          \"generated_sepa_debit_mandate\"\n        ]\n      },\n      \"setup_attempt_payment_method_details_boleto\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_boleto\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"brand\": {\n            \"description\": \"Card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"checks\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_card_checks\"\n              }\n            ],\n            \"description\": \"Check results by Card networks on Card address and CVC at the time of authorization\",\n            \"nullable\": true\n          },\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"description\": \"Two-digit number representing the card's expiration month.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"description\": \"Four-digit number representing the card's expiration year.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.\\n\\n*As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"description\": \"Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"network\": {\n            \"description\": \"Identifies which network this charge was processed on. Can be `amex`, `cartes_bancaires`, `diners`, `discover`, `eftpos_au`, `interac`, `jcb`, `link`, `mastercard`, `unionpay`, `visa`, or `unknown`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"three_d_secure\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/three_d_secure_details\"\n              }\n            ],\n            \"description\": \"Populated if this authorization used 3D Secure authentication.\",\n            \"nullable\": true\n          },\n          \"wallet\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_attempt_payment_method_details_card_wallet\"\n              }\n            ],\n            \"description\": \"If this Card is part of a card wallet, this contains the details of the card wallet.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"setup_attempt_payment_method_details_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"checks\", \"three_d_secure\", \"wallet\"]\n      },\n      \"setup_attempt_payment_method_details_card_checks\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address_line1_check\": {\n            \"description\": \"If a address line1 was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_postal_code_check\": {\n            \"description\": \"If a address postal code was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cvc_check\": {\n            \"description\": \"If a CVC was provided, results of the check, one of `pass`, `fail`, `unavailable`, or `unchecked`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_attempt_payment_method_details_card_checks\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_card_present\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"generated_card\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"The ID of the Card PaymentMethod which was generated by this SetupAttempt.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"offline\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_details_card_present_offline\"\n              }\n            ],\n            \"description\": \"Details about payments collected offline.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"setup_attempt_payment_method_details_card_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"generated_card\", \"offline\"]\n      },\n      \"setup_attempt_payment_method_details_card_wallet\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"apple_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_apple_pay\"\n          },\n          \"google_pay\": {\n            \"$ref\": \"#/components/schemas/payment_method_details_card_wallet_google_pay\"\n          },\n          \"type\": {\n            \"description\": \"The type of the card wallet, one of `apple_pay`, `google_pay`, or `link`. An additional hash is included on the Wallet subhash with a name matching this value. It contains additional information specific to the card wallet type.\",\n            \"enum\": [\"apple_pay\", \"google_pay\", \"link\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"setup_attempt_payment_method_details_card_wallet\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"apple_pay\", \"google_pay\"]\n      },\n      \"setup_attempt_payment_method_details_cashapp\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_cashapp\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_ideal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank\": {\n            \"description\": \"The customer's bank. Can be one of `abn_amro`, `asn_bank`, `bunq`, `handelsbanken`, `ing`, `knab`, `moneyou`, `n26`, `nn`, `rabobank`, `regiobank`, `revolut`, `sns_bank`, `triodos_bank`, `van_lanschot`, or `yoursafe`.\",\n            \"enum\": [\n              \"abn_amro\",\n              \"asn_bank\",\n              \"bunq\",\n              \"handelsbanken\",\n              \"ing\",\n              \"knab\",\n              \"moneyou\",\n              \"n26\",\n              \"nn\",\n              \"rabobank\",\n              \"regiobank\",\n              \"revolut\",\n              \"sns_bank\",\n              \"triodos_bank\",\n              \"van_lanschot\",\n              \"yoursafe\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"The Bank Identifier Code of the customer's bank.\",\n            \"enum\": [\n              \"ABNANL2A\",\n              \"ASNBNL21\",\n              \"BITSNL2A\",\n              \"BUNQNL2A\",\n              \"FVLBNL22\",\n              \"HANDNL2A\",\n              \"INGBNL2A\",\n              \"KNABNL2H\",\n              \"MOYONL21\",\n              \"NNBANL2G\",\n              \"NTSBDEB1\",\n              \"RABONL2U\",\n              \"RBRBNL21\",\n              \"REVOIE23\",\n              \"REVOLT21\",\n              \"SNSBNL2A\",\n              \"TRIONL2U\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"The ID of the SEPA Direct Debit PaymentMethod which was generated by this SetupAttempt.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"generated_sepa_debit_mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"The mandate for the SEPA Direct Debit PaymentMethod which was generated by this SetupAttempt.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"iban_last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by iDEAL directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_attempt_payment_method_details_ideal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"generated_sepa_debit\",\n          \"generated_sepa_debit_mandate\"\n        ]\n      },\n      \"setup_attempt_payment_method_details_kakao_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_kakao_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_klarna\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_klarna\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_kr_card\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_kr_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_link\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_paypal\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_paypal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_revolut_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_revolut_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_attempt_payment_method_details_sofort\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_code\": {\n            \"description\": \"Bank code of bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"description\": \"Bank Identifier Code of the bank associated with the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"generated_sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"The ID of the SEPA Direct Debit PaymentMethod which was generated by this SetupAttempt.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"generated_sepa_debit_mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"The mandate for the SEPA Direct Debit PaymentMethod which was generated by this SetupAttempt.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"iban_last4\": {\n            \"description\": \"Last four characters of the IBAN.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_language\": {\n            \"description\": \"Preferred language of the Sofort authorization page that the customer is redirected to.\\nCan be one of `en`, `de`, `fr`, or `nl`\",\n            \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Owner's verified full name. Values are verified or provided by Sofort directly\\n(if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_attempt_payment_method_details_sofort\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"generated_sepa_debit\",\n          \"generated_sepa_debit_mandate\"\n        ]\n      },\n      \"setup_attempt_payment_method_details_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_attempt_payment_method_details_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent\": {\n        \"description\": \"A SetupIntent guides you through the process of setting up and saving a customer's payment credentials for future payments.\\nFor example, you can use a SetupIntent to set up and save your customer's card without immediately collecting a payment.\\nLater, you can use [PaymentIntents](https://stripe.com/docs/api#payment_intents) to drive the payment flow.\\n\\nCreate a SetupIntent when you're ready to collect your customer's payment credentials.\\nDon't maintain long-lived, unconfirmed SetupIntents because they might not be valid.\\nThe SetupIntent transitions through multiple [statuses](https://docs.stripe.com/payments/intents#intent-statuses) as it guides\\nyou through the setup process.\\n\\nSuccessful SetupIntents result in payment credentials that are optimized for future payments.\\nFor example, cardholders in [certain regions](https://stripe.com/guides/strong-customer-authentication) might need to be run through\\n[Strong Customer Authentication](https://docs.stripe.com/strong-customer-authentication) during payment method collection\\nto streamline later [off-session payments](https://docs.stripe.com/payments/setup-intents).\\nIf you use the SetupIntent with a [Customer](https://stripe.com/docs/api#setup_intent_object-customer),\\nit automatically attaches the resulting payment method to that Customer after successful setup.\\nWe recommend using SetupIntents or [setup_future_usage](https://stripe.com/docs/api#payment_intent_object-setup_future_usage) on\\nPaymentIntents to save payment methods to prevent saving invalid or unoptimized payment methods.\\n\\nBy using SetupIntents, you can reduce friction for your customers, even as regulations change over time.\\n\\nRelated guide: [Setup Intents API](https://docs.stripe.com/payments/setup-intents)\",\n        \"properties\": {\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              }\n            ],\n            \"description\": \"ID of the Connect application that created the SetupIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                }\n              ]\n            }\n          },\n          \"attach_to_self\": {\n            \"description\": \"If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.\\n\\nIt can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.\",\n            \"type\": \"boolean\"\n          },\n          \"automatic_payment_methods\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_flows_automatic_payment_methods_setup_intent\"\n              }\n            ],\n            \"description\": \"Settings for dynamic payment methods compatible with this Setup Intent\",\n            \"nullable\": true\n          },\n          \"cancellation_reason\": {\n            \"description\": \"Reason for cancellation of this SetupIntent, one of `abandoned`, `requested_by_customer`, or `duplicate`.\",\n            \"enum\": [\"abandoned\", \"duplicate\", \"requested_by_customer\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"client_secret\": {\n            \"description\": \"The client secret of this SetupIntent. Used for client-side retrieval using a publishable key.\\n\\nThe client secret can be used to complete payment setup from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"ID of the Customer this SetupIntent belongs to, if one exists.\\n\\nIf present, the SetupIntent's payment method will be attached to the Customer on successful setup. Payment methods attached to other Customers cannot be used with this SetupIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"flow_directions\": {\n            \"description\": \"Indicates the directions of money movement for which this payment method is intended to be used.\\n\\nInclude `inbound` if you intend to use the payment method as the origin to pull funds from. Include `outbound` if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.\",\n            \"items\": {\n              \"enum\": [\"inbound\", \"outbound\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last_setup_error\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/api_errors\"\n              }\n            ],\n            \"description\": \"The error encountered in the previous SetupIntent confirmation.\",\n            \"nullable\": true\n          },\n          \"latest_attempt\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_attempt\"\n              }\n            ],\n            \"description\": \"The most recent SetupAttempt for this SetupIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/setup_attempt\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"ID of the multi use Mandate generated by the SetupIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"next_action\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_next_action\"\n              }\n            ],\n            \"description\": \"If present, this property tells you what actions you need to take in order for your customer to continue payment setup.\",\n            \"nullable\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"setup_intent\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) for which the setup is intended.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the payment method used with this SetupIntent. If the payment method is `card_present` and isn't a digital wallet, then the [generated_card](https://docs.stripe.com/api/setup_attempts/object#setup_attempt_object-payment_method_details-card_present-generated_card) associated with the `latest_attempt` is attached to the Customer instead.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"payment_method_configuration_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/payment_method_config_biz_payment_method_configuration_details\"\n              }\n            ],\n            \"description\": \"Information about the [payment method configuration](https://stripe.com/docs/api/payment_method_configurations) used for this Setup Intent.\",\n            \"nullable\": true\n          },\n          \"payment_method_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options\"\n              }\n            ],\n            \"description\": \"Payment method-specific configuration for this SetupIntent.\",\n            \"nullable\": true\n          },\n          \"payment_method_types\": {\n            \"description\": \"The list of payment method types (e.g. card) that this SetupIntent is allowed to set up.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"single_use_mandate\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/mandate\"\n              }\n            ],\n            \"description\": \"ID of the single_use Mandate generated by the SetupIntent.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              ]\n            }\n          },\n          \"status\": {\n            \"description\": \"[Status](https://stripe.com/docs/payments/intents#intent-statuses) of this SetupIntent, one of `requires_payment_method`, `requires_confirmation`, `requires_action`, `processing`, `canceled`, or `succeeded`.\",\n            \"enum\": [\n              \"canceled\",\n              \"processing\",\n              \"requires_action\",\n              \"requires_confirmation\",\n              \"requires_payment_method\",\n              \"succeeded\"\n            ],\n            \"type\": \"string\"\n          },\n          \"usage\": {\n            \"description\": \"Indicates how the payment method is intended to be used in the future.\\n\\nUse `on_session` if you intend to only reuse the payment method when the customer is in your checkout flow. Use `off_session` if your customer may or may not be in your checkout flow. If not provided, this value defaults to `off_session`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"payment_method_types\",\n          \"status\",\n          \"usage\"\n        ],\n        \"title\": \"SetupIntent\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application\",\n          \"automatic_payment_methods\",\n          \"customer\",\n          \"last_setup_error\",\n          \"latest_attempt\",\n          \"mandate\",\n          \"next_action\",\n          \"on_behalf_of\",\n          \"payment_method\",\n          \"payment_method_configuration_details\",\n          \"payment_method_options\",\n          \"single_use_mandate\"\n        ],\n        \"x-resourceId\": \"setup_intent\"\n      },\n      \"setup_intent_next_action\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"cashapp_handle_redirect_or_display_qr_code\": {\n            \"$ref\": \"#/components/schemas/payment_intent_next_action_cashapp_handle_redirect_or_display_qr_code\"\n          },\n          \"redirect_to_url\": {\n            \"$ref\": \"#/components/schemas/setup_intent_next_action_redirect_to_url\"\n          },\n          \"type\": {\n            \"description\": \"Type of the next action to perform, one of `redirect_to_url`, `use_stripe_sdk`, `alipay_handle_redirect`, `oxxo_display_details`, or `verify_with_microdeposits`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"use_stripe_sdk\": {\n            \"description\": \"When confirming a SetupIntent with Stripe.js, Stripe.js depends on the contents of this dictionary to invoke authentication flows. The shape of the contents is subject to change and is only intended to be used by Stripe.js.\",\n            \"type\": \"object\"\n          },\n          \"verify_with_microdeposits\": {\n            \"$ref\": \"#/components/schemas/setup_intent_next_action_verify_with_microdeposits\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"SetupIntentNextAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"cashapp_handle_redirect_or_display_qr_code\",\n          \"redirect_to_url\",\n          \"verify_with_microdeposits\"\n        ]\n      },\n      \"setup_intent_next_action_redirect_to_url\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"return_url\": {\n            \"description\": \"If the customer does not exit their browser while authenticating, they will be redirected to this specified URL after completion.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL you must redirect your customer to in order to authenticate.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SetupIntentNextActionRedirectToUrl\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_next_action_verify_with_microdeposits\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"arrival_date\": {\n            \"description\": \"The timestamp when the microdeposits are expected to land.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"hosted_verification_url\": {\n            \"description\": \"The URL for the hosted verification page, which allows customers to verify their bank account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"microdeposit_type\": {\n            \"description\": \"The type of the microdeposit sent to the customer. Used to distinguish between different verification methods.\",\n            \"enum\": [\"amounts\", \"descriptor_code\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"arrival_date\", \"hosted_verification_url\"],\n        \"title\": \"SetupIntentNextActionVerifyWithMicrodeposits\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_acss_debit\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"amazon_pay\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_amazon_pay\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"bacs_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_bacs_debit\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"card_present\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_card_present\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"link\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_link\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"paypal\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_paypal\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_sepa_debit\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          },\n          \"us_bank_account\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_us_bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_type_specific_payment_method_options_client\"\n              }\n            ]\n          }\n        },\n        \"title\": \"SetupIntentPaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"amazon_pay\",\n          \"bacs_debit\",\n          \"card\",\n          \"card_present\",\n          \"link\",\n          \"paypal\",\n          \"sepa_debit\",\n          \"us_bank_account\"\n        ]\n      },\n      \"setup_intent_payment_method_options_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"currency\": {\n            \"description\": \"Currency supported by the bank account\",\n            \"enum\": [\"cad\", \"usd\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_mandate_options_acss_debit\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"setup_intent_payment_method_options_amazon_pay\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_intent_payment_method_options_amazon_pay\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_mandate_options_bacs_debit\"\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"setup_intent_payment_method_options_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_card_mandate_options\"\n              }\n            ],\n            \"description\": \"Configuration options for setting up an eMandate for cards issued in India.\",\n            \"nullable\": true\n          },\n          \"network\": {\n            \"description\": \"Selected network to process this SetupIntent on. Depends on the available networks of the card attached to the setup intent. Can be only set confirm-time.\",\n            \"enum\": [\n              \"amex\",\n              \"cartes_bancaires\",\n              \"diners\",\n              \"discover\",\n              \"eftpos_au\",\n              \"girocard\",\n              \"interac\",\n              \"jcb\",\n              \"link\",\n              \"mastercard\",\n              \"unionpay\",\n              \"unknown\",\n              \"visa\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"request_three_d_secure\": {\n            \"description\": \"We strongly recommend that you rely on our SCA Engine to automatically prompt your customers for authentication based on risk level and [other requirements](https://stripe.com/docs/strong-customer-authentication). However, if you wish to request 3D Secure based on logic from your own fraud engine, provide this option. If not provided, this value defaults to `automatic`. Read our guide on [manually requesting 3D Secure](https://stripe.com/docs/payments/3d-secure/authentication-flow#manual-three-ds) for more information on how this configuration interacts with Radar and our SCA Engine.\",\n            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"setup_intent_payment_method_options_card_mandate_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount to be charged for future payments.\",\n            \"type\": \"integer\"\n          },\n          \"amount_type\": {\n            \"description\": \"One of `fixed` or `maximum`. If `fixed`, the `amount` param refers to the exact amount to be charged in future payments. If `maximum`, the amount charged can be up to the value passed for the `amount` param.\",\n            \"enum\": [\"fixed\", \"maximum\"],\n            \"type\": \"string\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"A description of the mandate or subscription that is meant to be displayed to the customer.\",\n            \"maxLength\": 200,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"end_date\": {\n            \"description\": \"End date of the mandate or subscription. If not provided, the mandate will be active until canceled. If provided, end date should be after start date.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"interval\": {\n            \"description\": \"Specifies payment frequency. One of `day`, `week`, `month`, `year`, or `sporadic`.\",\n            \"enum\": [\"day\", \"month\", \"sporadic\", \"week\", \"year\"],\n            \"type\": \"string\"\n          },\n          \"interval_count\": {\n            \"description\": \"The number of intervals between payments. For example, `interval=month` and `interval_count=3` indicates one payment every three months. Maximum of one year interval allowed (1 year, 12 months, or 52 weeks). This parameter is optional when `interval=sporadic`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"reference\": {\n            \"description\": \"Unique identifier for the mandate or subscription.\",\n            \"maxLength\": 80,\n            \"type\": \"string\"\n          },\n          \"start_date\": {\n            \"description\": \"Start date of the mandate or subscription. Start date should not be lesser than yesterday.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"supported_types\": {\n            \"description\": \"Specifies the type of mandates supported. Possible values are `india`.\",\n            \"items\": {\n              \"enum\": [\"india\"],\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"amount_type\",\n          \"currency\",\n          \"interval\",\n          \"reference\",\n          \"start_date\"\n        ],\n        \"title\": \"setup_intent_payment_method_options_card_mandate_options\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_card_present\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_intent_payment_method_options_card_present\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_link\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"setup_intent_payment_method_options_link\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_mandate_options_acss_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"custom_mandate_url\": {\n            \"description\": \"A URL for custom mandate text\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"default_for\": {\n            \"description\": \"List of Stripe products where this mandate can be selected automatically.\",\n            \"items\": {\n              \"enum\": [\"invoice\", \"subscription\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"interval_description\": {\n            \"description\": \"Description of the interval. Only required if the 'payment_schedule' parameter is 'interval' or 'combined'.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payment_schedule\": {\n            \"description\": \"Payment schedule for the mandate.\",\n            \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_type\": {\n            \"description\": \"Transaction type of the mandate.\",\n            \"enum\": [\"business\", \"personal\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_mandate_options_acss_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_mandate_options_bacs_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference_prefix\": {\n            \"description\": \"Prefix used to generate the Mandate reference. Must be at most 12 characters long. Must consist of only uppercase letters, numbers, spaces, or the following special characters: '/', '_', '-', '&', '.'. Cannot begin with 'DDIC' or 'STRIPE'.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_mandate_options_bacs_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_mandate_options_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference_prefix\": {\n            \"description\": \"Prefix used to generate the Mandate reference. Must be at most 12 characters long. Must consist of only uppercase letters, numbers, spaces, or the following special characters: '/', '_', '-', '&', '.'. Cannot begin with 'STRIPE'.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_mandate_options_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_paypal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"billing_agreement_id\": {\n            \"description\": \"The PayPal Billing Agreement ID (BAID). This is an ID generated by PayPal which represents the mandate between the merchant and the customer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_paypal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"setup_intent_payment_method_options_sepa_debit\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/setup_intent_payment_method_options_mandate_options_sepa_debit\"\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_sepa_debit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"setup_intent_payment_method_options_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"financial_connections\": {\n            \"$ref\": \"#/components/schemas/linked_account_options_us_bank_account\"\n          },\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/payment_method_options_us_bank_account_mandate_options\"\n          },\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"setup_intent_payment_method_options_us_bank_account\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"financial_connections\", \"mandate_options\"]\n      },\n      \"setup_intent_type_specific_payment_method_options_client\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"verification_method\": {\n            \"description\": \"Bank account verification method.\",\n            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"SetupIntentTypeSpecificPaymentMethodOptionsClient\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"shipping\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"carrier\": {\n            \"description\": \"The delivery service that shipped a physical product, such as Fedex, UPS, USPS, etc.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Recipient name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"Recipient phone (including extension).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tracking_number\": {\n            \"description\": \"The tracking number for a physical product, obtained from the delivery service. If multiple tracking numbers were generated for this purchase, please separate them with commas.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"Shipping\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"shipping_rate\": {\n        \"description\": \"Shipping rates describe the price of shipping presented to your customers and\\napplied to a purchase. For more information, see [Charge for shipping](https://stripe.com/docs/payments/during-payment/charge-shipping).\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Whether the shipping rate can be used for new purchases. Defaults to `true`.\",\n            \"type\": \"boolean\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"delivery_estimate\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping_rate_delivery_estimate\"\n              }\n            ],\n            \"description\": \"The estimated range for how long shipping will take, meant to be displayable to the customer. This will appear on CheckoutSessions.\",\n            \"nullable\": true\n          },\n          \"display_name\": {\n            \"description\": \"The name of the shipping rate, meant to be displayable to the customer. This will appear on CheckoutSessions.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fixed_amount\": {\n            \"$ref\": \"#/components/schemas/shipping_rate_fixed_amount\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"shipping_rate\"],\n            \"type\": \"string\"\n          },\n          \"tax_behavior\": {\n            \"description\": \"Specifies whether the rate is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`.\",\n            \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_code\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/tax_code\"\n              }\n            ],\n            \"description\": \"A [tax code](https://stripe.com/docs/tax/tax-categories) ID. The Shipping tax code is `txcd_92010001`.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/tax_code\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"The type of calculation to use on the shipping rate.\",\n            \"enum\": [\"fixed_amount\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"type\"\n        ],\n        \"title\": \"ShippingRate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"delivery_estimate\", \"fixed_amount\", \"tax_code\"],\n        \"x-resourceId\": \"shipping_rate\"\n      },\n      \"shipping_rate_currency_option\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"A non-negative integer in cents representing how much to charge.\",\n            \"type\": \"integer\"\n          },\n          \"tax_behavior\": {\n            \"description\": \"Specifies whether the rate is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`.\",\n            \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"tax_behavior\"],\n        \"title\": \"ShippingRateCurrencyOption\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"shipping_rate_delivery_estimate\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"maximum\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping_rate_delivery_estimate_bound\"\n              }\n            ],\n            \"description\": \"The upper bound of the estimated range. If empty, represents no upper bound i.e., infinite.\",\n            \"nullable\": true\n          },\n          \"minimum\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/shipping_rate_delivery_estimate_bound\"\n              }\n            ],\n            \"description\": \"The lower bound of the estimated range. If empty, represents no lower bound.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"ShippingRateDeliveryEstimate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"maximum\", \"minimum\"]\n      },\n      \"shipping_rate_delivery_estimate_bound\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"unit\": {\n            \"description\": \"A unit of time.\",\n            \"enum\": [\"business_day\", \"day\", \"hour\", \"month\", \"week\"],\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"Must be greater than 0.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"unit\", \"value\"],\n        \"title\": \"ShippingRateDeliveryEstimateBound\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"shipping_rate_fixed_amount\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"A non-negative integer in cents representing how much to charge.\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"currency_options\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/shipping_rate_currency_option\"\n            },\n            \"description\": \"Shipping rates defined in each available currency option. Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\",\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\"],\n        \"title\": \"ShippingRateFixedAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"currency_options\"]\n      },\n      \"sigma_scheduled_query_run_error\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"message\": {\n            \"description\": \"Information about the run failure.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"message\"],\n        \"title\": \"SigmaScheduledQueryRunError\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source\": {\n        \"description\": \"`Source` objects allow you to accept a variety of payment methods. They\\nrepresent a customer's payment instrument, and can be used with the Stripe API\\njust like a `Card` object: once chargeable, they can be charged, or can be\\nattached to customers.\\n\\nStripe doesn't recommend using the deprecated [Sources API](https://stripe.com/docs/api/sources).\\nWe recommend that you adopt the [PaymentMethods API](https://stripe.com/docs/api/payment_methods).\\nThis newer API provides access to our latest features and payment method types.\\n\\nRelated guides: [Sources API](https://stripe.com/docs/sources) and [Sources & Customers](https://stripe.com/docs/sources/customers).\",\n        \"properties\": {\n          \"ach_credit_transfer\": {\n            \"$ref\": \"#/components/schemas/source_type_ach_credit_transfer\"\n          },\n          \"ach_debit\": {\n            \"$ref\": \"#/components/schemas/source_type_ach_debit\"\n          },\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/source_type_acss_debit\"\n          },\n          \"alipay\": {\n            \"$ref\": \"#/components/schemas/source_type_alipay\"\n          },\n          \"allow_redisplay\": {\n            \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to “unspecified”.\",\n            \"enum\": [\"always\", \"limited\", \"unspecified\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"amount\": {\n            \"description\": \"A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount associated with the source. This is the amount for which the source will be chargeable once ready. Required for `single_use` sources.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"au_becs_debit\": {\n            \"$ref\": \"#/components/schemas/source_type_au_becs_debit\"\n          },\n          \"bancontact\": {\n            \"$ref\": \"#/components/schemas/source_type_bancontact\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/source_type_card\"\n          },\n          \"card_present\": {\n            \"$ref\": \"#/components/schemas/source_type_card_present\"\n          },\n          \"client_secret\": {\n            \"description\": \"The client secret of the source. Used for client-side retrieval using a publishable key.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"code_verification\": {\n            \"$ref\": \"#/components/schemas/source_code_verification_flow\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) associated with the source. This is the currency for which the source will be chargeable once ready. Required for `single_use` sources.\",\n            \"format\": \"currency\",\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"description\": \"The ID of the customer to which this source is attached. This will not be present when the source has not been attached to a customer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"eps\": {\n            \"$ref\": \"#/components/schemas/source_type_eps\"\n          },\n          \"flow\": {\n            \"description\": \"The authentication `flow` of the source. `flow` is one of `redirect`, `receiver`, `code_verification`, `none`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"giropay\": {\n            \"$ref\": \"#/components/schemas/source_type_giropay\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"ideal\": {\n            \"$ref\": \"#/components/schemas/source_type_ideal\"\n          },\n          \"klarna\": {\n            \"$ref\": \"#/components/schemas/source_type_klarna\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"multibanco\": {\n            \"$ref\": \"#/components/schemas/source_type_multibanco\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"source\"],\n            \"type\": \"string\"\n          },\n          \"owner\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/source_owner\"\n              }\n            ],\n            \"description\": \"Information about the owner of the payment instrument that may be used or required by particular source types.\",\n            \"nullable\": true\n          },\n          \"p24\": {\n            \"$ref\": \"#/components/schemas/source_type_p24\"\n          },\n          \"receiver\": {\n            \"$ref\": \"#/components/schemas/source_receiver_flow\"\n          },\n          \"redirect\": {\n            \"$ref\": \"#/components/schemas/source_redirect_flow\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/source_type_sepa_debit\"\n          },\n          \"sofort\": {\n            \"$ref\": \"#/components/schemas/source_type_sofort\"\n          },\n          \"source_order\": {\n            \"$ref\": \"#/components/schemas/source_order\"\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Extra information about a source. This will appear on your customer's statement every time you charge the source.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the source, one of `canceled`, `chargeable`, `consumed`, `failed`, or `pending`. Only `chargeable` sources can be used to create a charge.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"three_d_secure\": {\n            \"$ref\": \"#/components/schemas/source_type_three_d_secure\"\n          },\n          \"type\": {\n            \"description\": \"The `type` of the source. The `type` is a payment method, one of `ach_credit_transfer`, `ach_debit`, `alipay`, `bancontact`, `card`, `card_present`, `eps`, `giropay`, `ideal`, `multibanco`, `klarna`, `p24`, `sepa_debit`, `sofort`, `three_d_secure`, or `wechat`. An additional hash is included on the source with a name matching this value. It contains additional information specific to the [payment method](https://stripe.com/docs/sources) used.\",\n            \"enum\": [\n              \"ach_credit_transfer\",\n              \"ach_debit\",\n              \"acss_debit\",\n              \"alipay\",\n              \"au_becs_debit\",\n              \"bancontact\",\n              \"card\",\n              \"card_present\",\n              \"eps\",\n              \"giropay\",\n              \"ideal\",\n              \"klarna\",\n              \"multibanco\",\n              \"p24\",\n              \"sepa_debit\",\n              \"sofort\",\n              \"three_d_secure\",\n              \"wechat\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"usage\": {\n            \"description\": \"Either `reusable` or `single_use`. Whether this source should be reusable or not. Some source types may or may not be reusable by construction, while others may leave the option at creation. If an incompatible value is passed, an error will be returned.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"wechat\": {\n            \"$ref\": \"#/components/schemas/source_type_wechat\"\n          }\n        },\n        \"required\": [\n          \"client_secret\",\n          \"created\",\n          \"flow\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"Source\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"code_verification\",\n          \"owner\",\n          \"receiver\",\n          \"redirect\",\n          \"source_order\"\n        ],\n        \"x-resourceId\": \"source\"\n      },\n      \"source_code_verification_flow\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"attempts_remaining\": {\n            \"description\": \"The number of attempts remaining to authenticate the source object with a verification code.\",\n            \"type\": \"integer\"\n          },\n          \"status\": {\n            \"description\": \"The status of the code verification, either `pending` (awaiting verification, `attempts_remaining` should be greater than 0), `succeeded` (successful verification) or `failed` (failed verification, cannot be verified anymore as `attempts_remaining` should be 0).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"attempts_remaining\", \"status\"],\n        \"title\": \"SourceCodeVerificationFlow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_mandate_notification\": {\n        \"description\": \"Source mandate notifications should be created when a notification related to\\na source mandate must be sent to the payer. They will trigger a webhook or\\ndeliver an email to the customer.\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"$ref\": \"#/components/schemas/source_mandate_notification_acss_debit_data\"\n          },\n          \"amount\": {\n            \"description\": \"A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the amount associated with the mandate notification. The amount is expressed in the currency of the underlying source. Required if the notification type is `debit_initiated`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"bacs_debit\": {\n            \"$ref\": \"#/components/schemas/source_mandate_notification_bacs_debit_data\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"source_mandate_notification\"],\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"description\": \"The reason of the mandate notification. Valid reasons are `mandate_confirmed` or `debit_initiated`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sepa_debit\": {\n            \"$ref\": \"#/components/schemas/source_mandate_notification_sepa_debit_data\"\n          },\n          \"source\": {\n            \"$ref\": \"#/components/schemas/source\"\n          },\n          \"status\": {\n            \"description\": \"The status of the mandate notification. Valid statuses are `pending` or `submitted`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of source this mandate notification is attached to. Should be the source type identifier code for the payment method, such as `three_d_secure`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"reason\",\n          \"source\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"SourceMandateNotification\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"bacs_debit\",\n          \"sepa_debit\",\n          \"source\"\n        ],\n        \"x-resourceId\": \"source_mandate_notification\"\n      },\n      \"source_mandate_notification_acss_debit_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"statement_descriptor\": {\n            \"description\": \"The statement descriptor associate with the debit.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceMandateNotificationAcssDebitData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_mandate_notification_bacs_debit_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"last4\": {\n            \"description\": \"Last 4 digits of the account number associated with the debit.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceMandateNotificationBacsDebitData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_mandate_notification_sepa_debit_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"creditor_identifier\": {\n            \"description\": \"SEPA creditor ID.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last 4 digits of the account number associated with the debit.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"mandate_reference\": {\n            \"description\": \"Mandate reference associated with the debit.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceMandateNotificationSepaDebitData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_order\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount for the order.\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"email\": {\n            \"description\": \"The email address of the customer placing the order.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"items\": {\n            \"description\": \"List of items constituting the order.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/source_order_item\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"shipping\": {\n            \"$ref\": \"#/components/schemas/shipping\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\"],\n        \"title\": \"SourceOrder\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"items\", \"shipping\"]\n      },\n      \"source_order_item\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount (price) for this order item.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"This currency of this order item. Required when `amount` is present.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"Human-readable description for this order item.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"parent\": {\n            \"description\": \"The ID of the associated object for this line item. Expandable if not null (e.g., expandable to a SKU).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"quantity\": {\n            \"description\": \"The quantity of this order item. When type is `sku`, this is the number of instances of the SKU to be ordered.\",\n            \"type\": \"integer\"\n          },\n          \"type\": {\n            \"description\": \"The type of this order item. Must be `sku`, `tax`, or `shipping`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceOrderItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_owner\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Owner's address.\",\n            \"nullable\": true\n          },\n          \"email\": {\n            \"description\": \"Owner's email address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Owner's full name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"phone\": {\n            \"description\": \"Owner's phone number (including extension).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/address\"\n              }\n            ],\n            \"description\": \"Verified owner's address. Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"nullable\": true\n          },\n          \"verified_email\": {\n            \"description\": \"Verified owner's email address. Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Verified owner's full name. Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_phone\": {\n            \"description\": \"Verified owner's phone number (including extension). Verified values are verified or provided by the payment method directly (and if supported) at the time of authorization or settlement. They cannot be set or mutated.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceOwner\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\", \"verified_address\"]\n      },\n      \"source_receiver_flow\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"description\": \"The address of the receiver source. This is the value that should be communicated to the customer to send their funds to.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"amount_charged\": {\n            \"description\": \"The total amount that was moved to your balance. This is almost always equal to the amount charged. In rare cases when customers deposit excess funds and we are unable to refund those, those funds get moved to your balance and show up in amount_charged as well. The amount charged is expressed in the source's currency.\",\n            \"type\": \"integer\"\n          },\n          \"amount_received\": {\n            \"description\": \"The total amount received by the receiver source. `amount_received = amount_returned + amount_charged` should be true for consumed sources unless customers deposit excess funds. The amount received is expressed in the source's currency.\",\n            \"type\": \"integer\"\n          },\n          \"amount_returned\": {\n            \"description\": \"The total amount that was returned to the customer. The amount returned is expressed in the source's currency.\",\n            \"type\": \"integer\"\n          },\n          \"refund_attributes_method\": {\n            \"description\": \"Type of refund attribute method, one of `email`, `manual`, or `none`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"refund_attributes_status\": {\n            \"description\": \"Type of refund attribute status, one of `missing`, `requested`, or `available`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount_charged\",\n          \"amount_received\",\n          \"amount_returned\",\n          \"refund_attributes_method\",\n          \"refund_attributes_status\"\n        ],\n        \"title\": \"SourceReceiverFlow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_redirect_flow\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"failure_reason\": {\n            \"description\": \"The failure reason for the redirect, either `user_abort` (the customer aborted or dropped out of the redirect flow), `declined` (the authentication failed or the transaction was declined), or `processing_error` (the redirect failed due to a technical error). Present only if the redirect status is `failed`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"return_url\": {\n            \"description\": \"The URL you provide to redirect the customer to after they authenticated their payment.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the redirect, either `pending` (ready to be used by your customer to authenticate the transaction), `succeeded` (succesful authentication, cannot be reused) or `not_required` (redirect should not be used) or `failed` (failed authentication, cannot be reused).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL provided to you to redirect a customer to as part of a `redirect` authentication flow.\",\n            \"maxLength\": 2048,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"return_url\", \"status\", \"url\"],\n        \"title\": \"SourceRedirectFlow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_transaction\": {\n        \"description\": \"Some payment methods have no required amount that a customer must send.\\nCustomers can be instructed to send any amount, and it can be made up of\\nmultiple transactions. As such, sources can have multiple associated\\ntransactions.\",\n        \"properties\": {\n          \"ach_credit_transfer\": {\n            \"$ref\": \"#/components/schemas/source_transaction_ach_credit_transfer_data\"\n          },\n          \"amount\": {\n            \"description\": \"A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the amount your customer has pushed to the receiver.\",\n            \"type\": \"integer\"\n          },\n          \"chf_credit_transfer\": {\n            \"$ref\": \"#/components/schemas/source_transaction_chf_credit_transfer_data\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"gbp_credit_transfer\": {\n            \"$ref\": \"#/components/schemas/source_transaction_gbp_credit_transfer_data\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"source_transaction\"],\n            \"type\": \"string\"\n          },\n          \"paper_check\": {\n            \"$ref\": \"#/components/schemas/source_transaction_paper_check_data\"\n          },\n          \"sepa_credit_transfer\": {\n            \"$ref\": \"#/components/schemas/source_transaction_sepa_credit_transfer_data\"\n          },\n          \"source\": {\n            \"description\": \"The ID of the source this transaction is attached to.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the transaction, one of `succeeded`, `pending`, or `failed`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of source this transaction is attached to.\",\n            \"enum\": [\n              \"ach_credit_transfer\",\n              \"ach_debit\",\n              \"alipay\",\n              \"bancontact\",\n              \"card\",\n              \"card_present\",\n              \"eps\",\n              \"giropay\",\n              \"ideal\",\n              \"klarna\",\n              \"multibanco\",\n              \"p24\",\n              \"sepa_debit\",\n              \"sofort\",\n              \"three_d_secure\",\n              \"wechat\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"source\",\n          \"status\",\n          \"type\"\n        ],\n        \"title\": \"SourceTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"ach_credit_transfer\",\n          \"chf_credit_transfer\",\n          \"gbp_credit_transfer\",\n          \"paper_check\",\n          \"sepa_credit_transfer\"\n        ],\n        \"x-resourceId\": \"source_transaction\"\n      },\n      \"source_transaction_ach_credit_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"customer_data\": {\n            \"description\": \"Customer data associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"description\": \"Bank account fingerprint associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last 4 digits of the account number associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing number associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceTransactionAchCreditTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_transaction_chf_credit_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"Reference associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_address_country\": {\n            \"description\": \"Sender's country address.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_address_line1\": {\n            \"description\": \"Sender's line 1 address.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_iban\": {\n            \"description\": \"Sender's bank account IBAN.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_name\": {\n            \"description\": \"Sender's name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceTransactionChfCreditTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_transaction_gbp_credit_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fingerprint\": {\n            \"description\": \"Bank account fingerprint associated with the Stripe owned bank account receiving the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"funding_method\": {\n            \"description\": \"The credit transfer rails the sender used to push this transfer. The possible rails are: Faster Payments, BACS, CHAPS, and wire transfers. Currently only Faster Payments is supported.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"Last 4 digits of sender account number associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"description\": \"Sender entered arbitrary information about the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_account_number\": {\n            \"description\": \"Sender account number associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_name\": {\n            \"description\": \"Sender name associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_sort_code\": {\n            \"description\": \"Sender sort code associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceTransactionGbpCreditTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_transaction_paper_check_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"available_at\": {\n            \"description\": \"Time at which the deposited funds will be available for use. Measured in seconds since the Unix epoch.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoices\": {\n            \"description\": \"Comma-separated list of invoice IDs associated with the paper check.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceTransactionPaperCheckData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_transaction_sepa_credit_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reference\": {\n            \"description\": \"Reference associated with the transfer.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_iban\": {\n            \"description\": \"Sender's bank account IBAN.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"sender_name\": {\n            \"description\": \"Sender's name.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SourceTransactionSepaCreditTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"source_type_ach_credit_transfer\": {\n        \"properties\": {\n          \"account_number\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_type\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_routing_number\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"swift_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_ach_debit\": {\n        \"properties\": {\n          \"bank_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_acss_debit\": {\n        \"properties\": {\n          \"bank_address_city\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_address_line_1\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_address_line_2\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_address_postal_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"category\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_alipay\": {\n        \"properties\": {\n          \"data_string\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"native_url\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_au_becs_debit\": {\n        \"properties\": {\n          \"bsb_number\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_bancontact\": {\n        \"properties\": {\n          \"bank_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"iban_last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_language\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_card\": {\n        \"properties\": {\n          \"address_line1_check\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_zip_check\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"brand\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cvc_check\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"dynamic_last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"three_d_secure\": {\n            \"type\": \"string\"\n          },\n          \"tokenization_method\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_card_present\": {\n        \"properties\": {\n          \"application_cryptogram\": {\n            \"type\": \"string\"\n          },\n          \"application_preferred_name\": {\n            \"type\": \"string\"\n          },\n          \"authorization_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"authorization_response_code\": {\n            \"type\": \"string\"\n          },\n          \"brand\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cvm_type\": {\n            \"type\": \"string\"\n          },\n          \"data_type\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"dedicated_file_name\": {\n            \"type\": \"string\"\n          },\n          \"emv_auth_data\": {\n            \"type\": \"string\"\n          },\n          \"evidence_customer_signature\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"evidence_transaction_certificate\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"pos_device_id\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"pos_entry_mode\": {\n            \"type\": \"string\"\n          },\n          \"read_method\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reader\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"terminal_verification_results\": {\n            \"type\": \"string\"\n          },\n          \"transaction_status_information\": {\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_eps\": {\n        \"properties\": {\n          \"reference\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_giropay\": {\n        \"properties\": {\n          \"bank_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_ideal\": {\n        \"properties\": {\n          \"bank\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"iban_last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_klarna\": {\n        \"properties\": {\n          \"background_image_url\": {\n            \"type\": \"string\"\n          },\n          \"client_token\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"first_name\": {\n            \"type\": \"string\"\n          },\n          \"last_name\": {\n            \"type\": \"string\"\n          },\n          \"locale\": {\n            \"type\": \"string\"\n          },\n          \"logo_url\": {\n            \"type\": \"string\"\n          },\n          \"page_title\": {\n            \"type\": \"string\"\n          },\n          \"pay_later_asset_urls_descriptive\": {\n            \"type\": \"string\"\n          },\n          \"pay_later_asset_urls_standard\": {\n            \"type\": \"string\"\n          },\n          \"pay_later_name\": {\n            \"type\": \"string\"\n          },\n          \"pay_later_redirect_url\": {\n            \"type\": \"string\"\n          },\n          \"pay_now_asset_urls_descriptive\": {\n            \"type\": \"string\"\n          },\n          \"pay_now_asset_urls_standard\": {\n            \"type\": \"string\"\n          },\n          \"pay_now_name\": {\n            \"type\": \"string\"\n          },\n          \"pay_now_redirect_url\": {\n            \"type\": \"string\"\n          },\n          \"pay_over_time_asset_urls_descriptive\": {\n            \"type\": \"string\"\n          },\n          \"pay_over_time_asset_urls_standard\": {\n            \"type\": \"string\"\n          },\n          \"pay_over_time_name\": {\n            \"type\": \"string\"\n          },\n          \"pay_over_time_redirect_url\": {\n            \"type\": \"string\"\n          },\n          \"payment_method_categories\": {\n            \"type\": \"string\"\n          },\n          \"purchase_country\": {\n            \"type\": \"string\"\n          },\n          \"purchase_type\": {\n            \"type\": \"string\"\n          },\n          \"redirect_url\": {\n            \"type\": \"string\"\n          },\n          \"shipping_delay\": {\n            \"type\": \"integer\"\n          },\n          \"shipping_first_name\": {\n            \"type\": \"string\"\n          },\n          \"shipping_last_name\": {\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_multibanco\": {\n        \"properties\": {\n          \"entity\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_address_city\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_address_country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_address_line1\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_address_line2\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_address_postal_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_address_state\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_account_holder_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"refund_iban\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_p24\": {\n        \"properties\": {\n          \"reference\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_sepa_debit\": {\n        \"properties\": {\n          \"bank_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"branch_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"fingerprint\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate_reference\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"mandate_url\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_sofort\": {\n        \"properties\": {\n          \"bank_code\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"bic\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"iban_last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"preferred_language\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_three_d_secure\": {\n        \"properties\": {\n          \"address_line1_check\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"address_zip_check\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"authenticated\": {\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"brand\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"card\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"cvc_check\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"dynamic_last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exp_month\": {\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"exp_year\": {\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"fingerprint\": {\n            \"type\": \"string\"\n          },\n          \"funding\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"three_d_secure\": {\n            \"type\": \"string\"\n          },\n          \"tokenization_method\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"source_type_wechat\": {\n        \"properties\": {\n          \"prepay_id\": {\n            \"type\": \"string\"\n          },\n          \"qr_code_url\": {\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"statement_descriptor\": {\n            \"type\": \"string\"\n          }\n        },\n        \"type\": \"object\"\n      },\n      \"subscription\": {\n        \"description\": \"Subscriptions allow you to charge a customer on a recurring basis.\\n\\nRelated guide: [Creating subscriptions](https://stripe.com/docs/billing/subscriptions/creating)\",\n        \"properties\": {\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_application\"\n              }\n            ],\n            \"description\": \"ID of the Connect Application that created the subscription.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_application\"\n                }\n              ]\n            }\n          },\n          \"application_fee_percent\": {\n            \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"automatic_tax\": {\n            \"$ref\": \"#/components/schemas/subscription_automatic_tax\"\n          },\n          \"billing_cycle_anchor\": {\n            \"description\": \"The reference point that aligns future [billing cycle](https://stripe.com/docs/subscriptions/billing-cycle) dates. It sets the day of week for `week` intervals, the day of month for `month` and `year` intervals, and the month of year for `year` intervals. The timestamp is in UTC format.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"billing_cycle_anchor_config\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscriptions_resource_billing_cycle_anchor_config\"\n              }\n            ],\n            \"description\": \"The fixed values used to calculate the `billing_cycle_anchor`.\",\n            \"nullable\": true\n          },\n          \"billing_thresholds\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_billing_thresholds\"\n              }\n            ],\n            \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period\",\n            \"nullable\": true\n          },\n          \"cancel_at\": {\n            \"description\": \"A date in the future at which the subscription will automatically get canceled\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cancel_at_period_end\": {\n            \"description\": \"Whether this subscription will (if `status=active`) or did (if `status=canceled`) cancel at the end of the current billing period.\",\n            \"type\": \"boolean\"\n          },\n          \"canceled_at\": {\n            \"description\": \"If the subscription has been canceled, the date of that cancellation. If the subscription was canceled with `cancel_at_period_end`, `canceled_at` will reflect the time of the most recent update request, not the end of the subscription period when the subscription is automatically moved to a canceled state.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"cancellation_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/cancellation_details\"\n              }\n            ],\n            \"description\": \"Details about why this subscription was cancelled\",\n            \"nullable\": true\n          },\n          \"collection_method\": {\n            \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`.\",\n            \"enum\": [\"charge_automatically\", \"send_invoice\"],\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"current_period_end\": {\n            \"description\": \"End of the current period that the subscription has been invoiced for. At the end of this period, a new invoice will be created.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"current_period_start\": {\n            \"description\": \"Start of the current period that the subscription has been invoiced for.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"ID of the customer who owns the subscription.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"days_until_due\": {\n            \"description\": \"Number of days a customer has to pay invoices generated by this subscription. This value will be `null` for subscriptions where `collection_method=charge_automatically`.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"default_payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over `default_source`. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"default_source\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/bank_account\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/card\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/source\"\n              }\n            ],\n            \"description\": \"ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If `default_payment_method` is also set, `default_payment_method` will take precedence. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/bank_account\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/card\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/source\"\n                }\n              ]\n            },\n            \"x-stripeBypassValidation\": true\n          },\n          \"default_tax_rates\": {\n            \"description\": \"The tax rates that will apply to any subscription item that does not have `tax_rates` set. Invoices created will have their `default_tax_rates` populated from the subscription.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"description\": {\n            \"description\": \"The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs.\",\n            \"maxLength\": 500,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discount\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/discount\"\n              }\n            ],\n            \"description\": \"Describes the current discount applied to this subscription, if there is one. When billing, a discount applied to a subscription overrides a discount applied on a customer-wide basis. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n            \"nullable\": true\n          },\n          \"discounts\": {\n            \"description\": \"The discounts applied to the subscription. Subscription item discounts are applied before subscription discounts. Use `expand[]=discounts` to expand each discount.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/discount\"\n                  }\n                ]\n              }\n            },\n            \"type\": \"array\"\n          },\n          \"ended_at\": {\n            \"description\": \"If the subscription has ended, the date the subscription ended.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice_settings\": {\n            \"$ref\": \"#/components/schemas/subscriptions_resource_subscription_invoice_settings\"\n          },\n          \"items\": {\n            \"description\": \"List of subscription items, each with an attached price.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/subscription_item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"SubscriptionItemList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"latest_invoice\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/invoice\"\n              }\n            ],\n            \"description\": \"The most recent invoice this subscription has generated.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              ]\n            }\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"next_pending_invoice_item_invoice\": {\n            \"description\": \"Specifies the approximate timestamp on which any pending invoice items will be billed according to the schedule provided at `pending_invoice_item_interval`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"subscription\"],\n            \"type\": \"string\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) the charge was made on behalf of for charges associated with this subscription. See the Connect documentation for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"pause_collection\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscriptions_resource_pause_collection\"\n              }\n            ],\n            \"description\": \"If specified, payment collection for this subscription will be paused. Note that the subscription status will be unchanged and will not be updated to `paused`. Learn more about [pausing collection](https://stripe.com/docs/billing/subscriptions/pause-payment).\",\n            \"nullable\": true\n          },\n          \"payment_settings\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscriptions_resource_payment_settings\"\n              }\n            ],\n            \"description\": \"Payment settings passed on to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"pending_invoice_item_interval\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_pending_invoice_item_interval\"\n              }\n            ],\n            \"description\": \"Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling [Create an invoice](https://stripe.com/docs/api#create_invoice) for the given subscription at the specified interval.\",\n            \"nullable\": true\n          },\n          \"pending_setup_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent\"\n              }\n            ],\n            \"description\": \"You can use this [SetupIntent](https://stripe.com/docs/api/setup_intents) to collect user authentication when creating a subscription without immediate payment or updating a subscription's payment method, allowing you to optimize for off-session payments. Learn more in the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication#scenario-2).\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              ]\n            }\n          },\n          \"pending_update\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscriptions_resource_pending_update\"\n              }\n            ],\n            \"description\": \"If specified, [pending updates](https://stripe.com/docs/billing/subscriptions/pending-updates) that will be applied to the subscription once the `latest_invoice` has been paid.\",\n            \"nullable\": true\n          },\n          \"schedule\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription_schedule\"\n              }\n            ],\n            \"description\": \"The schedule attached to the subscription\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription_schedule\"\n                }\n              ]\n            }\n          },\n          \"start_date\": {\n            \"description\": \"Date when the subscription was first created. The date might differ from the `created` date due to backdating.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"status\": {\n            \"description\": \"Possible values are `incomplete`, `incomplete_expired`, `trialing`, `active`, `past_due`, `canceled`, `unpaid`, or `paused`. \\n\\nFor `collection_method=charge_automatically` a subscription moves into `incomplete` if the initial payment attempt fails. A subscription in this status can only have metadata and default_source updated. Once the first invoice is paid, the subscription moves into an `active` status. If the first invoice is not paid within 23 hours, the subscription transitions to `incomplete_expired`. This is a terminal status, the open invoice will be voided and no further invoices will be generated. \\n\\nA subscription that is currently in a trial period is `trialing` and moves to `active` when the trial period is over. \\n\\nA subscription can only enter a `paused` status [when a trial ends without a payment method](https://stripe.com/docs/billing/subscriptions/trials#create-free-trials-without-payment). A `paused` subscription doesn't generate invoices and can be resumed after your customer adds their payment method. The `paused` status is different from [pausing collection](https://stripe.com/docs/billing/subscriptions/pause-payment), which still generates invoices and leaves the subscription's status unchanged. \\n\\nIf subscription `collection_method=charge_automatically`, it becomes `past_due` when payment is required but cannot be paid (due to failed payment or awaiting additional user actions). Once Stripe has exhausted all payment retry attempts, the subscription will become `canceled` or `unpaid` (depending on your subscriptions settings). \\n\\nIf subscription `collection_method=send_invoice` it becomes `past_due` when its invoice is not paid by the due date, and `canceled` or `unpaid` if it is still not paid by an additional deadline after that. Note that when a subscription has a status of `unpaid`, no subsequent invoices will be attempted (invoices will be created, but then immediately automatically closed). After receiving updated payment information from a customer, you may choose to reopen and pay their closed invoices.\",\n            \"enum\": [\n              \"active\",\n              \"canceled\",\n              \"incomplete\",\n              \"incomplete_expired\",\n              \"past_due\",\n              \"paused\",\n              \"trialing\",\n              \"unpaid\"\n            ],\n            \"type\": \"string\"\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock this subscription belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_transfer_data\"\n              }\n            ],\n            \"description\": \"The account (if any) the subscription's payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the subscription's invoices.\",\n            \"nullable\": true\n          },\n          \"trial_end\": {\n            \"description\": \"If the subscription has a trial, the end of that trial.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"trial_settings\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscriptions_trials_resource_trial_settings\"\n              }\n            ],\n            \"description\": \"Settings related to subscription trials.\",\n            \"nullable\": true\n          },\n          \"trial_start\": {\n            \"description\": \"If the subscription has a trial, the beginning of that trial.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"automatic_tax\",\n          \"billing_cycle_anchor\",\n          \"cancel_at_period_end\",\n          \"collection_method\",\n          \"created\",\n          \"currency\",\n          \"current_period_end\",\n          \"current_period_start\",\n          \"customer\",\n          \"discounts\",\n          \"id\",\n          \"invoice_settings\",\n          \"items\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"start_date\",\n          \"status\"\n        ],\n        \"title\": \"Subscription\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application\",\n          \"automatic_tax\",\n          \"billing_cycle_anchor_config\",\n          \"billing_thresholds\",\n          \"cancellation_details\",\n          \"customer\",\n          \"default_payment_method\",\n          \"default_source\",\n          \"default_tax_rates\",\n          \"discount\",\n          \"discounts\",\n          \"invoice_settings\",\n          \"items\",\n          \"latest_invoice\",\n          \"on_behalf_of\",\n          \"pause_collection\",\n          \"payment_settings\",\n          \"pending_invoice_item_interval\",\n          \"pending_setup_intent\",\n          \"pending_update\",\n          \"schedule\",\n          \"test_clock\",\n          \"transfer_data\",\n          \"trial_settings\"\n        ],\n        \"x-resourceId\": \"subscription\"\n      },\n      \"subscription_automatic_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disabled_reason\": {\n            \"description\": \"If Stripe disabled automatic tax, this enum describes why.\",\n            \"enum\": [\"requires_location_inputs\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether Stripe automatically computes tax on this subscription.\",\n            \"type\": \"boolean\"\n          },\n          \"liability\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The account that's liable for tax. If set, the business address and tax registrations required to perform the tax calculation are loaded from this account. The tax transaction is returned in the report of the connected account.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"SubscriptionAutomaticTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"liability\"]\n      },\n      \"subscription_billing_thresholds\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_gte\": {\n            \"description\": \"Monetary threshold that triggers the subscription to create an invoice\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"reset_billing_cycle_anchor\": {\n            \"description\": \"Indicates if the `billing_cycle_anchor` should be reset when a threshold is reached. If true, `billing_cycle_anchor` will be updated to the date/time the threshold was last reached; otherwise, the value will remain unchanged. This value may not be `true` if the subscription contains items with plans that have `aggregate_usage=last_ever`.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"SubscriptionBillingThresholds\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscription_details_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) defined as subscription metadata when an invoice is created. Becomes an immutable snapshot of the subscription metadata at the time of invoice finalization.\\n *Note: This attribute is populated only for invoices created on or after June 29, 2023.*\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          }\n        },\n        \"title\": \"SubscriptionDetailsData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscription_item\": {\n        \"description\": \"Subscription items allow you to create customer subscriptions with more than\\none plan, making it easy to represent complex billing relationships.\",\n        \"properties\": {\n          \"billing_thresholds\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_item_billing_thresholds\"\n              }\n            ],\n            \"description\": \"Define thresholds at which an invoice will be sent, and the related subscription advanced to a new billing period\",\n            \"nullable\": true\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"type\": \"integer\"\n          },\n          \"discounts\": {\n            \"description\": \"The discounts applied to the subscription item. Subscription item discounts are applied before subscription discounts. Use `expand[]=discounts` to expand each discount.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/discount\"\n                  }\n                ]\n              }\n            },\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"subscription_item\"],\n            \"type\": \"string\"\n          },\n          \"price\": {\n            \"$ref\": \"#/components/schemas/price\"\n          },\n          \"quantity\": {\n            \"description\": \"The [quantity](https://stripe.com/docs/subscriptions/quantities) of the plan to which the customer should be subscribed.\",\n            \"type\": \"integer\"\n          },\n          \"subscription\": {\n            \"description\": \"The `subscription` this `subscription_item` belongs to.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"tax_rates\": {\n            \"description\": \"The tax rates which apply to this `subscription_item`. When set, the `default_tax_rates` on the subscription do not apply to this `subscription_item`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"discounts\",\n          \"id\",\n          \"metadata\",\n          \"object\",\n          \"price\",\n          \"subscription\"\n        ],\n        \"title\": \"SubscriptionItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"billing_thresholds\",\n          \"discounts\",\n          \"price\",\n          \"tax_rates\"\n        ],\n        \"x-resourceId\": \"subscription_item\"\n      },\n      \"subscription_item_billing_thresholds\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"usage_gte\": {\n            \"description\": \"Usage threshold that triggers the subscription to create an invoice\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"SubscriptionItemBillingThresholds\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscription_payment_method_options_card\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"mandate_options\": {\n            \"$ref\": \"#/components/schemas/invoice_mandate_options_card\"\n          },\n          \"network\": {\n            \"description\": \"Selected network to process this Subscription on. Depends on the available networks of the card attached to the Subscription. Can be only set confirm-time.\",\n            \"enum\": [\n              \"amex\",\n              \"cartes_bancaires\",\n              \"diners\",\n              \"discover\",\n              \"eftpos_au\",\n              \"girocard\",\n              \"interac\",\n              \"jcb\",\n              \"link\",\n              \"mastercard\",\n              \"unionpay\",\n              \"unknown\",\n              \"visa\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"request_three_d_secure\": {\n            \"description\": \"We strongly recommend that you rely on our SCA Engine to automatically prompt your customers for authentication based on risk level and [other requirements](https://stripe.com/docs/strong-customer-authentication). However, if you wish to request 3D Secure based on logic from your own fraud engine, provide this option. Read our guide on [manually requesting 3D Secure](https://stripe.com/docs/payments/3d-secure/authentication-flow#manual-three-ds) for more information on how this configuration interacts with Radar and our SCA Engine.\",\n            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"subscription_payment_method_options_card\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"mandate_options\"]\n      },\n      \"subscription_pending_invoice_item_interval\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"interval\": {\n            \"description\": \"Specifies invoicing frequency. Either `day`, `week`, `month` or `year`.\",\n            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n            \"type\": \"string\"\n          },\n          \"interval_count\": {\n            \"description\": \"The number of intervals between invoices. For example, `interval=month` and `interval_count=3` bills every 3 months. Maximum of one year interval allowed (1 year, 12 months, or 52 weeks).\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"interval\", \"interval_count\"],\n        \"title\": \"SubscriptionPendingInvoiceItemInterval\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscription_schedule\": {\n        \"description\": \"A subscription schedule allows you to create and manage the lifecycle of a subscription by predefining expected changes.\\n\\nRelated guide: [Subscription schedules](https://stripe.com/docs/billing/subscriptions/subscription-schedules)\",\n        \"properties\": {\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_application\"\n              }\n            ],\n            \"description\": \"ID of the Connect Application that created the schedule.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_application\"\n                }\n              ]\n            }\n          },\n          \"canceled_at\": {\n            \"description\": \"Time at which the subscription schedule was canceled. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"completed_at\": {\n            \"description\": \"Time at which the subscription schedule was completed. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"current_phase\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_schedule_current_phase\"\n              }\n            ],\n            \"description\": \"Object representing the start and end dates for the current phase of the subscription schedule, if it is `active`.\",\n            \"nullable\": true\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_customer\"\n              }\n            ],\n            \"description\": \"ID of the customer who owns the subscription schedule.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              ]\n            }\n          },\n          \"default_settings\": {\n            \"$ref\": \"#/components/schemas/subscription_schedules_resource_default_settings\"\n          },\n          \"end_behavior\": {\n            \"description\": \"Behavior of the subscription schedule and underlying subscription when it ends. Possible values are `release` or `cancel` with the default being `release`. `release` will end the subscription schedule and keep the underlying subscription running. `cancel` will end the subscription schedule and cancel the underlying subscription.\",\n            \"enum\": [\"cancel\", \"none\", \"release\", \"renew\"],\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"subscription_schedule\"],\n            \"type\": \"string\"\n          },\n          \"phases\": {\n            \"description\": \"Configuration for the subscription schedule's phases.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/subscription_schedule_phase_configuration\"\n            },\n            \"type\": \"array\"\n          },\n          \"released_at\": {\n            \"description\": \"Time at which the subscription schedule was released. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"released_subscription\": {\n            \"description\": \"ID of the subscription once managed by the subscription schedule (if it is released).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The present status of the subscription schedule. Possible values are `not_started`, `active`, `completed`, `released`, and `canceled`. You can read more about the different states in our [behavior guide](https://stripe.com/docs/billing/subscriptions/subscription-schedules).\",\n            \"enum\": [\n              \"active\",\n              \"canceled\",\n              \"completed\",\n              \"not_started\",\n              \"released\"\n            ],\n            \"type\": \"string\"\n          },\n          \"subscription\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/subscription\"\n              }\n            ],\n            \"description\": \"ID of the subscription managed by the subscription schedule.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              ]\n            }\n          },\n          \"test_clock\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n              }\n            ],\n            \"description\": \"ID of the test clock this subscription schedule belongs to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"customer\",\n          \"default_settings\",\n          \"end_behavior\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"phases\",\n          \"status\"\n        ],\n        \"title\": \"SubscriptionSchedule\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"application\",\n          \"current_phase\",\n          \"customer\",\n          \"default_settings\",\n          \"phases\",\n          \"subscription\",\n          \"test_clock\"\n        ],\n        \"x-resourceId\": \"subscription_schedule\"\n      },\n      \"subscription_schedule_add_invoice_item\": {\n        \"description\": \"An Add Invoice Item describes the prices and quantities that will be added as pending invoice items when entering a phase.\",\n        \"properties\": {\n          \"discounts\": {\n            \"description\": \"The stackable discounts that will be applied to the item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/discounts_resource_stackable_discount\"\n            },\n            \"type\": \"array\"\n          },\n          \"price\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/price\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_price\"\n              }\n            ],\n            \"description\": \"ID of the price used to generate the invoice item.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/price\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_price\"\n                }\n              ]\n            }\n          },\n          \"quantity\": {\n            \"description\": \"The quantity of the invoice item.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"tax_rates\": {\n            \"description\": \"The tax rates which apply to the item. When set, the `default_tax_rates` do not apply to this item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"discounts\", \"price\"],\n        \"title\": \"SubscriptionScheduleAddInvoiceItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"discounts\", \"price\", \"tax_rates\"]\n      },\n      \"subscription_schedule_configuration_item\": {\n        \"description\": \"A phase item describes the price and quantity of a phase.\",\n        \"properties\": {\n          \"billing_thresholds\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_item_billing_thresholds\"\n              }\n            ],\n            \"description\": \"Define thresholds at which an invoice will be sent, and the related subscription advanced to a new billing period\",\n            \"nullable\": true\n          },\n          \"discounts\": {\n            \"description\": \"The discounts applied to the subscription item. Subscription item discounts are applied before subscription discounts. Use `expand[]=discounts` to expand each discount.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/discounts_resource_stackable_discount\"\n            },\n            \"type\": \"array\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an item. Metadata on this item will update the underlying subscription item's `metadata` when the phase is entered.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"price\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/price\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_price\"\n              }\n            ],\n            \"description\": \"ID of the price to which the customer should be subscribed.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/price\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_price\"\n                }\n              ]\n            }\n          },\n          \"quantity\": {\n            \"description\": \"Quantity of the plan to which the customer should be subscribed.\",\n            \"type\": \"integer\"\n          },\n          \"tax_rates\": {\n            \"description\": \"The tax rates which apply to this `phase_item`. When set, the `default_tax_rates` on the phase do not apply to this `phase_item`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"discounts\", \"price\"],\n        \"title\": \"SubscriptionScheduleConfigurationItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"billing_thresholds\",\n          \"discounts\",\n          \"price\",\n          \"tax_rates\"\n        ]\n      },\n      \"subscription_schedule_current_phase\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"end_date\": {\n            \"description\": \"The end of this phase of the subscription schedule.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"start_date\": {\n            \"description\": \"The start of this phase of the subscription schedule.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"end_date\", \"start_date\"],\n        \"title\": \"SubscriptionScheduleCurrentPhase\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscription_schedule_phase_configuration\": {\n        \"description\": \"A phase describes the plans, coupon, and trialing status of a subscription for a predefined time period.\",\n        \"properties\": {\n          \"add_invoice_items\": {\n            \"description\": \"A list of prices and quantities that will generate invoice items appended to the next invoice for this phase.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/subscription_schedule_add_invoice_item\"\n            },\n            \"type\": \"array\"\n          },\n          \"application_fee_percent\": {\n            \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account during this phase of the schedule.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"automatic_tax\": {\n            \"$ref\": \"#/components/schemas/schedules_phase_automatic_tax\"\n          },\n          \"billing_cycle_anchor\": {\n            \"description\": \"Possible values are `phase_start` or `automatic`. If `phase_start` then billing cycle anchor of the subscription is set to the start of the phase when entering the phase. If `automatic` then the billing cycle anchor is automatically modified as needed when entering the phase. For more information, see the billing cycle [documentation](https://stripe.com/docs/billing/subscriptions/billing-cycle).\",\n            \"enum\": [\"automatic\", \"phase_start\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"billing_thresholds\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_billing_thresholds\"\n              }\n            ],\n            \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period\",\n            \"nullable\": true\n          },\n          \"collection_method\": {\n            \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay the underlying subscription at the end of each billing cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`.\",\n            \"enum\": [\"charge_automatically\", \"send_invoice\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"coupon\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/coupon\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/deleted_coupon\"\n              }\n            ],\n            \"description\": \"ID of the coupon to use during this phase of the subscription schedule.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/coupon\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_coupon\"\n                }\n              ]\n            }\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"default_payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the default payment method for the subscription schedule. It must belong to the customer associated with the subscription schedule. If not set, invoices will use the default payment method in the customer's invoice settings.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"default_tax_rates\": {\n            \"description\": \"The default tax rates to apply to the subscription during this phase of the subscription schedule.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_rate\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"description\": {\n            \"description\": \"Subscription description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"discounts\": {\n            \"description\": \"The stackable discounts that will be applied to the subscription on this phase. Subscription item discounts are applied before subscription discounts.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/discounts_resource_stackable_discount\"\n            },\n            \"type\": \"array\"\n          },\n          \"end_date\": {\n            \"description\": \"The end of this phase of the subscription schedule.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"invoice_settings\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_setting_subscription_schedule_phase_setting\"\n              }\n            ],\n            \"description\": \"The invoice settings applicable during this phase.\",\n            \"nullable\": true\n          },\n          \"items\": {\n            \"description\": \"Subscription items to configure the subscription to during this phase of the subscription schedule.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/subscription_schedule_configuration_item\"\n            },\n            \"type\": \"array\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to a phase. Metadata on a schedule's phase will update the underlying subscription's `metadata` when the phase is entered. Updating the underlying subscription's `metadata` directly will not affect the current phase's `metadata`.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) the charge was made on behalf of for charges associated with the schedule's subscription. See the Connect documentation for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"proration_behavior\": {\n            \"description\": \"If the subscription schedule will prorate when transitioning to this phase. Possible values are `create_prorations` and `none`.\",\n            \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n            \"type\": \"string\"\n          },\n          \"start_date\": {\n            \"description\": \"The start of this phase of the subscription schedule.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_transfer_data\"\n              }\n            ],\n            \"description\": \"The account (if any) the associated subscription's payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the subscription's invoices.\",\n            \"nullable\": true\n          },\n          \"trial_end\": {\n            \"description\": \"When the trial ends within the phase.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"add_invoice_items\",\n          \"currency\",\n          \"discounts\",\n          \"end_date\",\n          \"items\",\n          \"proration_behavior\",\n          \"start_date\"\n        ],\n        \"title\": \"SubscriptionSchedulePhaseConfiguration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"add_invoice_items\",\n          \"automatic_tax\",\n          \"billing_thresholds\",\n          \"coupon\",\n          \"default_payment_method\",\n          \"default_tax_rates\",\n          \"discounts\",\n          \"invoice_settings\",\n          \"items\",\n          \"on_behalf_of\",\n          \"transfer_data\"\n        ]\n      },\n      \"subscription_schedules_resource_default_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"application_fee_percent\": {\n            \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account during this phase of the schedule.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"automatic_tax\": {\n            \"$ref\": \"#/components/schemas/subscription_schedules_resource_default_settings_automatic_tax\"\n          },\n          \"billing_cycle_anchor\": {\n            \"description\": \"Possible values are `phase_start` or `automatic`. If `phase_start` then billing cycle anchor of the subscription is set to the start of the phase when entering the phase. If `automatic` then the billing cycle anchor is automatically modified as needed when entering the phase. For more information, see the billing cycle [documentation](https://stripe.com/docs/billing/subscriptions/billing-cycle).\",\n            \"enum\": [\"automatic\", \"phase_start\"],\n            \"type\": \"string\"\n          },\n          \"billing_thresholds\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_billing_thresholds\"\n              }\n            ],\n            \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period\",\n            \"nullable\": true\n          },\n          \"collection_method\": {\n            \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay the underlying subscription at the end of each billing cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`.\",\n            \"enum\": [\"charge_automatically\", \"send_invoice\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"default_payment_method\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_method\"\n              }\n            ],\n            \"description\": \"ID of the default payment method for the subscription schedule. If not set, invoices will use the default payment method in the customer's invoice settings.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              ]\n            }\n          },\n          \"description\": {\n            \"description\": \"Subscription description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"invoice_settings\": {\n            \"$ref\": \"#/components/schemas/invoice_setting_subscription_schedule_setting\"\n          },\n          \"on_behalf_of\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) the charge was made on behalf of for charges associated with the schedule's subscription. See the Connect documentation for details.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"transfer_data\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_transfer_data\"\n              }\n            ],\n            \"description\": \"The account (if any) the associated subscription's payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the subscription's invoices.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"billing_cycle_anchor\", \"invoice_settings\"],\n        \"title\": \"SubscriptionSchedulesResourceDefaultSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"automatic_tax\",\n          \"billing_thresholds\",\n          \"default_payment_method\",\n          \"invoice_settings\",\n          \"on_behalf_of\",\n          \"transfer_data\"\n        ]\n      },\n      \"subscription_schedules_resource_default_settings_automatic_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"disabled_reason\": {\n            \"description\": \"If Stripe disabled automatic tax, this enum describes why.\",\n            \"enum\": [\"requires_location_inputs\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"enabled\": {\n            \"description\": \"Whether Stripe automatically computes tax on invoices created during this phase.\",\n            \"type\": \"boolean\"\n          },\n          \"liability\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/connect_account_reference\"\n              }\n            ],\n            \"description\": \"The account that's liable for tax. If set, the business address and tax registrations required to perform the tax calculation are loaded from this account. The tax transaction is returned in the report of the connected account.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"enabled\"],\n        \"title\": \"SubscriptionSchedulesResourceDefaultSettingsAutomaticTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"liability\"]\n      },\n      \"subscription_transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount_percent\": {\n            \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the destination account. By default, the entire amount is transferred to the destination.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account where funds from the payment will be transferred to upon payment success.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"destination\"],\n        \"title\": \"SubscriptionTransferData\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"destination\"]\n      },\n      \"subscriptions_resource_billing_cycle_anchor_config\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"day_of_month\": {\n            \"description\": \"The day of the month of the billing_cycle_anchor.\",\n            \"type\": \"integer\"\n          },\n          \"hour\": {\n            \"description\": \"The hour of the day of the billing_cycle_anchor.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"minute\": {\n            \"description\": \"The minute of the hour of the billing_cycle_anchor.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"month\": {\n            \"description\": \"The month to start full cycle billing periods.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"second\": {\n            \"description\": \"The second of the minute of the billing_cycle_anchor.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"day_of_month\"],\n        \"title\": \"SubscriptionsResourceBillingCycleAnchorConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscriptions_resource_pause_collection\": {\n        \"description\": \"The Pause Collection settings determine how we will pause collection for this subscription and for how long the subscription\\nshould be paused.\",\n        \"properties\": {\n          \"behavior\": {\n            \"description\": \"The payment collection behavior for this subscription while paused. One of `keep_as_draft`, `mark_uncollectible`, or `void`.\",\n            \"enum\": [\"keep_as_draft\", \"mark_uncollectible\", \"void\"],\n            \"type\": \"string\"\n          },\n          \"resumes_at\": {\n            \"description\": \"The time after which the subscription will resume collecting payments.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"behavior\"],\n        \"title\": \"SubscriptionsResourcePauseCollection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscriptions_resource_payment_method_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"acss_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_acss_debit\"\n              }\n            ],\n            \"description\": \"This sub-hash contains details about the Canadian pre-authorized debit payment method options to pass to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"bancontact\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_bancontact\"\n              }\n            ],\n            \"description\": \"This sub-hash contains details about the Bancontact payment method options to pass to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"card\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscription_payment_method_options_card\"\n              }\n            ],\n            \"description\": \"This sub-hash contains details about the Card payment method options to pass to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"customer_balance\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_customer_balance\"\n              }\n            ],\n            \"description\": \"This sub-hash contains details about the Bank transfer payment method options to pass to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"konbini\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_konbini\"\n              }\n            ],\n            \"description\": \"This sub-hash contains details about the Konbini payment method options to pass to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"sepa_debit\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_sepa_debit\"\n              }\n            ],\n            \"description\": \"This sub-hash contains details about the SEPA Direct Debit payment method options to pass to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"us_bank_account\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/invoice_payment_method_options_us_bank_account\"\n              }\n            ],\n            \"description\": \"This sub-hash contains details about the ACH direct debit payment method options to pass to invoices created by the subscription.\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"SubscriptionsResourcePaymentMethodOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"acss_debit\",\n          \"bancontact\",\n          \"card\",\n          \"customer_balance\",\n          \"konbini\",\n          \"sepa_debit\",\n          \"us_bank_account\"\n        ]\n      },\n      \"subscriptions_resource_payment_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"payment_method_options\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/subscriptions_resource_payment_method_options\"\n              }\n            ],\n            \"description\": \"Payment-method-specific configuration to provide to invoices created by the subscription.\",\n            \"nullable\": true\n          },\n          \"payment_method_types\": {\n            \"description\": \"The list of payment method types to provide to every invoice created by the subscription. If not set, Stripe attempts to automatically determine the types to use by looking at the invoice’s default payment method, the subscription’s default payment method, the customer’s default payment method, and your [invoice template settings](https://dashboard.stripe.com/settings/billing/invoice).\",\n            \"items\": {\n              \"enum\": [\n                \"ach_credit_transfer\",\n                \"ach_debit\",\n                \"acss_debit\",\n                \"amazon_pay\",\n                \"au_becs_debit\",\n                \"bacs_debit\",\n                \"bancontact\",\n                \"boleto\",\n                \"card\",\n                \"cashapp\",\n                \"customer_balance\",\n                \"eps\",\n                \"fpx\",\n                \"giropay\",\n                \"grabpay\",\n                \"ideal\",\n                \"jp_credit_transfer\",\n                \"kakao_pay\",\n                \"konbini\",\n                \"kr_card\",\n                \"link\",\n                \"multibanco\",\n                \"naver_pay\",\n                \"p24\",\n                \"payco\",\n                \"paynow\",\n                \"paypal\",\n                \"promptpay\",\n                \"revolut_pay\",\n                \"sepa_credit_transfer\",\n                \"sepa_debit\",\n                \"sofort\",\n                \"swish\",\n                \"us_bank_account\",\n                \"wechat_pay\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"save_default_payment_method\": {\n            \"description\": \"Configure whether Stripe updates `subscription.default_payment_method` when payment succeeds. Defaults to `off`.\",\n            \"enum\": [\"off\", \"on_subscription\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"SubscriptionsResourcePaymentSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_method_options\"]\n      },\n      \"subscriptions_resource_pending_update\": {\n        \"description\": \"Pending Updates store the changes pending from a previous update that will be applied\\nto the Subscription upon successful payment.\",\n        \"properties\": {\n          \"billing_cycle_anchor\": {\n            \"description\": \"If the update is applied, determines the date of the first full invoice, and, for plans with `month` or `year` intervals, the day of the month for subsequent invoices. The timestamp is in UTC format.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"The point after which the changes reflected by this update will be discarded and no longer applied.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"subscription_items\": {\n            \"description\": \"List of subscription items, each with an attached plan, that will be set if the update is applied.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/subscription_item\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"trial_end\": {\n            \"description\": \"Unix timestamp representing the end of the trial period the customer will get before being charged for the first time, if the update is applied.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"trial_from_plan\": {\n            \"description\": \"Indicates if a plan's `trial_period_days` should be applied to the subscription. Setting `trial_end` per subscription is preferred, and this defaults to `false`. Setting this flag to `true` together with `trial_end` is not allowed. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"expires_at\"],\n        \"title\": \"SubscriptionsResourcePendingUpdate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"subscription_items\"]\n      },\n      \"subscriptions_resource_subscription_invoice_settings\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account_tax_ids\": {\n            \"description\": \"The account tax IDs associated with the subscription. Will be set on invoices generated by the subscription.\",\n            \"items\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              ],\n              \"x-expansionResources\": {\n                \"oneOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/tax_id\"\n                  },\n                  {\n                    \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                  }\n                ]\n              }\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"issuer\": {\n            \"$ref\": \"#/components/schemas/connect_account_reference\"\n          }\n        },\n        \"required\": [\"issuer\"],\n        \"title\": \"SubscriptionsResourceSubscriptionInvoiceSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account_tax_ids\", \"issuer\"]\n      },\n      \"subscriptions_trials_resource_end_behavior\": {\n        \"description\": \"Defines how a subscription behaves when a free trial ends.\",\n        \"properties\": {\n          \"missing_payment_method\": {\n            \"description\": \"Indicates how the subscription should change when the trial ends if the user did not provide a payment method.\",\n            \"enum\": [\"cancel\", \"create_invoice\", \"pause\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"missing_payment_method\"],\n        \"title\": \"SubscriptionsTrialsResourceEndBehavior\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"subscriptions_trials_resource_trial_settings\": {\n        \"description\": \"Configures how this subscription behaves during the trial period.\",\n        \"properties\": {\n          \"end_behavior\": {\n            \"$ref\": \"#/components/schemas/subscriptions_trials_resource_end_behavior\"\n          }\n        },\n        \"required\": [\"end_behavior\"],\n        \"title\": \"SubscriptionsTrialsResourceTrialSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"end_behavior\"]\n      },\n      \"tax.calculation\": {\n        \"description\": \"A Tax Calculation allows you to calculate the tax to collect from your customer.\\n\\nRelated guide: [Calculate tax in your custom payment flow](https://stripe.com/docs/tax/custom)\",\n        \"properties\": {\n          \"amount_total\": {\n            \"description\": \"Total amount after taxes in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"description\": \"The ID of an existing [Customer](https://stripe.com/docs/api/customers/object) used for the resource.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_details\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_customer_details\"\n          },\n          \"expires_at\": {\n            \"description\": \"Timestamp of date at which the tax calculation will expire.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the calculation.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line_items\": {\n            \"description\": \"The list of items the customer is purchasing.\",\n            \"nullable\": true,\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/tax.calculation_line_item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"pattern\": \"^/v1/tax/calculations/[^/]+/line_items\",\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"TaxProductResourceTaxCalculationLineItemList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax.calculation\"],\n            \"type\": \"string\"\n          },\n          \"ship_from_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_ship_from_details\"\n              }\n            ],\n            \"description\": \"The details of the ship from location, such as the address.\",\n            \"nullable\": true\n          },\n          \"shipping_cost\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_tax_calculation_shipping_cost\"\n              }\n            ],\n            \"description\": \"The shipping cost details for the calculation.\",\n            \"nullable\": true\n          },\n          \"tax_amount_exclusive\": {\n            \"description\": \"The amount of tax to be collected on top of the line item prices.\",\n            \"type\": \"integer\"\n          },\n          \"tax_amount_inclusive\": {\n            \"description\": \"The amount of tax already included in the line item prices.\",\n            \"type\": \"integer\"\n          },\n          \"tax_breakdown\": {\n            \"description\": \"Breakdown of individual tax amounts that add up to the total.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_product_resource_tax_breakdown\"\n            },\n            \"type\": \"array\"\n          },\n          \"tax_date\": {\n            \"description\": \"Timestamp of date at which the tax rules and rates in effect applies for the calculation.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount_total\",\n          \"currency\",\n          \"customer_details\",\n          \"livemode\",\n          \"object\",\n          \"tax_amount_exclusive\",\n          \"tax_amount_inclusive\",\n          \"tax_breakdown\",\n          \"tax_date\"\n        ],\n        \"title\": \"TaxProductResourceTaxCalculation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"customer_details\",\n          \"line_items\",\n          \"ship_from_details\",\n          \"shipping_cost\",\n          \"tax_breakdown\"\n        ],\n        \"x-resourceId\": \"tax.calculation\"\n      },\n      \"tax.calculation_line_item\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The line item amount in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). If `tax_behavior=inclusive`, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount.\",\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"The amount of tax calculated for this line item, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax.calculation_line_item\"],\n            \"type\": \"string\"\n          },\n          \"product\": {\n            \"description\": \"The ID of an existing [Product](https://stripe.com/docs/api/products/object).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"quantity\": {\n            \"description\": \"The number of units of the item being purchased. For reversals, this is the quantity reversed.\",\n            \"type\": \"integer\"\n          },\n          \"reference\": {\n            \"description\": \"A custom identifier for this line item.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_behavior\": {\n            \"description\": \"Specifies whether the `amount` includes taxes. If `tax_behavior=inclusive`, then the amount includes taxes.\",\n            \"enum\": [\"exclusive\", \"inclusive\"],\n            \"type\": \"string\"\n          },\n          \"tax_breakdown\": {\n            \"description\": \"Detailed account of taxes relevant to this line item.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_product_resource_line_item_tax_breakdown\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"tax_code\": {\n            \"description\": \"The [tax code](https://stripe.com/docs/tax/tax-categories) ID used for this resource.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"amount_tax\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"quantity\",\n          \"tax_behavior\",\n          \"tax_code\"\n        ],\n        \"title\": \"TaxProductResourceTaxCalculationLineItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tax_breakdown\"],\n        \"x-resourceId\": \"tax.calculation_line_item\"\n      },\n      \"tax.registration\": {\n        \"description\": \"A Tax `Registration` lets us know that your business is registered to collect tax on payments within a region, enabling you to [automatically collect tax](https://stripe.com/docs/tax).\\n\\nStripe doesn't register on your behalf with the relevant authorities when you create a Tax `Registration` object. For more information on how to register to collect tax, see [our guide](https://stripe.com/docs/tax/registering).\\n\\nRelated guide: [Using the Registrations API](https://stripe.com/docs/tax/registrations-api)\",\n        \"properties\": {\n          \"active_from\": {\n            \"description\": \"Time at which the registration becomes active. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"country_options\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"expires_at\": {\n            \"description\": \"If set, the registration stops being active at this time. If not set, the registration will be active indefinitely. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax.registration\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the registration. This field is present for convenience and can be deduced from `active_from` and `expires_at`.\",\n            \"enum\": [\"active\", \"expired\", \"scheduled\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"active_from\",\n          \"country\",\n          \"country_options\",\n          \"created\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\"\n        ],\n        \"title\": \"TaxProductRegistrationsResourceTaxRegistration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"country_options\"],\n        \"x-resourceId\": \"tax.registration\"\n      },\n      \"tax.settings\": {\n        \"description\": \"You can use Tax `Settings` to manage configurations used by Stripe Tax calculations.\\n\\nRelated guide: [Using the Settings API](https://stripe.com/docs/tax/settings-api)\",\n        \"properties\": {\n          \"defaults\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_tax_settings_defaults\"\n          },\n          \"head_office\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_tax_settings_head_office\"\n              }\n            ],\n            \"description\": \"The place where your business is located.\",\n            \"nullable\": true\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax.settings\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the Tax `Settings`.\",\n            \"enum\": [\"active\", \"pending\"],\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_tax_settings_status_details\"\n          }\n        },\n        \"required\": [\n          \"defaults\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"status_details\"\n        ],\n        \"title\": \"TaxProductResourceTaxSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"defaults\", \"head_office\", \"status_details\"],\n        \"x-resourceId\": \"tax.settings\"\n      },\n      \"tax.transaction\": {\n        \"description\": \"A Tax Transaction records the tax collected from or refunded to your customer.\\n\\nRelated guide: [Calculate tax in your custom payment flow](https://stripe.com/docs/tax/custom#tax-transaction)\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"description\": \"The ID of an existing [Customer](https://stripe.com/docs/api/customers/object) used for the resource.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"customer_details\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_customer_details\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the transaction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"line_items\": {\n            \"description\": \"The tax collected or refunded, by line item.\",\n            \"nullable\": true,\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/tax.transaction_line_item\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"pattern\": \"^/v1/tax/transactions/[^/]+/line_items\",\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"TaxProductResourceTaxTransactionLineItemList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax.transaction\"],\n            \"type\": \"string\"\n          },\n          \"posted_at\": {\n            \"description\": \"The Unix timestamp representing when the tax liability is assumed or reduced.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"reference\": {\n            \"description\": \"A custom unique identifier, such as 'myOrder_123'.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"reversal\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_tax_transaction_resource_reversal\"\n              }\n            ],\n            \"description\": \"If `type=reversal`, contains information about what was reversed.\",\n            \"nullable\": true\n          },\n          \"ship_from_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_ship_from_details\"\n              }\n            ],\n            \"description\": \"The details of the ship from location, such as the address.\",\n            \"nullable\": true\n          },\n          \"shipping_cost\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_tax_transaction_shipping_cost\"\n              }\n            ],\n            \"description\": \"The shipping cost details for the transaction.\",\n            \"nullable\": true\n          },\n          \"tax_date\": {\n            \"description\": \"Timestamp of date at which the tax rules and rates in effect applies for the calculation.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"type\": {\n            \"description\": \"If `reversal`, this transaction reverses an earlier transaction.\",\n            \"enum\": [\"reversal\", \"transaction\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"currency\",\n          \"customer_details\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"posted_at\",\n          \"reference\",\n          \"tax_date\",\n          \"type\"\n        ],\n        \"title\": \"TaxProductResourceTaxTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"customer_details\",\n          \"line_items\",\n          \"reversal\",\n          \"ship_from_details\",\n          \"shipping_cost\"\n        ],\n        \"x-resourceId\": \"tax.transaction\"\n      },\n      \"tax.transaction_line_item\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The line item amount in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). If `tax_behavior=inclusive`, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount.\",\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"The amount of tax calculated for this line item, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax.transaction_line_item\"],\n            \"type\": \"string\"\n          },\n          \"product\": {\n            \"description\": \"The ID of an existing [Product](https://stripe.com/docs/api/products/object).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"quantity\": {\n            \"description\": \"The number of units of the item being purchased. For reversals, this is the quantity reversed.\",\n            \"type\": \"integer\"\n          },\n          \"reference\": {\n            \"description\": \"A custom identifier for this line item in the transaction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"reversal\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_tax_transaction_line_item_resource_reversal\"\n              }\n            ],\n            \"description\": \"If `type=reversal`, contains information about what was reversed.\",\n            \"nullable\": true\n          },\n          \"tax_behavior\": {\n            \"description\": \"Specifies whether the `amount` includes taxes. If `tax_behavior=inclusive`, then the amount includes taxes.\",\n            \"enum\": [\"exclusive\", \"inclusive\"],\n            \"type\": \"string\"\n          },\n          \"tax_code\": {\n            \"description\": \"The [tax code](https://stripe.com/docs/tax/tax-categories) ID used for this resource.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"If `reversal`, this line item reverses an earlier transaction.\",\n            \"enum\": [\"reversal\", \"transaction\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"amount_tax\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"quantity\",\n          \"reference\",\n          \"tax_behavior\",\n          \"tax_code\",\n          \"type\"\n        ],\n        \"title\": \"TaxProductResourceTaxTransactionLineItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"reversal\"],\n        \"x-resourceId\": \"tax.transaction_line_item\"\n      },\n      \"tax_code\": {\n        \"description\": \"[Tax codes](https://stripe.com/docs/tax/tax-categories) classify goods and services for tax purposes.\",\n        \"properties\": {\n          \"description\": {\n            \"description\": \"A detailed description of which types of products the tax code represents.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"A short name for the tax code.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax_code\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"description\", \"id\", \"name\", \"object\"],\n        \"title\": \"TaxProductResourceTaxCode\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"tax_code\"\n      },\n      \"tax_deducted_at_source\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax_deducted_at_source\"],\n            \"type\": \"string\"\n          },\n          \"period_end\": {\n            \"description\": \"The end of the invoicing period. This TDS applies to Stripe fees collected during this invoicing period.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"period_start\": {\n            \"description\": \"The start of the invoicing period. This TDS applies to Stripe fees collected during this invoicing period.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"tax_deduction_account_number\": {\n            \"description\": \"The TAN that was supplied to Stripe when TDS was assessed\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"object\",\n          \"period_end\",\n          \"period_start\",\n          \"tax_deduction_account_number\"\n        ],\n        \"title\": \"TaxDeductedAtSource\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_i_ds_owner\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"account\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account being referenced when `type` is `account`.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"application\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/application\"\n              }\n            ],\n            \"description\": \"The Connect Application being referenced when `type` is `application`.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/application\"\n                }\n              ]\n            }\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"The customer being referenced when `type` is `customer`.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"Type of owner referenced.\",\n            \"enum\": [\"account\", \"application\", \"customer\", \"self\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TaxIDsOwner\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"account\", \"application\", \"customer\"]\n      },\n      \"tax_id\": {\n        \"description\": \"You can add one or multiple tax IDs to a [customer](https://stripe.com/docs/api/customers) or account.\\nCustomer and account tax IDs get displayed on related invoices and credit notes.\\n\\nRelated guides: [Customer tax identification numbers](https://stripe.com/docs/billing/taxes/tax-ids), [Account tax IDs](https://stripe.com/docs/invoicing/connect#account-tax-ids)\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"Two-letter ISO code representing the country of the tax ID.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"ID of the customer.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax_id\"],\n            \"type\": \"string\"\n          },\n          \"owner\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_i_ds_owner\"\n              }\n            ],\n            \"description\": \"The account or customer the tax ID belongs to.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"Type of the tax ID, one of `ad_nrt`, `ae_trn`, `al_tin`, `am_tin`, `ao_tin`, `ar_cuit`, `au_abn`, `au_arn`, `ba_tin`, `bb_tin`, `bg_uic`, `bh_vat`, `bo_tin`, `br_cnpj`, `br_cpf`, `bs_tin`, `by_tin`, `ca_bn`, `ca_gst_hst`, `ca_pst_bc`, `ca_pst_mb`, `ca_pst_sk`, `ca_qst`, `cd_nif`, `ch_uid`, `ch_vat`, `cl_tin`, `cn_tin`, `co_nit`, `cr_tin`, `de_stn`, `do_rcn`, `ec_ruc`, `eg_tin`, `es_cif`, `eu_oss_vat`, `eu_vat`, `gb_vat`, `ge_vat`, `gn_nif`, `hk_br`, `hr_oib`, `hu_tin`, `id_npwp`, `il_vat`, `in_gst`, `is_vat`, `jp_cn`, `jp_rn`, `jp_trn`, `ke_pin`, `kh_tin`, `kr_brn`, `kz_bin`, `li_uid`, `li_vat`, `ma_vat`, `md_vat`, `me_pib`, `mk_vat`, `mr_nif`, `mx_rfc`, `my_frp`, `my_itn`, `my_sst`, `ng_tin`, `no_vat`, `no_voec`, `np_pan`, `nz_gst`, `om_vat`, `pe_ruc`, `ph_tin`, `ro_tin`, `rs_pib`, `ru_inn`, `ru_kpp`, `sa_vat`, `sg_gst`, `sg_uen`, `si_tin`, `sn_ninea`, `sr_fin`, `sv_nit`, `th_vat`, `tj_tin`, `tr_tin`, `tw_vat`, `tz_vat`, `ua_vat`, `ug_tin`, `us_ein`, `uy_ruc`, `uz_tin`, `uz_vat`, `ve_rif`, `vn_tin`, `za_vat`, `zm_tin`, or `zw_tin`. Note that some legacy tax IDs have type `unknown`\",\n            \"enum\": [\n              \"ad_nrt\",\n              \"ae_trn\",\n              \"al_tin\",\n              \"am_tin\",\n              \"ao_tin\",\n              \"ar_cuit\",\n              \"au_abn\",\n              \"au_arn\",\n              \"ba_tin\",\n              \"bb_tin\",\n              \"bg_uic\",\n              \"bh_vat\",\n              \"bo_tin\",\n              \"br_cnpj\",\n              \"br_cpf\",\n              \"bs_tin\",\n              \"by_tin\",\n              \"ca_bn\",\n              \"ca_gst_hst\",\n              \"ca_pst_bc\",\n              \"ca_pst_mb\",\n              \"ca_pst_sk\",\n              \"ca_qst\",\n              \"cd_nif\",\n              \"ch_uid\",\n              \"ch_vat\",\n              \"cl_tin\",\n              \"cn_tin\",\n              \"co_nit\",\n              \"cr_tin\",\n              \"de_stn\",\n              \"do_rcn\",\n              \"ec_ruc\",\n              \"eg_tin\",\n              \"es_cif\",\n              \"eu_oss_vat\",\n              \"eu_vat\",\n              \"gb_vat\",\n              \"ge_vat\",\n              \"gn_nif\",\n              \"hk_br\",\n              \"hr_oib\",\n              \"hu_tin\",\n              \"id_npwp\",\n              \"il_vat\",\n              \"in_gst\",\n              \"is_vat\",\n              \"jp_cn\",\n              \"jp_rn\",\n              \"jp_trn\",\n              \"ke_pin\",\n              \"kh_tin\",\n              \"kr_brn\",\n              \"kz_bin\",\n              \"li_uid\",\n              \"li_vat\",\n              \"ma_vat\",\n              \"md_vat\",\n              \"me_pib\",\n              \"mk_vat\",\n              \"mr_nif\",\n              \"mx_rfc\",\n              \"my_frp\",\n              \"my_itn\",\n              \"my_sst\",\n              \"ng_tin\",\n              \"no_vat\",\n              \"no_voec\",\n              \"np_pan\",\n              \"nz_gst\",\n              \"om_vat\",\n              \"pe_ruc\",\n              \"ph_tin\",\n              \"ro_tin\",\n              \"rs_pib\",\n              \"ru_inn\",\n              \"ru_kpp\",\n              \"sa_vat\",\n              \"sg_gst\",\n              \"sg_uen\",\n              \"si_tin\",\n              \"sn_ninea\",\n              \"sr_fin\",\n              \"sv_nit\",\n              \"th_vat\",\n              \"tj_tin\",\n              \"tr_tin\",\n              \"tw_vat\",\n              \"tz_vat\",\n              \"ua_vat\",\n              \"ug_tin\",\n              \"unknown\",\n              \"us_ein\",\n              \"uy_ruc\",\n              \"uz_tin\",\n              \"uz_vat\",\n              \"ve_rif\",\n              \"vn_tin\",\n              \"za_vat\",\n              \"zm_tin\",\n              \"zw_tin\"\n            ],\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"Value of the tax ID.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"verification\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_id_verification\"\n              }\n            ],\n            \"description\": \"Tax ID verification information.\",\n            \"nullable\": true\n          }\n        },\n        \"required\": [\"created\", \"id\", \"livemode\", \"object\", \"type\", \"value\"],\n        \"title\": \"tax_id\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"customer\", \"owner\", \"verification\"],\n        \"x-resourceId\": \"tax_id\"\n      },\n      \"tax_id_verification\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Verification status, one of `pending`, `verified`, `unverified`, or `unavailable`.\",\n            \"enum\": [\"pending\", \"unavailable\", \"unverified\", \"verified\"],\n            \"type\": \"string\"\n          },\n          \"verified_address\": {\n            \"description\": \"Verified address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"verified_name\": {\n            \"description\": \"Verified name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"tax_id_verification\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_registrations_resource_country_options\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"ae\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"al\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"am\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"ao\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"at\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"au\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"ba\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"bb\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"be\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"bg\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"bh\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"bs\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"by\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"ca\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_canada\"\n          },\n          \"cd\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"ch\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"cl\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"co\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"cr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"cy\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"cz\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"de\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"dk\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"ec\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"ee\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"eg\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"es\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"fi\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"fr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"gb\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"ge\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"gn\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"gr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"hr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"hu\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"id\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"ie\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"is\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"it\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"jp\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"ke\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"kh\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"kr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"kz\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"lt\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"lu\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"lv\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"ma\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"md\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"me\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"mk\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"mr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"mt\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"mx\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"my\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"ng\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"nl\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"no\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"np\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"nz\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"om\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"pe\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"pl\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"pt\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"ro\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"rs\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"ru\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"sa\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"se\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"sg\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"si\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"sk\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_europe\"\n          },\n          \"sn\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"sr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"th\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"tj\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"tr\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"tz\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"ug\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"us\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_united_states\"\n          },\n          \"uy\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"uz\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"vn\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"za\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          },\n          \"zm\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_simplified\"\n          },\n          \"zw\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_default\"\n          }\n        },\n        \"title\": \"TaxProductRegistrationsResourceCountryOptions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"ae\",\n          \"al\",\n          \"am\",\n          \"ao\",\n          \"at\",\n          \"au\",\n          \"ba\",\n          \"bb\",\n          \"be\",\n          \"bg\",\n          \"bh\",\n          \"bs\",\n          \"by\",\n          \"ca\",\n          \"cd\",\n          \"ch\",\n          \"cl\",\n          \"co\",\n          \"cr\",\n          \"cy\",\n          \"cz\",\n          \"de\",\n          \"dk\",\n          \"ec\",\n          \"ee\",\n          \"eg\",\n          \"es\",\n          \"fi\",\n          \"fr\",\n          \"gb\",\n          \"ge\",\n          \"gn\",\n          \"gr\",\n          \"hr\",\n          \"hu\",\n          \"id\",\n          \"ie\",\n          \"is\",\n          \"it\",\n          \"jp\",\n          \"ke\",\n          \"kh\",\n          \"kr\",\n          \"kz\",\n          \"lt\",\n          \"lu\",\n          \"lv\",\n          \"ma\",\n          \"md\",\n          \"me\",\n          \"mk\",\n          \"mr\",\n          \"mt\",\n          \"mx\",\n          \"my\",\n          \"ng\",\n          \"nl\",\n          \"no\",\n          \"np\",\n          \"nz\",\n          \"om\",\n          \"pe\",\n          \"pl\",\n          \"pt\",\n          \"ro\",\n          \"rs\",\n          \"ru\",\n          \"sa\",\n          \"se\",\n          \"sg\",\n          \"si\",\n          \"sk\",\n          \"sn\",\n          \"sr\",\n          \"th\",\n          \"tj\",\n          \"tr\",\n          \"tz\",\n          \"ug\",\n          \"us\",\n          \"uy\",\n          \"uz\",\n          \"vn\",\n          \"za\",\n          \"zm\",\n          \"zw\"\n        ]\n      },\n      \"tax_product_registrations_resource_country_options_ca_province_standard\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"province\": {\n            \"description\": \"Two-letter CA province code ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2)).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"province\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsCaProvinceStandard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_registrations_resource_country_options_canada\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"province_standard\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_ca_province_standard\"\n          },\n          \"type\": {\n            \"description\": \"Type of registration in Canada.\",\n            \"enum\": [\"province_standard\", \"simplified\", \"standard\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsCanada\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"province_standard\"]\n      },\n      \"tax_product_registrations_resource_country_options_default\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"Type of registration in `country`.\",\n            \"enum\": [\"standard\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsDefault\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_registrations_resource_country_options_eu_standard\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"place_of_supply_scheme\": {\n            \"description\": \"Place of supply scheme used in an EU standard registration.\",\n            \"enum\": [\"small_seller\", \"standard\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"place_of_supply_scheme\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsEuStandard\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_registrations_resource_country_options_europe\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"standard\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_eu_standard\"\n          },\n          \"type\": {\n            \"description\": \"Type of registration in an EU country.\",\n            \"enum\": [\"ioss\", \"oss_non_union\", \"oss_union\", \"standard\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsEurope\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"standard\"]\n      },\n      \"tax_product_registrations_resource_country_options_simplified\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"Type of registration in `country`.\",\n            \"enum\": [\"simplified\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsSimplified\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_registrations_resource_country_options_united_states\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"local_amusement_tax\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_us_local_amusement_tax\"\n          },\n          \"local_lease_tax\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_us_local_lease_tax\"\n          },\n          \"state\": {\n            \"description\": \"Two-letter US state code ([ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2)).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"state_sales_tax\": {\n            \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_us_state_sales_tax\"\n          },\n          \"type\": {\n            \"description\": \"Type of registration in the US.\",\n            \"enum\": [\n              \"local_amusement_tax\",\n              \"local_lease_tax\",\n              \"state_communications_tax\",\n              \"state_retail_delivery_fee\",\n              \"state_sales_tax\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"state\", \"type\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsUnitedStates\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"local_amusement_tax\",\n          \"local_lease_tax\",\n          \"state_sales_tax\"\n        ]\n      },\n      \"tax_product_registrations_resource_country_options_us_local_amusement_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"jurisdiction\": {\n            \"description\": \"A [FIPS code](https://www.census.gov/library/reference/code-lists/ansi.html) representing the local jurisdiction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"jurisdiction\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsUsLocalAmusementTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_registrations_resource_country_options_us_local_lease_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"jurisdiction\": {\n            \"description\": \"A [FIPS code](https://www.census.gov/library/reference/code-lists/ansi.html) representing the local jurisdiction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"jurisdiction\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsUsLocalLeaseTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_registrations_resource_country_options_us_state_sales_tax\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"elections\": {\n            \"description\": \"Elections for the state sales tax registration.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_product_registrations_resource_country_options_us_state_sales_tax_election\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsUsStateSalesTax\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"elections\"]\n      },\n      \"tax_product_registrations_resource_country_options_us_state_sales_tax_election\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"jurisdiction\": {\n            \"description\": \"A [FIPS code](https://www.census.gov/library/reference/code-lists/ansi.html) representing the local jurisdiction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"The type of the election for the state sales tax registration.\",\n            \"enum\": [\n              \"local_use_tax\",\n              \"simplified_sellers_use_tax\",\n              \"single_local_use_tax\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TaxProductRegistrationsResourceCountryOptionsUsStateSalesTaxElection\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_customer_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_postal_address\"\n              }\n            ],\n            \"description\": \"The customer's postal address (for example, home or business location).\",\n            \"nullable\": true\n          },\n          \"address_source\": {\n            \"description\": \"The type of customer address provided.\",\n            \"enum\": [\"billing\", \"shipping\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"ip_address\": {\n            \"description\": \"The customer's IP address (IPv4 or IPv6).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_ids\": {\n            \"description\": \"The customer's tax IDs (for example, EU VAT numbers).\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_product_resource_customer_details_resource_tax_id\"\n            },\n            \"type\": \"array\"\n          },\n          \"taxability_override\": {\n            \"description\": \"The taxability override used for taxation.\",\n            \"enum\": [\"customer_exempt\", \"none\", \"reverse_charge\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"tax_ids\", \"taxability_override\"],\n        \"title\": \"TaxProductResourceCustomerDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\", \"tax_ids\"]\n      },\n      \"tax_product_resource_customer_details_resource_tax_id\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"type\": {\n            \"description\": \"The type of the tax ID, one of `ad_nrt`, `ar_cuit`, `eu_vat`, `bo_tin`, `br_cnpj`, `br_cpf`, `cn_tin`, `co_nit`, `cr_tin`, `do_rcn`, `ec_ruc`, `eu_oss_vat`, `hr_oib`, `pe_ruc`, `ro_tin`, `rs_pib`, `sv_nit`, `uy_ruc`, `ve_rif`, `vn_tin`, `gb_vat`, `nz_gst`, `au_abn`, `au_arn`, `in_gst`, `no_vat`, `no_voec`, `za_vat`, `ch_vat`, `mx_rfc`, `sg_uen`, `ru_inn`, `ru_kpp`, `ca_bn`, `hk_br`, `es_cif`, `tw_vat`, `th_vat`, `jp_cn`, `jp_rn`, `jp_trn`, `li_uid`, `li_vat`, `my_itn`, `us_ein`, `kr_brn`, `ca_qst`, `ca_gst_hst`, `ca_pst_bc`, `ca_pst_mb`, `ca_pst_sk`, `my_sst`, `sg_gst`, `ae_trn`, `cl_tin`, `sa_vat`, `id_npwp`, `my_frp`, `il_vat`, `ge_vat`, `ua_vat`, `is_vat`, `bg_uic`, `hu_tin`, `si_tin`, `ke_pin`, `tr_tin`, `eg_tin`, `ph_tin`, `al_tin`, `bh_vat`, `kz_bin`, `ng_tin`, `om_vat`, `de_stn`, `ch_uid`, `tz_vat`, `uz_vat`, `uz_tin`, `md_vat`, `ma_vat`, `by_tin`, `ao_tin`, `bs_tin`, `bb_tin`, `cd_nif`, `mr_nif`, `me_pib`, `zw_tin`, `ba_tin`, `gn_nif`, `mk_vat`, `sr_fin`, `sn_ninea`, `am_tin`, `np_pan`, `tj_tin`, `ug_tin`, `zm_tin`, `kh_tin`, or `unknown`\",\n            \"enum\": [\n              \"ad_nrt\",\n              \"ae_trn\",\n              \"al_tin\",\n              \"am_tin\",\n              \"ao_tin\",\n              \"ar_cuit\",\n              \"au_abn\",\n              \"au_arn\",\n              \"ba_tin\",\n              \"bb_tin\",\n              \"bg_uic\",\n              \"bh_vat\",\n              \"bo_tin\",\n              \"br_cnpj\",\n              \"br_cpf\",\n              \"bs_tin\",\n              \"by_tin\",\n              \"ca_bn\",\n              \"ca_gst_hst\",\n              \"ca_pst_bc\",\n              \"ca_pst_mb\",\n              \"ca_pst_sk\",\n              \"ca_qst\",\n              \"cd_nif\",\n              \"ch_uid\",\n              \"ch_vat\",\n              \"cl_tin\",\n              \"cn_tin\",\n              \"co_nit\",\n              \"cr_tin\",\n              \"de_stn\",\n              \"do_rcn\",\n              \"ec_ruc\",\n              \"eg_tin\",\n              \"es_cif\",\n              \"eu_oss_vat\",\n              \"eu_vat\",\n              \"gb_vat\",\n              \"ge_vat\",\n              \"gn_nif\",\n              \"hk_br\",\n              \"hr_oib\",\n              \"hu_tin\",\n              \"id_npwp\",\n              \"il_vat\",\n              \"in_gst\",\n              \"is_vat\",\n              \"jp_cn\",\n              \"jp_rn\",\n              \"jp_trn\",\n              \"ke_pin\",\n              \"kh_tin\",\n              \"kr_brn\",\n              \"kz_bin\",\n              \"li_uid\",\n              \"li_vat\",\n              \"ma_vat\",\n              \"md_vat\",\n              \"me_pib\",\n              \"mk_vat\",\n              \"mr_nif\",\n              \"mx_rfc\",\n              \"my_frp\",\n              \"my_itn\",\n              \"my_sst\",\n              \"ng_tin\",\n              \"no_vat\",\n              \"no_voec\",\n              \"np_pan\",\n              \"nz_gst\",\n              \"om_vat\",\n              \"pe_ruc\",\n              \"ph_tin\",\n              \"ro_tin\",\n              \"rs_pib\",\n              \"ru_inn\",\n              \"ru_kpp\",\n              \"sa_vat\",\n              \"sg_gst\",\n              \"sg_uen\",\n              \"si_tin\",\n              \"sn_ninea\",\n              \"sr_fin\",\n              \"sv_nit\",\n              \"th_vat\",\n              \"tj_tin\",\n              \"tr_tin\",\n              \"tw_vat\",\n              \"tz_vat\",\n              \"ua_vat\",\n              \"ug_tin\",\n              \"unknown\",\n              \"us_ein\",\n              \"uy_ruc\",\n              \"uz_tin\",\n              \"uz_vat\",\n              \"ve_rif\",\n              \"vn_tin\",\n              \"za_vat\",\n              \"zm_tin\",\n              \"zw_tin\"\n            ],\n            \"type\": \"string\"\n          },\n          \"value\": {\n            \"description\": \"The value of the tax ID.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\", \"value\"],\n        \"title\": \"TaxProductResourceCustomerDetailsResourceTaxId\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_jurisdiction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"display_name\": {\n            \"description\": \"A human-readable name for the jurisdiction imposing the tax.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"level\": {\n            \"description\": \"Indicates the level of the jurisdiction imposing the tax.\",\n            \"enum\": [\"city\", \"country\", \"county\", \"district\", \"state\"],\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"[ISO 3166-2 subdivision code](https://en.wikipedia.org/wiki/ISO_3166-2), without country prefix. For example, \\\"NY\\\" for New York, United States.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"country\", \"display_name\", \"level\"],\n        \"title\": \"TaxProductResourceJurisdiction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_line_item_tax_breakdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount of tax, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"jurisdiction\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_jurisdiction\"\n          },\n          \"sourcing\": {\n            \"description\": \"Indicates whether the jurisdiction was determined by the origin (merchant's address) or destination (customer's address).\",\n            \"enum\": [\"destination\", \"origin\"],\n            \"type\": \"string\"\n          },\n          \"tax_rate_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_product_resource_line_item_tax_rate_details\"\n              }\n            ],\n            \"description\": \"Details regarding the rate for this tax. This field will be `null` when the tax is not imposed, for example if the product is exempt from tax.\",\n            \"nullable\": true\n          },\n          \"taxability_reason\": {\n            \"description\": \"The reasoning behind this tax, for example, if the product is tax exempt. The possible values for this field may be extended as new tax rules are supported.\",\n            \"enum\": [\n              \"customer_exempt\",\n              \"not_collecting\",\n              \"not_subject_to_tax\",\n              \"not_supported\",\n              \"portion_product_exempt\",\n              \"portion_reduced_rated\",\n              \"portion_standard_rated\",\n              \"product_exempt\",\n              \"product_exempt_holiday\",\n              \"proportionally_rated\",\n              \"reduced_rated\",\n              \"reverse_charge\",\n              \"standard_rated\",\n              \"taxable_basis_reduced\",\n              \"zero_rated\"\n            ],\n            \"type\": \"string\"\n          },\n          \"taxable_amount\": {\n            \"description\": \"The amount on which tax is calculated, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"jurisdiction\",\n          \"sourcing\",\n          \"taxability_reason\",\n          \"taxable_amount\"\n        ],\n        \"title\": \"TaxProductResourceLineItemTaxBreakdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"jurisdiction\", \"tax_rate_details\"]\n      },\n      \"tax_product_resource_line_item_tax_rate_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"display_name\": {\n            \"description\": \"A localized display name for tax type, intended to be human-readable. For example, \\\"Local Sales and Use Tax\\\", \\\"Value-added tax (VAT)\\\", or \\\"Umsatzsteuer (USt.)\\\".\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"percentage_decimal\": {\n            \"description\": \"The tax rate percentage as a string. For example, 8.5% is represented as \\\"8.5\\\".\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"tax_type\": {\n            \"description\": \"The tax type, such as `vat` or `sales_tax`.\",\n            \"enum\": [\n              \"amusement_tax\",\n              \"communications_tax\",\n              \"gst\",\n              \"hst\",\n              \"igst\",\n              \"jct\",\n              \"lease_tax\",\n              \"pst\",\n              \"qst\",\n              \"retail_delivery_fee\",\n              \"rst\",\n              \"sales_tax\",\n              \"service_tax\",\n              \"vat\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"display_name\", \"percentage_decimal\", \"tax_type\"],\n        \"title\": \"TaxProductResourceLineItemTaxRateDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_postal_address\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"city\": {\n            \"description\": \"City, district, suburb, town, or village.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"line1\": {\n            \"description\": \"Address line 1 (e.g., street, PO Box, or company name).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"line2\": {\n            \"description\": \"Address line 2 (e.g., apartment, suite, unit, or building).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"postal_code\": {\n            \"description\": \"ZIP or postal code.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"State/province as an [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) subdivision code, without country prefix. Example: \\\"NY\\\" or \\\"TX\\\".\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"country\"],\n        \"title\": \"TaxProductResourcePostalAddress\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_ship_from_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_postal_address\"\n          }\n        },\n        \"required\": [\"address\"],\n        \"title\": \"TaxProductResourceShipFromDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"tax_product_resource_tax_breakdown\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount of tax, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"inclusive\": {\n            \"description\": \"Specifies whether the tax amount is included in the line item amount.\",\n            \"type\": \"boolean\"\n          },\n          \"tax_rate_details\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_tax_rate_details\"\n          },\n          \"taxability_reason\": {\n            \"description\": \"The reasoning behind this tax, for example, if the product is tax exempt. We might extend the possible values for this field to support new tax rules.\",\n            \"enum\": [\n              \"customer_exempt\",\n              \"not_collecting\",\n              \"not_subject_to_tax\",\n              \"not_supported\",\n              \"portion_product_exempt\",\n              \"portion_reduced_rated\",\n              \"portion_standard_rated\",\n              \"product_exempt\",\n              \"product_exempt_holiday\",\n              \"proportionally_rated\",\n              \"reduced_rated\",\n              \"reverse_charge\",\n              \"standard_rated\",\n              \"taxable_basis_reduced\",\n              \"zero_rated\"\n            ],\n            \"type\": \"string\"\n          },\n          \"taxable_amount\": {\n            \"description\": \"The amount on which tax is calculated, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"inclusive\",\n          \"tax_rate_details\",\n          \"taxability_reason\",\n          \"taxable_amount\"\n        ],\n        \"title\": \"TaxProductResourceTaxBreakdown\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tax_rate_details\"]\n      },\n      \"tax_product_resource_tax_calculation_shipping_cost\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The shipping amount in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). If `tax_behavior=inclusive`, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount.\",\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"The amount of tax calculated for shipping, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"shipping_rate\": {\n            \"description\": \"The ID of an existing [ShippingRate](https://stripe.com/docs/api/shipping_rates/object).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"tax_behavior\": {\n            \"description\": \"Specifies whether the `amount` includes taxes. If `tax_behavior=inclusive`, then the amount includes taxes.\",\n            \"enum\": [\"exclusive\", \"inclusive\"],\n            \"type\": \"string\"\n          },\n          \"tax_breakdown\": {\n            \"description\": \"Detailed account of taxes relevant to shipping cost.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/tax_product_resource_line_item_tax_breakdown\"\n            },\n            \"type\": \"array\"\n          },\n          \"tax_code\": {\n            \"description\": \"The [tax code](https://stripe.com/docs/tax/tax-categories) ID used for shipping.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"amount_tax\", \"tax_behavior\", \"tax_code\"],\n        \"title\": \"TaxProductResourceTaxCalculationShippingCost\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tax_breakdown\"]\n      },\n      \"tax_product_resource_tax_rate_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"flat_amount\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_rate_flat_amount\"\n              }\n            ],\n            \"description\": \"The amount of the tax rate when the `rate_type` is `flat_amount`. Tax rates with `rate_type` `percentage` can vary based on the transaction, resulting in this field being `null`. This field exposes the amount and currency of the flat tax rate.\",\n            \"nullable\": true\n          },\n          \"percentage_decimal\": {\n            \"description\": \"The tax rate percentage as a string. For example, 8.5% is represented as `\\\"8.5\\\"`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"rate_type\": {\n            \"description\": \"Indicates the type of tax rate applied to the taxable amount. This value can be `null` when no tax applies to the location.\",\n            \"enum\": [\"flat_amount\", \"percentage\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"State, county, province, or region.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_type\": {\n            \"description\": \"The tax type, such as `vat` or `sales_tax`.\",\n            \"enum\": [\n              \"amusement_tax\",\n              \"communications_tax\",\n              \"gst\",\n              \"hst\",\n              \"igst\",\n              \"jct\",\n              \"lease_tax\",\n              \"pst\",\n              \"qst\",\n              \"retail_delivery_fee\",\n              \"rst\",\n              \"sales_tax\",\n              \"service_tax\",\n              \"vat\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"percentage_decimal\"],\n        \"title\": \"TaxProductResourceTaxRateDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"flat_amount\"]\n      },\n      \"tax_product_resource_tax_settings_defaults\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"tax_behavior\": {\n            \"description\": \"Default [tax behavior](https://stripe.com/docs/tax/products-prices-tax-categories-tax-behavior#tax-behavior) used to specify whether the price is considered inclusive of taxes or exclusive of taxes. If the item's price has a tax behavior set, it will take precedence over the default tax behavior.\",\n            \"enum\": [\"exclusive\", \"inclusive\", \"inferred_by_currency\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_code\": {\n            \"description\": \"Default [tax code](https://stripe.com/docs/tax/tax-categories) used to classify your products and prices.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TaxProductResourceTaxSettingsDefaults\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_tax_settings_head_office\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          }\n        },\n        \"required\": [\"address\"],\n        \"title\": \"TaxProductResourceTaxSettingsHeadOffice\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"tax_product_resource_tax_settings_status_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"active\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_tax_settings_status_details_resource_active\"\n          },\n          \"pending\": {\n            \"$ref\": \"#/components/schemas/tax_product_resource_tax_settings_status_details_resource_pending\"\n          }\n        },\n        \"title\": \"TaxProductResourceTaxSettingsStatusDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"active\", \"pending\"]\n      },\n      \"tax_product_resource_tax_settings_status_details_resource_active\": {\n        \"description\": \"\",\n        \"properties\": {},\n        \"title\": \"TaxProductResourceTaxSettingsStatusDetailsResourceActive\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_tax_settings_status_details_resource_pending\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"missing_fields\": {\n            \"description\": \"The list of missing fields that are required to perform calculations. It includes the entry `head_office` when the status is `pending`. It is recommended to set the optional values even if they aren't listed as required for calculating taxes. Calculations can fail if missing fields aren't explicitly provided on every call.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          }\n        },\n        \"title\": \"TaxProductResourceTaxSettingsStatusDetailsResourcePending\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_tax_transaction_line_item_resource_reversal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"original_line_item\": {\n            \"description\": \"The `id` of the line item to reverse in the original transaction.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"original_line_item\"],\n        \"title\": \"TaxProductResourceTaxTransactionLineItemResourceReversal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_tax_transaction_resource_reversal\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"original_transaction\": {\n            \"description\": \"The `id` of the reversed `Transaction` object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TaxProductResourceTaxTransactionResourceReversal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_product_resource_tax_transaction_shipping_cost\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The shipping amount in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). If `tax_behavior=inclusive`, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount.\",\n            \"type\": \"integer\"\n          },\n          \"amount_tax\": {\n            \"description\": \"The amount of tax calculated for shipping, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"shipping_rate\": {\n            \"description\": \"The ID of an existing [ShippingRate](https://stripe.com/docs/api/shipping_rates/object).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"tax_behavior\": {\n            \"description\": \"Specifies whether the `amount` includes taxes. If `tax_behavior=inclusive`, then the amount includes taxes.\",\n            \"enum\": [\"exclusive\", \"inclusive\"],\n            \"type\": \"string\"\n          },\n          \"tax_code\": {\n            \"description\": \"The [tax code](https://stripe.com/docs/tax/tax-categories) ID used for shipping.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"amount_tax\", \"tax_behavior\", \"tax_code\"],\n        \"title\": \"TaxProductResourceTaxTransactionShippingCost\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"tax_rate\": {\n        \"description\": \"Tax rates can be applied to [invoices](/invoicing/taxes/tax-rates), [subscriptions](/billing/taxes/tax-rates) and [Checkout Sessions](/payments/checkout/use-manual-tax-rates) to collect tax.\\n\\nRelated guide: [Tax rates](/billing/taxes/tax-rates)\",\n        \"properties\": {\n          \"active\": {\n            \"description\": \"Defaults to `true`. When set to `false`, this tax rate cannot be used with new applications or Checkout Sessions, but will still work for subscriptions and invoices that already have it set.\",\n            \"type\": \"boolean\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the tax rate for your internal use only. It will not be visible to your customers.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"display_name\": {\n            \"description\": \"The display name of the tax rates as it will appear to your customer on their receipt email, PDF, and the hosted invoice page.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"effective_percentage\": {\n            \"description\": \"Actual/effective tax rate percentage out of 100. For tax calculations with automatic_tax[enabled]=true,\\nthis percentage reflects the rate actually used to calculate tax based on the product's taxability\\nand whether the user is registered to collect taxes in the corresponding jurisdiction.\",\n            \"nullable\": true,\n            \"type\": \"number\"\n          },\n          \"flat_amount\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/tax_rate_flat_amount\"\n              }\n            ],\n            \"description\": \"The amount of the tax rate when the `rate_type` is `flat_amount`. Tax rates with `rate_type` `percentage` can vary based on the transaction, resulting in this field being `null`. This field exposes the amount and currency of the flat tax rate.\",\n            \"nullable\": true\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"inclusive\": {\n            \"description\": \"This specifies if the tax rate is inclusive or exclusive.\",\n            \"type\": \"boolean\"\n          },\n          \"jurisdiction\": {\n            \"description\": \"The jurisdiction for the tax rate. You can use this label field for tax reporting purposes. It also appears on your customer’s invoice.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"jurisdiction_level\": {\n            \"description\": \"The level of the jurisdiction that imposes this tax rate. Will be `null` for manually defined tax rates.\",\n            \"enum\": [\n              \"city\",\n              \"country\",\n              \"county\",\n              \"district\",\n              \"multiple\",\n              \"state\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"tax_rate\"],\n            \"type\": \"string\"\n          },\n          \"percentage\": {\n            \"description\": \"Tax rate percentage out of 100. For tax calculations with automatic_tax[enabled]=true, this percentage includes the statutory tax rate of non-taxable jurisdictions.\",\n            \"type\": \"number\"\n          },\n          \"rate_type\": {\n            \"description\": \"Indicates the type of tax rate applied to the taxable amount. This value can be `null` when no tax applies to the location.\",\n            \"enum\": [\"flat_amount\", \"percentage\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"description\": \"[ISO 3166-2 subdivision code](https://en.wikipedia.org/wiki/ISO_3166-2), without country prefix. For example, \\\"NY\\\" for New York, United States.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"tax_type\": {\n            \"description\": \"The high-level tax type, such as `vat` or `sales_tax`.\",\n            \"enum\": [\n              \"amusement_tax\",\n              \"communications_tax\",\n              \"gst\",\n              \"hst\",\n              \"igst\",\n              \"jct\",\n              \"lease_tax\",\n              \"pst\",\n              \"qst\",\n              \"retail_delivery_fee\",\n              \"rst\",\n              \"sales_tax\",\n              \"service_tax\",\n              \"vat\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\n          \"active\",\n          \"created\",\n          \"display_name\",\n          \"id\",\n          \"inclusive\",\n          \"livemode\",\n          \"object\",\n          \"percentage\"\n        ],\n        \"title\": \"TaxRate\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"flat_amount\"],\n        \"x-resourceId\": \"tax_rate\"\n      },\n      \"tax_rate_flat_amount\": {\n        \"description\": \"The amount of the tax rate when the `rate_type`` is `flat_amount`. Tax rates with `rate_type` `percentage` can vary based on the transaction, resulting in this field being `null`. This field exposes the amount and currency of the flat tax rate.\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount of the tax when the `rate_type` is `flat_amount`. This positive integer represents how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99).\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter ISO currency code, in lowercase.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"amount\", \"currency\"],\n        \"title\": \"TaxRateFlatAmount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"terminal.configuration\": {\n        \"description\": \"A Configurations object represents how features should be configured for terminal readers.\",\n        \"properties\": {\n          \"bbpos_wisepos_e\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_device_type_specific_config\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"is_account_default\": {\n            \"description\": \"Whether this Configuration is the default for your account\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"name\": {\n            \"description\": \"String indicating the name of the Configuration object, set by the user\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"terminal.configuration\"],\n            \"type\": \"string\"\n          },\n          \"offline\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_offline_config\"\n          },\n          \"reboot_window\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_reboot_window\"\n          },\n          \"stripe_s700\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_device_type_specific_config\"\n          },\n          \"tipping\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_tipping\"\n          },\n          \"verifone_p400\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_device_type_specific_config\"\n          }\n        },\n        \"required\": [\"id\", \"livemode\", \"object\"],\n        \"title\": \"TerminalConfigurationConfiguration\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"bbpos_wisepos_e\",\n          \"offline\",\n          \"reboot_window\",\n          \"stripe_s700\",\n          \"tipping\",\n          \"verifone_p400\"\n        ],\n        \"x-resourceId\": \"terminal.configuration\"\n      },\n      \"terminal.connection_token\": {\n        \"description\": \"A Connection Token is used by the Stripe Terminal SDK to connect to a reader.\\n\\nRelated guide: [Fleet management](https://stripe.com/docs/terminal/fleet/locations)\",\n        \"properties\": {\n          \"location\": {\n            \"description\": \"The id of the location that this connection token is scoped to. Note that location scoping only applies to internet-connected readers. For more details, see [the docs on scoping connection tokens](https://docs.stripe.com/terminal/fleet/locations-and-zones?dashboard-or-api=api#connection-tokens).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"terminal.connection_token\"],\n            \"type\": \"string\"\n          },\n          \"secret\": {\n            \"description\": \"Your application should pass this token to the Stripe Terminal SDK.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"secret\"],\n        \"title\": \"TerminalConnectionToken\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"terminal.connection_token\"\n      },\n      \"terminal.location\": {\n        \"description\": \"A Location represents a grouping of readers.\\n\\nRelated guide: [Fleet management](https://stripe.com/docs/terminal/fleet/locations)\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"configuration_overrides\": {\n            \"description\": \"The ID of a configuration that will be used to customize all readers in this location.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"display_name\": {\n            \"description\": \"The display name of the location.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"terminal.location\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"address\",\n          \"display_name\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\"\n        ],\n        \"title\": \"TerminalLocationLocation\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"],\n        \"x-resourceId\": \"terminal.location\"\n      },\n      \"terminal.reader\": {\n        \"description\": \"A Reader represents a physical device for accepting payment details.\\n\\nRelated guide: [Connecting to a reader](https://stripe.com/docs/terminal/payments/connect-reader)\",\n        \"properties\": {\n          \"action\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_reader_action\"\n              }\n            ],\n            \"description\": \"The most recent action performed by the reader.\",\n            \"nullable\": true\n          },\n          \"device_sw_version\": {\n            \"description\": \"The current software version of the reader.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"device_type\": {\n            \"description\": \"Type of reader, one of `bbpos_wisepad3`, `stripe_m2`, `stripe_s700`, `bbpos_chipper2x`, `bbpos_wisepos_e`, `verifone_P400`, `simulated_wisepos_e`, or `mobile_phone_reader`.\",\n            \"enum\": [\n              \"bbpos_chipper2x\",\n              \"bbpos_wisepad3\",\n              \"bbpos_wisepos_e\",\n              \"mobile_phone_reader\",\n              \"simulated_wisepos_e\",\n              \"stripe_m2\",\n              \"stripe_s700\",\n              \"verifone_P400\"\n            ],\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"ip_address\": {\n            \"description\": \"The local IP address of the reader.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"label\": {\n            \"description\": \"Custom label given to the reader for easier identification.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"location\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/terminal.location\"\n              }\n            ],\n            \"description\": \"The location identifier of the reader.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/terminal.location\"\n                }\n              ]\n            }\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"terminal.reader\"],\n            \"type\": \"string\"\n          },\n          \"serial_number\": {\n            \"description\": \"Serial number of the reader.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The networking status of the reader. We do not recommend using this field in flows that may block taking payments.\",\n            \"enum\": [\"offline\", \"online\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"device_type\",\n          \"id\",\n          \"label\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"serial_number\"\n        ],\n        \"title\": \"TerminalReaderReader\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"action\", \"location\"],\n        \"x-resourceId\": \"terminal.reader\"\n      },\n      \"terminal_configuration_configuration_resource_currency_specific_config\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"fixed_amounts\": {\n            \"description\": \"Fixed amounts displayed when collecting a tip\",\n            \"items\": {\n              \"type\": \"integer\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"percentages\": {\n            \"description\": \"Percentages displayed when collecting a tip\",\n            \"items\": {\n              \"type\": \"integer\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"smart_tip_threshold\": {\n            \"description\": \"Below this amount, fixed amounts will be displayed; above it, percentages will be displayed\",\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TerminalConfigurationConfigurationResourceCurrencySpecificConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"terminal_configuration_configuration_resource_device_type_specific_config\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"splashscreen\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/file\"\n              }\n            ],\n            \"description\": \"A File ID representing an image you would like displayed on the reader.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              ]\n            }\n          }\n        },\n        \"title\": \"TerminalConfigurationConfigurationResourceDeviceTypeSpecificConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"splashscreen\"]\n      },\n      \"terminal_configuration_configuration_resource_offline_config\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"enabled\": {\n            \"description\": \"Determines whether to allow transactions to be collected while reader is offline. Defaults to false.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"TerminalConfigurationConfigurationResourceOfflineConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"terminal_configuration_configuration_resource_reboot_window\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"end_hour\": {\n            \"description\": \"Integer between 0 to 23 that represents the end hour of the reboot time window. The value must be different than the start_hour.\",\n            \"type\": \"integer\"\n          },\n          \"start_hour\": {\n            \"description\": \"Integer between 0 to 23 that represents the start hour of the reboot time window.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"end_hour\", \"start_hour\"],\n        \"title\": \"TerminalConfigurationConfigurationResourceRebootWindow\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"terminal_configuration_configuration_resource_tipping\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"aud\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"cad\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"chf\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"czk\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"dkk\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"eur\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"gbp\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"hkd\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"jpy\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"myr\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"nok\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"nzd\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"pln\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"sek\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"sgd\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          },\n          \"usd\": {\n            \"$ref\": \"#/components/schemas/terminal_configuration_configuration_resource_currency_specific_config\"\n          }\n        },\n        \"title\": \"TerminalConfigurationConfigurationResourceTipping\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"aud\",\n          \"cad\",\n          \"chf\",\n          \"czk\",\n          \"dkk\",\n          \"eur\",\n          \"gbp\",\n          \"hkd\",\n          \"jpy\",\n          \"myr\",\n          \"nok\",\n          \"nzd\",\n          \"pln\",\n          \"sek\",\n          \"sgd\",\n          \"usd\"\n        ]\n      },\n      \"terminal_reader_reader_resource_cart\": {\n        \"description\": \"Represents a cart to be displayed on the reader\",\n        \"properties\": {\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"line_items\": {\n            \"description\": \"List of line items in the cart.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_line_item\"\n            },\n            \"type\": \"array\"\n          },\n          \"tax\": {\n            \"description\": \"Tax amount for the entire cart. A positive integer in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"total\": {\n            \"description\": \"Total amount for the entire cart, including tax. A positive integer in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"currency\", \"line_items\", \"total\"],\n        \"title\": \"TerminalReaderReaderResourceCart\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"line_items\"]\n      },\n      \"terminal_reader_reader_resource_line_item\": {\n        \"description\": \"Represents a line item to be displayed on the reader\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount of the line item. A positive integer in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n            \"type\": \"integer\"\n          },\n          \"description\": {\n            \"description\": \"Description of the line item.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"quantity\": {\n            \"description\": \"The quantity of the line item.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"amount\", \"description\", \"quantity\"],\n        \"title\": \"TerminalReaderReaderResourceLineItem\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"terminal_reader_reader_resource_process_config\": {\n        \"description\": \"Represents a per-transaction override of a reader configuration\",\n        \"properties\": {\n          \"enable_customer_cancellation\": {\n            \"description\": \"Enable customer initiated cancellation when processing this payment.\",\n            \"type\": \"boolean\"\n          },\n          \"skip_tipping\": {\n            \"description\": \"Override showing a tipping selection screen on this transaction.\",\n            \"type\": \"boolean\"\n          },\n          \"tipping\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_tipping_config\"\n          }\n        },\n        \"title\": \"TerminalReaderReaderResourceProcessConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"tipping\"]\n      },\n      \"terminal_reader_reader_resource_process_payment_intent_action\": {\n        \"description\": \"Represents a reader action to process a payment intent\",\n        \"properties\": {\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"Most recent PaymentIntent processed by the reader.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"process_config\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_process_config\"\n          }\n        },\n        \"required\": [\"payment_intent\"],\n        \"title\": \"TerminalReaderReaderResourceProcessPaymentIntentAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"payment_intent\", \"process_config\"]\n      },\n      \"terminal_reader_reader_resource_process_setup_config\": {\n        \"description\": \"Represents a per-setup override of a reader configuration\",\n        \"properties\": {\n          \"enable_customer_cancellation\": {\n            \"description\": \"Enable customer initiated cancellation when processing this SetupIntent.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"TerminalReaderReaderResourceProcessSetupConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"terminal_reader_reader_resource_process_setup_intent_action\": {\n        \"description\": \"Represents a reader action to process a setup intent\",\n        \"properties\": {\n          \"generated_card\": {\n            \"description\": \"ID of a card PaymentMethod generated from the card_present PaymentMethod that may be attached to a Customer for future transactions. Only present if it was possible to generate a card PaymentMethod.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"process_config\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_process_setup_config\"\n          },\n          \"setup_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/setup_intent\"\n              }\n            ],\n            \"description\": \"Most recent SetupIntent processed by the reader.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"setup_intent\"],\n        \"title\": \"TerminalReaderReaderResourceProcessSetupIntentAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"process_config\", \"setup_intent\"]\n      },\n      \"terminal_reader_reader_resource_reader_action\": {\n        \"description\": \"Represents an action performed by the reader\",\n        \"properties\": {\n          \"failure_code\": {\n            \"description\": \"Failure code, only set if status is `failed`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"failure_message\": {\n            \"description\": \"Detailed failure message, only set if status is `failed`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"process_payment_intent\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_process_payment_intent_action\"\n          },\n          \"process_setup_intent\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_process_setup_intent_action\"\n          },\n          \"refund_payment\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_refund_payment_action\"\n          },\n          \"set_reader_display\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_set_reader_display_action\"\n          },\n          \"status\": {\n            \"description\": \"Status of the action performed by the reader.\",\n            \"enum\": [\"failed\", \"in_progress\", \"succeeded\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Type of action performed by the reader.\",\n            \"enum\": [\n              \"process_payment_intent\",\n              \"process_setup_intent\",\n              \"refund_payment\",\n              \"set_reader_display\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"status\", \"type\"],\n        \"title\": \"TerminalReaderReaderResourceReaderAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"process_payment_intent\",\n          \"process_setup_intent\",\n          \"refund_payment\",\n          \"set_reader_display\"\n        ]\n      },\n      \"terminal_reader_reader_resource_refund_payment_action\": {\n        \"description\": \"Represents a reader action to refund a payment\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount being refunded.\",\n            \"type\": \"integer\"\n          },\n          \"charge\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"Charge that is being refunded.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"payment_intent\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/payment_intent\"\n              }\n            ],\n            \"description\": \"Payment intent that is being refunded.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              ]\n            }\n          },\n          \"reason\": {\n            \"description\": \"The reason for the refund.\",\n            \"enum\": [\"duplicate\", \"fraudulent\", \"requested_by_customer\"],\n            \"type\": \"string\"\n          },\n          \"refund\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/refund\"\n              }\n            ],\n            \"description\": \"Unique identifier for the refund object.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              ]\n            }\n          },\n          \"refund_application_fee\": {\n            \"description\": \"Boolean indicating whether the application fee should be refunded when refunding this charge. If a full charge refund is given, the full application fee will be refunded. Otherwise, the application fee will be refunded in an amount proportional to the amount of the charge refunded. An application fee can be refunded only by the application that created the charge.\",\n            \"type\": \"boolean\"\n          },\n          \"refund_payment_config\": {\n            \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_refund_payment_config\"\n          },\n          \"reverse_transfer\": {\n            \"description\": \"Boolean indicating whether the transfer should be reversed when refunding this charge. The transfer will be reversed proportionally to the amount being refunded (either the entire or partial amount). A transfer can be reversed only by the application that created the charge.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"TerminalReaderReaderResourceRefundPaymentAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"charge\",\n          \"payment_intent\",\n          \"refund\",\n          \"refund_payment_config\"\n        ]\n      },\n      \"terminal_reader_reader_resource_refund_payment_config\": {\n        \"description\": \"Represents a per-transaction override of a reader configuration\",\n        \"properties\": {\n          \"enable_customer_cancellation\": {\n            \"description\": \"Enable customer initiated cancellation when refunding this payment.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"title\": \"TerminalReaderReaderResourceRefundPaymentConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"terminal_reader_reader_resource_set_reader_display_action\": {\n        \"description\": \"Represents a reader action to set the reader display\",\n        \"properties\": {\n          \"cart\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/terminal_reader_reader_resource_cart\"\n              }\n            ],\n            \"description\": \"Cart object to be displayed by the reader.\",\n            \"nullable\": true\n          },\n          \"type\": {\n            \"description\": \"Type of information to be displayed by the reader.\",\n            \"enum\": [\"cart\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TerminalReaderReaderResourceSetReaderDisplayAction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"cart\"]\n      },\n      \"terminal_reader_reader_resource_tipping_config\": {\n        \"description\": \"Represents a per-transaction tipping configuration\",\n        \"properties\": {\n          \"amount_eligible\": {\n            \"description\": \"Amount used to calculate tip suggestions on tipping selection screen for this transaction. Must be a positive integer in the smallest currency unit (e.g., 100 cents to represent $1.00 or 100 to represent ¥100, a zero-decimal currency).\",\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TerminalReaderReaderResourceTippingConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"test_helpers.test_clock\": {\n        \"description\": \"A test clock enables deterministic control over objects in testmode. With a test clock, you can create\\nobjects at a frozen time in the past or future, and advance to a specific future time to observe webhooks and state changes. After the clock advances,\\nyou can either validate the current state of your scenario (and test your assumptions), change the current state of your scenario (and test more complex scenarios), or keep advancing forward in time.\",\n        \"properties\": {\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"deletes_after\": {\n            \"description\": \"Time at which this clock is scheduled to auto delete.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"frozen_time\": {\n            \"description\": \"Time at which all objects belonging to this clock are frozen.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"name\": {\n            \"description\": \"The custom name supplied at creation.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"test_helpers.test_clock\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the Test Clock.\",\n            \"enum\": [\"advancing\", \"internal_failure\", \"ready\"],\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"$ref\": \"#/components/schemas/billing_clocks_resource_status_details_status_details\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"deletes_after\",\n          \"frozen_time\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"status_details\"\n        ],\n        \"title\": \"TestClock\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_details\"],\n        \"x-resourceId\": \"test_helpers.test_clock\"\n      },\n      \"three_d_secure_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"authentication_flow\": {\n            \"description\": \"For authenticated transactions: how the customer was authenticated by\\nthe issuing bank.\",\n            \"enum\": [\"challenge\", \"frictionless\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"electronic_commerce_indicator\": {\n            \"description\": \"The Electronic Commerce Indicator (ECI). A protocol-level field\\nindicating what degree of authentication was performed.\",\n            \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"result\": {\n            \"description\": \"Indicates the outcome of 3D Secure authentication.\",\n            \"enum\": [\n              \"attempt_acknowledged\",\n              \"authenticated\",\n              \"exempted\",\n              \"failed\",\n              \"not_supported\",\n              \"processing_error\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"result_reason\": {\n            \"description\": \"Additional information about why 3D Secure succeeded or failed based\\non the `result`.\",\n            \"enum\": [\n              \"abandoned\",\n              \"bypassed\",\n              \"canceled\",\n              \"card_not_enrolled\",\n              \"network_not_supported\",\n              \"protocol_error\",\n              \"rejected\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_id\": {\n            \"description\": \"The 3D Secure 1 XID or 3D Secure 2 Directory Server Transaction ID\\n(dsTransId) for this payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"version\": {\n            \"description\": \"The version of 3D Secure that was used.\",\n            \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"three_d_secure_details\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"three_d_secure_details_charge\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"authentication_flow\": {\n            \"description\": \"For authenticated transactions: how the customer was authenticated by\\nthe issuing bank.\",\n            \"enum\": [\"challenge\", \"frictionless\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"electronic_commerce_indicator\": {\n            \"description\": \"The Electronic Commerce Indicator (ECI). A protocol-level field\\nindicating what degree of authentication was performed.\",\n            \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"exemption_indicator\": {\n            \"description\": \"The exemption requested via 3DS and accepted by the issuer at authentication time.\",\n            \"enum\": [\"low_risk\", \"none\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"exemption_indicator_applied\": {\n            \"description\": \"Whether Stripe requested the value of `exemption_indicator` in the transaction. This will depend on\\nthe outcome of Stripe's internal risk assessment.\",\n            \"type\": \"boolean\"\n          },\n          \"result\": {\n            \"description\": \"Indicates the outcome of 3D Secure authentication.\",\n            \"enum\": [\n              \"attempt_acknowledged\",\n              \"authenticated\",\n              \"exempted\",\n              \"failed\",\n              \"not_supported\",\n              \"processing_error\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"result_reason\": {\n            \"description\": \"Additional information about why 3D Secure succeeded or failed based\\non the `result`.\",\n            \"enum\": [\n              \"abandoned\",\n              \"bypassed\",\n              \"canceled\",\n              \"card_not_enrolled\",\n              \"network_not_supported\",\n              \"protocol_error\",\n              \"rejected\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"transaction_id\": {\n            \"description\": \"The 3D Secure 1 XID or 3D Secure 2 Directory Server Transaction ID\\n(dsTransId) for this payment.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"version\": {\n            \"description\": \"The version of 3D Secure that was used.\",\n            \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"title\": \"three_d_secure_details_charge\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"three_d_secure_usage\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"supported\": {\n            \"description\": \"Whether 3D Secure is supported on this card.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"supported\"],\n        \"title\": \"three_d_secure_usage\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"thresholds_resource_usage_alert_filter\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"customer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/customer\"\n              }\n            ],\n            \"description\": \"Limit the scope of the alert to this customer ID\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"enum\": [\"customer\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"ThresholdsResourceUsageAlertFilter\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"customer\"]\n      },\n      \"thresholds_resource_usage_threshold_config\": {\n        \"description\": \"The usage threshold alert configuration enables setting up alerts for when a certain usage threshold on a specific meter is crossed.\",\n        \"properties\": {\n          \"filters\": {\n            \"description\": \"The filters allow limiting the scope of this usage alert. You can only specify up to one filter at this time.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/thresholds_resource_usage_alert_filter\"\n            },\n            \"nullable\": true,\n            \"type\": \"array\"\n          },\n          \"gte\": {\n            \"description\": \"The value at which this alert will trigger.\",\n            \"type\": \"integer\"\n          },\n          \"meter\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/billing.meter\"\n              }\n            ],\n            \"description\": \"The [Billing Meter](/api/billing/meter) ID whose usage is monitored.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/billing.meter\"\n                }\n              ]\n            }\n          },\n          \"recurrence\": {\n            \"description\": \"Defines how the alert will behave.\",\n            \"enum\": [\"one_time\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"gte\", \"meter\", \"recurrence\"],\n        \"title\": \"ThresholdsResourceUsageThresholdConfig\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"filters\", \"meter\"]\n      },\n      \"token\": {\n        \"description\": \"Tokenization is the process Stripe uses to collect sensitive card or bank\\naccount details, or personally identifiable information (PII), directly from\\nyour customers in a secure manner. A token representing this information is\\nreturned to your server to use. Use our\\n[recommended payments integrations](https://stripe.com/docs/payments) to perform this process\\non the client-side. This guarantees that no sensitive card data touches your server,\\nand allows your integration to operate in a PCI-compliant way.\\n\\nIf you can't use client-side tokenization, you can also create tokens using\\nthe API with either your publishable or secret API key. If\\nyour integration uses this method, you're responsible for any PCI compliance\\nthat it might require, and you must keep your secret API key safe. Unlike with\\nclient-side tokenization, your customer's information isn't sent directly to\\nStripe, so we can't determine how it's handled or stored.\\n\\nYou can't store or use tokens more than once. To store card or bank account\\ninformation for later use, create [Customer](https://stripe.com/docs/api#customers)\\nobjects or [External accounts](/api#external_accounts).\\n[Radar](https://stripe.com/docs/radar), our integrated solution for automatic fraud protection,\\nperforms best with integrations that use client-side tokenization.\",\n        \"properties\": {\n          \"bank_account\": {\n            \"$ref\": \"#/components/schemas/bank_account\"\n          },\n          \"card\": {\n            \"$ref\": \"#/components/schemas/card\"\n          },\n          \"client_ip\": {\n            \"description\": \"IP address of the client that generates the token.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"token\"],\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Type of the token: `account`, `bank_account`, `card`, or `pii`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"used\": {\n            \"description\": \"Determines if you have already used this token (you can only use tokens once).\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"created\", \"id\", \"livemode\", \"object\", \"type\", \"used\"],\n        \"title\": \"Token\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"bank_account\", \"card\"],\n        \"x-resourceId\": \"token\"\n      },\n      \"token_card_networks\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"preferred\": {\n            \"description\": \"The preferred network for co-branded cards. Can be `cartes_bancaires`, `mastercard`, `visa` or `invalid_preference` if requested network is not valid for the card.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"token_card_networks\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"topup\": {\n        \"description\": \"To top up your Stripe balance, you create a top-up object. You can retrieve\\nindividual top-ups, as well as list all top-ups. Top-ups are identified by a\\nunique, random ID.\\n\\nRelated guide: [Topping up your platform account](https://stripe.com/docs/connect/top-ups)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount transferred.\",\n            \"type\": \"integer\"\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"ID of the balance transaction that describes the impact of this top-up on your account balance. May not be specified depending on status of top-up.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"expected_availability_date\": {\n            \"description\": \"Date the funds are expected to arrive in your Stripe account for payouts. This factors in delays like weekends or bank holidays. May not be specified depending on status of top-up.\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"failure_code\": {\n            \"description\": \"Error code explaining reason for top-up failure if available (see [the errors section](https://stripe.com/docs/api#errors) for a list of codes).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"failure_message\": {\n            \"description\": \"Message to user further explaining reason for top-up failure if available.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"topup\"],\n            \"type\": \"string\"\n          },\n          \"source\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/source\"\n              }\n            ],\n            \"description\": \"The source field is deprecated. It might not always be present in the API response.\",\n            \"nullable\": true\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Extra information about a top-up. This will appear on your source's bank statement. It must contain at least one letter.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the top-up is either `canceled`, `failed`, `pending`, `reversed`, or `succeeded`.\",\n            \"enum\": [\"canceled\", \"failed\", \"pending\", \"reversed\", \"succeeded\"],\n            \"type\": \"string\"\n          },\n          \"transfer_group\": {\n            \"description\": \"A string that identifies this top-up as part of a group.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"status\"\n        ],\n        \"title\": \"Topup\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"balance_transaction\", \"source\"],\n        \"x-resourceId\": \"topup\"\n      },\n      \"transfer\": {\n        \"description\": \"A `Transfer` object is created when you move funds between Stripe accounts as\\npart of Connect.\\n\\nBefore April 6, 2017, transfers also represented movement of funds from a\\nStripe account to a card or bank account. This behavior has since been split\\nout into a [Payout](https://stripe.com/docs/api#payout_object) object, with corresponding payout endpoints. For more\\ninformation, read about the\\n[transfer/payout split](https://stripe.com/docs/transfer-payout-split).\\n\\nRelated guide: [Creating separate charges and transfers](https://stripe.com/docs/connect/separate-charges-and-transfers)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount in cents (or local equivalent) to be transferred.\",\n            \"type\": \"integer\"\n          },\n          \"amount_reversed\": {\n            \"description\": \"Amount in cents (or local equivalent) reversed (can be less than the amount attribute on the transfer if a partial reversal was issued).\",\n            \"type\": \"integer\"\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"Balance transaction that describes the impact of this transfer on your account balance.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time that this record of the transfer was first created.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"ID of the Stripe account the transfer was sent to.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          },\n          \"destination_payment\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"If the destination is a Stripe account, this will be the ID of the payment that the destination account received for the transfer.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"transfer\"],\n            \"type\": \"string\"\n          },\n          \"reversals\": {\n            \"description\": \"A list of reversals that have been applied to the transfer.\",\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/transfer_reversal\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"TransferReversalList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"reversed\": {\n            \"description\": \"Whether the transfer has been fully reversed. If the transfer is only partially reversed, this attribute will still be false.\",\n            \"type\": \"boolean\"\n          },\n          \"source_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/charge\"\n              }\n            ],\n            \"description\": \"ID of the charge that was used to fund the transfer. If null, the transfer was funded from the available balance.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              ]\n            }\n          },\n          \"source_type\": {\n            \"description\": \"The source balance this transfer came from. One of `card`, `fpx`, or `bank_account`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"transfer_group\": {\n            \"description\": \"A string that identifies this transaction as part of a group. See the [Connect documentation](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-options) for details.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"amount_reversed\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"reversals\",\n          \"reversed\"\n        ],\n        \"title\": \"Transfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"balance_transaction\",\n          \"destination\",\n          \"destination_payment\",\n          \"reversals\",\n          \"source_transaction\"\n        ],\n        \"x-resourceId\": \"transfer\"\n      },\n      \"transfer_data\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"The amount transferred to the destination account. This transfer will occur automatically after the payment succeeds. If no amount is specified, by default the entire payment amount is transferred to the destination account.\\n The amount must be less than or equal to the [amount](https://stripe.com/docs/api/payment_intents/object#payment_intent_object-amount), and must be a positive integer\\n representing how much to transfer in the smallest currency unit (e.g., 100 cents to charge $1.00).\",\n            \"type\": \"integer\"\n          },\n          \"destination\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/account\"\n              }\n            ],\n            \"description\": \"The account (if any) that the payment is attributed to for tax reporting, and where funds from the payment are transferred to after payment success.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"destination\"],\n        \"title\": \"transfer_data\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"destination\"]\n      },\n      \"transfer_reversal\": {\n        \"description\": \"[Stripe Connect](https://stripe.com/docs/connect) platforms can reverse transfers made to a\\nconnected account, either entirely or partially, and can also specify whether\\nto refund any related application fees. Transfer reversals add to the\\nplatform's balance and subtract from the destination account's balance.\\n\\nReversing a transfer that was made for a [destination\\ncharge](/docs/connect/destination-charges) is allowed only up to the amount of\\nthe charge. It is possible to reverse a\\n[transfer_group](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-options)\\ntransfer only if the destination account has enough balance to cover the\\nreversal.\\n\\nRelated guide: [Reverse transfers](https://stripe.com/docs/connect/separate-charges-and-transfers#reverse-transfers)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount, in cents (or local equivalent).\",\n            \"type\": \"integer\"\n          },\n          \"balance_transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/balance_transaction\"\n              }\n            ],\n            \"description\": \"Balance transaction that describes the impact on your account balance.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              ]\n            }\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"destination_payment_refund\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/refund\"\n              }\n            ],\n            \"description\": \"Linked payment refund for the transfer reversal.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              ]\n            }\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"transfer_reversal\"],\n            \"type\": \"string\"\n          },\n          \"source_refund\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/refund\"\n              }\n            ],\n            \"description\": \"ID of the refund responsible for the transfer reversal.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              ]\n            }\n          },\n          \"transfer\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/transfer\"\n              }\n            ],\n            \"description\": \"ID of the transfer that was reversed.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/transfer\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"object\",\n          \"transfer\"\n        ],\n        \"title\": \"TransferReversal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"balance_transaction\",\n          \"destination_payment_refund\",\n          \"source_refund\",\n          \"transfer\"\n        ],\n        \"x-resourceId\": \"transfer_reversal\"\n      },\n      \"transfer_schedule\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"delay_days\": {\n            \"description\": \"The number of days charges for the account will be held before being paid out.\",\n            \"type\": \"integer\"\n          },\n          \"interval\": {\n            \"description\": \"How frequently funds will be paid out. One of `manual` (payouts only created via API call), `daily`, `weekly`, or `monthly`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"monthly_anchor\": {\n            \"description\": \"The day of the month funds will be paid out. Only shown if `interval` is monthly. Payouts scheduled between the 29th and 31st of the month are sent on the last day of shorter months.\",\n            \"type\": \"integer\"\n          },\n          \"weekly_anchor\": {\n            \"description\": \"The day of the week funds will be paid out, of the style 'monday', 'tuesday', etc. Only shown if `interval` is weekly.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"delay_days\", \"interval\"],\n        \"title\": \"TransferSchedule\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"transform_quantity\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"divide_by\": {\n            \"description\": \"Divide usage by this number.\",\n            \"type\": \"integer\"\n          },\n          \"round\": {\n            \"description\": \"After division, either round the result `up` or `down`.\",\n            \"enum\": [\"down\", \"up\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"divide_by\", \"round\"],\n        \"title\": \"TransformQuantity\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"transform_usage\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"divide_by\": {\n            \"description\": \"Divide usage by this number.\",\n            \"type\": \"integer\"\n          },\n          \"round\": {\n            \"description\": \"After division, either round the result `up` or `down`.\",\n            \"enum\": [\"down\", \"up\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"divide_by\", \"round\"],\n        \"title\": \"TransformUsage\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury.credit_reversal\": {\n        \"description\": \"You can reverse some [ReceivedCredits](https://stripe.com/docs/api#received_credits) depending on their network and source flow. Reversing a ReceivedCredit leads to the creation of a new object known as a CreditReversal.\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount to reverse funds from.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"hosted_regulatory_receipt_url\": {\n            \"description\": \"A [hosted transaction receipt](https://stripe.com/docs/treasury/moving-money/regulatory-receipts) URL that is provided when money movement is considered regulated under Stripe's money transmission licenses.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"network\": {\n            \"description\": \"The rails used to reverse the funds.\",\n            \"enum\": [\"ach\", \"stripe\"],\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.credit_reversal\"],\n            \"type\": \"string\"\n          },\n          \"received_credit\": {\n            \"description\": \"The ReceivedCredit being reversed.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of the CreditReversal\",\n            \"enum\": [\"canceled\", \"posted\", \"processing\"],\n            \"type\": \"string\"\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/treasury_received_credits_resource_status_transitions\"\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"financial_account\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"network\",\n          \"object\",\n          \"received_credit\",\n          \"status\",\n          \"status_transitions\"\n        ],\n        \"title\": \"TreasuryReceivedCreditsResourceCreditReversal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_transitions\", \"transaction\"],\n        \"x-resourceId\": \"treasury.credit_reversal\"\n      },\n      \"treasury.debit_reversal\": {\n        \"description\": \"You can reverse some [ReceivedDebits](https://stripe.com/docs/api#received_debits) depending on their network and source flow. Reversing a ReceivedDebit leads to the creation of a new object known as a DebitReversal.\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount to reverse funds from.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"hosted_regulatory_receipt_url\": {\n            \"description\": \"A [hosted transaction receipt](https://stripe.com/docs/treasury/moving-money/regulatory-receipts) URL that is provided when money movement is considered regulated under Stripe's money transmission licenses.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"linked_flows\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_received_debits_resource_debit_reversal_linked_flows\"\n              }\n            ],\n            \"description\": \"Other flows linked to a DebitReversal.\",\n            \"nullable\": true\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"network\": {\n            \"description\": \"The rails used to reverse the funds.\",\n            \"enum\": [\"ach\", \"card\"],\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.debit_reversal\"],\n            \"type\": \"string\"\n          },\n          \"received_debit\": {\n            \"description\": \"The ReceivedDebit being reversed.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of the DebitReversal\",\n            \"enum\": [\"failed\", \"processing\", \"succeeded\"],\n            \"type\": \"string\"\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/treasury_received_debits_resource_status_transitions\"\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"network\",\n          \"object\",\n          \"received_debit\",\n          \"status\",\n          \"status_transitions\"\n        ],\n        \"title\": \"TreasuryReceivedDebitsResourceDebitReversal\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"linked_flows\",\n          \"status_transitions\",\n          \"transaction\"\n        ],\n        \"x-resourceId\": \"treasury.debit_reversal\"\n      },\n      \"treasury.financial_account\": {\n        \"description\": \"Stripe Treasury provides users with a container for money called a FinancialAccount that is separate from their Payments balance.\\nFinancialAccounts serve as the source and destination of Treasury’s money movement APIs.\",\n        \"properties\": {\n          \"active_features\": {\n            \"description\": \"The array of paths to active Features in the Features hash.\",\n            \"items\": {\n              \"enum\": [\n                \"card_issuing\",\n                \"deposit_insurance\",\n                \"financial_addresses.aba\",\n                \"financial_addresses.aba.forwarding\",\n                \"inbound_transfers.ach\",\n                \"intra_stripe_flows\",\n                \"outbound_payments.ach\",\n                \"outbound_payments.us_domestic_wire\",\n                \"outbound_transfers.ach\",\n                \"outbound_transfers.us_domestic_wire\",\n                \"remote_deposit_capture\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"balance\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_balance\"\n          },\n          \"country\": {\n            \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"features\": {\n            \"$ref\": \"#/components/schemas/treasury.financial_account_features\"\n          },\n          \"financial_addresses\": {\n            \"description\": \"The set of credentials that resolve to a FinancialAccount.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_financial_address\"\n            },\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"is_default\": {\n            \"type\": \"boolean\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"nullable\": true,\n            \"type\": \"object\"\n          },\n          \"nickname\": {\n            \"description\": \"The nickname for the FinancialAccount.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.financial_account\"],\n            \"type\": \"string\"\n          },\n          \"pending_features\": {\n            \"description\": \"The array of paths to pending Features in the Features hash.\",\n            \"items\": {\n              \"enum\": [\n                \"card_issuing\",\n                \"deposit_insurance\",\n                \"financial_addresses.aba\",\n                \"financial_addresses.aba.forwarding\",\n                \"inbound_transfers.ach\",\n                \"intra_stripe_flows\",\n                \"outbound_payments.ach\",\n                \"outbound_payments.us_domestic_wire\",\n                \"outbound_transfers.ach\",\n                \"outbound_transfers.us_domestic_wire\",\n                \"remote_deposit_capture\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"platform_restrictions\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_platform_restrictions\"\n              }\n            ],\n            \"description\": \"The set of functionalities that the platform can restrict on the FinancialAccount.\",\n            \"nullable\": true\n          },\n          \"restricted_features\": {\n            \"description\": \"The array of paths to restricted Features in the Features hash.\",\n            \"items\": {\n              \"enum\": [\n                \"card_issuing\",\n                \"deposit_insurance\",\n                \"financial_addresses.aba\",\n                \"financial_addresses.aba.forwarding\",\n                \"inbound_transfers.ach\",\n                \"intra_stripe_flows\",\n                \"outbound_payments.ach\",\n                \"outbound_payments.us_domestic_wire\",\n                \"outbound_transfers.ach\",\n                \"outbound_transfers.us_domestic_wire\",\n                \"remote_deposit_capture\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"status\": {\n            \"description\": \"Status of this FinancialAccount.\",\n            \"enum\": [\"closed\", \"open\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"status_details\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_status_details\"\n          },\n          \"supported_currencies\": {\n            \"description\": \"The currencies the FinancialAccount can hold a balance in. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase.\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\n          \"balance\",\n          \"country\",\n          \"created\",\n          \"financial_addresses\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"status_details\",\n          \"supported_currencies\"\n        ],\n        \"title\": \"TreasuryFinancialAccountsResourceFinancialAccount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"balance\",\n          \"features\",\n          \"financial_addresses\",\n          \"platform_restrictions\",\n          \"status_details\"\n        ],\n        \"x-resourceId\": \"treasury.financial_account\"\n      },\n      \"treasury.financial_account_features\": {\n        \"description\": \"Encodes whether a FinancialAccount has access to a particular Feature, with a `status` enum and associated `status_details`.\\nStripe or the platform can control Features via the requested field.\",\n        \"properties\": {\n          \"card_issuing\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggle_settings\"\n          },\n          \"deposit_insurance\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggle_settings\"\n          },\n          \"financial_addresses\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_financial_addresses_features\"\n          },\n          \"inbound_transfers\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_inbound_transfers\"\n          },\n          \"intra_stripe_flows\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggle_settings\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.financial_account_features\"],\n            \"type\": \"string\"\n          },\n          \"outbound_payments\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_outbound_payments\"\n          },\n          \"outbound_transfers\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_outbound_transfers\"\n          }\n        },\n        \"required\": [\"object\"],\n        \"title\": \"TreasuryFinancialAccountsResourceFinancialAccountFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"card_issuing\",\n          \"deposit_insurance\",\n          \"financial_addresses\",\n          \"inbound_transfers\",\n          \"intra_stripe_flows\",\n          \"outbound_payments\",\n          \"outbound_transfers\"\n        ],\n        \"x-resourceId\": \"treasury.financial_account_features\"\n      },\n      \"treasury.inbound_transfer\": {\n        \"description\": \"Use [InboundTransfers](https://docs.stripe.com/docs/treasury/moving-money/financial-accounts/into/inbound-transfers) to add funds to your [FinancialAccount](https://stripe.com/docs/api#financial_accounts) via a PaymentMethod that is owned by you. The funds will be transferred via an ACH debit.\\n\\nRelated guide: [Moving money with Treasury using InboundTransfer objects](https://docs.stripe.com/docs/treasury/moving-money/financial-accounts/into/inbound-transfers)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"cancelable\": {\n            \"description\": \"Returns `true` if the InboundTransfer is able to be canceled.\",\n            \"type\": \"boolean\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"failure_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_inbound_transfers_resource_failure_details\"\n              }\n            ],\n            \"description\": \"Details about this InboundTransfer's failure. Only set when status is `failed`.\",\n            \"nullable\": true\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount that received the funds.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"hosted_regulatory_receipt_url\": {\n            \"description\": \"A [hosted transaction receipt](https://stripe.com/docs/treasury/moving-money/regulatory-receipts) URL that is provided when money movement is considered regulated under Stripe's money transmission licenses.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"linked_flows\": {\n            \"$ref\": \"#/components/schemas/treasury_inbound_transfers_resource_inbound_transfer_resource_linked_flows\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.inbound_transfer\"],\n            \"type\": \"string\"\n          },\n          \"origin_payment_method\": {\n            \"description\": \"The origin payment method to be debited for an InboundTransfer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"origin_payment_method_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/inbound_transfers\"\n              }\n            ],\n            \"description\": \"Details about the PaymentMethod for an InboundTransfer.\",\n            \"nullable\": true\n          },\n          \"returned\": {\n            \"description\": \"Returns `true` if the funds for an InboundTransfer were returned after the InboundTransfer went to the `succeeded` state.\",\n            \"nullable\": true,\n            \"type\": \"boolean\"\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Statement descriptor shown when funds are debited from the source. Not all payment networks support `statement_descriptor`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of the InboundTransfer: `processing`, `succeeded`, `failed`, and `canceled`. An InboundTransfer is `processing` if it is created and pending. The status changes to `succeeded` once the funds have been \\\"confirmed\\\" and a `transaction` is created and posted. The status changes to `failed` if the transfer fails.\",\n            \"enum\": [\"canceled\", \"failed\", \"processing\", \"succeeded\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/treasury_inbound_transfers_resource_inbound_transfer_resource_status_transitions\"\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"cancelable\",\n          \"created\",\n          \"currency\",\n          \"financial_account\",\n          \"id\",\n          \"linked_flows\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"statement_descriptor\",\n          \"status\",\n          \"status_transitions\"\n        ],\n        \"title\": \"TreasuryInboundTransfersResourceInboundTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"failure_details\",\n          \"linked_flows\",\n          \"origin_payment_method_details\",\n          \"status_transitions\",\n          \"transaction\"\n        ],\n        \"x-resourceId\": \"treasury.inbound_transfer\"\n      },\n      \"treasury.outbound_payment\": {\n        \"description\": \"Use [OutboundPayments](https://docs.stripe.com/docs/treasury/moving-money/financial-accounts/out-of/outbound-payments) to send funds to another party's external bank account or [FinancialAccount](https://stripe.com/docs/api#financial_accounts). To send money to an account belonging to the same user, use an [OutboundTransfer](https://stripe.com/docs/api#outbound_transfers).\\n\\nSimulate OutboundPayment state changes with the `/v1/test_helpers/treasury/outbound_payments` endpoints. These methods can only be called on test mode objects.\\n\\nRelated guide: [Moving money with Treasury using OutboundPayment objects](https://docs.stripe.com/docs/treasury/moving-money/financial-accounts/out-of/outbound-payments)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"cancelable\": {\n            \"description\": \"Returns `true` if the object can be canceled, and `false` otherwise.\",\n            \"type\": \"boolean\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"description\": \"ID of the [customer](https://stripe.com/docs/api/customers) to whom an OutboundPayment is sent.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"destination_payment_method\": {\n            \"description\": \"The PaymentMethod via which an OutboundPayment is sent. This field can be empty if the OutboundPayment was created using `destination_payment_method_data`.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"destination_payment_method_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/outbound_payments_payment_method_details\"\n              }\n            ],\n            \"description\": \"Details about the PaymentMethod for an OutboundPayment.\",\n            \"nullable\": true\n          },\n          \"end_user_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_outbound_payments_resource_outbound_payment_resource_end_user_details\"\n              }\n            ],\n            \"description\": \"Details about the end user.\",\n            \"nullable\": true\n          },\n          \"expected_arrival_date\": {\n            \"description\": \"The date when funds are expected to arrive in the destination account.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount that funds were pulled from.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"hosted_regulatory_receipt_url\": {\n            \"description\": \"A [hosted transaction receipt](https://stripe.com/docs/treasury/moving-money/regulatory-receipts) URL that is provided when money movement is considered regulated under Stripe's money transmission licenses.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.outbound_payment\"],\n            \"type\": \"string\"\n          },\n          \"returned_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_outbound_payments_resource_returned_status\"\n              }\n            ],\n            \"description\": \"Details about a returned OutboundPayment. Only set when the status is `returned`.\",\n            \"nullable\": true\n          },\n          \"statement_descriptor\": {\n            \"description\": \"The description that appears on the receiving end for an OutboundPayment (for example, bank statement for external bank transfer).\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Current status of the OutboundPayment: `processing`, `failed`, `posted`, `returned`, `canceled`. An OutboundPayment is `processing` if it has been created and is pending. The status changes to `posted` once the OutboundPayment has been \\\"confirmed\\\" and funds have left the account, or to `failed` or `canceled`. If an OutboundPayment fails to arrive at its destination, its status will change to `returned`.\",\n            \"enum\": [\"canceled\", \"failed\", \"posted\", \"processing\", \"returned\"],\n            \"type\": \"string\"\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/treasury_outbound_payments_resource_outbound_payment_resource_status_transitions\"\n          },\n          \"tracking_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_outbound_payments_resource_outbound_payment_resource_tracking_details\"\n              }\n            ],\n            \"description\": \"Details about network-specific tracking information if available.\",\n            \"nullable\": true\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"cancelable\",\n          \"created\",\n          \"currency\",\n          \"expected_arrival_date\",\n          \"financial_account\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"statement_descriptor\",\n          \"status\",\n          \"status_transitions\",\n          \"transaction\"\n        ],\n        \"title\": \"TreasuryOutboundPaymentsResourceOutboundPayment\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"destination_payment_method_details\",\n          \"end_user_details\",\n          \"returned_details\",\n          \"status_transitions\",\n          \"tracking_details\",\n          \"transaction\"\n        ],\n        \"x-resourceId\": \"treasury.outbound_payment\"\n      },\n      \"treasury.outbound_transfer\": {\n        \"description\": \"Use [OutboundTransfers](https://docs.stripe.com/docs/treasury/moving-money/financial-accounts/out-of/outbound-transfers) to transfer funds from a [FinancialAccount](https://stripe.com/docs/api#financial_accounts) to a PaymentMethod belonging to the same entity. To send funds to a different party, use [OutboundPayments](https://stripe.com/docs/api#outbound_payments) instead. You can send funds over ACH rails or through a domestic wire transfer to a user's own external bank account.\\n\\nSimulate OutboundTransfer state changes with the `/v1/test_helpers/treasury/outbound_transfers` endpoints. These methods can only be called on test mode objects.\\n\\nRelated guide: [Moving money with Treasury using OutboundTransfer objects](https://docs.stripe.com/docs/treasury/moving-money/financial-accounts/out-of/outbound-transfers)\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"cancelable\": {\n            \"description\": \"Returns `true` if the object can be canceled, and `false` otherwise.\",\n            \"type\": \"boolean\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"destination_payment_method\": {\n            \"description\": \"The PaymentMethod used as the payment instrument for an OutboundTransfer.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"destination_payment_method_details\": {\n            \"$ref\": \"#/components/schemas/outbound_transfers_payment_method_details\"\n          },\n          \"expected_arrival_date\": {\n            \"description\": \"The date when funds are expected to arrive in the destination account.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount that funds were pulled from.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"hosted_regulatory_receipt_url\": {\n            \"description\": \"A [hosted transaction receipt](https://stripe.com/docs/treasury/moving-money/regulatory-receipts) URL that is provided when money movement is considered regulated under Stripe's money transmission licenses.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.outbound_transfer\"],\n            \"type\": \"string\"\n          },\n          \"returned_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_outbound_transfers_resource_returned_details\"\n              }\n            ],\n            \"description\": \"Details about a returned OutboundTransfer. Only set when the status is `returned`.\",\n            \"nullable\": true\n          },\n          \"statement_descriptor\": {\n            \"description\": \"Information about the OutboundTransfer to be sent to the recipient account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Current status of the OutboundTransfer: `processing`, `failed`, `canceled`, `posted`, `returned`. An OutboundTransfer is `processing` if it has been created and is pending. The status changes to `posted` once the OutboundTransfer has been \\\"confirmed\\\" and funds have left the account, or to `failed` or `canceled`. If an OutboundTransfer fails to arrive at its destination, its status will change to `returned`.\",\n            \"enum\": [\"canceled\", \"failed\", \"posted\", \"processing\", \"returned\"],\n            \"type\": \"string\"\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/treasury_outbound_transfers_resource_status_transitions\"\n          },\n          \"tracking_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_outbound_transfers_resource_outbound_transfer_resource_tracking_details\"\n              }\n            ],\n            \"description\": \"Details about network-specific tracking information if available.\",\n            \"nullable\": true\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"cancelable\",\n          \"created\",\n          \"currency\",\n          \"destination_payment_method_details\",\n          \"expected_arrival_date\",\n          \"financial_account\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"statement_descriptor\",\n          \"status\",\n          \"status_transitions\",\n          \"transaction\"\n        ],\n        \"title\": \"TreasuryOutboundTransfersResourceOutboundTransfer\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"destination_payment_method_details\",\n          \"returned_details\",\n          \"status_transitions\",\n          \"tracking_details\",\n          \"transaction\"\n        ],\n        \"x-resourceId\": \"treasury.outbound_transfer\"\n      },\n      \"treasury.received_credit\": {\n        \"description\": \"ReceivedCredits represent funds sent to a [FinancialAccount](https://stripe.com/docs/api#financial_accounts) (for example, via ACH or wire). These money movements are not initiated from the FinancialAccount.\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"failure_code\": {\n            \"description\": \"Reason for the failure. A ReceivedCredit might fail because the receiving FinancialAccount is closed or frozen.\",\n            \"enum\": [\n              \"account_closed\",\n              \"account_frozen\",\n              \"international_transaction\",\n              \"other\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount that received the funds.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"hosted_regulatory_receipt_url\": {\n            \"description\": \"A [hosted transaction receipt](https://stripe.com/docs/treasury/moving-money/regulatory-receipts) URL that is provided when money movement is considered regulated under Stripe's money transmission licenses.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"initiating_payment_method_details\": {\n            \"$ref\": \"#/components/schemas/treasury_shared_resource_initiating_payment_method_details_initiating_payment_method_details\"\n          },\n          \"linked_flows\": {\n            \"$ref\": \"#/components/schemas/treasury_received_credits_resource_linked_flows\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"network\": {\n            \"description\": \"The rails used to send the funds.\",\n            \"enum\": [\"ach\", \"card\", \"stripe\", \"us_domestic_wire\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.received_credit\"],\n            \"type\": \"string\"\n          },\n          \"reversal_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_received_credits_resource_reversal_details\"\n              }\n            ],\n            \"description\": \"Details describing when a ReceivedCredit may be reversed.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"Status of the ReceivedCredit. ReceivedCredits are created either `succeeded` (approved) or `failed` (declined). If a ReceivedCredit is declined, the failure reason can be found in the `failure_code` field.\",\n            \"enum\": [\"failed\", \"succeeded\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"description\",\n          \"id\",\n          \"initiating_payment_method_details\",\n          \"linked_flows\",\n          \"livemode\",\n          \"network\",\n          \"object\",\n          \"status\"\n        ],\n        \"title\": \"TreasuryReceivedCreditsResourceReceivedCredit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"initiating_payment_method_details\",\n          \"linked_flows\",\n          \"reversal_details\",\n          \"transaction\"\n        ],\n        \"x-resourceId\": \"treasury.received_credit\"\n      },\n      \"treasury.received_debit\": {\n        \"description\": \"ReceivedDebits represent funds pulled from a [FinancialAccount](https://stripe.com/docs/api#financial_accounts). These are not initiated from the FinancialAccount.\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"failure_code\": {\n            \"description\": \"Reason for the failure. A ReceivedDebit might fail because the FinancialAccount doesn't have sufficient funds, is closed, or is frozen.\",\n            \"enum\": [\n              \"account_closed\",\n              \"account_frozen\",\n              \"insufficient_funds\",\n              \"international_transaction\",\n              \"other\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount that funds were pulled from.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"hosted_regulatory_receipt_url\": {\n            \"description\": \"A [hosted transaction receipt](https://stripe.com/docs/treasury/moving-money/regulatory-receipts) URL that is provided when money movement is considered regulated under Stripe's money transmission licenses.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"initiating_payment_method_details\": {\n            \"$ref\": \"#/components/schemas/treasury_shared_resource_initiating_payment_method_details_initiating_payment_method_details\"\n          },\n          \"linked_flows\": {\n            \"$ref\": \"#/components/schemas/treasury_received_debits_resource_linked_flows\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"network\": {\n            \"description\": \"The network used for the ReceivedDebit.\",\n            \"enum\": [\"ach\", \"card\", \"stripe\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.received_debit\"],\n            \"type\": \"string\"\n          },\n          \"reversal_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_received_debits_resource_reversal_details\"\n              }\n            ],\n            \"description\": \"Details describing when a ReceivedDebit might be reversed.\",\n            \"nullable\": true\n          },\n          \"status\": {\n            \"description\": \"Status of the ReceivedDebit. ReceivedDebits are created with a status of either `succeeded` (approved) or `failed` (declined). The failure reason can be found under the `failure_code`.\",\n            \"enum\": [\"failed\", \"succeeded\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"nullable\": true,\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"created\",\n          \"currency\",\n          \"description\",\n          \"id\",\n          \"linked_flows\",\n          \"livemode\",\n          \"network\",\n          \"object\",\n          \"status\"\n        ],\n        \"title\": \"TreasuryReceivedDebitsResourceReceivedDebit\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"initiating_payment_method_details\",\n          \"linked_flows\",\n          \"reversal_details\",\n          \"transaction\"\n        ],\n        \"x-resourceId\": \"treasury.received_debit\"\n      },\n      \"treasury.transaction\": {\n        \"description\": \"Transactions represent changes to a [FinancialAccount's](https://stripe.com/docs/api#financial_accounts) balance.\",\n        \"properties\": {\n          \"amount\": {\n            \"description\": \"Amount (in cents) transferred.\",\n            \"type\": \"integer\"\n          },\n          \"balance_impact\": {\n            \"$ref\": \"#/components/schemas/treasury_transactions_resource_balance_impact\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"description\": {\n            \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"entries\": {\n            \"description\": \"A list of TransactionEntries that are part of this Transaction. This cannot be expanded in any list endpoints.\",\n            \"nullable\": true,\n            \"properties\": {\n              \"data\": {\n                \"description\": \"Details about each object.\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/treasury.transaction_entry\"\n                },\n                \"type\": \"array\"\n              },\n              \"has_more\": {\n                \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                \"type\": \"boolean\"\n              },\n              \"object\": {\n                \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                \"enum\": [\"list\"],\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"description\": \"The URL where this list can be accessed.\",\n                \"maxLength\": 5000,\n                \"pattern\": \"^/v1/treasury/transaction_entries\",\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n            \"title\": \"TreasuryTransactionsResourceTransactionEntryList\",\n            \"type\": \"object\",\n            \"x-expandableFields\": [\"data\"]\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount associated with this object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"flow\": {\n            \"description\": \"ID of the flow that created the Transaction.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"flow_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_transactions_resource_flow_details\"\n              }\n            ],\n            \"description\": \"Details of the flow that created the Transaction.\",\n            \"nullable\": true\n          },\n          \"flow_type\": {\n            \"description\": \"Type of the flow that created the Transaction.\",\n            \"enum\": [\n              \"credit_reversal\",\n              \"debit_reversal\",\n              \"inbound_transfer\",\n              \"issuing_authorization\",\n              \"other\",\n              \"outbound_payment\",\n              \"outbound_transfer\",\n              \"received_credit\",\n              \"received_debit\"\n            ],\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.transaction\"],\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"Status of the Transaction.\",\n            \"enum\": [\"open\", \"posted\", \"void\"],\n            \"type\": \"string\"\n          },\n          \"status_transitions\": {\n            \"$ref\": \"#/components/schemas/treasury_transactions_resource_abstract_transaction_resource_status_transitions\"\n          }\n        },\n        \"required\": [\n          \"amount\",\n          \"balance_impact\",\n          \"created\",\n          \"currency\",\n          \"description\",\n          \"financial_account\",\n          \"flow_type\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"status\",\n          \"status_transitions\"\n        ],\n        \"title\": \"TreasuryTransactionsResourceTransaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"balance_impact\",\n          \"entries\",\n          \"flow_details\",\n          \"status_transitions\"\n        ],\n        \"x-resourceId\": \"treasury.transaction\"\n      },\n      \"treasury.transaction_entry\": {\n        \"description\": \"TransactionEntries represent individual units of money movements within a single [Transaction](https://stripe.com/docs/api#transactions).\",\n        \"properties\": {\n          \"balance_impact\": {\n            \"$ref\": \"#/components/schemas/treasury_transactions_resource_balance_impact\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"currency\": {\n            \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"format\": \"currency\",\n            \"type\": \"string\"\n          },\n          \"effective_at\": {\n            \"description\": \"When the TransactionEntry will impact the FinancialAccount's balance.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"financial_account\": {\n            \"description\": \"The FinancialAccount associated with this object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"flow\": {\n            \"description\": \"Token of the flow associated with the TransactionEntry.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"flow_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_transactions_resource_flow_details\"\n              }\n            ],\n            \"description\": \"Details of the flow associated with the TransactionEntry.\",\n            \"nullable\": true\n          },\n          \"flow_type\": {\n            \"description\": \"Type of the flow associated with the TransactionEntry.\",\n            \"enum\": [\n              \"credit_reversal\",\n              \"debit_reversal\",\n              \"inbound_transfer\",\n              \"issuing_authorization\",\n              \"other\",\n              \"outbound_payment\",\n              \"outbound_transfer\",\n              \"received_credit\",\n              \"received_debit\"\n            ],\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"treasury.transaction_entry\"],\n            \"type\": \"string\"\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          },\n          \"type\": {\n            \"description\": \"The specific money movement that generated the TransactionEntry.\",\n            \"enum\": [\n              \"credit_reversal\",\n              \"credit_reversal_posting\",\n              \"debit_reversal\",\n              \"inbound_transfer\",\n              \"inbound_transfer_return\",\n              \"issuing_authorization_hold\",\n              \"issuing_authorization_release\",\n              \"other\",\n              \"outbound_payment\",\n              \"outbound_payment_cancellation\",\n              \"outbound_payment_failure\",\n              \"outbound_payment_posting\",\n              \"outbound_payment_return\",\n              \"outbound_transfer\",\n              \"outbound_transfer_cancellation\",\n              \"outbound_transfer_failure\",\n              \"outbound_transfer_posting\",\n              \"outbound_transfer_return\",\n              \"received_credit\",\n              \"received_debit\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"balance_impact\",\n          \"created\",\n          \"currency\",\n          \"effective_at\",\n          \"financial_account\",\n          \"flow_type\",\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"transaction\",\n          \"type\"\n        ],\n        \"title\": \"TreasuryTransactionsResourceTransactionEntry\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"balance_impact\", \"flow_details\", \"transaction\"],\n        \"x-resourceId\": \"treasury.transaction_entry\"\n      },\n      \"treasury_financial_accounts_resource_aba_record\": {\n        \"description\": \"ABA Records contain U.S. bank account details per the ABA format.\",\n        \"properties\": {\n          \"account_holder_name\": {\n            \"description\": \"The name of the person or business that owns the bank account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"account_number\": {\n            \"description\": \"The account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"account_number_last4\": {\n            \"description\": \"The last four characters of the account number.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"bank_name\": {\n            \"description\": \"Name of the bank.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"Routing number for the account.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"account_holder_name\",\n          \"account_number_last4\",\n          \"bank_name\",\n          \"routing_number\"\n        ],\n        \"title\": \"TreasuryFinancialAccountsResourceABARecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_financial_accounts_resource_aba_toggle_settings\": {\n        \"description\": \"Toggle settings for enabling/disabling the ABA address feature\",\n        \"properties\": {\n          \"requested\": {\n            \"description\": \"Whether the FinancialAccount should have the Feature.\",\n            \"type\": \"boolean\"\n          },\n          \"status\": {\n            \"description\": \"Whether the Feature is operational.\",\n            \"enum\": [\"active\", \"pending\", \"restricted\"],\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"description\": \"Additional details; includes at least one entry when the status is not `active`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggles_setting_status_details\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"requested\", \"status\", \"status_details\"],\n        \"title\": \"TreasuryFinancialAccountsResourceAbaToggleSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_details\"]\n      },\n      \"treasury_financial_accounts_resource_balance\": {\n        \"description\": \"Balance information for the FinancialAccount\",\n        \"properties\": {\n          \"cash\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"Funds the user can spend right now.\",\n            \"type\": \"object\"\n          },\n          \"inbound_pending\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"Funds not spendable yet, but will become available at a later time.\",\n            \"type\": \"object\"\n          },\n          \"outbound_pending\": {\n            \"additionalProperties\": {\n              \"type\": \"integer\"\n            },\n            \"description\": \"Funds in the account, but not spendable because they are being held for pending outbound flows.\",\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"cash\", \"inbound_pending\", \"outbound_pending\"],\n        \"title\": \"TreasuryFinancialAccountsResourceBalance\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_financial_accounts_resource_closed_status_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"reasons\": {\n            \"description\": \"The array that contains reasons for a FinancialAccount closure.\",\n            \"items\": {\n              \"enum\": [\"account_rejected\", \"closed_by_platform\", \"other\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"reasons\"],\n        \"title\": \"TreasuryFinancialAccountsResourceClosedStatusDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_financial_accounts_resource_financial_address\": {\n        \"description\": \"FinancialAddresses contain identifying information that resolves to a FinancialAccount.\",\n        \"properties\": {\n          \"aba\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_aba_record\"\n          },\n          \"supported_networks\": {\n            \"description\": \"The list of networks that the address supports\",\n            \"items\": {\n              \"enum\": [\"ach\", \"us_domestic_wire\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"type\": \"array\"\n          },\n          \"type\": {\n            \"description\": \"The type of financial address\",\n            \"enum\": [\"aba\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TreasuryFinancialAccountsResourceFinancialAddress\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"aba\"]\n      },\n      \"treasury_financial_accounts_resource_financial_addresses_features\": {\n        \"description\": \"Settings related to Financial Addresses features on a Financial Account\",\n        \"properties\": {\n          \"aba\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_aba_toggle_settings\"\n          }\n        },\n        \"title\": \"TreasuryFinancialAccountsResourceFinancialAddressesFeatures\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"aba\"]\n      },\n      \"treasury_financial_accounts_resource_inbound_ach_toggle_settings\": {\n        \"description\": \"Toggle settings for enabling/disabling an inbound ACH specific feature\",\n        \"properties\": {\n          \"requested\": {\n            \"description\": \"Whether the FinancialAccount should have the Feature.\",\n            \"type\": \"boolean\"\n          },\n          \"status\": {\n            \"description\": \"Whether the Feature is operational.\",\n            \"enum\": [\"active\", \"pending\", \"restricted\"],\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"description\": \"Additional details; includes at least one entry when the status is not `active`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggles_setting_status_details\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"requested\", \"status\", \"status_details\"],\n        \"title\": \"TreasuryFinancialAccountsResourceInboundAchToggleSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_details\"]\n      },\n      \"treasury_financial_accounts_resource_inbound_transfers\": {\n        \"description\": \"InboundTransfers contains inbound transfers features for a FinancialAccount.\",\n        \"properties\": {\n          \"ach\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_inbound_ach_toggle_settings\"\n          }\n        },\n        \"title\": \"TreasuryFinancialAccountsResourceInboundTransfers\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"ach\"]\n      },\n      \"treasury_financial_accounts_resource_outbound_ach_toggle_settings\": {\n        \"description\": \"Toggle settings for enabling/disabling an outbound ACH specific feature\",\n        \"properties\": {\n          \"requested\": {\n            \"description\": \"Whether the FinancialAccount should have the Feature.\",\n            \"type\": \"boolean\"\n          },\n          \"status\": {\n            \"description\": \"Whether the Feature is operational.\",\n            \"enum\": [\"active\", \"pending\", \"restricted\"],\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"description\": \"Additional details; includes at least one entry when the status is not `active`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggles_setting_status_details\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"requested\", \"status\", \"status_details\"],\n        \"title\": \"TreasuryFinancialAccountsResourceOutboundAchToggleSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_details\"]\n      },\n      \"treasury_financial_accounts_resource_outbound_payments\": {\n        \"description\": \"Settings related to Outbound Payments features on a Financial Account\",\n        \"properties\": {\n          \"ach\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_outbound_ach_toggle_settings\"\n          },\n          \"us_domestic_wire\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggle_settings\"\n          }\n        },\n        \"title\": \"TreasuryFinancialAccountsResourceOutboundPayments\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"ach\", \"us_domestic_wire\"]\n      },\n      \"treasury_financial_accounts_resource_outbound_transfers\": {\n        \"description\": \"OutboundTransfers contains outbound transfers features for a FinancialAccount.\",\n        \"properties\": {\n          \"ach\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_outbound_ach_toggle_settings\"\n          },\n          \"us_domestic_wire\": {\n            \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggle_settings\"\n          }\n        },\n        \"title\": \"TreasuryFinancialAccountsResourceOutboundTransfers\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"ach\", \"us_domestic_wire\"]\n      },\n      \"treasury_financial_accounts_resource_platform_restrictions\": {\n        \"description\": \"Restrictions that a Connect Platform has placed on this FinancialAccount.\",\n        \"properties\": {\n          \"inbound_flows\": {\n            \"description\": \"Restricts all inbound money movement.\",\n            \"enum\": [\"restricted\", \"unrestricted\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"outbound_flows\": {\n            \"description\": \"Restricts all outbound money movement.\",\n            \"enum\": [\"restricted\", \"unrestricted\"],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryFinancialAccountsResourcePlatformRestrictions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_financial_accounts_resource_status_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"closed\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_closed_status_details\"\n              }\n            ],\n            \"description\": \"Details related to the closure of this FinancialAccount\",\n            \"nullable\": true\n          }\n        },\n        \"title\": \"TreasuryFinancialAccountsResourceStatusDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"closed\"]\n      },\n      \"treasury_financial_accounts_resource_toggle_settings\": {\n        \"description\": \"Toggle settings for enabling/disabling a feature\",\n        \"properties\": {\n          \"requested\": {\n            \"description\": \"Whether the FinancialAccount should have the Feature.\",\n            \"type\": \"boolean\"\n          },\n          \"status\": {\n            \"description\": \"Whether the Feature is operational.\",\n            \"enum\": [\"active\", \"pending\", \"restricted\"],\n            \"type\": \"string\"\n          },\n          \"status_details\": {\n            \"description\": \"Additional details; includes at least one entry when the status is not `active`.\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/treasury_financial_accounts_resource_toggles_setting_status_details\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"requested\", \"status\", \"status_details\"],\n        \"title\": \"TreasuryFinancialAccountsResourceToggleSettings\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"status_details\"]\n      },\n      \"treasury_financial_accounts_resource_toggles_setting_status_details\": {\n        \"description\": \"Additional details on the FinancialAccount Features information.\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"Represents the reason why the status is `pending` or `restricted`.\",\n            \"enum\": [\n              \"activating\",\n              \"capability_not_requested\",\n              \"financial_account_closed\",\n              \"rejected_other\",\n              \"rejected_unsupported_business\",\n              \"requirements_past_due\",\n              \"requirements_pending_verification\",\n              \"restricted_by_platform\",\n              \"restricted_other\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"resolution\": {\n            \"description\": \"Represents what the user should do, if anything, to activate the Feature.\",\n            \"enum\": [\n              \"contact_stripe\",\n              \"provide_information\",\n              \"remove_restriction\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"restriction\": {\n            \"description\": \"The `platform_restrictions` that are restricting this Feature.\",\n            \"enum\": [\"inbound_flows\", \"outbound_flows\"],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          }\n        },\n        \"required\": [\"code\"],\n        \"title\": \"TreasuryFinancialAccountsResourceTogglesSettingStatusDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_inbound_transfers_resource_failure_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"Reason for the failure.\",\n            \"enum\": [\n              \"account_closed\",\n              \"account_frozen\",\n              \"bank_account_restricted\",\n              \"bank_ownership_changed\",\n              \"debit_not_authorized\",\n              \"incorrect_account_holder_address\",\n              \"incorrect_account_holder_name\",\n              \"incorrect_account_holder_tax_id\",\n              \"insufficient_funds\",\n              \"invalid_account_number\",\n              \"invalid_currency\",\n              \"no_account\",\n              \"other\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"code\"],\n        \"title\": \"TreasuryInboundTransfersResourceFailureDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_inbound_transfers_resource_inbound_transfer_resource_linked_flows\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"received_debit\": {\n            \"description\": \"If funds for this flow were returned after the flow went to the `succeeded` state, this field contains a reference to the ReceivedDebit return.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryInboundTransfersResourceInboundTransferResourceLinkedFlows\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_inbound_transfers_resource_inbound_transfer_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"canceled_at\": {\n            \"description\": \"Timestamp describing when an InboundTransfer changed status to `canceled`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"failed_at\": {\n            \"description\": \"Timestamp describing when an InboundTransfer changed status to `failed`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"succeeded_at\": {\n            \"description\": \"Timestamp describing when an InboundTransfer changed status to `succeeded`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TreasuryInboundTransfersResourceInboundTransferResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_outbound_payments_resource_ach_tracking_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"trace_id\": {\n            \"description\": \"ACH trace ID of the OutboundPayment for payments sent over the `ach` network.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"trace_id\"],\n        \"title\": \"TreasuryOutboundPaymentsResourceACHTrackingDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_outbound_payments_resource_outbound_payment_resource_end_user_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"ip_address\": {\n            \"description\": \"IP address of the user initiating the OutboundPayment. Set if `present` is set to `true`. IP address collection is required for risk and compliance reasons. This will be used to help determine if the OutboundPayment is authorized or should be blocked.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"present\": {\n            \"description\": \"`true` if the OutboundPayment creation request is being made on behalf of an end user by a platform. Otherwise, `false`.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"present\"],\n        \"title\": \"TreasuryOutboundPaymentsResourceOutboundPaymentResourceEndUserDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_outbound_payments_resource_outbound_payment_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"canceled_at\": {\n            \"description\": \"Timestamp describing when an OutboundPayment changed status to `canceled`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"failed_at\": {\n            \"description\": \"Timestamp describing when an OutboundPayment changed status to `failed`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"posted_at\": {\n            \"description\": \"Timestamp describing when an OutboundPayment changed status to `posted`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"returned_at\": {\n            \"description\": \"Timestamp describing when an OutboundPayment changed status to `returned`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TreasuryOutboundPaymentsResourceOutboundPaymentResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_outbound_payments_resource_outbound_payment_resource_tracking_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"ach\": {\n            \"$ref\": \"#/components/schemas/treasury_outbound_payments_resource_ach_tracking_details\"\n          },\n          \"type\": {\n            \"description\": \"The US bank account network used to send funds.\",\n            \"enum\": [\"ach\", \"us_domestic_wire\"],\n            \"type\": \"string\"\n          },\n          \"us_domestic_wire\": {\n            \"$ref\": \"#/components/schemas/treasury_outbound_payments_resource_us_domestic_wire_tracking_details\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TreasuryOutboundPaymentsResourceOutboundPaymentResourceTrackingDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"ach\", \"us_domestic_wire\"]\n      },\n      \"treasury_outbound_payments_resource_returned_status\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"Reason for the return.\",\n            \"enum\": [\n              \"account_closed\",\n              \"account_frozen\",\n              \"bank_account_restricted\",\n              \"bank_ownership_changed\",\n              \"declined\",\n              \"incorrect_account_holder_name\",\n              \"invalid_account_number\",\n              \"invalid_currency\",\n              \"no_account\",\n              \"other\"\n            ],\n            \"type\": \"string\"\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"code\", \"transaction\"],\n        \"title\": \"TreasuryOutboundPaymentsResourceReturnedStatus\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"transaction\"]\n      },\n      \"treasury_outbound_payments_resource_us_domestic_wire_tracking_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"chips\": {\n            \"description\": \"CHIPS System Sequence Number (SSN) of the OutboundPayment for payments sent over the `us_domestic_wire` network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"imad\": {\n            \"description\": \"IMAD of the OutboundPayment for payments sent over the `us_domestic_wire` network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"omad\": {\n            \"description\": \"OMAD of the OutboundPayment for payments sent over the `us_domestic_wire` network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryOutboundPaymentsResourceUSDomesticWireTrackingDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_outbound_transfers_resource_ach_tracking_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"trace_id\": {\n            \"description\": \"ACH trace ID of the OutboundTransfer for transfers sent over the `ach` network.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"trace_id\"],\n        \"title\": \"TreasuryOutboundTransfersResourceACHTrackingDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_outbound_transfers_resource_outbound_transfer_resource_tracking_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"ach\": {\n            \"$ref\": \"#/components/schemas/treasury_outbound_transfers_resource_ach_tracking_details\"\n          },\n          \"type\": {\n            \"description\": \"The US bank account network used to send funds.\",\n            \"enum\": [\"ach\", \"us_domestic_wire\"],\n            \"type\": \"string\"\n          },\n          \"us_domestic_wire\": {\n            \"$ref\": \"#/components/schemas/treasury_outbound_transfers_resource_us_domestic_wire_tracking_details\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TreasuryOutboundTransfersResourceOutboundTransferResourceTrackingDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"ach\", \"us_domestic_wire\"]\n      },\n      \"treasury_outbound_transfers_resource_returned_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"code\": {\n            \"description\": \"Reason for the return.\",\n            \"enum\": [\n              \"account_closed\",\n              \"account_frozen\",\n              \"bank_account_restricted\",\n              \"bank_ownership_changed\",\n              \"declined\",\n              \"incorrect_account_holder_name\",\n              \"invalid_account_number\",\n              \"invalid_currency\",\n              \"no_account\",\n              \"other\"\n            ],\n            \"type\": \"string\"\n          },\n          \"transaction\": {\n            \"anyOf\": [\n              {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/treasury.transaction\"\n              }\n            ],\n            \"description\": \"The Transaction associated with this object.\",\n            \"x-expansionResources\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"code\", \"transaction\"],\n        \"title\": \"TreasuryOutboundTransfersResourceReturnedDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"transaction\"]\n      },\n      \"treasury_outbound_transfers_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"canceled_at\": {\n            \"description\": \"Timestamp describing when an OutboundTransfer changed status to `canceled`\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"failed_at\": {\n            \"description\": \"Timestamp describing when an OutboundTransfer changed status to `failed`\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"posted_at\": {\n            \"description\": \"Timestamp describing when an OutboundTransfer changed status to `posted`\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"returned_at\": {\n            \"description\": \"Timestamp describing when an OutboundTransfer changed status to `returned`\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TreasuryOutboundTransfersResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_outbound_transfers_resource_us_domestic_wire_tracking_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"chips\": {\n            \"description\": \"CHIPS System Sequence Number (SSN) of the OutboundTransfer for transfers sent over the `us_domestic_wire` network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"imad\": {\n            \"description\": \"IMAD of the OutboundTransfer for transfers sent over the `us_domestic_wire` network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"omad\": {\n            \"description\": \"OMAD of the OutboundTransfer for transfers sent over the `us_domestic_wire` network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryOutboundTransfersResourceUSDomesticWireTrackingDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_received_credits_resource_linked_flows\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"credit_reversal\": {\n            \"description\": \"The CreditReversal created as a result of this ReceivedCredit being reversed.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuing_authorization\": {\n            \"description\": \"Set if the ReceivedCredit was created due to an [Issuing Authorization](https://stripe.com/docs/api#issuing_authorizations) object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuing_transaction\": {\n            \"description\": \"Set if the ReceivedCredit is also viewable as an [Issuing transaction](https://stripe.com/docs/api#issuing_transactions) object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"source_flow\": {\n            \"description\": \"ID of the source flow. Set if `network` is `stripe` and the source flow is visible to the user. Examples of source flows include OutboundPayments, payouts, or CreditReversals.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"source_flow_details\": {\n            \"anyOf\": [\n              {\n                \"$ref\": \"#/components/schemas/treasury_received_credits_resource_source_flows_details\"\n              }\n            ],\n            \"description\": \"The expandable object of the source flow.\",\n            \"nullable\": true\n          },\n          \"source_flow_type\": {\n            \"description\": \"The type of flow that originated the ReceivedCredit (for example, `outbound_payment`).\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryReceivedCreditsResourceLinkedFlows\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"source_flow_details\"]\n      },\n      \"treasury_received_credits_resource_reversal_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deadline\": {\n            \"description\": \"Time before which a ReceivedCredit can be reversed.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"restricted_reason\": {\n            \"description\": \"Set if a ReceivedCredit cannot be reversed.\",\n            \"enum\": [\n              \"already_reversed\",\n              \"deadline_passed\",\n              \"network_restricted\",\n              \"other\",\n              \"source_flow_restricted\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryReceivedCreditsResourceReversalDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_received_credits_resource_source_flows_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"credit_reversal\": {\n            \"$ref\": \"#/components/schemas/treasury.credit_reversal\"\n          },\n          \"outbound_payment\": {\n            \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n          },\n          \"outbound_transfer\": {\n            \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n          },\n          \"payout\": {\n            \"$ref\": \"#/components/schemas/payout\"\n          },\n          \"type\": {\n            \"description\": \"The type of the source flow that originated the ReceivedCredit.\",\n            \"enum\": [\n              \"credit_reversal\",\n              \"other\",\n              \"outbound_payment\",\n              \"outbound_transfer\",\n              \"payout\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TreasuryReceivedCreditsResourceSourceFlowsDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"credit_reversal\",\n          \"outbound_payment\",\n          \"outbound_transfer\",\n          \"payout\"\n        ]\n      },\n      \"treasury_received_credits_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"posted_at\": {\n            \"description\": \"Timestamp describing when the CreditReversal changed status to `posted`\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TreasuryReceivedCreditsResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_received_debits_resource_debit_reversal_linked_flows\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"issuing_dispute\": {\n            \"description\": \"Set if there is an Issuing dispute associated with the DebitReversal.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryReceivedDebitsResourceDebitReversalLinkedFlows\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_received_debits_resource_linked_flows\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"debit_reversal\": {\n            \"description\": \"The DebitReversal created as a result of this ReceivedDebit being reversed.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"inbound_transfer\": {\n            \"description\": \"Set if the ReceivedDebit is associated with an InboundTransfer's return of funds.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuing_authorization\": {\n            \"description\": \"Set if the ReceivedDebit was created due to an [Issuing Authorization](https://stripe.com/docs/api#issuing_authorizations) object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"issuing_transaction\": {\n            \"description\": \"Set if the ReceivedDebit is also viewable as an [Issuing Dispute](https://stripe.com/docs/api#issuing_disputes) object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"payout\": {\n            \"description\": \"Set if the ReceivedDebit was created due to a [Payout](https://stripe.com/docs/api#payouts) object.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryReceivedDebitsResourceLinkedFlows\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_received_debits_resource_reversal_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"deadline\": {\n            \"description\": \"Time before which a ReceivedDebit can be reversed.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"restricted_reason\": {\n            \"description\": \"Set if a ReceivedDebit can't be reversed.\",\n            \"enum\": [\n              \"already_reversed\",\n              \"deadline_passed\",\n              \"network_restricted\",\n              \"other\",\n              \"source_flow_restricted\"\n            ],\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasuryReceivedDebitsResourceReversalDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_received_debits_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"completed_at\": {\n            \"description\": \"Timestamp describing when the DebitReversal changed status to `completed`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TreasuryReceivedDebitsResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_shared_resource_billing_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"address\": {\n            \"$ref\": \"#/components/schemas/address\"\n          },\n          \"email\": {\n            \"description\": \"Email address.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"description\": \"Full name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"address\"],\n        \"title\": \"TreasurySharedResourceBillingDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"address\"]\n      },\n      \"treasury_shared_resource_initiating_payment_method_details_initiating_payment_method_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"balance\": {\n            \"description\": \"Set when `type` is `balance`.\",\n            \"enum\": [\"payments\"],\n            \"type\": \"string\"\n          },\n          \"billing_details\": {\n            \"$ref\": \"#/components/schemas/treasury_shared_resource_billing_details\"\n          },\n          \"financial_account\": {\n            \"$ref\": \"#/components/schemas/received_payment_method_details_financial_account\"\n          },\n          \"issuing_card\": {\n            \"description\": \"Set when `type` is `issuing_card`. This is an [Issuing Card](https://stripe.com/docs/api#issuing_cards) ID.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"description\": \"Polymorphic type matching the originating money movement's source. This can be an external account, a Stripe balance, or a FinancialAccount.\",\n            \"enum\": [\n              \"balance\",\n              \"financial_account\",\n              \"issuing_card\",\n              \"stripe\",\n              \"us_bank_account\"\n            ],\n            \"type\": \"string\",\n            \"x-stripeBypassValidation\": true\n          },\n          \"us_bank_account\": {\n            \"$ref\": \"#/components/schemas/treasury_shared_resource_initiating_payment_method_details_us_bank_account\"\n          }\n        },\n        \"required\": [\"billing_details\", \"type\"],\n        \"title\": \"TreasurySharedResourceInitiatingPaymentMethodDetailsInitiatingPaymentMethodDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"billing_details\",\n          \"financial_account\",\n          \"us_bank_account\"\n        ]\n      },\n      \"treasury_shared_resource_initiating_payment_method_details_us_bank_account\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"bank_name\": {\n            \"description\": \"Bank name.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"last4\": {\n            \"description\": \"The last four digits of the bank account number.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"routing_number\": {\n            \"description\": \"The routing number for the bank account.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          }\n        },\n        \"title\": \"TreasurySharedResourceInitiatingPaymentMethodDetailsUSBankAccount\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_transactions_resource_abstract_transaction_resource_status_transitions\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"posted_at\": {\n            \"description\": \"Timestamp describing when the Transaction changed status to `posted`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          },\n          \"void_at\": {\n            \"description\": \"Timestamp describing when the Transaction changed status to `void`.\",\n            \"format\": \"unix-time\",\n            \"nullable\": true,\n            \"type\": \"integer\"\n          }\n        },\n        \"title\": \"TreasuryTransactionsResourceAbstractTransactionResourceStatusTransitions\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_transactions_resource_balance_impact\": {\n        \"description\": \"Change to a FinancialAccount's balance\",\n        \"properties\": {\n          \"cash\": {\n            \"description\": \"The change made to funds the user can spend right now.\",\n            \"type\": \"integer\"\n          },\n          \"inbound_pending\": {\n            \"description\": \"The change made to funds that are not spendable yet, but will become available at a later time.\",\n            \"type\": \"integer\"\n          },\n          \"outbound_pending\": {\n            \"description\": \"The change made to funds in the account, but not spendable because they are being held for pending outbound flows.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\"cash\", \"inbound_pending\", \"outbound_pending\"],\n        \"title\": \"TreasuryTransactionsResourceBalanceImpact\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"treasury_transactions_resource_flow_details\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"credit_reversal\": {\n            \"$ref\": \"#/components/schemas/treasury.credit_reversal\"\n          },\n          \"debit_reversal\": {\n            \"$ref\": \"#/components/schemas/treasury.debit_reversal\"\n          },\n          \"inbound_transfer\": {\n            \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n          },\n          \"issuing_authorization\": {\n            \"$ref\": \"#/components/schemas/issuing.authorization\"\n          },\n          \"outbound_payment\": {\n            \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n          },\n          \"outbound_transfer\": {\n            \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n          },\n          \"received_credit\": {\n            \"$ref\": \"#/components/schemas/treasury.received_credit\"\n          },\n          \"received_debit\": {\n            \"$ref\": \"#/components/schemas/treasury.received_debit\"\n          },\n          \"type\": {\n            \"description\": \"Type of the flow that created the Transaction. Set to the same value as `flow_type`.\",\n            \"enum\": [\n              \"credit_reversal\",\n              \"debit_reversal\",\n              \"inbound_transfer\",\n              \"issuing_authorization\",\n              \"other\",\n              \"outbound_payment\",\n              \"outbound_transfer\",\n              \"received_credit\",\n              \"received_debit\"\n            ],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\"],\n        \"title\": \"TreasuryTransactionsResourceFlowDetails\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\n          \"credit_reversal\",\n          \"debit_reversal\",\n          \"inbound_transfer\",\n          \"issuing_authorization\",\n          \"outbound_payment\",\n          \"outbound_transfer\",\n          \"received_credit\",\n          \"received_debit\"\n        ]\n      },\n      \"us_bank_account_networks\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"preferred\": {\n            \"description\": \"The preferred network.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"supported\": {\n            \"description\": \"All supported networks.\",\n            \"items\": {\n              \"enum\": [\"ach\", \"us_domestic_wire\"],\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          }\n        },\n        \"required\": [\"supported\"],\n        \"title\": \"us_bank_account_networks\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"usage_record\": {\n        \"description\": \"Usage records allow you to report customer usage and metrics to Stripe for\\nmetered billing of subscription prices.\\n\\nRelated guide: [Metered billing](https://stripe.com/docs/billing/subscriptions/metered-billing)\\n\\nThis is our legacy usage-based billing API. See the [updated usage-based billing docs](https://docs.stripe.com/billing/subscriptions/usage-based).\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"usage_record\"],\n            \"type\": \"string\"\n          },\n          \"quantity\": {\n            \"description\": \"The usage quantity for the specified date.\",\n            \"type\": \"integer\"\n          },\n          \"subscription_item\": {\n            \"description\": \"The ID of the subscription item this usage record contains data for.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"timestamp\": {\n            \"description\": \"The timestamp when this usage occurred.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"quantity\",\n          \"subscription_item\",\n          \"timestamp\"\n        ],\n        \"title\": \"UsageRecord\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"usage_record\"\n      },\n      \"usage_record_summary\": {\n        \"description\": \"A usage record summary represents an aggregated view of how much usage was accrued for a subscription item within a subscription billing period.\",\n        \"properties\": {\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"invoice\": {\n            \"description\": \"The invoice in which this usage period has been billed for.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"usage_record_summary\"],\n            \"type\": \"string\"\n          },\n          \"period\": {\n            \"$ref\": \"#/components/schemas/period\"\n          },\n          \"subscription_item\": {\n            \"description\": \"The ID of the subscription item this summary is describing.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"total_usage\": {\n            \"description\": \"The total usage within this usage period.\",\n            \"type\": \"integer\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"livemode\",\n          \"object\",\n          \"period\",\n          \"subscription_item\",\n          \"total_usage\"\n        ],\n        \"title\": \"UsageRecordSummary\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [\"period\"],\n        \"x-resourceId\": \"usage_record_summary\"\n      },\n      \"verification_session_redaction\": {\n        \"description\": \"\",\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Indicates whether this object and its related objects have been redacted or not.\",\n            \"enum\": [\"processing\", \"redacted\"],\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"status\"],\n        \"title\": \"verification_session_redaction\",\n        \"type\": \"object\",\n        \"x-expandableFields\": []\n      },\n      \"webhook_endpoint\": {\n        \"description\": \"You can configure [webhook endpoints](https://docs.stripe.com/webhooks/) via the API to be\\nnotified about events that happen in your Stripe account or connected\\naccounts.\\n\\nMost users configure webhooks from [the dashboard](https://dashboard.stripe.com/webhooks), which provides a user interface for registering and testing your webhook endpoints.\\n\\nRelated guide: [Setting up webhooks](https://docs.stripe.com/webhooks/configure)\",\n        \"properties\": {\n          \"api_version\": {\n            \"description\": \"The API version events are rendered as for this webhook endpoint.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"application\": {\n            \"description\": \"The ID of the associated Connect application.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"created\": {\n            \"description\": \"Time at which the object was created. Measured in seconds since the Unix epoch.\",\n            \"format\": \"unix-time\",\n            \"type\": \"integer\"\n          },\n          \"description\": {\n            \"description\": \"An optional description of what the webhook is used for.\",\n            \"maxLength\": 5000,\n            \"nullable\": true,\n            \"type\": \"string\"\n          },\n          \"enabled_events\": {\n            \"description\": \"The list of events to enable for this endpoint. `['*']` indicates that all events are enabled, except those that require explicit selection.\",\n            \"items\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"type\": \"array\"\n          },\n          \"id\": {\n            \"description\": \"Unique identifier for the object.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"livemode\": {\n            \"description\": \"Has the value `true` if the object exists in live mode or the value `false` if the object exists in test mode.\",\n            \"type\": \"boolean\"\n          },\n          \"metadata\": {\n            \"additionalProperties\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n            \"type\": \"object\"\n          },\n          \"object\": {\n            \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n            \"enum\": [\"webhook_endpoint\"],\n            \"type\": \"string\"\n          },\n          \"secret\": {\n            \"description\": \"The endpoint's secret, used to generate [webhook signatures](https://docs.stripe.com/webhooks/signatures). Only returned at creation.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"description\": \"The status of the webhook. It can be `enabled` or `disabled`.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"description\": \"The URL of the webhook endpoint.\",\n            \"maxLength\": 5000,\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"created\",\n          \"enabled_events\",\n          \"id\",\n          \"livemode\",\n          \"metadata\",\n          \"object\",\n          \"status\",\n          \"url\"\n        ],\n        \"title\": \"NotificationWebhookEndpoint\",\n        \"type\": \"object\",\n        \"x-expandableFields\": [],\n        \"x-resourceId\": \"webhook_endpoint\"\n      }\n    },\n    \"securitySchemes\": {\n      \"basicAuth\": {\n        \"description\": \"Basic HTTP authentication. Allowed headers-- Authorization: Basic <api_key> | Authorization: Basic <base64 hash of `api_key:`>\",\n        \"scheme\": \"basic\",\n        \"type\": \"http\"\n      },\n      \"bearerAuth\": {\n        \"bearerFormat\": \"auth-scheme\",\n        \"description\": \"Bearer HTTP authentication. Allowed headers-- Authorization: Bearer <api_key>\",\n        \"scheme\": \"bearer\",\n        \"type\": \"http\"\n      }\n    }\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"dev-platform@stripe.com\",\n      \"name\": \"Stripe Dev Platform Team\",\n      \"url\": \"https://stripe.com\"\n    },\n    \"description\": \"The Stripe REST API. Please see https://stripe.com/docs/api for more details.\",\n    \"termsOfService\": \"https://stripe.com/us/terms/\",\n    \"title\": \"Stripe API\",\n    \"version\": \"2025-02-24.acacia\",\n    \"x-stripeSpecFilename\": \"spec3\"\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/v1/account\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an account.</p>\",\n        \"operationId\": \"GetAccount\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve account\"\n      }\n    },\n    \"/v1/account_links\": {\n      \"post\": {\n        \"description\": \"<p>Creates an AccountLink object that includes a single-use Stripe URL that the platform can redirect their user to in order to take them through the Connect Onboarding flow.</p>\",\n        \"operationId\": \"PostAccountLinks\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"collection_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account\": {\n                    \"description\": \"The identifier of the account to create an account link for.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"collect\": {\n                    \"description\": \"The collect parameter is deprecated. Use `collection_options` instead.\",\n                    \"enum\": [\"currently_due\", \"eventually_due\"],\n                    \"type\": \"string\"\n                  },\n                  \"collection_options\": {\n                    \"description\": \"Specifies the requirements that Stripe collects from connected accounts in the Connect Onboarding flow.\",\n                    \"properties\": {\n                      \"fields\": {\n                        \"enum\": [\"currently_due\", \"eventually_due\"],\n                        \"type\": \"string\"\n                      },\n                      \"future_requirements\": {\n                        \"enum\": [\"include\", \"omit\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"collection_options_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"refresh_url\": {\n                    \"description\": \"The URL the user will be redirected to if the account link is expired, has been previously-visited, or is otherwise invalid. The URL you specify should attempt to generate a new account link with the same parameters used to create the original account link, then redirect the user to the new account link's URL so they can continue with Connect Onboarding. If a new account link cannot be generated or the redirect fails you should display a useful error to the user.\",\n                    \"type\": \"string\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The URL that the user will be redirected to upon leaving or completing the linked flow.\",\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"description\": \"The type of account link the user is requesting. Possible values are `account_onboarding` or `account_update`.\",\n                    \"enum\": [\"account_onboarding\", \"account_update\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"required\": [\"account\", \"type\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/account_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an account link\"\n      }\n    },\n    \"/v1/account_sessions\": {\n      \"post\": {\n        \"description\": \"<p>Creates a AccountSession object that includes a single-use token that the platform can use on their front-end to grant client-side API access.</p>\",\n        \"operationId\": \"PostAccountSessions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"components\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account\": {\n                    \"description\": \"The identifier of the account to create an Account Session for.\",\n                    \"type\": \"string\"\n                  },\n                  \"components\": {\n                    \"description\": \"Each key of the dictionary represents an embedded component, and each embedded component maps to its configuration (e.g. whether it has been enabled or not).\",\n                    \"properties\": {\n                      \"account_management\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"disable_stripe_user_authentication\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"external_account_collection\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"account_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"account_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"account_onboarding\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"disable_stripe_user_authentication\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"external_account_collection\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"account_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"account_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"balances\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"disable_stripe_user_authentication\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"edit_payout_schedule\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"external_account_collection\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"instant_payouts\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"standard_payouts\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"payouts_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"payouts_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"documents\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {},\n                            \"title\": \"base_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"base_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"financial_account\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"disable_stripe_user_authentication\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"external_account_collection\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"send_money\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"transfer_balance\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"financial_account_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"financial_account_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"financial_account_transactions\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"card_spend_dispute_management\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"financial_account_transactions_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"financial_account_transactions_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"issuing_card\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"card_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"card_spend_dispute_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"cardholder_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"spend_control_management\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"issuing_card_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"issuing_card_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"issuing_cards_list\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"card_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"card_spend_dispute_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"cardholder_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"disable_stripe_user_authentication\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"spend_control_management\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"issuing_cards_list_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"issuing_cards_list_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"notification_banner\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"disable_stripe_user_authentication\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"external_account_collection\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"account_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"account_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_details\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"capture_payments\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"destination_on_behalf_of_charge_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"dispute_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"refund_management\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"payments_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"payments_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payments\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"capture_payments\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"destination_on_behalf_of_charge_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"dispute_management\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"refund_management\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"payments_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"payments_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payouts\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"disable_stripe_user_authentication\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"edit_payout_schedule\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"external_account_collection\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"instant_payouts\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"standard_payouts\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"payouts_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"payouts_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payouts_list\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {},\n                            \"title\": \"base_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"base_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_registrations\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {},\n                            \"title\": \"base_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"base_config_param\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_settings\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {},\n                            \"title\": \"base_features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"base_config_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"account_session_create_components_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"account\", \"components\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/account_session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an Account Session\"\n      }\n    },\n    \"/v1/accounts\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of accounts connected to your platform via <a href=\\\"/docs/connect\\\">Connect</a>. If you’re not a platform, the list is empty.</p>\",\n        \"operationId\": \"GetAccounts\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return connected accounts that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/account\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/accounts\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"AccountList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all connected accounts\"\n      },\n      \"post\": {\n        \"description\": \"<p>With <a href=\\\"/docs/connect\\\">Connect</a>, you can create Stripe accounts for your users.\\nTo do this, you’ll first need to <a href=\\\"https://dashboard.stripe.com/account/applications/settings\\\">register your platform</a>.</p>\\n\\n<p>If you’ve already collected information for your connected accounts, you <a href=\\\"/docs/connect/best-practices#onboarding\\\">can prefill that information</a> when\\ncreating the account. Connect Onboarding won’t ask for the prefilled information during account onboarding.\\nYou can prefill any information on the account.</p>\",\n        \"operationId\": \"PostAccounts\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"business_profile\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"capabilities\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"company\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"controller\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"groups\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"individual\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tos_acceptance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_token\": {\n                    \"description\": \"An [account token](https://stripe.com/docs/api#create_account_token), used to securely provide details to the account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"bank_account\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"futsu\", \"savings\", \"toza\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"documents\": {\n                            \"properties\": {\n                              \"bank_account_ownership_verification\": {\n                                \"properties\": {\n                                  \"files\": {\n                                    \"items\": {\n                                      \"maxLength\": 500,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"documents_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"external_account_documents_param\",\n                            \"type\": \"object\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"bank_account\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"country\"],\n                        \"title\": \"external_account_payout_bank_account\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Either a token, like the ones returned by [Stripe.js](https://stripe.com/docs/js), or a dictionary containing a user's bank account details.\"\n                  },\n                  \"business_profile\": {\n                    \"description\": \"Business information about the account.\",\n                    \"properties\": {\n                      \"annual_revenue\": {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"fiscal_year_end\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"amount\", \"currency\", \"fiscal_year_end\"],\n                        \"title\": \"annual_revenue_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"estimated_worker_count\": {\n                        \"type\": \"integer\"\n                      },\n                      \"mcc\": {\n                        \"maxLength\": 4,\n                        \"type\": \"string\"\n                      },\n                      \"monthly_estimated_revenue\": {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"amount\", \"currency\"],\n                        \"title\": \"monthly_estimated_revenue_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"product_description\": {\n                        \"maxLength\": 40000,\n                        \"type\": \"string\"\n                      },\n                      \"support_address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"support_email\": {\n                        \"type\": \"string\"\n                      },\n                      \"support_phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"support_url\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"business_profile_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"business_type\": {\n                    \"description\": \"The business type. Once you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"enum\": [\n                      \"company\",\n                      \"government_entity\",\n                      \"individual\",\n                      \"non_profit\"\n                    ],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"capabilities\": {\n                    \"description\": \"Each key of the dictionary represents a capability, and each capability\\nmaps to its settings (for example, whether it has been requested or not). Each\\ncapability is inactive until you have provided its specific\\nrequirements and Stripe has verified them. An account might have some\\nof its requested capabilities be active and some be inactive.\\n\\nRequired when [account.controller.stripe_dashboard.type](/api/accounts/create#create_account-controller-dashboard-type)\\nis `none`, which includes Custom accounts.\",\n                    \"properties\": {\n                      \"acss_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"alma_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"blik_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"cartes_bancaires_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"gb_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"india_international_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"jcb_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"jp_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"legacy_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"link_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"mx_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_reporting_us_1099_k\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_reporting_us_1099_misc\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"transfers\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"treasury\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_account_ach_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"capabilities_param\",\n                    \"type\": \"object\"\n                  },\n                  \"company\": {\n                    \"description\": \"Information about the company or business. This field is available for any `business_type`. Once you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"legal_entity_and_kyc_address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kana\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kana_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kanji\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kanji_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"directors_provided\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"directorship_declaration\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"company_directorship_declaration\",\n                        \"type\": \"object\"\n                      },\n                      \"executives_provided\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"export_license_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"export_purpose_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"name_kana\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"name_kanji\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"owners_provided\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"ownership_declaration\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"company_ownership_declaration\",\n                        \"type\": \"object\"\n                      },\n                      \"ownership_exemption_reason\": {\n                        \"enum\": [\n                          \"\",\n                          \"qualified_entity_exceeds_ownership_threshold\",\n                          \"qualifies_as_financial_institution\"\n                        ],\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"registration_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"structure\": {\n                        \"enum\": [\n                          \"\",\n                          \"free_zone_establishment\",\n                          \"free_zone_llc\",\n                          \"government_instrumentality\",\n                          \"governmental_unit\",\n                          \"incorporated_non_profit\",\n                          \"incorporated_partnership\",\n                          \"limited_liability_partnership\",\n                          \"llc\",\n                          \"multi_member_llc\",\n                          \"private_company\",\n                          \"private_corporation\",\n                          \"private_partnership\",\n                          \"public_company\",\n                          \"public_corporation\",\n                          \"public_partnership\",\n                          \"registered_charity\",\n                          \"single_member_llc\",\n                          \"sole_establishment\",\n                          \"sole_proprietorship\",\n                          \"tax_exempt_government_instrumentality\",\n                          \"unincorporated_association\",\n                          \"unincorporated_non_profit\",\n                          \"unincorporated_partnership\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"tax_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tax_id_registrar\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"vat_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"verification\": {\n                        \"properties\": {\n                          \"document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"verification_document_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"verification_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"company_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"controller\": {\n                    \"description\": \"A hash of configuration describing the account controller's attributes.\",\n                    \"properties\": {\n                      \"fees\": {\n                        \"properties\": {\n                          \"payer\": {\n                            \"enum\": [\"account\", \"application\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"controller_fees_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"losses\": {\n                        \"properties\": {\n                          \"payments\": {\n                            \"enum\": [\"application\", \"stripe\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"controller_losses_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"requirement_collection\": {\n                        \"enum\": [\"application\", \"stripe\"],\n                        \"type\": \"string\"\n                      },\n                      \"stripe_dashboard\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"express\", \"full\", \"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"controller_dashboard_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"controller_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"country\": {\n                    \"description\": \"The country in which the account holder resides, or in which the business is legally established. This should be an ISO 3166-1 alpha-2 country code. For example, if you are in the United States and the business for which you're creating an account is legally represented in Canada, you would use `CA` as the country for the account being created. Available countries include [Stripe's global markets](https://stripe.com/global) as well as countries where [cross-border payouts](https://stripe.com/docs/connect/cross-border-payouts) are supported.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_currency\": {\n                    \"description\": \"Three-letter ISO currency code representing the default currency for the account. This must be a currency that [Stripe supports in the account's country](https://docs.stripe.com/payouts).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"bank_account_ownership_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_license\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_memorandum_of_association\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_ministerial_decree\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_registration_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_tax_id_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"proof_of_registration\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"proof_of_ultimate_beneficial_ownership\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"documents_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The email address of the account holder. This is only to make the account easier to identify to you. If [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts, Stripe doesn't email the account without your consent.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"external_account\": {\n                    \"description\": \"A card or bank account to attach to the account for receiving [payouts](/connect/bank-debit-card-payouts) (you won’t be able to use it for top-ups). You can provide either a token, like the ones returned by [Stripe.js](/js), or a dictionary, as documented in the `external_account` parameter for [bank account](/api#account_create_bank_account) creation. <br><br>By default, providing an external account sets it as the new default external account for its currency, and deletes the old default if one exists. To add additional external accounts without replacing the existing default for the currency, use the [bank account](/api#account_create_bank_account) or [card creation](/api#account_create_card) APIs. After you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"groups\": {\n                    \"description\": \"A hash of account group type to tokens. These are account groups this account should be added to.\",\n                    \"properties\": {\n                      \"payments_pricing\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"account_groups_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"individual\": {\n                    \"description\": \"Information about the person represented by the account. This field is null unless `business_type` is set to `individual`. Once you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kana\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kana_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kanji\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kanji_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"dob\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth_specs\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"first_name\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"first_name_kana\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"first_name_kanji\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"full_name_aliases\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 300,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"gender\": {\n                        \"type\": \"string\"\n                      },\n                      \"id_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"id_number_secondary\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"last_name\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"last_name_kana\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"last_name_kanji\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"maiden_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"phone\": {\n                        \"type\": \"string\"\n                      },\n                      \"political_exposure\": {\n                        \"enum\": [\"existing\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"registered_address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"relationship\": {\n                        \"properties\": {\n                          \"director\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"executive\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"owner\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"percent_ownership\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"number\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"title\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"individual_relationship_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"ssn_last_4\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"verification\": {\n                        \"properties\": {\n                          \"additional_document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"person_verification_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"individual_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"settings\": {\n                    \"description\": \"Options for customizing how the account functions within Stripe.\",\n                    \"properties\": {\n                      \"bacs_debit_payments\": {\n                        \"properties\": {\n                          \"display_name\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"bacs_debit_payments_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"branding\": {\n                        \"properties\": {\n                          \"icon\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"logo\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"primary_color\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"secondary_color\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"branding_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"tos_acceptance\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"settings_terms_of_service_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"card_issuing_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"card_payments\": {\n                        \"properties\": {\n                          \"decline_on\": {\n                            \"properties\": {\n                              \"avs_failure\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"cvc_failure\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"decline_charge_on_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"statement_descriptor_prefix\": {\n                            \"maxLength\": 10,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_prefix_kana\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 10,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"statement_descriptor_prefix_kanji\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 10,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"card_payments_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"payments\": {\n                        \"properties\": {\n                          \"statement_descriptor\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_kana\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_kanji\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payments_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"payouts\": {\n                        \"properties\": {\n                          \"debit_negative_balances\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"schedule\": {\n                            \"properties\": {\n                              \"delay_days\": {\n                                \"anyOf\": [\n                                  {\n                                    \"enum\": [\"minimum\"],\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"type\": \"integer\"\n                                  }\n                                ]\n                              },\n                              \"interval\": {\n                                \"enum\": [\n                                  \"daily\",\n                                  \"manual\",\n                                  \"monthly\",\n                                  \"weekly\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"monthly_anchor\": {\n                                \"type\": \"integer\"\n                              },\n                              \"weekly_anchor\": {\n                                \"enum\": [\n                                  \"friday\",\n                                  \"monday\",\n                                  \"saturday\",\n                                  \"sunday\",\n                                  \"thursday\",\n                                  \"tuesday\",\n                                  \"wednesday\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"transfer_schedule_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"statement_descriptor\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payout_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"treasury\": {\n                        \"properties\": {\n                          \"tos_acceptance\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"settings_terms_of_service_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"treasury_settings_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"settings_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"tos_acceptance\": {\n                    \"description\": \"Details on the account's acceptance of the [Stripe Services Agreement](/connect/updating-accounts#tos-acceptance). This property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts. This property defaults to a `full` service agreement when empty.\",\n                    \"properties\": {\n                      \"date\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"ip\": {\n                        \"type\": \"string\"\n                      },\n                      \"service_agreement\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"user_agent\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"tos_acceptance_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": {\n                    \"description\": \"The type of Stripe account to create. May be one of `custom`, `express` or `standard`.\",\n                    \"enum\": [\"custom\", \"express\", \"standard\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/accounts/{account}\": {\n      \"delete\": {\n        \"description\": \"<p>With <a href=\\\"/connect\\\">Connect</a>, you can delete accounts you manage.</p>\\n\\n<p>Test-mode accounts can be deleted at any time.</p>\\n\\n<p>Live-mode accounts where Stripe is responsible for negative account balances cannot be deleted, which includes Standard accounts. Live-mode accounts where your platform is liable for negative account balances, which includes Custom and Express accounts, can be deleted when all <a href=\\\"/api/balance/balance_object\\\">balances</a> are zero.</p>\\n\\n<p>If you want to delete your own account, use the <a href=\\\"https://dashboard.stripe.com/settings/account\\\">account information tab in your account settings</a> instead.</p>\",\n        \"operationId\": \"DeleteAccountsAccount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete an account\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an account.</p>\",\n        \"operationId\": \"GetAccountsAccount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve account\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a <a href=\\\"/connect/accounts\\\">connected account</a> by setting the values of the parameters passed. Any parameters not provided are\\nleft unchanged.</p>\\n\\n<p>For accounts where <a href=\\\"/api/accounts/object#account_object-controller-requirement_collection\\\">controller.requirement_collection</a>\\nis <code>application</code>, which includes Custom accounts, you can update any information on the account.</p>\\n\\n<p>For accounts where <a href=\\\"/api/accounts/object#account_object-controller-requirement_collection\\\">controller.requirement_collection</a>\\nis <code>stripe</code>, which includes Standard and Express accounts, you can update all information until you create\\nan <a href=\\\"/api/account_links\\\">Account Link</a> or <a href=\\\"/api/account_sessions\\\">Account Session</a> to start Connect onboarding,\\nafter which some properties can no longer be updated.</p>\\n\\n<p>To update your own account, use the <a href=\\\"https://dashboard.stripe.com/settings/account\\\">Dashboard</a>. Refer to our\\n<a href=\\\"/docs/connect/updating-accounts\\\">Connect</a> documentation to learn more about updating accounts.</p>\",\n        \"operationId\": \"PostAccountsAccount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"business_profile\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"capabilities\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"company\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"groups\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"individual\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tos_acceptance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_token\": {\n                    \"description\": \"An [account token](https://stripe.com/docs/api#create_account_token), used to securely provide details to the account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"business_profile\": {\n                    \"description\": \"Business information about the account.\",\n                    \"properties\": {\n                      \"annual_revenue\": {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"fiscal_year_end\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"amount\", \"currency\", \"fiscal_year_end\"],\n                        \"title\": \"annual_revenue_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"estimated_worker_count\": {\n                        \"type\": \"integer\"\n                      },\n                      \"mcc\": {\n                        \"maxLength\": 4,\n                        \"type\": \"string\"\n                      },\n                      \"monthly_estimated_revenue\": {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"amount\", \"currency\"],\n                        \"title\": \"monthly_estimated_revenue_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"product_description\": {\n                        \"maxLength\": 40000,\n                        \"type\": \"string\"\n                      },\n                      \"support_address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"support_email\": {\n                        \"type\": \"string\"\n                      },\n                      \"support_phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"support_url\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"business_profile_update_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"business_type\": {\n                    \"description\": \"The business type. Once you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"enum\": [\n                      \"company\",\n                      \"government_entity\",\n                      \"individual\",\n                      \"non_profit\"\n                    ],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"capabilities\": {\n                    \"description\": \"Each key of the dictionary represents a capability, and each capability\\nmaps to its settings (for example, whether it has been requested or not). Each\\ncapability is inactive until you have provided its specific\\nrequirements and Stripe has verified them. An account might have some\\nof its requested capabilities be active and some be inactive.\\n\\nRequired when [account.controller.stripe_dashboard.type](/api/accounts/create#create_account-controller-dashboard-type)\\nis `none`, which includes Custom accounts.\",\n                    \"properties\": {\n                      \"acss_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"alma_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"blik_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"cartes_bancaires_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"gb_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"india_international_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"jcb_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"jp_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"legacy_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"link_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"mx_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_reporting_us_1099_k\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_reporting_us_1099_misc\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"transfers\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"treasury\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_account_ach_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_transfer_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip_payments\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"capability_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"capabilities_param\",\n                    \"type\": \"object\"\n                  },\n                  \"company\": {\n                    \"description\": \"Information about the company or business. This field is available for any `business_type`. Once you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"legal_entity_and_kyc_address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kana\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kana_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kanji\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kanji_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"directors_provided\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"directorship_declaration\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"company_directorship_declaration\",\n                        \"type\": \"object\"\n                      },\n                      \"executives_provided\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"export_license_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"export_purpose_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"name_kana\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"name_kanji\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"owners_provided\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"ownership_declaration\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"company_ownership_declaration\",\n                        \"type\": \"object\"\n                      },\n                      \"ownership_exemption_reason\": {\n                        \"enum\": [\n                          \"\",\n                          \"qualified_entity_exceeds_ownership_threshold\",\n                          \"qualifies_as_financial_institution\"\n                        ],\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"registration_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"structure\": {\n                        \"enum\": [\n                          \"\",\n                          \"free_zone_establishment\",\n                          \"free_zone_llc\",\n                          \"government_instrumentality\",\n                          \"governmental_unit\",\n                          \"incorporated_non_profit\",\n                          \"incorporated_partnership\",\n                          \"limited_liability_partnership\",\n                          \"llc\",\n                          \"multi_member_llc\",\n                          \"private_company\",\n                          \"private_corporation\",\n                          \"private_partnership\",\n                          \"public_company\",\n                          \"public_corporation\",\n                          \"public_partnership\",\n                          \"registered_charity\",\n                          \"single_member_llc\",\n                          \"sole_establishment\",\n                          \"sole_proprietorship\",\n                          \"tax_exempt_government_instrumentality\",\n                          \"unincorporated_association\",\n                          \"unincorporated_non_profit\",\n                          \"unincorporated_partnership\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"tax_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tax_id_registrar\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"vat_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"verification\": {\n                        \"properties\": {\n                          \"document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"verification_document_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"verification_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"company_update_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"default_currency\": {\n                    \"description\": \"Three-letter ISO currency code representing the default currency for the account. This must be a currency that [Stripe supports in the account's country](https://docs.stripe.com/payouts).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"bank_account_ownership_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_license\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_memorandum_of_association\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_ministerial_decree\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_registration_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"company_tax_id_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"proof_of_registration\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"proof_of_ultimate_beneficial_ownership\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"documents_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The email address of the account holder. This is only to make the account easier to identify to you. If [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts, Stripe doesn't email the account without your consent.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"external_account\": {\n                    \"description\": \"A card or bank account to attach to the account for receiving [payouts](/connect/bank-debit-card-payouts) (you won’t be able to use it for top-ups). You can provide either a token, like the ones returned by [Stripe.js](/js), or a dictionary, as documented in the `external_account` parameter for [bank account](/api#account_create_bank_account) creation. <br><br>By default, providing an external account sets it as the new default external account for its currency, and deletes the old default if one exists. To add additional external accounts without replacing the existing default for the currency, use the [bank account](/api#account_create_bank_account) or [card creation](/api#account_create_card) APIs. After you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"groups\": {\n                    \"description\": \"A hash of account group type to tokens. These are account groups this account should be added to.\",\n                    \"properties\": {\n                      \"payments_pricing\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"account_groups_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"individual\": {\n                    \"description\": \"Information about the person represented by the account. This field is null unless `business_type` is set to `individual`. Once you create an [Account Link](/api/account_links) or [Account Session](/api/account_sessions), this property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kana\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kana_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kanji\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kanji_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"dob\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth_specs\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"first_name\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"first_name_kana\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"first_name_kanji\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"full_name_aliases\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 300,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"gender\": {\n                        \"type\": \"string\"\n                      },\n                      \"id_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"id_number_secondary\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"last_name\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"last_name_kana\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"last_name_kanji\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"maiden_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"phone\": {\n                        \"type\": \"string\"\n                      },\n                      \"political_exposure\": {\n                        \"enum\": [\"existing\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"registered_address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"relationship\": {\n                        \"properties\": {\n                          \"director\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"executive\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"owner\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"percent_ownership\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"number\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"title\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"individual_relationship_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"ssn_last_4\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"verification\": {\n                        \"properties\": {\n                          \"additional_document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"person_verification_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"individual_update_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"settings\": {\n                    \"description\": \"Options for customizing how the account functions within Stripe.\",\n                    \"properties\": {\n                      \"bacs_debit_payments\": {\n                        \"properties\": {\n                          \"display_name\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"bacs_debit_payments_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"branding\": {\n                        \"properties\": {\n                          \"icon\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"logo\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"primary_color\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"secondary_color\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"branding_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"tos_acceptance\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"settings_terms_of_service_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"card_issuing_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"card_payments\": {\n                        \"properties\": {\n                          \"decline_on\": {\n                            \"properties\": {\n                              \"avs_failure\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"cvc_failure\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"decline_charge_on_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"statement_descriptor_prefix\": {\n                            \"maxLength\": 10,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_prefix_kana\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 10,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"statement_descriptor_prefix_kanji\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 10,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"card_payments_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"invoices\": {\n                        \"properties\": {\n                          \"default_account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"invoices_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"payments\": {\n                        \"properties\": {\n                          \"statement_descriptor\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_kana\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_kanji\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payments_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"payouts\": {\n                        \"properties\": {\n                          \"debit_negative_balances\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"schedule\": {\n                            \"properties\": {\n                              \"delay_days\": {\n                                \"anyOf\": [\n                                  {\n                                    \"enum\": [\"minimum\"],\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"type\": \"integer\"\n                                  }\n                                ]\n                              },\n                              \"interval\": {\n                                \"enum\": [\n                                  \"daily\",\n                                  \"manual\",\n                                  \"monthly\",\n                                  \"weekly\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"monthly_anchor\": {\n                                \"type\": \"integer\"\n                              },\n                              \"weekly_anchor\": {\n                                \"enum\": [\n                                  \"friday\",\n                                  \"monday\",\n                                  \"saturday\",\n                                  \"sunday\",\n                                  \"thursday\",\n                                  \"tuesday\",\n                                  \"wednesday\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"transfer_schedule_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"statement_descriptor\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payout_settings_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"treasury\": {\n                        \"properties\": {\n                          \"tos_acceptance\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"settings_terms_of_service_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"treasury_settings_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"settings_specs_update\",\n                    \"type\": \"object\"\n                  },\n                  \"tos_acceptance\": {\n                    \"description\": \"Details on the account's acceptance of the [Stripe Services Agreement](/connect/updating-accounts#tos-acceptance). This property can only be updated for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts. This property defaults to a `full` service agreement when empty.\",\n                    \"properties\": {\n                      \"date\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"ip\": {\n                        \"type\": \"string\"\n                      },\n                      \"service_agreement\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"user_agent\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"tos_acceptance_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an account\"\n      }\n    },\n    \"/v1/accounts/{account}/bank_accounts\": {\n      \"post\": {\n        \"description\": \"<p>Create an external account for a given account.</p>\",\n        \"operationId\": \"PostAccountsAccountBankAccounts\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"bank_account\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"futsu\", \"savings\", \"toza\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"documents\": {\n                            \"properties\": {\n                              \"bank_account_ownership_verification\": {\n                                \"properties\": {\n                                  \"files\": {\n                                    \"items\": {\n                                      \"maxLength\": 500,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"documents_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"external_account_documents_param\",\n                            \"type\": \"object\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"bank_account\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"country\"],\n                        \"title\": \"external_account_payout_bank_account\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Either a token, like the ones returned by [Stripe.js](https://stripe.com/docs/js), or a dictionary containing a user's bank account details.\"\n                  },\n                  \"default_for_currency\": {\n                    \"description\": \"When set to true, or if this is the first external account added in this currency, this account becomes the default external account for its currency.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"external_account\": {\n                    \"description\": \"Please refer to full [documentation](https://stripe.com/docs/api) instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an external account\"\n      }\n    },\n    \"/v1/accounts/{account}/bank_accounts/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Delete a specified external account for a given account.</p>\",\n        \"operationId\": \"DeleteAccountsAccountBankAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete an external account\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieve a specified external account for a given account.</p>\",\n        \"operationId\": \"GetAccountsAccountBankAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an external account\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the metadata, account holder name, account holder type of a bank account belonging to\\na connected account and optionally sets it as the default for its currency. Other bank account\\ndetails are not editable by design.</p>\\n\\n<p>You can only update bank accounts when <a href=\\\"/api/accounts/object#account_object-controller-requirement_collection\\\">account.controller.requirement_collection</a> is <code>application</code>, which includes <a href=\\\"/connect/custom-accounts\\\">Custom accounts</a>.</p>\\n\\n<p>You can re-enable a disabled bank account by performing an update call without providing any\\narguments or changes.</p>\",\n        \"operationId\": \"PostAccountsAccountBankAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_holder_name\": {\n                    \"description\": \"The name of the person or business that owns the bank account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"account_holder_type\": {\n                    \"description\": \"The type of entity that holds the account. This can be either `individual` or `company`.\",\n                    \"enum\": [\"\", \"company\", \"individual\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"account_type\": {\n                    \"description\": \"The bank account type. This can only be `checking` or `savings` in most countries. In Japan, this can only be `futsu` or `toza`.\",\n                    \"enum\": [\"checking\", \"futsu\", \"savings\", \"toza\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_city\": {\n                    \"description\": \"City/District/Suburb/Town/Village.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_country\": {\n                    \"description\": \"Billing address country, if provided when creating card.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line1\": {\n                    \"description\": \"Address line 1 (Street address/PO Box/Company name).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line2\": {\n                    \"description\": \"Address line 2 (Apartment/Suite/Unit/Building).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_state\": {\n                    \"description\": \"State/County/Province/Region.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_zip\": {\n                    \"description\": \"ZIP or postal code.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_for_currency\": {\n                    \"description\": \"When set to true, this becomes the default external account for its currency.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"bank_account_ownership_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"external_account_documents_param\",\n                    \"type\": \"object\"\n                  },\n                  \"exp_month\": {\n                    \"description\": \"Two digit number representing the card’s expiration month.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_year\": {\n                    \"description\": \"Four digit number representing the card’s expiration year.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"Cardholder name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/accounts/{account}/capabilities\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of capabilities associated with the account. The capabilities are returned sorted by creation date, with the most recent capability appearing first.</p>\",\n        \"operationId\": \"GetAccountsAccountCapabilities\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/capability\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ListAccountCapability\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all account capabilities\"\n      }\n    },\n    \"/v1/accounts/{account}/capabilities/{capability}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves information about the specified Account Capability.</p>\",\n        \"operationId\": \"GetAccountsAccountCapabilitiesCapability\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"capability\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/capability\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an Account Capability\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing Account Capability. Request or remove a capability by updating its <code>requested</code> parameter.</p>\",\n        \"operationId\": \"PostAccountsAccountCapabilitiesCapability\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"capability\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"requested\": {\n                    \"description\": \"To request a new capability for an account, pass true. There can be a delay before the requested capability becomes active. If the capability has any activation requirements, the response includes them in the `requirements` arrays.\\n\\nIf a capability isn't permanent, you can remove it from the account by passing false. Some capabilities are permanent after they've been requested. Attempting to remove a permanent capability returns an error.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/capability\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an Account Capability\"\n      }\n    },\n    \"/v1/accounts/{account}/external_accounts\": {\n      \"get\": {\n        \"description\": \"<p>List external accounts for an account.</p>\",\n        \"operationId\": \"GetAccountsAccountExternalAccounts\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filter external accounts according to a particular object type.\",\n            \"in\": \"query\",\n            \"name\": \"object\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"bank_account\", \"card\"],\n              \"maxLength\": 5000,\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"The list contains all external accounts that have been attached to the Stripe account. These may be bank accounts or cards.\",\n                      \"items\": {\n                        \"anyOf\": [\n                          {\n                            \"$ref\": \"#/components/schemas/bank_account\"\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/card\"\n                          }\n                        ],\n                        \"title\": \"Polymorphic\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ExternalAccountList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all external accounts\"\n      },\n      \"post\": {\n        \"description\": \"<p>Create an external account for a given account.</p>\",\n        \"operationId\": \"PostAccountsAccountExternalAccounts\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"bank_account\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"futsu\", \"savings\", \"toza\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"documents\": {\n                            \"properties\": {\n                              \"bank_account_ownership_verification\": {\n                                \"properties\": {\n                                  \"files\": {\n                                    \"items\": {\n                                      \"maxLength\": 500,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"documents_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"external_account_documents_param\",\n                            \"type\": \"object\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"bank_account\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"country\"],\n                        \"title\": \"external_account_payout_bank_account\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Either a token, like the ones returned by [Stripe.js](https://stripe.com/docs/js), or a dictionary containing a user's bank account details.\"\n                  },\n                  \"default_for_currency\": {\n                    \"description\": \"When set to true, or if this is the first external account added in this currency, this account becomes the default external account for its currency.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"external_account\": {\n                    \"description\": \"Please refer to full [documentation](https://stripe.com/docs/api) instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an external account\"\n      }\n    },\n    \"/v1/accounts/{account}/external_accounts/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Delete a specified external account for a given account.</p>\",\n        \"operationId\": \"DeleteAccountsAccountExternalAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete an external account\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieve a specified external account for a given account.</p>\",\n        \"operationId\": \"GetAccountsAccountExternalAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an external account\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the metadata, account holder name, account holder type of a bank account belonging to\\na connected account and optionally sets it as the default for its currency. Other bank account\\ndetails are not editable by design.</p>\\n\\n<p>You can only update bank accounts when <a href=\\\"/api/accounts/object#account_object-controller-requirement_collection\\\">account.controller.requirement_collection</a> is <code>application</code>, which includes <a href=\\\"/connect/custom-accounts\\\">Custom accounts</a>.</p>\\n\\n<p>You can re-enable a disabled bank account by performing an update call without providing any\\narguments or changes.</p>\",\n        \"operationId\": \"PostAccountsAccountExternalAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_holder_name\": {\n                    \"description\": \"The name of the person or business that owns the bank account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"account_holder_type\": {\n                    \"description\": \"The type of entity that holds the account. This can be either `individual` or `company`.\",\n                    \"enum\": [\"\", \"company\", \"individual\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"account_type\": {\n                    \"description\": \"The bank account type. This can only be `checking` or `savings` in most countries. In Japan, this can only be `futsu` or `toza`.\",\n                    \"enum\": [\"checking\", \"futsu\", \"savings\", \"toza\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_city\": {\n                    \"description\": \"City/District/Suburb/Town/Village.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_country\": {\n                    \"description\": \"Billing address country, if provided when creating card.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line1\": {\n                    \"description\": \"Address line 1 (Street address/PO Box/Company name).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line2\": {\n                    \"description\": \"Address line 2 (Apartment/Suite/Unit/Building).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_state\": {\n                    \"description\": \"State/County/Province/Region.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_zip\": {\n                    \"description\": \"ZIP or postal code.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_for_currency\": {\n                    \"description\": \"When set to true, this becomes the default external account for its currency.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"bank_account_ownership_verification\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"external_account_documents_param\",\n                    \"type\": \"object\"\n                  },\n                  \"exp_month\": {\n                    \"description\": \"Two digit number representing the card’s expiration month.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_year\": {\n                    \"description\": \"Four digit number representing the card’s expiration year.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"Cardholder name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/external_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/accounts/{account}/login_links\": {\n      \"post\": {\n        \"description\": \"<p>Creates a login link for a connected account to access the Express Dashboard.</p>\\n\\n<p><strong>You can only create login links for accounts that use the <a href=\\\"/connect/express-dashboard\\\">Express Dashboard</a> and are connected to your platform</strong>.</p>\",\n        \"operationId\": \"PostAccountsAccountLoginLinks\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/login_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a login link\"\n      }\n    },\n    \"/v1/accounts/{account}/people\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of people associated with the account’s legal entity. The people are returned sorted by creation date, with the most recent people appearing first.</p>\",\n        \"operationId\": \"GetAccountsAccountPeople\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filters on the list of people returned based on the person's relationship to the account's company.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"relationship\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"authorizer\": {\n                  \"type\": \"boolean\"\n                },\n                \"director\": {\n                  \"type\": \"boolean\"\n                },\n                \"executive\": {\n                  \"type\": \"boolean\"\n                },\n                \"legal_guardian\": {\n                  \"type\": \"boolean\"\n                },\n                \"owner\": {\n                  \"type\": \"boolean\"\n                },\n                \"representative\": {\n                  \"type\": \"boolean\"\n                }\n              },\n              \"title\": \"all_people_relationship_specs\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/person\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PersonList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all persons\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new person.</p>\",\n        \"operationId\": \"PostAccountsAccountPeople\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"additional_tos_acceptances\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kana\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kanji\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"dob\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"full_name_aliases\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"registered_address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"relationship\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"verification\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"additional_tos_acceptances\": {\n                    \"description\": \"Details on the legal guardian's or authorizer's acceptance of the required Stripe agreements.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"settings_terms_of_service_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_additional_tos_acceptances_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address\": {\n                    \"description\": \"The person's address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"legal_entity_and_kyc_address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kana\": {\n                    \"description\": \"The Kana variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kana_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kanji\": {\n                    \"description\": \"The Kanji variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kanji_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"dob\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"day\": {\n                            \"type\": \"integer\"\n                          },\n                          \"month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"year\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"day\", \"month\", \"year\"],\n                        \"title\": \"date_of_birth_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The person's date of birth.\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"company_authorization\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"passport\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"visa\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_documents_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The person's email address.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"first_name\": {\n                    \"description\": \"The person's first name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kana\": {\n                    \"description\": \"The Kana variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"full_name_aliases\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of alternate names or aliases that the person is known by.\"\n                  },\n                  \"gender\": {\n                    \"description\": \"The person's gender (International regulations require either \\\"male\\\" or \\\"female\\\").\",\n                    \"type\": \"string\"\n                  },\n                  \"id_number\": {\n                    \"description\": \"The person's ID number, as appropriate for their country. For example, a social security number in the U.S., social insurance number in Canada, etc. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"id_number_secondary\": {\n                    \"description\": \"The person's secondary ID number, as appropriate for their country, will be used for enhanced verification checks. In Thailand, this would be the laser code found on the back of an ID card. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name\": {\n                    \"description\": \"The person's last name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kana\": {\n                    \"description\": \"The Kana variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"maiden_name\": {\n                    \"description\": \"The person's maiden name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"nationality\": {\n                    \"description\": \"The country where the person is a national. Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)), or \\\"XX\\\" if unavailable.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"person_token\": {\n                    \"description\": \"A [person token](https://docs.stripe.com/connect/account-tokens), used to securely provide details to the person.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"phone\": {\n                    \"description\": \"The person's phone number.\",\n                    \"type\": \"string\"\n                  },\n                  \"political_exposure\": {\n                    \"description\": \"Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction.\",\n                    \"enum\": [\"existing\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"registered_address\": {\n                    \"description\": \"The person's registered address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"relationship\": {\n                    \"description\": \"The relationship that this person has with the account's legal entity.\",\n                    \"properties\": {\n                      \"authorizer\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"director\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"executive\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"legal_guardian\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"owner\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"percent_ownership\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"number\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"representative\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"title\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"relationship_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"ssn_last_4\": {\n                    \"description\": \"The last four digits of the person's Social Security number (U.S. only).\",\n                    \"type\": \"string\"\n                  },\n                  \"verification\": {\n                    \"description\": \"The person's verification status.\",\n                    \"properties\": {\n                      \"additional_document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_verification_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a person\"\n      }\n    },\n    \"/v1/accounts/{account}/people/{person}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes an existing person’s relationship to the account’s legal entity. Any person with a relationship for an account can be deleted through the API, except if the person is the <code>account_opener</code>. If your integration is using the <code>executive</code> parameter, you cannot delete the only verified <code>executive</code> on file.</p>\",\n        \"operationId\": \"DeleteAccountsAccountPeoplePerson\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"person\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a person\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves an existing person.</p>\",\n        \"operationId\": \"GetAccountsAccountPeoplePerson\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"person\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a person\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing person.</p>\",\n        \"operationId\": \"PostAccountsAccountPeoplePerson\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"person\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"additional_tos_acceptances\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kana\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kanji\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"dob\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"full_name_aliases\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"registered_address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"relationship\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"verification\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"additional_tos_acceptances\": {\n                    \"description\": \"Details on the legal guardian's or authorizer's acceptance of the required Stripe agreements.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"settings_terms_of_service_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_additional_tos_acceptances_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address\": {\n                    \"description\": \"The person's address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"legal_entity_and_kyc_address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kana\": {\n                    \"description\": \"The Kana variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kana_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kanji\": {\n                    \"description\": \"The Kanji variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kanji_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"dob\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"day\": {\n                            \"type\": \"integer\"\n                          },\n                          \"month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"year\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"day\", \"month\", \"year\"],\n                        \"title\": \"date_of_birth_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The person's date of birth.\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"company_authorization\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"passport\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"visa\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_documents_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The person's email address.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"first_name\": {\n                    \"description\": \"The person's first name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kana\": {\n                    \"description\": \"The Kana variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"full_name_aliases\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of alternate names or aliases that the person is known by.\"\n                  },\n                  \"gender\": {\n                    \"description\": \"The person's gender (International regulations require either \\\"male\\\" or \\\"female\\\").\",\n                    \"type\": \"string\"\n                  },\n                  \"id_number\": {\n                    \"description\": \"The person's ID number, as appropriate for their country. For example, a social security number in the U.S., social insurance number in Canada, etc. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"id_number_secondary\": {\n                    \"description\": \"The person's secondary ID number, as appropriate for their country, will be used for enhanced verification checks. In Thailand, this would be the laser code found on the back of an ID card. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name\": {\n                    \"description\": \"The person's last name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kana\": {\n                    \"description\": \"The Kana variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"maiden_name\": {\n                    \"description\": \"The person's maiden name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"nationality\": {\n                    \"description\": \"The country where the person is a national. Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)), or \\\"XX\\\" if unavailable.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"person_token\": {\n                    \"description\": \"A [person token](https://docs.stripe.com/connect/account-tokens), used to securely provide details to the person.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"phone\": {\n                    \"description\": \"The person's phone number.\",\n                    \"type\": \"string\"\n                  },\n                  \"political_exposure\": {\n                    \"description\": \"Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction.\",\n                    \"enum\": [\"existing\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"registered_address\": {\n                    \"description\": \"The person's registered address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"relationship\": {\n                    \"description\": \"The relationship that this person has with the account's legal entity.\",\n                    \"properties\": {\n                      \"authorizer\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"director\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"executive\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"legal_guardian\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"owner\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"percent_ownership\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"number\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"representative\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"title\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"relationship_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"ssn_last_4\": {\n                    \"description\": \"The last four digits of the person's Social Security number (U.S. only).\",\n                    \"type\": \"string\"\n                  },\n                  \"verification\": {\n                    \"description\": \"The person's verification status.\",\n                    \"properties\": {\n                      \"additional_document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_verification_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a person\"\n      }\n    },\n    \"/v1/accounts/{account}/persons\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of people associated with the account’s legal entity. The people are returned sorted by creation date, with the most recent people appearing first.</p>\",\n        \"operationId\": \"GetAccountsAccountPersons\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filters on the list of people returned based on the person's relationship to the account's company.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"relationship\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"authorizer\": {\n                  \"type\": \"boolean\"\n                },\n                \"director\": {\n                  \"type\": \"boolean\"\n                },\n                \"executive\": {\n                  \"type\": \"boolean\"\n                },\n                \"legal_guardian\": {\n                  \"type\": \"boolean\"\n                },\n                \"owner\": {\n                  \"type\": \"boolean\"\n                },\n                \"representative\": {\n                  \"type\": \"boolean\"\n                }\n              },\n              \"title\": \"all_people_relationship_specs\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/person\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PersonList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all persons\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new person.</p>\",\n        \"operationId\": \"PostAccountsAccountPersons\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"additional_tos_acceptances\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kana\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kanji\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"dob\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"full_name_aliases\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"registered_address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"relationship\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"verification\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"additional_tos_acceptances\": {\n                    \"description\": \"Details on the legal guardian's or authorizer's acceptance of the required Stripe agreements.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"settings_terms_of_service_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_additional_tos_acceptances_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address\": {\n                    \"description\": \"The person's address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"legal_entity_and_kyc_address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kana\": {\n                    \"description\": \"The Kana variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kana_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kanji\": {\n                    \"description\": \"The Kanji variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kanji_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"dob\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"day\": {\n                            \"type\": \"integer\"\n                          },\n                          \"month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"year\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"day\", \"month\", \"year\"],\n                        \"title\": \"date_of_birth_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The person's date of birth.\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"company_authorization\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"passport\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"visa\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_documents_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The person's email address.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"first_name\": {\n                    \"description\": \"The person's first name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kana\": {\n                    \"description\": \"The Kana variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"full_name_aliases\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of alternate names or aliases that the person is known by.\"\n                  },\n                  \"gender\": {\n                    \"description\": \"The person's gender (International regulations require either \\\"male\\\" or \\\"female\\\").\",\n                    \"type\": \"string\"\n                  },\n                  \"id_number\": {\n                    \"description\": \"The person's ID number, as appropriate for their country. For example, a social security number in the U.S., social insurance number in Canada, etc. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"id_number_secondary\": {\n                    \"description\": \"The person's secondary ID number, as appropriate for their country, will be used for enhanced verification checks. In Thailand, this would be the laser code found on the back of an ID card. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name\": {\n                    \"description\": \"The person's last name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kana\": {\n                    \"description\": \"The Kana variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"maiden_name\": {\n                    \"description\": \"The person's maiden name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"nationality\": {\n                    \"description\": \"The country where the person is a national. Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)), or \\\"XX\\\" if unavailable.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"person_token\": {\n                    \"description\": \"A [person token](https://docs.stripe.com/connect/account-tokens), used to securely provide details to the person.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"phone\": {\n                    \"description\": \"The person's phone number.\",\n                    \"type\": \"string\"\n                  },\n                  \"political_exposure\": {\n                    \"description\": \"Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction.\",\n                    \"enum\": [\"existing\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"registered_address\": {\n                    \"description\": \"The person's registered address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"relationship\": {\n                    \"description\": \"The relationship that this person has with the account's legal entity.\",\n                    \"properties\": {\n                      \"authorizer\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"director\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"executive\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"legal_guardian\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"owner\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"percent_ownership\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"number\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"representative\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"title\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"relationship_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"ssn_last_4\": {\n                    \"description\": \"The last four digits of the person's Social Security number (U.S. only).\",\n                    \"type\": \"string\"\n                  },\n                  \"verification\": {\n                    \"description\": \"The person's verification status.\",\n                    \"properties\": {\n                      \"additional_document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_verification_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a person\"\n      }\n    },\n    \"/v1/accounts/{account}/persons/{person}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes an existing person’s relationship to the account’s legal entity. Any person with a relationship for an account can be deleted through the API, except if the person is the <code>account_opener</code>. If your integration is using the <code>executive</code> parameter, you cannot delete the only verified <code>executive</code> on file.</p>\",\n        \"operationId\": \"DeleteAccountsAccountPersonsPerson\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"person\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a person\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves an existing person.</p>\",\n        \"operationId\": \"GetAccountsAccountPersonsPerson\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"person\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a person\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing person.</p>\",\n        \"operationId\": \"PostAccountsAccountPersonsPerson\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"person\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"additional_tos_acceptances\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kana\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"address_kanji\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"dob\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"documents\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"full_name_aliases\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"registered_address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"relationship\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"verification\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"additional_tos_acceptances\": {\n                    \"description\": \"Details on the legal guardian's or authorizer's acceptance of the required Stripe agreements.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"settings_terms_of_service_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_additional_tos_acceptances_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address\": {\n                    \"description\": \"The person's address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"legal_entity_and_kyc_address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kana\": {\n                    \"description\": \"The Kana variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kana_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"address_kanji\": {\n                    \"description\": \"The Kanji variation of the person's address (Japan only).\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"town\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"japan_address_kanji_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"dob\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"day\": {\n                            \"type\": \"integer\"\n                          },\n                          \"month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"year\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"day\", \"month\", \"year\"],\n                        \"title\": \"date_of_birth_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The person's date of birth.\"\n                  },\n                  \"documents\": {\n                    \"description\": \"Documents that may be submitted to satisfy various informational requests.\",\n                    \"properties\": {\n                      \"company_authorization\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"passport\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      },\n                      \"visa\": {\n                        \"properties\": {\n                          \"files\": {\n                            \"items\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"documents_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_documents_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The person's email address.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"first_name\": {\n                    \"description\": \"The person's first name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kana\": {\n                    \"description\": \"The Kana variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"first_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's first name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"full_name_aliases\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of alternate names or aliases that the person is known by.\"\n                  },\n                  \"gender\": {\n                    \"description\": \"The person's gender (International regulations require either \\\"male\\\" or \\\"female\\\").\",\n                    \"type\": \"string\"\n                  },\n                  \"id_number\": {\n                    \"description\": \"The person's ID number, as appropriate for their country. For example, a social security number in the U.S., social insurance number in Canada, etc. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"id_number_secondary\": {\n                    \"description\": \"The person's secondary ID number, as appropriate for their country, will be used for enhanced verification checks. In Thailand, this would be the laser code found on the back of an ID card. Instead of the number itself, you can also provide a [PII token provided by Stripe.js](https://docs.stripe.com/js/tokens/create_token?type=pii).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name\": {\n                    \"description\": \"The person's last name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kana\": {\n                    \"description\": \"The Kana variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"last_name_kanji\": {\n                    \"description\": \"The Kanji variation of the person's last name (Japan only).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"maiden_name\": {\n                    \"description\": \"The person's maiden name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"nationality\": {\n                    \"description\": \"The country where the person is a national. Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)), or \\\"XX\\\" if unavailable.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"person_token\": {\n                    \"description\": \"A [person token](https://docs.stripe.com/connect/account-tokens), used to securely provide details to the person.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"phone\": {\n                    \"description\": \"The person's phone number.\",\n                    \"type\": \"string\"\n                  },\n                  \"political_exposure\": {\n                    \"description\": \"Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction.\",\n                    \"enum\": [\"existing\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"registered_address\": {\n                    \"description\": \"The person's registered address.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"address_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"relationship\": {\n                    \"description\": \"The relationship that this person has with the account's legal entity.\",\n                    \"properties\": {\n                      \"authorizer\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"director\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"executive\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"legal_guardian\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"owner\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"percent_ownership\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"number\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"representative\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"title\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"relationship_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"ssn_last_4\": {\n                    \"description\": \"The last four digits of the person's Social Security number (U.S. only).\",\n                    \"type\": \"string\"\n                  },\n                  \"verification\": {\n                    \"description\": \"The person's verification status.\",\n                    \"properties\": {\n                      \"additional_document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"document\": {\n                        \"properties\": {\n                          \"back\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          \"front\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"person_verification_document_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_verification_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/person\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a person\"\n      }\n    },\n    \"/v1/accounts/{account}/reject\": {\n      \"post\": {\n        \"description\": \"<p>With <a href=\\\"/connect\\\">Connect</a>, you can reject accounts that you have flagged as suspicious.</p>\\n\\n<p>Only accounts where your platform is liable for negative account balances, which includes Custom and Express accounts, can be rejected. Test-mode accounts can be rejected at any time. Live-mode accounts can only be rejected after all balances are zero.</p>\",\n        \"operationId\": \"PostAccountsAccountReject\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"reason\": {\n                    \"description\": \"The reason for rejecting the account. Can be `fraud`, `terms_of_service`, or `other`.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"reason\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Reject an account\"\n      }\n    },\n    \"/v1/apple_pay/domains\": {\n      \"get\": {\n        \"description\": \"<p>List apple pay domains.</p>\",\n        \"operationId\": \"GetApplePayDomains\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"domain_name\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/apple_pay_domain\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/apple_pay/domains\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ApplePayDomainList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      },\n      \"post\": {\n        \"description\": \"<p>Create an apple pay domain.</p>\",\n        \"operationId\": \"PostApplePayDomains\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"domain_name\": {\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"domain_name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/apple_pay_domain\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/apple_pay/domains/{domain}\": {\n      \"delete\": {\n        \"description\": \"<p>Delete an apple pay domain.</p>\",\n        \"operationId\": \"DeleteApplePayDomainsDomain\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"domain\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_apple_pay_domain\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieve an apple pay domain.</p>\",\n        \"operationId\": \"GetApplePayDomainsDomain\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"domain\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/apple_pay_domain\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/application_fees\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of application fees you’ve previously collected. The application fees are returned in sorted order, with the most recent fees appearing first.</p>\",\n        \"operationId\": \"GetApplicationFees\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return application fees for the charge specified by this charge ID.\",\n            \"in\": \"query\",\n            \"name\": \"charge\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return applications fees that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/application_fee\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/application_fees\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PlatformEarningList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all application fees\"\n      }\n    },\n    \"/v1/application_fees/{fee}/refunds/{id}\": {\n      \"get\": {\n        \"description\": \"<p>By default, you can see the 10 most recent refunds stored directly on the application fee object, but you can also retrieve details about a specific refund stored on the application fee.</p>\",\n        \"operationId\": \"GetApplicationFeesFeeRefundsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"fee\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/fee_refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an application fee refund\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified application fee refund by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\\n\\n<p>This request only accepts metadata as an argument.</p>\",\n        \"operationId\": \"PostApplicationFeesFeeRefundsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"fee\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/fee_refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an application fee refund\"\n      }\n    },\n    \"/v1/application_fees/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an application fee that your account has collected. The same information is returned when refunding the application fee.</p>\",\n        \"operationId\": \"GetApplicationFeesId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/application_fee\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an application fee\"\n      }\n    },\n    \"/v1/application_fees/{id}/refund\": {\n      \"post\": {\n        \"description\": \"\",\n        \"operationId\": \"PostApplicationFeesIdRefund\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"directive\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/application_fee\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/application_fees/{id}/refunds\": {\n      \"get\": {\n        \"description\": \"<p>You can see a list of the refunds belonging to a specific application fee. Note that the 10 most recent refunds are always available by default on the application fee object. If you need more than those 10, you can use this API method and the <code>limit</code> and <code>starting_after</code> parameters to page through additional refunds.</p>\",\n        \"operationId\": \"GetApplicationFeesIdRefunds\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/fee_refund\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"FeeRefundList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all application fee refunds\"\n      },\n      \"post\": {\n        \"description\": \"<p>Refunds an application fee that has previously been collected but not yet refunded.\\nFunds will be refunded to the Stripe account from which the fee was originally collected.</p>\\n\\n<p>You can optionally refund only part of an application fee.\\nYou can do so multiple times, until the entire fee has been refunded.</p>\\n\\n<p>Once entirely refunded, an application fee can’t be refunded again.\\nThis method will raise an error when called on an already-refunded application fee,\\nor when trying to refund more money than is left on an application fee.</p>\",\n        \"operationId\": \"PostApplicationFeesIdRefunds\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"A positive integer, in _cents (or local equivalent)_, representing how much of this fee to refund. Can refund only up to the remaining unrefunded amount of the fee.\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/fee_refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an application fee refund\"\n      }\n    },\n    \"/v1/apps/secrets\": {\n      \"get\": {\n        \"description\": \"<p>List all secrets stored on the given scope.</p>\",\n        \"operationId\": \"GetAppsSecrets\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies the scoping of the secret. Requests originating from UI extensions can only access account-scoped secrets or secrets scoped to their own user.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"scope\",\n            \"required\": true,\n            \"schema\": {\n              \"properties\": {\n                \"type\": {\n                  \"enum\": [\"account\", \"user\"],\n                  \"type\": \"string\"\n                },\n                \"user\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"type\"],\n              \"title\": \"scope_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/apps.secret\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/apps/secrets\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SecretServiceResourceSecretList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List secrets\"\n      },\n      \"post\": {\n        \"description\": \"<p>Create or replace a secret in the secret store.</p>\",\n        \"operationId\": \"PostAppsSecrets\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"scope\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"The Unix timestamp for the expiry time of the secret, after which the secret deletes.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"name\": {\n                    \"description\": \"A name for the secret that's unique within the scope.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payload\": {\n                    \"description\": \"The plaintext secret value to be stored.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"scope\": {\n                    \"description\": \"Specifies the scoping of the secret. Requests originating from UI extensions can only access account-scoped secrets or secrets scoped to their own user.\",\n                    \"properties\": {\n                      \"type\": {\n                        \"enum\": [\"account\", \"user\"],\n                        \"type\": \"string\"\n                      },\n                      \"user\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"scope_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"name\", \"payload\", \"scope\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/apps.secret\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Set a Secret\"\n      }\n    },\n    \"/v1/apps/secrets/delete\": {\n      \"post\": {\n        \"description\": \"<p>Deletes a secret from the secret store by name and scope.</p>\",\n        \"operationId\": \"PostAppsSecretsDelete\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"scope\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"name\": {\n                    \"description\": \"A name for the secret that's unique within the scope.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"scope\": {\n                    \"description\": \"Specifies the scoping of the secret. Requests originating from UI extensions can only access account-scoped secrets or secrets scoped to their own user.\",\n                    \"properties\": {\n                      \"type\": {\n                        \"enum\": [\"account\", \"user\"],\n                        \"type\": \"string\"\n                      },\n                      \"user\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"scope_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"name\", \"scope\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/apps.secret\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a Secret\"\n      }\n    },\n    \"/v1/apps/secrets/find\": {\n      \"get\": {\n        \"description\": \"<p>Finds a secret in the secret store by name and scope.</p>\",\n        \"operationId\": \"GetAppsSecretsFind\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A name for the secret that's unique within the scope.\",\n            \"in\": \"query\",\n            \"name\": \"name\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies the scoping of the secret. Requests originating from UI extensions can only access account-scoped secrets or secrets scoped to their own user.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"scope\",\n            \"required\": true,\n            \"schema\": {\n              \"properties\": {\n                \"type\": {\n                  \"enum\": [\"account\", \"user\"],\n                  \"type\": \"string\"\n                },\n                \"user\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"type\"],\n              \"title\": \"scope_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/apps.secret\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Find a Secret\"\n      }\n    },\n    \"/v1/balance\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the current account balance, based on the authentication that was used to make the request.\\n For a sample request, see <a href=\\\"/docs/connect/account-balances#accounting-for-negative-balances\\\">Accounting for negative balances</a>.</p>\",\n        \"operationId\": \"GetBalance\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/balance\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve balance\"\n      }\n    },\n    \"/v1/balance/history\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of transactions that have contributed to the Stripe account balance (e.g., charges, transfers, and so forth). The transactions are returned in sorted order, with the most recent transactions appearing first.</p>\\n\\n<p>Note that this endpoint was previously called “Balance history” and used the path <code>/v1/balance/history</code>.</p>\",\n        \"operationId\": \"GetBalanceHistory\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return transactions that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return transactions in a certain currency. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"in\": \"query\",\n            \"name\": \"currency\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"currency\",\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"For automatic Stripe payouts only, only returns transactions that were paid out on the specified payout ID.\",\n            \"in\": \"query\",\n            \"name\": \"payout\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only returns the original transaction.\",\n            \"in\": \"query\",\n            \"name\": \"source\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only returns transactions of the given type. One of: `adjustment`, `advance`, `advance_funding`, `anticipation_repayment`, `application_fee`, `application_fee_refund`, `charge`, `climate_order_purchase`, `climate_order_refund`, `connect_collection_transfer`, `contribution`, `issuing_authorization_hold`, `issuing_authorization_release`, `issuing_dispute`, `issuing_transaction`, `obligation_outbound`, `obligation_reversal_inbound`, `payment`, `payment_failure_refund`, `payment_network_reserve_hold`, `payment_network_reserve_release`, `payment_refund`, `payment_reversal`, `payment_unreconciled`, `payout`, `payout_cancel`, `payout_failure`, `payout_minimum_balance_hold`, `payout_minimum_balance_release`, `refund`, `refund_failure`, `reserve_transaction`, `reserved_funds`, `stripe_fee`, `stripe_fx_fee`, `tax_fee`, `topup`, `topup_reversal`, `transfer`, `transfer_cancel`, `transfer_failure`, or `transfer_refund`.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/balance_transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/balance_transactions\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BalanceTransactionsList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all balance transactions\"\n      }\n    },\n    \"/v1/balance/history/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the balance transaction with the given ID.</p>\\n\\n<p>Note that this endpoint previously used the path <code>/v1/balance/history/:id</code>.</p>\",\n        \"operationId\": \"GetBalanceHistoryId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a balance transaction\"\n      }\n    },\n    \"/v1/balance_transactions\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of transactions that have contributed to the Stripe account balance (e.g., charges, transfers, and so forth). The transactions are returned in sorted order, with the most recent transactions appearing first.</p>\\n\\n<p>Note that this endpoint was previously called “Balance history” and used the path <code>/v1/balance/history</code>.</p>\",\n        \"operationId\": \"GetBalanceTransactions\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return transactions that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return transactions in a certain currency. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n            \"in\": \"query\",\n            \"name\": \"currency\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"currency\",\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"For automatic Stripe payouts only, only returns transactions that were paid out on the specified payout ID.\",\n            \"in\": \"query\",\n            \"name\": \"payout\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only returns the original transaction.\",\n            \"in\": \"query\",\n            \"name\": \"source\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only returns transactions of the given type. One of: `adjustment`, `advance`, `advance_funding`, `anticipation_repayment`, `application_fee`, `application_fee_refund`, `charge`, `climate_order_purchase`, `climate_order_refund`, `connect_collection_transfer`, `contribution`, `issuing_authorization_hold`, `issuing_authorization_release`, `issuing_dispute`, `issuing_transaction`, `obligation_outbound`, `obligation_reversal_inbound`, `payment`, `payment_failure_refund`, `payment_network_reserve_hold`, `payment_network_reserve_release`, `payment_refund`, `payment_reversal`, `payment_unreconciled`, `payout`, `payout_cancel`, `payout_failure`, `payout_minimum_balance_hold`, `payout_minimum_balance_release`, `refund`, `refund_failure`, `reserve_transaction`, `reserved_funds`, `stripe_fee`, `stripe_fx_fee`, `tax_fee`, `topup`, `topup_reversal`, `transfer`, `transfer_cancel`, `transfer_failure`, or `transfer_refund`.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/balance_transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/balance_transactions\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BalanceTransactionsList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all balance transactions\"\n      }\n    },\n    \"/v1/balance_transactions/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the balance transaction with the given ID.</p>\\n\\n<p>Note that this endpoint previously used the path <code>/v1/balance/history/:id</code>.</p>\",\n        \"operationId\": \"GetBalanceTransactionsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a balance transaction\"\n      }\n    },\n    \"/v1/billing/alerts\": {\n      \"get\": {\n        \"description\": \"<p>Lists billing active and inactive alerts</p>\",\n        \"operationId\": \"GetBillingAlerts\",\n        \"parameters\": [\n          {\n            \"description\": \"Filter results to only include this type of alert.\",\n            \"in\": \"query\",\n            \"name\": \"alert_type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"usage_threshold\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filter results to only include alerts with the given meter.\",\n            \"in\": \"query\",\n            \"name\": \"meter\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/billing.alert\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/billing/alerts\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ThresholdsResourceAlertList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List billing alerts\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a billing alert</p>\",\n        \"operationId\": \"PostBillingAlerts\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"usage_threshold\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"alert_type\": {\n                    \"description\": \"The type of alert to create.\",\n                    \"enum\": [\"usage_threshold\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"title\": {\n                    \"description\": \"The title of the alert.\",\n                    \"maxLength\": 256,\n                    \"type\": \"string\"\n                  },\n                  \"usage_threshold\": {\n                    \"description\": \"The configuration of the usage threshold.\",\n                    \"properties\": {\n                      \"filters\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"customer\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": {\n                              \"enum\": [\"customer\"],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"type\"],\n                          \"title\": \"usage_alert_filter\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"gte\": {\n                        \"type\": \"integer\"\n                      },\n                      \"meter\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"recurrence\": {\n                        \"enum\": [\"one_time\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      }\n                    },\n                    \"required\": [\"gte\", \"recurrence\"],\n                    \"title\": \"usage_threshold_config\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"alert_type\", \"title\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.alert\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a billing alert\"\n      }\n    },\n    \"/v1/billing/alerts/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a billing alert given an ID</p>\",\n        \"operationId\": \"GetBillingAlertsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.alert\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a billing alert\"\n      }\n    },\n    \"/v1/billing/alerts/{id}/activate\": {\n      \"post\": {\n        \"description\": \"<p>Reactivates this alert, allowing it to trigger again.</p>\",\n        \"operationId\": \"PostBillingAlertsIdActivate\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.alert\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Activate a billing alert\"\n      }\n    },\n    \"/v1/billing/alerts/{id}/archive\": {\n      \"post\": {\n        \"description\": \"<p>Archives this alert, removing it from the list view and APIs. This is non-reversible.</p>\",\n        \"operationId\": \"PostBillingAlertsIdArchive\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.alert\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Archive a billing alert\"\n      }\n    },\n    \"/v1/billing/alerts/{id}/deactivate\": {\n      \"post\": {\n        \"description\": \"<p>Deactivates this alert, preventing it from triggering.</p>\",\n        \"operationId\": \"PostBillingAlertsIdDeactivate\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.alert\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Deactivate a billing alert\"\n      }\n    },\n    \"/v1/billing/credit_balance_summary\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the credit balance summary for a customer.</p>\",\n        \"operationId\": \"GetBillingCreditBalanceSummary\",\n        \"parameters\": [\n          {\n            \"description\": \"The customer for which to fetch credit balance summary.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The filter criteria for the credit balance summary.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"filter\",\n            \"required\": true,\n            \"schema\": {\n              \"properties\": {\n                \"applicability_scope\": {\n                  \"properties\": {\n                    \"price_type\": {\n                      \"enum\": [\"metered\"],\n                      \"type\": \"string\"\n                    },\n                    \"prices\": {\n                      \"items\": {\n                        \"properties\": {\n                          \"id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"id\"],\n                        \"title\": \"applicable_price_param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": \"array\"\n                    }\n                  },\n                  \"title\": \"scope_param\",\n                  \"type\": \"object\"\n                },\n                \"credit_grant\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                \"type\": {\n                  \"enum\": [\"applicability_scope\", \"credit_grant\"],\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"type\"],\n              \"title\": \"balance_summary_filter_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.credit_balance_summary\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve the credit balance summary for a customer\"\n      }\n    },\n    \"/v1/billing/credit_balance_transactions\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a list of credit balance transactions.</p>\",\n        \"operationId\": \"GetBillingCreditBalanceTransactions\",\n        \"parameters\": [\n          {\n            \"description\": \"The credit grant for which to fetch credit balance transactions.\",\n            \"in\": \"query\",\n            \"name\": \"credit_grant\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The customer for which to fetch credit balance transactions.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/billing.credit_balance_transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/billing/credit_grants\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BillingCreditGrantsResourceBalanceTransactionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List credit balance transactions\"\n      }\n    },\n    \"/v1/billing/credit_balance_transactions/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a credit balance transaction.</p>\",\n        \"operationId\": \"GetBillingCreditBalanceTransactionsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.credit_balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a credit balance transaction\"\n      }\n    },\n    \"/v1/billing/credit_grants\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a list of credit grants.</p>\",\n        \"operationId\": \"GetBillingCreditGrants\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return credit grants for this customer.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/billing.credit_grant\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/billing/credit_grants\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BillingCreditGrantsResourceCreditGrantList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List credit grants\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a credit grant.</p>\",\n        \"operationId\": \"PostBillingCreditGrants\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"amount\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"applicability_config\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount of this credit grant.\",\n                    \"properties\": {\n                      \"monetary\": {\n                        \"properties\": {\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"value\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"currency\", \"value\"],\n                        \"title\": \"monetary_amount_param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"monetary\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"amount_param\",\n                    \"type\": \"object\"\n                  },\n                  \"applicability_config\": {\n                    \"description\": \"Configuration specifying what this credit grant applies to. We currently only support `metered` prices that have a [Billing Meter](https://docs.stripe.com/api/billing/meter) attached to them.\",\n                    \"properties\": {\n                      \"scope\": {\n                        \"properties\": {\n                          \"price_type\": {\n                            \"enum\": [\"metered\"],\n                            \"type\": \"string\"\n                          },\n                          \"prices\": {\n                            \"items\": {\n                              \"properties\": {\n                                \"id\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"id\"],\n                              \"title\": \"applicable_price_param\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"title\": \"scope_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"scope\"],\n                    \"title\": \"applicability_config_param\",\n                    \"type\": \"object\"\n                  },\n                  \"category\": {\n                    \"description\": \"The category of this credit grant.\",\n                    \"enum\": [\"paid\", \"promotional\"],\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"ID of the customer to receive the billing credits.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"effective_at\": {\n                    \"description\": \"The time when the billing credits become effective-when they're eligible for use. It defaults to the current timestamp if not specified.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"The time when the billing credits expire. If not specified, the billing credits don't expire.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of key-value pairs that you can attach to an object. You can use this to store additional information about the object (for example, cost basis) in a structured format.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"A descriptive name shown in the Dashboard.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"priority\": {\n                    \"description\": \"The desired priority for applying this credit grant. If not specified, it will be set to the default value of 50. The highest priority is 0 and the lowest is 100.\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"required\": [\n                  \"amount\",\n                  \"applicability_config\",\n                  \"category\",\n                  \"customer\"\n                ],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.credit_grant\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a credit grant\"\n      }\n    },\n    \"/v1/billing/credit_grants/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a credit grant.</p>\",\n        \"operationId\": \"GetBillingCreditGrantsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.credit_grant\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a credit grant\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a credit grant.</p>\",\n        \"operationId\": \"PostBillingCreditGrantsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expires_at\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"anyOf\": [\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The time when the billing credits created by this credit grant expire. If set to empty, the billing credits never expire.\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of key-value pairs you can attach to an object. You can use this to store additional information about the object (for example, cost basis) in a structured format.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.credit_grant\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a credit grant\"\n      }\n    },\n    \"/v1/billing/credit_grants/{id}/expire\": {\n      \"post\": {\n        \"description\": \"<p>Expires a credit grant.</p>\",\n        \"operationId\": \"PostBillingCreditGrantsIdExpire\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.credit_grant\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Expire a credit grant\"\n      }\n    },\n    \"/v1/billing/credit_grants/{id}/void\": {\n      \"post\": {\n        \"description\": \"<p>Voids a credit grant.</p>\",\n        \"operationId\": \"PostBillingCreditGrantsIdVoid\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.credit_grant\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Void a credit grant\"\n      }\n    },\n    \"/v1/billing/meter_event_adjustments\": {\n      \"post\": {\n        \"description\": \"<p>Creates a billing meter event adjustment.</p>\",\n        \"operationId\": \"PostBillingMeterEventAdjustments\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"cancel\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"cancel\": {\n                    \"description\": \"Specifies which event to cancel.\",\n                    \"properties\": {\n                      \"identifier\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"event_adjustment_cancel_settings_param\",\n                    \"type\": \"object\"\n                  },\n                  \"event_name\": {\n                    \"description\": \"The name of the meter event. Corresponds with the `event_name` field on a meter.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"type\": {\n                    \"description\": \"Specifies whether to cancel a single event or a range of events for a time period. Time period cancellation is not supported yet.\",\n                    \"enum\": [\"cancel\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"event_name\", \"type\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.meter_event_adjustment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a billing meter event adjustment\"\n      }\n    },\n    \"/v1/billing/meter_events\": {\n      \"post\": {\n        \"description\": \"<p>Creates a billing meter event.</p>\",\n        \"operationId\": \"PostBillingMeterEvents\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payload\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"event_name\": {\n                    \"description\": \"The name of the meter event. Corresponds with the `event_name` field on a meter.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"identifier\": {\n                    \"description\": \"A unique identifier for the event. If not provided, one is generated. We recommend using UUID-like identifiers. We will enforce uniqueness within a rolling period of at least 24 hours. The enforcement of uniqueness primarily addresses issues arising from accidental retries or other problems occurring within extremely brief time intervals. This approach helps prevent duplicate entries and ensures data integrity in high-frequency operations.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"payload\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"The payload of the event. This must contain the fields corresponding to a meter's `customer_mapping.event_payload_key` (default is `stripe_customer_id`) and `value_settings.event_payload_key` (default is `value`). Read more about the [payload](https://docs.stripe.com/billing/subscriptions/usage-based/recording-usage#payload-key-overrides).\",\n                    \"type\": \"object\"\n                  },\n                  \"timestamp\": {\n                    \"description\": \"The time of the event. Measured in seconds since the Unix epoch. Must be within the past 35 calendar days or up to 5 minutes in the future. Defaults to current timestamp if not specified.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"required\": [\"event_name\", \"payload\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.meter_event\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a billing meter event\"\n      }\n    },\n    \"/v1/billing/meters\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a list of billing meters.</p>\",\n        \"operationId\": \"GetBillingMeters\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filter results to only include meters with the given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"inactive\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/billing.meter\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/billing/meters\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BillingMeterResourceBillingMeterList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List billing meters\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a billing meter.</p>\",\n        \"operationId\": \"PostBillingMeters\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"customer_mapping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_aggregation\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"value_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"customer_mapping\": {\n                    \"description\": \"Fields that specify how to map a meter event to a customer.\",\n                    \"properties\": {\n                      \"event_payload_key\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"by_id\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"event_payload_key\", \"type\"],\n                    \"title\": \"customer_mapping_param\",\n                    \"type\": \"object\"\n                  },\n                  \"default_aggregation\": {\n                    \"description\": \"The default settings to aggregate a meter's events with.\",\n                    \"properties\": {\n                      \"formula\": {\n                        \"enum\": [\"count\", \"sum\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"formula\"],\n                    \"title\": \"aggregation_settings_param\",\n                    \"type\": \"object\"\n                  },\n                  \"display_name\": {\n                    \"description\": \"The meter’s name. Not visible to the customer.\",\n                    \"maxLength\": 250,\n                    \"type\": \"string\"\n                  },\n                  \"event_name\": {\n                    \"description\": \"The name of the meter event to record usage for. Corresponds with the `event_name` field on meter events.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"event_time_window\": {\n                    \"description\": \"The time window to pre-aggregate meter events for, if any.\",\n                    \"enum\": [\"day\", \"hour\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"value_settings\": {\n                    \"description\": \"Fields that specify how to calculate a meter event's value.\",\n                    \"properties\": {\n                      \"event_payload_key\": {\n                        \"maxLength\": 100,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"event_payload_key\"],\n                    \"title\": \"meter_value_settings_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\n                  \"default_aggregation\",\n                  \"display_name\",\n                  \"event_name\"\n                ],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.meter\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a billing meter\"\n      }\n    },\n    \"/v1/billing/meters/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a billing meter given an ID.</p>\",\n        \"operationId\": \"GetBillingMetersId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.meter\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a billing meter\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a billing meter.</p>\",\n        \"operationId\": \"PostBillingMetersId\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"display_name\": {\n                    \"description\": \"The meter’s name. Not visible to the customer.\",\n                    \"maxLength\": 250,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.meter\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a billing meter\"\n      }\n    },\n    \"/v1/billing/meters/{id}/deactivate\": {\n      \"post\": {\n        \"description\": \"<p>When a meter is deactivated, no more meter events will be accepted for this meter. You can’t attach a deactivated meter to a price.</p>\",\n        \"operationId\": \"PostBillingMetersIdDeactivate\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.meter\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Deactivate a billing meter\"\n      }\n    },\n    \"/v1/billing/meters/{id}/event_summaries\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a list of billing meter event summaries.</p>\",\n        \"operationId\": \"GetBillingMetersIdEventSummaries\",\n        \"parameters\": [\n          {\n            \"description\": \"The customer for which to fetch event summaries.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The timestamp from when to stop aggregating meter events (exclusive). Must be aligned with minute boundaries.\",\n            \"in\": \"query\",\n            \"name\": \"end_time\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The timestamp from when to start aggregating meter events (inclusive). Must be aligned with minute boundaries.\",\n            \"in\": \"query\",\n            \"name\": \"start_time\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies what granularity to use when generating event summaries. If not specified, a single event summary would be returned for the specified time range. For hourly granularity, start and end times must align with hour boundaries (e.g., 00:00, 01:00, ..., 23:00). For daily granularity, start and end times must align with UTC day boundaries (00:00 UTC).\",\n            \"in\": \"query\",\n            \"name\": \"value_grouping_window\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"day\", \"hour\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/billing.meter_event_summary\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/billing/meters/[^/]+/event_summaries\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BillingMeterResourceBillingMeterEventSummaryList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List billing meter event summaries\"\n      }\n    },\n    \"/v1/billing/meters/{id}/reactivate\": {\n      \"post\": {\n        \"description\": \"<p>When a meter is reactivated, events for this meter can be accepted and you can attach the meter to a price.</p>\",\n        \"operationId\": \"PostBillingMetersIdReactivate\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier for the object.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing.meter\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Reactivate a billing meter\"\n      }\n    },\n    \"/v1/billing_portal/configurations\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of configurations that describe the functionality of the customer portal.</p>\",\n        \"operationId\": \"GetBillingPortalConfigurations\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return configurations that are active or inactive (e.g., pass `true` to only list active configurations).\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return the default or non-default configurations (e.g., pass `true` to only list the default configuration).\",\n            \"in\": \"query\",\n            \"name\": \"is_default\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/billing_portal.configuration\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/billing_portal/configurations\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PortalPublicResourceConfigurationList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List portal configurations\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a configuration that describes the functionality and behavior of a PortalSession</p>\",\n        \"operationId\": \"PostBillingPortalConfigurations\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"business_profile\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_return_url\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"login_page\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"business_profile\": {\n                    \"description\": \"The business information shown to customers in the portal.\",\n                    \"properties\": {\n                      \"headline\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 60,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"privacy_policy_url\": {\n                        \"type\": \"string\"\n                      },\n                      \"terms_of_service_url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"business_profile_create_param\",\n                    \"type\": \"object\"\n                  },\n                  \"default_return_url\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The default URL to redirect customers to when they click on the portal's link to return to your website. This can be [overriden](https://stripe.com/docs/api/customer_portal/sessions/create#create_portal_session-return_url) when creating the session.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"Information about the features available in the portal.\",\n                    \"properties\": {\n                      \"customer_update\": {\n                        \"properties\": {\n                          \"allowed_updates\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"address\",\n                                    \"email\",\n                                    \"name\",\n                                    \"phone\",\n                                    \"shipping\",\n                                    \"tax_id\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"customer_update_creation_param\",\n                        \"type\": \"object\"\n                      },\n                      \"invoice_history\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"invoice_list_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_update\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"payment_method_update_param\",\n                        \"type\": \"object\"\n                      },\n                      \"subscription_cancel\": {\n                        \"properties\": {\n                          \"cancellation_reason\": {\n                            \"properties\": {\n                              \"enabled\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"options\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"customer_service\",\n                                        \"low_quality\",\n                                        \"missing_features\",\n                                        \"other\",\n                                        \"switched_service\",\n                                        \"too_complex\",\n                                        \"too_expensive\",\n                                        \"unused\"\n                                      ],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"required\": [\"enabled\", \"options\"],\n                            \"title\": \"subscription_cancellation_reason_creation_param\",\n                            \"type\": \"object\"\n                          },\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"mode\": {\n                            \"enum\": [\"at_period_end\", \"immediately\"],\n                            \"type\": \"string\"\n                          },\n                          \"proration_behavior\": {\n                            \"enum\": [\n                              \"always_invoice\",\n                              \"create_prorations\",\n                              \"none\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"subscription_cancel_creation_param\",\n                        \"type\": \"object\"\n                      },\n                      \"subscription_update\": {\n                        \"properties\": {\n                          \"default_allowed_updates\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"price\",\n                                    \"promotion_code\",\n                                    \"quantity\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"products\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"prices\": {\n                                      \"items\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"type\": \"array\"\n                                    },\n                                    \"product\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"prices\", \"product\"],\n                                  \"title\": \"subscription_update_product_param\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"proration_behavior\": {\n                            \"enum\": [\n                              \"always_invoice\",\n                              \"create_prorations\",\n                              \"none\"\n                            ],\n                            \"type\": \"string\"\n                          },\n                          \"schedule_at_period_end\": {\n                            \"properties\": {\n                              \"conditions\": {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"type\": {\n                                      \"enum\": [\n                                        \"decreasing_item_amount\",\n                                        \"shortening_interval\"\n                                      ],\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"type\"],\n                                  \"title\": \"schedule_update_at_period_end_condition_param\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"schedule_update_at_period_end_creating_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"subscription_update_creation_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"features_creation_param\",\n                    \"type\": \"object\"\n                  },\n                  \"login_page\": {\n                    \"description\": \"The hosted login page for this configuration. Learn more about the portal login page in our [integration docs](https://stripe.com/docs/billing/subscriptions/integrating-customer-portal#share).\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"login_page_create_param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"features\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing_portal.configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a portal configuration\"\n      }\n    },\n    \"/v1/billing_portal/configurations/{configuration}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a configuration that describes the functionality of the customer portal.</p>\",\n        \"operationId\": \"GetBillingPortalConfigurationsConfiguration\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing_portal.configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a portal configuration\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a configuration that describes the functionality of the customer portal.</p>\",\n        \"operationId\": \"PostBillingPortalConfigurationsConfiguration\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"business_profile\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_return_url\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"login_page\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the configuration is active and can be used to create portal sessions.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"business_profile\": {\n                    \"description\": \"The business information shown to customers in the portal.\",\n                    \"properties\": {\n                      \"headline\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 60,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"privacy_policy_url\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"terms_of_service_url\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"business_profile_update_param\",\n                    \"type\": \"object\"\n                  },\n                  \"default_return_url\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The default URL to redirect customers to when they click on the portal's link to return to your website. This can be [overriden](https://stripe.com/docs/api/customer_portal/sessions/create#create_portal_session-return_url) when creating the session.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"Information about the features available in the portal.\",\n                    \"properties\": {\n                      \"customer_update\": {\n                        \"properties\": {\n                          \"allowed_updates\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"address\",\n                                    \"email\",\n                                    \"name\",\n                                    \"phone\",\n                                    \"shipping\",\n                                    \"tax_id\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"customer_update_updating_param\",\n                        \"type\": \"object\"\n                      },\n                      \"invoice_history\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"invoice_list_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_update\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"payment_method_update_param\",\n                        \"type\": \"object\"\n                      },\n                      \"subscription_cancel\": {\n                        \"properties\": {\n                          \"cancellation_reason\": {\n                            \"properties\": {\n                              \"enabled\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"options\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"customer_service\",\n                                        \"low_quality\",\n                                        \"missing_features\",\n                                        \"other\",\n                                        \"switched_service\",\n                                        \"too_complex\",\n                                        \"too_expensive\",\n                                        \"unused\"\n                                      ],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"required\": [\"enabled\"],\n                            \"title\": \"subscription_cancellation_reason_updating_param\",\n                            \"type\": \"object\"\n                          },\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"mode\": {\n                            \"enum\": [\"at_period_end\", \"immediately\"],\n                            \"type\": \"string\"\n                          },\n                          \"proration_behavior\": {\n                            \"enum\": [\n                              \"always_invoice\",\n                              \"create_prorations\",\n                              \"none\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"subscription_cancel_updating_param\",\n                        \"type\": \"object\"\n                      },\n                      \"subscription_update\": {\n                        \"properties\": {\n                          \"default_allowed_updates\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"price\",\n                                    \"promotion_code\",\n                                    \"quantity\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"products\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"prices\": {\n                                      \"items\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"type\": \"array\"\n                                    },\n                                    \"product\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"prices\", \"product\"],\n                                  \"title\": \"subscription_update_product_param\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"proration_behavior\": {\n                            \"enum\": [\n                              \"always_invoice\",\n                              \"create_prorations\",\n                              \"none\"\n                            ],\n                            \"type\": \"string\"\n                          },\n                          \"schedule_at_period_end\": {\n                            \"properties\": {\n                              \"conditions\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"properties\": {\n                                        \"type\": {\n                                          \"enum\": [\n                                            \"decreasing_item_amount\",\n                                            \"shortening_interval\"\n                                          ],\n                                          \"type\": \"string\"\n                                        }\n                                      },\n                                      \"required\": [\"type\"],\n                                      \"title\": \"schedule_update_at_period_end_condition_param\",\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"schedule_update_at_period_end_updating_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"subscription_update_updating_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"features_updating_param\",\n                    \"type\": \"object\"\n                  },\n                  \"login_page\": {\n                    \"description\": \"The hosted login page for this configuration. Learn more about the portal login page in our [integration docs](https://stripe.com/docs/billing/subscriptions/integrating-customer-portal#share).\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"login_page_update_param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing_portal.configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a portal configuration\"\n      }\n    },\n    \"/v1/billing_portal/sessions\": {\n      \"post\": {\n        \"description\": \"<p>Creates a session of the customer portal.</p>\",\n        \"operationId\": \"PostBillingPortalSessions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"flow_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"configuration\": {\n                    \"description\": \"The ID of an existing [configuration](https://stripe.com/docs/api/customer_portal/configuration) to use for this session, describing its functionality and features. If not specified, the session uses the default configuration.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The ID of an existing customer.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"flow_data\": {\n                    \"description\": \"Information about a specific flow for the customer to go through. See the [docs](https://stripe.com/docs/customer-management/portal-deep-links) to learn more about using customer portal deep links and flows.\",\n                    \"properties\": {\n                      \"after_completion\": {\n                        \"properties\": {\n                          \"hosted_confirmation\": {\n                            \"properties\": {\n                              \"custom_message\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"after_completion_hosted_confirmation_param\",\n                            \"type\": \"object\"\n                          },\n                          \"redirect\": {\n                            \"properties\": {\n                              \"return_url\": {\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"return_url\"],\n                            \"title\": \"after_completion_redirect_param\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"hosted_confirmation\",\n                              \"portal_homepage\",\n                              \"redirect\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"flow_data_after_completion_param\",\n                        \"type\": \"object\"\n                      },\n                      \"subscription_cancel\": {\n                        \"properties\": {\n                          \"retention\": {\n                            \"properties\": {\n                              \"coupon_offer\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"coupon\"],\n                                \"title\": \"coupon_offer_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"coupon_offer\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"coupon_offer\", \"type\"],\n                            \"title\": \"retention_param\",\n                            \"type\": \"object\"\n                          },\n                          \"subscription\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"subscription\"],\n                        \"title\": \"flow_data_subscription_cancel_param\",\n                        \"type\": \"object\"\n                      },\n                      \"subscription_update\": {\n                        \"properties\": {\n                          \"subscription\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"subscription\"],\n                        \"title\": \"flow_data_subscription_update_param\",\n                        \"type\": \"object\"\n                      },\n                      \"subscription_update_confirm\": {\n                        \"properties\": {\n                          \"discounts\": {\n                            \"items\": {\n                              \"properties\": {\n                                \"coupon\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"promotion_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"title\": \"subscription_update_confirm_discount_params\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          \"items\": {\n                            \"items\": {\n                              \"properties\": {\n                                \"id\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"price\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"quantity\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"id\"],\n                              \"title\": \"subscription_update_confirm_item_params\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          \"subscription\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"items\", \"subscription\"],\n                        \"title\": \"flow_data_subscription_update_confirm_param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"payment_method_update\",\n                          \"subscription_cancel\",\n                          \"subscription_update\",\n                          \"subscription_update_confirm\"\n                        ],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"flow_data_param\",\n                    \"type\": \"object\"\n                  },\n                  \"locale\": {\n                    \"description\": \"The IETF language tag of the locale customer portal is displayed in. If blank or auto, the customer’s `preferred_locales` or browser’s locale is used.\",\n                    \"enum\": [\n                      \"auto\",\n                      \"bg\",\n                      \"cs\",\n                      \"da\",\n                      \"de\",\n                      \"el\",\n                      \"en\",\n                      \"en-AU\",\n                      \"en-CA\",\n                      \"en-GB\",\n                      \"en-IE\",\n                      \"en-IN\",\n                      \"en-NZ\",\n                      \"en-SG\",\n                      \"es\",\n                      \"es-419\",\n                      \"et\",\n                      \"fi\",\n                      \"fil\",\n                      \"fr\",\n                      \"fr-CA\",\n                      \"hr\",\n                      \"hu\",\n                      \"id\",\n                      \"it\",\n                      \"ja\",\n                      \"ko\",\n                      \"lt\",\n                      \"lv\",\n                      \"ms\",\n                      \"mt\",\n                      \"nb\",\n                      \"nl\",\n                      \"pl\",\n                      \"pt\",\n                      \"pt-BR\",\n                      \"ro\",\n                      \"ru\",\n                      \"sk\",\n                      \"sl\",\n                      \"sv\",\n                      \"th\",\n                      \"tr\",\n                      \"vi\",\n                      \"zh\",\n                      \"zh-HK\",\n                      \"zh-TW\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"on_behalf_of\": {\n                    \"description\": \"The `on_behalf_of` account to use for this session. When specified, only subscriptions and invoices with this `on_behalf_of` account appear in the portal. For more information, see the [docs](https://stripe.com/docs/connect/separate-charges-and-transfers#settlement-merchant). Use the [Accounts API](https://stripe.com/docs/api/accounts/object#account_object-settings-branding) to modify the `on_behalf_of` account's branding settings, which the portal displays.\",\n                    \"type\": \"string\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The default URL to redirect customers to when they click on the portal's link to return to your website.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"customer\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/billing_portal.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a portal session\"\n      }\n    },\n    \"/v1/charges\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of charges you’ve previously created. The charges are returned in sorted order, with the most recent charges appearing first.</p>\",\n        \"operationId\": \"GetCharges\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return charges that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return charges for the customer specified by this customer ID.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return charges that were created by the PaymentIntent specified by this PaymentIntent ID.\",\n            \"in\": \"query\",\n            \"name\": \"payment_intent\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return charges for this transfer group, limited to 100.\",\n            \"in\": \"query\",\n            \"name\": \"transfer_group\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/charge\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/charges\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ChargeList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all charges\"\n      },\n      \"post\": {\n        \"description\": \"<p>This method is no longer recommended—use the <a href=\\\"/docs/api/payment_intents\\\">Payment Intents API</a>\\nto initiate a new payment instead. Confirmation of the PaymentIntent creates the <code>Charge</code>\\nobject used to request payment.</p>\",\n        \"operationId\": \"PostCharges\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"destination\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"radar_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount intended to be collected by this payment. A positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or [equivalent in charge currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99).\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee\": {\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"A fee in cents (or local equivalent) that will be applied to the charge and transferred to the application owner's Stripe account. The request must be made with an OAuth key or the `Stripe-Account` header in order to take an application fee. For more information, see the application fees [documentation](https://stripe.com/docs/connect/direct-charges#collect-fees).\",\n                    \"type\": \"integer\"\n                  },\n                  \"capture\": {\n                    \"description\": \"Whether to immediately capture the charge. Defaults to `true`. When `false`, the charge issues an authorization (or pre-authorization), and will need to be [captured](https://stripe.com/docs/api#capture_charge) later. Uncaptured charges expire after a set number of days (7 by default). For more information, see the [authorizing charges and settling later](https://stripe.com/docs/charges/placing-a-hold) documentation.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"card\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address_city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_zip\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"cvc\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"exp_year\": {\n                            \"type\": \"integer\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"card\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"exp_month\", \"exp_year\", \"number\"],\n                        \"title\": \"customer_payment_source_card\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A token, like the ones returned by [Stripe.js](https://stripe.com/docs/js).\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The ID of an existing customer that will be charged in this request.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string which you can attach to a `Charge` object. It is displayed when in the web interface alongside the charge. Note that if you use Stripe to send automatic email receipts to your customers, your receipt emails will include the `description` of the charge(s) that they are describing.\",\n                    \"maxLength\": 40000,\n                    \"type\": \"string\"\n                  },\n                  \"destination\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"account\"],\n                        \"title\": \"destination_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"on_behalf_of\": {\n                    \"description\": \"The Stripe account ID for which these funds are intended. Automatically set if you use the `destination` parameter. For details, see [Creating Separate Charges and Transfers](https://stripe.com/docs/connect/separate-charges-and-transfers#settlement-merchant).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"radar_options\": {\n                    \"description\": \"Options to configure Radar. See [Radar Session](https://stripe.com/docs/radar/radar-session) for more information.\",\n                    \"properties\": {\n                      \"session\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"radar_options_with_hidden_options\",\n                    \"type\": \"object\"\n                  },\n                  \"receipt_email\": {\n                    \"description\": \"The email address to which this charge's [receipt](https://stripe.com/docs/dashboard/receipts) will be sent. The receipt will not be sent until the charge is paid, and no receipts will be sent for test mode charges. If this charge is for a [Customer](https://stripe.com/docs/api/customers/object), the email address specified here will override the customer's email address. If `receipt_email` is specified for a charge in live mode, a receipt will be sent regardless of your [email settings](https://dashboard.stripe.com/account/emails).\",\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"description\": \"Shipping information for the charge. Helps prevent fraud on charges for physical goods.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"optional_fields_address\",\n                        \"type\": \"object\"\n                      },\n                      \"carrier\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tracking_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"address\", \"name\"],\n                    \"title\": \"optional_fields_shipping\",\n                    \"type\": \"object\"\n                  },\n                  \"source\": {\n                    \"description\": \"A payment source to be charged. This can be the ID of a [card](https://stripe.com/docs/api#cards) (i.e., credit or debit card), a [bank account](https://stripe.com/docs/api#bank_accounts), a [source](https://stripe.com/docs/api#sources), a [token](https://stripe.com/docs/api#tokens), or a [connected account](https://stripe.com/docs/connect/account-debits#charging-a-connected-account). For certain sources---namely, [cards](https://stripe.com/docs/api#cards), [bank accounts](https://stripe.com/docs/api#bank_accounts), and attached [sources](https://stripe.com/docs/api#sources)---you must also pass the ID of the associated customer.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"For a non-card charge, text that appears on the customer's statement as the statement descriptor. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\\n\\nFor a card charge, this value is ignored unless you don't specify a `statement_descriptor_suffix`, in which case this value is used as the suffix.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor_suffix\": {\n                    \"description\": \"Provides information about a card charge. Concatenated to the account's [statement descriptor prefix](https://docs.stripe.com/get-started/account/statement-descriptors#static) to form the complete statement descriptor that appears on the customer's statement. If the account has no prefix value, the suffix is concatenated to the account's statement descriptor.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"An optional dictionary including the account to automatically transfer to as part of a destination charge. [See the Connect documentation](https://stripe.com/docs/connect/destination-charges) for details.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"destination\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"destination\"],\n                    \"title\": \"transfer_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_group\": {\n                    \"description\": \"A string that identifies this transaction as part of a group. For details, see [Grouping transactions](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-options).\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/charges/search\": {\n      \"get\": {\n        \"description\": \"<p>Search for charges you’ve previously created using Stripe’s <a href=\\\"/docs/search#search-query-language\\\">Search Query Language</a>.\\nDon’t use search in read-after-write flows where strict consistency is necessary. Under normal operating\\nconditions, data is searchable in less than a minute. Occasionally, propagation of new or updated data can be up\\nto an hour behind during outages. Search functionality is not available to merchants in India.</p>\",\n        \"operationId\": \"GetChargesSearch\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for pagination across multiple pages of results. Don't include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.\",\n            \"in\": \"query\",\n            \"name\": \"page\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The search query string. See [search query language](https://stripe.com/docs/search#search-query-language) and the list of supported [query fields for charges](https://stripe.com/docs/search#query-fields-for-charges).\",\n            \"in\": \"query\",\n            \"name\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/charge\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"type\": \"boolean\"\n                    },\n                    \"next_page\": {\n                      \"maxLength\": 5000,\n                      \"nullable\": true,\n                      \"type\": \"string\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n                      \"enum\": [\"search_result\"],\n                      \"type\": \"string\"\n                    },\n                    \"total_count\": {\n                      \"description\": \"The total number of objects that match the query, only accurate up to 10,000.\",\n                      \"type\": \"integer\"\n                    },\n                    \"url\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SearchResult\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Search charges\"\n      }\n    },\n    \"/v1/charges/{charge}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a charge that has previously been created. Supply the unique charge ID that was returned from your previous request, and Stripe will return the corresponding charge information. The same information is returned when creating or refunding the charge.</p>\",\n        \"operationId\": \"GetChargesCharge\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a charge\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified charge by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostChargesCharge\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fraud_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"customer\": {\n                    \"description\": \"The ID of an existing customer that will be associated with this request. This field may only be updated if there is no existing associated customer with this charge.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string which you can attach to a charge object. It is displayed when in the web interface alongside the charge. Note that if you use Stripe to send automatic email receipts to your customers, your receipt emails will include the `description` of the charge(s) that they are describing.\",\n                    \"maxLength\": 40000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"fraud_details\": {\n                    \"description\": \"A set of key-value pairs you can attach to a charge giving information about its riskiness. If you believe a charge is fraudulent, include a `user_report` key with a value of `fraudulent`. If you believe a charge is safe, include a `user_report` key with a value of `safe`. Stripe will use the information you send to improve our fraud detection algorithms.\",\n                    \"properties\": {\n                      \"user_report\": {\n                        \"enum\": [\"\", \"fraudulent\", \"safe\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"user_report\"],\n                    \"title\": \"fraud_details\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"receipt_email\": {\n                    \"description\": \"This is the email address that the receipt for this charge will be sent to. If this field is updated, then a new email receipt will be sent to the updated address.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"description\": \"Shipping information for the charge. Helps prevent fraud on charges for physical goods.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"optional_fields_address\",\n                        \"type\": \"object\"\n                      },\n                      \"carrier\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tracking_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"address\", \"name\"],\n                    \"title\": \"optional_fields_shipping\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_group\": {\n                    \"description\": \"A string that identifies this transaction as part of a group. `transfer_group` may only be provided if it has not been set. See the [Connect documentation](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-options) for details.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a charge\"\n      }\n    },\n    \"/v1/charges/{charge}/capture\": {\n      \"post\": {\n        \"description\": \"<p>Capture the payment of an existing, uncaptured charge that was created with the <code>capture</code> option set to false.</p>\\n\\n<p>Uncaptured payments expire a set number of days after they are created (<a href=\\\"/docs/charges/placing-a-hold\\\">7 by default</a>), after which they are marked as refunded and capture attempts will fail.</p>\\n\\n<p>Don’t use this method to capture a PaymentIntent-initiated charge. Use <a href=\\\"/docs/api/payment_intents/capture\\\">Capture a PaymentIntent</a>.</p>\",\n        \"operationId\": \"PostChargesChargeCapture\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The amount to capture, which must be less than or equal to the original amount. Any additional amount will be automatically refunded.\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee\": {\n                    \"description\": \"An application fee to add on to this charge.\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"An application fee amount to add on to this charge, which must be less than or equal to the original amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"receipt_email\": {\n                    \"description\": \"The email address to send this charge's receipt to. This will override the previously-specified email address for this charge, if one was set. Receipts will not be sent in test mode.\",\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"For a non-card charge, text that appears on the customer's statement as the statement descriptor. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\\n\\nFor a card charge, this value is ignored unless you don't specify a `statement_descriptor_suffix`, in which case this value is used as the suffix.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor_suffix\": {\n                    \"description\": \"Provides information about a card charge. Concatenated to the account's [statement descriptor prefix](https://docs.stripe.com/get-started/account/statement-descriptors#static) to form the complete statement descriptor that appears on the customer's statement. If the account has no prefix value, the suffix is concatenated to the account's statement descriptor.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"An optional dictionary including the account to automatically transfer to as part of a destination charge. [See the Connect documentation](https://stripe.com/docs/connect/destination-charges) for details.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"title\": \"transfer_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_group\": {\n                    \"description\": \"A string that identifies this transaction as part of a group. `transfer_group` may only be provided if it has not been set. See the [Connect documentation](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-options) for details.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Capture a payment\"\n      }\n    },\n    \"/v1/charges/{charge}/dispute\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a dispute for a specified charge.</p>\",\n        \"operationId\": \"GetChargesChargeDispute\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      },\n      \"post\": {\n        \"description\": \"\",\n        \"operationId\": \"PostChargesChargeDispute\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"evidence\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"evidence\": {\n                    \"description\": \"Evidence to upload, to respond to a dispute. Updating any field in the hash will submit all fields in the hash for review. The combined character count of all fields is limited to 150,000.\",\n                    \"properties\": {\n                      \"access_activity_log\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"billing_address\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"cancellation_policy\": {\n                        \"type\": \"string\"\n                      },\n                      \"cancellation_policy_disclosure\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"cancellation_rebuttal\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_communication\": {\n                        \"type\": \"string\"\n                      },\n                      \"customer_email_address\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_purchase_ip\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_signature\": {\n                        \"type\": \"string\"\n                      },\n                      \"duplicate_charge_documentation\": {\n                        \"type\": \"string\"\n                      },\n                      \"duplicate_charge_explanation\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"duplicate_charge_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"enhanced_evidence\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"visa_compelling_evidence_3\": {\n                                \"properties\": {\n                                  \"disputed_transaction\": {\n                                    \"properties\": {\n                                      \"customer_account_id\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_device_fingerprint\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_device_id\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_email_address\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_purchase_ip\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"merchandise_or_services\": {\n                                        \"enum\": [\"merchandise\", \"services\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"product_description\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"shipping_address\": {\n                                        \"properties\": {\n                                          \"city\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"country\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"line1\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"line2\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"postal_code\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"state\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          }\n                                        },\n                                        \"title\": \"shipping_address\",\n                                        \"type\": \"object\"\n                                      }\n                                    },\n                                    \"title\": \"visa_compelling_evidence3_disputed_transaction\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"prior_undisputed_transactions\": {\n                                    \"items\": {\n                                      \"properties\": {\n                                        \"charge\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"customer_account_id\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_device_fingerprint\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_device_id\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_email_address\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_purchase_ip\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"product_description\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"shipping_address\": {\n                                          \"properties\": {\n                                            \"city\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"country\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"line1\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"line2\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"postal_code\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"state\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            }\n                                          },\n                                          \"title\": \"shipping_address\",\n                                          \"type\": \"object\"\n                                        }\n                                      },\n                                      \"required\": [\"charge\"],\n                                      \"title\": \"visa_compelling_evidence3_prior_undisputed_transaction\",\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"visa_compelling_evidence3\",\n                                \"type\": \"object\"\n                              },\n                              \"visa_compliance\": {\n                                \"properties\": {\n                                  \"fee_acknowledged\": {\n                                    \"type\": \"boolean\"\n                                  }\n                                },\n                                \"title\": \"visa_compliance\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"enhanced_evidence\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"product_description\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"receipt\": {\n                        \"type\": \"string\"\n                      },\n                      \"refund_policy\": {\n                        \"type\": \"string\"\n                      },\n                      \"refund_policy_disclosure\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"refund_refusal_explanation\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"service_date\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"service_documentation\": {\n                        \"type\": \"string\"\n                      },\n                      \"shipping_address\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"shipping_carrier\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"shipping_date\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"shipping_documentation\": {\n                        \"type\": \"string\"\n                      },\n                      \"shipping_tracking_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"uncategorized_file\": {\n                        \"type\": \"string\"\n                      },\n                      \"uncategorized_text\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"dispute_evidence_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"submit\": {\n                    \"description\": \"Whether to immediately submit evidence to the bank. If `false`, evidence is staged on the dispute. Staged evidence is visible in the API and Dashboard, and can be submitted to the bank by making another request with this attribute set to `true` (the default).\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/charges/{charge}/dispute/close\": {\n      \"post\": {\n        \"description\": \"\",\n        \"operationId\": \"PostChargesChargeDisputeClose\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/charges/{charge}/refund\": {\n      \"post\": {\n        \"description\": \"<p>When you create a new refund, you must specify either a Charge or a PaymentIntent object.</p>\\n\\n<p>This action refunds a previously created charge that’s not refunded yet.\\nFunds are refunded to the credit or debit card that’s originally charged.</p>\\n\\n<p>You can optionally refund only part of a charge.\\nYou can repeat this until the entire charge is refunded.</p>\\n\\n<p>After you entirely refund a charge, you can’t refund it again.\\nThis method raises an error when it’s called on an already-refunded charge,\\nor when you attempt to refund more money than is left on a charge.</p>\",\n        \"operationId\": \"PostChargesChargeRefund\",\n        \"parameters\": [\n          {\n            \"description\": \"The identifier of the charge to refund.\",\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"A positive integer in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) representing how much of this charge to refund. Can refund only up to the remaining, unrefunded amount of the charge.\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"instructions_email\": {\n                    \"description\": \"For payment methods without native refund support (e.g., Konbini, PromptPay), use this email from the customer to receive refund instructions.\",\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"payment_intent\": {\n                    \"description\": \"The identifier of the PaymentIntent to refund.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"reason\": {\n                    \"description\": \"String indicating the reason for the refund. If set, possible values are `duplicate`, `fraudulent`, and `requested_by_customer`. If you believe the charge to be fraudulent, specifying `fraudulent` as the reason will add the associated card and email to your [block lists](https://stripe.com/docs/radar/lists), and will also help us improve our fraud detection algorithms.\",\n                    \"enum\": [\n                      \"duplicate\",\n                      \"fraudulent\",\n                      \"requested_by_customer\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"refund_application_fee\": {\n                    \"description\": \"Boolean indicating whether the application fee should be refunded when refunding this charge. If a full charge refund is given, the full application fee will be refunded. Otherwise, the application fee will be refunded in an amount proportional to the amount of the charge refunded. An application fee can be refunded only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"reverse_transfer\": {\n                    \"description\": \"Boolean indicating whether the transfer should be reversed when refunding this charge. The transfer will be reversed proportionally to the amount being refunded (either the entire or partial amount).<br><br>A transfer can be reversed only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/charge\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a refund\"\n      }\n    },\n    \"/v1/charges/{charge}/refunds\": {\n      \"get\": {\n        \"description\": \"<p>You can see a list of the refunds belonging to a specific charge. Note that the 10 most recent refunds are always available by default on the charge object. If you need more than those 10, you can use this API method and the <code>limit</code> and <code>starting_after</code> parameters to page through additional refunds.</p>\",\n        \"operationId\": \"GetChargesChargeRefunds\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/refund\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"RefundList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all refunds\"\n      },\n      \"post\": {\n        \"description\": \"<p>When you create a new refund, you must specify a Charge or a PaymentIntent object on which to create it.</p>\\n\\n<p>Creating a new refund will refund a charge that has previously been created but not yet refunded.\\nFunds will be refunded to the credit or debit card that was originally charged.</p>\\n\\n<p>You can optionally refund only part of a charge.\\nYou can do so multiple times, until the entire charge has been refunded.</p>\\n\\n<p>Once entirely refunded, a charge can’t be refunded again.\\nThis method will raise an error when called on an already-refunded charge,\\nor when trying to refund more money than is left on a charge.</p>\",\n        \"operationId\": \"PostChargesChargeRefunds\",\n        \"parameters\": [\n          {\n            \"description\": \"The identifier of the charge to refund.\",\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"Customer whose customer balance to refund from.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"instructions_email\": {\n                    \"description\": \"For payment methods without native refund support (e.g., Konbini, PromptPay), use this email from the customer to receive refund instructions.\",\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"origin\": {\n                    \"description\": \"Origin of the refund\",\n                    \"enum\": [\"customer_balance\"],\n                    \"type\": \"string\"\n                  },\n                  \"payment_intent\": {\n                    \"description\": \"The identifier of the PaymentIntent to refund.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"reason\": {\n                    \"description\": \"String indicating the reason for the refund. If set, possible values are `duplicate`, `fraudulent`, and `requested_by_customer`. If you believe the charge to be fraudulent, specifying `fraudulent` as the reason will add the associated card and email to your [block lists](https://stripe.com/docs/radar/lists), and will also help us improve our fraud detection algorithms.\",\n                    \"enum\": [\n                      \"duplicate\",\n                      \"fraudulent\",\n                      \"requested_by_customer\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"refund_application_fee\": {\n                    \"description\": \"Boolean indicating whether the application fee should be refunded when refunding this charge. If a full charge refund is given, the full application fee will be refunded. Otherwise, the application fee will be refunded in an amount proportional to the amount of the charge refunded. An application fee can be refunded only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"reverse_transfer\": {\n                    \"description\": \"Boolean indicating whether the transfer should be reversed when refunding this charge. The transfer will be reversed proportionally to the amount being refunded (either the entire or partial amount).<br><br>A transfer can be reversed only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create customer balance refund\"\n      }\n    },\n    \"/v1/charges/{charge}/refunds/{refund}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing refund.</p>\",\n        \"operationId\": \"GetChargesChargeRefundsRefund\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"refund\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      },\n      \"post\": {\n        \"description\": \"<p>Update a specified refund.</p>\",\n        \"operationId\": \"PostChargesChargeRefundsRefund\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"charge\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"refund\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/checkout/sessions\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Checkout Sessions.</p>\",\n        \"operationId\": \"GetCheckoutSessions\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return Checkout Sessions that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return the Checkout Sessions for the Customer specified.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return the Checkout Sessions for the Customer details specified.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"customer_details\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"email\": {\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"email\"],\n              \"title\": \"customer_details_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return the Checkout Session for the PaymentIntent specified.\",\n            \"in\": \"query\",\n            \"name\": \"payment_intent\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return the Checkout Sessions for the Payment Link specified.\",\n            \"in\": \"query\",\n            \"name\": \"payment_link\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return the Checkout Sessions matching the given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"complete\", \"expired\", \"open\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return the Checkout Session for the subscription specified.\",\n            \"in\": \"query\",\n            \"name\": \"subscription\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/checkout.session\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentPagesCheckoutSessionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Checkout Sessions\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a Session object.</p>\",\n        \"operationId\": \"PostCheckoutSessions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"adaptive_pricing\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"after_expiration\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"consent_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_fields\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_text\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"customer_update\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_creation\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"line_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_intent_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"phone_number_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"saved_payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"setup_intent_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_address_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"subscription_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_id_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"adaptive_pricing\": {\n                    \"description\": \"Settings for price localization with [Adaptive Pricing](https://docs.stripe.com/payments/checkout/adaptive-pricing).\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"title\": \"adaptive_pricing_params\",\n                    \"type\": \"object\"\n                  },\n                  \"after_expiration\": {\n                    \"description\": \"Configure actions after a Checkout Session has expired.\",\n                    \"properties\": {\n                      \"recovery\": {\n                        \"properties\": {\n                          \"allow_promotion_codes\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"recovery_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"after_expiration_params\",\n                    \"type\": \"object\"\n                  },\n                  \"allow_promotion_codes\": {\n                    \"description\": \"Enables user redeemable promotion codes.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Settings for automatic tax lookup for this session and resulting payments, invoices, and subscriptions.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_params\",\n                    \"type\": \"object\"\n                  },\n                  \"billing_address_collection\": {\n                    \"description\": \"Specify whether Checkout should collect the customer's billing address. Defaults to `auto`.\",\n                    \"enum\": [\"auto\", \"required\"],\n                    \"type\": \"string\"\n                  },\n                  \"cancel_url\": {\n                    \"description\": \"If set, Checkout displays a back button and customers will be directed to this URL if they decide to cancel payment and return to your website. This parameter is not allowed if ui_mode is `embedded`.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"client_reference_id\": {\n                    \"description\": \"A unique string to reference the Checkout Session. This can be a\\ncustomer ID, a cart ID, or similar, and can be used to reconcile the\\nsession with your internal systems.\",\n                    \"maxLength\": 200,\n                    \"type\": \"string\"\n                  },\n                  \"consent_collection\": {\n                    \"description\": \"Configure fields for the Checkout Session to gather active consent from customers.\",\n                    \"properties\": {\n                      \"payment_method_reuse_agreement\": {\n                        \"properties\": {\n                          \"position\": {\n                            \"enum\": [\"auto\", \"hidden\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"position\"],\n                        \"title\": \"payment_method_reuse_agreement_params\",\n                        \"type\": \"object\"\n                      },\n                      \"promotions\": {\n                        \"enum\": [\"auto\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"terms_of_service\": {\n                        \"enum\": [\"none\", \"required\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"consent_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). Required in `setup` mode when `payment_method_types` is not set.\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"custom_fields\": {\n                    \"description\": \"Collect additional information from your customer using custom fields. Up to 3 fields are supported.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"dropdown\": {\n                          \"properties\": {\n                            \"default_value\": {\n                              \"maxLength\": 100,\n                              \"type\": \"string\"\n                            },\n                            \"options\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"label\": {\n                                    \"maxLength\": 100,\n                                    \"type\": \"string\"\n                                  },\n                                  \"value\": {\n                                    \"maxLength\": 100,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"label\", \"value\"],\n                                \"title\": \"custom_field_option_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            }\n                          },\n                          \"required\": [\"options\"],\n                          \"title\": \"custom_field_dropdown_param\",\n                          \"type\": \"object\"\n                        },\n                        \"key\": {\n                          \"maxLength\": 200,\n                          \"type\": \"string\"\n                        },\n                        \"label\": {\n                          \"properties\": {\n                            \"custom\": {\n                              \"maxLength\": 50,\n                              \"type\": \"string\"\n                            },\n                            \"type\": {\n                              \"enum\": [\"custom\"],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"custom\", \"type\"],\n                          \"title\": \"custom_field_label_param\",\n                          \"type\": \"object\"\n                        },\n                        \"numeric\": {\n                          \"properties\": {\n                            \"default_value\": {\n                              \"maxLength\": 255,\n                              \"type\": \"string\"\n                            },\n                            \"maximum_length\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum_length\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"custom_field_numeric_param\",\n                          \"type\": \"object\"\n                        },\n                        \"optional\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"text\": {\n                          \"properties\": {\n                            \"default_value\": {\n                              \"maxLength\": 255,\n                              \"type\": \"string\"\n                            },\n                            \"maximum_length\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum_length\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"custom_field_text_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": {\n                          \"enum\": [\"dropdown\", \"numeric\", \"text\"],\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"key\", \"label\", \"type\"],\n                      \"title\": \"custom_field_param\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"custom_text\": {\n                    \"description\": \"Display additional text for your customers using custom text.\",\n                    \"properties\": {\n                      \"after_submit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"shipping_address\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"submit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"terms_of_service_acceptance\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"custom_text_param\",\n                    \"type\": \"object\"\n                  },\n                  \"customer\": {\n                    \"description\": \"ID of an existing Customer, if one exists. In `payment` mode, the customer’s most recently saved card\\npayment method will be used to prefill the email, name, card details, and billing address\\non the Checkout page. In `subscription` mode, the customer’s [default payment method](https://stripe.com/docs/api/customers/update#update_customer-invoice_settings-default_payment_method)\\nwill be used if it’s a card, otherwise the most recently saved card will be used. A valid billing address, billing name and billing email are required on the payment method for Checkout to prefill the customer's card details.\\n\\nIf the Customer already has a valid [email](https://stripe.com/docs/api/customers/object#customer_object-email) set, the email will be prefilled and not editable in Checkout.\\nIf the Customer does not have a valid `email`, Checkout will set the email entered during the session on the Customer.\\n\\nIf blank for Checkout Sessions in `subscription` mode or with `customer_creation` set as `always` in `payment` mode, Checkout will create a new Customer object based on information provided during the payment flow.\\n\\nYou can set [`payment_intent_data.setup_future_usage`](https://stripe.com/docs/api/checkout/sessions/create#create_checkout_session-payment_intent_data-setup_future_usage) to have Checkout automatically attach the payment method to the Customer you pass in for future reuse.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"customer_creation\": {\n                    \"description\": \"Configure whether a Checkout Session creates a [Customer](https://stripe.com/docs/api/customers) during Session confirmation.\\n\\nWhen a Customer is not created, you can still retrieve email, address, and other customer data entered in Checkout\\nwith [customer_details](https://stripe.com/docs/api/checkout/sessions/object#checkout_session_object-customer_details).\\n\\nSessions that don't create Customers instead are grouped by [guest customers](https://stripe.com/docs/payments/checkout/guest-customers)\\nin the Dashboard. Promotion codes limited to first time customers will return invalid for these Sessions.\\n\\nCan only be set in `payment` and `setup` mode.\",\n                    \"enum\": [\"always\", \"if_required\"],\n                    \"type\": \"string\"\n                  },\n                  \"customer_email\": {\n                    \"description\": \"If provided, this value will be used when the Customer object is created.\\nIf not provided, customers will be asked to enter their email address.\\nUse this parameter to prefill customer data if you already have an email\\non file. To access information about the customer once a session is\\ncomplete, use the `customer` field.\",\n                    \"type\": \"string\"\n                  },\n                  \"customer_update\": {\n                    \"description\": \"Controls what fields on Customer can be updated by the Checkout Session. Can only be provided when `customer` is provided.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"enum\": [\"auto\", \"never\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"name\": {\n                        \"enum\": [\"auto\", \"never\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"shipping\": {\n                        \"enum\": [\"auto\", \"never\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      }\n                    },\n                    \"title\": \"customer_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"discounts\": {\n                    \"description\": \"The coupon or promotion code to apply to this Session. Currently, only up to one may be specified.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"coupon\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"promotion_code\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"title\": \"discount_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"The Epoch time in seconds at which the Checkout Session will expire. It can be anywhere from 30 minutes to 24 hours after Checkout Session creation. By default, this value is 24 hours from creation.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"invoice_creation\": {\n                    \"description\": \"Generate a post-purchase Invoice for one-time payments.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"invoice_data\": {\n                        \"properties\": {\n                          \"account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"custom_fields\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"name\": {\n                                      \"maxLength\": 40,\n                                      \"type\": \"string\"\n                                    },\n                                    \"value\": {\n                                      \"maxLength\": 140,\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"name\", \"value\"],\n                                  \"title\": \"custom_field_params\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"description\": {\n                            \"maxLength\": 1500,\n                            \"type\": \"string\"\n                          },\n                          \"footer\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"rendering_options\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"amount_tax_display\": {\n                                    \"enum\": [\n                                      \"\",\n                                      \"exclude_tax\",\n                                      \"include_inclusive_tax\"\n                                    ],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"checkout_rendering_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"invoice_data_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"invoice_creation_params\",\n                    \"type\": \"object\"\n                  },\n                  \"line_items\": {\n                    \"description\": \"A list of items the customer is purchasing. Use this parameter to pass one-time or recurring [Prices](https://stripe.com/docs/api/prices).\\n\\nFor `payment` mode, there is a maximum of 100 line items, however it is recommended to consolidate line items if there are more than a few dozen.\\n\\nFor `subscription` mode, there is a maximum of 20 line items with recurring Prices and 20 line items with one-time Prices. Line items with one-time Prices will be on the initial invoice only.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"adjustable_quantity\": {\n                          \"properties\": {\n                            \"enabled\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"maximum\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"enabled\"],\n                          \"title\": \"adjustable_quantity_params\",\n                          \"type\": \"object\"\n                        },\n                        \"dynamic_tax_rates\": {\n                          \"items\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"product_data\": {\n                              \"properties\": {\n                                \"description\": {\n                                  \"maxLength\": 40000,\n                                  \"type\": \"string\"\n                                },\n                                \"images\": {\n                                  \"items\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                \"metadata\": {\n                                  \"additionalProperties\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"object\"\n                                },\n                                \"name\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"tax_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"name\"],\n                              \"title\": \"product_data\",\n                              \"type\": \"object\"\n                            },\n                            \"recurring\": {\n                              \"properties\": {\n                                \"interval\": {\n                                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                  \"type\": \"string\"\n                                },\n                                \"interval_count\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"interval\"],\n                              \"title\": \"recurring_adhoc\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\"],\n                          \"title\": \"price_data_with_product_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"items\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"type\": \"array\"\n                        }\n                      },\n                      \"title\": \"line_item_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"locale\": {\n                    \"description\": \"The IETF language tag of the locale Checkout is displayed in. If blank or `auto`, the browser's locale is used.\",\n                    \"enum\": [\n                      \"auto\",\n                      \"bg\",\n                      \"cs\",\n                      \"da\",\n                      \"de\",\n                      \"el\",\n                      \"en\",\n                      \"en-GB\",\n                      \"es\",\n                      \"es-419\",\n                      \"et\",\n                      \"fi\",\n                      \"fil\",\n                      \"fr\",\n                      \"fr-CA\",\n                      \"hr\",\n                      \"hu\",\n                      \"id\",\n                      \"it\",\n                      \"ja\",\n                      \"ko\",\n                      \"lt\",\n                      \"lv\",\n                      \"ms\",\n                      \"mt\",\n                      \"nb\",\n                      \"nl\",\n                      \"pl\",\n                      \"pt\",\n                      \"pt-BR\",\n                      \"ro\",\n                      \"ru\",\n                      \"sk\",\n                      \"sl\",\n                      \"sv\",\n                      \"th\",\n                      \"tr\",\n                      \"vi\",\n                      \"zh\",\n                      \"zh-HK\",\n                      \"zh-TW\"\n                    ],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"mode\": {\n                    \"description\": \"The mode of the Checkout Session. Pass `subscription` if the Checkout Session includes at least one recurring item.\",\n                    \"enum\": [\"payment\", \"setup\", \"subscription\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"payment_intent_data\": {\n                    \"description\": \"A subset of parameters to be passed to PaymentIntent creation for Checkout Sessions in `payment` mode.\",\n                    \"properties\": {\n                      \"application_fee_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"capture_method\": {\n                        \"enum\": [\"automatic\", \"automatic_async\", \"manual\"],\n                        \"type\": \"string\"\n                      },\n                      \"description\": {\n                        \"maxLength\": 1000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"on_behalf_of\": {\n                        \"type\": \"string\"\n                      },\n                      \"receipt_email\": {\n                        \"type\": \"string\"\n                      },\n                      \"setup_future_usage\": {\n                        \"enum\": [\"off_session\", \"on_session\"],\n                        \"type\": \"string\"\n                      },\n                      \"shipping\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"line1\"],\n                            \"title\": \"address\",\n                            \"type\": \"object\"\n                          },\n                          \"carrier\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"tracking_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\", \"name\"],\n                        \"title\": \"shipping\",\n                        \"type\": \"object\"\n                      },\n                      \"statement_descriptor\": {\n                        \"maxLength\": 22,\n                        \"type\": \"string\"\n                      },\n                      \"statement_descriptor_suffix\": {\n                        \"maxLength\": 22,\n                        \"type\": \"string\"\n                      },\n                      \"transfer_data\": {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_params\",\n                        \"type\": \"object\"\n                      },\n                      \"transfer_group\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_intent_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_collection\": {\n                    \"description\": \"Specify whether Checkout should collect a payment method. When set to `if_required`, Checkout will not collect a payment method when the total due for the session is 0.\\nThis may occur if the Checkout Session includes a free trial or a discount.\\n\\nCan only be set in `subscription` mode. Defaults to `always`.\\n\\nIf you'd like information on how to collect a payment method outside of Checkout, read the guide on configuring [subscriptions with a free trial](https://stripe.com/docs/payments/checkout/free-trials).\",\n                    \"enum\": [\"always\", \"if_required\"],\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_configuration\": {\n                    \"description\": \"The ID of the payment method configuration to use with this Checkout session.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"This parameter allows you to set some attributes on the payment method created during a Checkout session.\",\n                    \"properties\": {\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_method_data_param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_options\": {\n                    \"description\": \"Payment-method-specific configuration.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"currency\": {\n                            \"enum\": [\"cad\", \"usd\"],\n                            \"type\": \"string\"\n                          },\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"custom_mandate_url\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"default_for\": {\n                                \"items\": {\n                                  \"enum\": [\"invoice\", \"subscription\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"interval_description\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"payment_schedule\": {\n                                \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n                                \"type\": \"string\"\n                              },\n                              \"transaction_type\": {\n                                \"enum\": [\"business\", \"personal\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n                            \"type\": \"string\"\n                          },\n                          \"target_date\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          },\n                          \"target_date\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n                            \"type\": \"string\"\n                          },\n                          \"target_date\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"expires_after_days\": {\n                            \"type\": \"integer\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card\": {\n                        \"properties\": {\n                          \"installments\": {\n                            \"properties\": {\n                              \"enabled\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"installments_param\",\n                            \"type\": \"object\"\n                          },\n                          \"request_extended_authorization\": {\n                            \"enum\": [\"if_available\", \"never\"],\n                            \"type\": \"string\"\n                          },\n                          \"request_incremental_authorization\": {\n                            \"enum\": [\"if_available\", \"never\"],\n                            \"type\": \"string\"\n                          },\n                          \"request_multicapture\": {\n                            \"enum\": [\"if_available\", \"never\"],\n                            \"type\": \"string\"\n                          },\n                          \"request_overcapture\": {\n                            \"enum\": [\"if_available\", \"never\"],\n                            \"type\": \"string\"\n                          },\n                          \"request_three_d_secure\": {\n                            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"restrictions\": {\n                            \"properties\": {\n                              \"brands_blocked\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"american_express\",\n                                    \"discover_global_network\",\n                                    \"mastercard\",\n                                    \"visa\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"restrictions_param\",\n                            \"type\": \"object\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"off_session\", \"on_session\"],\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_suffix_kana\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor_suffix_kanji\": {\n                            \"maxLength\": 17,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {\n                          \"bank_transfer\": {\n                            \"properties\": {\n                              \"eu_bank_transfer\": {\n                                \"properties\": {\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"country\"],\n                                \"title\": \"eu_bank_transfer_params\",\n                                \"type\": \"object\"\n                              },\n                              \"requested_address_types\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"aba\",\n                                    \"iban\",\n                                    \"sepa\",\n                                    \"sort_code\",\n                                    \"spei\",\n                                    \"swift\",\n                                    \"zengin\"\n                                  ],\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"type\": {\n                                \"enum\": [\n                                  \"eu_bank_transfer\",\n                                  \"gb_bank_transfer\",\n                                  \"jp_bank_transfer\",\n                                  \"mx_bank_transfer\",\n                                  \"us_bank_transfer\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"bank_transfer_param\",\n                            \"type\": \"object\"\n                          },\n                          \"funding_type\": {\n                            \"enum\": [\"bank_transfer\"],\n                            \"type\": \"string\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {\n                          \"capture_method\": {\n                            \"enum\": [\"manual\"],\n                            \"type\": \"string\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {\n                          \"expires_after_days\": {\n                            \"type\": \"integer\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {\n                          \"capture_method\": {\n                            \"enum\": [\"manual\"],\n                            \"type\": \"string\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"capture_method\": {\n                            \"enum\": [\"manual\"],\n                            \"type\": \"string\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {\n                          \"expires_after_days\": {\n                            \"type\": \"integer\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          },\n                          \"tos_shown_and_accepted\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {\n                          \"capture_method\": {\n                            \"enum\": [\"manual\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {\n                          \"capture_method\": {\n                            \"enum\": [\"\", \"manual\"],\n                            \"type\": \"string\"\n                          },\n                          \"preferred_locale\": {\n                            \"enum\": [\n                              \"cs-CZ\",\n                              \"da-DK\",\n                              \"de-AT\",\n                              \"de-DE\",\n                              \"de-LU\",\n                              \"el-GR\",\n                              \"en-GB\",\n                              \"en-US\",\n                              \"es-ES\",\n                              \"fi-FI\",\n                              \"fr-BE\",\n                              \"fr-FR\",\n                              \"fr-LU\",\n                              \"hu-HU\",\n                              \"it-IT\",\n                              \"nl-BE\",\n                              \"nl-NL\",\n                              \"pl-PL\",\n                              \"pt-PT\",\n                              \"sk-SK\",\n                              \"sv-SE\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"reference\": {\n                            \"maxLength\": 127,\n                            \"type\": \"string\"\n                          },\n                          \"risk_correlation_id\": {\n                            \"maxLength\": 32,\n                            \"type\": \"string\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"\", \"none\", \"off_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {\n                          \"expires_after_seconds\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {\n                          \"capture_method\": {\n                            \"enum\": [\"manual\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n                            \"type\": \"string\"\n                          },\n                          \"target_date\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {\n                          \"reference\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"financial_connections\": {\n                            \"properties\": {\n                              \"permissions\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"payment_method\",\n                                    \"transactions\"\n                                  ],\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"prefetch\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"transactions\"\n                                  ],\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"linked_account_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\", \"off_session\", \"on_session\"],\n                            \"type\": \"string\"\n                          },\n                          \"target_date\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {\n                          \"app_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"client\": {\n                            \"enum\": [\"android\", \"ios\", \"web\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"setup_future_usage\": {\n                            \"enum\": [\"none\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"client\"],\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_types\": {\n                    \"description\": \"A list of the types of payment methods (e.g., `card`) this Checkout Session can accept.\\n\\nYou can omit this attribute to manage your payment methods from the [Stripe Dashboard](https://dashboard.stripe.com/settings/payment_methods).\\nSee [Dynamic Payment Methods](https://stripe.com/docs/payments/payment-methods/integration-options#using-dynamic-payment-methods) for more details.\\n\\nRead more about the supported payment methods and their requirements in our [payment\\nmethod details guide](/docs/payments/checkout/payment-methods).\\n\\nIf multiple payment methods are passed, Checkout will dynamically reorder them to\\nprioritize the most relevant payment methods based on the customer's location and\\nother characteristics.\",\n                    \"items\": {\n                      \"enum\": [\n                        \"acss_debit\",\n                        \"affirm\",\n                        \"afterpay_clearpay\",\n                        \"alipay\",\n                        \"alma\",\n                        \"amazon_pay\",\n                        \"au_becs_debit\",\n                        \"bacs_debit\",\n                        \"bancontact\",\n                        \"blik\",\n                        \"boleto\",\n                        \"card\",\n                        \"cashapp\",\n                        \"customer_balance\",\n                        \"eps\",\n                        \"fpx\",\n                        \"giropay\",\n                        \"grabpay\",\n                        \"ideal\",\n                        \"kakao_pay\",\n                        \"klarna\",\n                        \"konbini\",\n                        \"kr_card\",\n                        \"link\",\n                        \"mobilepay\",\n                        \"multibanco\",\n                        \"naver_pay\",\n                        \"oxxo\",\n                        \"p24\",\n                        \"pay_by_bank\",\n                        \"payco\",\n                        \"paynow\",\n                        \"paypal\",\n                        \"pix\",\n                        \"promptpay\",\n                        \"revolut_pay\",\n                        \"samsung_pay\",\n                        \"sepa_debit\",\n                        \"sofort\",\n                        \"swish\",\n                        \"twint\",\n                        \"us_bank_account\",\n                        \"wechat_pay\",\n                        \"zip\"\n                      ],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"phone_number_collection\": {\n                    \"description\": \"Controls phone number collection settings for the session.\\n\\nWe recommend that you review your privacy policy and check with your legal contacts\\nbefore using this feature. Learn more about [collecting phone numbers with Checkout](https://stripe.com/docs/payments/checkout/phone-numbers).\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"phone_number_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"redirect_on_completion\": {\n                    \"description\": \"This parameter applies to `ui_mode: embedded`. Learn more about the [redirect behavior](https://stripe.com/docs/payments/checkout/custom-success-page?payment-ui=embedded-form) of embedded sessions. Defaults to `always`.\",\n                    \"enum\": [\"always\", \"if_required\", \"never\"],\n                    \"type\": \"string\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The URL to redirect your customer back to after they authenticate or cancel their payment on the\\npayment method's app or site. This parameter is required if ui_mode is `embedded`\\nand redirect-based payment methods are enabled on the session.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"saved_payment_method_options\": {\n                    \"description\": \"Controls saved payment method settings for the session. Only available in `payment` and `subscription` mode.\",\n                    \"properties\": {\n                      \"allow_redisplay_filters\": {\n                        \"items\": {\n                          \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"payment_method_save\": {\n                        \"enum\": [\"disabled\", \"enabled\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"saved_payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"setup_intent_data\": {\n                    \"description\": \"A subset of parameters to be passed to SetupIntent creation for Checkout Sessions in `setup` mode.\",\n                    \"properties\": {\n                      \"description\": {\n                        \"maxLength\": 1000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"on_behalf_of\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"setup_intent_data_param\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_address_collection\": {\n                    \"description\": \"When set, provides configuration for Checkout to collect a shipping address from a customer.\",\n                    \"properties\": {\n                      \"allowed_countries\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"AC\",\n                            \"AD\",\n                            \"AE\",\n                            \"AF\",\n                            \"AG\",\n                            \"AI\",\n                            \"AL\",\n                            \"AM\",\n                            \"AO\",\n                            \"AQ\",\n                            \"AR\",\n                            \"AT\",\n                            \"AU\",\n                            \"AW\",\n                            \"AX\",\n                            \"AZ\",\n                            \"BA\",\n                            \"BB\",\n                            \"BD\",\n                            \"BE\",\n                            \"BF\",\n                            \"BG\",\n                            \"BH\",\n                            \"BI\",\n                            \"BJ\",\n                            \"BL\",\n                            \"BM\",\n                            \"BN\",\n                            \"BO\",\n                            \"BQ\",\n                            \"BR\",\n                            \"BS\",\n                            \"BT\",\n                            \"BV\",\n                            \"BW\",\n                            \"BY\",\n                            \"BZ\",\n                            \"CA\",\n                            \"CD\",\n                            \"CF\",\n                            \"CG\",\n                            \"CH\",\n                            \"CI\",\n                            \"CK\",\n                            \"CL\",\n                            \"CM\",\n                            \"CN\",\n                            \"CO\",\n                            \"CR\",\n                            \"CV\",\n                            \"CW\",\n                            \"CY\",\n                            \"CZ\",\n                            \"DE\",\n                            \"DJ\",\n                            \"DK\",\n                            \"DM\",\n                            \"DO\",\n                            \"DZ\",\n                            \"EC\",\n                            \"EE\",\n                            \"EG\",\n                            \"EH\",\n                            \"ER\",\n                            \"ES\",\n                            \"ET\",\n                            \"FI\",\n                            \"FJ\",\n                            \"FK\",\n                            \"FO\",\n                            \"FR\",\n                            \"GA\",\n                            \"GB\",\n                            \"GD\",\n                            \"GE\",\n                            \"GF\",\n                            \"GG\",\n                            \"GH\",\n                            \"GI\",\n                            \"GL\",\n                            \"GM\",\n                            \"GN\",\n                            \"GP\",\n                            \"GQ\",\n                            \"GR\",\n                            \"GS\",\n                            \"GT\",\n                            \"GU\",\n                            \"GW\",\n                            \"GY\",\n                            \"HK\",\n                            \"HN\",\n                            \"HR\",\n                            \"HT\",\n                            \"HU\",\n                            \"ID\",\n                            \"IE\",\n                            \"IL\",\n                            \"IM\",\n                            \"IN\",\n                            \"IO\",\n                            \"IQ\",\n                            \"IS\",\n                            \"IT\",\n                            \"JE\",\n                            \"JM\",\n                            \"JO\",\n                            \"JP\",\n                            \"KE\",\n                            \"KG\",\n                            \"KH\",\n                            \"KI\",\n                            \"KM\",\n                            \"KN\",\n                            \"KR\",\n                            \"KW\",\n                            \"KY\",\n                            \"KZ\",\n                            \"LA\",\n                            \"LB\",\n                            \"LC\",\n                            \"LI\",\n                            \"LK\",\n                            \"LR\",\n                            \"LS\",\n                            \"LT\",\n                            \"LU\",\n                            \"LV\",\n                            \"LY\",\n                            \"MA\",\n                            \"MC\",\n                            \"MD\",\n                            \"ME\",\n                            \"MF\",\n                            \"MG\",\n                            \"MK\",\n                            \"ML\",\n                            \"MM\",\n                            \"MN\",\n                            \"MO\",\n                            \"MQ\",\n                            \"MR\",\n                            \"MS\",\n                            \"MT\",\n                            \"MU\",\n                            \"MV\",\n                            \"MW\",\n                            \"MX\",\n                            \"MY\",\n                            \"MZ\",\n                            \"NA\",\n                            \"NC\",\n                            \"NE\",\n                            \"NG\",\n                            \"NI\",\n                            \"NL\",\n                            \"NO\",\n                            \"NP\",\n                            \"NR\",\n                            \"NU\",\n                            \"NZ\",\n                            \"OM\",\n                            \"PA\",\n                            \"PE\",\n                            \"PF\",\n                            \"PG\",\n                            \"PH\",\n                            \"PK\",\n                            \"PL\",\n                            \"PM\",\n                            \"PN\",\n                            \"PR\",\n                            \"PS\",\n                            \"PT\",\n                            \"PY\",\n                            \"QA\",\n                            \"RE\",\n                            \"RO\",\n                            \"RS\",\n                            \"RU\",\n                            \"RW\",\n                            \"SA\",\n                            \"SB\",\n                            \"SC\",\n                            \"SD\",\n                            \"SE\",\n                            \"SG\",\n                            \"SH\",\n                            \"SI\",\n                            \"SJ\",\n                            \"SK\",\n                            \"SL\",\n                            \"SM\",\n                            \"SN\",\n                            \"SO\",\n                            \"SR\",\n                            \"SS\",\n                            \"ST\",\n                            \"SV\",\n                            \"SX\",\n                            \"SZ\",\n                            \"TA\",\n                            \"TC\",\n                            \"TD\",\n                            \"TF\",\n                            \"TG\",\n                            \"TH\",\n                            \"TJ\",\n                            \"TK\",\n                            \"TL\",\n                            \"TM\",\n                            \"TN\",\n                            \"TO\",\n                            \"TR\",\n                            \"TT\",\n                            \"TV\",\n                            \"TW\",\n                            \"TZ\",\n                            \"UA\",\n                            \"UG\",\n                            \"US\",\n                            \"UY\",\n                            \"UZ\",\n                            \"VA\",\n                            \"VC\",\n                            \"VE\",\n                            \"VG\",\n                            \"VN\",\n                            \"VU\",\n                            \"WF\",\n                            \"WS\",\n                            \"XK\",\n                            \"YE\",\n                            \"YT\",\n                            \"ZA\",\n                            \"ZM\",\n                            \"ZW\",\n                            \"ZZ\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"required\": [\"allowed_countries\"],\n                    \"title\": \"shipping_address_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_options\": {\n                    \"description\": \"The shipping rate options to apply to this Session. Up to a maximum of 5.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"shipping_rate\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"shipping_rate_data\": {\n                          \"properties\": {\n                            \"delivery_estimate\": {\n                              \"properties\": {\n                                \"maximum\": {\n                                  \"properties\": {\n                                    \"unit\": {\n                                      \"enum\": [\n                                        \"business_day\",\n                                        \"day\",\n                                        \"hour\",\n                                        \"month\",\n                                        \"week\"\n                                      ],\n                                      \"type\": \"string\"\n                                    },\n                                    \"value\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"unit\", \"value\"],\n                                  \"title\": \"delivery_estimate_bound\",\n                                  \"type\": \"object\"\n                                },\n                                \"minimum\": {\n                                  \"properties\": {\n                                    \"unit\": {\n                                      \"enum\": [\n                                        \"business_day\",\n                                        \"day\",\n                                        \"hour\",\n                                        \"month\",\n                                        \"week\"\n                                      ],\n                                      \"type\": \"string\"\n                                    },\n                                    \"value\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"unit\", \"value\"],\n                                  \"title\": \"delivery_estimate_bound\",\n                                  \"type\": \"object\"\n                                }\n                              },\n                              \"title\": \"delivery_estimate\",\n                              \"type\": \"object\"\n                            },\n                            \"display_name\": {\n                              \"maxLength\": 100,\n                              \"type\": \"string\"\n                            },\n                            \"fixed_amount\": {\n                              \"properties\": {\n                                \"amount\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"currency\": {\n                                  \"format\": \"currency\",\n                                  \"type\": \"string\"\n                                },\n                                \"currency_options\": {\n                                  \"additionalProperties\": {\n                                    \"properties\": {\n                                      \"amount\": {\n                                        \"type\": \"integer\"\n                                      },\n                                      \"tax_behavior\": {\n                                        \"enum\": [\n                                          \"exclusive\",\n                                          \"inclusive\",\n                                          \"unspecified\"\n                                        ],\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\"amount\"],\n                                    \"title\": \"currency_option\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"type\": \"object\"\n                                }\n                              },\n                              \"required\": [\"amount\", \"currency\"],\n                              \"title\": \"fixed_amount\",\n                              \"type\": \"object\"\n                            },\n                            \"metadata\": {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"tax_code\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": {\n                              \"enum\": [\"fixed_amount\"],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"display_name\"],\n                          \"title\": \"method_params\",\n                          \"type\": \"object\"\n                        }\n                      },\n                      \"title\": \"shipping_option_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"submit_type\": {\n                    \"description\": \"Describes the type of transaction being performed by Checkout in order to customize\\nrelevant text on the page, such as the submit button. `submit_type` can only be\\nspecified on Checkout Sessions in `payment` mode. If blank or `auto`, `pay` is used.\",\n                    \"enum\": [\"auto\", \"book\", \"donate\", \"pay\", \"subscribe\"],\n                    \"type\": \"string\"\n                  },\n                  \"subscription_data\": {\n                    \"description\": \"A subset of parameters to be passed to subscription creation for Checkout Sessions in `subscription` mode.\",\n                    \"properties\": {\n                      \"application_fee_percent\": {\n                        \"type\": \"number\"\n                      },\n                      \"billing_cycle_anchor\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"default_tax_rates\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"description\": {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      \"invoice_settings\": {\n                        \"properties\": {\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"invoice_settings_params\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"on_behalf_of\": {\n                        \"type\": \"string\"\n                      },\n                      \"proration_behavior\": {\n                        \"enum\": [\"create_prorations\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"transfer_data\": {\n                        \"properties\": {\n                          \"amount_percent\": {\n                            \"type\": \"number\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"trial_end\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"trial_period_days\": {\n                        \"type\": \"integer\"\n                      },\n                      \"trial_settings\": {\n                        \"properties\": {\n                          \"end_behavior\": {\n                            \"properties\": {\n                              \"missing_payment_method\": {\n                                \"enum\": [\"cancel\", \"create_invoice\", \"pause\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"missing_payment_method\"],\n                            \"title\": \"end_behavior\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"end_behavior\"],\n                        \"title\": \"trial_settings_config\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"subscription_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"success_url\": {\n                    \"description\": \"The URL to which Stripe should send customers when payment or setup\\nis complete.\\nThis parameter is not allowed if ui_mode is `embedded`. If you’d like to use\\ninformation from the successful Checkout Session on your page, read the\\nguide on [customizing your success page](https://stripe.com/docs/payments/checkout/custom-success-page).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"tax_id_collection\": {\n                    \"description\": \"Controls tax ID collection during checkout.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"required\": {\n                        \"enum\": [\"if_supported\", \"never\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"tax_id_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"ui_mode\": {\n                    \"description\": \"The UI mode of the Session. Defaults to `hosted`.\",\n                    \"enum\": [\"embedded\", \"hosted\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/checkout.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Session\"\n      }\n    },\n    \"/v1/checkout/sessions/{session}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a Session object.</p>\",\n        \"operationId\": \"GetCheckoutSessionsSession\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 66,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/checkout.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Session\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a Session object.</p>\",\n        \"operationId\": \"PostCheckoutSessionsSession\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"collected_information\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"collected_information\": {\n                    \"description\": \"Information about the customer collected within the Checkout Session.\",\n                    \"properties\": {\n                      \"shipping_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"country\", \"line1\"],\n                            \"title\": \"address\",\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 255,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\", \"name\"],\n                        \"title\": \"shipping_details_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"collected_information_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/checkout.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a Session\"\n      }\n    },\n    \"/v1/checkout/sessions/{session}/expire\": {\n      \"post\": {\n        \"description\": \"<p>A Session can be expired when it is in one of these statuses: <code>open</code> </p>\\n\\n<p>After it expires, a customer can’t complete a Session and customers loading the Session see a message saying the Session is expired.</p>\",\n        \"operationId\": \"PostCheckoutSessionsSessionExpire\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/checkout.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Expire a Session\"\n      }\n    },\n    \"/v1/checkout/sessions/{session}/line_items\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving a Checkout Session, there is an includable <strong>line_items</strong> property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.</p>\",\n        \"operationId\": \"GetCheckoutSessionsSessionLineItems\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentPagesCheckoutSessionListLineItems\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Checkout Session's line items\"\n      }\n    },\n    \"/v1/climate/orders\": {\n      \"get\": {\n        \"description\": \"<p>Lists all Climate order objects. The orders are returned sorted by creation date, with the\\nmost recently created orders appearing first.</p>\",\n        \"operationId\": \"GetClimateOrders\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/climate.order\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/climate/orders\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ClimateRemovalsOrdersList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List orders\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a Climate order object for a given Climate product. The order will be processed immediately\\nafter creation and payment will be deducted your Stripe balance.</p>\",\n        \"operationId\": \"PostClimateOrders\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"beneficiary\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Requested amount of carbon removal units. Either this or `metric_tons` must be specified.\",\n                    \"type\": \"integer\"\n                  },\n                  \"beneficiary\": {\n                    \"description\": \"Publicly sharable reference for the end beneficiary of carbon removal. Assumed to be the Stripe account if not set.\",\n                    \"properties\": {\n                      \"public_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"public_name\"],\n                    \"title\": \"beneficiary_params\",\n                    \"type\": \"object\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Request currency for the order as a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a supported [settlement currency for your account](https://stripe.com/docs/currencies). If omitted, the account's default currency will be used.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"metric_tons\": {\n                    \"description\": \"Requested number of tons for the order. Either this or `amount` must be specified.\",\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  },\n                  \"product\": {\n                    \"description\": \"Unique identifier of the Climate product.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"product\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/climate.order\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an order\"\n      }\n    },\n    \"/v1/climate/orders/{order}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a Climate order object with the given ID.</p>\",\n        \"operationId\": \"GetClimateOrdersOrder\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Unique identifier of the order.\",\n            \"in\": \"path\",\n            \"name\": \"order\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/climate.order\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an order\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified order by setting the values of the parameters passed.</p>\",\n        \"operationId\": \"PostClimateOrdersOrder\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier of the order.\",\n            \"in\": \"path\",\n            \"name\": \"order\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"beneficiary\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"beneficiary\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"public_name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"required\": [\"public_name\"],\n                        \"title\": \"beneficiary_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Publicly sharable reference for the end beneficiary of carbon removal. Assumed to be the Stripe account if not set.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/climate.order\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an order\"\n      }\n    },\n    \"/v1/climate/orders/{order}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>Cancels a Climate order. You can cancel an order within 24 hours of creation. Stripe refunds the\\nreservation <code>amount_subtotal</code>, but not the <code>amount_fees</code> for user-triggered cancellations. Frontier\\nmight cancel reservations if suppliers fail to deliver. If Frontier cancels the reservation, Stripe\\nprovides 90 days advance notice and refunds the <code>amount_total</code>.</p>\",\n        \"operationId\": \"PostClimateOrdersOrderCancel\",\n        \"parameters\": [\n          {\n            \"description\": \"Unique identifier of the order.\",\n            \"in\": \"path\",\n            \"name\": \"order\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/climate.order\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel an order\"\n      }\n    },\n    \"/v1/climate/products\": {\n      \"get\": {\n        \"description\": \"<p>Lists all available Climate product objects.</p>\",\n        \"operationId\": \"GetClimateProducts\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/climate.product\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/climate/products\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ClimateRemovalsProductsList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List products\"\n      }\n    },\n    \"/v1/climate/products/{product}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a Climate product with the given ID.</p>\",\n        \"operationId\": \"GetClimateProductsProduct\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"product\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/climate.product\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a product\"\n      }\n    },\n    \"/v1/climate/suppliers\": {\n      \"get\": {\n        \"description\": \"<p>Lists all available Climate supplier objects.</p>\",\n        \"operationId\": \"GetClimateSuppliers\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/climate.supplier\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/climate/suppliers\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ClimateRemovalsSuppliersList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List suppliers\"\n      }\n    },\n    \"/v1/climate/suppliers/{supplier}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a Climate supplier object.</p>\",\n        \"operationId\": \"GetClimateSuppliersSupplier\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"supplier\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/climate.supplier\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a supplier\"\n      }\n    },\n    \"/v1/confirmation_tokens/{confirmation_token}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an existing ConfirmationToken object</p>\",\n        \"operationId\": \"GetConfirmationTokensConfirmationToken\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"confirmation_token\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/confirmation_token\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a ConfirmationToken\"\n      }\n    },\n    \"/v1/country_specs\": {\n      \"get\": {\n        \"description\": \"<p>Lists all Country Spec objects available in the API.</p>\",\n        \"operationId\": \"GetCountrySpecs\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/country_spec\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/country_specs\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CountrySpecList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List Country Specs\"\n      }\n    },\n    \"/v1/country_specs/{country}\": {\n      \"get\": {\n        \"description\": \"<p>Returns a Country Spec for a given Country code.</p>\",\n        \"operationId\": \"GetCountrySpecsCountry\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"country\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/country_spec\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Country Spec\"\n      }\n    },\n    \"/v1/coupons\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your coupons.</p>\",\n        \"operationId\": \"GetCoupons\",\n        \"parameters\": [\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/coupon\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/coupons\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CouponsResourceCouponList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all coupons\"\n      },\n      \"post\": {\n        \"description\": \"<p>You can create coupons easily via the <a href=\\\"https://dashboard.stripe.com/coupons\\\">coupon management</a> page of the Stripe dashboard. Coupon creation is also accessible via the API if you need to create coupons on the fly.</p>\\n\\n<p>A coupon has either a <code>percent_off</code> or an <code>amount_off</code> and <code>currency</code>. If you set an <code>amount_off</code>, that amount will be subtracted from any invoice’s subtotal. For example, an invoice with a subtotal of <currency>100</currency> will have a final total of <currency>0</currency> if a coupon with an <code>amount_off</code> of <amount>200</amount> is applied to it and an invoice with a subtotal of <currency>300</currency> will have a final total of <currency>100</currency> if a coupon with an <code>amount_off</code> of <amount>200</amount> is applied to it.</p>\",\n        \"operationId\": \"PostCoupons\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"applies_to\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"currency_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount_off\": {\n                    \"description\": \"A positive integer representing the amount to subtract from an invoice total (required if `percent_off` is not passed).\",\n                    \"type\": \"integer\"\n                  },\n                  \"applies_to\": {\n                    \"description\": \"A hash containing directions for what this Coupon will apply discounts to.\",\n                    \"properties\": {\n                      \"products\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"applies_to_params\",\n                    \"type\": \"object\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) of the `amount_off` parameter (required if `amount_off` is passed).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"currency_options\": {\n                    \"additionalProperties\": {\n                      \"properties\": {\n                        \"amount_off\": {\n                          \"type\": \"integer\"\n                        }\n                      },\n                      \"required\": [\"amount_off\"],\n                      \"title\": \"currency_option\",\n                      \"type\": \"object\"\n                    },\n                    \"description\": \"Coupons defined in each available currency option (only supported if `amount_off` is passed). Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"type\": \"object\"\n                  },\n                  \"duration\": {\n                    \"description\": \"Specifies how long the discount will be in effect if used on a subscription. Defaults to `once`.\",\n                    \"enum\": [\"forever\", \"once\", \"repeating\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"duration_in_months\": {\n                    \"description\": \"Required only if `duration` is `repeating`, in which case it must be a positive integer that specifies the number of months the discount will be in effect.\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"id\": {\n                    \"description\": \"Unique string of your choice that will be used to identify this coupon when applying it to a customer. If you don't want to specify a particular code, you can leave the ID blank and we'll generate a random code for you.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"max_redemptions\": {\n                    \"description\": \"A positive integer specifying the number of times the coupon can be redeemed before it's no longer valid. For example, you might have a 50% off coupon that the first 20 readers of your blog can use.\",\n                    \"type\": \"integer\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"Name of the coupon displayed to customers on, for instance invoices, or receipts. By default the `id` is shown if `name` is not set.\",\n                    \"maxLength\": 40,\n                    \"type\": \"string\"\n                  },\n                  \"percent_off\": {\n                    \"description\": \"A positive float larger than 0, and smaller or equal to 100, that represents the discount the coupon will apply (required if `amount_off` is not passed).\",\n                    \"type\": \"number\"\n                  },\n                  \"redeem_by\": {\n                    \"description\": \"Unix timestamp specifying the last time at which the coupon can be redeemed. After the redeem_by date, the coupon can no longer be applied to new customers.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/coupon\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a coupon\"\n      }\n    },\n    \"/v1/coupons/{coupon}\": {\n      \"delete\": {\n        \"description\": \"<p>You can delete coupons via the <a href=\\\"https://dashboard.stripe.com/coupons\\\">coupon management</a> page of the Stripe dashboard. However, deleting a coupon does not affect any customers who have already applied the coupon; it means that new customers can’t redeem the coupon. You can also delete coupons via the API.</p>\",\n        \"operationId\": \"DeleteCouponsCoupon\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"coupon\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_coupon\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a coupon\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the coupon with the given ID.</p>\",\n        \"operationId\": \"GetCouponsCoupon\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"coupon\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/coupon\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a coupon\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the metadata of a coupon. Other coupon details (currency, duration, amount_off) are, by design, not editable.</p>\",\n        \"operationId\": \"PostCouponsCoupon\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"coupon\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"currency_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"currency_options\": {\n                    \"additionalProperties\": {\n                      \"properties\": {\n                        \"amount_off\": {\n                          \"type\": \"integer\"\n                        }\n                      },\n                      \"required\": [\"amount_off\"],\n                      \"title\": \"currency_option\",\n                      \"type\": \"object\"\n                    },\n                    \"description\": \"Coupons defined in each available currency option (only supported if the coupon is amount-based). Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"Name of the coupon displayed to customers on, for instance invoices, or receipts. By default the `id` is shown if `name` is not set.\",\n                    \"maxLength\": 40,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/coupon\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a coupon\"\n      }\n    },\n    \"/v1/credit_notes\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of credit notes.</p>\",\n        \"operationId\": \"GetCreditNotes\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return credit notes that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return credit notes for the customer specified by this customer ID.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return credit notes for the invoice specified by this invoice ID.\",\n            \"in\": \"query\",\n            \"name\": \"invoice\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/credit_note\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CreditNotesList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all credit notes\"\n      },\n      \"post\": {\n        \"description\": \"<p>Issue a credit note to adjust the amount of a finalized invoice. For a <code>status=open</code> invoice, a credit note reduces\\nits <code>amount_due</code>. For a <code>status=paid</code> invoice, a credit note does not affect its <code>amount_due</code>. Instead, it can result\\nin any combination of the following:</p>\\n\\n<ul>\\n<li>Refund: create a new refund (using <code>refund_amount</code>) or link an existing refund (using <code>refund</code>).</li>\\n<li>Customer balance credit: credit the customer’s balance (using <code>credit_amount</code>) which will be automatically applied to their next invoice when it’s finalized.</li>\\n<li>Outside of Stripe credit: record the amount that is or will be credited outside of Stripe (using <code>out_of_band_amount</code>).</li>\\n</ul>\\n\\n<p>For post-payment credit notes the sum of the refund, credit and outside of Stripe amounts must equal the credit note total.</p>\\n\\n<p>You may issue multiple credit notes for an invoice. Each credit note will increment the invoice’s <code>pre_payment_credit_notes_amount</code>\\nor <code>post_payment_credit_notes_amount</code> depending on its <code>status</code> at the time of credit note creation.</p>\",\n        \"operationId\": \"PostCreditNotes\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"lines\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_cost\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of the credit note.\",\n                    \"type\": \"integer\"\n                  },\n                  \"credit_amount\": {\n                    \"description\": \"The integer amount in cents (or local equivalent) representing the amount to credit the customer's balance, which will be automatically applied to their next invoice.\",\n                    \"type\": \"integer\"\n                  },\n                  \"effective_at\": {\n                    \"description\": \"The date when this credit note is in effect. Same as `created` unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the credit note PDF.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"email_type\": {\n                    \"description\": \"Type of email to send to the customer, one of `credit_note` or `none` and the default is `credit_note`.\",\n                    \"enum\": [\"credit_note\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice\": {\n                    \"description\": \"ID of the invoice.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"lines\": {\n                    \"description\": \"Line items that make up the credit note.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"description\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"invoice_line_item\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_amounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"tax_rate\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"taxable_amount\": {\n                                    \"type\": \"integer\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"amount\",\n                                  \"tax_rate\",\n                                  \"taxable_amount\"\n                                ],\n                                \"title\": \"tax_amount_with_tax_rate_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"type\": {\n                          \"enum\": [\"custom_line_item\", \"invoice_line_item\"],\n                          \"type\": \"string\"\n                        },\n                        \"unit_amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"unit_amount_decimal\": {\n                          \"format\": \"decimal\",\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"type\"],\n                      \"title\": \"credit_note_line_item_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"memo\": {\n                    \"description\": \"The credit note's memo appears on the credit note PDF.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"out_of_band_amount\": {\n                    \"description\": \"The integer amount in cents (or local equivalent) representing the amount that is credited outside of Stripe.\",\n                    \"type\": \"integer\"\n                  },\n                  \"reason\": {\n                    \"description\": \"Reason for issuing this credit note, one of `duplicate`, `fraudulent`, `order_change`, or `product_unsatisfactory`\",\n                    \"enum\": [\n                      \"duplicate\",\n                      \"fraudulent\",\n                      \"order_change\",\n                      \"product_unsatisfactory\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"refund\": {\n                    \"description\": \"ID of an existing refund to link this credit note to.\",\n                    \"type\": \"string\"\n                  },\n                  \"refund_amount\": {\n                    \"description\": \"The integer amount in cents (or local equivalent) representing the amount to refund. If set, a refund will be created for the charge associated with the invoice.\",\n                    \"type\": \"integer\"\n                  },\n                  \"shipping_cost\": {\n                    \"description\": \"When shipping_cost contains the shipping_rate from the invoice, the shipping_cost is included in the credit note.\",\n                    \"properties\": {\n                      \"shipping_rate\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"credit_note_shipping_cost\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"invoice\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/credit_note\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a credit note\"\n      }\n    },\n    \"/v1/credit_notes/preview\": {\n      \"get\": {\n        \"description\": \"<p>Get a preview of a credit note without creating it.</p>\",\n        \"operationId\": \"GetCreditNotesPreview\",\n        \"parameters\": [\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of the credit note.\",\n            \"in\": \"query\",\n            \"name\": \"amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount to credit the customer's balance, which will be automatically applied to their next invoice.\",\n            \"in\": \"query\",\n            \"name\": \"credit_amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The date when this credit note is in effect. Same as `created` unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the credit note PDF.\",\n            \"in\": \"query\",\n            \"name\": \"effective_at\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Type of email to send to the customer, one of `credit_note` or `none` and the default is `credit_note`.\",\n            \"in\": \"query\",\n            \"name\": \"email_type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"credit_note\", \"none\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"ID of the invoice.\",\n            \"in\": \"query\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Line items that make up the credit note.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"lines\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"properties\": {\n                  \"amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"description\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"invoice_line_item\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"quantity\": {\n                    \"type\": \"integer\"\n                  },\n                  \"tax_amounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rate\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"taxable_amount\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"amount\", \"tax_rate\", \"taxable_amount\"],\n                          \"title\": \"tax_amount_with_tax_rate_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"type\": {\n                    \"enum\": [\"custom_line_item\", \"invoice_line_item\"],\n                    \"type\": \"string\"\n                  },\n                  \"unit_amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"unit_amount_decimal\": {\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\"],\n                \"title\": \"credit_note_line_item_params\",\n                \"type\": \"object\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The credit note's memo appears on the credit note PDF.\",\n            \"in\": \"query\",\n            \"name\": \"memo\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"metadata\",\n            \"required\": false,\n            \"schema\": {\n              \"additionalProperties\": {\n                \"type\": \"string\"\n              },\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount that is credited outside of Stripe.\",\n            \"in\": \"query\",\n            \"name\": \"out_of_band_amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Reason for issuing this credit note, one of `duplicate`, `fraudulent`, `order_change`, or `product_unsatisfactory`\",\n            \"in\": \"query\",\n            \"name\": \"reason\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"duplicate\",\n                \"fraudulent\",\n                \"order_change\",\n                \"product_unsatisfactory\"\n              ],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"ID of an existing refund to link this credit note to.\",\n            \"in\": \"query\",\n            \"name\": \"refund\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount to refund. If set, a refund will be created for the charge associated with the invoice.\",\n            \"in\": \"query\",\n            \"name\": \"refund_amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"When shipping_cost contains the shipping_rate from the invoice, the shipping_cost is included in the credit note.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"shipping_cost\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"shipping_rate\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                }\n              },\n              \"title\": \"credit_note_shipping_cost\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/credit_note\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Preview a credit note\"\n      }\n    },\n    \"/v1/credit_notes/preview/lines\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving a credit note preview, you’ll get a <strong>lines</strong> property containing the first handful of those items. This URL you can retrieve the full (paginated) list of line items.</p>\",\n        \"operationId\": \"GetCreditNotesPreviewLines\",\n        \"parameters\": [\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the total amount of the credit note.\",\n            \"in\": \"query\",\n            \"name\": \"amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount to credit the customer's balance, which will be automatically applied to their next invoice.\",\n            \"in\": \"query\",\n            \"name\": \"credit_amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The date when this credit note is in effect. Same as `created` unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the credit note PDF.\",\n            \"in\": \"query\",\n            \"name\": \"effective_at\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Type of email to send to the customer, one of `credit_note` or `none` and the default is `credit_note`.\",\n            \"in\": \"query\",\n            \"name\": \"email_type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"credit_note\", \"none\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"ID of the invoice.\",\n            \"in\": \"query\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Line items that make up the credit note.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"lines\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"properties\": {\n                  \"amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"description\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"invoice_line_item\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"quantity\": {\n                    \"type\": \"integer\"\n                  },\n                  \"tax_amounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rate\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"taxable_amount\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"amount\", \"tax_rate\", \"taxable_amount\"],\n                          \"title\": \"tax_amount_with_tax_rate_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"type\": {\n                    \"enum\": [\"custom_line_item\", \"invoice_line_item\"],\n                    \"type\": \"string\"\n                  },\n                  \"unit_amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"unit_amount_decimal\": {\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\"],\n                \"title\": \"credit_note_line_item_params\",\n                \"type\": \"object\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The credit note's memo appears on the credit note PDF.\",\n            \"in\": \"query\",\n            \"name\": \"memo\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"metadata\",\n            \"required\": false,\n            \"schema\": {\n              \"additionalProperties\": {\n                \"type\": \"string\"\n              },\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount that is credited outside of Stripe.\",\n            \"in\": \"query\",\n            \"name\": \"out_of_band_amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Reason for issuing this credit note, one of `duplicate`, `fraudulent`, `order_change`, or `product_unsatisfactory`\",\n            \"in\": \"query\",\n            \"name\": \"reason\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"duplicate\",\n                \"fraudulent\",\n                \"order_change\",\n                \"product_unsatisfactory\"\n              ],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"ID of an existing refund to link this credit note to.\",\n            \"in\": \"query\",\n            \"name\": \"refund\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The integer amount in cents (or local equivalent) representing the amount to refund. If set, a refund will be created for the charge associated with the invoice.\",\n            \"in\": \"query\",\n            \"name\": \"refund_amount\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"When shipping_cost contains the shipping_rate from the invoice, the shipping_cost is included in the credit note.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"shipping_cost\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"shipping_rate\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                }\n              },\n              \"title\": \"credit_note_shipping_cost\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/credit_note_line_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CreditNoteLinesList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a credit note preview's line items\"\n      }\n    },\n    \"/v1/credit_notes/{credit_note}/lines\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving a credit note, you’ll get a <strong>lines</strong> property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.</p>\",\n        \"operationId\": \"GetCreditNotesCreditNoteLines\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"credit_note\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/credit_note_line_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CreditNoteLinesList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a credit note's line items\"\n      }\n    },\n    \"/v1/credit_notes/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the credit note object with the given identifier.</p>\",\n        \"operationId\": \"GetCreditNotesId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/credit_note\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a credit note\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing credit note.</p>\",\n        \"operationId\": \"PostCreditNotesId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"memo\": {\n                    \"description\": \"Credit note memo.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/credit_note\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a credit note\"\n      }\n    },\n    \"/v1/credit_notes/{id}/void\": {\n      \"post\": {\n        \"description\": \"<p>Marks a credit note as void. Learn more about <a href=\\\"/docs/billing/invoices/credit-notes#voiding\\\">voiding credit notes</a>.</p>\",\n        \"operationId\": \"PostCreditNotesIdVoid\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/credit_note\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Void a credit note\"\n      }\n    },\n    \"/v1/customer_sessions\": {\n      \"post\": {\n        \"description\": \"<p>Creates a Customer Session object that includes a single-use client secret that you can use on your front-end to grant client-side API access for certain customer resources.</p>\",\n        \"operationId\": \"PostCustomerSessions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"components\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"components\": {\n                    \"description\": \"Configuration for each component. Exactly 1 component must be enabled.\",\n                    \"properties\": {\n                      \"buy_button\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"buy_button_param\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_element\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"features\": {\n                            \"properties\": {\n                              \"payment_method_allow_redisplay_filters\": {\n                                \"items\": {\n                                  \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"payment_method_redisplay\": {\n                                \"enum\": [\"disabled\", \"enabled\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"payment_method_redisplay_limit\": {\n                                \"type\": \"integer\"\n                              },\n                              \"payment_method_remove\": {\n                                \"enum\": [\"disabled\", \"enabled\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"payment_method_save\": {\n                                \"enum\": [\"disabled\", \"enabled\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"payment_method_save_usage\": {\n                                \"enum\": [\"off_session\", \"on_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"features_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"payment_element_param\",\n                        \"type\": \"object\"\n                      },\n                      \"pricing_table\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"pricing_table_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"components\",\n                    \"type\": \"object\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The ID of an existing customer for which to create the Customer Session.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"components\", \"customer\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer_session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Customer Session\"\n      }\n    },\n    \"/v1/customers\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your customers. The customers are returned sorted by creation date, with the most recent customers appearing first.</p>\",\n        \"operationId\": \"GetCustomers\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return customers that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A case-sensitive filter on the list based on the customer's `email` field. The value must be a string.\",\n            \"in\": \"query\",\n            \"name\": \"email\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 512,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Provides a list of customers that are associated with the specified test clock. The response will not include customers with test clocks if this parameter is not set.\",\n            \"in\": \"query\",\n            \"name\": \"test_clock\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/customer\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/customers\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CustomerResourceCustomerList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all customers\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new customer object.</p>\",\n        \"operationId\": \"PostCustomers\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cash_balance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"preferred_locales\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_id_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"address\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"optional_fields_customer_address\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The customer's address.\"\n                  },\n                  \"balance\": {\n                    \"description\": \"An integer amount in cents (or local equivalent) that represents the customer's current balance, which affect the customer's future invoices. A negative amount represents a credit that decreases the amount due on an invoice; a positive amount increases the amount due on an invoice.\",\n                    \"type\": \"integer\"\n                  },\n                  \"cash_balance\": {\n                    \"description\": \"Balance information and default balance settings for this customer.\",\n                    \"properties\": {\n                      \"settings\": {\n                        \"properties\": {\n                          \"reconciliation_mode\": {\n                            \"enum\": [\"automatic\", \"manual\", \"merchant_default\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"balance_settings_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"cash_balance_param\",\n                    \"type\": \"object\"\n                  },\n                  \"coupon\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string that you can attach to a customer object. It is displayed alongside the customer in the dashboard.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"email\": {\n                    \"description\": \"Customer's email address. It's displayed alongside the customer in your dashboard and can be useful for searching and tracking. This may be up to *512 characters*.\",\n                    \"maxLength\": 512,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_prefix\": {\n                    \"description\": \"The prefix for the customer used to generate unique invoice numbers. Must be 3–12 uppercase letters or numbers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"Default invoice settings for this customer.\",\n                    \"properties\": {\n                      \"custom_fields\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"properties\": {\n                                \"name\": {\n                                  \"maxLength\": 40,\n                                  \"type\": \"string\"\n                                },\n                                \"value\": {\n                                  \"maxLength\": 140,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"name\", \"value\"],\n                              \"title\": \"custom_field_params\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"default_payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"footer\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"rendering_options\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_tax_display\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"exclude_tax\",\n                                  \"include_inclusive_tax\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"template\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"customer_rendering_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"customer_param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"The customer's full name or business name.\",\n                    \"maxLength\": 256,\n                    \"type\": \"string\"\n                  },\n                  \"next_invoice_sequence\": {\n                    \"description\": \"The sequence to be used on the customer's next invoice. Defaults to 1.\",\n                    \"type\": \"integer\"\n                  },\n                  \"payment_method\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"phone\": {\n                    \"description\": \"The customer's phone number.\",\n                    \"maxLength\": 20,\n                    \"type\": \"string\"\n                  },\n                  \"preferred_locales\": {\n                    \"description\": \"Customer's preferred languages, ordered by preference.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"promotion_code\": {\n                    \"description\": \"The ID of a promotion code to apply to the customer. The customer will have a discount applied on all recurring payments. Charges you create through the API will not have the discount.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"optional_fields_customer_address\",\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\", \"name\"],\n                        \"title\": \"customer_shipping\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The customer's shipping information. Appears on invoices emailed to this customer.\"\n                  },\n                  \"source\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"tax\": {\n                    \"description\": \"Tax details about the customer.\",\n                    \"properties\": {\n                      \"ip_address\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"validate_location\": {\n                        \"enum\": [\"deferred\", \"immediately\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"shared_tax_create_param\",\n                    \"type\": \"object\"\n                  },\n                  \"tax_exempt\": {\n                    \"description\": \"The customer's tax exemption. One of `none`, `exempt`, or `reverse`.\",\n                    \"enum\": [\"\", \"exempt\", \"none\", \"reverse\"],\n                    \"type\": \"string\"\n                  },\n                  \"tax_id_data\": {\n                    \"description\": \"The customer's tax IDs.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"type\": {\n                          \"enum\": [\n                            \"ad_nrt\",\n                            \"ae_trn\",\n                            \"al_tin\",\n                            \"am_tin\",\n                            \"ao_tin\",\n                            \"ar_cuit\",\n                            \"au_abn\",\n                            \"au_arn\",\n                            \"ba_tin\",\n                            \"bb_tin\",\n                            \"bg_uic\",\n                            \"bh_vat\",\n                            \"bo_tin\",\n                            \"br_cnpj\",\n                            \"br_cpf\",\n                            \"bs_tin\",\n                            \"by_tin\",\n                            \"ca_bn\",\n                            \"ca_gst_hst\",\n                            \"ca_pst_bc\",\n                            \"ca_pst_mb\",\n                            \"ca_pst_sk\",\n                            \"ca_qst\",\n                            \"cd_nif\",\n                            \"ch_uid\",\n                            \"ch_vat\",\n                            \"cl_tin\",\n                            \"cn_tin\",\n                            \"co_nit\",\n                            \"cr_tin\",\n                            \"de_stn\",\n                            \"do_rcn\",\n                            \"ec_ruc\",\n                            \"eg_tin\",\n                            \"es_cif\",\n                            \"eu_oss_vat\",\n                            \"eu_vat\",\n                            \"gb_vat\",\n                            \"ge_vat\",\n                            \"gn_nif\",\n                            \"hk_br\",\n                            \"hr_oib\",\n                            \"hu_tin\",\n                            \"id_npwp\",\n                            \"il_vat\",\n                            \"in_gst\",\n                            \"is_vat\",\n                            \"jp_cn\",\n                            \"jp_rn\",\n                            \"jp_trn\",\n                            \"ke_pin\",\n                            \"kh_tin\",\n                            \"kr_brn\",\n                            \"kz_bin\",\n                            \"li_uid\",\n                            \"li_vat\",\n                            \"ma_vat\",\n                            \"md_vat\",\n                            \"me_pib\",\n                            \"mk_vat\",\n                            \"mr_nif\",\n                            \"mx_rfc\",\n                            \"my_frp\",\n                            \"my_itn\",\n                            \"my_sst\",\n                            \"ng_tin\",\n                            \"no_vat\",\n                            \"no_voec\",\n                            \"np_pan\",\n                            \"nz_gst\",\n                            \"om_vat\",\n                            \"pe_ruc\",\n                            \"ph_tin\",\n                            \"ro_tin\",\n                            \"rs_pib\",\n                            \"ru_inn\",\n                            \"ru_kpp\",\n                            \"sa_vat\",\n                            \"sg_gst\",\n                            \"sg_uen\",\n                            \"si_tin\",\n                            \"sn_ninea\",\n                            \"sr_fin\",\n                            \"sv_nit\",\n                            \"th_vat\",\n                            \"tj_tin\",\n                            \"tr_tin\",\n                            \"tw_vat\",\n                            \"tz_vat\",\n                            \"ua_vat\",\n                            \"ug_tin\",\n                            \"us_ein\",\n                            \"uy_ruc\",\n                            \"uz_tin\",\n                            \"uz_vat\",\n                            \"ve_rif\",\n                            \"vn_tin\",\n                            \"za_vat\",\n                            \"zm_tin\",\n                            \"zw_tin\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\",\n                          \"x-stripeBypassValidation\": true\n                        },\n                        \"value\": {\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"type\", \"value\"],\n                      \"title\": \"data_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"test_clock\": {\n                    \"description\": \"ID of the test clock to attach to the customer.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a customer\"\n      }\n    },\n    \"/v1/customers/search\": {\n      \"get\": {\n        \"description\": \"<p>Search for customers you’ve previously created using Stripe’s <a href=\\\"/docs/search#search-query-language\\\">Search Query Language</a>.\\nDon’t use search in read-after-write flows where strict consistency is necessary. Under normal operating\\nconditions, data is searchable in less than a minute. Occasionally, propagation of new or updated data can be up\\nto an hour behind during outages. Search functionality is not available to merchants in India.</p>\",\n        \"operationId\": \"GetCustomersSearch\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for pagination across multiple pages of results. Don't include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.\",\n            \"in\": \"query\",\n            \"name\": \"page\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The search query string. See [search query language](https://stripe.com/docs/search#search-query-language) and the list of supported [query fields for customers](https://stripe.com/docs/search#query-fields-for-customers).\",\n            \"in\": \"query\",\n            \"name\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/customer\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"type\": \"boolean\"\n                    },\n                    \"next_page\": {\n                      \"maxLength\": 5000,\n                      \"nullable\": true,\n                      \"type\": \"string\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n                      \"enum\": [\"search_result\"],\n                      \"type\": \"string\"\n                    },\n                    \"total_count\": {\n                      \"description\": \"The total number of objects that match the query, only accurate up to 10,000.\",\n                      \"type\": \"integer\"\n                    },\n                    \"url\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SearchResult\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Search customers\"\n      }\n    },\n    \"/v1/customers/{customer}\": {\n      \"delete\": {\n        \"description\": \"<p>Permanently deletes a customer. It cannot be undone. Also immediately cancels any active subscriptions on the customer.</p>\",\n        \"operationId\": \"DeleteCustomersCustomer\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_customer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a customer\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a Customer object.</p>\",\n        \"operationId\": \"GetCustomersCustomer\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/customer\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_customer\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a customer\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified customer by setting the values of the parameters passed. Any parameters not provided will be left unchanged. For example, if you pass the <strong>source</strong> parameter, that becomes the customer’s active source (e.g., a card) to be used for all charges in the future. When you update a customer to a new valid card source by passing the <strong>source</strong> parameter: for each of the customer’s current subscriptions, if the subscription bills automatically and is in the <code>past_due</code> state, then the latest open invoice for the subscription with automatic collection enabled will be retried. This retry will not count as an automatic retry, and will not affect the next regularly scheduled payment for the invoice. Changing the <strong>default_source</strong> for a customer will not trigger this behavior.</p>\\n\\n<p>This request accepts mostly the same arguments as the customer creation call.</p>\",\n        \"operationId\": \"PostCustomersCustomer\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cash_balance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"preferred_locales\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"address\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"optional_fields_customer_address\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The customer's address.\"\n                  },\n                  \"balance\": {\n                    \"description\": \"An integer amount in cents (or local equivalent) that represents the customer's current balance, which affect the customer's future invoices. A negative amount represents a credit that decreases the amount due on an invoice; a positive amount increases the amount due on an invoice.\",\n                    \"type\": \"integer\"\n                  },\n                  \"bank_account\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"bank_account\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"country\"],\n                        \"title\": \"customer_payment_source_bank_account\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Either a token, like the ones returned by [Stripe.js](https://stripe.com/docs/js), or a dictionary containing a user's bank account details.\"\n                  },\n                  \"card\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address_city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_zip\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"cvc\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"exp_year\": {\n                            \"type\": \"integer\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"card\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"exp_month\", \"exp_year\", \"number\"],\n                        \"title\": \"customer_payment_source_card\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A token, like the ones returned by [Stripe.js](https://stripe.com/docs/js).\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"cash_balance\": {\n                    \"description\": \"Balance information and default balance settings for this customer.\",\n                    \"properties\": {\n                      \"settings\": {\n                        \"properties\": {\n                          \"reconciliation_mode\": {\n                            \"enum\": [\"automatic\", \"manual\", \"merchant_default\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"balance_settings_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"cash_balance_param\",\n                    \"type\": \"object\"\n                  },\n                  \"coupon\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_alipay_account\": {\n                    \"description\": \"ID of Alipay account to make the customer's new default for invoice payments.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"default_bank_account\": {\n                    \"description\": \"ID of bank account to make the customer's new default for invoice payments.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"default_card\": {\n                    \"description\": \"ID of card to make the customer's new default for invoice payments.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"default_source\": {\n                    \"description\": \"If you are using payment methods created via the PaymentMethods API, see the [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/update#update_customer-invoice_settings-default_payment_method) parameter.\\n\\nProvide the ID of a payment source already attached to this customer to make it this customer's default payment source.\\n\\nIf you want to add a new payment source and make it the default, see the [source](https://stripe.com/docs/api/customers/update#update_customer-source) property.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string that you can attach to a customer object. It is displayed alongside the customer in the dashboard.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"email\": {\n                    \"description\": \"Customer's email address. It's displayed alongside the customer in your dashboard and can be useful for searching and tracking. This may be up to *512 characters*.\",\n                    \"maxLength\": 512,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_prefix\": {\n                    \"description\": \"The prefix for the customer used to generate unique invoice numbers. Must be 3–12 uppercase letters or numbers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"Default invoice settings for this customer.\",\n                    \"properties\": {\n                      \"custom_fields\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"properties\": {\n                                \"name\": {\n                                  \"maxLength\": 40,\n                                  \"type\": \"string\"\n                                },\n                                \"value\": {\n                                  \"maxLength\": 140,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"name\", \"value\"],\n                              \"title\": \"custom_field_params\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"default_payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"footer\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"rendering_options\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_tax_display\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"exclude_tax\",\n                                  \"include_inclusive_tax\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"template\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"customer_rendering_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"customer_param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"The customer's full name or business name.\",\n                    \"maxLength\": 256,\n                    \"type\": \"string\"\n                  },\n                  \"next_invoice_sequence\": {\n                    \"description\": \"The sequence to be used on the customer's next invoice. Defaults to 1.\",\n                    \"type\": \"integer\"\n                  },\n                  \"phone\": {\n                    \"description\": \"The customer's phone number.\",\n                    \"maxLength\": 20,\n                    \"type\": \"string\"\n                  },\n                  \"preferred_locales\": {\n                    \"description\": \"Customer's preferred languages, ordered by preference.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"promotion_code\": {\n                    \"description\": \"The ID of a promotion code to apply to the customer. The customer will have a discount applied on all recurring payments. Charges you create through the API will not have the discount.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"optional_fields_customer_address\",\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\", \"name\"],\n                        \"title\": \"customer_shipping\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The customer's shipping information. Appears on invoices emailed to this customer.\"\n                  },\n                  \"source\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"tax\": {\n                    \"description\": \"Tax details about the customer.\",\n                    \"properties\": {\n                      \"ip_address\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"validate_location\": {\n                        \"enum\": [\"auto\", \"deferred\", \"immediately\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"shared_tax_update_param\",\n                    \"type\": \"object\"\n                  },\n                  \"tax_exempt\": {\n                    \"description\": \"The customer's tax exemption. One of `none`, `exempt`, or `reverse`.\",\n                    \"enum\": [\"\", \"exempt\", \"none\", \"reverse\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a customer\"\n      }\n    },\n    \"/v1/customers/{customer}/balance_transactions\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of transactions that updated the customer’s <a href=\\\"/docs/billing/customer/balance\\\">balances</a>.</p>\",\n        \"operationId\": \"GetCustomersCustomerBalanceTransactions\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/customer_balance_transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CustomerBalanceTransactionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List customer balance transactions\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates an immutable transaction that updates the customer’s credit <a href=\\\"/docs/billing/customer/balance\\\">balance</a>.</p>\",\n        \"operationId\": \"PostCustomersCustomerBalanceTransactions\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The integer amount in **cents (or local equivalent)** to apply to the customer's credit balance.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). Specifies the [`invoice_credit_balance`](https://stripe.com/docs/api/customers/object#customer_object-invoice_credit_balance) that this transaction will apply to. If the customer's `currency` is not set, it will be updated to this value.\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 350,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"required\": [\"amount\", \"currency\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer_balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a customer balance transaction\"\n      }\n    },\n    \"/v1/customers/{customer}/balance_transactions/{transaction}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a specific customer balance transaction that updated the customer’s <a href=\\\"/docs/billing/customer/balance\\\">balances</a>.</p>\",\n        \"operationId\": \"GetCustomersCustomerBalanceTransactionsTransaction\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer_balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a customer balance transaction\"\n      },\n      \"post\": {\n        \"description\": \"<p>Most credit balance transaction fields are immutable, but you may update its <code>description</code> and <code>metadata</code>.</p>\",\n        \"operationId\": \"PostCustomersCustomerBalanceTransactionsTransaction\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 350,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer_balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a customer credit balance transaction\"\n      }\n    },\n    \"/v1/customers/{customer}/bank_accounts\": {\n      \"get\": {\n        \"deprecated\": true,\n        \"description\": \"<p>You can see a list of the bank accounts belonging to a Customer. Note that the 10 most recent sources are always available by default on the Customer. If you need more than those 10, you can use this API method and the <code>limit</code> and <code>starting_after</code> parameters to page through additional bank accounts.</p>\",\n        \"operationId\": \"GetCustomersCustomerBankAccounts\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/bank_account\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BankAccountList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all bank accounts\"\n      },\n      \"post\": {\n        \"description\": \"<p>When you create a new credit card, you must specify a customer or recipient on which to create it.</p>\\n\\n<p>If the card’s owner has no default card, then the new card will become the default.\\nHowever, if the owner already has a default, then it will not change.\\nTo change the default, you should <a href=\\\"/docs/api#update_customer\\\">update the customer</a> to have a new <code>default_source</code>.</p>\",\n        \"operationId\": \"PostCustomersCustomerBankAccounts\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"alipay_account\": {\n                    \"description\": \"A token returned by [Stripe.js](https://stripe.com/docs/js) representing the user’s Alipay account details.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"bank_account\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"bank_account\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"country\"],\n                        \"title\": \"customer_payment_source_bank_account\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Either a token, like the ones returned by [Stripe.js](https://stripe.com/docs/js), or a dictionary containing a user's bank account details.\"\n                  },\n                  \"card\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address_city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_zip\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"cvc\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"exp_year\": {\n                            \"type\": \"integer\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"card\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"exp_month\", \"exp_year\", \"number\"],\n                        \"title\": \"customer_payment_source_card\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A token, like the ones returned by [Stripe.js](https://stripe.com/docs/js).\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"source\": {\n                    \"description\": \"Please refer to full [documentation](https://stripe.com/docs/api) instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a card\"\n      }\n    },\n    \"/v1/customers/{customer}/bank_accounts/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Delete a specified source for a given customer.</p>\",\n        \"operationId\": \"DeleteCustomersCustomerBankAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/payment_source\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_payment_source\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a customer source\"\n      },\n      \"get\": {\n        \"deprecated\": true,\n        \"description\": \"<p>By default, you can see the 10 most recent sources stored on a Customer directly on the object, but you can also retrieve details about a specific bank account stored on the Stripe account.</p>\",\n        \"operationId\": \"GetCustomersCustomerBankAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/bank_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a bank account\"\n      },\n      \"post\": {\n        \"description\": \"<p>Update a specified source for a given customer.</p>\",\n        \"operationId\": \"PostCustomersCustomerBankAccountsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"owner\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_holder_name\": {\n                    \"description\": \"The name of the person or business that owns the bank account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"account_holder_type\": {\n                    \"description\": \"The type of entity that holds the account. This can be either `individual` or `company`.\",\n                    \"enum\": [\"company\", \"individual\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_city\": {\n                    \"description\": \"City/District/Suburb/Town/Village.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_country\": {\n                    \"description\": \"Billing address country, if provided when creating card.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line1\": {\n                    \"description\": \"Address line 1 (Street address/PO Box/Company name).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line2\": {\n                    \"description\": \"Address line 2 (Apartment/Suite/Unit/Building).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_state\": {\n                    \"description\": \"State/County/Province/Region.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_zip\": {\n                    \"description\": \"ZIP or postal code.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_month\": {\n                    \"description\": \"Two digit number representing the card’s expiration month.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_year\": {\n                    \"description\": \"Four digit number representing the card’s expiration year.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"Cardholder name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"owner\": {\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"source_address\",\n                        \"type\": \"object\"\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"owner\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/card\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/bank_account\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/source\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/customers/{customer}/bank_accounts/{id}/verify\": {\n      \"post\": {\n        \"description\": \"<p>Verify a specified bank account for a given customer.</p>\",\n        \"operationId\": \"PostCustomersCustomerBankAccountsIdVerify\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"amounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amounts\": {\n                    \"description\": \"Two positive integers, in *cents*, equal to the values of the microdeposits sent to the bank account.\",\n                    \"items\": {\n                      \"type\": \"integer\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/bank_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Verify a bank account\"\n      }\n    },\n    \"/v1/customers/{customer}/cards\": {\n      \"get\": {\n        \"deprecated\": true,\n        \"description\": \"<p>You can see a list of the cards belonging to a customer.\\nNote that the 10 most recent sources are always available on the <code>Customer</code> object.\\nIf you need more than those 10, you can use this API method and the <code>limit</code> and <code>starting_after</code> parameters to page through additional cards.</p>\",\n        \"operationId\": \"GetCustomersCustomerCards\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/card\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CardList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all cards\"\n      },\n      \"post\": {\n        \"description\": \"<p>When you create a new credit card, you must specify a customer or recipient on which to create it.</p>\\n\\n<p>If the card’s owner has no default card, then the new card will become the default.\\nHowever, if the owner already has a default, then it will not change.\\nTo change the default, you should <a href=\\\"/docs/api#update_customer\\\">update the customer</a> to have a new <code>default_source</code>.</p>\",\n        \"operationId\": \"PostCustomersCustomerCards\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"alipay_account\": {\n                    \"description\": \"A token returned by [Stripe.js](https://stripe.com/docs/js) representing the user’s Alipay account details.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"bank_account\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"bank_account\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"country\"],\n                        \"title\": \"customer_payment_source_bank_account\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Either a token, like the ones returned by [Stripe.js](https://stripe.com/docs/js), or a dictionary containing a user's bank account details.\"\n                  },\n                  \"card\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address_city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_zip\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"cvc\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"exp_year\": {\n                            \"type\": \"integer\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"card\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"exp_month\", \"exp_year\", \"number\"],\n                        \"title\": \"customer_payment_source_card\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A token, like the ones returned by [Stripe.js](https://stripe.com/docs/js).\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"source\": {\n                    \"description\": \"Please refer to full [documentation](https://stripe.com/docs/api) instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a card\"\n      }\n    },\n    \"/v1/customers/{customer}/cards/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Delete a specified source for a given customer.</p>\",\n        \"operationId\": \"DeleteCustomersCustomerCardsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/payment_source\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_payment_source\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a customer source\"\n      },\n      \"get\": {\n        \"deprecated\": true,\n        \"description\": \"<p>You can always see the 10 most recent cards directly on a customer; this method lets you retrieve details about a specific card stored on the customer.</p>\",\n        \"operationId\": \"GetCustomersCustomerCardsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a card\"\n      },\n      \"post\": {\n        \"description\": \"<p>Update a specified source for a given customer.</p>\",\n        \"operationId\": \"PostCustomersCustomerCardsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"owner\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_holder_name\": {\n                    \"description\": \"The name of the person or business that owns the bank account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"account_holder_type\": {\n                    \"description\": \"The type of entity that holds the account. This can be either `individual` or `company`.\",\n                    \"enum\": [\"company\", \"individual\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_city\": {\n                    \"description\": \"City/District/Suburb/Town/Village.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_country\": {\n                    \"description\": \"Billing address country, if provided when creating card.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line1\": {\n                    \"description\": \"Address line 1 (Street address/PO Box/Company name).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line2\": {\n                    \"description\": \"Address line 2 (Apartment/Suite/Unit/Building).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_state\": {\n                    \"description\": \"State/County/Province/Region.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_zip\": {\n                    \"description\": \"ZIP or postal code.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_month\": {\n                    \"description\": \"Two digit number representing the card’s expiration month.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_year\": {\n                    \"description\": \"Four digit number representing the card’s expiration year.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"Cardholder name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"owner\": {\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"source_address\",\n                        \"type\": \"object\"\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"owner\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/card\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/bank_account\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/source\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/customers/{customer}/cash_balance\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a customer’s cash balance.</p>\",\n        \"operationId\": \"GetCustomersCustomerCashBalance\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/cash_balance\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a cash balance\"\n      },\n      \"post\": {\n        \"description\": \"<p>Changes the settings on a customer’s cash balance.</p>\",\n        \"operationId\": \"PostCustomersCustomerCashBalance\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"settings\": {\n                    \"description\": \"A hash of settings for this cash balance.\",\n                    \"properties\": {\n                      \"reconciliation_mode\": {\n                        \"enum\": [\"automatic\", \"manual\", \"merchant_default\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"balance_settings_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/cash_balance\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a cash balance's settings\"\n      }\n    },\n    \"/v1/customers/{customer}/cash_balance_transactions\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of transactions that modified the customer’s <a href=\\\"/docs/payments/customer-balance\\\">cash balance</a>.</p>\",\n        \"operationId\": \"GetCustomersCustomerCashBalanceTransactions\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"Customers with certain payments enabled have a cash balance, representing funds that were paid\\nby the customer to a merchant, but have not yet been allocated to a payment. Cash Balance Transactions\\nrepresent when funds are moved into or out of this balance. This includes funding by the customer, allocation\\nto payments, and refunds to the customer.\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/customer_cash_balance_transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CustomerCashBalanceTransactionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List cash balance transactions\"\n      }\n    },\n    \"/v1/customers/{customer}/cash_balance_transactions/{transaction}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a specific cash balance transaction, which updated the customer’s <a href=\\\"/docs/payments/customer-balance\\\">cash balance</a>.</p>\",\n        \"operationId\": \"GetCustomersCustomerCashBalanceTransactionsTransaction\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer_cash_balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a cash balance transaction\"\n      }\n    },\n    \"/v1/customers/{customer}/discount\": {\n      \"delete\": {\n        \"description\": \"<p>Removes the currently applied discount on a customer.</p>\",\n        \"operationId\": \"DeleteCustomersCustomerDiscount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_discount\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a customer discount\"\n      },\n      \"get\": {\n        \"description\": \"\",\n        \"operationId\": \"GetCustomersCustomerDiscount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/customers/{customer}/funding_instructions\": {\n      \"post\": {\n        \"description\": \"<p>Retrieve funding instructions for a customer cash balance. If funding instructions do not yet exist for the customer, new\\nfunding instructions will be created. If funding instructions have already been created for a given customer, the same\\nfunding instructions will be retrieved. In other words, we will return the same funding instructions each time.</p>\",\n        \"operationId\": \"PostCustomersCustomerFundingInstructions\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bank_transfer\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"bank_transfer\": {\n                    \"description\": \"Additional parameters for `bank_transfer` funding types\",\n                    \"properties\": {\n                      \"eu_bank_transfer\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"eu_bank_account_params\",\n                        \"type\": \"object\"\n                      },\n                      \"requested_address_types\": {\n                        \"items\": {\n                          \"enum\": [\"iban\", \"sort_code\", \"spei\", \"zengin\"],\n                          \"type\": \"string\",\n                          \"x-stripeBypassValidation\": true\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"eu_bank_transfer\",\n                          \"gb_bank_transfer\",\n                          \"jp_bank_transfer\",\n                          \"mx_bank_transfer\",\n                          \"us_bank_transfer\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"bank_transfer_params\",\n                    \"type\": \"object\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"funding_type\": {\n                    \"description\": \"The `funding_type` to get the instructions for.\",\n                    \"enum\": [\"bank_transfer\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"bank_transfer\", \"currency\", \"funding_type\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/funding_instructions\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create or retrieve funding instructions for a customer cash balance\"\n      }\n    },\n    \"/v1/customers/{customer}/payment_methods\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of PaymentMethods for a given Customer</p>\",\n        \"operationId\": \"GetCustomersCustomerPaymentMethods\",\n        \"parameters\": [\n          {\n            \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to `unspecified`.\",\n            \"in\": \"query\",\n            \"name\": \"allow_redisplay\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"always\", \"limited\", \"unspecified\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"An optional filter on the list, based on the object `type` field. Without the filter, the list includes all current and future payment method types. If your integration expects only one type of payment method in the response, make sure to provide a type value in the request.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"acss_debit\",\n                \"affirm\",\n                \"afterpay_clearpay\",\n                \"alipay\",\n                \"alma\",\n                \"amazon_pay\",\n                \"au_becs_debit\",\n                \"bacs_debit\",\n                \"bancontact\",\n                \"blik\",\n                \"boleto\",\n                \"card\",\n                \"cashapp\",\n                \"customer_balance\",\n                \"eps\",\n                \"fpx\",\n                \"giropay\",\n                \"grabpay\",\n                \"ideal\",\n                \"kakao_pay\",\n                \"klarna\",\n                \"konbini\",\n                \"kr_card\",\n                \"link\",\n                \"mobilepay\",\n                \"multibanco\",\n                \"naver_pay\",\n                \"oxxo\",\n                \"p24\",\n                \"pay_by_bank\",\n                \"payco\",\n                \"paynow\",\n                \"paypal\",\n                \"pix\",\n                \"promptpay\",\n                \"revolut_pay\",\n                \"samsung_pay\",\n                \"sepa_debit\",\n                \"sofort\",\n                \"swish\",\n                \"twint\",\n                \"us_bank_account\",\n                \"wechat_pay\",\n                \"zip\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payment_method\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"CustomerPaymentMethodResourceList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List a Customer's PaymentMethods\"\n      }\n    },\n    \"/v1/customers/{customer}/payment_methods/{payment_method}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a PaymentMethod object for a given Customer.</p>\",\n        \"operationId\": \"GetCustomersCustomerPaymentMethodsPaymentMethod\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Customer's PaymentMethod\"\n      }\n    },\n    \"/v1/customers/{customer}/sources\": {\n      \"get\": {\n        \"description\": \"<p>List sources for a specified customer.</p>\",\n        \"operationId\": \"GetCustomersCustomerSources\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filter sources according to a particular object type.\",\n            \"in\": \"query\",\n            \"name\": \"object\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"anyOf\": [\n                          {\n                            \"$ref\": \"#/components/schemas/bank_account\"\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/card\"\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/source\"\n                          }\n                        ],\n                        \"title\": \"Polymorphic\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ApmsSourcesSourceList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      },\n      \"post\": {\n        \"description\": \"<p>When you create a new credit card, you must specify a customer or recipient on which to create it.</p>\\n\\n<p>If the card’s owner has no default card, then the new card will become the default.\\nHowever, if the owner already has a default, then it will not change.\\nTo change the default, you should <a href=\\\"/docs/api#update_customer\\\">update the customer</a> to have a new <code>default_source</code>.</p>\",\n        \"operationId\": \"PostCustomersCustomerSources\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"alipay_account\": {\n                    \"description\": \"A token returned by [Stripe.js](https://stripe.com/docs/js) representing the user’s Alipay account details.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"bank_account\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"bank_account\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"country\"],\n                        \"title\": \"customer_payment_source_bank_account\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Either a token, like the ones returned by [Stripe.js](https://stripe.com/docs/js), or a dictionary containing a user's bank account details.\"\n                  },\n                  \"card\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address_city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_zip\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"cvc\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"exp_year\": {\n                            \"type\": \"integer\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"object\": {\n                            \"enum\": [\"card\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"exp_month\", \"exp_year\", \"number\"],\n                        \"title\": \"customer_payment_source_card\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A token, like the ones returned by [Stripe.js](https://stripe.com/docs/js).\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"source\": {\n                    \"description\": \"Please refer to full [documentation](https://stripe.com/docs/api) instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a card\"\n      }\n    },\n    \"/v1/customers/{customer}/sources/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Delete a specified source for a given customer.</p>\",\n        \"operationId\": \"DeleteCustomersCustomerSourcesId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/payment_source\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_payment_source\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a customer source\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieve a specified source for a given customer.</p>\",\n        \"operationId\": \"GetCustomersCustomerSourcesId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      },\n      \"post\": {\n        \"description\": \"<p>Update a specified source for a given customer.</p>\",\n        \"operationId\": \"PostCustomersCustomerSourcesId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"owner\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_holder_name\": {\n                    \"description\": \"The name of the person or business that owns the bank account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"account_holder_type\": {\n                    \"description\": \"The type of entity that holds the account. This can be either `individual` or `company`.\",\n                    \"enum\": [\"company\", \"individual\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_city\": {\n                    \"description\": \"City/District/Suburb/Town/Village.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_country\": {\n                    \"description\": \"Billing address country, if provided when creating card.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line1\": {\n                    \"description\": \"Address line 1 (Street address/PO Box/Company name).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_line2\": {\n                    \"description\": \"Address line 2 (Apartment/Suite/Unit/Building).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_state\": {\n                    \"description\": \"State/County/Province/Region.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"address_zip\": {\n                    \"description\": \"ZIP or postal code.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_month\": {\n                    \"description\": \"Two digit number representing the card’s expiration month.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"exp_year\": {\n                    \"description\": \"Four digit number representing the card’s expiration year.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"Cardholder name.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"owner\": {\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"source_address\",\n                        \"type\": \"object\"\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"owner\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/card\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/bank_account\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/source\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/customers/{customer}/sources/{id}/verify\": {\n      \"post\": {\n        \"description\": \"<p>Verify a specified bank account for a given customer.</p>\",\n        \"operationId\": \"PostCustomersCustomerSourcesIdVerify\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"amounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amounts\": {\n                    \"description\": \"Two positive integers, in *cents*, equal to the values of the microdeposits sent to the bank account.\",\n                    \"items\": {\n                      \"type\": \"integer\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/bank_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Verify a bank account\"\n      }\n    },\n    \"/v1/customers/{customer}/subscriptions\": {\n      \"get\": {\n        \"description\": \"<p>You can see a list of the customer’s active subscriptions. Note that the 10 most recent active subscriptions are always available by default on the customer object. If you need more than those 10, you can use the limit and starting_after parameters to page through additional subscriptions.</p>\",\n        \"operationId\": \"GetCustomersCustomerSubscriptions\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/subscription\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SubscriptionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List active subscriptions\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new subscription on an existing customer.</p>\",\n        \"operationId\": \"PostCustomersCustomerSubscriptions\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"add_invoice_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"application_fee_percent\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"billing_thresholds\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pending_invoice_item_interval\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_end\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"add_invoice_items\": {\n                    \"description\": \"A list of prices and quantities that will generate invoice items appended to the next invoice for this subscription. You may pass up to 20 items.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"discounts\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"coupon\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"discount\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"promotion_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"discounts_data_param\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\"],\n                          \"title\": \"one_time_price_data_with_negative_amounts\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"add_invoice_item_entry\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"application_fee_percent\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"number\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. The request must be made by a platform account on a connected account in order to set an application fee percentage. For more information, see the application fees [documentation](https://stripe.com/docs/connect/subscriptions#collecting-fees-on-subscriptions).\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Automatic tax settings for this subscription. We recommend you only include this parameter when the existing value is being changed.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_config\",\n                    \"type\": \"object\"\n                  },\n                  \"backdate_start_date\": {\n                    \"description\": \"For new subscriptions, a past timestamp to backdate the subscription's start date to. If set, the first invoice will contain a proration for the timespan between the start date and the current time. Can be combined with trials and the billing cycle anchor.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"billing_cycle_anchor\": {\n                    \"description\": \"A future timestamp in UTC format to anchor the subscription's [billing cycle](https://stripe.com/docs/subscriptions/billing-cycle). The anchor is the reference point that aligns future billing cycle dates. It sets the day of week for `week` intervals, the day of month for `month` and `year` intervals, and the month of year for `year` intervals.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount_gte\": {\n                            \"type\": \"integer\"\n                          },\n                          \"reset_billing_cycle_anchor\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period. Pass an empty string to remove previously-defined thresholds.\"\n                  },\n                  \"cancel_at\": {\n                    \"description\": \"A timestamp at which the subscription should cancel. If set to a date before the current period ends, this will cause a proration if prorations have been enabled using `proration_behavior`. If set during a future period, this will always cause a proration for that period.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"cancel_at_period_end\": {\n                    \"description\": \"Indicate whether this subscription should cancel at the end of the current period (`current_period_end`). Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`. Defaults to `charge_automatically`.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"coupon\": {\n                    \"description\": \"The ID of the coupon to apply to this subscription. A coupon applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"days_until_due\": {\n                    \"description\": \"Number of days a customer has to pay invoices generated by this subscription. Valid only for subscriptions where `collection_method` is set to `send_invoice`.\",\n                    \"type\": \"integer\"\n                  },\n                  \"default_payment_method\": {\n                    \"description\": \"ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over `default_source`. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_source\": {\n                    \"description\": \"ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If `default_payment_method` is also set, `default_payment_method` will take precedence. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates that will apply to any subscription item that does not have `tax_rates` set. Invoices created will have their `default_tax_rates` populated from the subscription.\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons to redeem into discounts for the subscription. If not specified or empty, inherits the discount from the subscription's customer.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"All invoices will be billed using the specified settings.\",\n                    \"properties\": {\n                      \"account_tax_ids\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"issuer\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"invoice_settings_param\",\n                    \"type\": \"object\"\n                  },\n                  \"items\": {\n                    \"description\": \"A list of up to 20 subscription items, each with an attached price.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"billing_thresholds\": {\n                          \"anyOf\": [\n                            {\n                              \"properties\": {\n                                \"usage_gte\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"usage_gte\"],\n                              \"title\": \"item_billing_thresholds_param\",\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"metadata\": {\n                          \"additionalProperties\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": \"object\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"recurring\": {\n                              \"properties\": {\n                                \"interval\": {\n                                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                  \"type\": \"string\"\n                                },\n                                \"interval_count\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"interval\"],\n                              \"title\": \"recurring_adhoc\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\", \"recurring\"],\n                          \"title\": \"recurring_price_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"subscription_item_create_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"off_session\": {\n                    \"description\": \"Indicates if a customer is on or off-session while an invoice payment is attempted. Defaults to `false` (on-session).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"payment_behavior\": {\n                    \"description\": \"Only applies to subscriptions with `collection_method=charge_automatically`.\\n\\nUse `allow_incomplete` to create Subscriptions with `status=incomplete` if the first invoice can't be paid. Creating Subscriptions with this status allows you to manage scenarios where additional customer actions are needed to pay a subscription's invoice. For example, SCA regulation may require 3DS authentication to complete payment. See the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication) for Billing to learn more. This is the default behavior.\\n\\nUse `default_incomplete` to create Subscriptions with `status=incomplete` when the first invoice requires payment, otherwise start as active. Subscriptions transition to `status=active` when successfully confirming the PaymentIntent on the first invoice. This allows simpler management of scenarios where additional customer actions are needed to pay a subscription’s invoice, such as failed payments, [SCA regulation](https://stripe.com/docs/billing/migration/strong-customer-authentication), or collecting a mandate for a bank debit payment method. If the PaymentIntent is not confirmed within 23 hours Subscriptions transition to `status=incomplete_expired`, which is a terminal state.\\n\\nUse `error_if_incomplete` if you want Stripe to return an HTTP 402 status code if a subscription's first invoice can't be paid. For example, if a payment method requires 3DS authentication due to SCA regulation and further customer action is needed, this parameter doesn't create a Subscription and returns an error instead. This was the default behavior for API versions prior to 2019-03-14. See the [changelog](https://stripe.com/docs/upgrades#2019-03-14) to learn more.\\n\\n`pending_if_incomplete` is only used with updates and cannot be passed when creating a Subscription.\\n\\nSubscriptions with `collection_method=send_invoice` are automatically activated regardless of the first Invoice status.\",\n                    \"enum\": [\n                      \"allow_incomplete\",\n                      \"default_incomplete\",\n                      \"error_if_incomplete\",\n                      \"pending_if_incomplete\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"payment_settings\": {\n                    \"description\": \"Payment settings to pass to invoices created by the subscription.\",\n                    \"properties\": {\n                      \"payment_method_options\": {\n                        \"properties\": {\n                          \"acss_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"transaction_type\": {\n                                        \"enum\": [\"business\", \"personal\"],\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"bancontact\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"preferred_language\": {\n                                    \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"card\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"amount\": {\n                                        \"type\": \"integer\"\n                                      },\n                                      \"amount_type\": {\n                                        \"enum\": [\"fixed\", \"maximum\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"description\": {\n                                        \"maxLength\": 200,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"network\": {\n                                    \"enum\": [\n                                      \"amex\",\n                                      \"cartes_bancaires\",\n                                      \"diners\",\n                                      \"discover\",\n                                      \"eftpos_au\",\n                                      \"girocard\",\n                                      \"interac\",\n                                      \"jcb\",\n                                      \"link\",\n                                      \"mastercard\",\n                                      \"unionpay\",\n                                      \"unknown\",\n                                      \"visa\"\n                                    ],\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  },\n                                  \"request_three_d_secure\": {\n                                    \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"subscription_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"customer_balance\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"bank_transfer\": {\n                                    \"properties\": {\n                                      \"eu_bank_transfer\": {\n                                        \"properties\": {\n                                          \"country\": {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          }\n                                        },\n                                        \"required\": [\"country\"],\n                                        \"title\": \"eu_bank_transfer_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"type\": {\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"bank_transfer_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"funding_type\": {\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"konbini\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"sepa_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"us_bank_account\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"financial_connections\": {\n                                    \"properties\": {\n                                      \"filters\": {\n                                        \"properties\": {\n                                          \"account_subcategories\": {\n                                            \"items\": {\n                                              \"enum\": [\"checking\", \"savings\"],\n                                              \"type\": \"string\"\n                                            },\n                                            \"type\": \"array\"\n                                          }\n                                        },\n                                        \"title\": \"invoice_linked_account_options_filters_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"permissions\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"payment_method\",\n                                            \"transactions\"\n                                          ],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"prefetch\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"transactions\"\n                                          ],\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"invoice_linked_account_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"payment_method_options\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_types\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"enum\": [\n                                \"ach_credit_transfer\",\n                                \"ach_debit\",\n                                \"acss_debit\",\n                                \"amazon_pay\",\n                                \"au_becs_debit\",\n                                \"bacs_debit\",\n                                \"bancontact\",\n                                \"boleto\",\n                                \"card\",\n                                \"cashapp\",\n                                \"customer_balance\",\n                                \"eps\",\n                                \"fpx\",\n                                \"giropay\",\n                                \"grabpay\",\n                                \"ideal\",\n                                \"jp_credit_transfer\",\n                                \"kakao_pay\",\n                                \"konbini\",\n                                \"kr_card\",\n                                \"link\",\n                                \"multibanco\",\n                                \"naver_pay\",\n                                \"p24\",\n                                \"payco\",\n                                \"paynow\",\n                                \"paypal\",\n                                \"promptpay\",\n                                \"revolut_pay\",\n                                \"sepa_credit_transfer\",\n                                \"sepa_debit\",\n                                \"sofort\",\n                                \"swish\",\n                                \"us_bank_account\",\n                                \"wechat_pay\"\n                              ],\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"save_default_payment_method\": {\n                        \"enum\": [\"off\", \"on_subscription\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_settings\",\n                    \"type\": \"object\"\n                  },\n                  \"pending_invoice_item_interval\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"pending_invoice_item_interval_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling [Create an invoice](https://stripe.com/docs/api#create_invoice) for the given subscription at the specified interval.\"\n                  },\n                  \"promotion_code\": {\n                    \"description\": \"The promotion code to apply to this subscription. A promotion code applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) resulting from the `billing_cycle_anchor`. If no value is passed, the default is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"If specified, the funds from the subscription's invoices will be transferred to the destination and the ID of the resulting transfers will be found on the resulting charges.\",\n                    \"properties\": {\n                      \"amount_percent\": {\n                        \"type\": \"number\"\n                      },\n                      \"destination\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"destination\"],\n                    \"title\": \"transfer_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"trial_end\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    ],\n                    \"description\": \"Unix timestamp representing the end of the trial period the customer will get before being charged for the first time. If set, trial_end will override the default trial period of the plan the customer is being subscribed to. The special value `now` can be provided to end the customer's trial immediately. Can be at most two years from `billing_cycle_anchor`. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\"\n                  },\n                  \"trial_from_plan\": {\n                    \"description\": \"Indicates if a plan's `trial_period_days` should be applied to the subscription. Setting `trial_end` per subscription is preferred, and this defaults to `false`. Setting this flag to `true` together with `trial_end` is not allowed. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"trial_period_days\": {\n                    \"description\": \"Integer representing the number of trial period days before the customer is charged for the first time. This will always overwrite any trials that might apply via a subscribed plan. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\",\n                    \"type\": \"integer\"\n                  },\n                  \"trial_settings\": {\n                    \"description\": \"Settings related to subscription trials.\",\n                    \"properties\": {\n                      \"end_behavior\": {\n                        \"properties\": {\n                          \"missing_payment_method\": {\n                            \"enum\": [\"cancel\", \"create_invoice\", \"pause\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"missing_payment_method\"],\n                        \"title\": \"end_behavior\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"end_behavior\"],\n                    \"title\": \"trial_settings_config\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a subscription\"\n      }\n    },\n    \"/v1/customers/{customer}/subscriptions/{subscription_exposed_id}\": {\n      \"delete\": {\n        \"description\": \"<p>Cancels a customer’s subscription. If you set the <code>at_period_end</code> parameter to <code>true</code>, the subscription will remain active until the end of the period, at which point it will be canceled and not renewed. Otherwise, with the default <code>false</code> value, the subscription is terminated immediately. In either case, the customer will not be charged again for the subscription.</p>\\n\\n<p>Note, however, that any pending invoice items that you’ve created will still be charged for at the end of the period, unless manually <a href=\\\"#delete_invoiceitem\\\">deleted</a>. If you’ve set the subscription to cancel at the end of the period, any pending prorations will also be left in place and collected at the end of the period. But if the subscription is set to cancel immediately, pending prorations will be removed.</p>\\n\\n<p>By default, upon subscription cancellation, Stripe will stop automatic collection of all finalized invoices for the customer. This is intended to prevent unexpected payment attempts after the customer has canceled a subscription. However, you can resume automatic collection of the invoices manually after subscription cancellation to have us proceed. Or, you could check for unpaid invoices before allowing the customer to cancel the subscription at all.</p>\",\n        \"operationId\": \"DeleteCustomersCustomerSubscriptionsSubscriptionExposedId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_now\": {\n                    \"description\": \"Can be set to `true` if `at_period_end` is not set to `true`. Will generate a final invoice that invoices for any un-invoiced metered usage and new/pending proration invoice items.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"prorate\": {\n                    \"description\": \"Can be set to `true` if `at_period_end` is not set to `true`. Will generate a proration invoice item that credits remaining unused time until the subscription period end.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a subscription\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the subscription with the given ID.</p>\",\n        \"operationId\": \"GetCustomersCustomerSubscriptionsSubscriptionExposedId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a subscription\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing subscription on a customer to match the specified parameters. When changing plans or quantities, we will optionally prorate the price we charge next month to make up for any price changes. To preview how the proration will be calculated, use the <a href=\\\"#upcoming_invoice\\\">upcoming invoice</a> endpoint.</p>\",\n        \"operationId\": \"PostCustomersCustomerSubscriptionsSubscriptionExposedId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"add_invoice_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"application_fee_percent\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"billing_thresholds\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cancel_at\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cancellation_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_source\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pause_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pending_invoice_item_interval\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_end\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"add_invoice_items\": {\n                    \"description\": \"A list of prices and quantities that will generate invoice items appended to the next invoice for this subscription. You may pass up to 20 items.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"discounts\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"coupon\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"discount\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"promotion_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"discounts_data_param\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\"],\n                          \"title\": \"one_time_price_data_with_negative_amounts\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"add_invoice_item_entry\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"application_fee_percent\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"number\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. The request must be made by a platform account on a connected account in order to set an application fee percentage. For more information, see the application fees [documentation](https://stripe.com/docs/connect/subscriptions#collecting-fees-on-subscriptions).\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Automatic tax settings for this subscription. We recommend you only include this parameter when the existing value is being changed.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_config\",\n                    \"type\": \"object\"\n                  },\n                  \"billing_cycle_anchor\": {\n                    \"description\": \"Either `now` or `unchanged`. Setting the value to `now` resets the subscription's billing cycle anchor to the current time. For more information, see the billing cycle [documentation](https://stripe.com/docs/billing/subscriptions/billing-cycle).\",\n                    \"enum\": [\"now\", \"unchanged\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount_gte\": {\n                            \"type\": \"integer\"\n                          },\n                          \"reset_billing_cycle_anchor\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period. Pass an empty string to remove previously-defined thresholds.\"\n                  },\n                  \"cancel_at\": {\n                    \"anyOf\": [\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A timestamp at which the subscription should cancel. If set to a date before the current period ends, this will cause a proration if prorations have been enabled using `proration_behavior`. If set during a future period, this will always cause a proration for that period.\"\n                  },\n                  \"cancel_at_period_end\": {\n                    \"description\": \"Indicate whether this subscription should cancel at the end of the current period (`current_period_end`). Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"cancellation_details\": {\n                    \"description\": \"Details about why this subscription was cancelled\",\n                    \"properties\": {\n                      \"comment\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"feedback\": {\n                        \"enum\": [\n                          \"\",\n                          \"customer_service\",\n                          \"low_quality\",\n                          \"missing_features\",\n                          \"other\",\n                          \"switched_service\",\n                          \"too_complex\",\n                          \"too_expensive\",\n                          \"unused\"\n                        ],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"cancellation_details_param\",\n                    \"type\": \"object\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`. Defaults to `charge_automatically`.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"coupon\": {\n                    \"description\": \"The ID of the coupon to apply to this subscription. A coupon applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"days_until_due\": {\n                    \"description\": \"Number of days a customer has to pay invoices generated by this subscription. Valid only for subscriptions where `collection_method` is set to `send_invoice`.\",\n                    \"type\": \"integer\"\n                  },\n                  \"default_payment_method\": {\n                    \"description\": \"ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over `default_source`. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_source\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If `default_payment_method` is also set, `default_payment_method` will take precedence. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\"\n                  },\n                  \"default_tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates that will apply to any subscription item that does not have `tax_rates` set. Invoices created will have their `default_tax_rates` populated from the subscription. Pass an empty string to remove previously-defined tax rates.\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons to redeem into discounts for the subscription. If not specified or empty, inherits the discount from the subscription's customer.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"All invoices will be billed using the specified settings.\",\n                    \"properties\": {\n                      \"account_tax_ids\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"issuer\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"invoice_settings_param\",\n                    \"type\": \"object\"\n                  },\n                  \"items\": {\n                    \"description\": \"A list of up to 20 subscription items, each with an attached price.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"billing_thresholds\": {\n                          \"anyOf\": [\n                            {\n                              \"properties\": {\n                                \"usage_gte\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"usage_gte\"],\n                              \"title\": \"item_billing_thresholds_param\",\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"clear_usage\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"deleted\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"id\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"metadata\": {\n                          \"anyOf\": [\n                            {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"recurring\": {\n                              \"properties\": {\n                                \"interval\": {\n                                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                  \"type\": \"string\"\n                                },\n                                \"interval_count\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"interval\"],\n                              \"title\": \"recurring_adhoc\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\", \"recurring\"],\n                          \"title\": \"recurring_price_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"subscription_item_update_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"off_session\": {\n                    \"description\": \"Indicates if a customer is on or off-session while an invoice payment is attempted. Defaults to `false` (on-session).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"pause_collection\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"behavior\": {\n                            \"enum\": [\n                              \"keep_as_draft\",\n                              \"mark_uncollectible\",\n                              \"void\"\n                            ],\n                            \"type\": \"string\"\n                          },\n                          \"resumes_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"behavior\"],\n                        \"title\": \"pause_collection_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"If specified, payment collection for this subscription will be paused. Note that the subscription status will be unchanged and will not be updated to `paused`. Learn more about [pausing collection](https://stripe.com/docs/billing/subscriptions/pause-payment).\"\n                  },\n                  \"payment_behavior\": {\n                    \"description\": \"Use `allow_incomplete` to transition the subscription to `status=past_due` if a payment is required but cannot be paid. This allows you to manage scenarios where additional user actions are needed to pay a subscription's invoice. For example, SCA regulation may require 3DS authentication to complete payment. See the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication) for Billing to learn more. This is the default behavior.\\n\\nUse `default_incomplete` to transition the subscription to `status=past_due` when payment is required and await explicit confirmation of the invoice's payment intent. This allows simpler management of scenarios where additional user actions are needed to pay a subscription’s invoice. Such as failed payments, [SCA regulation](https://stripe.com/docs/billing/migration/strong-customer-authentication), or collecting a mandate for a bank debit payment method.\\n\\nUse `pending_if_incomplete` to update the subscription using [pending updates](https://stripe.com/docs/billing/subscriptions/pending-updates). When you use `pending_if_incomplete` you can only pass the parameters [supported by pending updates](https://stripe.com/docs/billing/pending-updates-reference#supported-attributes).\\n\\nUse `error_if_incomplete` if you want Stripe to return an HTTP 402 status code if a subscription's invoice cannot be paid. For example, if a payment method requires 3DS authentication due to SCA regulation and further user action is needed, this parameter does not update the subscription and returns an error instead. This was the default behavior for API versions prior to 2019-03-14. See the [changelog](https://stripe.com/docs/upgrades#2019-03-14) to learn more.\",\n                    \"enum\": [\n                      \"allow_incomplete\",\n                      \"default_incomplete\",\n                      \"error_if_incomplete\",\n                      \"pending_if_incomplete\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"payment_settings\": {\n                    \"description\": \"Payment settings to pass to invoices created by the subscription.\",\n                    \"properties\": {\n                      \"payment_method_options\": {\n                        \"properties\": {\n                          \"acss_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"transaction_type\": {\n                                        \"enum\": [\"business\", \"personal\"],\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"bancontact\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"preferred_language\": {\n                                    \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"card\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"amount\": {\n                                        \"type\": \"integer\"\n                                      },\n                                      \"amount_type\": {\n                                        \"enum\": [\"fixed\", \"maximum\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"description\": {\n                                        \"maxLength\": 200,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"network\": {\n                                    \"enum\": [\n                                      \"amex\",\n                                      \"cartes_bancaires\",\n                                      \"diners\",\n                                      \"discover\",\n                                      \"eftpos_au\",\n                                      \"girocard\",\n                                      \"interac\",\n                                      \"jcb\",\n                                      \"link\",\n                                      \"mastercard\",\n                                      \"unionpay\",\n                                      \"unknown\",\n                                      \"visa\"\n                                    ],\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  },\n                                  \"request_three_d_secure\": {\n                                    \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"subscription_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"customer_balance\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"bank_transfer\": {\n                                    \"properties\": {\n                                      \"eu_bank_transfer\": {\n                                        \"properties\": {\n                                          \"country\": {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          }\n                                        },\n                                        \"required\": [\"country\"],\n                                        \"title\": \"eu_bank_transfer_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"type\": {\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"bank_transfer_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"funding_type\": {\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"konbini\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"sepa_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"us_bank_account\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"financial_connections\": {\n                                    \"properties\": {\n                                      \"filters\": {\n                                        \"properties\": {\n                                          \"account_subcategories\": {\n                                            \"items\": {\n                                              \"enum\": [\"checking\", \"savings\"],\n                                              \"type\": \"string\"\n                                            },\n                                            \"type\": \"array\"\n                                          }\n                                        },\n                                        \"title\": \"invoice_linked_account_options_filters_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"permissions\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"payment_method\",\n                                            \"transactions\"\n                                          ],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"prefetch\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"transactions\"\n                                          ],\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"invoice_linked_account_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"payment_method_options\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_types\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"enum\": [\n                                \"ach_credit_transfer\",\n                                \"ach_debit\",\n                                \"acss_debit\",\n                                \"amazon_pay\",\n                                \"au_becs_debit\",\n                                \"bacs_debit\",\n                                \"bancontact\",\n                                \"boleto\",\n                                \"card\",\n                                \"cashapp\",\n                                \"customer_balance\",\n                                \"eps\",\n                                \"fpx\",\n                                \"giropay\",\n                                \"grabpay\",\n                                \"ideal\",\n                                \"jp_credit_transfer\",\n                                \"kakao_pay\",\n                                \"konbini\",\n                                \"kr_card\",\n                                \"link\",\n                                \"multibanco\",\n                                \"naver_pay\",\n                                \"p24\",\n                                \"payco\",\n                                \"paynow\",\n                                \"paypal\",\n                                \"promptpay\",\n                                \"revolut_pay\",\n                                \"sepa_credit_transfer\",\n                                \"sepa_debit\",\n                                \"sofort\",\n                                \"swish\",\n                                \"us_bank_account\",\n                                \"wechat_pay\"\n                              ],\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"save_default_payment_method\": {\n                        \"enum\": [\"off\", \"on_subscription\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_settings\",\n                    \"type\": \"object\"\n                  },\n                  \"pending_invoice_item_interval\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"pending_invoice_item_interval_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling [Create an invoice](https://stripe.com/docs/api#create_invoice) for the given subscription at the specified interval.\"\n                  },\n                  \"promotion_code\": {\n                    \"description\": \"The promotion code to apply to this subscription. A promotion code applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"proration_date\": {\n                    \"description\": \"If set, the proration will be calculated as though the subscription was updated at the given time. This can be used to apply exactly the same proration that was previewed with [upcoming invoice](https://stripe.com/docs/api#upcoming_invoice) endpoint. It can also be used to implement custom proration logic, such as prorating by day instead of by second, by providing the time that you wish to use for proration calculations.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"transfer_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount_percent\": {\n                            \"type\": \"number\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"If specified, the funds from the subscription's invoices will be transferred to the destination and the ID of the resulting transfers will be found on the resulting charges. This will be unset if you POST an empty value.\"\n                  },\n                  \"trial_end\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    ],\n                    \"description\": \"Unix timestamp representing the end of the trial period the customer will get before being charged for the first time. This will always overwrite any trials that might apply via a subscribed plan. If set, trial_end will override the default trial period of the plan the customer is being subscribed to. The special value `now` can be provided to end the customer's trial immediately. Can be at most two years from `billing_cycle_anchor`.\"\n                  },\n                  \"trial_from_plan\": {\n                    \"description\": \"Indicates if a plan's `trial_period_days` should be applied to the subscription. Setting `trial_end` per subscription is preferred, and this defaults to `false`. Setting this flag to `true` together with `trial_end` is not allowed. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"trial_settings\": {\n                    \"description\": \"Settings related to subscription trials.\",\n                    \"properties\": {\n                      \"end_behavior\": {\n                        \"properties\": {\n                          \"missing_payment_method\": {\n                            \"enum\": [\"cancel\", \"create_invoice\", \"pause\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"missing_payment_method\"],\n                        \"title\": \"end_behavior\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"end_behavior\"],\n                    \"title\": \"trial_settings_config\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a subscription on a customer\"\n      }\n    },\n    \"/v1/customers/{customer}/subscriptions/{subscription_exposed_id}/discount\": {\n      \"delete\": {\n        \"description\": \"<p>Removes the currently applied discount on a customer.</p>\",\n        \"operationId\": \"DeleteCustomersCustomerSubscriptionsSubscriptionExposedIdDiscount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_discount\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a customer discount\"\n      },\n      \"get\": {\n        \"description\": \"\",\n        \"operationId\": \"GetCustomersCustomerSubscriptionsSubscriptionExposedIdDiscount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/discount\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/customers/{customer}/tax_ids\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of tax IDs for a customer.</p>\",\n        \"operationId\": \"GetCustomersCustomerTaxIds\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/tax_id\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TaxIDsList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Customer tax IDs\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new <code>tax_id</code> object for a customer.</p>\",\n        \"operationId\": \"PostCustomersCustomerTaxIds\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"type\": {\n                    \"description\": \"Type of the tax ID, one of `ad_nrt`, `ae_trn`, `al_tin`, `am_tin`, `ao_tin`, `ar_cuit`, `au_abn`, `au_arn`, `ba_tin`, `bb_tin`, `bg_uic`, `bh_vat`, `bo_tin`, `br_cnpj`, `br_cpf`, `bs_tin`, `by_tin`, `ca_bn`, `ca_gst_hst`, `ca_pst_bc`, `ca_pst_mb`, `ca_pst_sk`, `ca_qst`, `cd_nif`, `ch_uid`, `ch_vat`, `cl_tin`, `cn_tin`, `co_nit`, `cr_tin`, `de_stn`, `do_rcn`, `ec_ruc`, `eg_tin`, `es_cif`, `eu_oss_vat`, `eu_vat`, `gb_vat`, `ge_vat`, `gn_nif`, `hk_br`, `hr_oib`, `hu_tin`, `id_npwp`, `il_vat`, `in_gst`, `is_vat`, `jp_cn`, `jp_rn`, `jp_trn`, `ke_pin`, `kh_tin`, `kr_brn`, `kz_bin`, `li_uid`, `li_vat`, `ma_vat`, `md_vat`, `me_pib`, `mk_vat`, `mr_nif`, `mx_rfc`, `my_frp`, `my_itn`, `my_sst`, `ng_tin`, `no_vat`, `no_voec`, `np_pan`, `nz_gst`, `om_vat`, `pe_ruc`, `ph_tin`, `ro_tin`, `rs_pib`, `ru_inn`, `ru_kpp`, `sa_vat`, `sg_gst`, `sg_uen`, `si_tin`, `sn_ninea`, `sr_fin`, `sv_nit`, `th_vat`, `tj_tin`, `tr_tin`, `tw_vat`, `tz_vat`, `ua_vat`, `ug_tin`, `us_ein`, `uy_ruc`, `uz_tin`, `uz_vat`, `ve_rif`, `vn_tin`, `za_vat`, `zm_tin`, or `zw_tin`\",\n                    \"enum\": [\n                      \"ad_nrt\",\n                      \"ae_trn\",\n                      \"al_tin\",\n                      \"am_tin\",\n                      \"ao_tin\",\n                      \"ar_cuit\",\n                      \"au_abn\",\n                      \"au_arn\",\n                      \"ba_tin\",\n                      \"bb_tin\",\n                      \"bg_uic\",\n                      \"bh_vat\",\n                      \"bo_tin\",\n                      \"br_cnpj\",\n                      \"br_cpf\",\n                      \"bs_tin\",\n                      \"by_tin\",\n                      \"ca_bn\",\n                      \"ca_gst_hst\",\n                      \"ca_pst_bc\",\n                      \"ca_pst_mb\",\n                      \"ca_pst_sk\",\n                      \"ca_qst\",\n                      \"cd_nif\",\n                      \"ch_uid\",\n                      \"ch_vat\",\n                      \"cl_tin\",\n                      \"cn_tin\",\n                      \"co_nit\",\n                      \"cr_tin\",\n                      \"de_stn\",\n                      \"do_rcn\",\n                      \"ec_ruc\",\n                      \"eg_tin\",\n                      \"es_cif\",\n                      \"eu_oss_vat\",\n                      \"eu_vat\",\n                      \"gb_vat\",\n                      \"ge_vat\",\n                      \"gn_nif\",\n                      \"hk_br\",\n                      \"hr_oib\",\n                      \"hu_tin\",\n                      \"id_npwp\",\n                      \"il_vat\",\n                      \"in_gst\",\n                      \"is_vat\",\n                      \"jp_cn\",\n                      \"jp_rn\",\n                      \"jp_trn\",\n                      \"ke_pin\",\n                      \"kh_tin\",\n                      \"kr_brn\",\n                      \"kz_bin\",\n                      \"li_uid\",\n                      \"li_vat\",\n                      \"ma_vat\",\n                      \"md_vat\",\n                      \"me_pib\",\n                      \"mk_vat\",\n                      \"mr_nif\",\n                      \"mx_rfc\",\n                      \"my_frp\",\n                      \"my_itn\",\n                      \"my_sst\",\n                      \"ng_tin\",\n                      \"no_vat\",\n                      \"no_voec\",\n                      \"np_pan\",\n                      \"nz_gst\",\n                      \"om_vat\",\n                      \"pe_ruc\",\n                      \"ph_tin\",\n                      \"ro_tin\",\n                      \"rs_pib\",\n                      \"ru_inn\",\n                      \"ru_kpp\",\n                      \"sa_vat\",\n                      \"sg_gst\",\n                      \"sg_uen\",\n                      \"si_tin\",\n                      \"sn_ninea\",\n                      \"sr_fin\",\n                      \"sv_nit\",\n                      \"th_vat\",\n                      \"tj_tin\",\n                      \"tr_tin\",\n                      \"tw_vat\",\n                      \"tz_vat\",\n                      \"ua_vat\",\n                      \"ug_tin\",\n                      \"us_ein\",\n                      \"uy_ruc\",\n                      \"uz_tin\",\n                      \"uz_vat\",\n                      \"ve_rif\",\n                      \"vn_tin\",\n                      \"za_vat\",\n                      \"zm_tin\",\n                      \"zw_tin\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"value\": {\n                    \"description\": \"Value of the tax ID.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"value\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Customer tax ID\"\n      }\n    },\n    \"/v1/customers/{customer}/tax_ids/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes an existing <code>tax_id</code> object.</p>\",\n        \"operationId\": \"DeleteCustomersCustomerTaxIdsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a Customer tax ID\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the <code>tax_id</code> object with the given identifier.</p>\",\n        \"operationId\": \"GetCustomersCustomerTaxIdsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Customer tax ID\"\n      }\n    },\n    \"/v1/disputes\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your disputes.</p>\",\n        \"operationId\": \"GetDisputes\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return disputes associated to the charge specified by this charge ID.\",\n            \"in\": \"query\",\n            \"name\": \"charge\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return disputes that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return disputes associated to the PaymentIntent specified by this PaymentIntent ID.\",\n            \"in\": \"query\",\n            \"name\": \"payment_intent\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/dispute\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/disputes\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"DisputeList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all disputes\"\n      }\n    },\n    \"/v1/disputes/{dispute}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the dispute with the given ID.</p>\",\n        \"operationId\": \"GetDisputesDispute\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dispute\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a dispute\"\n      },\n      \"post\": {\n        \"description\": \"<p>When you get a dispute, contacting your customer is always the best first step. If that doesn’t work, you can submit evidence to help us resolve the dispute in your favor. You can do this in your <a href=\\\"https://dashboard.stripe.com/disputes\\\">dashboard</a>, but if you prefer, you can use the API to submit evidence programmatically.</p>\\n\\n<p>Depending on your dispute type, different evidence fields will give you a better chance of winning your dispute. To figure out which evidence fields to provide, see our <a href=\\\"/docs/disputes/categories\\\">guide to dispute types</a>.</p>\",\n        \"operationId\": \"PostDisputesDispute\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dispute\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"evidence\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"evidence\": {\n                    \"description\": \"Evidence to upload, to respond to a dispute. Updating any field in the hash will submit all fields in the hash for review. The combined character count of all fields is limited to 150,000.\",\n                    \"properties\": {\n                      \"access_activity_log\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"billing_address\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"cancellation_policy\": {\n                        \"type\": \"string\"\n                      },\n                      \"cancellation_policy_disclosure\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"cancellation_rebuttal\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_communication\": {\n                        \"type\": \"string\"\n                      },\n                      \"customer_email_address\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_purchase_ip\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer_signature\": {\n                        \"type\": \"string\"\n                      },\n                      \"duplicate_charge_documentation\": {\n                        \"type\": \"string\"\n                      },\n                      \"duplicate_charge_explanation\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"duplicate_charge_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"enhanced_evidence\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"visa_compelling_evidence_3\": {\n                                \"properties\": {\n                                  \"disputed_transaction\": {\n                                    \"properties\": {\n                                      \"customer_account_id\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_device_fingerprint\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_device_id\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_email_address\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"customer_purchase_ip\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"merchandise_or_services\": {\n                                        \"enum\": [\"merchandise\", \"services\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"product_description\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      },\n                                      \"shipping_address\": {\n                                        \"properties\": {\n                                          \"city\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"country\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"line1\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"line2\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"postal_code\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          },\n                                          \"state\": {\n                                            \"anyOf\": [\n                                              {\n                                                \"maxLength\": 5000,\n                                                \"type\": \"string\"\n                                              },\n                                              {\n                                                \"enum\": [\"\"],\n                                                \"type\": \"string\"\n                                              }\n                                            ]\n                                          }\n                                        },\n                                        \"title\": \"shipping_address\",\n                                        \"type\": \"object\"\n                                      }\n                                    },\n                                    \"title\": \"visa_compelling_evidence3_disputed_transaction\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"prior_undisputed_transactions\": {\n                                    \"items\": {\n                                      \"properties\": {\n                                        \"charge\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"customer_account_id\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_device_fingerprint\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_device_id\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_email_address\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"customer_purchase_ip\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"product_description\": {\n                                          \"anyOf\": [\n                                            {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            {\n                                              \"enum\": [\"\"],\n                                              \"type\": \"string\"\n                                            }\n                                          ]\n                                        },\n                                        \"shipping_address\": {\n                                          \"properties\": {\n                                            \"city\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"country\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"line1\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"line2\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"postal_code\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            },\n                                            \"state\": {\n                                              \"anyOf\": [\n                                                {\n                                                  \"maxLength\": 5000,\n                                                  \"type\": \"string\"\n                                                },\n                                                {\n                                                  \"enum\": [\"\"],\n                                                  \"type\": \"string\"\n                                                }\n                                              ]\n                                            }\n                                          },\n                                          \"title\": \"shipping_address\",\n                                          \"type\": \"object\"\n                                        }\n                                      },\n                                      \"required\": [\"charge\"],\n                                      \"title\": \"visa_compelling_evidence3_prior_undisputed_transaction\",\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"visa_compelling_evidence3\",\n                                \"type\": \"object\"\n                              },\n                              \"visa_compliance\": {\n                                \"properties\": {\n                                  \"fee_acknowledged\": {\n                                    \"type\": \"boolean\"\n                                  }\n                                },\n                                \"title\": \"visa_compliance\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"enhanced_evidence\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"product_description\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"receipt\": {\n                        \"type\": \"string\"\n                      },\n                      \"refund_policy\": {\n                        \"type\": \"string\"\n                      },\n                      \"refund_policy_disclosure\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"refund_refusal_explanation\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      },\n                      \"service_date\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"service_documentation\": {\n                        \"type\": \"string\"\n                      },\n                      \"shipping_address\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"shipping_carrier\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"shipping_date\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"shipping_documentation\": {\n                        \"type\": \"string\"\n                      },\n                      \"shipping_tracking_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"uncategorized_file\": {\n                        \"type\": \"string\"\n                      },\n                      \"uncategorized_text\": {\n                        \"maxLength\": 20000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"dispute_evidence_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"submit\": {\n                    \"description\": \"Whether to immediately submit evidence to the bank. If `false`, evidence is staged on the dispute. Staged evidence is visible in the API and Dashboard, and can be submitted to the bank by making another request with this attribute set to `true` (the default).\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a dispute\"\n      }\n    },\n    \"/v1/disputes/{dispute}/close\": {\n      \"post\": {\n        \"description\": \"<p>Closing the dispute for a charge indicates that you do not have any evidence to submit and are essentially dismissing the dispute, acknowledging it as lost.</p>\\n\\n<p>The status of the dispute will change from <code>needs_response</code> to <code>lost</code>. <em>Closing a dispute is irreversible</em>.</p>\",\n        \"operationId\": \"PostDisputesDisputeClose\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dispute\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Close a dispute\"\n      }\n    },\n    \"/v1/entitlements/active_entitlements\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a list of active entitlements for a customer</p>\",\n        \"operationId\": \"GetEntitlementsActiveEntitlements\",\n        \"parameters\": [\n          {\n            \"description\": \"The ID of the customer.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/entitlements.active_entitlement\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"EntitlementsResourceCustomerEntitlementList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all active entitlements\"\n      }\n    },\n    \"/v1/entitlements/active_entitlements/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve an active entitlement</p>\",\n        \"operationId\": \"GetEntitlementsActiveEntitlementsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The ID of the entitlement.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/entitlements.active_entitlement\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an active entitlement\"\n      }\n    },\n    \"/v1/entitlements/features\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a list of features</p>\",\n        \"operationId\": \"GetEntitlementsFeatures\",\n        \"parameters\": [\n          {\n            \"description\": \"If set, filter results to only include features with the given archive status.\",\n            \"in\": \"query\",\n            \"name\": \"archived\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If set, filter results to only include features with the given lookup_key.\",\n            \"in\": \"query\",\n            \"name\": \"lookup_key\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/entitlements.feature\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/entitlements/features\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"EntitlementsResourceFeatureList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all features\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a feature</p>\",\n        \"operationId\": \"PostEntitlementsFeatures\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"lookup_key\": {\n                    \"description\": \"A unique key you provide as your own system identifier. This may be up to 80 characters.\",\n                    \"maxLength\": 80,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"The feature's name, for your own purpose, not meant to be displayable to the customer.\",\n                    \"maxLength\": 80,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"lookup_key\", \"name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/entitlements.feature\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a feature\"\n      }\n    },\n    \"/v1/entitlements/features/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a feature</p>\",\n        \"operationId\": \"GetEntitlementsFeaturesId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The ID of the feature.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/entitlements.feature\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a feature\"\n      },\n      \"post\": {\n        \"description\": \"<p>Update a feature’s metadata or permanently deactivate it.</p>\",\n        \"operationId\": \"PostEntitlementsFeaturesId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Inactive features cannot be attached to new products and will not be returned from the features list endpoint.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.\"\n                  },\n                  \"name\": {\n                    \"description\": \"The feature's name, for your own purpose, not meant to be displayable to the customer.\",\n                    \"maxLength\": 80,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/entitlements.feature\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Updates a feature\"\n      }\n    },\n    \"/v1/ephemeral_keys\": {\n      \"post\": {\n        \"description\": \"<p>Creates a short-lived API key for a given resource.</p>\",\n        \"operationId\": \"PostEphemeralKeys\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"customer\": {\n                    \"description\": \"The ID of the Customer you'd like to modify using the resulting ephemeral key.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"issuing_card\": {\n                    \"description\": \"The ID of the Issuing Card you'd like to access using the resulting ephemeral key.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"nonce\": {\n                    \"description\": \"A single-use token, created by Stripe.js, used for creating ephemeral keys for Issuing Cards without exchanging sensitive information.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"verification_session\": {\n                    \"description\": \"The ID of the Identity VerificationSession you'd like to access using the resulting ephemeral key\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ephemeral_key\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an ephemeral key\"\n      }\n    },\n    \"/v1/ephemeral_keys/{key}\": {\n      \"delete\": {\n        \"description\": \"<p>Invalidates a short-lived API key for a given resource.</p>\",\n        \"operationId\": \"DeleteEphemeralKeysKey\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"key\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ephemeral_key\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Immediately invalidate an ephemeral key\"\n      }\n    },\n    \"/v1/events\": {\n      \"get\": {\n        \"description\": \"<p>List events, going back up to 30 days. Each event data is rendered according to Stripe API version at its creation time, specified in <a href=\\\"https://docs.stripe.com/api/events/object\\\">event object</a> <code>api_version</code> attribute (not according to your current Stripe API version or <code>Stripe-Version</code> header).</p>\",\n        \"operationId\": \"GetEvents\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return events that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Filter events by whether all webhooks were successfully delivered. If false, events which are still pending or have failed all delivery attempts to a webhook endpoint will be returned.\",\n            \"in\": \"query\",\n            \"name\": \"delivery_success\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A string containing a specific event name, or group of events using * as a wildcard. The list will be filtered to include only events with a matching event property.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"An array of up to 20 strings containing specific event names. The list will be filtered to include only events with a matching event property. You may pass either `type` or `types`, but not both.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"types\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/event\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/events\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"NotificationEventList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all events\"\n      }\n    },\n    \"/v1/events/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an event if it was created in the last 30 days. Supply the unique identifier of the event, which you might have received in a webhook.</p>\",\n        \"operationId\": \"GetEventsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/event\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an event\"\n      }\n    },\n    \"/v1/exchange_rates\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of objects that contain the rates at which foreign currencies are converted to one another. Only shows the currencies for which Stripe supports.</p>\",\n        \"operationId\": \"GetExchangeRates\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is the currency that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with the exchange rate for currency X your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and total number of supported payout currencies, and the default is the max.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is the currency that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with the exchange rate for currency X, your subsequent call can include `starting_after=X` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/exchange_rate\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/exchange_rates\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ExchangeRateList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all exchange rates\"\n      }\n    },\n    \"/v1/exchange_rates/{rate_id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the exchange rates from the given currency to every supported currency.</p>\",\n        \"operationId\": \"GetExchangeRatesRateId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"rate_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/exchange_rate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an exchange rate\"\n      }\n    },\n    \"/v1/file_links\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of file links.</p>\",\n        \"operationId\": \"GetFileLinks\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return links that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Filter links by their expiration status. By default, Stripe returns all links.\",\n            \"in\": \"query\",\n            \"name\": \"expired\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return links for the given file.\",\n            \"in\": \"query\",\n            \"name\": \"file\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/file_link\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/file_links\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"FileResourceFileLinkList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all file links\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new file link object.</p>\",\n        \"operationId\": \"PostFileLinks\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"The link isn't usable after this future timestamp.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"file\": {\n                    \"description\": \"The ID of the file. The file's `purpose` must be one of the following: `business_icon`, `business_logo`, `customer_signature`, `dispute_evidence`, `finance_report_run`, `financial_account_statement`, `identity_document_downloadable`, `issuing_regulatory_reporting`, `pci_document`, `selfie`, `sigma_scheduled_query`, `tax_document_user_upload`, or `terminal_reader_splashscreen`.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"required\": [\"file\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/file_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a file link\"\n      }\n    },\n    \"/v1/file_links/{link}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the file link with the given ID.</p>\",\n        \"operationId\": \"GetFileLinksLink\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"link\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/file_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a file link\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing file link object. Expired links can no longer be updated.</p>\",\n        \"operationId\": \"PostFileLinksLink\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"link\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expires_at\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A future timestamp after which the link will no longer be usable, or `now` to expire the link immediately.\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/file_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a file link\"\n      }\n    },\n    \"/v1/files\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of the files that your account has access to. Stripe sorts and returns the files by their creation dates, placing the most recently created files at the top.</p>\",\n        \"operationId\": \"GetFiles\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return files that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filter queries by the file purpose. If you don't provide a purpose, the queries return unfiltered files.\",\n            \"in\": \"query\",\n            \"name\": \"purpose\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"account_requirement\",\n                \"additional_verification\",\n                \"business_icon\",\n                \"business_logo\",\n                \"customer_signature\",\n                \"dispute_evidence\",\n                \"document_provider_identity_document\",\n                \"finance_report_run\",\n                \"financial_account_statement\",\n                \"identity_document\",\n                \"identity_document_downloadable\",\n                \"issuing_regulatory_reporting\",\n                \"pci_document\",\n                \"selfie\",\n                \"sigma_scheduled_query\",\n                \"tax_document_user_upload\",\n                \"terminal_reader_splashscreen\"\n              ],\n              \"maxLength\": 5000,\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/file\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/files\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"FileResourceFileList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all files\"\n      },\n      \"post\": {\n        \"description\": \"<p>To upload a file to Stripe, you need to send a request of type <code>multipart/form-data</code>. Include the file you want to upload in the request, and the parameters for creating a file.</p>\\n\\n<p>All of Stripe’s officially supported Client libraries support sending <code>multipart/form-data</code>.</p>\",\n        \"operationId\": \"PostFiles\",\n        \"requestBody\": {\n          \"content\": {\n            \"multipart/form-data\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"file_link_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"file\": {\n                    \"description\": \"A file to upload. Make sure that the specifications follow RFC 2388, which defines file transfers for the `multipart/form-data` protocol.\",\n                    \"format\": \"binary\",\n                    \"type\": \"string\"\n                  },\n                  \"file_link_data\": {\n                    \"description\": \"Optional parameters that automatically create a [file link](https://stripe.com/docs/api#file_links) for the newly created file.\",\n                    \"properties\": {\n                      \"create\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"expires_at\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\"create\"],\n                    \"title\": \"file_link_creation_params\",\n                    \"type\": \"object\"\n                  },\n                  \"purpose\": {\n                    \"description\": \"The [purpose](https://stripe.com/docs/file-upload#uploading-a-file) of the uploaded file.\",\n                    \"enum\": [\n                      \"account_requirement\",\n                      \"additional_verification\",\n                      \"business_icon\",\n                      \"business_logo\",\n                      \"customer_signature\",\n                      \"dispute_evidence\",\n                      \"identity_document\",\n                      \"issuing_regulatory_reporting\",\n                      \"pci_document\",\n                      \"tax_document_user_upload\",\n                      \"terminal_reader_splashscreen\"\n                    ],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"required\": [\"file\", \"purpose\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"servers\": [\n          {\n            \"url\": \"https://files.stripe.com/\"\n          }\n        ],\n        \"summary\": \"Create a file\"\n      }\n    },\n    \"/v1/files/{file}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing file object. After you supply a unique file ID, Stripe returns the corresponding file object. Learn how to <a href=\\\"/docs/file-upload#download-file-contents\\\">access file contents</a>.</p>\",\n        \"operationId\": \"GetFilesFile\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"file\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/file\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a file\"\n      }\n    },\n    \"/v1/financial_connections/accounts\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Financial Connections <code>Account</code> objects.</p>\",\n        \"operationId\": \"GetFinancialConnectionsAccounts\",\n        \"parameters\": [\n          {\n            \"description\": \"If present, only return accounts that belong to the specified account holder. `account_holder[customer]` and `account_holder[account]` are mutually exclusive.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"account_holder\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"account\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                \"customer\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                }\n              },\n              \"title\": \"accountholder_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If present, only return accounts that were collected as part of the given session.\",\n            \"in\": \"query\",\n            \"name\": \"session\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/financial_connections.account\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/financial_connections/accounts\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BankConnectionsResourceLinkedAccountList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List Accounts\"\n      }\n    },\n    \"/v1/financial_connections/accounts/{account}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an Financial Connections <code>Account</code>.</p>\",\n        \"operationId\": \"GetFinancialConnectionsAccountsAccount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an Account\"\n      }\n    },\n    \"/v1/financial_connections/accounts/{account}/disconnect\": {\n      \"post\": {\n        \"description\": \"<p>Disables your access to a Financial Connections <code>Account</code>. You will no longer be able to access data associated with the account (e.g. balances, transactions).</p>\",\n        \"operationId\": \"PostFinancialConnectionsAccountsAccountDisconnect\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Disconnect an Account\"\n      }\n    },\n    \"/v1/financial_connections/accounts/{account}/owners\": {\n      \"get\": {\n        \"description\": \"<p>Lists all owners for a given <code>Account</code></p>\",\n        \"operationId\": \"GetFinancialConnectionsAccountsAccountOwners\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The ID of the ownership object to fetch owners from.\",\n            \"in\": \"query\",\n            \"name\": \"ownership\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/financial_connections.account_owner\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BankConnectionsResourceOwnerList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List Account Owners\"\n      }\n    },\n    \"/v1/financial_connections/accounts/{account}/refresh\": {\n      \"post\": {\n        \"description\": \"<p>Refreshes the data associated with a Financial Connections <code>Account</code>.</p>\",\n        \"operationId\": \"PostFinancialConnectionsAccountsAccountRefresh\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"The list of account features that you would like to refresh.\",\n                    \"items\": {\n                      \"enum\": [\"balance\", \"ownership\", \"transactions\"],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"features\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Refresh Account data\"\n      }\n    },\n    \"/v1/financial_connections/accounts/{account}/subscribe\": {\n      \"post\": {\n        \"description\": \"<p>Subscribes to periodic refreshes of data associated with a Financial Connections <code>Account</code>.</p>\",\n        \"operationId\": \"PostFinancialConnectionsAccountsAccountSubscribe\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"The list of account features to which you would like to subscribe.\",\n                    \"items\": {\n                      \"enum\": [\"transactions\"],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"features\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Subscribe to data refreshes for an Account\"\n      }\n    },\n    \"/v1/financial_connections/accounts/{account}/unsubscribe\": {\n      \"post\": {\n        \"description\": \"<p>Unsubscribes from periodic refreshes of data associated with a Financial Connections <code>Account</code>.</p>\",\n        \"operationId\": \"PostFinancialConnectionsAccountsAccountUnsubscribe\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"The list of account features from which you would like to unsubscribe.\",\n                    \"items\": {\n                      \"enum\": [\"transactions\"],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"features\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Unsubscribe from data refreshes for an Account\"\n      }\n    },\n    \"/v1/financial_connections/sessions\": {\n      \"post\": {\n        \"description\": \"<p>To launch the Financial Connections authorization flow, create a <code>Session</code>. The session’s <code>client_secret</code> can be used to launch the flow using Stripe.js.</p>\",\n        \"operationId\": \"PostFinancialConnectionsSessions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"account_holder\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"filters\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"permissions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"prefetch\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_holder\": {\n                    \"description\": \"The account holder to link accounts for.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"account\", \"customer\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"accountholder_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"filters\": {\n                    \"description\": \"Filters to restrict the kinds of accounts to collect.\",\n                    \"properties\": {\n                      \"account_subcategories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"checking\",\n                            \"credit_card\",\n                            \"line_of_credit\",\n                            \"mortgage\",\n                            \"savings\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"filters_params\",\n                    \"type\": \"object\"\n                  },\n                  \"permissions\": {\n                    \"description\": \"List of data features that you would like to request access to.\\n\\nPossible values are `balances`, `transactions`, `ownership`, and `payment_method`.\",\n                    \"items\": {\n                      \"enum\": [\n                        \"balances\",\n                        \"ownership\",\n                        \"payment_method\",\n                        \"transactions\"\n                      ],\n                      \"maxLength\": 5000,\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"prefetch\": {\n                    \"description\": \"List of data features that you would like to retrieve upon account creation.\",\n                    \"items\": {\n                      \"enum\": [\"balances\", \"ownership\", \"transactions\"],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"For webview integrations only. Upon completing OAuth login in the native browser, the user will be redirected to this URL to return to your app.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"account_holder\", \"permissions\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Session\"\n      }\n    },\n    \"/v1/financial_connections/sessions/{session}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a Financial Connections <code>Session</code></p>\",\n        \"operationId\": \"GetFinancialConnectionsSessionsSession\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Session\"\n      }\n    },\n    \"/v1/financial_connections/transactions\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Financial Connections <code>Transaction</code> objects.</p>\",\n        \"operationId\": \"GetFinancialConnectionsTransactions\",\n        \"parameters\": [\n          {\n            \"description\": \"The ID of the Financial Connections Account whose transactions will be retrieved.\",\n            \"in\": \"query\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A filter on the list based on the object `transacted_at` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with the following options:\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"transacted_at\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A filter on the list based on the object `transaction_refresh` field. The value can be a dictionary with the following options:\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"transaction_refresh\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"after\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"after\"],\n              \"title\": \"transaction_refresh_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/financial_connections.transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/financial_connections/transactions\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BankConnectionsResourceTransactionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List Transactions\"\n      }\n    },\n    \"/v1/financial_connections/transactions/{transaction}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a Financial Connections <code>Transaction</code></p>\",\n        \"operationId\": \"GetFinancialConnectionsTransactionsTransaction\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Transaction\"\n      }\n    },\n    \"/v1/forwarding/requests\": {\n      \"get\": {\n        \"description\": \"<p>Lists all ForwardingRequest objects.</p>\",\n        \"operationId\": \"GetForwardingRequests\",\n        \"parameters\": [\n          {\n            \"description\": \"Similar to other List endpoints, filters results based on created timestamp. You can pass gt, gte, lt, and lte timestamp values.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"gt\": {\n                  \"type\": \"integer\"\n                },\n                \"gte\": {\n                  \"type\": \"integer\"\n                },\n                \"lt\": {\n                  \"type\": \"integer\"\n                },\n                \"lte\": {\n                  \"type\": \"integer\"\n                }\n              },\n              \"title\": \"created_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A pagination cursor to fetch the previous page of the list. The value must be a ForwardingRequest ID.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A pagination cursor to fetch the next page of the list. The value must be a ForwardingRequest ID.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"List of ForwardingRequest data.\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/forwarding.request\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ForwardingRequestList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all ForwardingRequests\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a ForwardingRequest object.</p>\",\n        \"operationId\": \"PostForwardingRequests\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"replacements\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"request\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"The PaymentMethod to insert into the forwarded request. Forwarding previously consumed PaymentMethods is allowed.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"replacements\": {\n                    \"description\": \"The field kinds to be replaced in the forwarded request.\",\n                    \"items\": {\n                      \"enum\": [\n                        \"card_cvc\",\n                        \"card_expiry\",\n                        \"card_number\",\n                        \"cardholder_name\",\n                        \"request_signature\"\n                      ],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"request\": {\n                    \"description\": \"The request body and headers to be sent to the destination endpoint.\",\n                    \"properties\": {\n                      \"body\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"headers\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"name\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"value\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"name\", \"value\"],\n                          \"title\": \"header_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"request_param\",\n                    \"type\": \"object\"\n                  },\n                  \"url\": {\n                    \"description\": \"The destination URL for the forwarded request. Must be supported by the config.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"payment_method\", \"replacements\", \"url\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/forwarding.request\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a ForwardingRequest\"\n      }\n    },\n    \"/v1/forwarding/requests/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a ForwardingRequest object.</p>\",\n        \"operationId\": \"GetForwardingRequestsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/forwarding.request\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a ForwardingRequest\"\n      }\n    },\n    \"/v1/identity/verification_reports\": {\n      \"get\": {\n        \"description\": \"<p>List all verification reports.</p>\",\n        \"operationId\": \"GetIdentityVerificationReports\",\n        \"parameters\": [\n          {\n            \"description\": \"A string to reference this user. This can be a customer ID, a session ID, or similar, and can be used to reconcile this verification with your internal systems.\",\n            \"in\": \"query\",\n            \"name\": \"client_reference_id\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return VerificationReports that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return VerificationReports of this type\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"document\", \"id_number\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return VerificationReports created by this VerificationSession ID. It is allowed to provide a VerificationIntent ID.\",\n            \"in\": \"query\",\n            \"name\": \"verification_session\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/identity.verification_report\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/identity/verification_reports\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"GelatoVerificationReportList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List VerificationReports\"\n      }\n    },\n    \"/v1/identity/verification_reports/{report}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an existing VerificationReport</p>\",\n        \"operationId\": \"GetIdentityVerificationReportsReport\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"report\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/identity.verification_report\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a VerificationReport\"\n      }\n    },\n    \"/v1/identity/verification_sessions\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of VerificationSessions</p>\",\n        \"operationId\": \"GetIdentityVerificationSessions\",\n        \"parameters\": [\n          {\n            \"description\": \"A string to reference this user. This can be a customer ID, a session ID, or similar, and can be used to reconcile this verification with your internal systems.\",\n            \"in\": \"query\",\n            \"name\": \"client_reference_id\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return VerificationSessions that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"related_customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return VerificationSessions with this status. [Learn more about the lifecycle of sessions](https://stripe.com/docs/identity/how-sessions-work).\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"canceled\", \"processing\", \"requires_input\", \"verified\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/identity.verification_session\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/identity/verification_sessions\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"GelatoVerificationSessionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List VerificationSessions\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a VerificationSession object.</p>\\n\\n<p>After the VerificationSession is created, display a verification modal using the session <code>client_secret</code> or send your users to the session’s <code>url</code>.</p>\\n\\n<p>If your API key is in test mode, verification checks won’t actually process, though everything else will occur as if in live mode.</p>\\n\\n<p>Related guide: <a href=\\\"/docs/identity/verify-identity-documents\\\">Verify your users’ identity documents</a></p>\",\n        \"operationId\": \"PostIdentityVerificationSessions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"provided_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"client_reference_id\": {\n                    \"description\": \"A string to reference this user. This can be a customer ID, a session ID, or similar, and can be used to reconcile this verification with your internal systems.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"options\": {\n                    \"description\": \"A set of options for the session’s verification checks.\",\n                    \"properties\": {\n                      \"document\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"allowed_types\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"driving_license\",\n                                    \"id_card\",\n                                    \"passport\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"require_id_number\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"require_live_capture\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"require_matching_selfie\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"document_options\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"session_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"provided_details\": {\n                    \"description\": \"Details provided about the user being verified. These details may be shown to the user.\",\n                    \"properties\": {\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"provided_details_param\",\n                    \"type\": \"object\"\n                  },\n                  \"related_customer\": {\n                    \"description\": \"Token referencing a Customer resource.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The URL that the user will be redirected to upon completing the verification flow.\",\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"description\": \"The type of [verification check](https://stripe.com/docs/identity/verification-checks) to be performed. You must provide a `type` if not passing `verification_flow`.\",\n                    \"enum\": [\"document\", \"id_number\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"verification_flow\": {\n                    \"description\": \"The ID of a verification flow from the Dashboard. See https://docs.stripe.com/identity/verification-flows.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/identity.verification_session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a VerificationSession\"\n      }\n    },\n    \"/v1/identity/verification_sessions/{session}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a VerificationSession that was previously created.</p>\\n\\n<p>When the session status is <code>requires_input</code>, you can use this method to retrieve a valid\\n<code>client_secret</code> or <code>url</code> to allow re-submission.</p>\",\n        \"operationId\": \"GetIdentityVerificationSessionsSession\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/identity.verification_session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a VerificationSession\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a VerificationSession object.</p>\\n\\n<p>When the session status is <code>requires_input</code>, you can use this method to update the\\nverification check and options.</p>\",\n        \"operationId\": \"PostIdentityVerificationSessionsSession\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"provided_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"options\": {\n                    \"description\": \"A set of options for the session’s verification checks.\",\n                    \"properties\": {\n                      \"document\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"allowed_types\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"driving_license\",\n                                    \"id_card\",\n                                    \"passport\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"require_id_number\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"require_live_capture\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"require_matching_selfie\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"document_options\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"session_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"provided_details\": {\n                    \"description\": \"Details provided about the user being verified. These details may be shown to the user.\",\n                    \"properties\": {\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"provided_details_param\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": {\n                    \"description\": \"The type of [verification check](https://stripe.com/docs/identity/verification-checks) to be performed.\",\n                    \"enum\": [\"document\", \"id_number\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/identity.verification_session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a VerificationSession\"\n      }\n    },\n    \"/v1/identity/verification_sessions/{session}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>A VerificationSession object can be canceled when it is in <code>requires_input</code> <a href=\\\"/docs/identity/how-sessions-work\\\">status</a>.</p>\\n\\n<p>Once canceled, future submission attempts are disabled. This cannot be undone. <a href=\\\"/docs/identity/verification-sessions#cancel\\\">Learn more</a>.</p>\",\n        \"operationId\": \"PostIdentityVerificationSessionsSessionCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/identity.verification_session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a VerificationSession\"\n      }\n    },\n    \"/v1/identity/verification_sessions/{session}/redact\": {\n      \"post\": {\n        \"description\": \"<p>Redact a VerificationSession to remove all collected information from Stripe. This will redact\\nthe VerificationSession and all objects related to it, including VerificationReports, Events,\\nrequest logs, etc.</p>\\n\\n<p>A VerificationSession object can be redacted when it is in <code>requires_input</code> or <code>verified</code>\\n<a href=\\\"/docs/identity/how-sessions-work\\\">status</a>. Redacting a VerificationSession in <code>requires_action</code>\\nstate will automatically cancel it.</p>\\n\\n<p>The redaction process may take up to four days. When the redaction process is in progress, the\\nVerificationSession’s <code>redaction.status</code> field will be set to <code>processing</code>; when the process is\\nfinished, it will change to <code>redacted</code> and an <code>identity.verification_session.redacted</code> event\\nwill be emitted.</p>\\n\\n<p>Redaction is irreversible. Redacted objects are still accessible in the Stripe API, but all the\\nfields that contain personal data will be replaced by the string <code>[redacted]</code> or a similar\\nplaceholder. The <code>metadata</code> field will also be erased. Redacted objects cannot be updated or\\nused for any purpose.</p>\\n\\n<p><a href=\\\"/docs/identity/verification-sessions#redact\\\">Learn more</a>.</p>\",\n        \"operationId\": \"PostIdentityVerificationSessionsSessionRedact\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/identity.verification_session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Redact a VerificationSession\"\n      }\n    },\n    \"/v1/invoice_rendering_templates\": {\n      \"get\": {\n        \"description\": \"<p>List all templates, ordered by creation date, with the most recently created template appearing first.</p>\",\n        \"operationId\": \"GetInvoiceRenderingTemplates\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"archived\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/invoice_rendering_template\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"InvoiceRenderingTemplatesList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all invoice rendering templates\"\n      }\n    },\n    \"/v1/invoice_rendering_templates/{template}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an invoice rendering template with the given ID. It by default returns the latest version of the template. Optionally, specify a version to see previous versions.</p>\",\n        \"operationId\": \"GetInvoiceRenderingTemplatesTemplate\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"template\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"version\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice_rendering_template\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an invoice rendering template\"\n      }\n    },\n    \"/v1/invoice_rendering_templates/{template}/archive\": {\n      \"post\": {\n        \"description\": \"<p>Updates the status of an invoice rendering template to ‘archived’ so no new Stripe objects (customers, invoices, etc.) can reference it. The template can also no longer be updated. However, if the template is already set on a Stripe object, it will continue to be applied on invoices generated by it.</p>\",\n        \"operationId\": \"PostInvoiceRenderingTemplatesTemplateArchive\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"template\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice_rendering_template\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Archive an invoice rendering template\"\n      }\n    },\n    \"/v1/invoice_rendering_templates/{template}/unarchive\": {\n      \"post\": {\n        \"description\": \"<p>Unarchive an invoice rendering template so it can be used on new Stripe objects again.</p>\",\n        \"operationId\": \"PostInvoiceRenderingTemplatesTemplateUnarchive\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"template\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice_rendering_template\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Unarchive an invoice rendering template\"\n      }\n    },\n    \"/v1/invoiceitems\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your invoice items. Invoice items are returned sorted by creation date, with the most recently created invoice items appearing first.</p>\",\n        \"operationId\": \"GetInvoiceitems\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return invoice items that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The identifier of the customer whose invoice items to return. If none is provided, all invoice items will be returned.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return invoice items belonging to this invoice. If none is provided, all invoice items will be returned. If specifying an invoice, no customer identifier is needed.\",\n            \"in\": \"query\",\n            \"name\": \"invoice\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Set to `true` to only show pending invoice items, which are not yet attached to any invoices. Set to `false` to only show invoice items already attached to invoices. If unspecified, no filter is applied.\",\n            \"in\": \"query\",\n            \"name\": \"pending\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/invoiceitem\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/invoiceitems\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"InvoicesItemsList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all invoice items\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates an item to be added to a draft invoice (up to 250 items per invoice). If no invoice is specified, the item will be on the next invoice created for the customer specified.</p>\",\n        \"operationId\": \"PostInvoiceitems\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"period\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"price_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_code\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The integer amount in cents (or local equivalent) of the charge to be applied to the upcoming invoice. Passing in a negative `amount` will reduce the `amount_due` on the invoice.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The ID of the customer who will be billed when this invoice item is billed.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string which you can attach to the invoice item. The description is displayed in the invoice for easy tracking.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"discountable\": {\n                    \"description\": \"Controls whether discounts apply to this invoice item. Defaults to false for prorations or negative invoice items, and true for all other invoice items.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons and promotion codes to redeem into discounts for the invoice item or invoice line item.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice\": {\n                    \"description\": \"The ID of an existing invoice to add this invoice item to. When left blank, the invoice item will be added to the next upcoming scheduled invoice. This is useful when adding invoice items in response to an invoice.created webhook. You can only add invoice items to draft invoices and there is a maximum of 250 items per invoice.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"period\": {\n                    \"description\": \"The period associated with this invoice item. When set to different values, the period will be rendered on the invoice. If you have [Stripe Revenue Recognition](https://stripe.com/docs/revenue-recognition) enabled, the period will be used to recognize and defer revenue. See the [Revenue Recognition documentation](https://stripe.com/docs/revenue-recognition/methodology/subscriptions-and-invoicing) for details.\",\n                    \"properties\": {\n                      \"end\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"start\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"end\", \"start\"],\n                    \"title\": \"period\",\n                    \"type\": \"object\"\n                  },\n                  \"price\": {\n                    \"description\": \"The ID of the price object. One of `price` or `price_data` is required.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"description\": \"Data used to generate a new [Price](https://stripe.com/docs/api/prices) object inline. One of `price` or `price_data` is required.\",\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\"],\n                    \"title\": \"one_time_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"quantity\": {\n                    \"description\": \"Non-negative integer. The quantity of units for the invoice item.\",\n                    \"type\": \"integer\"\n                  },\n                  \"subscription\": {\n                    \"description\": \"The ID of a subscription to add this invoice item to. When left blank, the invoice item is added to the next upcoming scheduled invoice. When set, scheduled invoices for subscriptions other than the specified subscription will ignore the invoice item. Use this when you want to express that an invoice item has been accrued within the context of a particular subscription.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"tax_behavior\": {\n                    \"description\": \"Only required if a [default tax behavior](https://stripe.com/docs/tax/products-prices-tax-categories-tax-behavior#setting-a-default-tax-behavior-(recommended)) was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`. Once specified as either `inclusive` or `exclusive`, it cannot be changed.\",\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"tax_code\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A [tax code](https://stripe.com/docs/tax/tax-categories) ID.\"\n                  },\n                  \"tax_rates\": {\n                    \"description\": \"The tax rates which apply to the invoice item. When set, the `default_tax_rates` on the invoice do not apply to this invoice item.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"unit_amount\": {\n                    \"description\": \"The integer unit amount in cents (or local equivalent) of the charge to be applied to the upcoming invoice. This `unit_amount` will be multiplied by the quantity to get the full amount. Passing in a negative `unit_amount` will reduce the `amount_due` on the invoice.\",\n                    \"type\": \"integer\"\n                  },\n                  \"unit_amount_decimal\": {\n                    \"description\": \"Same as `unit_amount`, but accepts a decimal value in cents (or local equivalent) with at most 12 decimal places. Only one of `unit_amount` and `unit_amount_decimal` can be set.\",\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"customer\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoiceitem\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an invoice item\"\n      }\n    },\n    \"/v1/invoiceitems/{invoiceitem}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes an invoice item, removing it from an invoice. Deleting invoice items is only possible when they’re not attached to invoices, or if it’s attached to a draft invoice.</p>\",\n        \"operationId\": \"DeleteInvoiceitemsInvoiceitem\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoiceitem\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_invoiceitem\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete an invoice item\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the invoice item with the given ID.</p>\",\n        \"operationId\": \"GetInvoiceitemsInvoiceitem\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"invoiceitem\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoiceitem\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an invoice item\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the amount or description of an invoice item on an upcoming invoice. Updating an invoice item is only possible before the invoice it’s attached to is closed.</p>\",\n        \"operationId\": \"PostInvoiceitemsInvoiceitem\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoiceitem\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"period\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"price_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_code\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The integer amount in cents (or local equivalent) of the charge to be applied to the upcoming invoice. If you want to apply a credit to the customer's account, pass a negative amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string which you can attach to the invoice item. The description is displayed in the invoice for easy tracking.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"discountable\": {\n                    \"description\": \"Controls whether discounts apply to this invoice item. Defaults to false for prorations or negative invoice items, and true for all other invoice items. Cannot be set to true for prorations.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons, promotion codes & existing discounts which apply to the invoice item or invoice line item. Item discounts are applied before invoice discounts. Pass an empty string to remove previously-defined discounts.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"period\": {\n                    \"description\": \"The period associated with this invoice item. When set to different values, the period will be rendered on the invoice. If you have [Stripe Revenue Recognition](https://stripe.com/docs/revenue-recognition) enabled, the period will be used to recognize and defer revenue. See the [Revenue Recognition documentation](https://stripe.com/docs/revenue-recognition/methodology/subscriptions-and-invoicing) for details.\",\n                    \"properties\": {\n                      \"end\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"start\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"end\", \"start\"],\n                    \"title\": \"period\",\n                    \"type\": \"object\"\n                  },\n                  \"price\": {\n                    \"description\": \"The ID of the price object. One of `price` or `price_data` is required.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"description\": \"Data used to generate a new [Price](https://stripe.com/docs/api/prices) object inline. One of `price` or `price_data` is required.\",\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\"],\n                    \"title\": \"one_time_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"quantity\": {\n                    \"description\": \"Non-negative integer. The quantity of units for the invoice item.\",\n                    \"type\": \"integer\"\n                  },\n                  \"tax_behavior\": {\n                    \"description\": \"Only required if a [default tax behavior](https://stripe.com/docs/tax/products-prices-tax-categories-tax-behavior#setting-a-default-tax-behavior-(recommended)) was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`. Once specified as either `inclusive` or `exclusive`, it cannot be changed.\",\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"tax_code\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A [tax code](https://stripe.com/docs/tax/tax-categories) ID.\"\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates which apply to the invoice item. When set, the `default_tax_rates` on the invoice do not apply to this invoice item. Pass an empty string to remove previously-defined tax rates.\"\n                  },\n                  \"unit_amount\": {\n                    \"description\": \"The integer unit amount in cents (or local equivalent) of the charge to be applied to the upcoming invoice. This unit_amount will be multiplied by the quantity to get the full amount. If you want to apply a credit to the customer's account, pass a negative unit_amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"unit_amount_decimal\": {\n                    \"description\": \"Same as `unit_amount`, but accepts a decimal value in cents (or local equivalent) with at most 12 decimal places. Only one of `unit_amount` and `unit_amount_decimal` can be set.\",\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoiceitem\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an invoice item\"\n      }\n    },\n    \"/v1/invoices\": {\n      \"get\": {\n        \"description\": \"<p>You can list all invoices, or list the invoices for a specific customer. The invoices are returned sorted by creation date, with the most recently created invoices appearing first.</p>\",\n        \"operationId\": \"GetInvoices\",\n        \"parameters\": [\n          {\n            \"description\": \"The collection method of the invoice to retrieve. Either `charge_automatically` or `send_invoice`.\",\n            \"in\": \"query\",\n            \"name\": \"collection_method\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"charge_automatically\", \"send_invoice\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return invoices that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return invoices for the customer specified by this customer ID.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"due_date\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The status of the invoice, one of `draft`, `open`, `paid`, `uncollectible`, or `void`. [Learn more](https://stripe.com/docs/billing/invoices/workflow#workflow-overview)\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"draft\", \"open\", \"paid\", \"uncollectible\", \"void\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return invoices for the subscription specified by this subscription ID.\",\n            \"in\": \"query\",\n            \"name\": \"subscription\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/invoice\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/invoices\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"InvoicesResourceList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all invoices\"\n      },\n      \"post\": {\n        \"description\": \"<p>This endpoint creates a draft invoice for a given customer. The invoice remains a draft until you <a href=\\\"#finalize_invoice\\\">finalize</a> the invoice, which allows you to <a href=\\\"#pay_invoice\\\">pay</a> or <a href=\\\"#send_invoice\\\">send</a> the invoice to your customers.</p>\",\n        \"operationId\": \"PostInvoices\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"account_tax_ids\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_fields\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"from_invoice\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"issuer\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"rendering\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_cost\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_tax_ids\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account tax IDs associated with the invoice. Only editable when the invoice is a draft.\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"A fee in cents (or local equivalent) that will be applied to the invoice and transferred to the application owner's Stripe account. The request must be made with an OAuth key or the Stripe-Account header in order to take an application fee. For more information, see the application fees [documentation](https://stripe.com/docs/billing/invoices/connect#collecting-fees).\",\n                    \"type\": \"integer\"\n                  },\n                  \"auto_advance\": {\n                    \"description\": \"Controls whether Stripe performs [automatic collection](https://stripe.com/docs/invoicing/integration/automatic-advancement-collection) of the invoice. If `false`, the invoice's state doesn't automatically advance without an explicit action.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Settings for automatic tax lookup for this invoice.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_param\",\n                    \"type\": \"object\"\n                  },\n                  \"automatically_finalizes_at\": {\n                    \"description\": \"The time when this invoice should be scheduled to finalize. The invoice will be finalized at this time if it is still in draft state.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this invoice using the default source attached to the customer. When sending an invoice, Stripe will email this invoice to the customer with payment instructions. Defaults to `charge_automatically`.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"The currency to create this invoice in. Defaults to that of `customer` if not specified.\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"custom_fields\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"name\": {\n                              \"maxLength\": 40,\n                              \"type\": \"string\"\n                            },\n                            \"value\": {\n                              \"maxLength\": 140,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"name\", \"value\"],\n                          \"title\": \"custom_field_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of up to 4 custom fields to be displayed on the invoice.\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The ID of the customer who will be billed.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"days_until_due\": {\n                    \"description\": \"The number of days from when the invoice is created until it is due. Valid only for invoices where `collection_method=send_invoice`.\",\n                    \"type\": \"integer\"\n                  },\n                  \"default_payment_method\": {\n                    \"description\": \"ID of the default payment method for the invoice. It must belong to the customer associated with the invoice. If not set, defaults to the subscription's default payment method, if any, or to the default payment method in the customer's invoice settings.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_source\": {\n                    \"description\": \"ID of the default payment source for the invoice. It must belong to the customer associated with the invoice and be in a chargeable state. If not set, defaults to the subscription's default source, if any, or to the customer's default source.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_tax_rates\": {\n                    \"description\": \"The tax rates that will apply to any line item that does not have `tax_rates` set.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users. Referenced as 'memo' in the Dashboard.\",\n                    \"maxLength\": 1500,\n                    \"type\": \"string\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons and promotion codes to redeem into discounts for the invoice. If not specified, inherits the discount from the invoice's customer. Pass an empty string to avoid inheriting any discounts.\"\n                  },\n                  \"due_date\": {\n                    \"description\": \"The date on which payment for this invoice is due. Valid only for invoices where `collection_method=send_invoice`.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"effective_at\": {\n                    \"description\": \"The date when this invoice is in effect. Same as `finalized_at` unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the invoice PDF and receipt.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"footer\": {\n                    \"description\": \"Footer to be displayed on the invoice.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"from_invoice\": {\n                    \"description\": \"Revise an existing invoice. The new invoice will be created in `status=draft`. See the [revision documentation](https://stripe.com/docs/invoicing/invoice-revisions) for more details.\",\n                    \"properties\": {\n                      \"action\": {\n                        \"enum\": [\"revision\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"invoice\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"action\", \"invoice\"],\n                    \"title\": \"from_invoice\",\n                    \"type\": \"object\"\n                  },\n                  \"issuer\": {\n                    \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"account\", \"self\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"number\": {\n                    \"description\": \"Set the number for this invoice. If no number is present then a number will be assigned automatically when the invoice is finalized. In many markets, regulations require invoices to be unique, sequential and / or gapless. You are responsible for ensuring this is true across all your different invoicing systems in the event that you edit the invoice number using our API. If you use only Stripe for your invoices and do not change invoice numbers, Stripe handles this aspect of compliance for you automatically.\",\n                    \"maxLength\": 26,\n                    \"type\": \"string\"\n                  },\n                  \"on_behalf_of\": {\n                    \"description\": \"The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the [Invoices with Connect](https://stripe.com/docs/billing/invoices/connect) documentation for details.\",\n                    \"type\": \"string\"\n                  },\n                  \"payment_settings\": {\n                    \"description\": \"Configuration settings for the PaymentIntent that is generated when the invoice is finalized.\",\n                    \"properties\": {\n                      \"default_mandate\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"payment_method_options\": {\n                        \"properties\": {\n                          \"acss_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"transaction_type\": {\n                                        \"enum\": [\"business\", \"personal\"],\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"bancontact\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"preferred_language\": {\n                                    \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"card\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"installments\": {\n                                    \"properties\": {\n                                      \"enabled\": {\n                                        \"type\": \"boolean\"\n                                      },\n                                      \"plan\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"properties\": {\n                                              \"count\": {\n                                                \"type\": \"integer\"\n                                              },\n                                              \"interval\": {\n                                                \"enum\": [\"month\"],\n                                                \"type\": \"string\"\n                                              },\n                                              \"type\": {\n                                                \"enum\": [\"fixed_count\"],\n                                                \"type\": \"string\",\n                                                \"x-stripeBypassValidation\": true\n                                              }\n                                            },\n                                            \"required\": [\"type\"],\n                                            \"title\": \"installment_plan\",\n                                            \"type\": \"object\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      }\n                                    },\n                                    \"title\": \"installments_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"request_three_d_secure\": {\n                                    \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"customer_balance\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"bank_transfer\": {\n                                    \"properties\": {\n                                      \"eu_bank_transfer\": {\n                                        \"properties\": {\n                                          \"country\": {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          }\n                                        },\n                                        \"required\": [\"country\"],\n                                        \"title\": \"eu_bank_transfer_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"type\": {\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"bank_transfer_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"funding_type\": {\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"konbini\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"sepa_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"us_bank_account\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"financial_connections\": {\n                                    \"properties\": {\n                                      \"filters\": {\n                                        \"properties\": {\n                                          \"account_subcategories\": {\n                                            \"items\": {\n                                              \"enum\": [\"checking\", \"savings\"],\n                                              \"type\": \"string\"\n                                            },\n                                            \"type\": \"array\"\n                                          }\n                                        },\n                                        \"title\": \"invoice_linked_account_options_filters_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"permissions\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"payment_method\",\n                                            \"transactions\"\n                                          ],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"prefetch\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"transactions\"\n                                          ],\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"invoice_linked_account_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"payment_method_options\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_types\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"enum\": [\n                                \"ach_credit_transfer\",\n                                \"ach_debit\",\n                                \"acss_debit\",\n                                \"amazon_pay\",\n                                \"au_becs_debit\",\n                                \"bacs_debit\",\n                                \"bancontact\",\n                                \"boleto\",\n                                \"card\",\n                                \"cashapp\",\n                                \"customer_balance\",\n                                \"eps\",\n                                \"fpx\",\n                                \"giropay\",\n                                \"grabpay\",\n                                \"ideal\",\n                                \"jp_credit_transfer\",\n                                \"kakao_pay\",\n                                \"konbini\",\n                                \"kr_card\",\n                                \"link\",\n                                \"multibanco\",\n                                \"naver_pay\",\n                                \"p24\",\n                                \"payco\",\n                                \"paynow\",\n                                \"paypal\",\n                                \"promptpay\",\n                                \"revolut_pay\",\n                                \"sepa_credit_transfer\",\n                                \"sepa_debit\",\n                                \"sofort\",\n                                \"swish\",\n                                \"us_bank_account\",\n                                \"wechat_pay\"\n                              ],\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_settings\",\n                    \"type\": \"object\"\n                  },\n                  \"pending_invoice_items_behavior\": {\n                    \"description\": \"How to handle pending invoice items on invoice creation. Defaults to `exclude` if the parameter is omitted.\",\n                    \"enum\": [\"exclude\", \"include\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"rendering\": {\n                    \"description\": \"The rendering-related settings that control how the invoice is displayed on customer-facing surfaces such as PDF and Hosted Invoice Page.\",\n                    \"properties\": {\n                      \"amount_tax_display\": {\n                        \"enum\": [\"\", \"exclude_tax\", \"include_inclusive_tax\"],\n                        \"type\": \"string\"\n                      },\n                      \"pdf\": {\n                        \"properties\": {\n                          \"page_size\": {\n                            \"enum\": [\"a4\", \"auto\", \"letter\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"rendering_pdf_param\",\n                        \"type\": \"object\"\n                      },\n                      \"template\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"template_version\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"rendering_param\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_cost\": {\n                    \"description\": \"Settings for the cost of shipping for this invoice.\",\n                    \"properties\": {\n                      \"shipping_rate\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"shipping_rate_data\": {\n                        \"properties\": {\n                          \"delivery_estimate\": {\n                            \"properties\": {\n                              \"maximum\": {\n                                \"properties\": {\n                                  \"unit\": {\n                                    \"enum\": [\n                                      \"business_day\",\n                                      \"day\",\n                                      \"hour\",\n                                      \"month\",\n                                      \"week\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"value\": {\n                                    \"type\": \"integer\"\n                                  }\n                                },\n                                \"required\": [\"unit\", \"value\"],\n                                \"title\": \"delivery_estimate_bound\",\n                                \"type\": \"object\"\n                              },\n                              \"minimum\": {\n                                \"properties\": {\n                                  \"unit\": {\n                                    \"enum\": [\n                                      \"business_day\",\n                                      \"day\",\n                                      \"hour\",\n                                      \"month\",\n                                      \"week\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"value\": {\n                                    \"type\": \"integer\"\n                                  }\n                                },\n                                \"required\": [\"unit\", \"value\"],\n                                \"title\": \"delivery_estimate_bound\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"delivery_estimate\",\n                            \"type\": \"object\"\n                          },\n                          \"display_name\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"fixed_amount\": {\n                            \"properties\": {\n                              \"amount\": {\n                                \"type\": \"integer\"\n                              },\n                              \"currency\": {\n                                \"format\": \"currency\",\n                                \"type\": \"string\"\n                              },\n                              \"currency_options\": {\n                                \"additionalProperties\": {\n                                  \"properties\": {\n                                    \"amount\": {\n                                      \"type\": \"integer\"\n                                    },\n                                    \"tax_behavior\": {\n                                      \"enum\": [\n                                        \"exclusive\",\n                                        \"inclusive\",\n                                        \"unspecified\"\n                                      ],\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"amount\"],\n                                  \"title\": \"currency_option\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"required\": [\"amount\", \"currency\"],\n                            \"title\": \"fixed_amount\",\n                            \"type\": \"object\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"tax_behavior\": {\n                            \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                            \"type\": \"string\"\n                          },\n                          \"tax_code\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"fixed_amount\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"display_name\"],\n                        \"title\": \"method_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"shipping_cost\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_details\": {\n                    \"description\": \"Shipping details for the invoice. The Invoice PDF will use the `shipping_details` value if it is set, otherwise the PDF will render the shipping address from the customer.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"optional_fields_address\",\n                        \"type\": \"object\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\"address\", \"name\"],\n                    \"title\": \"recipient_shipping_with_optional_fields_address\",\n                    \"type\": \"object\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Extra information about a charge for the customer's credit card statement. It must contain at least one letter. If not specified and this invoice is part of a subscription, the default `statement_descriptor` will be set to the first subscription item's product's `statement_descriptor`.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"subscription\": {\n                    \"description\": \"The ID of the subscription to invoice, if any. If set, the created invoice will only include pending invoice items for that subscription. The subscription's billing cycle and regular subscription events won't be affected.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"If specified, the funds from the invoice will be transferred to the destination and the ID of the resulting transfer will be found on the invoice's charge.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"destination\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"destination\"],\n                    \"title\": \"transfer_data_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an invoice\"\n      }\n    },\n    \"/v1/invoices/create_preview\": {\n      \"post\": {\n        \"description\": \"<p>At any time, you can preview the upcoming invoice for a customer. This will show you all the charges that are pending, including subscription renewal charges, invoice item charges, etc. It will also show you any discounts that are applicable to the invoice.</p>\\n\\n<p>Note that when you are viewing an upcoming invoice, you are simply viewing a preview – the invoice has not yet been created. As such, the upcoming invoice will not show up in invoice listing calls, and you cannot use the API to pay or edit the invoice. If you want to change the amount that your customer will be billed, you can add, remove, or update pending invoice items, or update the customer’s discount.</p>\\n\\n<p>You can preview the effects of updating a subscription, including a preview of what proration will take place. To ensure that the actual proration is calculated exactly the same as the previewed proration, you should pass the <code>subscription_details.proration_date</code> parameter when doing the actual subscription update. The recommended way to get only the prorations being previewed is to consider only proration line items where <code>period[start]</code> is equal to the <code>subscription_details.proration_date</code> value passed in the request. </p>\\n\\n<p>Note: Currency conversion calculations use the latest exchange rates. Exchange rates may vary between the time of the preview and the time of the actual invoice creation. <a href=\\\"https://docs.stripe.com/currencies/conversions\\\">Learn more</a></p>\",\n        \"operationId\": \"PostInvoicesCreatePreview\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"customer_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"issuer\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"on_behalf_of\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"schedule_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"subscription_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"automatic_tax\": {\n                    \"description\": \"Settings for automatic tax lookup for this invoice preview.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_param\",\n                    \"type\": \"object\"\n                  },\n                  \"coupon\": {\n                    \"description\": \"The ID of the coupon to apply to this phase of the subscription schedule. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"The currency to preview this invoice in. Defaults to that of `customer` if not specified.\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The identifier of the customer whose upcoming invoice you'd like to retrieve. If `automatic_tax` is enabled then one of `customer`, `customer_details`, `subscription`, or `schedule` must be set.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"customer_details\": {\n                    \"description\": \"Details about the customer you want to invoice or overrides for an existing customer. If `automatic_tax` is enabled then one of `customer`, `customer_details`, `subscription`, or `schedule` must be set.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"optional_fields_address\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"shipping\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"address\": {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"optional_fields_customer_address\",\n                                \"type\": \"object\"\n                              },\n                              \"name\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"phone\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"address\", \"name\"],\n                            \"title\": \"customer_shipping\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"tax\": {\n                        \"properties\": {\n                          \"ip_address\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"tax_param\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_exempt\": {\n                        \"enum\": [\"\", \"exempt\", \"none\", \"reverse\"],\n                        \"type\": \"string\"\n                      },\n                      \"tax_ids\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"type\": {\n                              \"enum\": [\n                                \"ad_nrt\",\n                                \"ae_trn\",\n                                \"al_tin\",\n                                \"am_tin\",\n                                \"ao_tin\",\n                                \"ar_cuit\",\n                                \"au_abn\",\n                                \"au_arn\",\n                                \"ba_tin\",\n                                \"bb_tin\",\n                                \"bg_uic\",\n                                \"bh_vat\",\n                                \"bo_tin\",\n                                \"br_cnpj\",\n                                \"br_cpf\",\n                                \"bs_tin\",\n                                \"by_tin\",\n                                \"ca_bn\",\n                                \"ca_gst_hst\",\n                                \"ca_pst_bc\",\n                                \"ca_pst_mb\",\n                                \"ca_pst_sk\",\n                                \"ca_qst\",\n                                \"cd_nif\",\n                                \"ch_uid\",\n                                \"ch_vat\",\n                                \"cl_tin\",\n                                \"cn_tin\",\n                                \"co_nit\",\n                                \"cr_tin\",\n                                \"de_stn\",\n                                \"do_rcn\",\n                                \"ec_ruc\",\n                                \"eg_tin\",\n                                \"es_cif\",\n                                \"eu_oss_vat\",\n                                \"eu_vat\",\n                                \"gb_vat\",\n                                \"ge_vat\",\n                                \"gn_nif\",\n                                \"hk_br\",\n                                \"hr_oib\",\n                                \"hu_tin\",\n                                \"id_npwp\",\n                                \"il_vat\",\n                                \"in_gst\",\n                                \"is_vat\",\n                                \"jp_cn\",\n                                \"jp_rn\",\n                                \"jp_trn\",\n                                \"ke_pin\",\n                                \"kh_tin\",\n                                \"kr_brn\",\n                                \"kz_bin\",\n                                \"li_uid\",\n                                \"li_vat\",\n                                \"ma_vat\",\n                                \"md_vat\",\n                                \"me_pib\",\n                                \"mk_vat\",\n                                \"mr_nif\",\n                                \"mx_rfc\",\n                                \"my_frp\",\n                                \"my_itn\",\n                                \"my_sst\",\n                                \"ng_tin\",\n                                \"no_vat\",\n                                \"no_voec\",\n                                \"np_pan\",\n                                \"nz_gst\",\n                                \"om_vat\",\n                                \"pe_ruc\",\n                                \"ph_tin\",\n                                \"ro_tin\",\n                                \"rs_pib\",\n                                \"ru_inn\",\n                                \"ru_kpp\",\n                                \"sa_vat\",\n                                \"sg_gst\",\n                                \"sg_uen\",\n                                \"si_tin\",\n                                \"sn_ninea\",\n                                \"sr_fin\",\n                                \"sv_nit\",\n                                \"th_vat\",\n                                \"tj_tin\",\n                                \"tr_tin\",\n                                \"tw_vat\",\n                                \"tz_vat\",\n                                \"ua_vat\",\n                                \"ug_tin\",\n                                \"us_ein\",\n                                \"uy_ruc\",\n                                \"uz_tin\",\n                                \"uz_vat\",\n                                \"ve_rif\",\n                                \"vn_tin\",\n                                \"za_vat\",\n                                \"zm_tin\",\n                                \"zw_tin\"\n                              ],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"value\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"type\", \"value\"],\n                          \"title\": \"data_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"customer_details_param\",\n                    \"type\": \"object\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons to redeem into discounts for the invoice preview. If not specified, inherits the discount from the subscription or customer. This works for both coupons directly applied to an invoice and coupons applied to a subscription. Pass an empty string to avoid inheriting any discounts.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_items\": {\n                    \"description\": \"List of invoice items to add or update in the upcoming invoice preview (up to 250).\",\n                    \"items\": {\n                      \"properties\": {\n                        \"amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"currency\": {\n                          \"format\": \"currency\",\n                          \"type\": \"string\"\n                        },\n                        \"description\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"discountable\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"invoiceitem\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"metadata\": {\n                          \"anyOf\": [\n                            {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"period\": {\n                          \"properties\": {\n                            \"end\": {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            },\n                            \"start\": {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"end\", \"start\"],\n                          \"title\": \"period\",\n                          \"type\": \"object\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\"],\n                          \"title\": \"one_time_price_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_behavior\": {\n                          \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                          \"type\": \"string\"\n                        },\n                        \"tax_code\": {\n                          \"anyOf\": [\n                            {\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"unit_amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"unit_amount_decimal\": {\n                          \"format\": \"decimal\",\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"title\": \"invoice_item_preview_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"issuer\": {\n                    \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"account\", \"self\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"on_behalf_of\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the [Invoices with Connect](https://stripe.com/docs/billing/invoices/connect) documentation for details.\"\n                  },\n                  \"preview_mode\": {\n                    \"description\": \"Customizes the types of values to include when calculating the invoice. Defaults to `next` if unspecified.\",\n                    \"enum\": [\"next\", \"recurring\"],\n                    \"type\": \"string\"\n                  },\n                  \"schedule\": {\n                    \"description\": \"The identifier of the schedule whose upcoming invoice you'd like to retrieve. Cannot be used with subscription or subscription fields.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"schedule_details\": {\n                    \"description\": \"The schedule creation or modification params to apply as a preview. Cannot be used with `subscription` or `subscription_` prefixed fields.\",\n                    \"properties\": {\n                      \"end_behavior\": {\n                        \"enum\": [\"cancel\", \"release\"],\n                        \"type\": \"string\"\n                      },\n                      \"phases\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"add_invoice_items\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"discounts\": {\n                                    \"items\": {\n                                      \"properties\": {\n                                        \"coupon\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"discount\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"promotion_code\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        }\n                                      },\n                                      \"title\": \"discounts_data_param\",\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"price\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"price_data\": {\n                                    \"properties\": {\n                                      \"currency\": {\n                                        \"format\": \"currency\",\n                                        \"type\": \"string\"\n                                      },\n                                      \"product\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"tax_behavior\": {\n                                        \"enum\": [\n                                          \"exclusive\",\n                                          \"inclusive\",\n                                          \"unspecified\"\n                                        ],\n                                        \"type\": \"string\"\n                                      },\n                                      \"unit_amount\": {\n                                        \"type\": \"integer\"\n                                      },\n                                      \"unit_amount_decimal\": {\n                                        \"format\": \"decimal\",\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\"currency\", \"product\"],\n                                    \"title\": \"one_time_price_data_with_negative_amounts\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"quantity\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"tax_rates\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"add_invoice_item_entry\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"application_fee_percent\": {\n                              \"type\": \"number\"\n                            },\n                            \"automatic_tax\": {\n                              \"properties\": {\n                                \"enabled\": {\n                                  \"type\": \"boolean\"\n                                },\n                                \"liability\": {\n                                  \"properties\": {\n                                    \"account\": {\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": {\n                                      \"enum\": [\"account\", \"self\"],\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"type\"],\n                                  \"title\": \"param\",\n                                  \"type\": \"object\"\n                                }\n                              },\n                              \"required\": [\"enabled\"],\n                              \"title\": \"automatic_tax_config\",\n                              \"type\": \"object\"\n                            },\n                            \"billing_cycle_anchor\": {\n                              \"enum\": [\"automatic\", \"phase_start\"],\n                              \"type\": \"string\"\n                            },\n                            \"billing_thresholds\": {\n                              \"anyOf\": [\n                                {\n                                  \"properties\": {\n                                    \"amount_gte\": {\n                                      \"type\": \"integer\"\n                                    },\n                                    \"reset_billing_cycle_anchor\": {\n                                      \"type\": \"boolean\"\n                                    }\n                                  },\n                                  \"title\": \"billing_thresholds_param\",\n                                  \"type\": \"object\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"collection_method\": {\n                              \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                              \"type\": \"string\"\n                            },\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"default_payment_method\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"default_tax_rates\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"description\": {\n                              \"anyOf\": [\n                                {\n                                  \"maxLength\": 500,\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"discounts\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"properties\": {\n                                      \"coupon\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"discount\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"promotion_code\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"discounts_data_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"end_date\": {\n                              \"anyOf\": [\n                                {\n                                  \"format\": \"unix-time\",\n                                  \"type\": \"integer\"\n                                },\n                                {\n                                  \"enum\": [\"now\"],\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"invoice_settings\": {\n                              \"properties\": {\n                                \"account_tax_ids\": {\n                                  \"anyOf\": [\n                                    {\n                                      \"items\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"type\": \"array\"\n                                    },\n                                    {\n                                      \"enum\": [\"\"],\n                                      \"type\": \"string\"\n                                    }\n                                  ]\n                                },\n                                \"days_until_due\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"issuer\": {\n                                  \"properties\": {\n                                    \"account\": {\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": {\n                                      \"enum\": [\"account\", \"self\"],\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"type\"],\n                                  \"title\": \"param\",\n                                  \"type\": \"object\"\n                                }\n                              },\n                              \"title\": \"invoice_settings\",\n                              \"type\": \"object\"\n                            },\n                            \"items\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"billing_thresholds\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"properties\": {\n                                          \"usage_gte\": {\n                                            \"type\": \"integer\"\n                                          }\n                                        },\n                                        \"required\": [\"usage_gte\"],\n                                        \"title\": \"item_billing_thresholds_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  },\n                                  \"discounts\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"properties\": {\n                                            \"coupon\": {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            \"discount\": {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            },\n                                            \"promotion_code\": {\n                                              \"maxLength\": 5000,\n                                              \"type\": \"string\"\n                                            }\n                                          },\n                                          \"title\": \"discounts_data_param\",\n                                          \"type\": \"object\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  },\n                                  \"metadata\": {\n                                    \"additionalProperties\": {\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"object\"\n                                  },\n                                  \"price\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"price_data\": {\n                                    \"properties\": {\n                                      \"currency\": {\n                                        \"format\": \"currency\",\n                                        \"type\": \"string\"\n                                      },\n                                      \"product\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"recurring\": {\n                                        \"properties\": {\n                                          \"interval\": {\n                                            \"enum\": [\n                                              \"day\",\n                                              \"month\",\n                                              \"week\",\n                                              \"year\"\n                                            ],\n                                            \"type\": \"string\"\n                                          },\n                                          \"interval_count\": {\n                                            \"type\": \"integer\"\n                                          }\n                                        },\n                                        \"required\": [\"interval\"],\n                                        \"title\": \"recurring_adhoc\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"tax_behavior\": {\n                                        \"enum\": [\n                                          \"exclusive\",\n                                          \"inclusive\",\n                                          \"unspecified\"\n                                        ],\n                                        \"type\": \"string\"\n                                      },\n                                      \"unit_amount\": {\n                                        \"type\": \"integer\"\n                                      },\n                                      \"unit_amount_decimal\": {\n                                        \"format\": \"decimal\",\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\n                                      \"currency\",\n                                      \"product\",\n                                      \"recurring\"\n                                    ],\n                                    \"title\": \"recurring_price_data\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"quantity\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"tax_rates\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"items\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"configuration_item_params\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"iterations\": {\n                              \"type\": \"integer\"\n                            },\n                            \"metadata\": {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            \"on_behalf_of\": {\n                              \"type\": \"string\"\n                            },\n                            \"proration_behavior\": {\n                              \"enum\": [\n                                \"always_invoice\",\n                                \"create_prorations\",\n                                \"none\"\n                              ],\n                              \"type\": \"string\"\n                            },\n                            \"start_date\": {\n                              \"anyOf\": [\n                                {\n                                  \"format\": \"unix-time\",\n                                  \"type\": \"integer\"\n                                },\n                                {\n                                  \"enum\": [\"now\"],\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"transfer_data\": {\n                              \"properties\": {\n                                \"amount_percent\": {\n                                  \"type\": \"number\"\n                                },\n                                \"destination\": {\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"destination\"],\n                              \"title\": \"transfer_data_specs\",\n                              \"type\": \"object\"\n                            },\n                            \"trial\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"trial_end\": {\n                              \"anyOf\": [\n                                {\n                                  \"format\": \"unix-time\",\n                                  \"type\": \"integer\"\n                                },\n                                {\n                                  \"enum\": [\"now\"],\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          \"required\": [\"items\"],\n                          \"title\": \"phase_configuration_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"proration_behavior\": {\n                        \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"schedule_details_params\",\n                    \"type\": \"object\"\n                  },\n                  \"subscription\": {\n                    \"description\": \"The identifier of the subscription for which you'd like to retrieve the upcoming invoice. If not provided, but a `subscription_details.items` is provided, you will preview creating a subscription with those items. If neither `subscription` nor `subscription_details.items` is provided, you will retrieve the next upcoming invoice from among the customer's subscriptions.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"subscription_details\": {\n                    \"description\": \"The subscription creation or modification params to apply as a preview. Cannot be used with `schedule` or `schedule_details` fields.\",\n                    \"properties\": {\n                      \"billing_cycle_anchor\": {\n                        \"anyOf\": [\n                          {\n                            \"enum\": [\"now\", \"unchanged\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          }\n                        ]\n                      },\n                      \"cancel_at\": {\n                        \"anyOf\": [\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"cancel_at_period_end\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"cancel_now\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"default_tax_rates\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"billing_thresholds\": {\n                              \"anyOf\": [\n                                {\n                                  \"properties\": {\n                                    \"usage_gte\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"usage_gte\"],\n                                  \"title\": \"item_billing_thresholds_param\",\n                                  \"type\": \"object\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"clear_usage\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"deleted\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"discounts\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"properties\": {\n                                      \"coupon\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"discount\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"promotion_code\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"discounts_data_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"id\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"metadata\": {\n                              \"anyOf\": [\n                                {\n                                  \"additionalProperties\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"object\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"price\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"price_data\": {\n                              \"properties\": {\n                                \"currency\": {\n                                  \"format\": \"currency\",\n                                  \"type\": \"string\"\n                                },\n                                \"product\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"recurring\": {\n                                  \"properties\": {\n                                    \"interval\": {\n                                      \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"interval_count\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"interval\"],\n                                  \"title\": \"recurring_adhoc\",\n                                  \"type\": \"object\"\n                                },\n                                \"tax_behavior\": {\n                                  \"enum\": [\n                                    \"exclusive\",\n                                    \"inclusive\",\n                                    \"unspecified\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"unit_amount\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"unit_amount_decimal\": {\n                                  \"format\": \"decimal\",\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"currency\", \"product\", \"recurring\"],\n                              \"title\": \"recurring_price_data\",\n                              \"type\": \"object\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rates\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          \"title\": \"subscription_item_update_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"proration_behavior\": {\n                        \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"proration_date\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"resume_at\": {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"start_date\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"trial_end\": {\n                        \"anyOf\": [\n                          {\n                            \"enum\": [\"now\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"subscription_details_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a preview invoice\"\n      }\n    },\n    \"/v1/invoices/search\": {\n      \"get\": {\n        \"description\": \"<p>Search for invoices you’ve previously created using Stripe’s <a href=\\\"/docs/search#search-query-language\\\">Search Query Language</a>.\\nDon’t use search in read-after-write flows where strict consistency is necessary. Under normal operating\\nconditions, data is searchable in less than a minute. Occasionally, propagation of new or updated data can be up\\nto an hour behind during outages. Search functionality is not available to merchants in India.</p>\",\n        \"operationId\": \"GetInvoicesSearch\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for pagination across multiple pages of results. Don't include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.\",\n            \"in\": \"query\",\n            \"name\": \"page\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The search query string. See [search query language](https://stripe.com/docs/search#search-query-language) and the list of supported [query fields for invoices](https://stripe.com/docs/search#query-fields-for-invoices).\",\n            \"in\": \"query\",\n            \"name\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/invoice\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"type\": \"boolean\"\n                    },\n                    \"next_page\": {\n                      \"maxLength\": 5000,\n                      \"nullable\": true,\n                      \"type\": \"string\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n                      \"enum\": [\"search_result\"],\n                      \"type\": \"string\"\n                    },\n                    \"total_count\": {\n                      \"description\": \"The total number of objects that match the query, only accurate up to 10,000.\",\n                      \"type\": \"integer\"\n                    },\n                    \"url\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SearchResult\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Search invoices\"\n      }\n    },\n    \"/v1/invoices/upcoming\": {\n      \"get\": {\n        \"description\": \"<p>At any time, you can preview the upcoming invoice for a customer. This will show you all the charges that are pending, including subscription renewal charges, invoice item charges, etc. It will also show you any discounts that are applicable to the invoice.</p>\\n\\n<p>Note that when you are viewing an upcoming invoice, you are simply viewing a preview – the invoice has not yet been created. As such, the upcoming invoice will not show up in invoice listing calls, and you cannot use the API to pay or edit the invoice. If you want to change the amount that your customer will be billed, you can add, remove, or update pending invoice items, or update the customer’s discount.</p>\\n\\n<p>You can preview the effects of updating a subscription, including a preview of what proration will take place. To ensure that the actual proration is calculated exactly the same as the previewed proration, you should pass the <code>subscription_details.proration_date</code> parameter when doing the actual subscription update. The recommended way to get only the prorations being previewed is to consider only proration line items where <code>period[start]</code> is equal to the <code>subscription_details.proration_date</code> value passed in the request.</p>\\n\\n<p>Note: Currency conversion calculations use the latest exchange rates. Exchange rates may vary between the time of the preview and the time of the actual invoice creation. <a href=\\\"https://docs.stripe.com/currencies/conversions\\\">Learn more</a></p>\",\n        \"operationId\": \"GetInvoicesUpcoming\",\n        \"parameters\": [\n          {\n            \"description\": \"Settings for automatic tax lookup for this invoice preview.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"automatic_tax\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"enabled\": {\n                  \"type\": \"boolean\"\n                },\n                \"liability\": {\n                  \"properties\": {\n                    \"account\": {\n                      \"type\": \"string\"\n                    },\n                    \"type\": {\n                      \"enum\": [\"account\", \"self\"],\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"type\"],\n                  \"title\": \"param\",\n                  \"type\": \"object\"\n                }\n              },\n              \"required\": [\"enabled\"],\n              \"title\": \"automatic_tax_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The ID of the coupon to apply to this phase of the subscription schedule. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n            \"in\": \"query\",\n            \"name\": \"coupon\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The currency to preview this invoice in. Defaults to that of `customer` if not specified.\",\n            \"in\": \"query\",\n            \"name\": \"currency\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"currency\",\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The identifier of the customer whose upcoming invoice you'd like to retrieve. If `automatic_tax` is enabled then one of `customer`, `customer_details`, `subscription`, or `schedule` must be set.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Details about the customer you want to invoice or overrides for an existing customer. If `automatic_tax` is enabled then one of `customer`, `customer_details`, `subscription`, or `schedule` must be set.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"customer_details\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"address\": {\n                  \"anyOf\": [\n                    {\n                      \"properties\": {\n                        \"city\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"country\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"line1\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"line2\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"postal_code\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"state\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"title\": \"optional_fields_address\",\n                      \"type\": \"object\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"shipping\": {\n                  \"anyOf\": [\n                    {\n                      \"properties\": {\n                        \"address\": {\n                          \"properties\": {\n                            \"city\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"country\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"line1\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"line2\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"postal_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"state\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"optional_fields_customer_address\",\n                          \"type\": \"object\"\n                        },\n                        \"name\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"phone\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"address\", \"name\"],\n                      \"title\": \"customer_shipping\",\n                      \"type\": \"object\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"tax\": {\n                  \"properties\": {\n                    \"ip_address\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"enum\": [\"\"],\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  \"title\": \"tax_param\",\n                  \"type\": \"object\"\n                },\n                \"tax_exempt\": {\n                  \"enum\": [\"\", \"exempt\", \"none\", \"reverse\"],\n                  \"type\": \"string\"\n                },\n                \"tax_ids\": {\n                  \"items\": {\n                    \"properties\": {\n                      \"type\": {\n                        \"enum\": [\n                          \"ad_nrt\",\n                          \"ae_trn\",\n                          \"al_tin\",\n                          \"am_tin\",\n                          \"ao_tin\",\n                          \"ar_cuit\",\n                          \"au_abn\",\n                          \"au_arn\",\n                          \"ba_tin\",\n                          \"bb_tin\",\n                          \"bg_uic\",\n                          \"bh_vat\",\n                          \"bo_tin\",\n                          \"br_cnpj\",\n                          \"br_cpf\",\n                          \"bs_tin\",\n                          \"by_tin\",\n                          \"ca_bn\",\n                          \"ca_gst_hst\",\n                          \"ca_pst_bc\",\n                          \"ca_pst_mb\",\n                          \"ca_pst_sk\",\n                          \"ca_qst\",\n                          \"cd_nif\",\n                          \"ch_uid\",\n                          \"ch_vat\",\n                          \"cl_tin\",\n                          \"cn_tin\",\n                          \"co_nit\",\n                          \"cr_tin\",\n                          \"de_stn\",\n                          \"do_rcn\",\n                          \"ec_ruc\",\n                          \"eg_tin\",\n                          \"es_cif\",\n                          \"eu_oss_vat\",\n                          \"eu_vat\",\n                          \"gb_vat\",\n                          \"ge_vat\",\n                          \"gn_nif\",\n                          \"hk_br\",\n                          \"hr_oib\",\n                          \"hu_tin\",\n                          \"id_npwp\",\n                          \"il_vat\",\n                          \"in_gst\",\n                          \"is_vat\",\n                          \"jp_cn\",\n                          \"jp_rn\",\n                          \"jp_trn\",\n                          \"ke_pin\",\n                          \"kh_tin\",\n                          \"kr_brn\",\n                          \"kz_bin\",\n                          \"li_uid\",\n                          \"li_vat\",\n                          \"ma_vat\",\n                          \"md_vat\",\n                          \"me_pib\",\n                          \"mk_vat\",\n                          \"mr_nif\",\n                          \"mx_rfc\",\n                          \"my_frp\",\n                          \"my_itn\",\n                          \"my_sst\",\n                          \"ng_tin\",\n                          \"no_vat\",\n                          \"no_voec\",\n                          \"np_pan\",\n                          \"nz_gst\",\n                          \"om_vat\",\n                          \"pe_ruc\",\n                          \"ph_tin\",\n                          \"ro_tin\",\n                          \"rs_pib\",\n                          \"ru_inn\",\n                          \"ru_kpp\",\n                          \"sa_vat\",\n                          \"sg_gst\",\n                          \"sg_uen\",\n                          \"si_tin\",\n                          \"sn_ninea\",\n                          \"sr_fin\",\n                          \"sv_nit\",\n                          \"th_vat\",\n                          \"tj_tin\",\n                          \"tr_tin\",\n                          \"tw_vat\",\n                          \"tz_vat\",\n                          \"ua_vat\",\n                          \"ug_tin\",\n                          \"us_ein\",\n                          \"uy_ruc\",\n                          \"uz_tin\",\n                          \"uz_vat\",\n                          \"ve_rif\",\n                          \"vn_tin\",\n                          \"za_vat\",\n                          \"zm_tin\",\n                          \"zw_tin\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"value\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\", \"value\"],\n                    \"title\": \"data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                }\n              },\n              \"title\": \"customer_details_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The coupons to redeem into discounts for the invoice preview. If not specified, inherits the discount from the subscription or customer. This works for both coupons directly applied to an invoice and coupons applied to a subscription. Pass an empty string to avoid inheriting any discounts.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"discounts\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"items\": {\n                    \"properties\": {\n                      \"coupon\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"discount\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"promotion_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"discounts_data_param\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"List of invoice items to add or update in the upcoming invoice preview (up to 250).\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"invoice_items\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"properties\": {\n                  \"amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"discountable\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"invoiceitem\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"period\": {\n                    \"properties\": {\n                      \"end\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"start\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"end\", \"start\"],\n                    \"title\": \"period\",\n                    \"type\": \"object\"\n                  },\n                  \"price\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\"],\n                    \"title\": \"one_time_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"quantity\": {\n                    \"type\": \"integer\"\n                  },\n                  \"tax_behavior\": {\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"tax_code\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"unit_amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"unit_amount_decimal\": {\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"title\": \"invoice_item_preview_params\",\n                \"type\": \"object\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"issuer\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"account\": {\n                  \"type\": \"string\"\n                },\n                \"type\": {\n                  \"enum\": [\"account\", \"self\"],\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"type\"],\n              \"title\": \"param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the [Invoices with Connect](https://stripe.com/docs/billing/invoices/connect) documentation for details.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"on_behalf_of\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"type\": \"string\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Customizes the types of values to include when calculating the invoice. Defaults to `next` if unspecified.\",\n            \"in\": \"query\",\n            \"name\": \"preview_mode\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"next\", \"recurring\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The identifier of the schedule whose upcoming invoice you'd like to retrieve. Cannot be used with subscription or subscription fields.\",\n            \"in\": \"query\",\n            \"name\": \"schedule\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The schedule creation or modification params to apply as a preview. Cannot be used with `subscription` or `subscription_` prefixed fields.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"schedule_details\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"end_behavior\": {\n                  \"enum\": [\"cancel\", \"release\"],\n                  \"type\": \"string\"\n                },\n                \"phases\": {\n                  \"items\": {\n                    \"properties\": {\n                      \"add_invoice_items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"discounts\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"price\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"price_data\": {\n                              \"properties\": {\n                                \"currency\": {\n                                  \"format\": \"currency\",\n                                  \"type\": \"string\"\n                                },\n                                \"product\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"tax_behavior\": {\n                                  \"enum\": [\n                                    \"exclusive\",\n                                    \"inclusive\",\n                                    \"unspecified\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"unit_amount\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"unit_amount_decimal\": {\n                                  \"format\": \"decimal\",\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"currency\", \"product\"],\n                              \"title\": \"one_time_price_data_with_negative_amounts\",\n                              \"type\": \"object\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rates\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          \"title\": \"add_invoice_item_entry\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"application_fee_percent\": {\n                        \"type\": \"number\"\n                      },\n                      \"automatic_tax\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"liability\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"automatic_tax_config\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_cycle_anchor\": {\n                        \"enum\": [\"automatic\", \"phase_start\"],\n                        \"type\": \"string\"\n                      },\n                      \"billing_thresholds\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_gte\": {\n                                \"type\": \"integer\"\n                              },\n                              \"reset_billing_cycle_anchor\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"billing_thresholds_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"collection_method\": {\n                        \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                        \"type\": \"string\"\n                      },\n                      \"coupon\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"default_payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"default_tax_rates\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"description\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"discounts\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"properties\": {\n                                \"coupon\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"discount\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"promotion_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"title\": \"discounts_data_param\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"end_date\": {\n                        \"anyOf\": [\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"now\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"invoice_settings\": {\n                        \"properties\": {\n                          \"account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"days_until_due\": {\n                            \"type\": \"integer\"\n                          },\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"invoice_settings\",\n                        \"type\": \"object\"\n                      },\n                      \"items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"billing_thresholds\": {\n                              \"anyOf\": [\n                                {\n                                  \"properties\": {\n                                    \"usage_gte\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"usage_gte\"],\n                                  \"title\": \"item_billing_thresholds_param\",\n                                  \"type\": \"object\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"discounts\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"properties\": {\n                                      \"coupon\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"discount\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"promotion_code\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"discounts_data_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"metadata\": {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            \"price\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"price_data\": {\n                              \"properties\": {\n                                \"currency\": {\n                                  \"format\": \"currency\",\n                                  \"type\": \"string\"\n                                },\n                                \"product\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"recurring\": {\n                                  \"properties\": {\n                                    \"interval\": {\n                                      \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"interval_count\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"interval\"],\n                                  \"title\": \"recurring_adhoc\",\n                                  \"type\": \"object\"\n                                },\n                                \"tax_behavior\": {\n                                  \"enum\": [\n                                    \"exclusive\",\n                                    \"inclusive\",\n                                    \"unspecified\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"unit_amount\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"unit_amount_decimal\": {\n                                  \"format\": \"decimal\",\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"currency\", \"product\", \"recurring\"],\n                              \"title\": \"recurring_price_data\",\n                              \"type\": \"object\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rates\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          \"title\": \"configuration_item_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"iterations\": {\n                        \"type\": \"integer\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"on_behalf_of\": {\n                        \"type\": \"string\"\n                      },\n                      \"proration_behavior\": {\n                        \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"start_date\": {\n                        \"anyOf\": [\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"now\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"transfer_data\": {\n                        \"properties\": {\n                          \"amount_percent\": {\n                            \"type\": \"number\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"trial\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"trial_end\": {\n                        \"anyOf\": [\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"now\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\"items\"],\n                    \"title\": \"phase_configuration_params\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                },\n                \"proration_behavior\": {\n                  \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                  \"type\": \"string\"\n                }\n              },\n              \"title\": \"schedule_details_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The identifier of the subscription for which you'd like to retrieve the upcoming invoice. If not provided, but a `subscription_details.items` is provided, you will preview creating a subscription with those items. If neither `subscription` nor `subscription_details.items` is provided, you will retrieve the next upcoming invoice from among the customer's subscriptions.\",\n            \"in\": \"query\",\n            \"name\": \"subscription\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"For new subscriptions, a future timestamp to anchor the subscription's [billing cycle](https://stripe.com/docs/subscriptions/billing-cycle). This is used to determine the date of the first full invoice, and, for plans with `month` or `year` intervals, the day of the month for subsequent invoices. For existing subscriptions, the value can only be set to `now` or `unchanged`. This field has been deprecated and will be removed in a future API version. Use `subscription_details.billing_cycle_anchor` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_billing_cycle_anchor\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"enum\": [\"now\", \"unchanged\"],\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A timestamp at which the subscription should cancel. If set to a date before the current period ends, this will cause a proration if prorations have been enabled using `proration_behavior`. If set during a future period, this will always cause a proration for that period. This field has been deprecated and will be removed in a future API version. Use `subscription_details.cancel_at` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_cancel_at\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Indicate whether this subscription should cancel at the end of the current period (`current_period_end`). Defaults to `false`. This field has been deprecated and will be removed in a future API version. Use `subscription_details.cancel_at_period_end` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_cancel_at_period_end\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"This simulates the subscription being canceled or expired immediately. This field has been deprecated and will be removed in a future API version. Use `subscription_details.cancel_now` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_cancel_now\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If provided, the invoice returned will preview updating or creating a subscription with these default tax rates. The default tax rates will apply to any line item that does not have `tax_rates` set. This field has been deprecated and will be removed in a future API version. Use `subscription_details.default_tax_rates` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_default_tax_rates\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"items\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"type\": \"array\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The subscription creation or modification params to apply as a preview. Cannot be used with `schedule` or `schedule_details` fields.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_details\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"billing_cycle_anchor\": {\n                  \"anyOf\": [\n                    {\n                      \"enum\": [\"now\", \"unchanged\"],\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"format\": \"unix-time\",\n                      \"type\": \"integer\"\n                    }\n                  ]\n                },\n                \"cancel_at\": {\n                  \"anyOf\": [\n                    {\n                      \"format\": \"unix-time\",\n                      \"type\": \"integer\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"cancel_at_period_end\": {\n                  \"type\": \"boolean\"\n                },\n                \"cancel_now\": {\n                  \"type\": \"boolean\"\n                },\n                \"default_tax_rates\": {\n                  \"anyOf\": [\n                    {\n                      \"items\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"items\": {\n                  \"items\": {\n                    \"properties\": {\n                      \"billing_thresholds\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"usage_gte\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"usage_gte\"],\n                            \"title\": \"item_billing_thresholds_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"clear_usage\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"deleted\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"discounts\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"properties\": {\n                                \"coupon\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"discount\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"promotion_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"title\": \"discounts_data_param\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"price\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"price_data\": {\n                        \"properties\": {\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"product\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"recurring\": {\n                            \"properties\": {\n                              \"interval\": {\n                                \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                \"type\": \"string\"\n                              },\n                              \"interval_count\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"interval\"],\n                            \"title\": \"recurring_adhoc\",\n                            \"type\": \"object\"\n                          },\n                          \"tax_behavior\": {\n                            \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                            \"type\": \"string\"\n                          },\n                          \"unit_amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"unit_amount_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"currency\", \"product\", \"recurring\"],\n                        \"title\": \"recurring_price_data\",\n                        \"type\": \"object\"\n                      },\n                      \"quantity\": {\n                        \"type\": \"integer\"\n                      },\n                      \"tax_rates\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"subscription_item_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                },\n                \"proration_behavior\": {\n                  \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                  \"type\": \"string\"\n                },\n                \"proration_date\": {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                },\n                \"resume_at\": {\n                  \"enum\": [\"now\"],\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                \"start_date\": {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                },\n                \"trial_end\": {\n                  \"anyOf\": [\n                    {\n                      \"enum\": [\"now\"],\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"format\": \"unix-time\",\n                      \"type\": \"integer\"\n                    }\n                  ]\n                }\n              },\n              \"title\": \"subscription_details_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A list of up to 20 subscription items, each with an attached price. This field has been deprecated and will be removed in a future API version. Use `subscription_details.items` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_items\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"properties\": {\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"usage_gte\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"usage_gte\"],\n                        \"title\": \"item_billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"clear_usage\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"deleted\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"id\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"price\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"recurring\": {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"recurring_adhoc\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\", \"recurring\"],\n                    \"title\": \"recurring_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"quantity\": {\n                    \"type\": \"integer\"\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  }\n                },\n                \"title\": \"subscription_item_update_params\",\n                \"type\": \"object\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`. This field has been deprecated and will be removed in a future API version. Use `subscription_details.proration_behavior` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_proration_behavior\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If previewing an update to a subscription, and doing proration, `subscription_proration_date` forces the proration to be calculated as though the update was done at the specified time. The time given must be within the current subscription period and within the current phase of the schedule backing this subscription, if the schedule exists. If set, `subscription`, and one of `subscription_items`, or `subscription_trial_end` are required. Also, `subscription_proration_behavior` cannot be set to 'none'. This field has been deprecated and will be removed in a future API version. Use `subscription_details.proration_date` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_proration_date\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"For paused subscriptions, setting `subscription_resume_at` to `now` will preview the invoice that will be generated if the subscription is resumed. This field has been deprecated and will be removed in a future API version. Use `subscription_details.resume_at` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_resume_at\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"now\"],\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Date a subscription is intended to start (can be future or past). This field has been deprecated and will be removed in a future API version. Use `subscription_details.start_date` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_start_date\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If provided, the invoice returned will preview updating or creating a subscription with that trial end. If set, one of `subscription_items` or `subscription` is required. This field has been deprecated and will be removed in a future API version. Use `subscription_details.trial_end` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_trial_end\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"enum\": [\"now\"],\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an upcoming invoice\"\n      }\n    },\n    \"/v1/invoices/upcoming/lines\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving an upcoming invoice, you’ll get a <strong>lines</strong> property containing the total count of line items and the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.</p>\",\n        \"operationId\": \"GetInvoicesUpcomingLines\",\n        \"parameters\": [\n          {\n            \"description\": \"Settings for automatic tax lookup for this invoice preview.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"automatic_tax\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"enabled\": {\n                  \"type\": \"boolean\"\n                },\n                \"liability\": {\n                  \"properties\": {\n                    \"account\": {\n                      \"type\": \"string\"\n                    },\n                    \"type\": {\n                      \"enum\": [\"account\", \"self\"],\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"type\"],\n                  \"title\": \"param\",\n                  \"type\": \"object\"\n                }\n              },\n              \"required\": [\"enabled\"],\n              \"title\": \"automatic_tax_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The ID of the coupon to apply to this phase of the subscription schedule. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n            \"in\": \"query\",\n            \"name\": \"coupon\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The currency to preview this invoice in. Defaults to that of `customer` if not specified.\",\n            \"in\": \"query\",\n            \"name\": \"currency\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"currency\",\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The identifier of the customer whose upcoming invoice you'd like to retrieve. If `automatic_tax` is enabled then one of `customer`, `customer_details`, `subscription`, or `schedule` must be set.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Details about the customer you want to invoice or overrides for an existing customer. If `automatic_tax` is enabled then one of `customer`, `customer_details`, `subscription`, or `schedule` must be set.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"customer_details\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"address\": {\n                  \"anyOf\": [\n                    {\n                      \"properties\": {\n                        \"city\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"country\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"line1\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"line2\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"postal_code\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"state\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"title\": \"optional_fields_address\",\n                      \"type\": \"object\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"shipping\": {\n                  \"anyOf\": [\n                    {\n                      \"properties\": {\n                        \"address\": {\n                          \"properties\": {\n                            \"city\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"country\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"line1\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"line2\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"postal_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"state\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"optional_fields_customer_address\",\n                          \"type\": \"object\"\n                        },\n                        \"name\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"phone\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"address\", \"name\"],\n                      \"title\": \"customer_shipping\",\n                      \"type\": \"object\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"tax\": {\n                  \"properties\": {\n                    \"ip_address\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"enum\": [\"\"],\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  \"title\": \"tax_param\",\n                  \"type\": \"object\"\n                },\n                \"tax_exempt\": {\n                  \"enum\": [\"\", \"exempt\", \"none\", \"reverse\"],\n                  \"type\": \"string\"\n                },\n                \"tax_ids\": {\n                  \"items\": {\n                    \"properties\": {\n                      \"type\": {\n                        \"enum\": [\n                          \"ad_nrt\",\n                          \"ae_trn\",\n                          \"al_tin\",\n                          \"am_tin\",\n                          \"ao_tin\",\n                          \"ar_cuit\",\n                          \"au_abn\",\n                          \"au_arn\",\n                          \"ba_tin\",\n                          \"bb_tin\",\n                          \"bg_uic\",\n                          \"bh_vat\",\n                          \"bo_tin\",\n                          \"br_cnpj\",\n                          \"br_cpf\",\n                          \"bs_tin\",\n                          \"by_tin\",\n                          \"ca_bn\",\n                          \"ca_gst_hst\",\n                          \"ca_pst_bc\",\n                          \"ca_pst_mb\",\n                          \"ca_pst_sk\",\n                          \"ca_qst\",\n                          \"cd_nif\",\n                          \"ch_uid\",\n                          \"ch_vat\",\n                          \"cl_tin\",\n                          \"cn_tin\",\n                          \"co_nit\",\n                          \"cr_tin\",\n                          \"de_stn\",\n                          \"do_rcn\",\n                          \"ec_ruc\",\n                          \"eg_tin\",\n                          \"es_cif\",\n                          \"eu_oss_vat\",\n                          \"eu_vat\",\n                          \"gb_vat\",\n                          \"ge_vat\",\n                          \"gn_nif\",\n                          \"hk_br\",\n                          \"hr_oib\",\n                          \"hu_tin\",\n                          \"id_npwp\",\n                          \"il_vat\",\n                          \"in_gst\",\n                          \"is_vat\",\n                          \"jp_cn\",\n                          \"jp_rn\",\n                          \"jp_trn\",\n                          \"ke_pin\",\n                          \"kh_tin\",\n                          \"kr_brn\",\n                          \"kz_bin\",\n                          \"li_uid\",\n                          \"li_vat\",\n                          \"ma_vat\",\n                          \"md_vat\",\n                          \"me_pib\",\n                          \"mk_vat\",\n                          \"mr_nif\",\n                          \"mx_rfc\",\n                          \"my_frp\",\n                          \"my_itn\",\n                          \"my_sst\",\n                          \"ng_tin\",\n                          \"no_vat\",\n                          \"no_voec\",\n                          \"np_pan\",\n                          \"nz_gst\",\n                          \"om_vat\",\n                          \"pe_ruc\",\n                          \"ph_tin\",\n                          \"ro_tin\",\n                          \"rs_pib\",\n                          \"ru_inn\",\n                          \"ru_kpp\",\n                          \"sa_vat\",\n                          \"sg_gst\",\n                          \"sg_uen\",\n                          \"si_tin\",\n                          \"sn_ninea\",\n                          \"sr_fin\",\n                          \"sv_nit\",\n                          \"th_vat\",\n                          \"tj_tin\",\n                          \"tr_tin\",\n                          \"tw_vat\",\n                          \"tz_vat\",\n                          \"ua_vat\",\n                          \"ug_tin\",\n                          \"us_ein\",\n                          \"uy_ruc\",\n                          \"uz_tin\",\n                          \"uz_vat\",\n                          \"ve_rif\",\n                          \"vn_tin\",\n                          \"za_vat\",\n                          \"zm_tin\",\n                          \"zw_tin\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"value\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\", \"value\"],\n                    \"title\": \"data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                }\n              },\n              \"title\": \"customer_details_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The coupons to redeem into discounts for the invoice preview. If not specified, inherits the discount from the subscription or customer. This works for both coupons directly applied to an invoice and coupons applied to a subscription. Pass an empty string to avoid inheriting any discounts.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"discounts\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"items\": {\n                    \"properties\": {\n                      \"coupon\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"discount\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"promotion_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"discounts_data_param\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"List of invoice items to add or update in the upcoming invoice preview (up to 250).\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"invoice_items\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"properties\": {\n                  \"amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"discountable\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"invoiceitem\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"period\": {\n                    \"properties\": {\n                      \"end\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"start\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"end\", \"start\"],\n                    \"title\": \"period\",\n                    \"type\": \"object\"\n                  },\n                  \"price\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\"],\n                    \"title\": \"one_time_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"quantity\": {\n                    \"type\": \"integer\"\n                  },\n                  \"tax_behavior\": {\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"tax_code\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"unit_amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"unit_amount_decimal\": {\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"title\": \"invoice_item_preview_params\",\n                \"type\": \"object\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"issuer\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"account\": {\n                  \"type\": \"string\"\n                },\n                \"type\": {\n                  \"enum\": [\"account\", \"self\"],\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"type\"],\n              \"title\": \"param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the [Invoices with Connect](https://stripe.com/docs/billing/invoices/connect) documentation for details.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"on_behalf_of\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"type\": \"string\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Customizes the types of values to include when calculating the invoice. Defaults to `next` if unspecified.\",\n            \"in\": \"query\",\n            \"name\": \"preview_mode\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"next\", \"recurring\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The identifier of the schedule whose upcoming invoice you'd like to retrieve. Cannot be used with subscription or subscription fields.\",\n            \"in\": \"query\",\n            \"name\": \"schedule\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The schedule creation or modification params to apply as a preview. Cannot be used with `subscription` or `subscription_` prefixed fields.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"schedule_details\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"end_behavior\": {\n                  \"enum\": [\"cancel\", \"release\"],\n                  \"type\": \"string\"\n                },\n                \"phases\": {\n                  \"items\": {\n                    \"properties\": {\n                      \"add_invoice_items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"discounts\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"price\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"price_data\": {\n                              \"properties\": {\n                                \"currency\": {\n                                  \"format\": \"currency\",\n                                  \"type\": \"string\"\n                                },\n                                \"product\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"tax_behavior\": {\n                                  \"enum\": [\n                                    \"exclusive\",\n                                    \"inclusive\",\n                                    \"unspecified\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"unit_amount\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"unit_amount_decimal\": {\n                                  \"format\": \"decimal\",\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"currency\", \"product\"],\n                              \"title\": \"one_time_price_data_with_negative_amounts\",\n                              \"type\": \"object\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rates\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          \"title\": \"add_invoice_item_entry\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"application_fee_percent\": {\n                        \"type\": \"number\"\n                      },\n                      \"automatic_tax\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"liability\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"automatic_tax_config\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_cycle_anchor\": {\n                        \"enum\": [\"automatic\", \"phase_start\"],\n                        \"type\": \"string\"\n                      },\n                      \"billing_thresholds\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_gte\": {\n                                \"type\": \"integer\"\n                              },\n                              \"reset_billing_cycle_anchor\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"billing_thresholds_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"collection_method\": {\n                        \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                        \"type\": \"string\"\n                      },\n                      \"coupon\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"default_payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"default_tax_rates\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"description\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"discounts\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"properties\": {\n                                \"coupon\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"discount\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"promotion_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"title\": \"discounts_data_param\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"end_date\": {\n                        \"anyOf\": [\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"now\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"invoice_settings\": {\n                        \"properties\": {\n                          \"account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"days_until_due\": {\n                            \"type\": \"integer\"\n                          },\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"invoice_settings\",\n                        \"type\": \"object\"\n                      },\n                      \"items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"billing_thresholds\": {\n                              \"anyOf\": [\n                                {\n                                  \"properties\": {\n                                    \"usage_gte\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"usage_gte\"],\n                                  \"title\": \"item_billing_thresholds_param\",\n                                  \"type\": \"object\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"discounts\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"properties\": {\n                                      \"coupon\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"discount\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"promotion_code\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"discounts_data_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"metadata\": {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            \"price\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"price_data\": {\n                              \"properties\": {\n                                \"currency\": {\n                                  \"format\": \"currency\",\n                                  \"type\": \"string\"\n                                },\n                                \"product\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"recurring\": {\n                                  \"properties\": {\n                                    \"interval\": {\n                                      \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"interval_count\": {\n                                      \"type\": \"integer\"\n                                    }\n                                  },\n                                  \"required\": [\"interval\"],\n                                  \"title\": \"recurring_adhoc\",\n                                  \"type\": \"object\"\n                                },\n                                \"tax_behavior\": {\n                                  \"enum\": [\n                                    \"exclusive\",\n                                    \"inclusive\",\n                                    \"unspecified\"\n                                  ],\n                                  \"type\": \"string\"\n                                },\n                                \"unit_amount\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"unit_amount_decimal\": {\n                                  \"format\": \"decimal\",\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"currency\", \"product\", \"recurring\"],\n                              \"title\": \"recurring_price_data\",\n                              \"type\": \"object\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rates\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          \"title\": \"configuration_item_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"iterations\": {\n                        \"type\": \"integer\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"on_behalf_of\": {\n                        \"type\": \"string\"\n                      },\n                      \"proration_behavior\": {\n                        \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"start_date\": {\n                        \"anyOf\": [\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"now\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"transfer_data\": {\n                        \"properties\": {\n                          \"amount_percent\": {\n                            \"type\": \"number\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"trial\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"trial_end\": {\n                        \"anyOf\": [\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"now\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\"items\"],\n                    \"title\": \"phase_configuration_params\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                },\n                \"proration_behavior\": {\n                  \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                  \"type\": \"string\"\n                }\n              },\n              \"title\": \"schedule_details_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The identifier of the subscription for which you'd like to retrieve the upcoming invoice. If not provided, but a `subscription_details.items` is provided, you will preview creating a subscription with those items. If neither `subscription` nor `subscription_details.items` is provided, you will retrieve the next upcoming invoice from among the customer's subscriptions.\",\n            \"in\": \"query\",\n            \"name\": \"subscription\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"For new subscriptions, a future timestamp to anchor the subscription's [billing cycle](https://stripe.com/docs/subscriptions/billing-cycle). This is used to determine the date of the first full invoice, and, for plans with `month` or `year` intervals, the day of the month for subsequent invoices. For existing subscriptions, the value can only be set to `now` or `unchanged`. This field has been deprecated and will be removed in a future API version. Use `subscription_details.billing_cycle_anchor` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_billing_cycle_anchor\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"enum\": [\"now\", \"unchanged\"],\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A timestamp at which the subscription should cancel. If set to a date before the current period ends, this will cause a proration if prorations have been enabled using `proration_behavior`. If set during a future period, this will always cause a proration for that period. This field has been deprecated and will be removed in a future API version. Use `subscription_details.cancel_at` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_cancel_at\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Indicate whether this subscription should cancel at the end of the current period (`current_period_end`). Defaults to `false`. This field has been deprecated and will be removed in a future API version. Use `subscription_details.cancel_at_period_end` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_cancel_at_period_end\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"This simulates the subscription being canceled or expired immediately. This field has been deprecated and will be removed in a future API version. Use `subscription_details.cancel_now` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_cancel_now\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If provided, the invoice returned will preview updating or creating a subscription with these default tax rates. The default tax rates will apply to any line item that does not have `tax_rates` set. This field has been deprecated and will be removed in a future API version. Use `subscription_details.default_tax_rates` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_default_tax_rates\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"items\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"type\": \"array\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The subscription creation or modification params to apply as a preview. Cannot be used with `schedule` or `schedule_details` fields.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_details\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"billing_cycle_anchor\": {\n                  \"anyOf\": [\n                    {\n                      \"enum\": [\"now\", \"unchanged\"],\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"format\": \"unix-time\",\n                      \"type\": \"integer\"\n                    }\n                  ]\n                },\n                \"cancel_at\": {\n                  \"anyOf\": [\n                    {\n                      \"format\": \"unix-time\",\n                      \"type\": \"integer\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"cancel_at_period_end\": {\n                  \"type\": \"boolean\"\n                },\n                \"cancel_now\": {\n                  \"type\": \"boolean\"\n                },\n                \"default_tax_rates\": {\n                  \"anyOf\": [\n                    {\n                      \"items\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    {\n                      \"enum\": [\"\"],\n                      \"type\": \"string\"\n                    }\n                  ]\n                },\n                \"items\": {\n                  \"items\": {\n                    \"properties\": {\n                      \"billing_thresholds\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"usage_gte\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"usage_gte\"],\n                            \"title\": \"item_billing_thresholds_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"clear_usage\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"deleted\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"discounts\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"properties\": {\n                                \"coupon\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"discount\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"promotion_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"title\": \"discounts_data_param\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"price\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"price_data\": {\n                        \"properties\": {\n                          \"currency\": {\n                            \"format\": \"currency\",\n                            \"type\": \"string\"\n                          },\n                          \"product\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"recurring\": {\n                            \"properties\": {\n                              \"interval\": {\n                                \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                \"type\": \"string\"\n                              },\n                              \"interval_count\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"interval\"],\n                            \"title\": \"recurring_adhoc\",\n                            \"type\": \"object\"\n                          },\n                          \"tax_behavior\": {\n                            \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                            \"type\": \"string\"\n                          },\n                          \"unit_amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"unit_amount_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"currency\", \"product\", \"recurring\"],\n                        \"title\": \"recurring_price_data\",\n                        \"type\": \"object\"\n                      },\n                      \"quantity\": {\n                        \"type\": \"integer\"\n                      },\n                      \"tax_rates\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"subscription_item_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": \"array\"\n                },\n                \"proration_behavior\": {\n                  \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                  \"type\": \"string\"\n                },\n                \"proration_date\": {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                },\n                \"resume_at\": {\n                  \"enum\": [\"now\"],\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                \"start_date\": {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                },\n                \"trial_end\": {\n                  \"anyOf\": [\n                    {\n                      \"enum\": [\"now\"],\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"format\": \"unix-time\",\n                      \"type\": \"integer\"\n                    }\n                  ]\n                }\n              },\n              \"title\": \"subscription_details_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A list of up to 20 subscription items, each with an attached price. This field has been deprecated and will be removed in a future API version. Use `subscription_details.items` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_items\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"properties\": {\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"usage_gte\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"usage_gte\"],\n                        \"title\": \"item_billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"clear_usage\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"deleted\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"id\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"price\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"recurring\": {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"recurring_adhoc\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\", \"recurring\"],\n                    \"title\": \"recurring_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"quantity\": {\n                    \"type\": \"integer\"\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ]\n                  }\n                },\n                \"title\": \"subscription_item_update_params\",\n                \"type\": \"object\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`. This field has been deprecated and will be removed in a future API version. Use `subscription_details.proration_behavior` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_proration_behavior\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If previewing an update to a subscription, and doing proration, `subscription_proration_date` forces the proration to be calculated as though the update was done at the specified time. The time given must be within the current subscription period and within the current phase of the schedule backing this subscription, if the schedule exists. If set, `subscription`, and one of `subscription_items`, or `subscription_trial_end` are required. Also, `subscription_proration_behavior` cannot be set to 'none'. This field has been deprecated and will be removed in a future API version. Use `subscription_details.proration_date` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_proration_date\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"For paused subscriptions, setting `subscription_resume_at` to `now` will preview the invoice that will be generated if the subscription is resumed. This field has been deprecated and will be removed in a future API version. Use `subscription_details.resume_at` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_resume_at\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"now\"],\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Date a subscription is intended to start (can be future or past). This field has been deprecated and will be removed in a future API version. Use `subscription_details.start_date` instead.\",\n            \"in\": \"query\",\n            \"name\": \"subscription_start_date\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"unix-time\",\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If provided, the invoice returned will preview updating or creating a subscription with that trial end. If set, one of `subscription_items` or `subscription` is required. This field has been deprecated and will be removed in a future API version. Use `subscription_details.trial_end` instead.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"subscription_trial_end\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"enum\": [\"now\"],\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                {\n                  \"format\": \"unix-time\",\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/line_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"InvoiceLinesList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an upcoming invoice's line items\"\n      }\n    },\n    \"/v1/invoices/{invoice}\": {\n      \"delete\": {\n        \"description\": \"<p>Permanently deletes a one-off invoice draft. This cannot be undone. Attempts to delete invoices that are no longer in a draft state will fail; once an invoice has been finalized or if an invoice is for a subscription, it must be <a href=\\\"#void_invoice\\\">voided</a>.</p>\",\n        \"operationId\": \"DeleteInvoicesInvoice\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a draft invoice\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the invoice with the given ID.</p>\",\n        \"operationId\": \"GetInvoicesInvoice\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an invoice\"\n      },\n      \"post\": {\n        \"description\": \"<p>Draft invoices are fully editable. Once an invoice is <a href=\\\"/docs/billing/invoices/workflow#finalized\\\">finalized</a>,\\nmonetary values, as well as <code>collection_method</code>, become uneditable.</p>\\n\\n<p>If you would like to stop the Stripe Billing engine from automatically finalizing, reattempting payments on,\\nsending reminders for, or <a href=\\\"/docs/billing/invoices/reconciliation\\\">automatically reconciling</a> invoices, pass\\n<code>auto_advance=false</code>.</p>\",\n        \"operationId\": \"PostInvoicesInvoice\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"account_tax_ids\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_fields\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_source\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"effective_at\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"issuer\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"number\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"on_behalf_of\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"rendering\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_cost\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_tax_ids\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account tax IDs associated with the invoice. Only editable when the invoice is a draft.\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"A fee in cents (or local equivalent) that will be applied to the invoice and transferred to the application owner's Stripe account. The request must be made with an OAuth key or the Stripe-Account header in order to take an application fee. For more information, see the application fees [documentation](https://stripe.com/docs/billing/invoices/connect#collecting-fees).\",\n                    \"type\": \"integer\"\n                  },\n                  \"auto_advance\": {\n                    \"description\": \"Controls whether Stripe performs [automatic collection](https://stripe.com/docs/invoicing/integration/automatic-advancement-collection) of the invoice.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Settings for automatic tax lookup for this invoice.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_param\",\n                    \"type\": \"object\"\n                  },\n                  \"automatically_finalizes_at\": {\n                    \"description\": \"The time when this invoice should be scheduled to finalize. The invoice will be finalized at this time if it is still in draft state. To turn off automatic finalization, set `auto_advance` to false.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically` or `send_invoice`. This field can be updated only on `draft` invoices.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"custom_fields\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"name\": {\n                              \"maxLength\": 40,\n                              \"type\": \"string\"\n                            },\n                            \"value\": {\n                              \"maxLength\": 140,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"name\", \"value\"],\n                          \"title\": \"custom_field_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of up to 4 custom fields to be displayed on the invoice. If a value for `custom_fields` is specified, the list specified will replace the existing custom field list on this invoice. Pass an empty string to remove previously-defined fields.\"\n                  },\n                  \"days_until_due\": {\n                    \"description\": \"The number of days from which the invoice is created until it is due. Only valid for invoices where `collection_method=send_invoice`. This field can only be updated on `draft` invoices.\",\n                    \"type\": \"integer\"\n                  },\n                  \"default_payment_method\": {\n                    \"description\": \"ID of the default payment method for the invoice. It must belong to the customer associated with the invoice. If not set, defaults to the subscription's default payment method, if any, or to the default payment method in the customer's invoice settings.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_source\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"ID of the default payment source for the invoice. It must belong to the customer associated with the invoice and be in a chargeable state. If not set, defaults to the subscription's default source, if any, or to the customer's default source.\"\n                  },\n                  \"default_tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates that will apply to any line item that does not have `tax_rates` set. Pass an empty string to remove previously-defined tax rates.\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users. Referenced as 'memo' in the Dashboard.\",\n                    \"maxLength\": 1500,\n                    \"type\": \"string\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The discounts that will apply to the invoice. Pass an empty string to remove previously-defined discounts.\"\n                  },\n                  \"due_date\": {\n                    \"description\": \"The date on which payment for this invoice is due. Only valid for invoices where `collection_method=send_invoice`. This field can only be updated on `draft` invoices.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"effective_at\": {\n                    \"anyOf\": [\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The date when this invoice is in effect. Same as `finalized_at` unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the invoice PDF and receipt.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"footer\": {\n                    \"description\": \"Footer to be displayed on the invoice.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"issuer\": {\n                    \"description\": \"The connected account that issues the invoice. The invoice is presented with the branding and support information of the specified account.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"account\", \"self\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"number\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 26,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set the number for this invoice. If no number is present then a number will be assigned automatically when the invoice is finalized. In many markets, regulations require invoices to be unique, sequential and / or gapless. You are responsible for ensuring this is true across all your different invoicing systems in the event that you edit the invoice number using our API. If you use only Stripe for your invoices and do not change invoice numbers, Stripe handles this aspect of compliance for you automatically.\"\n                  },\n                  \"on_behalf_of\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the [Invoices with Connect](https://stripe.com/docs/billing/invoices/connect) documentation for details.\"\n                  },\n                  \"payment_settings\": {\n                    \"description\": \"Configuration settings for the PaymentIntent that is generated when the invoice is finalized.\",\n                    \"properties\": {\n                      \"default_mandate\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"payment_method_options\": {\n                        \"properties\": {\n                          \"acss_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"transaction_type\": {\n                                        \"enum\": [\"business\", \"personal\"],\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"bancontact\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"preferred_language\": {\n                                    \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"card\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"installments\": {\n                                    \"properties\": {\n                                      \"enabled\": {\n                                        \"type\": \"boolean\"\n                                      },\n                                      \"plan\": {\n                                        \"anyOf\": [\n                                          {\n                                            \"properties\": {\n                                              \"count\": {\n                                                \"type\": \"integer\"\n                                              },\n                                              \"interval\": {\n                                                \"enum\": [\"month\"],\n                                                \"type\": \"string\"\n                                              },\n                                              \"type\": {\n                                                \"enum\": [\"fixed_count\"],\n                                                \"type\": \"string\",\n                                                \"x-stripeBypassValidation\": true\n                                              }\n                                            },\n                                            \"required\": [\"type\"],\n                                            \"title\": \"installment_plan\",\n                                            \"type\": \"object\"\n                                          },\n                                          {\n                                            \"enum\": [\"\"],\n                                            \"type\": \"string\"\n                                          }\n                                        ]\n                                      }\n                                    },\n                                    \"title\": \"installments_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"request_three_d_secure\": {\n                                    \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"customer_balance\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"bank_transfer\": {\n                                    \"properties\": {\n                                      \"eu_bank_transfer\": {\n                                        \"properties\": {\n                                          \"country\": {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          }\n                                        },\n                                        \"required\": [\"country\"],\n                                        \"title\": \"eu_bank_transfer_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"type\": {\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"bank_transfer_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"funding_type\": {\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"konbini\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"sepa_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"us_bank_account\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"financial_connections\": {\n                                    \"properties\": {\n                                      \"filters\": {\n                                        \"properties\": {\n                                          \"account_subcategories\": {\n                                            \"items\": {\n                                              \"enum\": [\"checking\", \"savings\"],\n                                              \"type\": \"string\"\n                                            },\n                                            \"type\": \"array\"\n                                          }\n                                        },\n                                        \"title\": \"invoice_linked_account_options_filters_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"permissions\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"payment_method\",\n                                            \"transactions\"\n                                          ],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"prefetch\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"transactions\"\n                                          ],\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"invoice_linked_account_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"payment_method_options\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_types\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"enum\": [\n                                \"ach_credit_transfer\",\n                                \"ach_debit\",\n                                \"acss_debit\",\n                                \"amazon_pay\",\n                                \"au_becs_debit\",\n                                \"bacs_debit\",\n                                \"bancontact\",\n                                \"boleto\",\n                                \"card\",\n                                \"cashapp\",\n                                \"customer_balance\",\n                                \"eps\",\n                                \"fpx\",\n                                \"giropay\",\n                                \"grabpay\",\n                                \"ideal\",\n                                \"jp_credit_transfer\",\n                                \"kakao_pay\",\n                                \"konbini\",\n                                \"kr_card\",\n                                \"link\",\n                                \"multibanco\",\n                                \"naver_pay\",\n                                \"p24\",\n                                \"payco\",\n                                \"paynow\",\n                                \"paypal\",\n                                \"promptpay\",\n                                \"revolut_pay\",\n                                \"sepa_credit_transfer\",\n                                \"sepa_debit\",\n                                \"sofort\",\n                                \"swish\",\n                                \"us_bank_account\",\n                                \"wechat_pay\"\n                              ],\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_settings\",\n                    \"type\": \"object\"\n                  },\n                  \"rendering\": {\n                    \"description\": \"The rendering-related settings that control how the invoice is displayed on customer-facing surfaces such as PDF and Hosted Invoice Page.\",\n                    \"properties\": {\n                      \"amount_tax_display\": {\n                        \"enum\": [\"\", \"exclude_tax\", \"include_inclusive_tax\"],\n                        \"type\": \"string\"\n                      },\n                      \"pdf\": {\n                        \"properties\": {\n                          \"page_size\": {\n                            \"enum\": [\"a4\", \"auto\", \"letter\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"rendering_pdf_param\",\n                        \"type\": \"object\"\n                      },\n                      \"template\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"template_version\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"rendering_param\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_cost\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"shipping_rate\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"shipping_rate_data\": {\n                            \"properties\": {\n                              \"delivery_estimate\": {\n                                \"properties\": {\n                                  \"maximum\": {\n                                    \"properties\": {\n                                      \"unit\": {\n                                        \"enum\": [\n                                          \"business_day\",\n                                          \"day\",\n                                          \"hour\",\n                                          \"month\",\n                                          \"week\"\n                                        ],\n                                        \"type\": \"string\"\n                                      },\n                                      \"value\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"unit\", \"value\"],\n                                    \"title\": \"delivery_estimate_bound\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"minimum\": {\n                                    \"properties\": {\n                                      \"unit\": {\n                                        \"enum\": [\n                                          \"business_day\",\n                                          \"day\",\n                                          \"hour\",\n                                          \"month\",\n                                          \"week\"\n                                        ],\n                                        \"type\": \"string\"\n                                      },\n                                      \"value\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"unit\", \"value\"],\n                                    \"title\": \"delivery_estimate_bound\",\n                                    \"type\": \"object\"\n                                  }\n                                },\n                                \"title\": \"delivery_estimate\",\n                                \"type\": \"object\"\n                              },\n                              \"display_name\": {\n                                \"maxLength\": 100,\n                                \"type\": \"string\"\n                              },\n                              \"fixed_amount\": {\n                                \"properties\": {\n                                  \"amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"currency\": {\n                                    \"format\": \"currency\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"currency_options\": {\n                                    \"additionalProperties\": {\n                                      \"properties\": {\n                                        \"amount\": {\n                                          \"type\": \"integer\"\n                                        },\n                                        \"tax_behavior\": {\n                                          \"enum\": [\n                                            \"exclusive\",\n                                            \"inclusive\",\n                                            \"unspecified\"\n                                          ],\n                                          \"type\": \"string\"\n                                        }\n                                      },\n                                      \"required\": [\"amount\"],\n                                      \"title\": \"currency_option\",\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"object\"\n                                  }\n                                },\n                                \"required\": [\"amount\", \"currency\"],\n                                \"title\": \"fixed_amount\",\n                                \"type\": \"object\"\n                              },\n                              \"metadata\": {\n                                \"additionalProperties\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"object\"\n                              },\n                              \"tax_behavior\": {\n                                \"enum\": [\n                                  \"exclusive\",\n                                  \"inclusive\",\n                                  \"unspecified\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"tax_code\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"fixed_amount\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"display_name\"],\n                            \"title\": \"method_params\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"shipping_cost\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Settings for the cost of shipping for this invoice.\"\n                  },\n                  \"shipping_details\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"optional_fields_address\",\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"required\": [\"address\", \"name\"],\n                        \"title\": \"recipient_shipping_with_optional_fields_address\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Shipping details for the invoice. The Invoice PDF will use the `shipping_details` value if it is set, otherwise the PDF will render the shipping address from the customer.\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Extra information about a charge for the customer's credit card statement. It must contain at least one letter. If not specified and this invoice is part of a subscription, the default `statement_descriptor` will be set to the first subscription item's product's `statement_descriptor`.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"If specified, the funds from the invoice will be transferred to the destination and the ID of the resulting transfer will be found on the invoice's charge. This will be unset if you POST an empty value.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an invoice\"\n      }\n    },\n    \"/v1/invoices/{invoice}/add_lines\": {\n      \"post\": {\n        \"description\": \"<p>Adds multiple line items to an invoice. This is only possible when an invoice is still a draft.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceAddLines\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"lines\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"lines\": {\n                    \"description\": \"The line items to add.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"description\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"discountable\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"invoice_item\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"metadata\": {\n                          \"anyOf\": [\n                            {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"period\": {\n                          \"properties\": {\n                            \"end\": {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            },\n                            \"start\": {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"end\", \"start\"],\n                          \"title\": \"period\",\n                          \"type\": \"object\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"product_data\": {\n                              \"properties\": {\n                                \"description\": {\n                                  \"maxLength\": 40000,\n                                  \"type\": \"string\"\n                                },\n                                \"images\": {\n                                  \"items\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                \"metadata\": {\n                                  \"additionalProperties\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"object\"\n                                },\n                                \"name\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"tax_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"name\"],\n                              \"title\": \"product_data\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\"],\n                          \"title\": \"one_time_price_data_with_product_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_amounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"tax_rate_data\": {\n                                    \"properties\": {\n                                      \"country\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"description\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"display_name\": {\n                                        \"maxLength\": 100,\n                                        \"type\": \"string\"\n                                      },\n                                      \"inclusive\": {\n                                        \"type\": \"boolean\"\n                                      },\n                                      \"jurisdiction\": {\n                                        \"maxLength\": 200,\n                                        \"type\": \"string\"\n                                      },\n                                      \"percentage\": {\n                                        \"type\": \"number\"\n                                      },\n                                      \"state\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"tax_type\": {\n                                        \"enum\": [\n                                          \"amusement_tax\",\n                                          \"communications_tax\",\n                                          \"gst\",\n                                          \"hst\",\n                                          \"igst\",\n                                          \"jct\",\n                                          \"lease_tax\",\n                                          \"pst\",\n                                          \"qst\",\n                                          \"retail_delivery_fee\",\n                                          \"rst\",\n                                          \"sales_tax\",\n                                          \"service_tax\",\n                                          \"vat\"\n                                        ],\n                                        \"type\": \"string\",\n                                        \"x-stripeBypassValidation\": true\n                                      }\n                                    },\n                                    \"required\": [\n                                      \"display_name\",\n                                      \"inclusive\",\n                                      \"percentage\"\n                                    ],\n                                    \"title\": \"tax_rate_data_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"taxable_amount\": {\n                                    \"type\": \"integer\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"amount\",\n                                  \"tax_rate_data\",\n                                  \"taxable_amount\"\n                                ],\n                                \"title\": \"tax_amount_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"lines_data_param\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"lines\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Bulk add invoice line items\"\n      }\n    },\n    \"/v1/invoices/{invoice}/finalize\": {\n      \"post\": {\n        \"description\": \"<p>Stripe automatically finalizes drafts before sending and attempting payment on invoices. However, if you’d like to finalize a draft invoice manually, you can do so using this method.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceFinalize\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"auto_advance\": {\n                    \"description\": \"Controls whether Stripe performs [automatic collection](https://stripe.com/docs/invoicing/integration/automatic-advancement-collection) of the invoice. If `false`, the invoice's state doesn't automatically advance without an explicit action.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Finalize an invoice\"\n      }\n    },\n    \"/v1/invoices/{invoice}/lines\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving an invoice, you’ll get a <strong>lines</strong> property containing the total count of line items and the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.</p>\",\n        \"operationId\": \"GetInvoicesInvoiceLines\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/line_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"InvoiceLinesList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an invoice's line items\"\n      }\n    },\n    \"/v1/invoices/{invoice}/lines/{line_item_id}\": {\n      \"post\": {\n        \"description\": \"<p>Updates an invoice’s line item. Some fields, such as <code>tax_amounts</code>, only live on the invoice line item,\\nso they can only be updated through this endpoint. Other fields, such as <code>amount</code>, live on both the invoice\\nitem and the invoice line item, so updates on this endpoint will propagate to the invoice item as well.\\nUpdating an invoice’s line item is only possible before the invoice is finalized.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceLinesLineItemId\",\n        \"parameters\": [\n          {\n            \"description\": \"Invoice ID of line item\",\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Invoice line item ID\",\n            \"in\": \"path\",\n            \"name\": \"line_item_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"period\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"price_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_amounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The integer amount in cents (or local equivalent) of the charge to be applied to the upcoming invoice. If you want to apply a credit to the customer's account, pass a negative amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string which you can attach to the invoice item. The description is displayed in the invoice for easy tracking.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"discountable\": {\n                    \"description\": \"Controls whether discounts apply to this line item. Defaults to false for prorations or negative line items, and true for all other line items. Cannot be set to true for prorations.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons, promotion codes & existing discounts which apply to the line item. Item discounts are applied before invoice discounts. Pass an empty string to remove previously-defined discounts.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`. For [type=subscription](https://stripe.com/docs/api/invoices/line_item#invoice_line_item_object-type) line items, the incoming metadata specified on the request is directly used to set this value, in contrast to [type=invoiceitem](api/invoices/line_item#invoice_line_item_object-type) line items, where any existing metadata on the invoice line is merged with the incoming data.\"\n                  },\n                  \"period\": {\n                    \"description\": \"The period associated with this invoice item. When set to different values, the period will be rendered on the invoice. If you have [Stripe Revenue Recognition](https://stripe.com/docs/revenue-recognition) enabled, the period will be used to recognize and defer revenue. See the [Revenue Recognition documentation](https://stripe.com/docs/revenue-recognition/methodology/subscriptions-and-invoicing) for details.\",\n                    \"properties\": {\n                      \"end\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"start\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"end\", \"start\"],\n                    \"title\": \"period\",\n                    \"type\": \"object\"\n                  },\n                  \"price\": {\n                    \"description\": \"The ID of the price object. One of `price` or `price_data` is required.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"description\": \"Data used to generate a new [Price](https://stripe.com/docs/api/prices) object inline. One of `price` or `price_data` is required.\",\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"product_data\": {\n                        \"properties\": {\n                          \"description\": {\n                            \"maxLength\": 40000,\n                            \"type\": \"string\"\n                          },\n                          \"images\": {\n                            \"items\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"tax_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"name\"],\n                        \"title\": \"product_data\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\"],\n                    \"title\": \"one_time_price_data_with_product_data\",\n                    \"type\": \"object\"\n                  },\n                  \"quantity\": {\n                    \"description\": \"Non-negative integer. The quantity of units for the line item.\",\n                    \"type\": \"integer\"\n                  },\n                  \"tax_amounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_rate_data\": {\n                              \"properties\": {\n                                \"country\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"description\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"display_name\": {\n                                  \"maxLength\": 100,\n                                  \"type\": \"string\"\n                                },\n                                \"inclusive\": {\n                                  \"type\": \"boolean\"\n                                },\n                                \"jurisdiction\": {\n                                  \"maxLength\": 200,\n                                  \"type\": \"string\"\n                                },\n                                \"percentage\": {\n                                  \"type\": \"number\"\n                                },\n                                \"state\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"tax_type\": {\n                                  \"enum\": [\n                                    \"amusement_tax\",\n                                    \"communications_tax\",\n                                    \"gst\",\n                                    \"hst\",\n                                    \"igst\",\n                                    \"jct\",\n                                    \"lease_tax\",\n                                    \"pst\",\n                                    \"qst\",\n                                    \"retail_delivery_fee\",\n                                    \"rst\",\n                                    \"sales_tax\",\n                                    \"service_tax\",\n                                    \"vat\"\n                                  ],\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                }\n                              },\n                              \"required\": [\n                                \"display_name\",\n                                \"inclusive\",\n                                \"percentage\"\n                              ],\n                              \"title\": \"tax_rate_data_param\",\n                              \"type\": \"object\"\n                            },\n                            \"taxable_amount\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\n                            \"amount\",\n                            \"tax_rate_data\",\n                            \"taxable_amount\"\n                          ],\n                          \"title\": \"tax_amount_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of up to 10 tax amounts for this line item. This can be useful if you calculate taxes on your own or use a third-party to calculate them. You cannot set tax amounts if any line item has [tax_rates](https://stripe.com/docs/api/invoices/line_item#invoice_line_item_object-tax_rates) or if the invoice has [default_tax_rates](https://stripe.com/docs/api/invoices/object#invoice_object-default_tax_rates) or uses [automatic tax](https://stripe.com/docs/tax/invoicing). Pass an empty string to remove previously defined tax amounts.\"\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates which apply to the line item. When set, the `default_tax_rates` on the invoice do not apply to this line item. Pass an empty string to remove previously-defined tax rates.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/line_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an invoice's line item\"\n      }\n    },\n    \"/v1/invoices/{invoice}/mark_uncollectible\": {\n      \"post\": {\n        \"description\": \"<p>Marking an invoice as uncollectible is useful for keeping track of bad debts that can be written off for accounting purposes.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceMarkUncollectible\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Mark an invoice as uncollectible\"\n      }\n    },\n    \"/v1/invoices/{invoice}/pay\": {\n      \"post\": {\n        \"description\": \"<p>Stripe automatically creates and then attempts to collect payment on invoices for customers on subscriptions according to your <a href=\\\"https://dashboard.stripe.com/account/billing/automatic\\\">subscriptions settings</a>. However, if you’d like to attempt payment on an invoice out of the normal collection schedule or for some other reason, you can do so.</p>\",\n        \"operationId\": \"PostInvoicesInvoicePay\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mandate\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"forgive\": {\n                    \"description\": \"In cases where the source used to pay the invoice has insufficient funds, passing `forgive=true` controls whether a charge should be attempted for the full amount available on the source, up to the amount to fully pay the invoice. This effectively forgives the difference between the amount available on the source and the amount due. \\n\\nPassing `forgive=false` will fail the charge if the source hasn't been pre-funded with the right amount. An example for this case is with ACH Credit Transfers and wires: if the amount wired is less than the amount due by a small amount, you might want to forgive the difference. Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"mandate\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"ID of the mandate to be used for this invoice. It must correspond to the payment method used to pay the invoice, including the payment_method param or the invoice's default_payment_method or default_source, if set.\"\n                  },\n                  \"off_session\": {\n                    \"description\": \"Indicates if a customer is on or off-session while an invoice payment is attempted. Defaults to `true` (off-session).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"paid_out_of_band\": {\n                    \"description\": \"Boolean representing whether an invoice is paid outside of Stripe. This will result in no charge being made. Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"A PaymentMethod to be charged. The PaymentMethod must be the ID of a PaymentMethod belonging to the customer associated with the invoice being paid.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"source\": {\n                    \"description\": \"A payment source to be charged. The source must be the ID of a source belonging to the customer associated with the invoice being paid.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Pay an invoice\"\n      }\n    },\n    \"/v1/invoices/{invoice}/remove_lines\": {\n      \"post\": {\n        \"description\": \"<p>Removes multiple line items from an invoice. This is only possible when an invoice is still a draft.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceRemoveLines\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"lines\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"lines\": {\n                    \"description\": \"The line items to remove.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"behavior\": {\n                          \"enum\": [\"delete\", \"unassign\"],\n                          \"type\": \"string\"\n                        },\n                        \"id\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"behavior\", \"id\"],\n                      \"title\": \"lines_data_param\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"lines\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Bulk remove invoice line items\"\n      }\n    },\n    \"/v1/invoices/{invoice}/send\": {\n      \"post\": {\n        \"description\": \"<p>Stripe will automatically send invoices to customers according to your <a href=\\\"https://dashboard.stripe.com/account/billing/automatic\\\">subscriptions settings</a>. However, if you’d like to manually send an invoice to your customer out of the normal schedule, you can do so. When sending invoices that have already been paid, there will be no reference to the payment in the email.</p>\\n\\n<p>Requests made in test-mode result in no emails being sent, despite sending an <code>invoice.sent</code> event.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceSend\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Send an invoice for manual payment\"\n      }\n    },\n    \"/v1/invoices/{invoice}/update_lines\": {\n      \"post\": {\n        \"description\": \"<p>Updates multiple line items on an invoice. This is only possible when an invoice is still a draft.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceUpdateLines\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"lines\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`. For [type=subscription](https://stripe.com/docs/api/invoices/line_item#invoice_line_item_object-type) line items, the incoming metadata specified on the request is directly used to set this value, in contrast to [type=invoiceitem](api/invoices/line_item#invoice_line_item_object-type) line items, where any existing metadata on the invoice line is merged with the incoming data.\"\n                  },\n                  \"lines\": {\n                    \"description\": \"The line items to update.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"description\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"discountable\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"id\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"metadata\": {\n                          \"anyOf\": [\n                            {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"period\": {\n                          \"properties\": {\n                            \"end\": {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            },\n                            \"start\": {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"end\", \"start\"],\n                          \"title\": \"period\",\n                          \"type\": \"object\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"product_data\": {\n                              \"properties\": {\n                                \"description\": {\n                                  \"maxLength\": 40000,\n                                  \"type\": \"string\"\n                                },\n                                \"images\": {\n                                  \"items\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                \"metadata\": {\n                                  \"additionalProperties\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"object\"\n                                },\n                                \"name\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"tax_code\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"name\"],\n                              \"title\": \"product_data\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\"],\n                          \"title\": \"one_time_price_data_with_product_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_amounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"tax_rate_data\": {\n                                    \"properties\": {\n                                      \"country\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"description\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"display_name\": {\n                                        \"maxLength\": 100,\n                                        \"type\": \"string\"\n                                      },\n                                      \"inclusive\": {\n                                        \"type\": \"boolean\"\n                                      },\n                                      \"jurisdiction\": {\n                                        \"maxLength\": 200,\n                                        \"type\": \"string\"\n                                      },\n                                      \"percentage\": {\n                                        \"type\": \"number\"\n                                      },\n                                      \"state\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      \"tax_type\": {\n                                        \"enum\": [\n                                          \"amusement_tax\",\n                                          \"communications_tax\",\n                                          \"gst\",\n                                          \"hst\",\n                                          \"igst\",\n                                          \"jct\",\n                                          \"lease_tax\",\n                                          \"pst\",\n                                          \"qst\",\n                                          \"retail_delivery_fee\",\n                                          \"rst\",\n                                          \"sales_tax\",\n                                          \"service_tax\",\n                                          \"vat\"\n                                        ],\n                                        \"type\": \"string\",\n                                        \"x-stripeBypassValidation\": true\n                                      }\n                                    },\n                                    \"required\": [\n                                      \"display_name\",\n                                      \"inclusive\",\n                                      \"percentage\"\n                                    ],\n                                    \"title\": \"tax_rate_data_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"taxable_amount\": {\n                                    \"type\": \"integer\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"amount\",\n                                  \"tax_rate_data\",\n                                  \"taxable_amount\"\n                                ],\n                                \"title\": \"tax_amount_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"required\": [\"id\"],\n                      \"title\": \"lines_data_param\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"lines\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Bulk update invoice line items\"\n      }\n    },\n    \"/v1/invoices/{invoice}/void\": {\n      \"post\": {\n        \"description\": \"<p>Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is similar to <a href=\\\"#delete_invoice\\\">deletion</a>, however it only applies to finalized invoices and maintains a papertrail where the invoice can still be found.</p>\\n\\n<p>Consult with local regulations to determine whether and how an invoice might be amended, canceled, or voided in the jurisdiction you’re doing business in. You might need to <a href=\\\"#create_invoice\\\">issue another invoice</a> or <a href=\\\"#create_credit_note\\\">credit note</a> instead. Stripe recommends that you consult with your legal counsel for advice specific to your business.</p>\",\n        \"operationId\": \"PostInvoicesInvoiceVoid\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"invoice\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/invoice\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Void an invoice\"\n      }\n    },\n    \"/v1/issuing/authorizations\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Issuing <code>Authorization</code> objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetIssuingAuthorizations\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return authorizations that belong to the given card.\",\n            \"in\": \"query\",\n            \"name\": \"card\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return authorizations that belong to the given cardholder.\",\n            \"in\": \"query\",\n            \"name\": \"cardholder\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return authorizations that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return authorizations with the given status. One of `pending`, `closed`, or `reversed`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"closed\", \"pending\", \"reversed\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.authorization\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/issuing/authorizations\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingAuthorizationList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all authorizations\"\n      }\n    },\n    \"/v1/issuing/authorizations/{authorization}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an Issuing <code>Authorization</code> object.</p>\",\n        \"operationId\": \"GetIssuingAuthorizationsAuthorization\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an authorization\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified Issuing <code>Authorization</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostIssuingAuthorizationsAuthorization\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update an authorization\"\n      }\n    },\n    \"/v1/issuing/authorizations/{authorization}/approve\": {\n      \"post\": {\n        \"deprecated\": true,\n        \"description\": \"<p>[Deprecated] Approves a pending Issuing <code>Authorization</code> object. This request should be made within the timeout window of the <a href=\\\"/docs/issuing/controls/real-time-authorizations\\\">real-time authorization</a> flow. \\nThis method is deprecated. Instead, <a href=\\\"/docs/issuing/controls/real-time-authorizations#authorization-handling\\\">respond directly to the webhook request to approve an authorization</a>.</p>\",\n        \"operationId\": \"PostIssuingAuthorizationsAuthorizationApprove\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"If the authorization's `pending_request.is_amount_controllable` property is `true`, you may provide this value to control how much to hold for the authorization. Must be positive (use [`decline`](https://stripe.com/docs/api/issuing/authorizations/decline) to decline an authorization request).\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Approve an authorization\"\n      }\n    },\n    \"/v1/issuing/authorizations/{authorization}/decline\": {\n      \"post\": {\n        \"deprecated\": true,\n        \"description\": \"<p>[Deprecated] Declines a pending Issuing <code>Authorization</code> object. This request should be made within the timeout window of the <a href=\\\"/docs/issuing/controls/real-time-authorizations\\\">real time authorization</a> flow.\\nThis method is deprecated. Instead, <a href=\\\"/docs/issuing/controls/real-time-authorizations#authorization-handling\\\">respond directly to the webhook request to decline an authorization</a>.</p>\",\n        \"operationId\": \"PostIssuingAuthorizationsAuthorizationDecline\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Decline an authorization\"\n      }\n    },\n    \"/v1/issuing/cardholders\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Issuing <code>Cardholder</code> objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetIssuingCardholders\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return cardholders that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return cardholders that have the given email address.\",\n            \"in\": \"query\",\n            \"name\": \"email\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cardholders that have the given phone number.\",\n            \"in\": \"query\",\n            \"name\": \"phone_number\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cardholders that have the given status. One of `active`, `inactive`, or `blocked`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"blocked\", \"inactive\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cardholders that have the given type. One of `individual` or `company`.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"company\", \"individual\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.cardholder\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/issuing/cardholders\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingCardholderList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all cardholders\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new Issuing <code>Cardholder</code> object that can be issued cards.</p>\",\n        \"operationId\": \"PostIssuingCardholders\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"billing\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"company\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"individual\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"preferred_locales\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"spending_controls\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"billing\": {\n                    \"description\": \"The cardholder's billing address.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"city\", \"country\", \"line1\", \"postal_code\"],\n                        \"title\": \"required_address\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"address\"],\n                    \"title\": \"billing_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"company\": {\n                    \"description\": \"Additional information about a `company` cardholder.\",\n                    \"properties\": {\n                      \"tax_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"company_param\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The cardholder's email address.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"individual\": {\n                    \"description\": \"Additional information about an `individual` cardholder.\",\n                    \"properties\": {\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"user_terms_acceptance\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"terms_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"card_issuing_param\",\n                        \"type\": \"object\"\n                      },\n                      \"dob\": {\n                        \"properties\": {\n                          \"day\": {\n                            \"type\": \"integer\"\n                          },\n                          \"month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"year\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"day\", \"month\", \"year\"],\n                        \"title\": \"date_of_birth_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"first_name\": {\n                        \"type\": \"string\"\n                      },\n                      \"last_name\": {\n                        \"type\": \"string\"\n                      },\n                      \"verification\": {\n                        \"properties\": {\n                          \"document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"person_verification_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"individual_param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"The cardholder's name. This will be printed on cards issued to them. The maximum length of this field is 24 characters. This field cannot contain any special characters or numbers.\",\n                    \"type\": \"string\"\n                  },\n                  \"phone_number\": {\n                    \"description\": \"The cardholder's phone number. This will be transformed to [E.164](https://en.wikipedia.org/wiki/E.164) if it is not provided in that format already. This is required for all cardholders who will be creating EU cards. See the [3D Secure documentation](https://stripe.com/docs/issuing/3d-secure#when-is-3d-secure-applied) for more details.\",\n                    \"type\": \"string\"\n                  },\n                  \"preferred_locales\": {\n                    \"description\": \"The cardholder’s preferred locales (languages), ordered by preference. Locales can be `de`, `en`, `es`, `fr`, or `it`.\\n This changes the language of the [3D Secure flow](https://stripe.com/docs/issuing/3d-secure) and one-time password messages sent to the cardholder.\",\n                    \"items\": {\n                      \"enum\": [\"de\", \"en\", \"es\", \"fr\", \"it\"],\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"spending_controls\": {\n                    \"description\": \"Rules that control spending across this cardholder's cards. Refer to our [documentation](https://stripe.com/docs/issuing/controls/spending-controls) for more details.\",\n                    \"properties\": {\n                      \"allowed_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"allowed_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"spending_limits\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"categories\": {\n                              \"items\": {\n                                \"enum\": [\n                                  \"ac_refrigeration_repair\",\n                                  \"accounting_bookkeeping_services\",\n                                  \"advertising_services\",\n                                  \"agricultural_cooperative\",\n                                  \"airlines_air_carriers\",\n                                  \"airports_flying_fields\",\n                                  \"ambulance_services\",\n                                  \"amusement_parks_carnivals\",\n                                  \"antique_reproductions\",\n                                  \"antique_shops\",\n                                  \"aquariums\",\n                                  \"architectural_surveying_services\",\n                                  \"art_dealers_and_galleries\",\n                                  \"artists_supply_and_craft_shops\",\n                                  \"auto_and_home_supply_stores\",\n                                  \"auto_body_repair_shops\",\n                                  \"auto_paint_shops\",\n                                  \"auto_service_shops\",\n                                  \"automated_cash_disburse\",\n                                  \"automated_fuel_dispensers\",\n                                  \"automobile_associations\",\n                                  \"automotive_parts_and_accessories_stores\",\n                                  \"automotive_tire_stores\",\n                                  \"bail_and_bond_payments\",\n                                  \"bakeries\",\n                                  \"bands_orchestras\",\n                                  \"barber_and_beauty_shops\",\n                                  \"betting_casino_gambling\",\n                                  \"bicycle_shops\",\n                                  \"billiard_pool_establishments\",\n                                  \"boat_dealers\",\n                                  \"boat_rentals_and_leases\",\n                                  \"book_stores\",\n                                  \"books_periodicals_and_newspapers\",\n                                  \"bowling_alleys\",\n                                  \"bus_lines\",\n                                  \"business_secretarial_schools\",\n                                  \"buying_shopping_services\",\n                                  \"cable_satellite_and_other_pay_television_and_radio\",\n                                  \"camera_and_photographic_supply_stores\",\n                                  \"candy_nut_and_confectionery_stores\",\n                                  \"car_and_truck_dealers_new_used\",\n                                  \"car_and_truck_dealers_used_only\",\n                                  \"car_rental_agencies\",\n                                  \"car_washes\",\n                                  \"carpentry_services\",\n                                  \"carpet_upholstery_cleaning\",\n                                  \"caterers\",\n                                  \"charitable_and_social_service_organizations_fundraising\",\n                                  \"chemicals_and_allied_products\",\n                                  \"child_care_services\",\n                                  \"childrens_and_infants_wear_stores\",\n                                  \"chiropodists_podiatrists\",\n                                  \"chiropractors\",\n                                  \"cigar_stores_and_stands\",\n                                  \"civic_social_fraternal_associations\",\n                                  \"cleaning_and_maintenance\",\n                                  \"clothing_rental\",\n                                  \"colleges_universities\",\n                                  \"commercial_equipment\",\n                                  \"commercial_footwear\",\n                                  \"commercial_photography_art_and_graphics\",\n                                  \"commuter_transport_and_ferries\",\n                                  \"computer_network_services\",\n                                  \"computer_programming\",\n                                  \"computer_repair\",\n                                  \"computer_software_stores\",\n                                  \"computers_peripherals_and_software\",\n                                  \"concrete_work_services\",\n                                  \"construction_materials\",\n                                  \"consulting_public_relations\",\n                                  \"correspondence_schools\",\n                                  \"cosmetic_stores\",\n                                  \"counseling_services\",\n                                  \"country_clubs\",\n                                  \"courier_services\",\n                                  \"court_costs\",\n                                  \"credit_reporting_agencies\",\n                                  \"cruise_lines\",\n                                  \"dairy_products_stores\",\n                                  \"dance_hall_studios_schools\",\n                                  \"dating_escort_services\",\n                                  \"dentists_orthodontists\",\n                                  \"department_stores\",\n                                  \"detective_agencies\",\n                                  \"digital_goods_applications\",\n                                  \"digital_goods_games\",\n                                  \"digital_goods_large_volume\",\n                                  \"digital_goods_media\",\n                                  \"direct_marketing_catalog_merchant\",\n                                  \"direct_marketing_combination_catalog_and_retail_merchant\",\n                                  \"direct_marketing_inbound_telemarketing\",\n                                  \"direct_marketing_insurance_services\",\n                                  \"direct_marketing_other\",\n                                  \"direct_marketing_outbound_telemarketing\",\n                                  \"direct_marketing_subscription\",\n                                  \"direct_marketing_travel\",\n                                  \"discount_stores\",\n                                  \"doctors\",\n                                  \"door_to_door_sales\",\n                                  \"drapery_window_covering_and_upholstery_stores\",\n                                  \"drinking_places\",\n                                  \"drug_stores_and_pharmacies\",\n                                  \"drugs_drug_proprietaries_and_druggist_sundries\",\n                                  \"dry_cleaners\",\n                                  \"durable_goods\",\n                                  \"duty_free_stores\",\n                                  \"eating_places_restaurants\",\n                                  \"educational_services\",\n                                  \"electric_razor_stores\",\n                                  \"electric_vehicle_charging\",\n                                  \"electrical_parts_and_equipment\",\n                                  \"electrical_services\",\n                                  \"electronics_repair_shops\",\n                                  \"electronics_stores\",\n                                  \"elementary_secondary_schools\",\n                                  \"emergency_services_gcas_visa_use_only\",\n                                  \"employment_temp_agencies\",\n                                  \"equipment_rental\",\n                                  \"exterminating_services\",\n                                  \"family_clothing_stores\",\n                                  \"fast_food_restaurants\",\n                                  \"financial_institutions\",\n                                  \"fines_government_administrative_entities\",\n                                  \"fireplace_fireplace_screens_and_accessories_stores\",\n                                  \"floor_covering_stores\",\n                                  \"florists\",\n                                  \"florists_supplies_nursery_stock_and_flowers\",\n                                  \"freezer_and_locker_meat_provisioners\",\n                                  \"fuel_dealers_non_automotive\",\n                                  \"funeral_services_crematories\",\n                                  \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                                  \"furniture_repair_refinishing\",\n                                  \"furriers_and_fur_shops\",\n                                  \"general_services\",\n                                  \"gift_card_novelty_and_souvenir_shops\",\n                                  \"glass_paint_and_wallpaper_stores\",\n                                  \"glassware_crystal_stores\",\n                                  \"golf_courses_public\",\n                                  \"government_licensed_horse_dog_racing_us_region_only\",\n                                  \"government_licensed_online_casions_online_gambling_us_region_only\",\n                                  \"government_owned_lotteries_non_us_region\",\n                                  \"government_owned_lotteries_us_region_only\",\n                                  \"government_services\",\n                                  \"grocery_stores_supermarkets\",\n                                  \"hardware_equipment_and_supplies\",\n                                  \"hardware_stores\",\n                                  \"health_and_beauty_spas\",\n                                  \"hearing_aids_sales_and_supplies\",\n                                  \"heating_plumbing_a_c\",\n                                  \"hobby_toy_and_game_shops\",\n                                  \"home_supply_warehouse_stores\",\n                                  \"hospitals\",\n                                  \"hotels_motels_and_resorts\",\n                                  \"household_appliance_stores\",\n                                  \"industrial_supplies\",\n                                  \"information_retrieval_services\",\n                                  \"insurance_default\",\n                                  \"insurance_underwriting_premiums\",\n                                  \"intra_company_purchases\",\n                                  \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                                  \"landscaping_services\",\n                                  \"laundries\",\n                                  \"laundry_cleaning_services\",\n                                  \"legal_services_attorneys\",\n                                  \"luggage_and_leather_goods_stores\",\n                                  \"lumber_building_materials_stores\",\n                                  \"manual_cash_disburse\",\n                                  \"marinas_service_and_supplies\",\n                                  \"marketplaces\",\n                                  \"masonry_stonework_and_plaster\",\n                                  \"massage_parlors\",\n                                  \"medical_and_dental_labs\",\n                                  \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                                  \"medical_services\",\n                                  \"membership_organizations\",\n                                  \"mens_and_boys_clothing_and_accessories_stores\",\n                                  \"mens_womens_clothing_stores\",\n                                  \"metal_service_centers\",\n                                  \"miscellaneous\",\n                                  \"miscellaneous_apparel_and_accessory_shops\",\n                                  \"miscellaneous_auto_dealers\",\n                                  \"miscellaneous_business_services\",\n                                  \"miscellaneous_food_stores\",\n                                  \"miscellaneous_general_merchandise\",\n                                  \"miscellaneous_general_services\",\n                                  \"miscellaneous_home_furnishing_specialty_stores\",\n                                  \"miscellaneous_publishing_and_printing\",\n                                  \"miscellaneous_recreation_services\",\n                                  \"miscellaneous_repair_shops\",\n                                  \"miscellaneous_specialty_retail\",\n                                  \"mobile_home_dealers\",\n                                  \"motion_picture_theaters\",\n                                  \"motor_freight_carriers_and_trucking\",\n                                  \"motor_homes_dealers\",\n                                  \"motor_vehicle_supplies_and_new_parts\",\n                                  \"motorcycle_shops_and_dealers\",\n                                  \"motorcycle_shops_dealers\",\n                                  \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                                  \"news_dealers_and_newsstands\",\n                                  \"non_fi_money_orders\",\n                                  \"non_fi_stored_value_card_purchase_load\",\n                                  \"nondurable_goods\",\n                                  \"nurseries_lawn_and_garden_supply_stores\",\n                                  \"nursing_personal_care\",\n                                  \"office_and_commercial_furniture\",\n                                  \"opticians_eyeglasses\",\n                                  \"optometrists_ophthalmologist\",\n                                  \"orthopedic_goods_prosthetic_devices\",\n                                  \"osteopaths\",\n                                  \"package_stores_beer_wine_and_liquor\",\n                                  \"paints_varnishes_and_supplies\",\n                                  \"parking_lots_garages\",\n                                  \"passenger_railways\",\n                                  \"pawn_shops\",\n                                  \"pet_shops_pet_food_and_supplies\",\n                                  \"petroleum_and_petroleum_products\",\n                                  \"photo_developing\",\n                                  \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                                  \"photographic_studios\",\n                                  \"picture_video_production\",\n                                  \"piece_goods_notions_and_other_dry_goods\",\n                                  \"plumbing_heating_equipment_and_supplies\",\n                                  \"political_organizations\",\n                                  \"postal_services_government_only\",\n                                  \"precious_stones_and_metals_watches_and_jewelry\",\n                                  \"professional_services\",\n                                  \"public_warehousing_and_storage\",\n                                  \"quick_copy_repro_and_blueprint\",\n                                  \"railroads\",\n                                  \"real_estate_agents_and_managers_rentals\",\n                                  \"record_stores\",\n                                  \"recreational_vehicle_rentals\",\n                                  \"religious_goods_stores\",\n                                  \"religious_organizations\",\n                                  \"roofing_siding_sheet_metal\",\n                                  \"secretarial_support_services\",\n                                  \"security_brokers_dealers\",\n                                  \"service_stations\",\n                                  \"sewing_needlework_fabric_and_piece_goods_stores\",\n                                  \"shoe_repair_hat_cleaning\",\n                                  \"shoe_stores\",\n                                  \"small_appliance_repair\",\n                                  \"snowmobile_dealers\",\n                                  \"special_trade_services\",\n                                  \"specialty_cleaning\",\n                                  \"sporting_goods_stores\",\n                                  \"sporting_recreation_camps\",\n                                  \"sports_and_riding_apparel_stores\",\n                                  \"sports_clubs_fields\",\n                                  \"stamp_and_coin_stores\",\n                                  \"stationary_office_supplies_printing_and_writing_paper\",\n                                  \"stationery_stores_office_and_school_supply_stores\",\n                                  \"swimming_pools_sales\",\n                                  \"t_ui_travel_germany\",\n                                  \"tailors_alterations\",\n                                  \"tax_payments_government_agencies\",\n                                  \"tax_preparation_services\",\n                                  \"taxicabs_limousines\",\n                                  \"telecommunication_equipment_and_telephone_sales\",\n                                  \"telecommunication_services\",\n                                  \"telegraph_services\",\n                                  \"tent_and_awning_shops\",\n                                  \"testing_laboratories\",\n                                  \"theatrical_ticket_agencies\",\n                                  \"timeshares\",\n                                  \"tire_retreading_and_repair\",\n                                  \"tolls_bridge_fees\",\n                                  \"tourist_attractions_and_exhibits\",\n                                  \"towing_services\",\n                                  \"trailer_parks_campgrounds\",\n                                  \"transportation_services\",\n                                  \"travel_agencies_tour_operators\",\n                                  \"truck_stop_iteration\",\n                                  \"truck_utility_trailer_rentals\",\n                                  \"typesetting_plate_making_and_related_services\",\n                                  \"typewriter_stores\",\n                                  \"u_s_federal_government_agencies_or_departments\",\n                                  \"uniforms_commercial_clothing\",\n                                  \"used_merchandise_and_secondhand_stores\",\n                                  \"utilities\",\n                                  \"variety_stores\",\n                                  \"veterinary_services\",\n                                  \"video_amusement_game_supplies\",\n                                  \"video_game_arcades\",\n                                  \"video_tape_rental_stores\",\n                                  \"vocational_trade_schools\",\n                                  \"watch_jewelry_repair\",\n                                  \"welding_repair\",\n                                  \"wholesale_clubs\",\n                                  \"wig_and_toupee_stores\",\n                                  \"wires_money_orders\",\n                                  \"womens_accessory_and_specialty_shops\",\n                                  \"womens_ready_to_wear_stores\",\n                                  \"wrecking_and_salvage_yards\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"interval\": {\n                              \"enum\": [\n                                \"all_time\",\n                                \"daily\",\n                                \"monthly\",\n                                \"per_authorization\",\n                                \"weekly\",\n                                \"yearly\"\n                              ],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"amount\", \"interval\"],\n                          \"title\": \"spending_limits_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"spending_limits_currency\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"authorization_controls_param_v2\",\n                    \"type\": \"object\"\n                  },\n                  \"status\": {\n                    \"description\": \"Specifies whether to permit authorizations on this cardholder's cards. Defaults to `active`.\",\n                    \"enum\": [\"active\", \"inactive\"],\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"description\": \"One of `individual` or `company`. See [Choose a cardholder type](https://stripe.com/docs/issuing/other/choose-cardholder) for more details.\",\n                    \"enum\": [\"company\", \"individual\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"required\": [\"billing\", \"name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.cardholder\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a cardholder\"\n      }\n    },\n    \"/v1/issuing/cardholders/{cardholder}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an Issuing <code>Cardholder</code> object.</p>\",\n        \"operationId\": \"GetIssuingCardholdersCardholder\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"cardholder\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.cardholder\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a cardholder\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified Issuing <code>Cardholder</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostIssuingCardholdersCardholder\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"cardholder\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"billing\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"company\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"individual\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"preferred_locales\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"spending_controls\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"billing\": {\n                    \"description\": \"The cardholder's billing address.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"city\", \"country\", \"line1\", \"postal_code\"],\n                        \"title\": \"required_address\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"address\"],\n                    \"title\": \"billing_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"company\": {\n                    \"description\": \"Additional information about a `company` cardholder.\",\n                    \"properties\": {\n                      \"tax_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"company_param\",\n                    \"type\": \"object\"\n                  },\n                  \"email\": {\n                    \"description\": \"The cardholder's email address.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"individual\": {\n                    \"description\": \"Additional information about an `individual` cardholder.\",\n                    \"properties\": {\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"user_terms_acceptance\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"terms_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"card_issuing_param\",\n                        \"type\": \"object\"\n                      },\n                      \"dob\": {\n                        \"properties\": {\n                          \"day\": {\n                            \"type\": \"integer\"\n                          },\n                          \"month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"year\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"day\", \"month\", \"year\"],\n                        \"title\": \"date_of_birth_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"first_name\": {\n                        \"type\": \"string\"\n                      },\n                      \"last_name\": {\n                        \"type\": \"string\"\n                      },\n                      \"verification\": {\n                        \"properties\": {\n                          \"document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"person_verification_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"individual_param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"phone_number\": {\n                    \"description\": \"The cardholder's phone number. This is required for all cardholders who will be creating EU cards. See the [3D Secure documentation](https://stripe.com/docs/issuing/3d-secure) for more details.\",\n                    \"type\": \"string\"\n                  },\n                  \"preferred_locales\": {\n                    \"description\": \"The cardholder’s preferred locales (languages), ordered by preference. Locales can be `de`, `en`, `es`, `fr`, or `it`.\\n This changes the language of the [3D Secure flow](https://stripe.com/docs/issuing/3d-secure) and one-time password messages sent to the cardholder.\",\n                    \"items\": {\n                      \"enum\": [\"de\", \"en\", \"es\", \"fr\", \"it\"],\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"spending_controls\": {\n                    \"description\": \"Rules that control spending across this cardholder's cards. Refer to our [documentation](https://stripe.com/docs/issuing/controls/spending-controls) for more details.\",\n                    \"properties\": {\n                      \"allowed_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"allowed_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"spending_limits\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"categories\": {\n                              \"items\": {\n                                \"enum\": [\n                                  \"ac_refrigeration_repair\",\n                                  \"accounting_bookkeeping_services\",\n                                  \"advertising_services\",\n                                  \"agricultural_cooperative\",\n                                  \"airlines_air_carriers\",\n                                  \"airports_flying_fields\",\n                                  \"ambulance_services\",\n                                  \"amusement_parks_carnivals\",\n                                  \"antique_reproductions\",\n                                  \"antique_shops\",\n                                  \"aquariums\",\n                                  \"architectural_surveying_services\",\n                                  \"art_dealers_and_galleries\",\n                                  \"artists_supply_and_craft_shops\",\n                                  \"auto_and_home_supply_stores\",\n                                  \"auto_body_repair_shops\",\n                                  \"auto_paint_shops\",\n                                  \"auto_service_shops\",\n                                  \"automated_cash_disburse\",\n                                  \"automated_fuel_dispensers\",\n                                  \"automobile_associations\",\n                                  \"automotive_parts_and_accessories_stores\",\n                                  \"automotive_tire_stores\",\n                                  \"bail_and_bond_payments\",\n                                  \"bakeries\",\n                                  \"bands_orchestras\",\n                                  \"barber_and_beauty_shops\",\n                                  \"betting_casino_gambling\",\n                                  \"bicycle_shops\",\n                                  \"billiard_pool_establishments\",\n                                  \"boat_dealers\",\n                                  \"boat_rentals_and_leases\",\n                                  \"book_stores\",\n                                  \"books_periodicals_and_newspapers\",\n                                  \"bowling_alleys\",\n                                  \"bus_lines\",\n                                  \"business_secretarial_schools\",\n                                  \"buying_shopping_services\",\n                                  \"cable_satellite_and_other_pay_television_and_radio\",\n                                  \"camera_and_photographic_supply_stores\",\n                                  \"candy_nut_and_confectionery_stores\",\n                                  \"car_and_truck_dealers_new_used\",\n                                  \"car_and_truck_dealers_used_only\",\n                                  \"car_rental_agencies\",\n                                  \"car_washes\",\n                                  \"carpentry_services\",\n                                  \"carpet_upholstery_cleaning\",\n                                  \"caterers\",\n                                  \"charitable_and_social_service_organizations_fundraising\",\n                                  \"chemicals_and_allied_products\",\n                                  \"child_care_services\",\n                                  \"childrens_and_infants_wear_stores\",\n                                  \"chiropodists_podiatrists\",\n                                  \"chiropractors\",\n                                  \"cigar_stores_and_stands\",\n                                  \"civic_social_fraternal_associations\",\n                                  \"cleaning_and_maintenance\",\n                                  \"clothing_rental\",\n                                  \"colleges_universities\",\n                                  \"commercial_equipment\",\n                                  \"commercial_footwear\",\n                                  \"commercial_photography_art_and_graphics\",\n                                  \"commuter_transport_and_ferries\",\n                                  \"computer_network_services\",\n                                  \"computer_programming\",\n                                  \"computer_repair\",\n                                  \"computer_software_stores\",\n                                  \"computers_peripherals_and_software\",\n                                  \"concrete_work_services\",\n                                  \"construction_materials\",\n                                  \"consulting_public_relations\",\n                                  \"correspondence_schools\",\n                                  \"cosmetic_stores\",\n                                  \"counseling_services\",\n                                  \"country_clubs\",\n                                  \"courier_services\",\n                                  \"court_costs\",\n                                  \"credit_reporting_agencies\",\n                                  \"cruise_lines\",\n                                  \"dairy_products_stores\",\n                                  \"dance_hall_studios_schools\",\n                                  \"dating_escort_services\",\n                                  \"dentists_orthodontists\",\n                                  \"department_stores\",\n                                  \"detective_agencies\",\n                                  \"digital_goods_applications\",\n                                  \"digital_goods_games\",\n                                  \"digital_goods_large_volume\",\n                                  \"digital_goods_media\",\n                                  \"direct_marketing_catalog_merchant\",\n                                  \"direct_marketing_combination_catalog_and_retail_merchant\",\n                                  \"direct_marketing_inbound_telemarketing\",\n                                  \"direct_marketing_insurance_services\",\n                                  \"direct_marketing_other\",\n                                  \"direct_marketing_outbound_telemarketing\",\n                                  \"direct_marketing_subscription\",\n                                  \"direct_marketing_travel\",\n                                  \"discount_stores\",\n                                  \"doctors\",\n                                  \"door_to_door_sales\",\n                                  \"drapery_window_covering_and_upholstery_stores\",\n                                  \"drinking_places\",\n                                  \"drug_stores_and_pharmacies\",\n                                  \"drugs_drug_proprietaries_and_druggist_sundries\",\n                                  \"dry_cleaners\",\n                                  \"durable_goods\",\n                                  \"duty_free_stores\",\n                                  \"eating_places_restaurants\",\n                                  \"educational_services\",\n                                  \"electric_razor_stores\",\n                                  \"electric_vehicle_charging\",\n                                  \"electrical_parts_and_equipment\",\n                                  \"electrical_services\",\n                                  \"electronics_repair_shops\",\n                                  \"electronics_stores\",\n                                  \"elementary_secondary_schools\",\n                                  \"emergency_services_gcas_visa_use_only\",\n                                  \"employment_temp_agencies\",\n                                  \"equipment_rental\",\n                                  \"exterminating_services\",\n                                  \"family_clothing_stores\",\n                                  \"fast_food_restaurants\",\n                                  \"financial_institutions\",\n                                  \"fines_government_administrative_entities\",\n                                  \"fireplace_fireplace_screens_and_accessories_stores\",\n                                  \"floor_covering_stores\",\n                                  \"florists\",\n                                  \"florists_supplies_nursery_stock_and_flowers\",\n                                  \"freezer_and_locker_meat_provisioners\",\n                                  \"fuel_dealers_non_automotive\",\n                                  \"funeral_services_crematories\",\n                                  \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                                  \"furniture_repair_refinishing\",\n                                  \"furriers_and_fur_shops\",\n                                  \"general_services\",\n                                  \"gift_card_novelty_and_souvenir_shops\",\n                                  \"glass_paint_and_wallpaper_stores\",\n                                  \"glassware_crystal_stores\",\n                                  \"golf_courses_public\",\n                                  \"government_licensed_horse_dog_racing_us_region_only\",\n                                  \"government_licensed_online_casions_online_gambling_us_region_only\",\n                                  \"government_owned_lotteries_non_us_region\",\n                                  \"government_owned_lotteries_us_region_only\",\n                                  \"government_services\",\n                                  \"grocery_stores_supermarkets\",\n                                  \"hardware_equipment_and_supplies\",\n                                  \"hardware_stores\",\n                                  \"health_and_beauty_spas\",\n                                  \"hearing_aids_sales_and_supplies\",\n                                  \"heating_plumbing_a_c\",\n                                  \"hobby_toy_and_game_shops\",\n                                  \"home_supply_warehouse_stores\",\n                                  \"hospitals\",\n                                  \"hotels_motels_and_resorts\",\n                                  \"household_appliance_stores\",\n                                  \"industrial_supplies\",\n                                  \"information_retrieval_services\",\n                                  \"insurance_default\",\n                                  \"insurance_underwriting_premiums\",\n                                  \"intra_company_purchases\",\n                                  \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                                  \"landscaping_services\",\n                                  \"laundries\",\n                                  \"laundry_cleaning_services\",\n                                  \"legal_services_attorneys\",\n                                  \"luggage_and_leather_goods_stores\",\n                                  \"lumber_building_materials_stores\",\n                                  \"manual_cash_disburse\",\n                                  \"marinas_service_and_supplies\",\n                                  \"marketplaces\",\n                                  \"masonry_stonework_and_plaster\",\n                                  \"massage_parlors\",\n                                  \"medical_and_dental_labs\",\n                                  \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                                  \"medical_services\",\n                                  \"membership_organizations\",\n                                  \"mens_and_boys_clothing_and_accessories_stores\",\n                                  \"mens_womens_clothing_stores\",\n                                  \"metal_service_centers\",\n                                  \"miscellaneous\",\n                                  \"miscellaneous_apparel_and_accessory_shops\",\n                                  \"miscellaneous_auto_dealers\",\n                                  \"miscellaneous_business_services\",\n                                  \"miscellaneous_food_stores\",\n                                  \"miscellaneous_general_merchandise\",\n                                  \"miscellaneous_general_services\",\n                                  \"miscellaneous_home_furnishing_specialty_stores\",\n                                  \"miscellaneous_publishing_and_printing\",\n                                  \"miscellaneous_recreation_services\",\n                                  \"miscellaneous_repair_shops\",\n                                  \"miscellaneous_specialty_retail\",\n                                  \"mobile_home_dealers\",\n                                  \"motion_picture_theaters\",\n                                  \"motor_freight_carriers_and_trucking\",\n                                  \"motor_homes_dealers\",\n                                  \"motor_vehicle_supplies_and_new_parts\",\n                                  \"motorcycle_shops_and_dealers\",\n                                  \"motorcycle_shops_dealers\",\n                                  \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                                  \"news_dealers_and_newsstands\",\n                                  \"non_fi_money_orders\",\n                                  \"non_fi_stored_value_card_purchase_load\",\n                                  \"nondurable_goods\",\n                                  \"nurseries_lawn_and_garden_supply_stores\",\n                                  \"nursing_personal_care\",\n                                  \"office_and_commercial_furniture\",\n                                  \"opticians_eyeglasses\",\n                                  \"optometrists_ophthalmologist\",\n                                  \"orthopedic_goods_prosthetic_devices\",\n                                  \"osteopaths\",\n                                  \"package_stores_beer_wine_and_liquor\",\n                                  \"paints_varnishes_and_supplies\",\n                                  \"parking_lots_garages\",\n                                  \"passenger_railways\",\n                                  \"pawn_shops\",\n                                  \"pet_shops_pet_food_and_supplies\",\n                                  \"petroleum_and_petroleum_products\",\n                                  \"photo_developing\",\n                                  \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                                  \"photographic_studios\",\n                                  \"picture_video_production\",\n                                  \"piece_goods_notions_and_other_dry_goods\",\n                                  \"plumbing_heating_equipment_and_supplies\",\n                                  \"political_organizations\",\n                                  \"postal_services_government_only\",\n                                  \"precious_stones_and_metals_watches_and_jewelry\",\n                                  \"professional_services\",\n                                  \"public_warehousing_and_storage\",\n                                  \"quick_copy_repro_and_blueprint\",\n                                  \"railroads\",\n                                  \"real_estate_agents_and_managers_rentals\",\n                                  \"record_stores\",\n                                  \"recreational_vehicle_rentals\",\n                                  \"religious_goods_stores\",\n                                  \"religious_organizations\",\n                                  \"roofing_siding_sheet_metal\",\n                                  \"secretarial_support_services\",\n                                  \"security_brokers_dealers\",\n                                  \"service_stations\",\n                                  \"sewing_needlework_fabric_and_piece_goods_stores\",\n                                  \"shoe_repair_hat_cleaning\",\n                                  \"shoe_stores\",\n                                  \"small_appliance_repair\",\n                                  \"snowmobile_dealers\",\n                                  \"special_trade_services\",\n                                  \"specialty_cleaning\",\n                                  \"sporting_goods_stores\",\n                                  \"sporting_recreation_camps\",\n                                  \"sports_and_riding_apparel_stores\",\n                                  \"sports_clubs_fields\",\n                                  \"stamp_and_coin_stores\",\n                                  \"stationary_office_supplies_printing_and_writing_paper\",\n                                  \"stationery_stores_office_and_school_supply_stores\",\n                                  \"swimming_pools_sales\",\n                                  \"t_ui_travel_germany\",\n                                  \"tailors_alterations\",\n                                  \"tax_payments_government_agencies\",\n                                  \"tax_preparation_services\",\n                                  \"taxicabs_limousines\",\n                                  \"telecommunication_equipment_and_telephone_sales\",\n                                  \"telecommunication_services\",\n                                  \"telegraph_services\",\n                                  \"tent_and_awning_shops\",\n                                  \"testing_laboratories\",\n                                  \"theatrical_ticket_agencies\",\n                                  \"timeshares\",\n                                  \"tire_retreading_and_repair\",\n                                  \"tolls_bridge_fees\",\n                                  \"tourist_attractions_and_exhibits\",\n                                  \"towing_services\",\n                                  \"trailer_parks_campgrounds\",\n                                  \"transportation_services\",\n                                  \"travel_agencies_tour_operators\",\n                                  \"truck_stop_iteration\",\n                                  \"truck_utility_trailer_rentals\",\n                                  \"typesetting_plate_making_and_related_services\",\n                                  \"typewriter_stores\",\n                                  \"u_s_federal_government_agencies_or_departments\",\n                                  \"uniforms_commercial_clothing\",\n                                  \"used_merchandise_and_secondhand_stores\",\n                                  \"utilities\",\n                                  \"variety_stores\",\n                                  \"veterinary_services\",\n                                  \"video_amusement_game_supplies\",\n                                  \"video_game_arcades\",\n                                  \"video_tape_rental_stores\",\n                                  \"vocational_trade_schools\",\n                                  \"watch_jewelry_repair\",\n                                  \"welding_repair\",\n                                  \"wholesale_clubs\",\n                                  \"wig_and_toupee_stores\",\n                                  \"wires_money_orders\",\n                                  \"womens_accessory_and_specialty_shops\",\n                                  \"womens_ready_to_wear_stores\",\n                                  \"wrecking_and_salvage_yards\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"interval\": {\n                              \"enum\": [\n                                \"all_time\",\n                                \"daily\",\n                                \"monthly\",\n                                \"per_authorization\",\n                                \"weekly\",\n                                \"yearly\"\n                              ],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"amount\", \"interval\"],\n                          \"title\": \"spending_limits_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"spending_limits_currency\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"authorization_controls_param_v2\",\n                    \"type\": \"object\"\n                  },\n                  \"status\": {\n                    \"description\": \"Specifies whether to permit authorizations on this cardholder's cards.\",\n                    \"enum\": [\"active\", \"inactive\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.cardholder\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a cardholder\"\n      }\n    },\n    \"/v1/issuing/cards\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Issuing <code>Card</code> objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetIssuingCards\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return cards belonging to the Cardholder with the provided ID.\",\n            \"in\": \"query\",\n            \"name\": \"cardholder\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cards that were issued during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cards that have the given expiration month.\",\n            \"in\": \"query\",\n            \"name\": \"exp_month\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cards that have the given expiration year.\",\n            \"in\": \"query\",\n            \"name\": \"exp_year\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return cards that have the given last four digits.\",\n            \"in\": \"query\",\n            \"name\": \"last4\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"personalization_design\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cards that have the given status. One of `active`, `inactive`, or `canceled`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"canceled\", \"inactive\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return cards that have the given type. One of `virtual` or `physical`.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"physical\", \"virtual\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.card\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/issuing/cards\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingCardList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all cards\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates an Issuing <code>Card</code> object.</p>\",\n        \"operationId\": \"PostIssuingCards\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pin\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"second_line\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"spending_controls\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"cardholder\": {\n                    \"description\": \"The [Cardholder](https://stripe.com/docs/api#issuing_cardholder_object) object with which the card will be associated.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"The currency for the card.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"financial_account\": {\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"personalization_design\": {\n                    \"description\": \"The personalization design object belonging to this card.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"pin\": {\n                    \"description\": \"The desired PIN for this card.\",\n                    \"properties\": {\n                      \"encrypted_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"encrypted_pin_param\",\n                    \"type\": \"object\"\n                  },\n                  \"replacement_for\": {\n                    \"description\": \"The card this is meant to be a replacement for (if any).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"replacement_reason\": {\n                    \"description\": \"If `replacement_for` is specified, this should indicate why that card is being replaced.\",\n                    \"enum\": [\"damaged\", \"expired\", \"lost\", \"stolen\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"second_line\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The second line to print on the card. Max length: 24 characters.\"\n                  },\n                  \"shipping\": {\n                    \"description\": \"The address where the card will be shipped.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"city\", \"country\", \"line1\", \"postal_code\"],\n                        \"title\": \"required_address\",\n                        \"type\": \"object\"\n                      },\n                      \"address_validation\": {\n                        \"properties\": {\n                          \"mode\": {\n                            \"enum\": [\n                              \"disabled\",\n                              \"normalization_only\",\n                              \"validation_and_normalization\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"mode\"],\n                        \"title\": \"address_validation_param\",\n                        \"type\": \"object\"\n                      },\n                      \"customs\": {\n                        \"properties\": {\n                          \"eori_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"customs_param\",\n                        \"type\": \"object\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone_number\": {\n                        \"type\": \"string\"\n                      },\n                      \"require_signature\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"service\": {\n                        \"enum\": [\"express\", \"priority\", \"standard\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"type\": {\n                        \"enum\": [\"bulk\", \"individual\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"address\", \"name\"],\n                    \"title\": \"shipping_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"spending_controls\": {\n                    \"description\": \"Rules that control spending for this card. Refer to our [documentation](https://stripe.com/docs/issuing/controls/spending-controls) for more details.\",\n                    \"properties\": {\n                      \"allowed_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"allowed_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"spending_limits\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"categories\": {\n                              \"items\": {\n                                \"enum\": [\n                                  \"ac_refrigeration_repair\",\n                                  \"accounting_bookkeeping_services\",\n                                  \"advertising_services\",\n                                  \"agricultural_cooperative\",\n                                  \"airlines_air_carriers\",\n                                  \"airports_flying_fields\",\n                                  \"ambulance_services\",\n                                  \"amusement_parks_carnivals\",\n                                  \"antique_reproductions\",\n                                  \"antique_shops\",\n                                  \"aquariums\",\n                                  \"architectural_surveying_services\",\n                                  \"art_dealers_and_galleries\",\n                                  \"artists_supply_and_craft_shops\",\n                                  \"auto_and_home_supply_stores\",\n                                  \"auto_body_repair_shops\",\n                                  \"auto_paint_shops\",\n                                  \"auto_service_shops\",\n                                  \"automated_cash_disburse\",\n                                  \"automated_fuel_dispensers\",\n                                  \"automobile_associations\",\n                                  \"automotive_parts_and_accessories_stores\",\n                                  \"automotive_tire_stores\",\n                                  \"bail_and_bond_payments\",\n                                  \"bakeries\",\n                                  \"bands_orchestras\",\n                                  \"barber_and_beauty_shops\",\n                                  \"betting_casino_gambling\",\n                                  \"bicycle_shops\",\n                                  \"billiard_pool_establishments\",\n                                  \"boat_dealers\",\n                                  \"boat_rentals_and_leases\",\n                                  \"book_stores\",\n                                  \"books_periodicals_and_newspapers\",\n                                  \"bowling_alleys\",\n                                  \"bus_lines\",\n                                  \"business_secretarial_schools\",\n                                  \"buying_shopping_services\",\n                                  \"cable_satellite_and_other_pay_television_and_radio\",\n                                  \"camera_and_photographic_supply_stores\",\n                                  \"candy_nut_and_confectionery_stores\",\n                                  \"car_and_truck_dealers_new_used\",\n                                  \"car_and_truck_dealers_used_only\",\n                                  \"car_rental_agencies\",\n                                  \"car_washes\",\n                                  \"carpentry_services\",\n                                  \"carpet_upholstery_cleaning\",\n                                  \"caterers\",\n                                  \"charitable_and_social_service_organizations_fundraising\",\n                                  \"chemicals_and_allied_products\",\n                                  \"child_care_services\",\n                                  \"childrens_and_infants_wear_stores\",\n                                  \"chiropodists_podiatrists\",\n                                  \"chiropractors\",\n                                  \"cigar_stores_and_stands\",\n                                  \"civic_social_fraternal_associations\",\n                                  \"cleaning_and_maintenance\",\n                                  \"clothing_rental\",\n                                  \"colleges_universities\",\n                                  \"commercial_equipment\",\n                                  \"commercial_footwear\",\n                                  \"commercial_photography_art_and_graphics\",\n                                  \"commuter_transport_and_ferries\",\n                                  \"computer_network_services\",\n                                  \"computer_programming\",\n                                  \"computer_repair\",\n                                  \"computer_software_stores\",\n                                  \"computers_peripherals_and_software\",\n                                  \"concrete_work_services\",\n                                  \"construction_materials\",\n                                  \"consulting_public_relations\",\n                                  \"correspondence_schools\",\n                                  \"cosmetic_stores\",\n                                  \"counseling_services\",\n                                  \"country_clubs\",\n                                  \"courier_services\",\n                                  \"court_costs\",\n                                  \"credit_reporting_agencies\",\n                                  \"cruise_lines\",\n                                  \"dairy_products_stores\",\n                                  \"dance_hall_studios_schools\",\n                                  \"dating_escort_services\",\n                                  \"dentists_orthodontists\",\n                                  \"department_stores\",\n                                  \"detective_agencies\",\n                                  \"digital_goods_applications\",\n                                  \"digital_goods_games\",\n                                  \"digital_goods_large_volume\",\n                                  \"digital_goods_media\",\n                                  \"direct_marketing_catalog_merchant\",\n                                  \"direct_marketing_combination_catalog_and_retail_merchant\",\n                                  \"direct_marketing_inbound_telemarketing\",\n                                  \"direct_marketing_insurance_services\",\n                                  \"direct_marketing_other\",\n                                  \"direct_marketing_outbound_telemarketing\",\n                                  \"direct_marketing_subscription\",\n                                  \"direct_marketing_travel\",\n                                  \"discount_stores\",\n                                  \"doctors\",\n                                  \"door_to_door_sales\",\n                                  \"drapery_window_covering_and_upholstery_stores\",\n                                  \"drinking_places\",\n                                  \"drug_stores_and_pharmacies\",\n                                  \"drugs_drug_proprietaries_and_druggist_sundries\",\n                                  \"dry_cleaners\",\n                                  \"durable_goods\",\n                                  \"duty_free_stores\",\n                                  \"eating_places_restaurants\",\n                                  \"educational_services\",\n                                  \"electric_razor_stores\",\n                                  \"electric_vehicle_charging\",\n                                  \"electrical_parts_and_equipment\",\n                                  \"electrical_services\",\n                                  \"electronics_repair_shops\",\n                                  \"electronics_stores\",\n                                  \"elementary_secondary_schools\",\n                                  \"emergency_services_gcas_visa_use_only\",\n                                  \"employment_temp_agencies\",\n                                  \"equipment_rental\",\n                                  \"exterminating_services\",\n                                  \"family_clothing_stores\",\n                                  \"fast_food_restaurants\",\n                                  \"financial_institutions\",\n                                  \"fines_government_administrative_entities\",\n                                  \"fireplace_fireplace_screens_and_accessories_stores\",\n                                  \"floor_covering_stores\",\n                                  \"florists\",\n                                  \"florists_supplies_nursery_stock_and_flowers\",\n                                  \"freezer_and_locker_meat_provisioners\",\n                                  \"fuel_dealers_non_automotive\",\n                                  \"funeral_services_crematories\",\n                                  \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                                  \"furniture_repair_refinishing\",\n                                  \"furriers_and_fur_shops\",\n                                  \"general_services\",\n                                  \"gift_card_novelty_and_souvenir_shops\",\n                                  \"glass_paint_and_wallpaper_stores\",\n                                  \"glassware_crystal_stores\",\n                                  \"golf_courses_public\",\n                                  \"government_licensed_horse_dog_racing_us_region_only\",\n                                  \"government_licensed_online_casions_online_gambling_us_region_only\",\n                                  \"government_owned_lotteries_non_us_region\",\n                                  \"government_owned_lotteries_us_region_only\",\n                                  \"government_services\",\n                                  \"grocery_stores_supermarkets\",\n                                  \"hardware_equipment_and_supplies\",\n                                  \"hardware_stores\",\n                                  \"health_and_beauty_spas\",\n                                  \"hearing_aids_sales_and_supplies\",\n                                  \"heating_plumbing_a_c\",\n                                  \"hobby_toy_and_game_shops\",\n                                  \"home_supply_warehouse_stores\",\n                                  \"hospitals\",\n                                  \"hotels_motels_and_resorts\",\n                                  \"household_appliance_stores\",\n                                  \"industrial_supplies\",\n                                  \"information_retrieval_services\",\n                                  \"insurance_default\",\n                                  \"insurance_underwriting_premiums\",\n                                  \"intra_company_purchases\",\n                                  \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                                  \"landscaping_services\",\n                                  \"laundries\",\n                                  \"laundry_cleaning_services\",\n                                  \"legal_services_attorneys\",\n                                  \"luggage_and_leather_goods_stores\",\n                                  \"lumber_building_materials_stores\",\n                                  \"manual_cash_disburse\",\n                                  \"marinas_service_and_supplies\",\n                                  \"marketplaces\",\n                                  \"masonry_stonework_and_plaster\",\n                                  \"massage_parlors\",\n                                  \"medical_and_dental_labs\",\n                                  \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                                  \"medical_services\",\n                                  \"membership_organizations\",\n                                  \"mens_and_boys_clothing_and_accessories_stores\",\n                                  \"mens_womens_clothing_stores\",\n                                  \"metal_service_centers\",\n                                  \"miscellaneous\",\n                                  \"miscellaneous_apparel_and_accessory_shops\",\n                                  \"miscellaneous_auto_dealers\",\n                                  \"miscellaneous_business_services\",\n                                  \"miscellaneous_food_stores\",\n                                  \"miscellaneous_general_merchandise\",\n                                  \"miscellaneous_general_services\",\n                                  \"miscellaneous_home_furnishing_specialty_stores\",\n                                  \"miscellaneous_publishing_and_printing\",\n                                  \"miscellaneous_recreation_services\",\n                                  \"miscellaneous_repair_shops\",\n                                  \"miscellaneous_specialty_retail\",\n                                  \"mobile_home_dealers\",\n                                  \"motion_picture_theaters\",\n                                  \"motor_freight_carriers_and_trucking\",\n                                  \"motor_homes_dealers\",\n                                  \"motor_vehicle_supplies_and_new_parts\",\n                                  \"motorcycle_shops_and_dealers\",\n                                  \"motorcycle_shops_dealers\",\n                                  \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                                  \"news_dealers_and_newsstands\",\n                                  \"non_fi_money_orders\",\n                                  \"non_fi_stored_value_card_purchase_load\",\n                                  \"nondurable_goods\",\n                                  \"nurseries_lawn_and_garden_supply_stores\",\n                                  \"nursing_personal_care\",\n                                  \"office_and_commercial_furniture\",\n                                  \"opticians_eyeglasses\",\n                                  \"optometrists_ophthalmologist\",\n                                  \"orthopedic_goods_prosthetic_devices\",\n                                  \"osteopaths\",\n                                  \"package_stores_beer_wine_and_liquor\",\n                                  \"paints_varnishes_and_supplies\",\n                                  \"parking_lots_garages\",\n                                  \"passenger_railways\",\n                                  \"pawn_shops\",\n                                  \"pet_shops_pet_food_and_supplies\",\n                                  \"petroleum_and_petroleum_products\",\n                                  \"photo_developing\",\n                                  \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                                  \"photographic_studios\",\n                                  \"picture_video_production\",\n                                  \"piece_goods_notions_and_other_dry_goods\",\n                                  \"plumbing_heating_equipment_and_supplies\",\n                                  \"political_organizations\",\n                                  \"postal_services_government_only\",\n                                  \"precious_stones_and_metals_watches_and_jewelry\",\n                                  \"professional_services\",\n                                  \"public_warehousing_and_storage\",\n                                  \"quick_copy_repro_and_blueprint\",\n                                  \"railroads\",\n                                  \"real_estate_agents_and_managers_rentals\",\n                                  \"record_stores\",\n                                  \"recreational_vehicle_rentals\",\n                                  \"religious_goods_stores\",\n                                  \"religious_organizations\",\n                                  \"roofing_siding_sheet_metal\",\n                                  \"secretarial_support_services\",\n                                  \"security_brokers_dealers\",\n                                  \"service_stations\",\n                                  \"sewing_needlework_fabric_and_piece_goods_stores\",\n                                  \"shoe_repair_hat_cleaning\",\n                                  \"shoe_stores\",\n                                  \"small_appliance_repair\",\n                                  \"snowmobile_dealers\",\n                                  \"special_trade_services\",\n                                  \"specialty_cleaning\",\n                                  \"sporting_goods_stores\",\n                                  \"sporting_recreation_camps\",\n                                  \"sports_and_riding_apparel_stores\",\n                                  \"sports_clubs_fields\",\n                                  \"stamp_and_coin_stores\",\n                                  \"stationary_office_supplies_printing_and_writing_paper\",\n                                  \"stationery_stores_office_and_school_supply_stores\",\n                                  \"swimming_pools_sales\",\n                                  \"t_ui_travel_germany\",\n                                  \"tailors_alterations\",\n                                  \"tax_payments_government_agencies\",\n                                  \"tax_preparation_services\",\n                                  \"taxicabs_limousines\",\n                                  \"telecommunication_equipment_and_telephone_sales\",\n                                  \"telecommunication_services\",\n                                  \"telegraph_services\",\n                                  \"tent_and_awning_shops\",\n                                  \"testing_laboratories\",\n                                  \"theatrical_ticket_agencies\",\n                                  \"timeshares\",\n                                  \"tire_retreading_and_repair\",\n                                  \"tolls_bridge_fees\",\n                                  \"tourist_attractions_and_exhibits\",\n                                  \"towing_services\",\n                                  \"trailer_parks_campgrounds\",\n                                  \"transportation_services\",\n                                  \"travel_agencies_tour_operators\",\n                                  \"truck_stop_iteration\",\n                                  \"truck_utility_trailer_rentals\",\n                                  \"typesetting_plate_making_and_related_services\",\n                                  \"typewriter_stores\",\n                                  \"u_s_federal_government_agencies_or_departments\",\n                                  \"uniforms_commercial_clothing\",\n                                  \"used_merchandise_and_secondhand_stores\",\n                                  \"utilities\",\n                                  \"variety_stores\",\n                                  \"veterinary_services\",\n                                  \"video_amusement_game_supplies\",\n                                  \"video_game_arcades\",\n                                  \"video_tape_rental_stores\",\n                                  \"vocational_trade_schools\",\n                                  \"watch_jewelry_repair\",\n                                  \"welding_repair\",\n                                  \"wholesale_clubs\",\n                                  \"wig_and_toupee_stores\",\n                                  \"wires_money_orders\",\n                                  \"womens_accessory_and_specialty_shops\",\n                                  \"womens_ready_to_wear_stores\",\n                                  \"wrecking_and_salvage_yards\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"interval\": {\n                              \"enum\": [\n                                \"all_time\",\n                                \"daily\",\n                                \"monthly\",\n                                \"per_authorization\",\n                                \"weekly\",\n                                \"yearly\"\n                              ],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"amount\", \"interval\"],\n                          \"title\": \"spending_limits_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"authorization_controls_param\",\n                    \"type\": \"object\"\n                  },\n                  \"status\": {\n                    \"description\": \"Whether authorizations can be approved on this card. May be blocked from activating cards depending on past-due Cardholder requirements. Defaults to `inactive`.\",\n                    \"enum\": [\"active\", \"inactive\"],\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"description\": \"The type of card to issue. Possible values are `physical` or `virtual`.\",\n                    \"enum\": [\"physical\", \"virtual\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"currency\", \"type\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a card\"\n      }\n    },\n    \"/v1/issuing/cards/{card}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an Issuing <code>Card</code> object.</p>\",\n        \"operationId\": \"GetIssuingCardsCard\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a card\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified Issuing <code>Card</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostIssuingCardsCard\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pin\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"spending_controls\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"cancellation_reason\": {\n                    \"description\": \"Reason why the `status` of this card is `canceled`.\",\n                    \"enum\": [\"lost\", \"stolen\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"personalization_design\": {\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"pin\": {\n                    \"description\": \"The desired new PIN for this card.\",\n                    \"properties\": {\n                      \"encrypted_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"encrypted_pin_param\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping\": {\n                    \"description\": \"Updated shipping information for the card.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"city\", \"country\", \"line1\", \"postal_code\"],\n                        \"title\": \"required_address\",\n                        \"type\": \"object\"\n                      },\n                      \"address_validation\": {\n                        \"properties\": {\n                          \"mode\": {\n                            \"enum\": [\n                              \"disabled\",\n                              \"normalization_only\",\n                              \"validation_and_normalization\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"mode\"],\n                        \"title\": \"address_validation_param\",\n                        \"type\": \"object\"\n                      },\n                      \"customs\": {\n                        \"properties\": {\n                          \"eori_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"customs_param\",\n                        \"type\": \"object\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone_number\": {\n                        \"type\": \"string\"\n                      },\n                      \"require_signature\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"service\": {\n                        \"enum\": [\"express\", \"priority\", \"standard\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"type\": {\n                        \"enum\": [\"bulk\", \"individual\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"address\", \"name\"],\n                    \"title\": \"shipping_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"spending_controls\": {\n                    \"description\": \"Rules that control spending for this card. Refer to our [documentation](https://stripe.com/docs/issuing/controls/spending-controls) for more details.\",\n                    \"properties\": {\n                      \"allowed_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"allowed_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_categories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"ac_refrigeration_repair\",\n                            \"accounting_bookkeeping_services\",\n                            \"advertising_services\",\n                            \"agricultural_cooperative\",\n                            \"airlines_air_carriers\",\n                            \"airports_flying_fields\",\n                            \"ambulance_services\",\n                            \"amusement_parks_carnivals\",\n                            \"antique_reproductions\",\n                            \"antique_shops\",\n                            \"aquariums\",\n                            \"architectural_surveying_services\",\n                            \"art_dealers_and_galleries\",\n                            \"artists_supply_and_craft_shops\",\n                            \"auto_and_home_supply_stores\",\n                            \"auto_body_repair_shops\",\n                            \"auto_paint_shops\",\n                            \"auto_service_shops\",\n                            \"automated_cash_disburse\",\n                            \"automated_fuel_dispensers\",\n                            \"automobile_associations\",\n                            \"automotive_parts_and_accessories_stores\",\n                            \"automotive_tire_stores\",\n                            \"bail_and_bond_payments\",\n                            \"bakeries\",\n                            \"bands_orchestras\",\n                            \"barber_and_beauty_shops\",\n                            \"betting_casino_gambling\",\n                            \"bicycle_shops\",\n                            \"billiard_pool_establishments\",\n                            \"boat_dealers\",\n                            \"boat_rentals_and_leases\",\n                            \"book_stores\",\n                            \"books_periodicals_and_newspapers\",\n                            \"bowling_alleys\",\n                            \"bus_lines\",\n                            \"business_secretarial_schools\",\n                            \"buying_shopping_services\",\n                            \"cable_satellite_and_other_pay_television_and_radio\",\n                            \"camera_and_photographic_supply_stores\",\n                            \"candy_nut_and_confectionery_stores\",\n                            \"car_and_truck_dealers_new_used\",\n                            \"car_and_truck_dealers_used_only\",\n                            \"car_rental_agencies\",\n                            \"car_washes\",\n                            \"carpentry_services\",\n                            \"carpet_upholstery_cleaning\",\n                            \"caterers\",\n                            \"charitable_and_social_service_organizations_fundraising\",\n                            \"chemicals_and_allied_products\",\n                            \"child_care_services\",\n                            \"childrens_and_infants_wear_stores\",\n                            \"chiropodists_podiatrists\",\n                            \"chiropractors\",\n                            \"cigar_stores_and_stands\",\n                            \"civic_social_fraternal_associations\",\n                            \"cleaning_and_maintenance\",\n                            \"clothing_rental\",\n                            \"colleges_universities\",\n                            \"commercial_equipment\",\n                            \"commercial_footwear\",\n                            \"commercial_photography_art_and_graphics\",\n                            \"commuter_transport_and_ferries\",\n                            \"computer_network_services\",\n                            \"computer_programming\",\n                            \"computer_repair\",\n                            \"computer_software_stores\",\n                            \"computers_peripherals_and_software\",\n                            \"concrete_work_services\",\n                            \"construction_materials\",\n                            \"consulting_public_relations\",\n                            \"correspondence_schools\",\n                            \"cosmetic_stores\",\n                            \"counseling_services\",\n                            \"country_clubs\",\n                            \"courier_services\",\n                            \"court_costs\",\n                            \"credit_reporting_agencies\",\n                            \"cruise_lines\",\n                            \"dairy_products_stores\",\n                            \"dance_hall_studios_schools\",\n                            \"dating_escort_services\",\n                            \"dentists_orthodontists\",\n                            \"department_stores\",\n                            \"detective_agencies\",\n                            \"digital_goods_applications\",\n                            \"digital_goods_games\",\n                            \"digital_goods_large_volume\",\n                            \"digital_goods_media\",\n                            \"direct_marketing_catalog_merchant\",\n                            \"direct_marketing_combination_catalog_and_retail_merchant\",\n                            \"direct_marketing_inbound_telemarketing\",\n                            \"direct_marketing_insurance_services\",\n                            \"direct_marketing_other\",\n                            \"direct_marketing_outbound_telemarketing\",\n                            \"direct_marketing_subscription\",\n                            \"direct_marketing_travel\",\n                            \"discount_stores\",\n                            \"doctors\",\n                            \"door_to_door_sales\",\n                            \"drapery_window_covering_and_upholstery_stores\",\n                            \"drinking_places\",\n                            \"drug_stores_and_pharmacies\",\n                            \"drugs_drug_proprietaries_and_druggist_sundries\",\n                            \"dry_cleaners\",\n                            \"durable_goods\",\n                            \"duty_free_stores\",\n                            \"eating_places_restaurants\",\n                            \"educational_services\",\n                            \"electric_razor_stores\",\n                            \"electric_vehicle_charging\",\n                            \"electrical_parts_and_equipment\",\n                            \"electrical_services\",\n                            \"electronics_repair_shops\",\n                            \"electronics_stores\",\n                            \"elementary_secondary_schools\",\n                            \"emergency_services_gcas_visa_use_only\",\n                            \"employment_temp_agencies\",\n                            \"equipment_rental\",\n                            \"exterminating_services\",\n                            \"family_clothing_stores\",\n                            \"fast_food_restaurants\",\n                            \"financial_institutions\",\n                            \"fines_government_administrative_entities\",\n                            \"fireplace_fireplace_screens_and_accessories_stores\",\n                            \"floor_covering_stores\",\n                            \"florists\",\n                            \"florists_supplies_nursery_stock_and_flowers\",\n                            \"freezer_and_locker_meat_provisioners\",\n                            \"fuel_dealers_non_automotive\",\n                            \"funeral_services_crematories\",\n                            \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                            \"furniture_repair_refinishing\",\n                            \"furriers_and_fur_shops\",\n                            \"general_services\",\n                            \"gift_card_novelty_and_souvenir_shops\",\n                            \"glass_paint_and_wallpaper_stores\",\n                            \"glassware_crystal_stores\",\n                            \"golf_courses_public\",\n                            \"government_licensed_horse_dog_racing_us_region_only\",\n                            \"government_licensed_online_casions_online_gambling_us_region_only\",\n                            \"government_owned_lotteries_non_us_region\",\n                            \"government_owned_lotteries_us_region_only\",\n                            \"government_services\",\n                            \"grocery_stores_supermarkets\",\n                            \"hardware_equipment_and_supplies\",\n                            \"hardware_stores\",\n                            \"health_and_beauty_spas\",\n                            \"hearing_aids_sales_and_supplies\",\n                            \"heating_plumbing_a_c\",\n                            \"hobby_toy_and_game_shops\",\n                            \"home_supply_warehouse_stores\",\n                            \"hospitals\",\n                            \"hotels_motels_and_resorts\",\n                            \"household_appliance_stores\",\n                            \"industrial_supplies\",\n                            \"information_retrieval_services\",\n                            \"insurance_default\",\n                            \"insurance_underwriting_premiums\",\n                            \"intra_company_purchases\",\n                            \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                            \"landscaping_services\",\n                            \"laundries\",\n                            \"laundry_cleaning_services\",\n                            \"legal_services_attorneys\",\n                            \"luggage_and_leather_goods_stores\",\n                            \"lumber_building_materials_stores\",\n                            \"manual_cash_disburse\",\n                            \"marinas_service_and_supplies\",\n                            \"marketplaces\",\n                            \"masonry_stonework_and_plaster\",\n                            \"massage_parlors\",\n                            \"medical_and_dental_labs\",\n                            \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                            \"medical_services\",\n                            \"membership_organizations\",\n                            \"mens_and_boys_clothing_and_accessories_stores\",\n                            \"mens_womens_clothing_stores\",\n                            \"metal_service_centers\",\n                            \"miscellaneous\",\n                            \"miscellaneous_apparel_and_accessory_shops\",\n                            \"miscellaneous_auto_dealers\",\n                            \"miscellaneous_business_services\",\n                            \"miscellaneous_food_stores\",\n                            \"miscellaneous_general_merchandise\",\n                            \"miscellaneous_general_services\",\n                            \"miscellaneous_home_furnishing_specialty_stores\",\n                            \"miscellaneous_publishing_and_printing\",\n                            \"miscellaneous_recreation_services\",\n                            \"miscellaneous_repair_shops\",\n                            \"miscellaneous_specialty_retail\",\n                            \"mobile_home_dealers\",\n                            \"motion_picture_theaters\",\n                            \"motor_freight_carriers_and_trucking\",\n                            \"motor_homes_dealers\",\n                            \"motor_vehicle_supplies_and_new_parts\",\n                            \"motorcycle_shops_and_dealers\",\n                            \"motorcycle_shops_dealers\",\n                            \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                            \"news_dealers_and_newsstands\",\n                            \"non_fi_money_orders\",\n                            \"non_fi_stored_value_card_purchase_load\",\n                            \"nondurable_goods\",\n                            \"nurseries_lawn_and_garden_supply_stores\",\n                            \"nursing_personal_care\",\n                            \"office_and_commercial_furniture\",\n                            \"opticians_eyeglasses\",\n                            \"optometrists_ophthalmologist\",\n                            \"orthopedic_goods_prosthetic_devices\",\n                            \"osteopaths\",\n                            \"package_stores_beer_wine_and_liquor\",\n                            \"paints_varnishes_and_supplies\",\n                            \"parking_lots_garages\",\n                            \"passenger_railways\",\n                            \"pawn_shops\",\n                            \"pet_shops_pet_food_and_supplies\",\n                            \"petroleum_and_petroleum_products\",\n                            \"photo_developing\",\n                            \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                            \"photographic_studios\",\n                            \"picture_video_production\",\n                            \"piece_goods_notions_and_other_dry_goods\",\n                            \"plumbing_heating_equipment_and_supplies\",\n                            \"political_organizations\",\n                            \"postal_services_government_only\",\n                            \"precious_stones_and_metals_watches_and_jewelry\",\n                            \"professional_services\",\n                            \"public_warehousing_and_storage\",\n                            \"quick_copy_repro_and_blueprint\",\n                            \"railroads\",\n                            \"real_estate_agents_and_managers_rentals\",\n                            \"record_stores\",\n                            \"recreational_vehicle_rentals\",\n                            \"religious_goods_stores\",\n                            \"religious_organizations\",\n                            \"roofing_siding_sheet_metal\",\n                            \"secretarial_support_services\",\n                            \"security_brokers_dealers\",\n                            \"service_stations\",\n                            \"sewing_needlework_fabric_and_piece_goods_stores\",\n                            \"shoe_repair_hat_cleaning\",\n                            \"shoe_stores\",\n                            \"small_appliance_repair\",\n                            \"snowmobile_dealers\",\n                            \"special_trade_services\",\n                            \"specialty_cleaning\",\n                            \"sporting_goods_stores\",\n                            \"sporting_recreation_camps\",\n                            \"sports_and_riding_apparel_stores\",\n                            \"sports_clubs_fields\",\n                            \"stamp_and_coin_stores\",\n                            \"stationary_office_supplies_printing_and_writing_paper\",\n                            \"stationery_stores_office_and_school_supply_stores\",\n                            \"swimming_pools_sales\",\n                            \"t_ui_travel_germany\",\n                            \"tailors_alterations\",\n                            \"tax_payments_government_agencies\",\n                            \"tax_preparation_services\",\n                            \"taxicabs_limousines\",\n                            \"telecommunication_equipment_and_telephone_sales\",\n                            \"telecommunication_services\",\n                            \"telegraph_services\",\n                            \"tent_and_awning_shops\",\n                            \"testing_laboratories\",\n                            \"theatrical_ticket_agencies\",\n                            \"timeshares\",\n                            \"tire_retreading_and_repair\",\n                            \"tolls_bridge_fees\",\n                            \"tourist_attractions_and_exhibits\",\n                            \"towing_services\",\n                            \"trailer_parks_campgrounds\",\n                            \"transportation_services\",\n                            \"travel_agencies_tour_operators\",\n                            \"truck_stop_iteration\",\n                            \"truck_utility_trailer_rentals\",\n                            \"typesetting_plate_making_and_related_services\",\n                            \"typewriter_stores\",\n                            \"u_s_federal_government_agencies_or_departments\",\n                            \"uniforms_commercial_clothing\",\n                            \"used_merchandise_and_secondhand_stores\",\n                            \"utilities\",\n                            \"variety_stores\",\n                            \"veterinary_services\",\n                            \"video_amusement_game_supplies\",\n                            \"video_game_arcades\",\n                            \"video_tape_rental_stores\",\n                            \"vocational_trade_schools\",\n                            \"watch_jewelry_repair\",\n                            \"welding_repair\",\n                            \"wholesale_clubs\",\n                            \"wig_and_toupee_stores\",\n                            \"wires_money_orders\",\n                            \"womens_accessory_and_specialty_shops\",\n                            \"womens_ready_to_wear_stores\",\n                            \"wrecking_and_salvage_yards\"\n                          ],\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"blocked_merchant_countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"spending_limits\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"categories\": {\n                              \"items\": {\n                                \"enum\": [\n                                  \"ac_refrigeration_repair\",\n                                  \"accounting_bookkeeping_services\",\n                                  \"advertising_services\",\n                                  \"agricultural_cooperative\",\n                                  \"airlines_air_carriers\",\n                                  \"airports_flying_fields\",\n                                  \"ambulance_services\",\n                                  \"amusement_parks_carnivals\",\n                                  \"antique_reproductions\",\n                                  \"antique_shops\",\n                                  \"aquariums\",\n                                  \"architectural_surveying_services\",\n                                  \"art_dealers_and_galleries\",\n                                  \"artists_supply_and_craft_shops\",\n                                  \"auto_and_home_supply_stores\",\n                                  \"auto_body_repair_shops\",\n                                  \"auto_paint_shops\",\n                                  \"auto_service_shops\",\n                                  \"automated_cash_disburse\",\n                                  \"automated_fuel_dispensers\",\n                                  \"automobile_associations\",\n                                  \"automotive_parts_and_accessories_stores\",\n                                  \"automotive_tire_stores\",\n                                  \"bail_and_bond_payments\",\n                                  \"bakeries\",\n                                  \"bands_orchestras\",\n                                  \"barber_and_beauty_shops\",\n                                  \"betting_casino_gambling\",\n                                  \"bicycle_shops\",\n                                  \"billiard_pool_establishments\",\n                                  \"boat_dealers\",\n                                  \"boat_rentals_and_leases\",\n                                  \"book_stores\",\n                                  \"books_periodicals_and_newspapers\",\n                                  \"bowling_alleys\",\n                                  \"bus_lines\",\n                                  \"business_secretarial_schools\",\n                                  \"buying_shopping_services\",\n                                  \"cable_satellite_and_other_pay_television_and_radio\",\n                                  \"camera_and_photographic_supply_stores\",\n                                  \"candy_nut_and_confectionery_stores\",\n                                  \"car_and_truck_dealers_new_used\",\n                                  \"car_and_truck_dealers_used_only\",\n                                  \"car_rental_agencies\",\n                                  \"car_washes\",\n                                  \"carpentry_services\",\n                                  \"carpet_upholstery_cleaning\",\n                                  \"caterers\",\n                                  \"charitable_and_social_service_organizations_fundraising\",\n                                  \"chemicals_and_allied_products\",\n                                  \"child_care_services\",\n                                  \"childrens_and_infants_wear_stores\",\n                                  \"chiropodists_podiatrists\",\n                                  \"chiropractors\",\n                                  \"cigar_stores_and_stands\",\n                                  \"civic_social_fraternal_associations\",\n                                  \"cleaning_and_maintenance\",\n                                  \"clothing_rental\",\n                                  \"colleges_universities\",\n                                  \"commercial_equipment\",\n                                  \"commercial_footwear\",\n                                  \"commercial_photography_art_and_graphics\",\n                                  \"commuter_transport_and_ferries\",\n                                  \"computer_network_services\",\n                                  \"computer_programming\",\n                                  \"computer_repair\",\n                                  \"computer_software_stores\",\n                                  \"computers_peripherals_and_software\",\n                                  \"concrete_work_services\",\n                                  \"construction_materials\",\n                                  \"consulting_public_relations\",\n                                  \"correspondence_schools\",\n                                  \"cosmetic_stores\",\n                                  \"counseling_services\",\n                                  \"country_clubs\",\n                                  \"courier_services\",\n                                  \"court_costs\",\n                                  \"credit_reporting_agencies\",\n                                  \"cruise_lines\",\n                                  \"dairy_products_stores\",\n                                  \"dance_hall_studios_schools\",\n                                  \"dating_escort_services\",\n                                  \"dentists_orthodontists\",\n                                  \"department_stores\",\n                                  \"detective_agencies\",\n                                  \"digital_goods_applications\",\n                                  \"digital_goods_games\",\n                                  \"digital_goods_large_volume\",\n                                  \"digital_goods_media\",\n                                  \"direct_marketing_catalog_merchant\",\n                                  \"direct_marketing_combination_catalog_and_retail_merchant\",\n                                  \"direct_marketing_inbound_telemarketing\",\n                                  \"direct_marketing_insurance_services\",\n                                  \"direct_marketing_other\",\n                                  \"direct_marketing_outbound_telemarketing\",\n                                  \"direct_marketing_subscription\",\n                                  \"direct_marketing_travel\",\n                                  \"discount_stores\",\n                                  \"doctors\",\n                                  \"door_to_door_sales\",\n                                  \"drapery_window_covering_and_upholstery_stores\",\n                                  \"drinking_places\",\n                                  \"drug_stores_and_pharmacies\",\n                                  \"drugs_drug_proprietaries_and_druggist_sundries\",\n                                  \"dry_cleaners\",\n                                  \"durable_goods\",\n                                  \"duty_free_stores\",\n                                  \"eating_places_restaurants\",\n                                  \"educational_services\",\n                                  \"electric_razor_stores\",\n                                  \"electric_vehicle_charging\",\n                                  \"electrical_parts_and_equipment\",\n                                  \"electrical_services\",\n                                  \"electronics_repair_shops\",\n                                  \"electronics_stores\",\n                                  \"elementary_secondary_schools\",\n                                  \"emergency_services_gcas_visa_use_only\",\n                                  \"employment_temp_agencies\",\n                                  \"equipment_rental\",\n                                  \"exterminating_services\",\n                                  \"family_clothing_stores\",\n                                  \"fast_food_restaurants\",\n                                  \"financial_institutions\",\n                                  \"fines_government_administrative_entities\",\n                                  \"fireplace_fireplace_screens_and_accessories_stores\",\n                                  \"floor_covering_stores\",\n                                  \"florists\",\n                                  \"florists_supplies_nursery_stock_and_flowers\",\n                                  \"freezer_and_locker_meat_provisioners\",\n                                  \"fuel_dealers_non_automotive\",\n                                  \"funeral_services_crematories\",\n                                  \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                                  \"furniture_repair_refinishing\",\n                                  \"furriers_and_fur_shops\",\n                                  \"general_services\",\n                                  \"gift_card_novelty_and_souvenir_shops\",\n                                  \"glass_paint_and_wallpaper_stores\",\n                                  \"glassware_crystal_stores\",\n                                  \"golf_courses_public\",\n                                  \"government_licensed_horse_dog_racing_us_region_only\",\n                                  \"government_licensed_online_casions_online_gambling_us_region_only\",\n                                  \"government_owned_lotteries_non_us_region\",\n                                  \"government_owned_lotteries_us_region_only\",\n                                  \"government_services\",\n                                  \"grocery_stores_supermarkets\",\n                                  \"hardware_equipment_and_supplies\",\n                                  \"hardware_stores\",\n                                  \"health_and_beauty_spas\",\n                                  \"hearing_aids_sales_and_supplies\",\n                                  \"heating_plumbing_a_c\",\n                                  \"hobby_toy_and_game_shops\",\n                                  \"home_supply_warehouse_stores\",\n                                  \"hospitals\",\n                                  \"hotels_motels_and_resorts\",\n                                  \"household_appliance_stores\",\n                                  \"industrial_supplies\",\n                                  \"information_retrieval_services\",\n                                  \"insurance_default\",\n                                  \"insurance_underwriting_premiums\",\n                                  \"intra_company_purchases\",\n                                  \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                                  \"landscaping_services\",\n                                  \"laundries\",\n                                  \"laundry_cleaning_services\",\n                                  \"legal_services_attorneys\",\n                                  \"luggage_and_leather_goods_stores\",\n                                  \"lumber_building_materials_stores\",\n                                  \"manual_cash_disburse\",\n                                  \"marinas_service_and_supplies\",\n                                  \"marketplaces\",\n                                  \"masonry_stonework_and_plaster\",\n                                  \"massage_parlors\",\n                                  \"medical_and_dental_labs\",\n                                  \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                                  \"medical_services\",\n                                  \"membership_organizations\",\n                                  \"mens_and_boys_clothing_and_accessories_stores\",\n                                  \"mens_womens_clothing_stores\",\n                                  \"metal_service_centers\",\n                                  \"miscellaneous\",\n                                  \"miscellaneous_apparel_and_accessory_shops\",\n                                  \"miscellaneous_auto_dealers\",\n                                  \"miscellaneous_business_services\",\n                                  \"miscellaneous_food_stores\",\n                                  \"miscellaneous_general_merchandise\",\n                                  \"miscellaneous_general_services\",\n                                  \"miscellaneous_home_furnishing_specialty_stores\",\n                                  \"miscellaneous_publishing_and_printing\",\n                                  \"miscellaneous_recreation_services\",\n                                  \"miscellaneous_repair_shops\",\n                                  \"miscellaneous_specialty_retail\",\n                                  \"mobile_home_dealers\",\n                                  \"motion_picture_theaters\",\n                                  \"motor_freight_carriers_and_trucking\",\n                                  \"motor_homes_dealers\",\n                                  \"motor_vehicle_supplies_and_new_parts\",\n                                  \"motorcycle_shops_and_dealers\",\n                                  \"motorcycle_shops_dealers\",\n                                  \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                                  \"news_dealers_and_newsstands\",\n                                  \"non_fi_money_orders\",\n                                  \"non_fi_stored_value_card_purchase_load\",\n                                  \"nondurable_goods\",\n                                  \"nurseries_lawn_and_garden_supply_stores\",\n                                  \"nursing_personal_care\",\n                                  \"office_and_commercial_furniture\",\n                                  \"opticians_eyeglasses\",\n                                  \"optometrists_ophthalmologist\",\n                                  \"orthopedic_goods_prosthetic_devices\",\n                                  \"osteopaths\",\n                                  \"package_stores_beer_wine_and_liquor\",\n                                  \"paints_varnishes_and_supplies\",\n                                  \"parking_lots_garages\",\n                                  \"passenger_railways\",\n                                  \"pawn_shops\",\n                                  \"pet_shops_pet_food_and_supplies\",\n                                  \"petroleum_and_petroleum_products\",\n                                  \"photo_developing\",\n                                  \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                                  \"photographic_studios\",\n                                  \"picture_video_production\",\n                                  \"piece_goods_notions_and_other_dry_goods\",\n                                  \"plumbing_heating_equipment_and_supplies\",\n                                  \"political_organizations\",\n                                  \"postal_services_government_only\",\n                                  \"precious_stones_and_metals_watches_and_jewelry\",\n                                  \"professional_services\",\n                                  \"public_warehousing_and_storage\",\n                                  \"quick_copy_repro_and_blueprint\",\n                                  \"railroads\",\n                                  \"real_estate_agents_and_managers_rentals\",\n                                  \"record_stores\",\n                                  \"recreational_vehicle_rentals\",\n                                  \"religious_goods_stores\",\n                                  \"religious_organizations\",\n                                  \"roofing_siding_sheet_metal\",\n                                  \"secretarial_support_services\",\n                                  \"security_brokers_dealers\",\n                                  \"service_stations\",\n                                  \"sewing_needlework_fabric_and_piece_goods_stores\",\n                                  \"shoe_repair_hat_cleaning\",\n                                  \"shoe_stores\",\n                                  \"small_appliance_repair\",\n                                  \"snowmobile_dealers\",\n                                  \"special_trade_services\",\n                                  \"specialty_cleaning\",\n                                  \"sporting_goods_stores\",\n                                  \"sporting_recreation_camps\",\n                                  \"sports_and_riding_apparel_stores\",\n                                  \"sports_clubs_fields\",\n                                  \"stamp_and_coin_stores\",\n                                  \"stationary_office_supplies_printing_and_writing_paper\",\n                                  \"stationery_stores_office_and_school_supply_stores\",\n                                  \"swimming_pools_sales\",\n                                  \"t_ui_travel_germany\",\n                                  \"tailors_alterations\",\n                                  \"tax_payments_government_agencies\",\n                                  \"tax_preparation_services\",\n                                  \"taxicabs_limousines\",\n                                  \"telecommunication_equipment_and_telephone_sales\",\n                                  \"telecommunication_services\",\n                                  \"telegraph_services\",\n                                  \"tent_and_awning_shops\",\n                                  \"testing_laboratories\",\n                                  \"theatrical_ticket_agencies\",\n                                  \"timeshares\",\n                                  \"tire_retreading_and_repair\",\n                                  \"tolls_bridge_fees\",\n                                  \"tourist_attractions_and_exhibits\",\n                                  \"towing_services\",\n                                  \"trailer_parks_campgrounds\",\n                                  \"transportation_services\",\n                                  \"travel_agencies_tour_operators\",\n                                  \"truck_stop_iteration\",\n                                  \"truck_utility_trailer_rentals\",\n                                  \"typesetting_plate_making_and_related_services\",\n                                  \"typewriter_stores\",\n                                  \"u_s_federal_government_agencies_or_departments\",\n                                  \"uniforms_commercial_clothing\",\n                                  \"used_merchandise_and_secondhand_stores\",\n                                  \"utilities\",\n                                  \"variety_stores\",\n                                  \"veterinary_services\",\n                                  \"video_amusement_game_supplies\",\n                                  \"video_game_arcades\",\n                                  \"video_tape_rental_stores\",\n                                  \"vocational_trade_schools\",\n                                  \"watch_jewelry_repair\",\n                                  \"welding_repair\",\n                                  \"wholesale_clubs\",\n                                  \"wig_and_toupee_stores\",\n                                  \"wires_money_orders\",\n                                  \"womens_accessory_and_specialty_shops\",\n                                  \"womens_ready_to_wear_stores\",\n                                  \"wrecking_and_salvage_yards\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"interval\": {\n                              \"enum\": [\n                                \"all_time\",\n                                \"daily\",\n                                \"monthly\",\n                                \"per_authorization\",\n                                \"weekly\",\n                                \"yearly\"\n                              ],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"amount\", \"interval\"],\n                          \"title\": \"spending_limits_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"authorization_controls_param\",\n                    \"type\": \"object\"\n                  },\n                  \"status\": {\n                    \"description\": \"Dictates whether authorizations can be approved on this card. May be blocked from activating cards depending on past-due Cardholder requirements. Defaults to `inactive`. If this card is being canceled because it was lost or stolen, this information should be provided as `cancellation_reason`.\",\n                    \"enum\": [\"active\", \"canceled\", \"inactive\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a card\"\n      }\n    },\n    \"/v1/issuing/disputes\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Issuing <code>Dispute</code> objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetIssuingDisputes\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return Issuing disputes that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Select Issuing disputes with the given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"expired\", \"lost\", \"submitted\", \"unsubmitted\", \"won\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Select the Issuing dispute for the given transaction.\",\n            \"in\": \"query\",\n            \"name\": \"transaction\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.dispute\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/issuing/disputes\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingDisputeList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all disputes\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates an Issuing <code>Dispute</code> object. Individual pieces of evidence within the <code>evidence</code> object are optional at this point. Stripe only validates that required evidence is present during submission. Refer to <a href=\\\"/docs/issuing/purchases/disputes#dispute-reasons-and-evidence\\\">Dispute reasons and evidence</a> for more details about evidence requirements.</p>\",\n        \"operationId\": \"PostIssuingDisputes\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"evidence\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"treasury\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The dispute amount in the card's currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal). If not set, defaults to the full transaction amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"evidence\": {\n                    \"description\": \"Evidence provided for the dispute.\",\n                    \"properties\": {\n                      \"canceled\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"canceled_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cancellation_policy_provided\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"boolean\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cancellation_reason\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expected_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_type\": {\n                                \"enum\": [\"\", \"merchandise\", \"service\"],\n                                \"type\": \"string\"\n                              },\n                              \"return_status\": {\n                                \"enum\": [\"\", \"merchant_rejected\", \"successful\"],\n                                \"type\": \"string\"\n                              },\n                              \"returned_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"canceled\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"duplicate\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"card_statement\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cash_receipt\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"check_image\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"original_transaction\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"duplicate\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"fraudulent\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"fraudulent\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"merchandise_not_as_described\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"received_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"return_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"return_status\": {\n                                \"enum\": [\"\", \"merchant_rejected\", \"successful\"],\n                                \"type\": \"string\"\n                              },\n                              \"returned_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"merchandise_not_as_described\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"no_valid_authorization\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"no_valid_authorization\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"not_received\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expected_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_type\": {\n                                \"enum\": [\"\", \"merchandise\", \"service\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"not_received\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"other\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_type\": {\n                                \"enum\": [\"\", \"merchandise\", \"service\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"other\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"reason\": {\n                        \"enum\": [\n                          \"canceled\",\n                          \"duplicate\",\n                          \"fraudulent\",\n                          \"merchandise_not_as_described\",\n                          \"no_valid_authorization\",\n                          \"not_received\",\n                          \"other\",\n                          \"service_not_as_described\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"service_not_as_described\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"canceled_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cancellation_reason\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"received_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"service_not_as_described\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"evidence_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"transaction\": {\n                    \"description\": \"The ID of the issuing transaction to create a dispute for. For transaction on Treasury FinancialAccounts, use `treasury.received_debit`.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"treasury\": {\n                    \"description\": \"Params for disputes related to Treasury FinancialAccounts\",\n                    \"properties\": {\n                      \"received_debit\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"received_debit\"],\n                    \"title\": \"treasury_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a dispute\"\n      }\n    },\n    \"/v1/issuing/disputes/{dispute}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an Issuing <code>Dispute</code> object.</p>\",\n        \"operationId\": \"GetIssuingDisputesDispute\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dispute\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a dispute\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified Issuing <code>Dispute</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Properties on the <code>evidence</code> object can be unset by passing in an empty string.</p>\",\n        \"operationId\": \"PostIssuingDisputesDispute\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dispute\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"evidence\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The dispute amount in the card's currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"evidence\": {\n                    \"description\": \"Evidence provided for the dispute.\",\n                    \"properties\": {\n                      \"canceled\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"canceled_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cancellation_policy_provided\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"boolean\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cancellation_reason\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expected_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_type\": {\n                                \"enum\": [\"\", \"merchandise\", \"service\"],\n                                \"type\": \"string\"\n                              },\n                              \"return_status\": {\n                                \"enum\": [\"\", \"merchant_rejected\", \"successful\"],\n                                \"type\": \"string\"\n                              },\n                              \"returned_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"canceled\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"duplicate\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"card_statement\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cash_receipt\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"check_image\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"original_transaction\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"duplicate\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"fraudulent\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"fraudulent\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"merchandise_not_as_described\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"received_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"return_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"return_status\": {\n                                \"enum\": [\"\", \"merchant_rejected\", \"successful\"],\n                                \"type\": \"string\"\n                              },\n                              \"returned_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"merchandise_not_as_described\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"no_valid_authorization\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"no_valid_authorization\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"not_received\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expected_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_type\": {\n                                \"enum\": [\"\", \"merchandise\", \"service\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"not_received\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"other\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_type\": {\n                                \"enum\": [\"\", \"merchandise\", \"service\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"other\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"reason\": {\n                        \"enum\": [\n                          \"canceled\",\n                          \"duplicate\",\n                          \"fraudulent\",\n                          \"merchandise_not_as_described\",\n                          \"no_valid_authorization\",\n                          \"not_received\",\n                          \"other\",\n                          \"service_not_as_described\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"service_not_as_described\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"additional_documentation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"canceled_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"cancellation_reason\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"explanation\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 2500,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"received_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"service_not_as_described\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"evidence_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a dispute\"\n      }\n    },\n    \"/v1/issuing/disputes/{dispute}/submit\": {\n      \"post\": {\n        \"description\": \"<p>Submits an Issuing <code>Dispute</code> to the card network. Stripe validates that all evidence fields required for the dispute’s reason are present. For more details, see <a href=\\\"/docs/issuing/purchases/disputes#dispute-reasons-and-evidence\\\">Dispute reasons and evidence</a>.</p>\",\n        \"operationId\": \"PostIssuingDisputesDisputeSubmit\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dispute\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.dispute\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Submit a dispute\"\n      }\n    },\n    \"/v1/issuing/personalization_designs\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of personalization design objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetIssuingPersonalizationDesigns\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return personalization designs with the given lookup keys.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"lookup_keys\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 200,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return personalization designs with the given preferences.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"preferences\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"is_default\": {\n                  \"type\": \"boolean\"\n                },\n                \"is_platform_default\": {\n                  \"type\": \"boolean\"\n                }\n              },\n              \"title\": \"preferences_list_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return personalization designs with the given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"inactive\", \"rejected\", \"review\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/issuing/personalization_designs\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingPersonalizationDesignList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all personalization designs\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a personalization design object.</p>\",\n        \"operationId\": \"PostIssuingPersonalizationDesigns\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"carrier_text\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"preferences\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"card_logo\": {\n                    \"description\": \"The file for the card logo, for use with physical bundles that support card logos. Must have a `purpose` value of `issuing_logo`.\",\n                    \"type\": \"string\"\n                  },\n                  \"carrier_text\": {\n                    \"description\": \"Hash containing carrier text, for use with physical bundles that support carrier text.\",\n                    \"properties\": {\n                      \"footer_body\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"footer_title\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 30,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"header_body\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"header_title\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 30,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"carrier_text_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"lookup_key\": {\n                    \"description\": \"A lookup key used to retrieve personalization designs dynamically from a static string. This may be up to 200 characters.\",\n                    \"maxLength\": 200,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"Friendly display name.\",\n                    \"maxLength\": 200,\n                    \"type\": \"string\"\n                  },\n                  \"physical_bundle\": {\n                    \"description\": \"The physical bundle object belonging to this personalization design.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"preferences\": {\n                    \"description\": \"Information on whether this personalization design is used to create cards when one is not specified.\",\n                    \"properties\": {\n                      \"is_default\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"is_default\"],\n                    \"title\": \"preferences_param\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_lookup_key\": {\n                    \"description\": \"If set to true, will atomically remove the lookup key from the existing personalization design, and assign it to this personalization design.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"required\": [\"physical_bundle\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a personalization design\"\n      }\n    },\n    \"/v1/issuing/personalization_designs/{personalization_design}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a personalization design object.</p>\",\n        \"operationId\": \"GetIssuingPersonalizationDesignsPersonalizationDesign\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"personalization_design\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a personalization design\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a card personalization object.</p>\",\n        \"operationId\": \"PostIssuingPersonalizationDesignsPersonalizationDesign\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"personalization_design\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"card_logo\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"carrier_text\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"lookup_key\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"name\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"preferences\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"card_logo\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The file for the card logo, for use with physical bundles that support card logos. Must have a `purpose` value of `issuing_logo`.\"\n                  },\n                  \"carrier_text\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"footer_body\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"footer_title\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 30,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"header_body\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"header_title\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 30,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"carrier_text_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Hash containing carrier text, for use with physical bundles that support carrier text.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"lookup_key\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A lookup key used to retrieve personalization designs dynamically from a static string. This may be up to 200 characters.\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 200,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Friendly display name. Providing an empty string will set the field to null.\"\n                  },\n                  \"physical_bundle\": {\n                    \"description\": \"The physical bundle object belonging to this personalization design.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"preferences\": {\n                    \"description\": \"Information on whether this personalization design is used to create cards when one is not specified.\",\n                    \"properties\": {\n                      \"is_default\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"is_default\"],\n                    \"title\": \"preferences_param\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_lookup_key\": {\n                    \"description\": \"If set to true, will atomically remove the lookup key from the existing personalization design, and assign it to this personalization design.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a personalization design\"\n      }\n    },\n    \"/v1/issuing/physical_bundles\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of physical bundle objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetIssuingPhysicalBundles\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return physical bundles with the given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"inactive\", \"review\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return physical bundles with the given type.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"custom\", \"standard\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.physical_bundle\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/issuing/physical_bundles\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingPhysicalBundleList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all physical bundles\"\n      }\n    },\n    \"/v1/issuing/physical_bundles/{physical_bundle}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a physical bundle object.</p>\",\n        \"operationId\": \"GetIssuingPhysicalBundlesPhysicalBundle\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"physical_bundle\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.physical_bundle\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a physical bundle\"\n      }\n    },\n    \"/v1/issuing/settlements/{settlement}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an Issuing <code>Settlement</code> object.</p>\",\n        \"operationId\": \"GetIssuingSettlementsSettlement\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"settlement\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.settlement\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a settlement\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified Issuing <code>Settlement</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostIssuingSettlementsSettlement\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"settlement\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.settlement\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a settlement\"\n      }\n    },\n    \"/v1/issuing/tokens\": {\n      \"get\": {\n        \"description\": \"<p>Lists all Issuing <code>Token</code> objects for a given card.</p>\",\n        \"operationId\": \"GetIssuingTokens\",\n        \"parameters\": [\n          {\n            \"description\": \"The Issuing card identifier to list tokens for.\",\n            \"in\": \"query\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return Issuing tokens that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Select Issuing tokens with the given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"deleted\", \"requested\", \"suspended\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.token\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingNetworkTokenList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all issuing tokens for card\"\n      }\n    },\n    \"/v1/issuing/tokens/{token}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an Issuing <code>Token</code> object.</p>\",\n        \"operationId\": \"GetIssuingTokensToken\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"token\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.token\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an issuing token\"\n      },\n      \"post\": {\n        \"description\": \"<p>Attempts to update the specified Issuing <code>Token</code> object to the status specified.</p>\",\n        \"operationId\": \"PostIssuingTokensToken\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"token\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"status\": {\n                    \"description\": \"Specifies which status the token should be updated to.\",\n                    \"enum\": [\"active\", \"deleted\", \"suspended\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"status\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.token\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a token status\"\n      }\n    },\n    \"/v1/issuing/transactions\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Issuing <code>Transaction</code> objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetIssuingTransactions\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return transactions that belong to the given card.\",\n            \"in\": \"query\",\n            \"name\": \"card\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return transactions that belong to the given cardholder.\",\n            \"in\": \"query\",\n            \"name\": \"cardholder\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return transactions that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return transactions that have the given type. One of `capture` or `refund`.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"capture\", \"refund\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/issuing.transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/issuing/transactions\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"IssuingTransactionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all transactions\"\n      }\n    },\n    \"/v1/issuing/transactions/{transaction}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an Issuing <code>Transaction</code> object.</p>\",\n        \"operationId\": \"GetIssuingTransactionsTransaction\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a transaction\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified Issuing <code>Transaction</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostIssuingTransactionsTransaction\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a transaction\"\n      }\n    },\n    \"/v1/link_account_sessions\": {\n      \"post\": {\n        \"description\": \"<p>To launch the Financial Connections authorization flow, create a <code>Session</code>. The session’s <code>client_secret</code> can be used to launch the flow using Stripe.js.</p>\",\n        \"operationId\": \"PostLinkAccountSessions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"account_holder\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"filters\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"permissions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"prefetch\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account_holder\": {\n                    \"description\": \"The account holder to link accounts for.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"customer\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"account\", \"customer\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"accountholder_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"filters\": {\n                    \"description\": \"Filters to restrict the kinds of accounts to collect.\",\n                    \"properties\": {\n                      \"account_subcategories\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"checking\",\n                            \"credit_card\",\n                            \"line_of_credit\",\n                            \"mortgage\",\n                            \"savings\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"countries\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"filters_params\",\n                    \"type\": \"object\"\n                  },\n                  \"permissions\": {\n                    \"description\": \"List of data features that you would like to request access to.\\n\\nPossible values are `balances`, `transactions`, `ownership`, and `payment_method`.\",\n                    \"items\": {\n                      \"enum\": [\n                        \"balances\",\n                        \"ownership\",\n                        \"payment_method\",\n                        \"transactions\"\n                      ],\n                      \"maxLength\": 5000,\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"prefetch\": {\n                    \"description\": \"List of data features that you would like to retrieve upon account creation.\",\n                    \"items\": {\n                      \"enum\": [\"balances\", \"ownership\", \"transactions\"],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"For webview integrations only. Upon completing OAuth login in the native browser, the user will be redirected to this URL to return to your app.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"account_holder\", \"permissions\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Session\"\n      }\n    },\n    \"/v1/link_account_sessions/{session}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a Financial Connections <code>Session</code></p>\",\n        \"operationId\": \"GetLinkAccountSessionsSession\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"session\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.session\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Session\"\n      }\n    },\n    \"/v1/linked_accounts\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Financial Connections <code>Account</code> objects.</p>\",\n        \"operationId\": \"GetLinkedAccounts\",\n        \"parameters\": [\n          {\n            \"description\": \"If present, only return accounts that belong to the specified account holder. `account_holder[customer]` and `account_holder[account]` are mutually exclusive.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"account_holder\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"account\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                \"customer\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                }\n              },\n              \"title\": \"accountholder_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"If present, only return accounts that were collected as part of the given session.\",\n            \"in\": \"query\",\n            \"name\": \"session\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/financial_connections.account\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/financial_connections/accounts\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BankConnectionsResourceLinkedAccountList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List Accounts\"\n      }\n    },\n    \"/v1/linked_accounts/{account}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an Financial Connections <code>Account</code>.</p>\",\n        \"operationId\": \"GetLinkedAccountsAccount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an Account\"\n      }\n    },\n    \"/v1/linked_accounts/{account}/disconnect\": {\n      \"post\": {\n        \"description\": \"<p>Disables your access to a Financial Connections <code>Account</code>. You will no longer be able to access data associated with the account (e.g. balances, transactions).</p>\",\n        \"operationId\": \"PostLinkedAccountsAccountDisconnect\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Disconnect an Account\"\n      }\n    },\n    \"/v1/linked_accounts/{account}/owners\": {\n      \"get\": {\n        \"description\": \"<p>Lists all owners for a given <code>Account</code></p>\",\n        \"operationId\": \"GetLinkedAccountsAccountOwners\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The ID of the ownership object to fetch owners from.\",\n            \"in\": \"query\",\n            \"name\": \"ownership\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/financial_connections.account_owner\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BankConnectionsResourceOwnerList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List Account Owners\"\n      }\n    },\n    \"/v1/linked_accounts/{account}/refresh\": {\n      \"post\": {\n        \"description\": \"<p>Refreshes the data associated with a Financial Connections <code>Account</code>.</p>\",\n        \"operationId\": \"PostLinkedAccountsAccountRefresh\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"The list of account features that you would like to refresh.\",\n                    \"items\": {\n                      \"enum\": [\"balance\", \"ownership\", \"transactions\"],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"features\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/financial_connections.account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Refresh Account data\"\n      }\n    },\n    \"/v1/mandates/{mandate}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a Mandate object.</p>\",\n        \"operationId\": \"GetMandatesMandate\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"mandate\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/mandate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Mandate\"\n      }\n    },\n    \"/v1/payment_intents\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of PaymentIntents.</p>\",\n        \"operationId\": \"GetPaymentIntents\",\n        \"parameters\": [\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp or a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return PaymentIntents for the customer that this customer ID specifies.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payment_intent\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/payment_intents\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentFlowsPaymentIntentList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all PaymentIntents\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a PaymentIntent object.</p>\\n\\n<p>After the PaymentIntent is created, attach a payment method and <a href=\\\"/docs/api/payment_intents/confirm\\\">confirm</a>\\nto continue the payment. Learn more about <a href=\\\"/docs/payments/payment-intents\\\">the available payment flows\\nwith the Payment Intents API</a>.</p>\\n\\n<p>When you use <code>confirm=true</code> during creation, it’s equivalent to creating\\nand confirming the PaymentIntent in the same call. You can use any parameters\\navailable in the <a href=\\\"/docs/api/payment_intents/confirm\\\">confirm API</a> when you supply\\n<code>confirm=true</code>.</p>\",\n        \"operationId\": \"PostPaymentIntents\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"automatic_payment_methods\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mandate_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"off_session\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"radar_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount intended to be collected by this PaymentIntent. A positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or [equivalent in charge currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99).\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total payment amount. For more information, see the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"type\": \"integer\"\n                  },\n                  \"automatic_payment_methods\": {\n                    \"description\": \"When you enable this parameter, this PaymentIntent accepts payment methods that you enable in the Dashboard and that are compatible with this PaymentIntent's other parameters.\",\n                    \"properties\": {\n                      \"allow_redirects\": {\n                        \"enum\": [\"always\", \"never\"],\n                        \"type\": \"string\"\n                      },\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_payment_methods_param\",\n                    \"type\": \"object\"\n                  },\n                  \"capture_method\": {\n                    \"description\": \"Controls when the funds will be captured from the customer's account.\",\n                    \"enum\": [\"automatic\", \"automatic_async\", \"manual\"],\n                    \"type\": \"string\"\n                  },\n                  \"confirm\": {\n                    \"description\": \"Set to `true` to attempt to [confirm this PaymentIntent](https://stripe.com/docs/api/payment_intents/confirm) immediately. This parameter defaults to `false`. When creating and confirming a PaymentIntent at the same time, you can also provide the parameters available in the [Confirm API](https://stripe.com/docs/api/payment_intents/confirm).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"confirmation_method\": {\n                    \"description\": \"Describes whether we can confirm this PaymentIntent automatically, or if it requires customer action to confirm the payment.\",\n                    \"enum\": [\"automatic\", \"manual\"],\n                    \"type\": \"string\"\n                  },\n                  \"confirmation_token\": {\n                    \"description\": \"ID of the ConfirmationToken used to confirm this PaymentIntent.\\n\\nIf the provided ConfirmationToken contains properties that are also being provided in this request, such as `payment_method`, then the values in this request will take precedence.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"ID of the Customer this PaymentIntent belongs to, if one exists.\\n\\nPayment methods attached to other Customers cannot be used with this PaymentIntent.\\n\\nIf [setup_future_usage](https://stripe.com/docs/api#payment_intent_object-setup_future_usage) is set and this PaymentIntent's payment method is not `card_present`, then the payment method attaches to the Customer after the PaymentIntent has been confirmed and any required actions from the user are complete. If the payment method is `card_present` and isn't a digital wallet, then a [generated_card](https://docs.stripe.com/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card is created and attached to the Customer instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 1000,\n                    \"type\": \"string\"\n                  },\n                  \"error_on_requires_action\": {\n                    \"description\": \"Set to `true` to fail the payment attempt if the PaymentIntent transitions into `requires_action`. Use this parameter for simpler integrations that don't handle customer actions, such as [saving cards without authentication](https://stripe.com/docs/payments/save-card-without-authentication). This parameter can only be used with [`confirm=true`](https://stripe.com/docs/api/payment_intents/create#create_payment_intent-confirm).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"mandate\": {\n                    \"description\": \"ID of the mandate that's used for this payment. This parameter can only be used with [`confirm=true`](https://stripe.com/docs/api/payment_intents/create#create_payment_intent-confirm).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"mandate_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"customer_acceptance\": {\n                            \"properties\": {\n                              \"accepted_at\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"offline\": {\n                                \"properties\": {},\n                                \"title\": \"offline_param\",\n                                \"type\": \"object\"\n                              },\n                              \"online\": {\n                                \"properties\": {\n                                  \"ip_address\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"user_agent\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"ip_address\", \"user_agent\"],\n                                \"title\": \"online_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"offline\", \"online\"],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"customer_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"customer_acceptance\"],\n                        \"title\": \"secret_key_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"This hash contains details about the Mandate to create. This parameter can only be used with [`confirm=true`](https://stripe.com/docs/api/payment_intents/create#create_payment_intent-confirm).\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"off_session\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"boolean\"\n                      },\n                      {\n                        \"enum\": [\"one_off\", \"recurring\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set to `true` to indicate that the customer isn't in your checkout flow during this payment attempt and can't authenticate. Use this parameter in scenarios where you collect card details and [charge them later](https://stripe.com/docs/payments/cards/charging-saved-cards). This parameter can only be used with [`confirm=true`](https://stripe.com/docs/api/payment_intents/create#create_payment_intent-confirm).\"\n                  },\n                  \"on_behalf_of\": {\n                    \"description\": \"The Stripe account ID that these funds are intended for. Learn more about the [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"type\": \"string\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"ID of the payment method (a PaymentMethod, Card, or [compatible Source](https://stripe.com/docs/payments/payment-methods/transitioning#compatibility) object) to attach to this PaymentIntent.\\n\\nIf you omit this parameter with `confirm=true`, `customer.default_source` attaches as this PaymentIntent's payment instrument to improve migration for users of the Charges API. We recommend that you explicitly provide the `payment_method` moving forward.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_configuration\": {\n                    \"description\": \"The ID of the [payment method configuration](https://stripe.com/docs/api/payment_method_configurations) to use with this PaymentIntent.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"If provided, this hash will be used to create a PaymentMethod. The new PaymentMethod will appear\\nin the [payment_method](https://stripe.com/docs/api/payment_intents/object#payment_intent_object-payment_method)\\nproperty on the PaymentIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"institution_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"transit_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"account_number\",\n                          \"institution_number\",\n                          \"transit_number\"\n                        ],\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"alma\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"bsb_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"bsb_number\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"sort_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"blik\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"tax_id\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"arzte_und_apotheker_bank\",\n                              \"austrian_anadi_bank_ag\",\n                              \"bank_austria\",\n                              \"bankhaus_carl_spangler\",\n                              \"bankhaus_schelhammer_und_schattera_ag\",\n                              \"bawag_psk_ag\",\n                              \"bks_bank_ag\",\n                              \"brull_kallmus_bank_ag\",\n                              \"btv_vier_lander_bank\",\n                              \"capital_bank_grawe_gruppe_ag\",\n                              \"deutsche_bank_ag\",\n                              \"dolomitenbank\",\n                              \"easybank_ag\",\n                              \"erste_bank_und_sparkassen\",\n                              \"hypo_alpeadriabank_international_ag\",\n                              \"hypo_bank_burgenland_aktiengesellschaft\",\n                              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                              \"hypo_oberosterreich_salzburg_steiermark\",\n                              \"hypo_tirol_bank_ag\",\n                              \"hypo_vorarlberg_bank_ag\",\n                              \"marchfelder_bank\",\n                              \"oberbank_ag\",\n                              \"raiffeisen_bankengruppe_osterreich\",\n                              \"schoellerbank_ag\",\n                              \"sparda_bank_wien\",\n                              \"volksbank_gruppe\",\n                              \"volkskreditbank_ag\",\n                              \"vr_bank_braunau\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"affin_bank\",\n                              \"agrobank\",\n                              \"alliance_bank\",\n                              \"ambank\",\n                              \"bank_islam\",\n                              \"bank_muamalat\",\n                              \"bank_of_china\",\n                              \"bank_rakyat\",\n                              \"bsn\",\n                              \"cimb\",\n                              \"deutsche_bank\",\n                              \"hong_leong_bank\",\n                              \"hsbc\",\n                              \"kfh\",\n                              \"maybank2e\",\n                              \"maybank2u\",\n                              \"ocbc\",\n                              \"pb_enterprise\",\n                              \"public_bank\",\n                              \"rhb\",\n                              \"standard_chartered\",\n                              \"uob\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"bank\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"abn_amro\",\n                              \"asn_bank\",\n                              \"bunq\",\n                              \"handelsbanken\",\n                              \"ing\",\n                              \"knab\",\n                              \"moneyou\",\n                              \"n26\",\n                              \"nn\",\n                              \"rabobank\",\n                              \"regiobank\",\n                              \"revolut\",\n                              \"sns_bank\",\n                              \"triodos_bank\",\n                              \"van_lanschot\",\n                              \"yoursafe\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"interac_present\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"dob\": {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"funding\": {\n                            \"enum\": [\"card\", \"points\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"alior_bank\",\n                              \"bank_millennium\",\n                              \"bank_nowy_bfg_sa\",\n                              \"bank_pekao_sa\",\n                              \"banki_spbdzielcze\",\n                              \"blik\",\n                              \"bnp_paribas\",\n                              \"boz\",\n                              \"citi_handlowy\",\n                              \"credit_agricole\",\n                              \"envelobank\",\n                              \"etransfer_pocztowy24\",\n                              \"getin_bank\",\n                              \"ideabank\",\n                              \"ing\",\n                              \"inteligo\",\n                              \"mbank_mtransfer\",\n                              \"nest_przelew\",\n                              \"noble_pay\",\n                              \"pbac_z_ipko\",\n                              \"plus_bank\",\n                              \"santander_przelew24\",\n                              \"tmobile_usbugi_bankowe\",\n                              \"toyota_bank\",\n                              \"velobank\",\n                              \"volkswagen_bank\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"radar_options\": {\n                        \"properties\": {\n                          \"session\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"radar_options_with_hidden_options\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"iban\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"iban\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"acss_debit\",\n                          \"affirm\",\n                          \"afterpay_clearpay\",\n                          \"alipay\",\n                          \"alma\",\n                          \"amazon_pay\",\n                          \"au_becs_debit\",\n                          \"bacs_debit\",\n                          \"bancontact\",\n                          \"blik\",\n                          \"boleto\",\n                          \"cashapp\",\n                          \"customer_balance\",\n                          \"eps\",\n                          \"fpx\",\n                          \"giropay\",\n                          \"grabpay\",\n                          \"ideal\",\n                          \"kakao_pay\",\n                          \"klarna\",\n                          \"konbini\",\n                          \"kr_card\",\n                          \"link\",\n                          \"mobilepay\",\n                          \"multibanco\",\n                          \"naver_pay\",\n                          \"oxxo\",\n                          \"p24\",\n                          \"pay_by_bank\",\n                          \"payco\",\n                          \"paynow\",\n                          \"paypal\",\n                          \"pix\",\n                          \"promptpay\",\n                          \"revolut_pay\",\n                          \"samsung_pay\",\n                          \"sepa_debit\",\n                          \"sofort\",\n                          \"swish\",\n                          \"twint\",\n                          \"us_bank_account\",\n                          \"wechat_pay\",\n                          \"zip\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_options\": {\n                    \"description\": \"Payment method-specific configuration for this PaymentIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"custom_mandate_url\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  },\n                                  \"interval_description\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  },\n                                  \"payment_schedule\": {\n                                    \"enum\": [\n                                      \"combined\",\n                                      \"interval\",\n                                      \"sporadic\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"transaction_type\": {\n                                    \"enum\": [\"business\", \"personal\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"payment_intent_payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"verification_method\": {\n                                \"enum\": [\n                                  \"automatic\",\n                                  \"instant\",\n                                  \"microdeposits\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"affirm\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"maxLength\": 30,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"afterpay_clearpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"reference\": {\n                                \"maxLength\": 128,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"alipay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"alma\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"amazon_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"au_becs_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"bacs_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"reference_prefix\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"maxLength\": 12,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"bancontact\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"preferred_language\": {\n                                \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"blik\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"boleto\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_days\": {\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"card\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"cvc_token\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"installments\": {\n                                \"properties\": {\n                                  \"enabled\": {\n                                    \"type\": \"boolean\"\n                                  },\n                                  \"plan\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"properties\": {\n                                          \"count\": {\n                                            \"type\": \"integer\"\n                                          },\n                                          \"interval\": {\n                                            \"enum\": [\"month\"],\n                                            \"type\": \"string\"\n                                          },\n                                          \"type\": {\n                                            \"enum\": [\"fixed_count\"],\n                                            \"type\": \"string\",\n                                            \"x-stripeBypassValidation\": true\n                                          }\n                                        },\n                                        \"required\": [\"type\"],\n                                        \"title\": \"installment_plan\",\n                                        \"type\": \"object\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"installments_param\",\n                                \"type\": \"object\"\n                              },\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"amount_type\": {\n                                    \"enum\": [\"fixed\", \"maximum\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"description\": {\n                                    \"maxLength\": 200,\n                                    \"type\": \"string\"\n                                  },\n                                  \"end_date\": {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  \"interval\": {\n                                    \"enum\": [\n                                      \"day\",\n                                      \"month\",\n                                      \"sporadic\",\n                                      \"week\",\n                                      \"year\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"interval_count\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"reference\": {\n                                    \"maxLength\": 80,\n                                    \"type\": \"string\"\n                                  },\n                                  \"start_date\": {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  \"supported_types\": {\n                                    \"items\": {\n                                      \"enum\": [\"india\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"amount\",\n                                  \"amount_type\",\n                                  \"interval\",\n                                  \"reference\",\n                                  \"start_date\"\n                                ],\n                                \"title\": \"mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"network\": {\n                                \"enum\": [\n                                  \"amex\",\n                                  \"cartes_bancaires\",\n                                  \"diners\",\n                                  \"discover\",\n                                  \"eftpos_au\",\n                                  \"girocard\",\n                                  \"interac\",\n                                  \"jcb\",\n                                  \"link\",\n                                  \"mastercard\",\n                                  \"unionpay\",\n                                  \"unknown\",\n                                  \"visa\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"request_extended_authorization\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_incremental_authorization\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_multicapture\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_overcapture\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_three_d_secure\": {\n                                \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"require_cvc_recollection\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"statement_descriptor_suffix_kana\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 22,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"statement_descriptor_suffix_kanji\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 17,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"three_d_secure\": {\n                                \"properties\": {\n                                  \"ares_trans_status\": {\n                                    \"enum\": [\"A\", \"C\", \"I\", \"N\", \"R\", \"U\", \"Y\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"cryptogram\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"electronic_commerce_indicator\": {\n                                    \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  },\n                                  \"exemption_indicator\": {\n                                    \"enum\": [\"low_risk\", \"none\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"network_options\": {\n                                    \"properties\": {\n                                      \"cartes_bancaires\": {\n                                        \"properties\": {\n                                          \"cb_avalgo\": {\n                                            \"enum\": [\n                                              \"0\",\n                                              \"1\",\n                                              \"2\",\n                                              \"3\",\n                                              \"4\",\n                                              \"A\"\n                                            ],\n                                            \"type\": \"string\"\n                                          },\n                                          \"cb_exemption\": {\n                                            \"maxLength\": 4,\n                                            \"type\": \"string\"\n                                          },\n                                          \"cb_score\": {\n                                            \"type\": \"integer\"\n                                          }\n                                        },\n                                        \"required\": [\"cb_avalgo\"],\n                                        \"title\": \"cartes_bancaires_network_options_param\",\n                                        \"type\": \"object\"\n                                      }\n                                    },\n                                    \"title\": \"network_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"requestor_challenge_indicator\": {\n                                    \"maxLength\": 2,\n                                    \"type\": \"string\"\n                                  },\n                                  \"transaction_id\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"version\": {\n                                    \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"required\": [\n                                  \"cryptogram\",\n                                  \"transaction_id\",\n                                  \"version\"\n                                ],\n                                \"title\": \"payment_method_options_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"payment_intent_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"card_present\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"request_extended_authorization\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"request_incremental_authorization_support\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"routing\": {\n                                \"properties\": {\n                                  \"requested_priority\": {\n                                    \"enum\": [\"domestic\", \"international\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"routing_payment_method_options_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"cashapp\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"customer_balance\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"bank_transfer\": {\n                                \"properties\": {\n                                  \"eu_bank_transfer\": {\n                                    \"properties\": {\n                                      \"country\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\"country\"],\n                                    \"title\": \"eu_bank_transfer_params\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"requested_address_types\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"aba\",\n                                        \"iban\",\n                                        \"sepa\",\n                                        \"sort_code\",\n                                        \"spei\",\n                                        \"swift\",\n                                        \"zengin\"\n                                      ],\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"type\": {\n                                    \"enum\": [\n                                      \"eu_bank_transfer\",\n                                      \"gb_bank_transfer\",\n                                      \"jp_bank_transfer\",\n                                      \"mx_bank_transfer\",\n                                      \"us_bank_transfer\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"required\": [\"type\"],\n                                \"title\": \"bank_transfer_param\",\n                                \"type\": \"object\"\n                              },\n                              \"funding_type\": {\n                                \"enum\": [\"bank_transfer\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"eps\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"fpx\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"giropay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"grabpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"ideal\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"interac_present\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {},\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"kakao_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"klarna\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"enum\": [\n                                  \"cs-CZ\",\n                                  \"da-DK\",\n                                  \"de-AT\",\n                                  \"de-CH\",\n                                  \"de-DE\",\n                                  \"el-GR\",\n                                  \"en-AT\",\n                                  \"en-AU\",\n                                  \"en-BE\",\n                                  \"en-CA\",\n                                  \"en-CH\",\n                                  \"en-CZ\",\n                                  \"en-DE\",\n                                  \"en-DK\",\n                                  \"en-ES\",\n                                  \"en-FI\",\n                                  \"en-FR\",\n                                  \"en-GB\",\n                                  \"en-GR\",\n                                  \"en-IE\",\n                                  \"en-IT\",\n                                  \"en-NL\",\n                                  \"en-NO\",\n                                  \"en-NZ\",\n                                  \"en-PL\",\n                                  \"en-PT\",\n                                  \"en-RO\",\n                                  \"en-SE\",\n                                  \"en-US\",\n                                  \"es-ES\",\n                                  \"es-US\",\n                                  \"fi-FI\",\n                                  \"fr-BE\",\n                                  \"fr-CA\",\n                                  \"fr-CH\",\n                                  \"fr-FR\",\n                                  \"it-CH\",\n                                  \"it-IT\",\n                                  \"nb-NO\",\n                                  \"nl-BE\",\n                                  \"nl-NL\",\n                                  \"pl-PL\",\n                                  \"pt-PT\",\n                                  \"ro-RO\",\n                                  \"sv-FI\",\n                                  \"sv-SE\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"konbini\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"confirmation_number\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 11,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expires_after_days\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expires_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 22,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"kr_card\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"link\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"mobilepay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"multibanco\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"naver_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"oxxo\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_days\": {\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"p24\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              },\n                              \"tos_shown_and_accepted\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"pay_by_bank\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {},\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"payco\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"paynow\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"paypal\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"enum\": [\n                                  \"cs-CZ\",\n                                  \"da-DK\",\n                                  \"de-AT\",\n                                  \"de-DE\",\n                                  \"de-LU\",\n                                  \"el-GR\",\n                                  \"en-GB\",\n                                  \"en-US\",\n                                  \"es-ES\",\n                                  \"fi-FI\",\n                                  \"fr-BE\",\n                                  \"fr-FR\",\n                                  \"fr-LU\",\n                                  \"hu-HU\",\n                                  \"it-IT\",\n                                  \"nl-BE\",\n                                  \"nl-NL\",\n                                  \"pl-PL\",\n                                  \"pt-PT\",\n                                  \"sk-SK\",\n                                  \"sv-SE\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"reference\": {\n                                \"maxLength\": 127,\n                                \"type\": \"string\"\n                              },\n                              \"risk_correlation_id\": {\n                                \"maxLength\": 32,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"pix\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_seconds\": {\n                                \"type\": \"integer\"\n                              },\n                              \"expires_at\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"promptpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"revolut_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"samsung_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"sepa_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"reference_prefix\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"maxLength\": 12,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"sofort\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"preferred_language\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"de\",\n                                  \"en\",\n                                  \"es\",\n                                  \"fr\",\n                                  \"it\",\n                                  \"nl\",\n                                  \"pl\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"swish\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"reference\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"twint\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"us_bank_account\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"financial_connections\": {\n                                \"properties\": {\n                                  \"filters\": {\n                                    \"properties\": {\n                                      \"account_subcategories\": {\n                                        \"items\": {\n                                          \"enum\": [\"checking\", \"savings\"],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"linked_account_options_filters_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"permissions\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"balances\",\n                                        \"ownership\",\n                                        \"payment_method\",\n                                        \"transactions\"\n                                      ],\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"prefetch\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"balances\",\n                                        \"ownership\",\n                                        \"transactions\"\n                                      ],\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"return_url\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"linked_account_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"collection_method\": {\n                                    \"enum\": [\"\", \"paper\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"networks\": {\n                                \"properties\": {\n                                  \"requested\": {\n                                    \"items\": {\n                                      \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"networks_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"preferred_settlement_speed\": {\n                                \"enum\": [\"\", \"fastest\", \"standard\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"verification_method\": {\n                                \"enum\": [\n                                  \"automatic\",\n                                  \"instant\",\n                                  \"microdeposits\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"wechat_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"app_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"client\": {\n                                \"enum\": [\"android\", \"ios\", \"web\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"client\"],\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"zip\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_types\": {\n                    \"description\": \"The list of payment method types (for example, a card) that this PaymentIntent can use. If you don't provide this, Stripe will dynamically show relevant payment methods from your [payment method settings](https://dashboard.stripe.com/settings/payment_methods).\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"radar_options\": {\n                    \"description\": \"Options to configure Radar. Learn more about [Radar Sessions](https://stripe.com/docs/radar/radar-session).\",\n                    \"properties\": {\n                      \"session\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"radar_options_with_hidden_options\",\n                    \"type\": \"object\"\n                  },\n                  \"receipt_email\": {\n                    \"description\": \"Email address to send the receipt to. If you specify `receipt_email` for a payment in live mode, you send a receipt regardless of your [email settings](https://dashboard.stripe.com/account/emails).\",\n                    \"type\": \"string\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The URL to redirect your customer back to after they authenticate or cancel their payment on the payment method's app or site. If you'd prefer to redirect to a mobile application, you can alternatively supply an application URI scheme. This parameter can only be used with [`confirm=true`](https://stripe.com/docs/api/payment_intents/create#create_payment_intent-confirm).\",\n                    \"type\": \"string\"\n                  },\n                  \"setup_future_usage\": {\n                    \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\",\n                    \"enum\": [\"off_session\", \"on_session\"],\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"description\": \"Shipping information for this PaymentIntent.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"optional_fields_address\",\n                        \"type\": \"object\"\n                      },\n                      \"carrier\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tracking_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"address\", \"name\"],\n                    \"title\": \"optional_fields_shipping\",\n                    \"type\": \"object\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Text that appears on the customer's statement as the statement descriptor for a non-card charge. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\\n\\nSetting this value for a card charge returns an error. For card charges, set the [statement_descriptor_suffix](https://docs.stripe.com/get-started/account/statement-descriptors#dynamic) instead.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor_suffix\": {\n                    \"description\": \"Provides information about a card charge. Concatenated to the account's [statement descriptor prefix](https://docs.stripe.com/get-started/account/statement-descriptors#static) to form the complete statement descriptor that appears on the customer's statement.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"The parameters that you can use to automatically create a Transfer.\\nLearn more about the [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"destination\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"destination\"],\n                    \"title\": \"transfer_data_creation_params\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_group\": {\n                    \"description\": \"A string that identifies the resulting payment as part of a group. Learn more about the [use case for connected accounts](https://stripe.com/docs/connect/separate-charges-and-transfers).\",\n                    \"type\": \"string\"\n                  },\n                  \"use_stripe_sdk\": {\n                    \"description\": \"Set to `true` when confirming server-side and using Stripe.js, iOS, or Android client-side SDKs to handle the next actions.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"required\": [\"amount\", \"currency\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a PaymentIntent\"\n      }\n    },\n    \"/v1/payment_intents/search\": {\n      \"get\": {\n        \"description\": \"<p>Search for PaymentIntents you’ve previously created using Stripe’s <a href=\\\"/docs/search#search-query-language\\\">Search Query Language</a>.\\nDon’t use search in read-after-write flows where strict consistency is necessary. Under normal operating\\nconditions, data is searchable in less than a minute. Occasionally, propagation of new or updated data can be up\\nto an hour behind during outages. Search functionality is not available to merchants in India.</p>\",\n        \"operationId\": \"GetPaymentIntentsSearch\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for pagination across multiple pages of results. Don't include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.\",\n            \"in\": \"query\",\n            \"name\": \"page\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The search query string. See [search query language](https://stripe.com/docs/search#search-query-language) and the list of supported [query fields for payment intents](https://stripe.com/docs/search#query-fields-for-payment-intents).\",\n            \"in\": \"query\",\n            \"name\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payment_intent\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"type\": \"boolean\"\n                    },\n                    \"next_page\": {\n                      \"maxLength\": 5000,\n                      \"nullable\": true,\n                      \"type\": \"string\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n                      \"enum\": [\"search_result\"],\n                      \"type\": \"string\"\n                    },\n                    \"total_count\": {\n                      \"description\": \"The total number of objects that match the query, only accurate up to 10,000.\",\n                      \"type\": \"integer\"\n                    },\n                    \"url\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SearchResult\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Search PaymentIntents\"\n      }\n    },\n    \"/v1/payment_intents/{intent}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a PaymentIntent that has previously been created. </p>\\n\\n<p>You can retrieve a PaymentIntent client-side using a publishable key when the <code>client_secret</code> is in the query string. </p>\\n\\n<p>If you retrieve a PaymentIntent with a publishable key, it only returns a subset of properties. Refer to the <a href=\\\"#payment_intent_object\\\">payment intent</a> object reference for more details.</p>\",\n        \"operationId\": \"GetPaymentIntentsIntent\",\n        \"parameters\": [\n          {\n            \"description\": \"The client secret of the PaymentIntent. We require it if you use a publishable key to retrieve the source.\",\n            \"in\": \"query\",\n            \"name\": \"client_secret\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a PaymentIntent\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates properties on a PaymentIntent object without confirming.</p>\\n\\n<p>Depending on which properties you update, you might need to confirm the\\nPaymentIntent again. For example, updating the <code>payment_method</code>\\nalways requires you to confirm the PaymentIntent again. If you prefer to\\nupdate and confirm at the same time, we recommend updating properties through\\nthe <a href=\\\"/docs/api/payment_intents/confirm\\\">confirm API</a> instead.</p>\",\n        \"operationId\": \"PostPaymentIntentsIntent\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"application_fee_amount\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"receipt_email\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount intended to be collected by this PaymentIntent. A positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or [equivalent in charge currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts). The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99).\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee_amount\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total payment amount. For more information, see the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\"\n                  },\n                  \"capture_method\": {\n                    \"description\": \"Controls when the funds will be captured from the customer's account.\",\n                    \"enum\": [\"automatic\", \"automatic_async\", \"manual\"],\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"ID of the Customer this PaymentIntent belongs to, if one exists.\\n\\nPayment methods attached to other Customers cannot be used with this PaymentIntent.\\n\\nIf [setup_future_usage](https://stripe.com/docs/api#payment_intent_object-setup_future_usage) is set and this PaymentIntent's payment method is not `card_present`, then the payment method attaches to the Customer after the PaymentIntent has been confirmed and any required actions from the user are complete. If the payment method is `card_present` and isn't a digital wallet, then a [generated_card](https://docs.stripe.com/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card is created and attached to the Customer instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 1000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"ID of the payment method (a PaymentMethod, Card, or [compatible Source](https://stripe.com/docs/payments/payment-methods/transitioning#compatibility) object) to attach to this PaymentIntent. To unset this field to null, pass in an empty string.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_configuration\": {\n                    \"description\": \"The ID of the [payment method configuration](https://stripe.com/docs/api/payment_method_configurations) to use with this PaymentIntent.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"If provided, this hash will be used to create a PaymentMethod. The new PaymentMethod will appear\\nin the [payment_method](https://stripe.com/docs/api/payment_intents/object#payment_intent_object-payment_method)\\nproperty on the PaymentIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"institution_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"transit_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"account_number\",\n                          \"institution_number\",\n                          \"transit_number\"\n                        ],\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"alma\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"bsb_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"bsb_number\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"sort_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"blik\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"tax_id\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"arzte_und_apotheker_bank\",\n                              \"austrian_anadi_bank_ag\",\n                              \"bank_austria\",\n                              \"bankhaus_carl_spangler\",\n                              \"bankhaus_schelhammer_und_schattera_ag\",\n                              \"bawag_psk_ag\",\n                              \"bks_bank_ag\",\n                              \"brull_kallmus_bank_ag\",\n                              \"btv_vier_lander_bank\",\n                              \"capital_bank_grawe_gruppe_ag\",\n                              \"deutsche_bank_ag\",\n                              \"dolomitenbank\",\n                              \"easybank_ag\",\n                              \"erste_bank_und_sparkassen\",\n                              \"hypo_alpeadriabank_international_ag\",\n                              \"hypo_bank_burgenland_aktiengesellschaft\",\n                              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                              \"hypo_oberosterreich_salzburg_steiermark\",\n                              \"hypo_tirol_bank_ag\",\n                              \"hypo_vorarlberg_bank_ag\",\n                              \"marchfelder_bank\",\n                              \"oberbank_ag\",\n                              \"raiffeisen_bankengruppe_osterreich\",\n                              \"schoellerbank_ag\",\n                              \"sparda_bank_wien\",\n                              \"volksbank_gruppe\",\n                              \"volkskreditbank_ag\",\n                              \"vr_bank_braunau\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"affin_bank\",\n                              \"agrobank\",\n                              \"alliance_bank\",\n                              \"ambank\",\n                              \"bank_islam\",\n                              \"bank_muamalat\",\n                              \"bank_of_china\",\n                              \"bank_rakyat\",\n                              \"bsn\",\n                              \"cimb\",\n                              \"deutsche_bank\",\n                              \"hong_leong_bank\",\n                              \"hsbc\",\n                              \"kfh\",\n                              \"maybank2e\",\n                              \"maybank2u\",\n                              \"ocbc\",\n                              \"pb_enterprise\",\n                              \"public_bank\",\n                              \"rhb\",\n                              \"standard_chartered\",\n                              \"uob\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"bank\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"abn_amro\",\n                              \"asn_bank\",\n                              \"bunq\",\n                              \"handelsbanken\",\n                              \"ing\",\n                              \"knab\",\n                              \"moneyou\",\n                              \"n26\",\n                              \"nn\",\n                              \"rabobank\",\n                              \"regiobank\",\n                              \"revolut\",\n                              \"sns_bank\",\n                              \"triodos_bank\",\n                              \"van_lanschot\",\n                              \"yoursafe\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"interac_present\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"dob\": {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"funding\": {\n                            \"enum\": [\"card\", \"points\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"alior_bank\",\n                              \"bank_millennium\",\n                              \"bank_nowy_bfg_sa\",\n                              \"bank_pekao_sa\",\n                              \"banki_spbdzielcze\",\n                              \"blik\",\n                              \"bnp_paribas\",\n                              \"boz\",\n                              \"citi_handlowy\",\n                              \"credit_agricole\",\n                              \"envelobank\",\n                              \"etransfer_pocztowy24\",\n                              \"getin_bank\",\n                              \"ideabank\",\n                              \"ing\",\n                              \"inteligo\",\n                              \"mbank_mtransfer\",\n                              \"nest_przelew\",\n                              \"noble_pay\",\n                              \"pbac_z_ipko\",\n                              \"plus_bank\",\n                              \"santander_przelew24\",\n                              \"tmobile_usbugi_bankowe\",\n                              \"toyota_bank\",\n                              \"velobank\",\n                              \"volkswagen_bank\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"radar_options\": {\n                        \"properties\": {\n                          \"session\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"radar_options_with_hidden_options\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"iban\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"iban\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"acss_debit\",\n                          \"affirm\",\n                          \"afterpay_clearpay\",\n                          \"alipay\",\n                          \"alma\",\n                          \"amazon_pay\",\n                          \"au_becs_debit\",\n                          \"bacs_debit\",\n                          \"bancontact\",\n                          \"blik\",\n                          \"boleto\",\n                          \"cashapp\",\n                          \"customer_balance\",\n                          \"eps\",\n                          \"fpx\",\n                          \"giropay\",\n                          \"grabpay\",\n                          \"ideal\",\n                          \"kakao_pay\",\n                          \"klarna\",\n                          \"konbini\",\n                          \"kr_card\",\n                          \"link\",\n                          \"mobilepay\",\n                          \"multibanco\",\n                          \"naver_pay\",\n                          \"oxxo\",\n                          \"p24\",\n                          \"pay_by_bank\",\n                          \"payco\",\n                          \"paynow\",\n                          \"paypal\",\n                          \"pix\",\n                          \"promptpay\",\n                          \"revolut_pay\",\n                          \"samsung_pay\",\n                          \"sepa_debit\",\n                          \"sofort\",\n                          \"swish\",\n                          \"twint\",\n                          \"us_bank_account\",\n                          \"wechat_pay\",\n                          \"zip\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_options\": {\n                    \"description\": \"Payment-method-specific configuration for this PaymentIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"custom_mandate_url\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  },\n                                  \"interval_description\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  },\n                                  \"payment_schedule\": {\n                                    \"enum\": [\n                                      \"combined\",\n                                      \"interval\",\n                                      \"sporadic\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"transaction_type\": {\n                                    \"enum\": [\"business\", \"personal\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"payment_intent_payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"verification_method\": {\n                                \"enum\": [\n                                  \"automatic\",\n                                  \"instant\",\n                                  \"microdeposits\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"affirm\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"maxLength\": 30,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"afterpay_clearpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"reference\": {\n                                \"maxLength\": 128,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"alipay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"alma\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"amazon_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"au_becs_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"bacs_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"reference_prefix\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"maxLength\": 12,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"bancontact\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"preferred_language\": {\n                                \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"blik\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"boleto\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_days\": {\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"card\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"cvc_token\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"installments\": {\n                                \"properties\": {\n                                  \"enabled\": {\n                                    \"type\": \"boolean\"\n                                  },\n                                  \"plan\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"properties\": {\n                                          \"count\": {\n                                            \"type\": \"integer\"\n                                          },\n                                          \"interval\": {\n                                            \"enum\": [\"month\"],\n                                            \"type\": \"string\"\n                                          },\n                                          \"type\": {\n                                            \"enum\": [\"fixed_count\"],\n                                            \"type\": \"string\",\n                                            \"x-stripeBypassValidation\": true\n                                          }\n                                        },\n                                        \"required\": [\"type\"],\n                                        \"title\": \"installment_plan\",\n                                        \"type\": \"object\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"installments_param\",\n                                \"type\": \"object\"\n                              },\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"amount_type\": {\n                                    \"enum\": [\"fixed\", \"maximum\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"description\": {\n                                    \"maxLength\": 200,\n                                    \"type\": \"string\"\n                                  },\n                                  \"end_date\": {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  \"interval\": {\n                                    \"enum\": [\n                                      \"day\",\n                                      \"month\",\n                                      \"sporadic\",\n                                      \"week\",\n                                      \"year\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"interval_count\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"reference\": {\n                                    \"maxLength\": 80,\n                                    \"type\": \"string\"\n                                  },\n                                  \"start_date\": {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  \"supported_types\": {\n                                    \"items\": {\n                                      \"enum\": [\"india\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"amount\",\n                                  \"amount_type\",\n                                  \"interval\",\n                                  \"reference\",\n                                  \"start_date\"\n                                ],\n                                \"title\": \"mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"network\": {\n                                \"enum\": [\n                                  \"amex\",\n                                  \"cartes_bancaires\",\n                                  \"diners\",\n                                  \"discover\",\n                                  \"eftpos_au\",\n                                  \"girocard\",\n                                  \"interac\",\n                                  \"jcb\",\n                                  \"link\",\n                                  \"mastercard\",\n                                  \"unionpay\",\n                                  \"unknown\",\n                                  \"visa\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"request_extended_authorization\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_incremental_authorization\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_multicapture\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_overcapture\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_three_d_secure\": {\n                                \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"require_cvc_recollection\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"statement_descriptor_suffix_kana\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 22,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"statement_descriptor_suffix_kanji\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 17,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"three_d_secure\": {\n                                \"properties\": {\n                                  \"ares_trans_status\": {\n                                    \"enum\": [\"A\", \"C\", \"I\", \"N\", \"R\", \"U\", \"Y\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"cryptogram\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"electronic_commerce_indicator\": {\n                                    \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  },\n                                  \"exemption_indicator\": {\n                                    \"enum\": [\"low_risk\", \"none\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"network_options\": {\n                                    \"properties\": {\n                                      \"cartes_bancaires\": {\n                                        \"properties\": {\n                                          \"cb_avalgo\": {\n                                            \"enum\": [\n                                              \"0\",\n                                              \"1\",\n                                              \"2\",\n                                              \"3\",\n                                              \"4\",\n                                              \"A\"\n                                            ],\n                                            \"type\": \"string\"\n                                          },\n                                          \"cb_exemption\": {\n                                            \"maxLength\": 4,\n                                            \"type\": \"string\"\n                                          },\n                                          \"cb_score\": {\n                                            \"type\": \"integer\"\n                                          }\n                                        },\n                                        \"required\": [\"cb_avalgo\"],\n                                        \"title\": \"cartes_bancaires_network_options_param\",\n                                        \"type\": \"object\"\n                                      }\n                                    },\n                                    \"title\": \"network_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"requestor_challenge_indicator\": {\n                                    \"maxLength\": 2,\n                                    \"type\": \"string\"\n                                  },\n                                  \"transaction_id\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"version\": {\n                                    \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"required\": [\n                                  \"cryptogram\",\n                                  \"transaction_id\",\n                                  \"version\"\n                                ],\n                                \"title\": \"payment_method_options_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"payment_intent_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"card_present\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"request_extended_authorization\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"request_incremental_authorization_support\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"routing\": {\n                                \"properties\": {\n                                  \"requested_priority\": {\n                                    \"enum\": [\"domestic\", \"international\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"routing_payment_method_options_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"cashapp\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"customer_balance\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"bank_transfer\": {\n                                \"properties\": {\n                                  \"eu_bank_transfer\": {\n                                    \"properties\": {\n                                      \"country\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\"country\"],\n                                    \"title\": \"eu_bank_transfer_params\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"requested_address_types\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"aba\",\n                                        \"iban\",\n                                        \"sepa\",\n                                        \"sort_code\",\n                                        \"spei\",\n                                        \"swift\",\n                                        \"zengin\"\n                                      ],\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"type\": {\n                                    \"enum\": [\n                                      \"eu_bank_transfer\",\n                                      \"gb_bank_transfer\",\n                                      \"jp_bank_transfer\",\n                                      \"mx_bank_transfer\",\n                                      \"us_bank_transfer\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"required\": [\"type\"],\n                                \"title\": \"bank_transfer_param\",\n                                \"type\": \"object\"\n                              },\n                              \"funding_type\": {\n                                \"enum\": [\"bank_transfer\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"eps\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"fpx\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"giropay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"grabpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"ideal\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"interac_present\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {},\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"kakao_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"klarna\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"enum\": [\n                                  \"cs-CZ\",\n                                  \"da-DK\",\n                                  \"de-AT\",\n                                  \"de-CH\",\n                                  \"de-DE\",\n                                  \"el-GR\",\n                                  \"en-AT\",\n                                  \"en-AU\",\n                                  \"en-BE\",\n                                  \"en-CA\",\n                                  \"en-CH\",\n                                  \"en-CZ\",\n                                  \"en-DE\",\n                                  \"en-DK\",\n                                  \"en-ES\",\n                                  \"en-FI\",\n                                  \"en-FR\",\n                                  \"en-GB\",\n                                  \"en-GR\",\n                                  \"en-IE\",\n                                  \"en-IT\",\n                                  \"en-NL\",\n                                  \"en-NO\",\n                                  \"en-NZ\",\n                                  \"en-PL\",\n                                  \"en-PT\",\n                                  \"en-RO\",\n                                  \"en-SE\",\n                                  \"en-US\",\n                                  \"es-ES\",\n                                  \"es-US\",\n                                  \"fi-FI\",\n                                  \"fr-BE\",\n                                  \"fr-CA\",\n                                  \"fr-CH\",\n                                  \"fr-FR\",\n                                  \"it-CH\",\n                                  \"it-IT\",\n                                  \"nb-NO\",\n                                  \"nl-BE\",\n                                  \"nl-NL\",\n                                  \"pl-PL\",\n                                  \"pt-PT\",\n                                  \"ro-RO\",\n                                  \"sv-FI\",\n                                  \"sv-SE\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"konbini\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"confirmation_number\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 11,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expires_after_days\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expires_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 22,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"kr_card\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"link\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"mobilepay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"multibanco\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"naver_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"oxxo\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_days\": {\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"p24\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              },\n                              \"tos_shown_and_accepted\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"pay_by_bank\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {},\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"payco\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"paynow\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"paypal\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"enum\": [\n                                  \"cs-CZ\",\n                                  \"da-DK\",\n                                  \"de-AT\",\n                                  \"de-DE\",\n                                  \"de-LU\",\n                                  \"el-GR\",\n                                  \"en-GB\",\n                                  \"en-US\",\n                                  \"es-ES\",\n                                  \"fi-FI\",\n                                  \"fr-BE\",\n                                  \"fr-FR\",\n                                  \"fr-LU\",\n                                  \"hu-HU\",\n                                  \"it-IT\",\n                                  \"nl-BE\",\n                                  \"nl-NL\",\n                                  \"pl-PL\",\n                                  \"pt-PT\",\n                                  \"sk-SK\",\n                                  \"sv-SE\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"reference\": {\n                                \"maxLength\": 127,\n                                \"type\": \"string\"\n                              },\n                              \"risk_correlation_id\": {\n                                \"maxLength\": 32,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"pix\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_seconds\": {\n                                \"type\": \"integer\"\n                              },\n                              \"expires_at\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"promptpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"revolut_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"samsung_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"sepa_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"reference_prefix\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"maxLength\": 12,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"sofort\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"preferred_language\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"de\",\n                                  \"en\",\n                                  \"es\",\n                                  \"fr\",\n                                  \"it\",\n                                  \"nl\",\n                                  \"pl\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"swish\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"reference\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"twint\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"us_bank_account\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"financial_connections\": {\n                                \"properties\": {\n                                  \"filters\": {\n                                    \"properties\": {\n                                      \"account_subcategories\": {\n                                        \"items\": {\n                                          \"enum\": [\"checking\", \"savings\"],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"linked_account_options_filters_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"permissions\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"balances\",\n                                        \"ownership\",\n                                        \"payment_method\",\n                                        \"transactions\"\n                                      ],\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"prefetch\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"balances\",\n                                        \"ownership\",\n                                        \"transactions\"\n                                      ],\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"return_url\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"linked_account_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"collection_method\": {\n                                    \"enum\": [\"\", \"paper\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"networks\": {\n                                \"properties\": {\n                                  \"requested\": {\n                                    \"items\": {\n                                      \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"networks_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"preferred_settlement_speed\": {\n                                \"enum\": [\"\", \"fastest\", \"standard\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"verification_method\": {\n                                \"enum\": [\n                                  \"automatic\",\n                                  \"instant\",\n                                  \"microdeposits\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"wechat_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"app_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"client\": {\n                                \"enum\": [\"android\", \"ios\", \"web\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"client\"],\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"zip\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_types\": {\n                    \"description\": \"The list of payment method types (for example, card) that this PaymentIntent can use. Use `automatic_payment_methods` to manage payment methods from the [Stripe Dashboard](https://dashboard.stripe.com/settings/payment_methods).\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"receipt_email\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Email address that the receipt for the resulting payment will be sent to. If `receipt_email` is specified for a payment in live mode, a receipt will be sent regardless of your [email settings](https://dashboard.stripe.com/account/emails).\"\n                  },\n                  \"setup_future_usage\": {\n                    \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\\n\\nIf you've already set `setup_future_usage` and you're performing a request using a publishable key, you can only update the value from `on_session` to `off_session`.\",\n                    \"enum\": [\"\", \"off_session\", \"on_session\"],\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"optional_fields_address\",\n                            \"type\": \"object\"\n                          },\n                          \"carrier\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"tracking_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\", \"name\"],\n                        \"title\": \"optional_fields_shipping\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Shipping information for this PaymentIntent.\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Text that appears on the customer's statement as the statement descriptor for a non-card charge. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\\n\\nSetting this value for a card charge returns an error. For card charges, set the [statement_descriptor_suffix](https://docs.stripe.com/get-started/account/statement-descriptors#dynamic) instead.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor_suffix\": {\n                    \"description\": \"Provides information about a card charge. Concatenated to the account's [statement descriptor prefix](https://docs.stripe.com/get-started/account/statement-descriptors#static) to form the complete statement descriptor that appears on the customer's statement.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"Use this parameter to automatically create a Transfer when the payment succeeds. Learn more about the [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"title\": \"transfer_data_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_group\": {\n                    \"description\": \"A string that identifies the resulting payment as part of a group. You can only provide `transfer_group` if it hasn't been set. Learn more about the [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a PaymentIntent\"\n      }\n    },\n    \"/v1/payment_intents/{intent}/apply_customer_balance\": {\n      \"post\": {\n        \"description\": \"<p>Manually reconcile the remaining amount for a <code>customer_balance</code> PaymentIntent.</p>\",\n        \"operationId\": \"PostPaymentIntentsIntentApplyCustomerBalance\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount that you intend to apply to this PaymentIntent from the customer’s cash balance. If the PaymentIntent was created by an Invoice, the full amount of the PaymentIntent is applied regardless of this parameter.\\n\\nA positive integer representing how much to charge in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (for example, 100 cents to charge 1 USD or 100 to charge 100 JPY, a zero-decimal currency). The maximum amount is the amount of the PaymentIntent.\\n\\nWhen you omit the amount, it defaults to the remaining amount requested on the PaymentIntent.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Reconcile a customer_balance PaymentIntent\"\n      }\n    },\n    \"/v1/payment_intents/{intent}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>You can cancel a PaymentIntent object when it’s in one of these statuses: <code>requires_payment_method</code>, <code>requires_capture</code>, <code>requires_confirmation</code>, <code>requires_action</code> or, <a href=\\\"/docs/payments/intents\\\">in rare cases</a>, <code>processing</code>. </p>\\n\\n<p>After it’s canceled, no additional charges are made by the PaymentIntent and any operations on the PaymentIntent fail with an error. For PaymentIntents with a <code>status</code> of <code>requires_capture</code>, the remaining <code>amount_capturable</code> is automatically refunded. </p>\\n\\n<p>You can’t cancel the PaymentIntent for a Checkout Session. <a href=\\\"/docs/api/checkout/sessions/expire\\\">Expire the Checkout Session</a> instead.</p>\",\n        \"operationId\": \"PostPaymentIntentsIntentCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"cancellation_reason\": {\n                    \"description\": \"Reason for canceling this PaymentIntent. Possible values are: `duplicate`, `fraudulent`, `requested_by_customer`, or `abandoned`\",\n                    \"enum\": [\n                      \"abandoned\",\n                      \"duplicate\",\n                      \"fraudulent\",\n                      \"requested_by_customer\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a PaymentIntent\"\n      }\n    },\n    \"/v1/payment_intents/{intent}/capture\": {\n      \"post\": {\n        \"description\": \"<p>Capture the funds of an existing uncaptured PaymentIntent when its status is <code>requires_capture</code>.</p>\\n\\n<p>Uncaptured PaymentIntents are cancelled a set number of days (7 by default) after their creation.</p>\\n\\n<p>Learn more about <a href=\\\"/docs/payments/capture-later\\\">separate authorization and capture</a>.</p>\",\n        \"operationId\": \"PostPaymentIntentsIntentCapture\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount_to_capture\": {\n                    \"description\": \"The amount to capture from the PaymentIntent, which must be less than or equal to the original amount. Any additional amount is automatically refunded. Defaults to the full `amount_capturable` if it's not provided.\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total payment amount. For more information, see the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"final_capture\": {\n                    \"description\": \"Defaults to `true`. When capturing a PaymentIntent, setting `final_capture` to `false` notifies Stripe to not release the remaining uncaptured funds to make sure that they're captured in future requests. You can only use this setting when [multicapture](https://stripe.com/docs/payments/multicapture) is available for PaymentIntents.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Text that appears on the customer's statement as the statement descriptor for a non-card charge. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\\n\\nSetting this value for a card charge returns an error. For card charges, set the [statement_descriptor_suffix](https://docs.stripe.com/get-started/account/statement-descriptors#dynamic) instead.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor_suffix\": {\n                    \"description\": \"Provides information about a card charge. Concatenated to the account's [statement descriptor prefix](https://docs.stripe.com/get-started/account/statement-descriptors#static) to form the complete statement descriptor that appears on the customer's statement.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"The parameters that you can use to automatically create a transfer after the payment\\nis captured. Learn more about the [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"title\": \"transfer_data_update_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Capture a PaymentIntent\"\n      }\n    },\n    \"/v1/payment_intents/{intent}/confirm\": {\n      \"post\": {\n        \"description\": \"<p>Confirm that your customer intends to pay with current or provided\\npayment method. Upon confirmation, the PaymentIntent will attempt to initiate\\na payment.\\nIf the selected payment method requires additional authentication steps, the\\nPaymentIntent will transition to the <code>requires_action</code> status and\\nsuggest additional actions via <code>next_action</code>. If payment fails,\\nthe PaymentIntent transitions to the <code>requires_payment_method</code> status or the\\n<code>canceled</code> status if the confirmation limit is reached. If\\npayment succeeds, the PaymentIntent will transition to the <code>succeeded</code>\\nstatus (or <code>requires_capture</code>, if <code>capture_method</code> is set to <code>manual</code>).\\nIf the <code>confirmation_method</code> is <code>automatic</code>, payment may be attempted\\nusing our <a href=\\\"/docs/stripe-js/reference#stripe-handle-card-payment\\\">client SDKs</a>\\nand the PaymentIntent’s <a href=\\\"#payment_intent_object-client_secret\\\">client_secret</a>.\\nAfter <code>next_action</code>s are handled by the client, no additional\\nconfirmation is required to complete the payment.\\nIf the <code>confirmation_method</code> is <code>manual</code>, all payment attempts must be\\ninitiated using a secret key.\\nIf any actions are required for the payment, the PaymentIntent will\\nreturn to the <code>requires_confirmation</code> state\\nafter those actions are completed. Your server needs to then\\nexplicitly re-confirm the PaymentIntent to initiate the next payment\\nattempt.\\nThere is a variable upper limit on how many times a PaymentIntent can be confirmed.\\nAfter this limit is reached, any further calls to this endpoint will\\ntransition the PaymentIntent to the <code>canceled</code> state.</p>\",\n        \"operationId\": \"PostPaymentIntentsIntentConfirm\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mandate_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"off_session\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"radar_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"receipt_email\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"capture_method\": {\n                    \"description\": \"Controls when the funds will be captured from the customer's account.\",\n                    \"enum\": [\"automatic\", \"automatic_async\", \"manual\"],\n                    \"type\": \"string\"\n                  },\n                  \"client_secret\": {\n                    \"description\": \"The client secret of the PaymentIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"confirmation_token\": {\n                    \"description\": \"ID of the ConfirmationToken used to confirm this PaymentIntent.\\n\\nIf the provided ConfirmationToken contains properties that are also being provided in this request, such as `payment_method`, then the values in this request will take precedence.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"error_on_requires_action\": {\n                    \"description\": \"Set to `true` to fail the payment attempt if the PaymentIntent transitions into `requires_action`. This parameter is intended for simpler integrations that do not handle customer actions, like [saving cards without authentication](https://stripe.com/docs/payments/save-card-without-authentication).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"mandate\": {\n                    \"description\": \"ID of the mandate that's used for this payment.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"mandate_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"customer_acceptance\": {\n                            \"properties\": {\n                              \"accepted_at\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"offline\": {\n                                \"properties\": {},\n                                \"title\": \"offline_param\",\n                                \"type\": \"object\"\n                              },\n                              \"online\": {\n                                \"properties\": {\n                                  \"ip_address\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"user_agent\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"ip_address\", \"user_agent\"],\n                                \"title\": \"online_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"offline\", \"online\"],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"customer_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"customer_acceptance\"],\n                        \"title\": \"secret_key_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"description\": \"This hash contains details about the Mandate to create\",\n                        \"properties\": {\n                          \"customer_acceptance\": {\n                            \"properties\": {\n                              \"online\": {\n                                \"properties\": {\n                                  \"ip_address\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"user_agent\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"online_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"online\"],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"online\", \"type\"],\n                            \"title\": \"customer_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"customer_acceptance\"],\n                        \"title\": \"client_key_param\",\n                        \"type\": \"object\"\n                      }\n                    ]\n                  },\n                  \"off_session\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"boolean\"\n                      },\n                      {\n                        \"enum\": [\"one_off\", \"recurring\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set to `true` to indicate that the customer isn't in your checkout flow during this payment attempt and can't authenticate. Use this parameter in scenarios where you collect card details and [charge them later](https://stripe.com/docs/payments/cards/charging-saved-cards).\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"ID of the payment method (a PaymentMethod, Card, or [compatible Source](https://stripe.com/docs/payments/payment-methods/transitioning#compatibility) object) to attach to this PaymentIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"If provided, this hash will be used to create a PaymentMethod. The new PaymentMethod will appear\\nin the [payment_method](https://stripe.com/docs/api/payment_intents/object#payment_intent_object-payment_method)\\nproperty on the PaymentIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"institution_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"transit_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"account_number\",\n                          \"institution_number\",\n                          \"transit_number\"\n                        ],\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"alma\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"bsb_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"bsb_number\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"sort_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"blik\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"tax_id\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"arzte_und_apotheker_bank\",\n                              \"austrian_anadi_bank_ag\",\n                              \"bank_austria\",\n                              \"bankhaus_carl_spangler\",\n                              \"bankhaus_schelhammer_und_schattera_ag\",\n                              \"bawag_psk_ag\",\n                              \"bks_bank_ag\",\n                              \"brull_kallmus_bank_ag\",\n                              \"btv_vier_lander_bank\",\n                              \"capital_bank_grawe_gruppe_ag\",\n                              \"deutsche_bank_ag\",\n                              \"dolomitenbank\",\n                              \"easybank_ag\",\n                              \"erste_bank_und_sparkassen\",\n                              \"hypo_alpeadriabank_international_ag\",\n                              \"hypo_bank_burgenland_aktiengesellschaft\",\n                              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                              \"hypo_oberosterreich_salzburg_steiermark\",\n                              \"hypo_tirol_bank_ag\",\n                              \"hypo_vorarlberg_bank_ag\",\n                              \"marchfelder_bank\",\n                              \"oberbank_ag\",\n                              \"raiffeisen_bankengruppe_osterreich\",\n                              \"schoellerbank_ag\",\n                              \"sparda_bank_wien\",\n                              \"volksbank_gruppe\",\n                              \"volkskreditbank_ag\",\n                              \"vr_bank_braunau\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"affin_bank\",\n                              \"agrobank\",\n                              \"alliance_bank\",\n                              \"ambank\",\n                              \"bank_islam\",\n                              \"bank_muamalat\",\n                              \"bank_of_china\",\n                              \"bank_rakyat\",\n                              \"bsn\",\n                              \"cimb\",\n                              \"deutsche_bank\",\n                              \"hong_leong_bank\",\n                              \"hsbc\",\n                              \"kfh\",\n                              \"maybank2e\",\n                              \"maybank2u\",\n                              \"ocbc\",\n                              \"pb_enterprise\",\n                              \"public_bank\",\n                              \"rhb\",\n                              \"standard_chartered\",\n                              \"uob\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"bank\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"abn_amro\",\n                              \"asn_bank\",\n                              \"bunq\",\n                              \"handelsbanken\",\n                              \"ing\",\n                              \"knab\",\n                              \"moneyou\",\n                              \"n26\",\n                              \"nn\",\n                              \"rabobank\",\n                              \"regiobank\",\n                              \"revolut\",\n                              \"sns_bank\",\n                              \"triodos_bank\",\n                              \"van_lanschot\",\n                              \"yoursafe\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"interac_present\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"dob\": {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"funding\": {\n                            \"enum\": [\"card\", \"points\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"alior_bank\",\n                              \"bank_millennium\",\n                              \"bank_nowy_bfg_sa\",\n                              \"bank_pekao_sa\",\n                              \"banki_spbdzielcze\",\n                              \"blik\",\n                              \"bnp_paribas\",\n                              \"boz\",\n                              \"citi_handlowy\",\n                              \"credit_agricole\",\n                              \"envelobank\",\n                              \"etransfer_pocztowy24\",\n                              \"getin_bank\",\n                              \"ideabank\",\n                              \"ing\",\n                              \"inteligo\",\n                              \"mbank_mtransfer\",\n                              \"nest_przelew\",\n                              \"noble_pay\",\n                              \"pbac_z_ipko\",\n                              \"plus_bank\",\n                              \"santander_przelew24\",\n                              \"tmobile_usbugi_bankowe\",\n                              \"toyota_bank\",\n                              \"velobank\",\n                              \"volkswagen_bank\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"radar_options\": {\n                        \"properties\": {\n                          \"session\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"radar_options_with_hidden_options\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"iban\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"iban\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"acss_debit\",\n                          \"affirm\",\n                          \"afterpay_clearpay\",\n                          \"alipay\",\n                          \"alma\",\n                          \"amazon_pay\",\n                          \"au_becs_debit\",\n                          \"bacs_debit\",\n                          \"bancontact\",\n                          \"blik\",\n                          \"boleto\",\n                          \"cashapp\",\n                          \"customer_balance\",\n                          \"eps\",\n                          \"fpx\",\n                          \"giropay\",\n                          \"grabpay\",\n                          \"ideal\",\n                          \"kakao_pay\",\n                          \"klarna\",\n                          \"konbini\",\n                          \"kr_card\",\n                          \"link\",\n                          \"mobilepay\",\n                          \"multibanco\",\n                          \"naver_pay\",\n                          \"oxxo\",\n                          \"p24\",\n                          \"pay_by_bank\",\n                          \"payco\",\n                          \"paynow\",\n                          \"paypal\",\n                          \"pix\",\n                          \"promptpay\",\n                          \"revolut_pay\",\n                          \"samsung_pay\",\n                          \"sepa_debit\",\n                          \"sofort\",\n                          \"swish\",\n                          \"twint\",\n                          \"us_bank_account\",\n                          \"wechat_pay\",\n                          \"zip\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_options\": {\n                    \"description\": \"Payment method-specific configuration for this PaymentIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"custom_mandate_url\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  },\n                                  \"interval_description\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  },\n                                  \"payment_schedule\": {\n                                    \"enum\": [\n                                      \"combined\",\n                                      \"interval\",\n                                      \"sporadic\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"transaction_type\": {\n                                    \"enum\": [\"business\", \"personal\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"payment_intent_payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"verification_method\": {\n                                \"enum\": [\n                                  \"automatic\",\n                                  \"instant\",\n                                  \"microdeposits\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"affirm\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"maxLength\": 30,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"afterpay_clearpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"reference\": {\n                                \"maxLength\": 128,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"alipay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"alma\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"amazon_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"au_becs_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"bacs_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"reference_prefix\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"maxLength\": 12,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"bancontact\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"preferred_language\": {\n                                \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"blik\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"boleto\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_days\": {\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"card\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"cvc_token\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"installments\": {\n                                \"properties\": {\n                                  \"enabled\": {\n                                    \"type\": \"boolean\"\n                                  },\n                                  \"plan\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"properties\": {\n                                          \"count\": {\n                                            \"type\": \"integer\"\n                                          },\n                                          \"interval\": {\n                                            \"enum\": [\"month\"],\n                                            \"type\": \"string\"\n                                          },\n                                          \"type\": {\n                                            \"enum\": [\"fixed_count\"],\n                                            \"type\": \"string\",\n                                            \"x-stripeBypassValidation\": true\n                                          }\n                                        },\n                                        \"required\": [\"type\"],\n                                        \"title\": \"installment_plan\",\n                                        \"type\": \"object\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"installments_param\",\n                                \"type\": \"object\"\n                              },\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"amount_type\": {\n                                    \"enum\": [\"fixed\", \"maximum\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"description\": {\n                                    \"maxLength\": 200,\n                                    \"type\": \"string\"\n                                  },\n                                  \"end_date\": {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  \"interval\": {\n                                    \"enum\": [\n                                      \"day\",\n                                      \"month\",\n                                      \"sporadic\",\n                                      \"week\",\n                                      \"year\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"interval_count\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"reference\": {\n                                    \"maxLength\": 80,\n                                    \"type\": \"string\"\n                                  },\n                                  \"start_date\": {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  \"supported_types\": {\n                                    \"items\": {\n                                      \"enum\": [\"india\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"amount\",\n                                  \"amount_type\",\n                                  \"interval\",\n                                  \"reference\",\n                                  \"start_date\"\n                                ],\n                                \"title\": \"mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"network\": {\n                                \"enum\": [\n                                  \"amex\",\n                                  \"cartes_bancaires\",\n                                  \"diners\",\n                                  \"discover\",\n                                  \"eftpos_au\",\n                                  \"girocard\",\n                                  \"interac\",\n                                  \"jcb\",\n                                  \"link\",\n                                  \"mastercard\",\n                                  \"unionpay\",\n                                  \"unknown\",\n                                  \"visa\"\n                                ],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"request_extended_authorization\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_incremental_authorization\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_multicapture\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_overcapture\": {\n                                \"enum\": [\"if_available\", \"never\"],\n                                \"type\": \"string\"\n                              },\n                              \"request_three_d_secure\": {\n                                \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"require_cvc_recollection\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"statement_descriptor_suffix_kana\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 22,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"statement_descriptor_suffix_kanji\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 17,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"three_d_secure\": {\n                                \"properties\": {\n                                  \"ares_trans_status\": {\n                                    \"enum\": [\"A\", \"C\", \"I\", \"N\", \"R\", \"U\", \"Y\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"cryptogram\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"electronic_commerce_indicator\": {\n                                    \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  },\n                                  \"exemption_indicator\": {\n                                    \"enum\": [\"low_risk\", \"none\"],\n                                    \"type\": \"string\"\n                                  },\n                                  \"network_options\": {\n                                    \"properties\": {\n                                      \"cartes_bancaires\": {\n                                        \"properties\": {\n                                          \"cb_avalgo\": {\n                                            \"enum\": [\n                                              \"0\",\n                                              \"1\",\n                                              \"2\",\n                                              \"3\",\n                                              \"4\",\n                                              \"A\"\n                                            ],\n                                            \"type\": \"string\"\n                                          },\n                                          \"cb_exemption\": {\n                                            \"maxLength\": 4,\n                                            \"type\": \"string\"\n                                          },\n                                          \"cb_score\": {\n                                            \"type\": \"integer\"\n                                          }\n                                        },\n                                        \"required\": [\"cb_avalgo\"],\n                                        \"title\": \"cartes_bancaires_network_options_param\",\n                                        \"type\": \"object\"\n                                      }\n                                    },\n                                    \"title\": \"network_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"requestor_challenge_indicator\": {\n                                    \"maxLength\": 2,\n                                    \"type\": \"string\"\n                                  },\n                                  \"transaction_id\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"version\": {\n                                    \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"required\": [\n                                  \"cryptogram\",\n                                  \"transaction_id\",\n                                  \"version\"\n                                ],\n                                \"title\": \"payment_method_options_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"payment_intent_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"card_present\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"request_extended_authorization\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"request_incremental_authorization_support\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"routing\": {\n                                \"properties\": {\n                                  \"requested_priority\": {\n                                    \"enum\": [\"domestic\", \"international\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"routing_payment_method_options_param\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"cashapp\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"customer_balance\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"bank_transfer\": {\n                                \"properties\": {\n                                  \"eu_bank_transfer\": {\n                                    \"properties\": {\n                                      \"country\": {\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\"country\"],\n                                    \"title\": \"eu_bank_transfer_params\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"requested_address_types\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"aba\",\n                                        \"iban\",\n                                        \"sepa\",\n                                        \"sort_code\",\n                                        \"spei\",\n                                        \"swift\",\n                                        \"zengin\"\n                                      ],\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"type\": {\n                                    \"enum\": [\n                                      \"eu_bank_transfer\",\n                                      \"gb_bank_transfer\",\n                                      \"jp_bank_transfer\",\n                                      \"mx_bank_transfer\",\n                                      \"us_bank_transfer\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"required\": [\"type\"],\n                                \"title\": \"bank_transfer_param\",\n                                \"type\": \"object\"\n                              },\n                              \"funding_type\": {\n                                \"enum\": [\"bank_transfer\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"eps\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"fpx\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"giropay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"grabpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"ideal\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"interac_present\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {},\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"kakao_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"klarna\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"enum\": [\n                                  \"cs-CZ\",\n                                  \"da-DK\",\n                                  \"de-AT\",\n                                  \"de-CH\",\n                                  \"de-DE\",\n                                  \"el-GR\",\n                                  \"en-AT\",\n                                  \"en-AU\",\n                                  \"en-BE\",\n                                  \"en-CA\",\n                                  \"en-CH\",\n                                  \"en-CZ\",\n                                  \"en-DE\",\n                                  \"en-DK\",\n                                  \"en-ES\",\n                                  \"en-FI\",\n                                  \"en-FR\",\n                                  \"en-GB\",\n                                  \"en-GR\",\n                                  \"en-IE\",\n                                  \"en-IT\",\n                                  \"en-NL\",\n                                  \"en-NO\",\n                                  \"en-NZ\",\n                                  \"en-PL\",\n                                  \"en-PT\",\n                                  \"en-RO\",\n                                  \"en-SE\",\n                                  \"en-US\",\n                                  \"es-ES\",\n                                  \"es-US\",\n                                  \"fi-FI\",\n                                  \"fr-BE\",\n                                  \"fr-CA\",\n                                  \"fr-CH\",\n                                  \"fr-FR\",\n                                  \"it-CH\",\n                                  \"it-IT\",\n                                  \"nb-NO\",\n                                  \"nl-BE\",\n                                  \"nl-NL\",\n                                  \"pl-PL\",\n                                  \"pt-PT\",\n                                  \"ro-RO\",\n                                  \"sv-FI\",\n                                  \"sv-SE\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"konbini\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"confirmation_number\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 11,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expires_after_days\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"expires_at\": {\n                                \"anyOf\": [\n                                  {\n                                    \"format\": \"unix-time\",\n                                    \"type\": \"integer\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"product_description\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 22,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"kr_card\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"link\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"mobilepay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"multibanco\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"naver_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"oxxo\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_days\": {\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"p24\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              },\n                              \"tos_shown_and_accepted\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"pay_by_bank\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {},\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"payco\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"paynow\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"paypal\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"preferred_locale\": {\n                                \"enum\": [\n                                  \"cs-CZ\",\n                                  \"da-DK\",\n                                  \"de-AT\",\n                                  \"de-DE\",\n                                  \"de-LU\",\n                                  \"el-GR\",\n                                  \"en-GB\",\n                                  \"en-US\",\n                                  \"es-ES\",\n                                  \"fi-FI\",\n                                  \"fr-BE\",\n                                  \"fr-FR\",\n                                  \"fr-LU\",\n                                  \"hu-HU\",\n                                  \"it-IT\",\n                                  \"nl-BE\",\n                                  \"nl-NL\",\n                                  \"pl-PL\",\n                                  \"pt-PT\",\n                                  \"sk-SK\",\n                                  \"sv-SE\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"reference\": {\n                                \"maxLength\": 127,\n                                \"type\": \"string\"\n                              },\n                              \"risk_correlation_id\": {\n                                \"maxLength\": 32,\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"pix\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"expires_after_seconds\": {\n                                \"type\": \"integer\"\n                              },\n                              \"expires_at\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"promptpay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"revolut_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"samsung_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"capture_method\": {\n                                \"enum\": [\"\", \"manual\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"sepa_debit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"reference_prefix\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"maxLength\": 12,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"enum\": [\"\"],\n                                        \"type\": \"string\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"title\": \"payment_method_options_mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"sofort\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"preferred_language\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"de\",\n                                  \"en\",\n                                  \"es\",\n                                  \"fr\",\n                                  \"it\",\n                                  \"nl\",\n                                  \"pl\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"\", \"none\", \"off_session\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"swish\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"reference\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"twint\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"us_bank_account\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"financial_connections\": {\n                                \"properties\": {\n                                  \"filters\": {\n                                    \"properties\": {\n                                      \"account_subcategories\": {\n                                        \"items\": {\n                                          \"enum\": [\"checking\", \"savings\"],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"linked_account_options_filters_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"permissions\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"balances\",\n                                        \"ownership\",\n                                        \"payment_method\",\n                                        \"transactions\"\n                                      ],\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"prefetch\": {\n                                    \"items\": {\n                                      \"enum\": [\n                                        \"balances\",\n                                        \"ownership\",\n                                        \"transactions\"\n                                      ],\n                                      \"type\": \"string\",\n                                      \"x-stripeBypassValidation\": true\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  \"return_url\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"linked_account_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"mandate_options\": {\n                                \"properties\": {\n                                  \"collection_method\": {\n                                    \"enum\": [\"\", \"paper\"],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"mandate_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"networks\": {\n                                \"properties\": {\n                                  \"requested\": {\n                                    \"items\": {\n                                      \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"networks_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"preferred_settlement_speed\": {\n                                \"enum\": [\"\", \"fastest\", \"standard\"],\n                                \"type\": \"string\"\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\n                                  \"\",\n                                  \"none\",\n                                  \"off_session\",\n                                  \"on_session\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"target_date\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"verification_method\": {\n                                \"enum\": [\n                                  \"automatic\",\n                                  \"instant\",\n                                  \"microdeposits\"\n                                ],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"payment_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"wechat_pay\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"app_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"client\": {\n                                \"enum\": [\"android\", \"ios\", \"web\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"client\"],\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"zip\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"setup_future_usage\": {\n                                \"enum\": [\"none\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_types\": {\n                    \"description\": \"The list of payment method types (for example, a card) that this PaymentIntent can use. Use `automatic_payment_methods` to manage payment methods from the [Stripe Dashboard](https://dashboard.stripe.com/settings/payment_methods).\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"radar_options\": {\n                    \"description\": \"Options to configure Radar. Learn more about [Radar Sessions](https://stripe.com/docs/radar/radar-session).\",\n                    \"properties\": {\n                      \"session\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"radar_options_with_hidden_options\",\n                    \"type\": \"object\"\n                  },\n                  \"receipt_email\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Email address that the receipt for the resulting payment will be sent to. If `receipt_email` is specified for a payment in live mode, a receipt will be sent regardless of your [email settings](https://dashboard.stripe.com/account/emails).\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The URL to redirect your customer back to after they authenticate or cancel their payment on the payment method's app or site.\\nIf you'd prefer to redirect to a mobile application, you can alternatively supply an application URI scheme.\\nThis parameter is only used for cards and other redirect-based payment methods.\",\n                    \"type\": \"string\"\n                  },\n                  \"setup_future_usage\": {\n                    \"description\": \"Indicates that you intend to make future payments with this PaymentIntent's payment method.\\n\\nIf you provide a Customer with the PaymentIntent, you can use this parameter to [attach the payment method](/payments/save-during-payment) to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still [attach](/api/payment_methods/attach) the payment method to a Customer after the transaction completes.\\n\\nIf the payment method is `card_present` and isn't a digital wallet, Stripe creates and attaches a [generated_card](/api/charges/object#charge_object-payment_method_details-card_present-generated_card) payment method representing the card to the Customer instead.\\n\\nWhen processing card payments, Stripe uses `setup_future_usage` to help you comply with regional legislation and network rules, such as [SCA](/strong-customer-authentication).\\n\\nIf you've already set `setup_future_usage` and you're performing a request using a publishable key, you can only update the value from `on_session` to `off_session`.\",\n                    \"enum\": [\"\", \"off_session\", \"on_session\"],\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"optional_fields_address\",\n                            \"type\": \"object\"\n                          },\n                          \"carrier\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"tracking_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\", \"name\"],\n                        \"title\": \"optional_fields_shipping\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Shipping information for this PaymentIntent.\"\n                  },\n                  \"use_stripe_sdk\": {\n                    \"description\": \"Set to `true` when confirming server-side and using Stripe.js, iOS, or Android client-side SDKs to handle the next actions.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Confirm a PaymentIntent\"\n      }\n    },\n    \"/v1/payment_intents/{intent}/increment_authorization\": {\n      \"post\": {\n        \"description\": \"<p>Perform an incremental authorization on an eligible\\n<a href=\\\"/docs/api/payment_intents/object\\\">PaymentIntent</a>. To be eligible, the\\nPaymentIntent’s status must be <code>requires_capture</code> and\\n<a href=\\\"/docs/api/charges/object#charge_object-payment_method_details-card_present-incremental_authorization_supported\\\">incremental_authorization_supported</a>\\nmust be <code>true</code>.</p>\\n\\n<p>Incremental authorizations attempt to increase the authorized amount on\\nyour customer’s card to the new, higher <code>amount</code> provided. Similar to the\\ninitial authorization, incremental authorizations can be declined. A\\nsingle PaymentIntent can call this endpoint multiple times to further\\nincrease the authorized amount.</p>\\n\\n<p>If the incremental authorization succeeds, the PaymentIntent object\\nreturns with the updated\\n<a href=\\\"/docs/api/payment_intents/object#payment_intent_object-amount\\\">amount</a>.\\nIf the incremental authorization fails, a\\n<a href=\\\"/docs/error-codes#card-declined\\\">card_declined</a> error returns, and no other\\nfields on the PaymentIntent or Charge update. The PaymentIntent\\nobject remains capturable for the previously authorized amount.</p>\\n\\n<p>Each PaymentIntent can have a maximum of 10 incremental authorization attempts, including declines.\\nAfter it’s captured, a PaymentIntent can no longer be incremented.</p>\\n\\n<p>Learn more about <a href=\\\"/docs/terminal/features/incremental-authorizations\\\">incremental authorizations</a>.</p>\",\n        \"operationId\": \"PostPaymentIntentsIntentIncrementAuthorization\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The updated total amount that you intend to collect from the cardholder. This amount must be greater than the currently authorized amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total payment amount. For more information, see the PaymentIntents [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"type\": \"integer\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 1000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Text that appears on the customer's statement as the statement descriptor for a non-card or card charge. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see [the Statement Descriptor docs](https://docs.stripe.com/get-started/account/statement-descriptors).\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"The parameters used to automatically create a transfer after the payment is captured.\\nLearn more about the [use case for connected accounts](https://stripe.com/docs/payments/connected-accounts).\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"title\": \"transfer_data_update_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"amount\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Increment an authorization\"\n      }\n    },\n    \"/v1/payment_intents/{intent}/verify_microdeposits\": {\n      \"post\": {\n        \"description\": \"<p>Verifies microdeposits on a PaymentIntent object.</p>\",\n        \"operationId\": \"PostPaymentIntentsIntentVerifyMicrodeposits\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"amounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amounts\": {\n                    \"description\": \"Two positive integers, in *cents*, equal to the values of the microdeposits sent to the bank account.\",\n                    \"items\": {\n                      \"type\": \"integer\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"client_secret\": {\n                    \"description\": \"The client secret of the PaymentIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"descriptor_code\": {\n                    \"description\": \"A six-character code starting with SM present in the microdeposit sent to the bank account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Verify microdeposits on a PaymentIntent\"\n      }\n    },\n    \"/v1/payment_links\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your payment links.</p>\",\n        \"operationId\": \"GetPaymentLinks\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return payment links that are active or inactive (e.g., pass `false` to list all inactive payment links).\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payment_link\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/payment_links\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentLinksResourcePaymentLinkList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all payment links\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a payment link.</p>\",\n        \"operationId\": \"PostPaymentLinks\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"after_completion\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"consent_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_fields\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_text\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_creation\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"line_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_intent_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"phone_number_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"restrictions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_address_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"subscription_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_id_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"after_completion\": {\n                    \"description\": \"Behavior after the purchase is complete.\",\n                    \"properties\": {\n                      \"hosted_confirmation\": {\n                        \"properties\": {\n                          \"custom_message\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"after_completion_confirmation_page_params\",\n                        \"type\": \"object\"\n                      },\n                      \"redirect\": {\n                        \"properties\": {\n                          \"url\": {\n                            \"maxLength\": 2048,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"url\"],\n                        \"title\": \"after_completion_redirect_params\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"hosted_confirmation\", \"redirect\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"after_completion_params\",\n                    \"type\": \"object\"\n                  },\n                  \"allow_promotion_codes\": {\n                    \"description\": \"Enables user redeemable promotion codes.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"application_fee_amount\": {\n                    \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. Can only be applied when there are no line items with recurring prices.\",\n                    \"type\": \"integer\"\n                  },\n                  \"application_fee_percent\": {\n                    \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. There must be at least 1 line item with a recurring price to use this field.\",\n                    \"type\": \"number\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Configuration for automatic tax collection.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_params\",\n                    \"type\": \"object\"\n                  },\n                  \"billing_address_collection\": {\n                    \"description\": \"Configuration for collecting the customer's billing address. Defaults to `auto`.\",\n                    \"enum\": [\"auto\", \"required\"],\n                    \"type\": \"string\"\n                  },\n                  \"consent_collection\": {\n                    \"description\": \"Configure fields to gather active consent from customers.\",\n                    \"properties\": {\n                      \"payment_method_reuse_agreement\": {\n                        \"properties\": {\n                          \"position\": {\n                            \"enum\": [\"auto\", \"hidden\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"position\"],\n                        \"title\": \"payment_method_reuse_agreement_params\",\n                        \"type\": \"object\"\n                      },\n                      \"promotions\": {\n                        \"enum\": [\"auto\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"terms_of_service\": {\n                        \"enum\": [\"none\", \"required\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"consent_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies) and supported by each line item's price.\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"custom_fields\": {\n                    \"description\": \"Collect additional information from your customer using custom fields. Up to 3 fields are supported.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"dropdown\": {\n                          \"properties\": {\n                            \"options\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"label\": {\n                                    \"maxLength\": 100,\n                                    \"type\": \"string\"\n                                  },\n                                  \"value\": {\n                                    \"maxLength\": 100,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"label\", \"value\"],\n                                \"title\": \"custom_field_option_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            }\n                          },\n                          \"required\": [\"options\"],\n                          \"title\": \"custom_field_dropdown_param\",\n                          \"type\": \"object\"\n                        },\n                        \"key\": {\n                          \"maxLength\": 200,\n                          \"type\": \"string\"\n                        },\n                        \"label\": {\n                          \"properties\": {\n                            \"custom\": {\n                              \"maxLength\": 50,\n                              \"type\": \"string\"\n                            },\n                            \"type\": {\n                              \"enum\": [\"custom\"],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"custom\", \"type\"],\n                          \"title\": \"custom_field_label_param\",\n                          \"type\": \"object\"\n                        },\n                        \"numeric\": {\n                          \"properties\": {\n                            \"maximum_length\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum_length\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"custom_field_numeric_param\",\n                          \"type\": \"object\"\n                        },\n                        \"optional\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"text\": {\n                          \"properties\": {\n                            \"maximum_length\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum_length\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"custom_field_text_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": {\n                          \"enum\": [\"dropdown\", \"numeric\", \"text\"],\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"key\", \"label\", \"type\"],\n                      \"title\": \"custom_field_param\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"custom_text\": {\n                    \"description\": \"Display additional text for your customers using custom text.\",\n                    \"properties\": {\n                      \"after_submit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"shipping_address\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"submit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"terms_of_service_acceptance\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"custom_text_param\",\n                    \"type\": \"object\"\n                  },\n                  \"customer_creation\": {\n                    \"description\": \"Configures whether [checkout sessions](https://stripe.com/docs/api/checkout/sessions) created by this payment link create a [Customer](https://stripe.com/docs/api/customers).\",\n                    \"enum\": [\"always\", \"if_required\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"inactive_message\": {\n                    \"description\": \"The custom message to be displayed to a customer when a payment link is no longer active.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"invoice_creation\": {\n                    \"description\": \"Generate a post-purchase Invoice for one-time payments.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"invoice_data\": {\n                        \"properties\": {\n                          \"account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"custom_fields\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"name\": {\n                                      \"maxLength\": 40,\n                                      \"type\": \"string\"\n                                    },\n                                    \"value\": {\n                                      \"maxLength\": 140,\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"name\", \"value\"],\n                                  \"title\": \"custom_field_params\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"description\": {\n                            \"maxLength\": 1500,\n                            \"type\": \"string\"\n                          },\n                          \"footer\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          },\n                          \"metadata\": {\n                            \"anyOf\": [\n                              {\n                                \"additionalProperties\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"rendering_options\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"amount_tax_display\": {\n                                    \"enum\": [\n                                      \"\",\n                                      \"exclude_tax\",\n                                      \"include_inclusive_tax\"\n                                    ],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"checkout_rendering_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"invoice_settings_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"invoice_creation_create_params\",\n                    \"type\": \"object\"\n                  },\n                  \"line_items\": {\n                    \"description\": \"The line items representing what is being sold. Each line item represents an item being sold. Up to 20 line items are supported.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"adjustable_quantity\": {\n                          \"properties\": {\n                            \"enabled\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"maximum\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"enabled\"],\n                          \"title\": \"adjustable_quantity_params\",\n                          \"type\": \"object\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        }\n                      },\n                      \"required\": [\"price\", \"quantity\"],\n                      \"title\": \"line_items_create_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`. Metadata associated with this Payment Link will automatically be copied to [checkout sessions](https://stripe.com/docs/api/checkout/sessions) created by this payment link.\",\n                    \"type\": \"object\"\n                  },\n                  \"on_behalf_of\": {\n                    \"description\": \"The account on behalf of which to charge.\",\n                    \"type\": \"string\"\n                  },\n                  \"payment_intent_data\": {\n                    \"description\": \"A subset of parameters to be passed to PaymentIntent creation for Checkout Sessions in `payment` mode.\",\n                    \"properties\": {\n                      \"capture_method\": {\n                        \"enum\": [\"automatic\", \"automatic_async\", \"manual\"],\n                        \"type\": \"string\"\n                      },\n                      \"description\": {\n                        \"maxLength\": 1000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"setup_future_usage\": {\n                        \"enum\": [\"off_session\", \"on_session\"],\n                        \"type\": \"string\"\n                      },\n                      \"statement_descriptor\": {\n                        \"maxLength\": 22,\n                        \"type\": \"string\"\n                      },\n                      \"statement_descriptor_suffix\": {\n                        \"maxLength\": 22,\n                        \"type\": \"string\"\n                      },\n                      \"transfer_group\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_intent_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_collection\": {\n                    \"description\": \"Specify whether Checkout should collect a payment method. When set to `if_required`, Checkout will not collect a payment method when the total due for the session is 0.This may occur if the Checkout Session includes a free trial or a discount.\\n\\nCan only be set in `subscription` mode. Defaults to `always`.\\n\\nIf you'd like information on how to collect a payment method outside of Checkout, read the guide on [configuring subscriptions with a free trial](https://stripe.com/docs/payments/checkout/free-trials).\",\n                    \"enum\": [\"always\", \"if_required\"],\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_types\": {\n                    \"description\": \"The list of payment method types that customers can use. If no value is passed, Stripe will dynamically show relevant payment methods from your [payment method settings](https://dashboard.stripe.com/settings/payment_methods) (20+ payment methods [supported](https://stripe.com/docs/payments/payment-methods/integration-options#payment-method-product-support)).\",\n                    \"items\": {\n                      \"enum\": [\n                        \"affirm\",\n                        \"afterpay_clearpay\",\n                        \"alipay\",\n                        \"alma\",\n                        \"au_becs_debit\",\n                        \"bacs_debit\",\n                        \"bancontact\",\n                        \"blik\",\n                        \"boleto\",\n                        \"card\",\n                        \"cashapp\",\n                        \"eps\",\n                        \"fpx\",\n                        \"giropay\",\n                        \"grabpay\",\n                        \"ideal\",\n                        \"klarna\",\n                        \"konbini\",\n                        \"link\",\n                        \"mobilepay\",\n                        \"multibanco\",\n                        \"oxxo\",\n                        \"p24\",\n                        \"pay_by_bank\",\n                        \"paynow\",\n                        \"paypal\",\n                        \"pix\",\n                        \"promptpay\",\n                        \"sepa_debit\",\n                        \"sofort\",\n                        \"swish\",\n                        \"twint\",\n                        \"us_bank_account\",\n                        \"wechat_pay\",\n                        \"zip\"\n                      ],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"phone_number_collection\": {\n                    \"description\": \"Controls phone number collection settings during checkout.\\n\\nWe recommend that you review your privacy policy and check with your legal contacts.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"phone_number_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"restrictions\": {\n                    \"description\": \"Settings that restrict the usage of a payment link.\",\n                    \"properties\": {\n                      \"completed_sessions\": {\n                        \"properties\": {\n                          \"limit\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"limit\"],\n                        \"title\": \"completed_sessions_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"completed_sessions\"],\n                    \"title\": \"restrictions_params\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_address_collection\": {\n                    \"description\": \"Configuration for collecting the customer's shipping address.\",\n                    \"properties\": {\n                      \"allowed_countries\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"AC\",\n                            \"AD\",\n                            \"AE\",\n                            \"AF\",\n                            \"AG\",\n                            \"AI\",\n                            \"AL\",\n                            \"AM\",\n                            \"AO\",\n                            \"AQ\",\n                            \"AR\",\n                            \"AT\",\n                            \"AU\",\n                            \"AW\",\n                            \"AX\",\n                            \"AZ\",\n                            \"BA\",\n                            \"BB\",\n                            \"BD\",\n                            \"BE\",\n                            \"BF\",\n                            \"BG\",\n                            \"BH\",\n                            \"BI\",\n                            \"BJ\",\n                            \"BL\",\n                            \"BM\",\n                            \"BN\",\n                            \"BO\",\n                            \"BQ\",\n                            \"BR\",\n                            \"BS\",\n                            \"BT\",\n                            \"BV\",\n                            \"BW\",\n                            \"BY\",\n                            \"BZ\",\n                            \"CA\",\n                            \"CD\",\n                            \"CF\",\n                            \"CG\",\n                            \"CH\",\n                            \"CI\",\n                            \"CK\",\n                            \"CL\",\n                            \"CM\",\n                            \"CN\",\n                            \"CO\",\n                            \"CR\",\n                            \"CV\",\n                            \"CW\",\n                            \"CY\",\n                            \"CZ\",\n                            \"DE\",\n                            \"DJ\",\n                            \"DK\",\n                            \"DM\",\n                            \"DO\",\n                            \"DZ\",\n                            \"EC\",\n                            \"EE\",\n                            \"EG\",\n                            \"EH\",\n                            \"ER\",\n                            \"ES\",\n                            \"ET\",\n                            \"FI\",\n                            \"FJ\",\n                            \"FK\",\n                            \"FO\",\n                            \"FR\",\n                            \"GA\",\n                            \"GB\",\n                            \"GD\",\n                            \"GE\",\n                            \"GF\",\n                            \"GG\",\n                            \"GH\",\n                            \"GI\",\n                            \"GL\",\n                            \"GM\",\n                            \"GN\",\n                            \"GP\",\n                            \"GQ\",\n                            \"GR\",\n                            \"GS\",\n                            \"GT\",\n                            \"GU\",\n                            \"GW\",\n                            \"GY\",\n                            \"HK\",\n                            \"HN\",\n                            \"HR\",\n                            \"HT\",\n                            \"HU\",\n                            \"ID\",\n                            \"IE\",\n                            \"IL\",\n                            \"IM\",\n                            \"IN\",\n                            \"IO\",\n                            \"IQ\",\n                            \"IS\",\n                            \"IT\",\n                            \"JE\",\n                            \"JM\",\n                            \"JO\",\n                            \"JP\",\n                            \"KE\",\n                            \"KG\",\n                            \"KH\",\n                            \"KI\",\n                            \"KM\",\n                            \"KN\",\n                            \"KR\",\n                            \"KW\",\n                            \"KY\",\n                            \"KZ\",\n                            \"LA\",\n                            \"LB\",\n                            \"LC\",\n                            \"LI\",\n                            \"LK\",\n                            \"LR\",\n                            \"LS\",\n                            \"LT\",\n                            \"LU\",\n                            \"LV\",\n                            \"LY\",\n                            \"MA\",\n                            \"MC\",\n                            \"MD\",\n                            \"ME\",\n                            \"MF\",\n                            \"MG\",\n                            \"MK\",\n                            \"ML\",\n                            \"MM\",\n                            \"MN\",\n                            \"MO\",\n                            \"MQ\",\n                            \"MR\",\n                            \"MS\",\n                            \"MT\",\n                            \"MU\",\n                            \"MV\",\n                            \"MW\",\n                            \"MX\",\n                            \"MY\",\n                            \"MZ\",\n                            \"NA\",\n                            \"NC\",\n                            \"NE\",\n                            \"NG\",\n                            \"NI\",\n                            \"NL\",\n                            \"NO\",\n                            \"NP\",\n                            \"NR\",\n                            \"NU\",\n                            \"NZ\",\n                            \"OM\",\n                            \"PA\",\n                            \"PE\",\n                            \"PF\",\n                            \"PG\",\n                            \"PH\",\n                            \"PK\",\n                            \"PL\",\n                            \"PM\",\n                            \"PN\",\n                            \"PR\",\n                            \"PS\",\n                            \"PT\",\n                            \"PY\",\n                            \"QA\",\n                            \"RE\",\n                            \"RO\",\n                            \"RS\",\n                            \"RU\",\n                            \"RW\",\n                            \"SA\",\n                            \"SB\",\n                            \"SC\",\n                            \"SD\",\n                            \"SE\",\n                            \"SG\",\n                            \"SH\",\n                            \"SI\",\n                            \"SJ\",\n                            \"SK\",\n                            \"SL\",\n                            \"SM\",\n                            \"SN\",\n                            \"SO\",\n                            \"SR\",\n                            \"SS\",\n                            \"ST\",\n                            \"SV\",\n                            \"SX\",\n                            \"SZ\",\n                            \"TA\",\n                            \"TC\",\n                            \"TD\",\n                            \"TF\",\n                            \"TG\",\n                            \"TH\",\n                            \"TJ\",\n                            \"TK\",\n                            \"TL\",\n                            \"TM\",\n                            \"TN\",\n                            \"TO\",\n                            \"TR\",\n                            \"TT\",\n                            \"TV\",\n                            \"TW\",\n                            \"TZ\",\n                            \"UA\",\n                            \"UG\",\n                            \"US\",\n                            \"UY\",\n                            \"UZ\",\n                            \"VA\",\n                            \"VC\",\n                            \"VE\",\n                            \"VG\",\n                            \"VN\",\n                            \"VU\",\n                            \"WF\",\n                            \"WS\",\n                            \"XK\",\n                            \"YE\",\n                            \"YT\",\n                            \"ZA\",\n                            \"ZM\",\n                            \"ZW\",\n                            \"ZZ\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"required\": [\"allowed_countries\"],\n                    \"title\": \"shipping_address_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_options\": {\n                    \"description\": \"The shipping rate options to apply to [checkout sessions](https://stripe.com/docs/api/checkout/sessions) created by this payment link.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"shipping_rate\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"title\": \"shipping_option_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"submit_type\": {\n                    \"description\": \"Describes the type of transaction being performed in order to customize relevant text on the page, such as the submit button. Changing this value will also affect the hostname in the [url](https://stripe.com/docs/api/payment_links/payment_links/object#url) property (example: `donate.stripe.com`).\",\n                    \"enum\": [\"auto\", \"book\", \"donate\", \"pay\", \"subscribe\"],\n                    \"type\": \"string\"\n                  },\n                  \"subscription_data\": {\n                    \"description\": \"When creating a subscription, the specified configuration data will be used. There must be at least one line item with a recurring price to use `subscription_data`.\",\n                    \"properties\": {\n                      \"description\": {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      \"invoice_settings\": {\n                        \"properties\": {\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"subscription_data_invoice_settings_params\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"trial_period_days\": {\n                        \"type\": \"integer\"\n                      },\n                      \"trial_settings\": {\n                        \"properties\": {\n                          \"end_behavior\": {\n                            \"properties\": {\n                              \"missing_payment_method\": {\n                                \"enum\": [\"cancel\", \"create_invoice\", \"pause\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"missing_payment_method\"],\n                            \"title\": \"end_behavior\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"end_behavior\"],\n                        \"title\": \"trial_settings_config\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"subscription_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"tax_id_collection\": {\n                    \"description\": \"Controls tax ID collection during checkout.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"required\": {\n                        \"enum\": [\"if_supported\", \"never\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"tax_id_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"The account (if any) the payments will be attributed to for tax reporting, and where funds from each payment will be transferred to.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"destination\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"destination\"],\n                    \"title\": \"transfer_data_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"line_items\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a payment link\"\n      }\n    },\n    \"/v1/payment_links/{payment_link}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a payment link.</p>\",\n        \"operationId\": \"GetPaymentLinksPaymentLink\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_link\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve payment link\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a payment link.</p>\",\n        \"operationId\": \"PostPaymentLinksPaymentLink\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_link\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"after_completion\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_fields\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_text\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"inactive_message\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_creation\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"line_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_intent_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"phone_number_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"restrictions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_address_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"subscription_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_id_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the payment link's `url` is active. If `false`, customers visiting the URL will be shown a page saying that the link has been deactivated.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"after_completion\": {\n                    \"description\": \"Behavior after the purchase is complete.\",\n                    \"properties\": {\n                      \"hosted_confirmation\": {\n                        \"properties\": {\n                          \"custom_message\": {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"after_completion_confirmation_page_params\",\n                        \"type\": \"object\"\n                      },\n                      \"redirect\": {\n                        \"properties\": {\n                          \"url\": {\n                            \"maxLength\": 2048,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"url\"],\n                        \"title\": \"after_completion_redirect_params\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"hosted_confirmation\", \"redirect\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"after_completion_params\",\n                    \"type\": \"object\"\n                  },\n                  \"allow_promotion_codes\": {\n                    \"description\": \"Enables user redeemable promotion codes.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Configuration for automatic tax collection.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_params\",\n                    \"type\": \"object\"\n                  },\n                  \"billing_address_collection\": {\n                    \"description\": \"Configuration for collecting the customer's billing address. Defaults to `auto`.\",\n                    \"enum\": [\"auto\", \"required\"],\n                    \"type\": \"string\"\n                  },\n                  \"custom_fields\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"dropdown\": {\n                              \"properties\": {\n                                \"options\": {\n                                  \"items\": {\n                                    \"properties\": {\n                                      \"label\": {\n                                        \"maxLength\": 100,\n                                        \"type\": \"string\"\n                                      },\n                                      \"value\": {\n                                        \"maxLength\": 100,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"required\": [\"label\", \"value\"],\n                                    \"title\": \"custom_field_option_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"type\": \"array\"\n                                }\n                              },\n                              \"required\": [\"options\"],\n                              \"title\": \"custom_field_dropdown_param\",\n                              \"type\": \"object\"\n                            },\n                            \"key\": {\n                              \"maxLength\": 200,\n                              \"type\": \"string\"\n                            },\n                            \"label\": {\n                              \"properties\": {\n                                \"custom\": {\n                                  \"maxLength\": 50,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": {\n                                  \"enum\": [\"custom\"],\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"custom\", \"type\"],\n                              \"title\": \"custom_field_label_param\",\n                              \"type\": \"object\"\n                            },\n                            \"numeric\": {\n                              \"properties\": {\n                                \"maximum_length\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"minimum_length\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"title\": \"custom_field_numeric_param\",\n                              \"type\": \"object\"\n                            },\n                            \"optional\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"text\": {\n                              \"properties\": {\n                                \"maximum_length\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"minimum_length\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"title\": \"custom_field_text_param\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": {\n                              \"enum\": [\"dropdown\", \"numeric\", \"text\"],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"key\", \"label\", \"type\"],\n                          \"title\": \"custom_field_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Collect additional information from your customer using custom fields. Up to 3 fields are supported.\"\n                  },\n                  \"custom_text\": {\n                    \"description\": \"Display additional text for your customers using custom text.\",\n                    \"properties\": {\n                      \"after_submit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"shipping_address\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"submit\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"terms_of_service_acceptance\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"message\": {\n                                \"maxLength\": 1200,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"message\"],\n                            \"title\": \"custom_text_position_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"custom_text_param\",\n                    \"type\": \"object\"\n                  },\n                  \"customer_creation\": {\n                    \"description\": \"Configures whether [checkout sessions](https://stripe.com/docs/api/checkout/sessions) created by this payment link create a [Customer](https://stripe.com/docs/api/customers).\",\n                    \"enum\": [\"always\", \"if_required\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"inactive_message\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The custom message to be displayed to a customer when a payment link is no longer active.\"\n                  },\n                  \"invoice_creation\": {\n                    \"description\": \"Generate a post-purchase Invoice for one-time payments.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"invoice_data\": {\n                        \"properties\": {\n                          \"account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"custom_fields\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"name\": {\n                                      \"maxLength\": 40,\n                                      \"type\": \"string\"\n                                    },\n                                    \"value\": {\n                                      \"maxLength\": 140,\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"name\", \"value\"],\n                                  \"title\": \"custom_field_params\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"description\": {\n                            \"maxLength\": 1500,\n                            \"type\": \"string\"\n                          },\n                          \"footer\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          },\n                          \"metadata\": {\n                            \"anyOf\": [\n                              {\n                                \"additionalProperties\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"rendering_options\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"amount_tax_display\": {\n                                    \"enum\": [\n                                      \"\",\n                                      \"exclude_tax\",\n                                      \"include_inclusive_tax\"\n                                    ],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"checkout_rendering_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"invoice_settings_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"invoice_creation_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"line_items\": {\n                    \"description\": \"The line items representing what is being sold. Each line item represents an item being sold. Up to 20 line items are supported.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"adjustable_quantity\": {\n                          \"properties\": {\n                            \"enabled\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"maximum\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"enabled\"],\n                          \"title\": \"adjustable_quantity_params\",\n                          \"type\": \"object\"\n                        },\n                        \"id\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        }\n                      },\n                      \"required\": [\"id\"],\n                      \"title\": \"line_items_update_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`. Metadata associated with this Payment Link will automatically be copied to [checkout sessions](https://stripe.com/docs/api/checkout/sessions) created by this payment link.\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_intent_data\": {\n                    \"description\": \"A subset of parameters to be passed to PaymentIntent creation for Checkout Sessions in `payment` mode.\",\n                    \"properties\": {\n                      \"description\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 1000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"statement_descriptor\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"statement_descriptor_suffix\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"transfer_group\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_intent_data_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_collection\": {\n                    \"description\": \"Specify whether Checkout should collect a payment method. When set to `if_required`, Checkout will not collect a payment method when the total due for the session is 0.This may occur if the Checkout Session includes a free trial or a discount.\\n\\nCan only be set in `subscription` mode. Defaults to `always`.\\n\\nIf you'd like information on how to collect a payment method outside of Checkout, read the guide on [configuring subscriptions with a free trial](https://stripe.com/docs/payments/checkout/free-trials).\",\n                    \"enum\": [\"always\", \"if_required\"],\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_types\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"enum\": [\n                            \"affirm\",\n                            \"afterpay_clearpay\",\n                            \"alipay\",\n                            \"alma\",\n                            \"au_becs_debit\",\n                            \"bacs_debit\",\n                            \"bancontact\",\n                            \"blik\",\n                            \"boleto\",\n                            \"card\",\n                            \"cashapp\",\n                            \"eps\",\n                            \"fpx\",\n                            \"giropay\",\n                            \"grabpay\",\n                            \"ideal\",\n                            \"klarna\",\n                            \"konbini\",\n                            \"link\",\n                            \"mobilepay\",\n                            \"multibanco\",\n                            \"oxxo\",\n                            \"p24\",\n                            \"pay_by_bank\",\n                            \"paynow\",\n                            \"paypal\",\n                            \"pix\",\n                            \"promptpay\",\n                            \"sepa_debit\",\n                            \"sofort\",\n                            \"swish\",\n                            \"twint\",\n                            \"us_bank_account\",\n                            \"wechat_pay\",\n                            \"zip\"\n                          ],\n                          \"type\": \"string\",\n                          \"x-stripeBypassValidation\": true\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The list of payment method types that customers can use. Pass an empty string to enable dynamic payment methods that use your [payment method settings](https://dashboard.stripe.com/settings/payment_methods).\"\n                  },\n                  \"phone_number_collection\": {\n                    \"description\": \"Controls phone number collection settings during checkout.\\n\\nWe recommend that you review your privacy policy and check with your legal contacts.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"phone_number_collection_params\",\n                    \"type\": \"object\"\n                  },\n                  \"restrictions\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"completed_sessions\": {\n                            \"properties\": {\n                              \"limit\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"limit\"],\n                            \"title\": \"completed_sessions_params\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"completed_sessions\"],\n                        \"title\": \"restrictions_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Settings that restrict the usage of a payment link.\"\n                  },\n                  \"shipping_address_collection\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"allowed_countries\": {\n                            \"items\": {\n                              \"enum\": [\n                                \"AC\",\n                                \"AD\",\n                                \"AE\",\n                                \"AF\",\n                                \"AG\",\n                                \"AI\",\n                                \"AL\",\n                                \"AM\",\n                                \"AO\",\n                                \"AQ\",\n                                \"AR\",\n                                \"AT\",\n                                \"AU\",\n                                \"AW\",\n                                \"AX\",\n                                \"AZ\",\n                                \"BA\",\n                                \"BB\",\n                                \"BD\",\n                                \"BE\",\n                                \"BF\",\n                                \"BG\",\n                                \"BH\",\n                                \"BI\",\n                                \"BJ\",\n                                \"BL\",\n                                \"BM\",\n                                \"BN\",\n                                \"BO\",\n                                \"BQ\",\n                                \"BR\",\n                                \"BS\",\n                                \"BT\",\n                                \"BV\",\n                                \"BW\",\n                                \"BY\",\n                                \"BZ\",\n                                \"CA\",\n                                \"CD\",\n                                \"CF\",\n                                \"CG\",\n                                \"CH\",\n                                \"CI\",\n                                \"CK\",\n                                \"CL\",\n                                \"CM\",\n                                \"CN\",\n                                \"CO\",\n                                \"CR\",\n                                \"CV\",\n                                \"CW\",\n                                \"CY\",\n                                \"CZ\",\n                                \"DE\",\n                                \"DJ\",\n                                \"DK\",\n                                \"DM\",\n                                \"DO\",\n                                \"DZ\",\n                                \"EC\",\n                                \"EE\",\n                                \"EG\",\n                                \"EH\",\n                                \"ER\",\n                                \"ES\",\n                                \"ET\",\n                                \"FI\",\n                                \"FJ\",\n                                \"FK\",\n                                \"FO\",\n                                \"FR\",\n                                \"GA\",\n                                \"GB\",\n                                \"GD\",\n                                \"GE\",\n                                \"GF\",\n                                \"GG\",\n                                \"GH\",\n                                \"GI\",\n                                \"GL\",\n                                \"GM\",\n                                \"GN\",\n                                \"GP\",\n                                \"GQ\",\n                                \"GR\",\n                                \"GS\",\n                                \"GT\",\n                                \"GU\",\n                                \"GW\",\n                                \"GY\",\n                                \"HK\",\n                                \"HN\",\n                                \"HR\",\n                                \"HT\",\n                                \"HU\",\n                                \"ID\",\n                                \"IE\",\n                                \"IL\",\n                                \"IM\",\n                                \"IN\",\n                                \"IO\",\n                                \"IQ\",\n                                \"IS\",\n                                \"IT\",\n                                \"JE\",\n                                \"JM\",\n                                \"JO\",\n                                \"JP\",\n                                \"KE\",\n                                \"KG\",\n                                \"KH\",\n                                \"KI\",\n                                \"KM\",\n                                \"KN\",\n                                \"KR\",\n                                \"KW\",\n                                \"KY\",\n                                \"KZ\",\n                                \"LA\",\n                                \"LB\",\n                                \"LC\",\n                                \"LI\",\n                                \"LK\",\n                                \"LR\",\n                                \"LS\",\n                                \"LT\",\n                                \"LU\",\n                                \"LV\",\n                                \"LY\",\n                                \"MA\",\n                                \"MC\",\n                                \"MD\",\n                                \"ME\",\n                                \"MF\",\n                                \"MG\",\n                                \"MK\",\n                                \"ML\",\n                                \"MM\",\n                                \"MN\",\n                                \"MO\",\n                                \"MQ\",\n                                \"MR\",\n                                \"MS\",\n                                \"MT\",\n                                \"MU\",\n                                \"MV\",\n                                \"MW\",\n                                \"MX\",\n                                \"MY\",\n                                \"MZ\",\n                                \"NA\",\n                                \"NC\",\n                                \"NE\",\n                                \"NG\",\n                                \"NI\",\n                                \"NL\",\n                                \"NO\",\n                                \"NP\",\n                                \"NR\",\n                                \"NU\",\n                                \"NZ\",\n                                \"OM\",\n                                \"PA\",\n                                \"PE\",\n                                \"PF\",\n                                \"PG\",\n                                \"PH\",\n                                \"PK\",\n                                \"PL\",\n                                \"PM\",\n                                \"PN\",\n                                \"PR\",\n                                \"PS\",\n                                \"PT\",\n                                \"PY\",\n                                \"QA\",\n                                \"RE\",\n                                \"RO\",\n                                \"RS\",\n                                \"RU\",\n                                \"RW\",\n                                \"SA\",\n                                \"SB\",\n                                \"SC\",\n                                \"SD\",\n                                \"SE\",\n                                \"SG\",\n                                \"SH\",\n                                \"SI\",\n                                \"SJ\",\n                                \"SK\",\n                                \"SL\",\n                                \"SM\",\n                                \"SN\",\n                                \"SO\",\n                                \"SR\",\n                                \"SS\",\n                                \"ST\",\n                                \"SV\",\n                                \"SX\",\n                                \"SZ\",\n                                \"TA\",\n                                \"TC\",\n                                \"TD\",\n                                \"TF\",\n                                \"TG\",\n                                \"TH\",\n                                \"TJ\",\n                                \"TK\",\n                                \"TL\",\n                                \"TM\",\n                                \"TN\",\n                                \"TO\",\n                                \"TR\",\n                                \"TT\",\n                                \"TV\",\n                                \"TW\",\n                                \"TZ\",\n                                \"UA\",\n                                \"UG\",\n                                \"US\",\n                                \"UY\",\n                                \"UZ\",\n                                \"VA\",\n                                \"VC\",\n                                \"VE\",\n                                \"VG\",\n                                \"VN\",\n                                \"VU\",\n                                \"WF\",\n                                \"WS\",\n                                \"XK\",\n                                \"YE\",\n                                \"YT\",\n                                \"ZA\",\n                                \"ZM\",\n                                \"ZW\",\n                                \"ZZ\"\n                              ],\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          }\n                        },\n                        \"required\": [\"allowed_countries\"],\n                        \"title\": \"shipping_address_collection_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Configuration for collecting the customer's shipping address.\"\n                  },\n                  \"submit_type\": {\n                    \"description\": \"Describes the type of transaction being performed in order to customize relevant text on the page, such as the submit button. Changing this value will also affect the hostname in the [url](https://stripe.com/docs/api/payment_links/payment_links/object#url) property (example: `donate.stripe.com`).\",\n                    \"enum\": [\"auto\", \"book\", \"donate\", \"pay\", \"subscribe\"],\n                    \"type\": \"string\"\n                  },\n                  \"subscription_data\": {\n                    \"description\": \"When creating a subscription, the specified configuration data will be used. There must be at least one line item with a recurring price to use `subscription_data`.\",\n                    \"properties\": {\n                      \"invoice_settings\": {\n                        \"properties\": {\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"subscription_data_invoice_settings_params\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"trial_period_days\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"trial_settings\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"end_behavior\": {\n                                \"properties\": {\n                                  \"missing_payment_method\": {\n                                    \"enum\": [\n                                      \"cancel\",\n                                      \"create_invoice\",\n                                      \"pause\"\n                                    ],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"missing_payment_method\"],\n                                \"title\": \"end_behavior\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"required\": [\"end_behavior\"],\n                            \"title\": \"trial_settings_config\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"subscription_data_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"tax_id_collection\": {\n                    \"description\": \"Controls tax ID collection during checkout.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"required\": {\n                        \"enum\": [\"if_supported\", \"never\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"tax_id_collection_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_link\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a payment link\"\n      }\n    },\n    \"/v1/payment_links/{payment_link}/line_items\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving a payment link, there is an includable <strong>line_items</strong> property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.</p>\",\n        \"operationId\": \"GetPaymentLinksPaymentLinkLineItems\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_link\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentLinksResourceListLineItems\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a payment link's line items\"\n      }\n    },\n    \"/v1/payment_method_configurations\": {\n      \"get\": {\n        \"description\": \"<p>List payment method configurations</p>\",\n        \"operationId\": \"GetPaymentMethodConfigurations\",\n        \"parameters\": [\n          {\n            \"description\": \"The Connect application to filter by.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"application\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"maxLength\": 100,\n                  \"type\": \"string\"\n                },\n                {\n                  \"enum\": [\"\"],\n                  \"type\": \"string\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payment_method_configuration\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/payment_method_configurations\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentMethodConfigResourcePaymentMethodConfigurationsList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List payment method configurations\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a payment method configuration</p>\",\n        \"operationId\": \"PostPaymentMethodConfigurations\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"acss_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"affirm\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"afterpay_clearpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"alipay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"alma\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"amazon_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"apple_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"apple_pay_later\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"au_becs_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bacs_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bancontact\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"blik\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"boleto\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cartes_bancaires\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cashapp\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"customer_balance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"eps\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fpx\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"giropay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"google_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"grabpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"ideal\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"jcb\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"klarna\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"konbini\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"link\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mobilepay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"multibanco\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"oxxo\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"p24\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pay_by_bank\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"paynow\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"paypal\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"promptpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"revolut_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"sepa_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"sofort\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"swish\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"twint\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"us_bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"wechat_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"zip\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"acss_debit\": {\n                    \"description\": \"Canadian pre-authorized debit payments, check this [page](https://stripe.com/docs/payments/acss-debit) for more details like country availability.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"affirm\": {\n                    \"description\": \"[Affirm](https://www.affirm.com/) gives your customers a way to split purchases over a series of payments. Depending on the purchase, they can pay with four interest-free payments (Split Pay) or pay over a longer term (Installments), which might include interest. Check this [page](https://stripe.com/docs/payments/affirm) for more details like country availability.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"afterpay_clearpay\": {\n                    \"description\": \"Afterpay gives your customers a way to pay for purchases in installments, check this [page](https://stripe.com/docs/payments/afterpay-clearpay) for more details like country availability. Afterpay is particularly popular among businesses selling fashion, beauty, and sports products.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"alipay\": {\n                    \"description\": \"Alipay is a digital wallet in China that has more than a billion active users worldwide. Alipay users can pay on the web or on a mobile device using login credentials or their Alipay app. Alipay has a low dispute rate and reduces fraud by authenticating payments using the customer's login credentials. Check this [page](https://stripe.com/docs/payments/alipay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"alma\": {\n                    \"description\": \"Alma is a Buy Now, Pay Later payment method that offers customers the ability to pay in 2, 3, or 4 installments.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"amazon_pay\": {\n                    \"description\": \"Amazon Pay is a wallet payment method that lets your customers check out the same way as on Amazon.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"apple_pay\": {\n                    \"description\": \"Stripe users can accept [Apple Pay](/payments/apple-pay) in iOS applications in iOS 9 and later, and on the web in Safari starting with iOS 10 or macOS Sierra. There are no additional fees to process Apple Pay payments, and the [pricing](/pricing) is the same as other card transactions. Check this [page](https://stripe.com/docs/apple-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"apple_pay_later\": {\n                    \"description\": \"Apple Pay Later, a payment method for customers to buy now and pay later, gives your customers a way to split purchases into four installments across six weeks.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"au_becs_debit\": {\n                    \"description\": \"Stripe users in Australia can accept Bulk Electronic Clearing System (BECS) direct debit payments from customers with an Australian bank account. Check this [page](https://stripe.com/docs/payments/au-becs-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"bacs_debit\": {\n                    \"description\": \"Stripe users in the UK can accept Bacs Direct Debit payments from customers with a UK bank account, check this [page](https://stripe.com/docs/payments/payment-methods/bacs-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"bancontact\": {\n                    \"description\": \"Bancontact is the most popular online payment method in Belgium, with over 15 million cards in circulation. [Customers](https://stripe.com/docs/api/customers) use a Bancontact card or mobile app linked to a Belgian bank account to make online payments that are secure, guaranteed, and confirmed immediately. Check this [page](https://stripe.com/docs/payments/bancontact) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"blik\": {\n                    \"description\": \"BLIK is a [single use](https://stripe.com/docs/payments/payment-methods#usage) payment method that requires customers to authenticate their payments. When customers want to pay online using BLIK, they request a six-digit code from their banking application and enter it into the payment collection form. Check this [page](https://stripe.com/docs/payments/blik) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"boleto\": {\n                    \"description\": \"Boleto is an official (regulated by the Central Bank of Brazil) payment method in Brazil. Check this [page](https://stripe.com/docs/payments/boleto) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"card\": {\n                    \"description\": \"Cards are a popular way for consumers and businesses to pay online or in person. Stripe supports global and local card networks.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"cartes_bancaires\": {\n                    \"description\": \"Cartes Bancaires is France's local card network. More than 95% of these cards are co-branded with either Visa or Mastercard, meaning you can process these cards over either Cartes Bancaires or the Visa or Mastercard networks. Check this [page](https://stripe.com/docs/payments/cartes-bancaires) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"cashapp\": {\n                    \"description\": \"Cash App is a popular consumer app in the US that allows customers to bank, invest, send, and receive money using their digital wallet. Check this [page](https://stripe.com/docs/payments/cash-app-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"customer_balance\": {\n                    \"description\": \"Uses a customer’s [cash balance](https://stripe.com/docs/payments/customer-balance) for the payment. The cash balance can be funded via a bank transfer. Check this [page](https://stripe.com/docs/payments/bank-transfers) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"eps\": {\n                    \"description\": \"EPS is an Austria-based payment method that allows customers to complete transactions online using their bank credentials. EPS is supported by all Austrian banks and is accepted by over 80% of Austrian online retailers. Check this [page](https://stripe.com/docs/payments/eps) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"fpx\": {\n                    \"description\": \"Financial Process Exchange (FPX) is a Malaysia-based payment method that allows customers to complete transactions online using their bank credentials. Bank Negara Malaysia (BNM), the Central Bank of Malaysia, and eleven other major Malaysian financial institutions are members of the PayNet Group, which owns and operates FPX. It is one of the most popular online payment methods in Malaysia, with nearly 90 million transactions in 2018 according to BNM. Check this [page](https://stripe.com/docs/payments/fpx) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"giropay\": {\n                    \"description\": \"giropay is a German payment method based on online banking, introduced in 2006. It allows customers to complete transactions online using their online banking environment, with funds debited from their bank account. Depending on their bank, customers confirm payments on giropay using a second factor of authentication or a PIN. giropay accounts for 10% of online checkouts in Germany. Check this [page](https://stripe.com/docs/payments/giropay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"google_pay\": {\n                    \"description\": \"Google Pay allows customers to make payments in your app or website using any credit or debit card saved to their Google Account, including those from Google Play, YouTube, Chrome, or an Android device. Use the Google Pay API to request any credit or debit card stored in your customer's Google account. Check this [page](https://stripe.com/docs/google-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"grabpay\": {\n                    \"description\": \"GrabPay is a payment method developed by [Grab](https://www.grab.com/sg/consumer/finance/pay/). GrabPay is a digital wallet - customers maintain a balance in their wallets that they pay out with. Check this [page](https://stripe.com/docs/payments/grabpay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"ideal\": {\n                    \"description\": \"iDEAL is a Netherlands-based payment method that allows customers to complete transactions online using their bank credentials. All major Dutch banks are members of Currence, the scheme that operates iDEAL, making it the most popular online payment method in the Netherlands with a share of online transactions close to 55%. Check this [page](https://stripe.com/docs/payments/ideal) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"jcb\": {\n                    \"description\": \"JCB is a credit card company based in Japan. JCB is currently available in Japan to businesses approved by JCB, and available to all businesses in Australia, Canada, Hong Kong, Japan, New Zealand, Singapore, Switzerland, United Kingdom, United States, and all countries in the European Economic Area except Iceland. Check this [page](https://support.stripe.com/questions/accepting-japan-credit-bureau-%28jcb%29-payments) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"klarna\": {\n                    \"description\": \"Klarna gives customers a range of [payment options](https://stripe.com/docs/payments/klarna#payment-options) during checkout. Available payment options vary depending on the customer's billing address and the transaction amount. These payment options make it convenient for customers to purchase items in all price ranges. Check this [page](https://stripe.com/docs/payments/klarna) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"konbini\": {\n                    \"description\": \"Konbini allows customers in Japan to pay for bills and online purchases at convenience stores with cash. Check this [page](https://stripe.com/docs/payments/konbini) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"link\": {\n                    \"description\": \"[Link](https://stripe.com/docs/payments/link) is a payment method network. With Link, users save their payment details once, then reuse that information to pay with one click for any business on the network.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"mobilepay\": {\n                    \"description\": \"MobilePay is a [single-use](https://stripe.com/docs/payments/payment-methods#usage) card wallet payment method used in Denmark and Finland. It allows customers to [authenticate and approve](https://stripe.com/docs/payments/payment-methods#customer-actions) payments using the MobilePay app. Check this [page](https://stripe.com/docs/payments/mobilepay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"multibanco\": {\n                    \"description\": \"Stripe users in Europe and the United States can accept Multibanco payments from customers in Portugal using [Sources](https://stripe.com/docs/sources)—a single integration path for creating payments using any supported method.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"Configuration name.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"oxxo\": {\n                    \"description\": \"OXXO is a Mexican chain of convenience stores with thousands of locations across Latin America and represents nearly 20% of online transactions in Mexico. OXXO allows customers to pay bills and online purchases in-store with cash. Check this [page](https://stripe.com/docs/payments/oxxo) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"p24\": {\n                    \"description\": \"Przelewy24 is a Poland-based payment method aggregator that allows customers to complete transactions online using bank transfers and other methods. Bank transfers account for 30% of online payments in Poland and Przelewy24 provides a way for customers to pay with over 165 banks. Check this [page](https://stripe.com/docs/payments/p24) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"parent\": {\n                    \"description\": \"Configuration's parent configuration. Specify to create a child configuration.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"pay_by_bank\": {\n                    \"description\": \"Pay by bank is a redirect payment method backed by bank transfers. A customer is redirected to their bank to authorize a bank transfer for a given amount. This removes a lot of the error risks inherent in waiting for the customer to initiate a transfer themselves, and is less expensive than card payments.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"paynow\": {\n                    \"description\": \"PayNow is a Singapore-based payment method that allows customers to make a payment using their preferred app from participating banks and participating non-bank financial institutions. Check this [page](https://stripe.com/docs/payments/paynow) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"paypal\": {\n                    \"description\": \"PayPal, a digital wallet popular with customers in Europe, allows your customers worldwide to pay using their PayPal account. Check this [page](https://stripe.com/docs/payments/paypal) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"promptpay\": {\n                    \"description\": \"PromptPay is a Thailand-based payment method that allows customers to make a payment using their preferred app from participating banks. Check this [page](https://stripe.com/docs/payments/promptpay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"revolut_pay\": {\n                    \"description\": \"Revolut Pay, developed by Revolut, a global finance app, is a digital wallet payment method. Revolut Pay uses the customer’s stored balance or cards to fund the payment, and offers the option for non-Revolut customers to save their details after their first purchase.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"sepa_debit\": {\n                    \"description\": \"The [Single Euro Payments Area (SEPA)](https://en.wikipedia.org/wiki/Single_Euro_Payments_Area) is an initiative of the European Union to simplify payments within and across member countries. SEPA established and enforced banking standards to allow for the direct debiting of every EUR-denominated bank account within the SEPA region, check this [page](https://stripe.com/docs/payments/sepa-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"sofort\": {\n                    \"description\": \"Stripe users in Europe and the United States can use the [Payment Intents API](https://stripe.com/docs/payments/payment-intents)—a single integration path for creating payments using any supported method—to accept [Sofort](https://www.sofort.com/) payments from customers. Check this [page](https://stripe.com/docs/payments/sofort) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"swish\": {\n                    \"description\": \"Swish is a [real-time](https://stripe.com/docs/payments/real-time) payment method popular in Sweden. It allows customers to [authenticate and approve](https://stripe.com/docs/payments/payment-methods#customer-actions) payments using the Swish mobile app and the Swedish BankID mobile app. Check this [page](https://stripe.com/docs/payments/swish) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"twint\": {\n                    \"description\": \"Twint is a payment method popular in Switzerland. It allows customers to pay using their mobile phone. Check this [page](https://docs.stripe.com/payments/twint) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"us_bank_account\": {\n                    \"description\": \"Stripe users in the United States can accept ACH direct debit payments from customers with a US bank account using the Automated Clearing House (ACH) payments system operated by Nacha. Check this [page](https://stripe.com/docs/payments/ach-direct-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"wechat_pay\": {\n                    \"description\": \"WeChat, owned by Tencent, is China's leading mobile app with over 1 billion monthly active users. Chinese consumers can use WeChat Pay to pay for goods and services inside of businesses' apps and websites. WeChat Pay users buy most frequently in gaming, e-commerce, travel, online education, and food/nutrition. Check this [page](https://stripe.com/docs/payments/wechat-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"zip\": {\n                    \"description\": \"Zip gives your customers a way to split purchases over a series of payments. Check this [page](https://stripe.com/docs/payments/zip) for more details like country availability.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method_configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a payment method configuration\"\n      }\n    },\n    \"/v1/payment_method_configurations/{configuration}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve payment method configuration</p>\",\n        \"operationId\": \"GetPaymentMethodConfigurationsConfiguration\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method_configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve payment method configuration\"\n      },\n      \"post\": {\n        \"description\": \"<p>Update payment method configuration</p>\",\n        \"operationId\": \"PostPaymentMethodConfigurationsConfiguration\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"acss_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"affirm\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"afterpay_clearpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"alipay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"alma\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"amazon_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"apple_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"apple_pay_later\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"au_becs_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bacs_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bancontact\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"blik\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"boleto\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cartes_bancaires\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cashapp\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"customer_balance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"eps\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fpx\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"giropay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"google_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"grabpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"ideal\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"jcb\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"klarna\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"konbini\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"link\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mobilepay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"multibanco\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"oxxo\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"p24\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pay_by_bank\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"paynow\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"paypal\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"promptpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"revolut_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"sepa_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"sofort\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"swish\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"twint\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"us_bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"wechat_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"zip\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"acss_debit\": {\n                    \"description\": \"Canadian pre-authorized debit payments, check this [page](https://stripe.com/docs/payments/acss-debit) for more details like country availability.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"active\": {\n                    \"description\": \"Whether the configuration can be used for new payments.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"affirm\": {\n                    \"description\": \"[Affirm](https://www.affirm.com/) gives your customers a way to split purchases over a series of payments. Depending on the purchase, they can pay with four interest-free payments (Split Pay) or pay over a longer term (Installments), which might include interest. Check this [page](https://stripe.com/docs/payments/affirm) for more details like country availability.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"afterpay_clearpay\": {\n                    \"description\": \"Afterpay gives your customers a way to pay for purchases in installments, check this [page](https://stripe.com/docs/payments/afterpay-clearpay) for more details like country availability. Afterpay is particularly popular among businesses selling fashion, beauty, and sports products.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"alipay\": {\n                    \"description\": \"Alipay is a digital wallet in China that has more than a billion active users worldwide. Alipay users can pay on the web or on a mobile device using login credentials or their Alipay app. Alipay has a low dispute rate and reduces fraud by authenticating payments using the customer's login credentials. Check this [page](https://stripe.com/docs/payments/alipay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"alma\": {\n                    \"description\": \"Alma is a Buy Now, Pay Later payment method that offers customers the ability to pay in 2, 3, or 4 installments.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"amazon_pay\": {\n                    \"description\": \"Amazon Pay is a wallet payment method that lets your customers check out the same way as on Amazon.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"apple_pay\": {\n                    \"description\": \"Stripe users can accept [Apple Pay](/payments/apple-pay) in iOS applications in iOS 9 and later, and on the web in Safari starting with iOS 10 or macOS Sierra. There are no additional fees to process Apple Pay payments, and the [pricing](/pricing) is the same as other card transactions. Check this [page](https://stripe.com/docs/apple-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"apple_pay_later\": {\n                    \"description\": \"Apple Pay Later, a payment method for customers to buy now and pay later, gives your customers a way to split purchases into four installments across six weeks.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"au_becs_debit\": {\n                    \"description\": \"Stripe users in Australia can accept Bulk Electronic Clearing System (BECS) direct debit payments from customers with an Australian bank account. Check this [page](https://stripe.com/docs/payments/au-becs-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"bacs_debit\": {\n                    \"description\": \"Stripe users in the UK can accept Bacs Direct Debit payments from customers with a UK bank account, check this [page](https://stripe.com/docs/payments/payment-methods/bacs-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"bancontact\": {\n                    \"description\": \"Bancontact is the most popular online payment method in Belgium, with over 15 million cards in circulation. [Customers](https://stripe.com/docs/api/customers) use a Bancontact card or mobile app linked to a Belgian bank account to make online payments that are secure, guaranteed, and confirmed immediately. Check this [page](https://stripe.com/docs/payments/bancontact) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"blik\": {\n                    \"description\": \"BLIK is a [single use](https://stripe.com/docs/payments/payment-methods#usage) payment method that requires customers to authenticate their payments. When customers want to pay online using BLIK, they request a six-digit code from their banking application and enter it into the payment collection form. Check this [page](https://stripe.com/docs/payments/blik) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"boleto\": {\n                    \"description\": \"Boleto is an official (regulated by the Central Bank of Brazil) payment method in Brazil. Check this [page](https://stripe.com/docs/payments/boleto) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"card\": {\n                    \"description\": \"Cards are a popular way for consumers and businesses to pay online or in person. Stripe supports global and local card networks.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"cartes_bancaires\": {\n                    \"description\": \"Cartes Bancaires is France's local card network. More than 95% of these cards are co-branded with either Visa or Mastercard, meaning you can process these cards over either Cartes Bancaires or the Visa or Mastercard networks. Check this [page](https://stripe.com/docs/payments/cartes-bancaires) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"cashapp\": {\n                    \"description\": \"Cash App is a popular consumer app in the US that allows customers to bank, invest, send, and receive money using their digital wallet. Check this [page](https://stripe.com/docs/payments/cash-app-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"customer_balance\": {\n                    \"description\": \"Uses a customer’s [cash balance](https://stripe.com/docs/payments/customer-balance) for the payment. The cash balance can be funded via a bank transfer. Check this [page](https://stripe.com/docs/payments/bank-transfers) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"eps\": {\n                    \"description\": \"EPS is an Austria-based payment method that allows customers to complete transactions online using their bank credentials. EPS is supported by all Austrian banks and is accepted by over 80% of Austrian online retailers. Check this [page](https://stripe.com/docs/payments/eps) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"fpx\": {\n                    \"description\": \"Financial Process Exchange (FPX) is a Malaysia-based payment method that allows customers to complete transactions online using their bank credentials. Bank Negara Malaysia (BNM), the Central Bank of Malaysia, and eleven other major Malaysian financial institutions are members of the PayNet Group, which owns and operates FPX. It is one of the most popular online payment methods in Malaysia, with nearly 90 million transactions in 2018 according to BNM. Check this [page](https://stripe.com/docs/payments/fpx) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"giropay\": {\n                    \"description\": \"giropay is a German payment method based on online banking, introduced in 2006. It allows customers to complete transactions online using their online banking environment, with funds debited from their bank account. Depending on their bank, customers confirm payments on giropay using a second factor of authentication or a PIN. giropay accounts for 10% of online checkouts in Germany. Check this [page](https://stripe.com/docs/payments/giropay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"google_pay\": {\n                    \"description\": \"Google Pay allows customers to make payments in your app or website using any credit or debit card saved to their Google Account, including those from Google Play, YouTube, Chrome, or an Android device. Use the Google Pay API to request any credit or debit card stored in your customer's Google account. Check this [page](https://stripe.com/docs/google-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"grabpay\": {\n                    \"description\": \"GrabPay is a payment method developed by [Grab](https://www.grab.com/sg/consumer/finance/pay/). GrabPay is a digital wallet - customers maintain a balance in their wallets that they pay out with. Check this [page](https://stripe.com/docs/payments/grabpay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"ideal\": {\n                    \"description\": \"iDEAL is a Netherlands-based payment method that allows customers to complete transactions online using their bank credentials. All major Dutch banks are members of Currence, the scheme that operates iDEAL, making it the most popular online payment method in the Netherlands with a share of online transactions close to 55%. Check this [page](https://stripe.com/docs/payments/ideal) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"jcb\": {\n                    \"description\": \"JCB is a credit card company based in Japan. JCB is currently available in Japan to businesses approved by JCB, and available to all businesses in Australia, Canada, Hong Kong, Japan, New Zealand, Singapore, Switzerland, United Kingdom, United States, and all countries in the European Economic Area except Iceland. Check this [page](https://support.stripe.com/questions/accepting-japan-credit-bureau-%28jcb%29-payments) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"klarna\": {\n                    \"description\": \"Klarna gives customers a range of [payment options](https://stripe.com/docs/payments/klarna#payment-options) during checkout. Available payment options vary depending on the customer's billing address and the transaction amount. These payment options make it convenient for customers to purchase items in all price ranges. Check this [page](https://stripe.com/docs/payments/klarna) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"konbini\": {\n                    \"description\": \"Konbini allows customers in Japan to pay for bills and online purchases at convenience stores with cash. Check this [page](https://stripe.com/docs/payments/konbini) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"link\": {\n                    \"description\": \"[Link](https://stripe.com/docs/payments/link) is a payment method network. With Link, users save their payment details once, then reuse that information to pay with one click for any business on the network.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"mobilepay\": {\n                    \"description\": \"MobilePay is a [single-use](https://stripe.com/docs/payments/payment-methods#usage) card wallet payment method used in Denmark and Finland. It allows customers to [authenticate and approve](https://stripe.com/docs/payments/payment-methods#customer-actions) payments using the MobilePay app. Check this [page](https://stripe.com/docs/payments/mobilepay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"multibanco\": {\n                    \"description\": \"Stripe users in Europe and the United States can accept Multibanco payments from customers in Portugal using [Sources](https://stripe.com/docs/sources)—a single integration path for creating payments using any supported method.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"Configuration name.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"oxxo\": {\n                    \"description\": \"OXXO is a Mexican chain of convenience stores with thousands of locations across Latin America and represents nearly 20% of online transactions in Mexico. OXXO allows customers to pay bills and online purchases in-store with cash. Check this [page](https://stripe.com/docs/payments/oxxo) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"p24\": {\n                    \"description\": \"Przelewy24 is a Poland-based payment method aggregator that allows customers to complete transactions online using bank transfers and other methods. Bank transfers account for 30% of online payments in Poland and Przelewy24 provides a way for customers to pay with over 165 banks. Check this [page](https://stripe.com/docs/payments/p24) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"pay_by_bank\": {\n                    \"description\": \"Pay by bank is a redirect payment method backed by bank transfers. A customer is redirected to their bank to authorize a bank transfer for a given amount. This removes a lot of the error risks inherent in waiting for the customer to initiate a transfer themselves, and is less expensive than card payments.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"paynow\": {\n                    \"description\": \"PayNow is a Singapore-based payment method that allows customers to make a payment using their preferred app from participating banks and participating non-bank financial institutions. Check this [page](https://stripe.com/docs/payments/paynow) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"paypal\": {\n                    \"description\": \"PayPal, a digital wallet popular with customers in Europe, allows your customers worldwide to pay using their PayPal account. Check this [page](https://stripe.com/docs/payments/paypal) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"promptpay\": {\n                    \"description\": \"PromptPay is a Thailand-based payment method that allows customers to make a payment using their preferred app from participating banks. Check this [page](https://stripe.com/docs/payments/promptpay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"revolut_pay\": {\n                    \"description\": \"Revolut Pay, developed by Revolut, a global finance app, is a digital wallet payment method. Revolut Pay uses the customer’s stored balance or cards to fund the payment, and offers the option for non-Revolut customers to save their details after their first purchase.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"sepa_debit\": {\n                    \"description\": \"The [Single Euro Payments Area (SEPA)](https://en.wikipedia.org/wiki/Single_Euro_Payments_Area) is an initiative of the European Union to simplify payments within and across member countries. SEPA established and enforced banking standards to allow for the direct debiting of every EUR-denominated bank account within the SEPA region, check this [page](https://stripe.com/docs/payments/sepa-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"sofort\": {\n                    \"description\": \"Stripe users in Europe and the United States can use the [Payment Intents API](https://stripe.com/docs/payments/payment-intents)—a single integration path for creating payments using any supported method—to accept [Sofort](https://www.sofort.com/) payments from customers. Check this [page](https://stripe.com/docs/payments/sofort) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"swish\": {\n                    \"description\": \"Swish is a [real-time](https://stripe.com/docs/payments/real-time) payment method popular in Sweden. It allows customers to [authenticate and approve](https://stripe.com/docs/payments/payment-methods#customer-actions) payments using the Swish mobile app and the Swedish BankID mobile app. Check this [page](https://stripe.com/docs/payments/swish) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"twint\": {\n                    \"description\": \"Twint is a payment method popular in Switzerland. It allows customers to pay using their mobile phone. Check this [page](https://docs.stripe.com/payments/twint) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"us_bank_account\": {\n                    \"description\": \"Stripe users in the United States can accept ACH direct debit payments from customers with a US bank account using the Automated Clearing House (ACH) payments system operated by Nacha. Check this [page](https://stripe.com/docs/payments/ach-direct-debit) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"wechat_pay\": {\n                    \"description\": \"WeChat, owned by Tencent, is China's leading mobile app with over 1 billion monthly active users. Chinese consumers can use WeChat Pay to pay for goods and services inside of businesses' apps and websites. WeChat Pay users buy most frequently in gaming, e-commerce, travel, online education, and food/nutrition. Check this [page](https://stripe.com/docs/payments/wechat-pay) for more details.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"zip\": {\n                    \"description\": \"Zip gives your customers a way to split purchases over a series of payments. Check this [page](https://stripe.com/docs/payments/zip) for more details like country availability.\",\n                    \"properties\": {\n                      \"display_preference\": {\n                        \"properties\": {\n                          \"preference\": {\n                            \"enum\": [\"none\", \"off\", \"on\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"display_preference_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method_configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update payment method configuration\"\n      }\n    },\n    \"/v1/payment_method_domains\": {\n      \"get\": {\n        \"description\": \"<p>Lists the details of existing payment method domains.</p>\",\n        \"operationId\": \"GetPaymentMethodDomains\",\n        \"parameters\": [\n          {\n            \"description\": \"The domain name that this payment method domain object represents.\",\n            \"in\": \"query\",\n            \"name\": \"domain_name\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Whether this payment method domain is enabled. If the domain is not enabled, payment methods will not appear in Elements\",\n            \"in\": \"query\",\n            \"name\": \"enabled\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payment_method_domain\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/payment_method_domains\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentMethodDomainResourcePaymentMethodDomainList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List payment method domains\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a payment method domain.</p>\",\n        \"operationId\": \"PostPaymentMethodDomains\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"domain_name\": {\n                    \"description\": \"The domain name that this payment method domain object represents.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"enabled\": {\n                    \"description\": \"Whether this payment method domain is enabled. If the domain is not enabled, payment methods that require a payment method domain will not appear in Elements.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"domain_name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method_domain\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a payment method domain\"\n      }\n    },\n    \"/v1/payment_method_domains/{payment_method_domain}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing payment method domain.</p>\",\n        \"operationId\": \"GetPaymentMethodDomainsPaymentMethodDomain\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method_domain\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method_domain\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a payment method domain\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing payment method domain.</p>\",\n        \"operationId\": \"PostPaymentMethodDomainsPaymentMethodDomain\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method_domain\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"description\": \"Whether this payment method domain is enabled. If the domain is not enabled, payment methods that require a payment method domain will not appear in Elements.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method_domain\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a payment method domain\"\n      }\n    },\n    \"/v1/payment_method_domains/{payment_method_domain}/validate\": {\n      \"post\": {\n        \"description\": \"<p>Some payment methods such as Apple Pay require additional steps to verify a domain. If the requirements weren’t satisfied when the domain was created, the payment method will be inactive on the domain.\\nThe payment method doesn’t appear in Elements for this domain until it is active.</p>\\n\\n<p>To activate a payment method on an existing payment method domain, complete the required validation steps specific to the payment method, and then validate the payment method domain with this endpoint.</p>\\n\\n<p>Related guides: <a href=\\\"/docs/payments/payment-methods/pmd-registration\\\">Payment method domains</a>.</p>\",\n        \"operationId\": \"PostPaymentMethodDomainsPaymentMethodDomainValidate\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method_domain\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method_domain\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Validate an existing payment method domain\"\n      }\n    },\n    \"/v1/payment_methods\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of PaymentMethods for Treasury flows. If you want to list the PaymentMethods attached to a Customer for payments, you should use the <a href=\\\"/docs/api/payment_methods/customer_list\\\">List a Customer’s PaymentMethods</a> API instead.</p>\",\n        \"operationId\": \"GetPaymentMethods\",\n        \"parameters\": [\n          {\n            \"description\": \"The ID of the customer whose PaymentMethods will be retrieved.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"An optional filter on the list, based on the object `type` field. Without the filter, the list includes all current and future payment method types. If your integration expects only one type of payment method in the response, make sure to provide a type value in the request.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"acss_debit\",\n                \"affirm\",\n                \"afterpay_clearpay\",\n                \"alipay\",\n                \"alma\",\n                \"amazon_pay\",\n                \"au_becs_debit\",\n                \"bacs_debit\",\n                \"bancontact\",\n                \"blik\",\n                \"boleto\",\n                \"card\",\n                \"cashapp\",\n                \"customer_balance\",\n                \"eps\",\n                \"fpx\",\n                \"giropay\",\n                \"grabpay\",\n                \"ideal\",\n                \"kakao_pay\",\n                \"klarna\",\n                \"konbini\",\n                \"kr_card\",\n                \"link\",\n                \"mobilepay\",\n                \"multibanco\",\n                \"naver_pay\",\n                \"oxxo\",\n                \"p24\",\n                \"pay_by_bank\",\n                \"payco\",\n                \"paynow\",\n                \"paypal\",\n                \"pix\",\n                \"promptpay\",\n                \"revolut_pay\",\n                \"samsung_pay\",\n                \"sepa_debit\",\n                \"sofort\",\n                \"swish\",\n                \"twint\",\n                \"us_bank_account\",\n                \"wechat_pay\",\n                \"zip\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payment_method\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/payment_methods\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentFlowsPaymentMethodList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List PaymentMethods\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a PaymentMethod object. Read the <a href=\\\"/docs/stripe-js/reference#stripe-create-payment-method\\\">Stripe.js reference</a> to learn how to create PaymentMethods via Stripe.js.</p>\\n\\n<p>Instead of creating a PaymentMethod directly, we recommend using the <a href=\\\"/docs/payments/accept-a-payment\\\">PaymentIntents</a> API to accept a payment immediately or the <a href=\\\"/docs/payments/save-and-reuse\\\">SetupIntent</a> API to collect payment method details ahead of a future payment.</p>\",\n        \"operationId\": \"PostPaymentMethods\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"acss_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"affirm\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"afterpay_clearpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"alipay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"alma\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"amazon_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"au_becs_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bacs_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bancontact\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"billing_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"blik\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"boleto\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cashapp\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"customer_balance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"eps\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fpx\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"giropay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"grabpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"ideal\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"interac_present\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"kakao_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"klarna\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"konbini\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"kr_card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"link\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mobilepay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"multibanco\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"naver_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"oxxo\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"p24\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pay_by_bank\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payco\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"paynow\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"paypal\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pix\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"promptpay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"radar_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"revolut_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"samsung_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"sepa_debit\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"sofort\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"swish\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"twint\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"us_bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"wechat_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"zip\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"acss_debit\": {\n                    \"description\": \"If this is an `acss_debit` PaymentMethod, this hash contains details about the ACSS Debit payment method.\",\n                    \"properties\": {\n                      \"account_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"institution_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"transit_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\n                      \"account_number\",\n                      \"institution_number\",\n                      \"transit_number\"\n                    ],\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"affirm\": {\n                    \"description\": \"If this is an `affirm` PaymentMethod, this hash contains details about the Affirm payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"afterpay_clearpay\": {\n                    \"description\": \"If this is an `AfterpayClearpay` PaymentMethod, this hash contains details about the AfterpayClearpay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"alipay\": {\n                    \"description\": \"If this is an `Alipay` PaymentMethod, this hash contains details about the Alipay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"allow_redisplay\": {\n                    \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to `unspecified`.\",\n                    \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"alma\": {\n                    \"description\": \"If this is a Alma PaymentMethod, this hash contains details about the Alma payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"amazon_pay\": {\n                    \"description\": \"If this is a AmazonPay PaymentMethod, this hash contains details about the AmazonPay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"au_becs_debit\": {\n                    \"description\": \"If this is an `au_becs_debit` PaymentMethod, this hash contains details about the bank account.\",\n                    \"properties\": {\n                      \"account_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"bsb_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"account_number\", \"bsb_number\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"bacs_debit\": {\n                    \"description\": \"If this is a `bacs_debit` PaymentMethod, this hash contains details about the Bacs Direct Debit bank account.\",\n                    \"properties\": {\n                      \"account_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"sort_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"bancontact\": {\n                    \"description\": \"If this is a `bancontact` PaymentMethod, this hash contains details about the Bancontact payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"billing_details\": {\n                    \"description\": \"Billing information associated with the PaymentMethod that may be used or required by particular types of payment methods.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"billing_details_address\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"email\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"name\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"phone\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"billing_details_inner_params\",\n                    \"type\": \"object\"\n                  },\n                  \"blik\": {\n                    \"description\": \"If this is a `blik` PaymentMethod, this hash contains details about the BLIK payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"boleto\": {\n                    \"description\": \"If this is a `boleto` PaymentMethod, this hash contains details about the Boleto payment method.\",\n                    \"properties\": {\n                      \"tax_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"tax_id\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"card\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"cvc\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"exp_year\": {\n                            \"type\": \"integer\"\n                          },\n                          \"networks\": {\n                            \"properties\": {\n                              \"preferred\": {\n                                \"enum\": [\n                                  \"cartes_bancaires\",\n                                  \"mastercard\",\n                                  \"visa\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"networks_params\",\n                            \"type\": \"object\"\n                          },\n                          \"number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"exp_month\", \"exp_year\", \"number\"],\n                        \"title\": \"card_details_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"properties\": {\n                          \"token\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"token\"],\n                        \"title\": \"token_params\",\n                        \"type\": \"object\"\n                      }\n                    ],\n                    \"description\": \"If this is a `card` PaymentMethod, this hash contains the user's card details. For backwards compatibility, you can alternatively provide a Stripe token (e.g., for Apple Pay, Amex Express Checkout, or legacy Checkout) into the card hash with format `card: {token: \\\"tok_visa\\\"}`. When providing a card number, you must meet the requirements for [PCI compliance](https://stripe.com/docs/security#validating-pci-compliance). We strongly recommend using Stripe.js instead of interacting with this API directly.\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"cashapp\": {\n                    \"description\": \"If this is a `cashapp` PaymentMethod, this hash contains details about the Cash App Pay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The `Customer` to whom the original PaymentMethod is attached.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"customer_balance\": {\n                    \"description\": \"If this is a `customer_balance` PaymentMethod, this hash contains details about the CustomerBalance payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"eps\": {\n                    \"description\": \"If this is an `eps` PaymentMethod, this hash contains details about the EPS payment method.\",\n                    \"properties\": {\n                      \"bank\": {\n                        \"enum\": [\n                          \"arzte_und_apotheker_bank\",\n                          \"austrian_anadi_bank_ag\",\n                          \"bank_austria\",\n                          \"bankhaus_carl_spangler\",\n                          \"bankhaus_schelhammer_und_schattera_ag\",\n                          \"bawag_psk_ag\",\n                          \"bks_bank_ag\",\n                          \"brull_kallmus_bank_ag\",\n                          \"btv_vier_lander_bank\",\n                          \"capital_bank_grawe_gruppe_ag\",\n                          \"deutsche_bank_ag\",\n                          \"dolomitenbank\",\n                          \"easybank_ag\",\n                          \"erste_bank_und_sparkassen\",\n                          \"hypo_alpeadriabank_international_ag\",\n                          \"hypo_bank_burgenland_aktiengesellschaft\",\n                          \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                          \"hypo_oberosterreich_salzburg_steiermark\",\n                          \"hypo_tirol_bank_ag\",\n                          \"hypo_vorarlberg_bank_ag\",\n                          \"marchfelder_bank\",\n                          \"oberbank_ag\",\n                          \"raiffeisen_bankengruppe_osterreich\",\n                          \"schoellerbank_ag\",\n                          \"sparda_bank_wien\",\n                          \"volksbank_gruppe\",\n                          \"volkskreditbank_ag\",\n                          \"vr_bank_braunau\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"fpx\": {\n                    \"description\": \"If this is an `fpx` PaymentMethod, this hash contains details about the FPX payment method.\",\n                    \"properties\": {\n                      \"bank\": {\n                        \"enum\": [\n                          \"affin_bank\",\n                          \"agrobank\",\n                          \"alliance_bank\",\n                          \"ambank\",\n                          \"bank_islam\",\n                          \"bank_muamalat\",\n                          \"bank_of_china\",\n                          \"bank_rakyat\",\n                          \"bsn\",\n                          \"cimb\",\n                          \"deutsche_bank\",\n                          \"hong_leong_bank\",\n                          \"hsbc\",\n                          \"kfh\",\n                          \"maybank2e\",\n                          \"maybank2u\",\n                          \"ocbc\",\n                          \"pb_enterprise\",\n                          \"public_bank\",\n                          \"rhb\",\n                          \"standard_chartered\",\n                          \"uob\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      }\n                    },\n                    \"required\": [\"bank\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"giropay\": {\n                    \"description\": \"If this is a `giropay` PaymentMethod, this hash contains details about the Giropay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"grabpay\": {\n                    \"description\": \"If this is a `grabpay` PaymentMethod, this hash contains details about the GrabPay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"ideal\": {\n                    \"description\": \"If this is an `ideal` PaymentMethod, this hash contains details about the iDEAL payment method.\",\n                    \"properties\": {\n                      \"bank\": {\n                        \"enum\": [\n                          \"abn_amro\",\n                          \"asn_bank\",\n                          \"bunq\",\n                          \"handelsbanken\",\n                          \"ing\",\n                          \"knab\",\n                          \"moneyou\",\n                          \"n26\",\n                          \"nn\",\n                          \"rabobank\",\n                          \"regiobank\",\n                          \"revolut\",\n                          \"sns_bank\",\n                          \"triodos_bank\",\n                          \"van_lanschot\",\n                          \"yoursafe\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"interac_present\": {\n                    \"description\": \"If this is an `interac_present` PaymentMethod, this hash contains details about the Interac Present payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"kakao_pay\": {\n                    \"description\": \"If this is a `kakao_pay` PaymentMethod, this hash contains details about the Kakao Pay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"klarna\": {\n                    \"description\": \"If this is a `klarna` PaymentMethod, this hash contains details about the Klarna payment method.\",\n                    \"properties\": {\n                      \"dob\": {\n                        \"properties\": {\n                          \"day\": {\n                            \"type\": \"integer\"\n                          },\n                          \"month\": {\n                            \"type\": \"integer\"\n                          },\n                          \"year\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"day\", \"month\", \"year\"],\n                        \"title\": \"date_of_birth\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"konbini\": {\n                    \"description\": \"If this is a `konbini` PaymentMethod, this hash contains details about the Konbini payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"kr_card\": {\n                    \"description\": \"If this is a `kr_card` PaymentMethod, this hash contains details about the Korean Card payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"link\": {\n                    \"description\": \"If this is an `Link` PaymentMethod, this hash contains details about the Link payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"mobilepay\": {\n                    \"description\": \"If this is a `mobilepay` PaymentMethod, this hash contains details about the MobilePay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"multibanco\": {\n                    \"description\": \"If this is a `multibanco` PaymentMethod, this hash contains details about the Multibanco payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"naver_pay\": {\n                    \"description\": \"If this is a `naver_pay` PaymentMethod, this hash contains details about the Naver Pay payment method.\",\n                    \"properties\": {\n                      \"funding\": {\n                        \"enum\": [\"card\", \"points\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      }\n                    },\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"oxxo\": {\n                    \"description\": \"If this is an `oxxo` PaymentMethod, this hash contains details about the OXXO payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"p24\": {\n                    \"description\": \"If this is a `p24` PaymentMethod, this hash contains details about the P24 payment method.\",\n                    \"properties\": {\n                      \"bank\": {\n                        \"enum\": [\n                          \"alior_bank\",\n                          \"bank_millennium\",\n                          \"bank_nowy_bfg_sa\",\n                          \"bank_pekao_sa\",\n                          \"banki_spbdzielcze\",\n                          \"blik\",\n                          \"bnp_paribas\",\n                          \"boz\",\n                          \"citi_handlowy\",\n                          \"credit_agricole\",\n                          \"envelobank\",\n                          \"etransfer_pocztowy24\",\n                          \"getin_bank\",\n                          \"ideabank\",\n                          \"ing\",\n                          \"inteligo\",\n                          \"mbank_mtransfer\",\n                          \"nest_przelew\",\n                          \"noble_pay\",\n                          \"pbac_z_ipko\",\n                          \"plus_bank\",\n                          \"santander_przelew24\",\n                          \"tmobile_usbugi_bankowe\",\n                          \"toyota_bank\",\n                          \"velobank\",\n                          \"volkswagen_bank\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      }\n                    },\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"pay_by_bank\": {\n                    \"description\": \"If this is a `pay_by_bank` PaymentMethod, this hash contains details about the PayByBank payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"payco\": {\n                    \"description\": \"If this is a `payco` PaymentMethod, this hash contains details about the PAYCO payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"The PaymentMethod to share.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"paynow\": {\n                    \"description\": \"If this is a `paynow` PaymentMethod, this hash contains details about the PayNow payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"paypal\": {\n                    \"description\": \"If this is a `paypal` PaymentMethod, this hash contains details about the PayPal payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"pix\": {\n                    \"description\": \"If this is a `pix` PaymentMethod, this hash contains details about the Pix payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"promptpay\": {\n                    \"description\": \"If this is a `promptpay` PaymentMethod, this hash contains details about the PromptPay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"radar_options\": {\n                    \"description\": \"Options to configure Radar. See [Radar Session](https://stripe.com/docs/radar/radar-session) for more information.\",\n                    \"properties\": {\n                      \"session\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"radar_options_with_hidden_options\",\n                    \"type\": \"object\"\n                  },\n                  \"revolut_pay\": {\n                    \"description\": \"If this is a `Revolut Pay` PaymentMethod, this hash contains details about the Revolut Pay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"samsung_pay\": {\n                    \"description\": \"If this is a `samsung_pay` PaymentMethod, this hash contains details about the SamsungPay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"sepa_debit\": {\n                    \"description\": \"If this is a `sepa_debit` PaymentMethod, this hash contains details about the SEPA debit bank account.\",\n                    \"properties\": {\n                      \"iban\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"iban\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"sofort\": {\n                    \"description\": \"If this is a `sofort` PaymentMethod, this hash contains details about the SOFORT payment method.\",\n                    \"properties\": {\n                      \"country\": {\n                        \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"country\"],\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"swish\": {\n                    \"description\": \"If this is a `swish` PaymentMethod, this hash contains details about the Swish payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"twint\": {\n                    \"description\": \"If this is a TWINT PaymentMethod, this hash contains details about the TWINT payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": {\n                    \"description\": \"The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type.\",\n                    \"enum\": [\n                      \"acss_debit\",\n                      \"affirm\",\n                      \"afterpay_clearpay\",\n                      \"alipay\",\n                      \"alma\",\n                      \"amazon_pay\",\n                      \"au_becs_debit\",\n                      \"bacs_debit\",\n                      \"bancontact\",\n                      \"blik\",\n                      \"boleto\",\n                      \"card\",\n                      \"cashapp\",\n                      \"customer_balance\",\n                      \"eps\",\n                      \"fpx\",\n                      \"giropay\",\n                      \"grabpay\",\n                      \"ideal\",\n                      \"kakao_pay\",\n                      \"klarna\",\n                      \"konbini\",\n                      \"kr_card\",\n                      \"link\",\n                      \"mobilepay\",\n                      \"multibanco\",\n                      \"naver_pay\",\n                      \"oxxo\",\n                      \"p24\",\n                      \"pay_by_bank\",\n                      \"payco\",\n                      \"paynow\",\n                      \"paypal\",\n                      \"pix\",\n                      \"promptpay\",\n                      \"revolut_pay\",\n                      \"samsung_pay\",\n                      \"sepa_debit\",\n                      \"sofort\",\n                      \"swish\",\n                      \"twint\",\n                      \"us_bank_account\",\n                      \"wechat_pay\",\n                      \"zip\"\n                    ],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"us_bank_account\": {\n                    \"description\": \"If this is an `us_bank_account` PaymentMethod, this hash contains details about the US bank account payment method.\",\n                    \"properties\": {\n                      \"account_holder_type\": {\n                        \"enum\": [\"company\", \"individual\"],\n                        \"type\": \"string\"\n                      },\n                      \"account_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"account_type\": {\n                        \"enum\": [\"checking\", \"savings\"],\n                        \"type\": \"string\"\n                      },\n                      \"financial_connections_account\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"routing_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_method_param\",\n                    \"type\": \"object\"\n                  },\n                  \"wechat_pay\": {\n                    \"description\": \"If this is an `wechat_pay` PaymentMethod, this hash contains details about the wechat_pay payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"zip\": {\n                    \"description\": \"If this is a `zip` PaymentMethod, this hash contains details about the Zip payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Shares a PaymentMethod\"\n      }\n    },\n    \"/v1/payment_methods/{payment_method}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a PaymentMethod object attached to the StripeAccount. To retrieve a payment method attached to a Customer, you should use <a href=\\\"/docs/api/payment_methods/customer\\\">Retrieve a Customer’s PaymentMethods</a></p>\",\n        \"operationId\": \"GetPaymentMethodsPaymentMethod\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a PaymentMethod\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a PaymentMethod object. A PaymentMethod must be attached a customer to be updated.</p>\",\n        \"operationId\": \"PostPaymentMethodsPaymentMethod\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"billing_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"link\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"naver_pay\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pay_by_bank\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"us_bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"allow_redisplay\": {\n                    \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to `unspecified`.\",\n                    \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"billing_details\": {\n                    \"description\": \"Billing information associated with the PaymentMethod that may be used or required by particular types of payment methods.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"billing_details_address\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"email\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"name\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"phone\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"billing_details_inner_params\",\n                    \"type\": \"object\"\n                  },\n                  \"card\": {\n                    \"description\": \"If this is a `card` PaymentMethod, this hash contains the user's card details.\",\n                    \"properties\": {\n                      \"exp_month\": {\n                        \"type\": \"integer\"\n                      },\n                      \"exp_year\": {\n                        \"type\": \"integer\"\n                      },\n                      \"networks\": {\n                        \"properties\": {\n                          \"preferred\": {\n                            \"enum\": [\n                              \"\",\n                              \"cartes_bancaires\",\n                              \"mastercard\",\n                              \"visa\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"networks_update_api_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"update_api_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"link\": {\n                    \"description\": \"If this is an `Link` PaymentMethod, this hash contains details about the Link payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"naver_pay\": {\n                    \"description\": \"If this is a `naver_pay` PaymentMethod, this hash contains details about the Naver Pay payment method.\",\n                    \"properties\": {\n                      \"funding\": {\n                        \"enum\": [\"card\", \"points\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      }\n                    },\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"pay_by_bank\": {\n                    \"description\": \"If this is a `pay_by_bank` PaymentMethod, this hash contains details about the PayByBank payment method.\",\n                    \"properties\": {},\n                    \"title\": \"param\",\n                    \"type\": \"object\"\n                  },\n                  \"us_bank_account\": {\n                    \"description\": \"If this is an `us_bank_account` PaymentMethod, this hash contains details about the US bank account payment method.\",\n                    \"properties\": {\n                      \"account_holder_type\": {\n                        \"enum\": [\"company\", \"individual\"],\n                        \"type\": \"string\"\n                      },\n                      \"account_type\": {\n                        \"enum\": [\"checking\", \"savings\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"update_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a PaymentMethod\"\n      }\n    },\n    \"/v1/payment_methods/{payment_method}/attach\": {\n      \"post\": {\n        \"description\": \"<p>Attaches a PaymentMethod object to a Customer.</p>\\n\\n<p>To attach a new PaymentMethod to a customer for future payments, we recommend you use a <a href=\\\"/docs/api/setup_intents\\\">SetupIntent</a>\\nor a PaymentIntent with <a href=\\\"/docs/api/payment_intents/create#create_payment_intent-setup_future_usage\\\">setup_future_usage</a>.\\nThese approaches will perform any necessary steps to set up the PaymentMethod for future payments. Using the <code>/v1/payment_methods/:id/attach</code>\\nendpoint without first using a SetupIntent or PaymentIntent with <code>setup_future_usage</code> does not optimize the PaymentMethod for\\nfuture use, which makes later declines and payment friction more likely.\\nSee <a href=\\\"/docs/payments/payment-intents#future-usage\\\">Optimizing cards for future payments</a> for more information about setting up\\nfuture payments.</p>\\n\\n<p>To use this PaymentMethod as the default for invoice or subscription payments,\\nset <a href=\\\"/docs/api/customers/update#update_customer-invoice_settings-default_payment_method\\\"><code>invoice_settings.default_payment_method</code></a>,\\non the Customer to the PaymentMethod’s ID.</p>\",\n        \"operationId\": \"PostPaymentMethodsPaymentMethodAttach\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"customer\": {\n                    \"description\": \"The ID of the customer to which to attach the PaymentMethod.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"customer\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Attach a PaymentMethod to a Customer\"\n      }\n    },\n    \"/v1/payment_methods/{payment_method}/detach\": {\n      \"post\": {\n        \"description\": \"<p>Detaches a PaymentMethod object from a Customer. After a PaymentMethod is detached, it can no longer be used for a payment or re-attached to a Customer.</p>\",\n        \"operationId\": \"PostPaymentMethodsPaymentMethodDetach\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payment_method\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payment_method\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Detach a PaymentMethod from a Customer\"\n      }\n    },\n    \"/v1/payouts\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of existing payouts sent to third-party bank accounts or payouts that Stripe sent to you. The payouts return in sorted order, with the most recently created payouts appearing first.</p>\",\n        \"operationId\": \"GetPayouts\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return payouts that are expected to arrive during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"arrival_date\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return payouts that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The ID of an external account - only return payouts sent to this external account.\",\n            \"in\": \"query\",\n            \"name\": \"destination\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return payouts that have the given status: `pending`, `paid`, `failed`, or `canceled`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/payout\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/payouts\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PayoutList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all payouts\"\n      },\n      \"post\": {\n        \"description\": \"<p>To send funds to your own bank account, create a new payout object. Your <a href=\\\"#balance\\\">Stripe balance</a> must cover the payout amount. If it doesn’t, you receive an “Insufficient Funds” error.</p>\\n\\n<p>If your API key is in test mode, money won’t actually be sent, though every other action occurs as if you’re in live mode.</p>\\n\\n<p>If you create a manual payout on a Stripe account that uses multiple payment source types, you need to specify the source type balance that the payout draws from. The <a href=\\\"#balance_object\\\">balance object</a> details available and pending amounts by source type.</p>\",\n        \"operationId\": \"PostPayouts\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"A positive integer in cents representing how much to payout.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"destination\": {\n                    \"description\": \"The ID of a bank account or a card to send the payout to. If you don't provide a destination, we use the default external account for the specified currency.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"method\": {\n                    \"description\": \"The method used to send this payout, which is `standard` or `instant`. We support `instant` for payouts to debit cards and bank accounts in certain countries. Learn more about [bank support for Instant Payouts](https://stripe.com/docs/payouts/instant-payouts-banks).\",\n                    \"enum\": [\"instant\", \"standard\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"source_type\": {\n                    \"description\": \"The balance type of your Stripe balance to draw this payout from. Balances for different payment sources are kept separately. You can find the amounts with the Balances API. One of `bank_account`, `card`, or `fpx`.\",\n                    \"enum\": [\"bank_account\", \"card\", \"fpx\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"A string that displays on the recipient's bank or card statement (up to 22 characters). A `statement_descriptor` that's longer than 22 characters return an error. Most banks truncate this information and display it inconsistently. Some banks might not display it at all.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"required\": [\"amount\", \"currency\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payout\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a payout\"\n      }\n    },\n    \"/v1/payouts/{payout}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing payout. Supply the unique payout ID from either a payout creation request or the payout list. Stripe returns the corresponding payout information.</p>\",\n        \"operationId\": \"GetPayoutsPayout\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"payout\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payout\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a payout\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified payout by setting the values of the parameters you pass. We don’t change parameters that you don’t provide. This request only accepts the metadata as arguments.</p>\",\n        \"operationId\": \"PostPayoutsPayout\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payout\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payout\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a payout\"\n      }\n    },\n    \"/v1/payouts/{payout}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>You can cancel a previously created payout if its status is <code>pending</code>. Stripe refunds the funds to your available balance. You can’t cancel automatic Stripe payouts.</p>\",\n        \"operationId\": \"PostPayoutsPayoutCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payout\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payout\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a payout\"\n      }\n    },\n    \"/v1/payouts/{payout}/reverse\": {\n      \"post\": {\n        \"description\": \"<p>Reverses a payout by debiting the destination bank account. At this time, you can only reverse payouts for connected accounts to US bank accounts. If the payout is manual and in the <code>pending</code> status, use <code>/v1/payouts/:id/cancel</code> instead.</p>\\n\\n<p>By requesting a reversal through <code>/v1/payouts/:id/reverse</code>, you confirm that the authorized signatory of the selected bank account authorizes the debit on the bank account and that no other authorization is required.</p>\",\n        \"operationId\": \"PostPayoutsPayoutReverse\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"payout\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/payout\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Reverse a payout\"\n      }\n    },\n    \"/v1/plans\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your plans.</p>\",\n        \"operationId\": \"GetPlans\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return plans that are active or inactive (e.g., pass `false` to list all inactive plans).\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return plans for the given product.\",\n            \"in\": \"query\",\n            \"name\": \"product\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/plan\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/plans\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PlanList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all plans\"\n      },\n      \"post\": {\n        \"description\": \"<p>You can now model subscriptions more flexibly using the <a href=\\\"#prices\\\">Prices API</a>. It replaces the Plans API and is backwards compatible to simplify your migration.</p>\",\n        \"operationId\": \"PostPlans\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"product\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tiers\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transform_usage\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the plan is currently available for new subscriptions. Defaults to `true`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"aggregate_usage\": {\n                    \"description\": \"Specifies a usage aggregation strategy for plans of `usage_type=metered`. Allowed values are `sum` for summing up all usage during a period, `last_during_period` for using the last usage record reported within a period, `last_ever` for using the last usage record ever (across period bounds) or `max` which uses the usage record with the maximum reported usage during a period. Defaults to `sum`.\",\n                    \"enum\": [\"last_during_period\", \"last_ever\", \"max\", \"sum\"],\n                    \"type\": \"string\"\n                  },\n                  \"amount\": {\n                    \"description\": \"A positive integer in cents (or local equivalent) (or 0 for a free plan) representing how much to charge on a recurring basis.\",\n                    \"type\": \"integer\"\n                  },\n                  \"amount_decimal\": {\n                    \"description\": \"Same as `amount`, but accepts a decimal value with at most 12 decimal places. Only one of `amount` and `amount_decimal` can be set.\",\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  },\n                  \"billing_scheme\": {\n                    \"description\": \"Describes how to compute the price per period. Either `per_unit` or `tiered`. `per_unit` indicates that the fixed amount (specified in `amount`) will be charged per unit in `quantity` (for plans with `usage_type=licensed`), or per unit of total usage (for plans with `usage_type=metered`). `tiered` indicates that the unit pricing will be computed using a tiering strategy as defined using the `tiers` and `tiers_mode` attributes.\",\n                    \"enum\": [\"per_unit\", \"tiered\"],\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"id\": {\n                    \"description\": \"An identifier randomly generated by Stripe. Used to identify this plan when subscribing a customer. You can optionally override this ID, but the ID must be unique across all plans in your Stripe account. You can, however, use the same plan ID in both live and test modes.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"interval\": {\n                    \"description\": \"Specifies billing frequency. Either `day`, `week`, `month` or `year`.\",\n                    \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                    \"type\": \"string\"\n                  },\n                  \"interval_count\": {\n                    \"description\": \"The number of intervals between subscription billings. For example, `interval=month` and `interval_count=3` bills every 3 months. Maximum of three years interval allowed (3 years, 36 months, or 156 weeks).\",\n                    \"type\": \"integer\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"meter\": {\n                    \"description\": \"The meter tracking the usage of a metered price\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"nickname\": {\n                    \"description\": \"A brief description of the plan, hidden from customers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"product\": {\n                    \"anyOf\": [\n                      {\n                        \"description\": \"The product whose pricing the created plan will represent. This can either be the ID of an existing product, or a dictionary containing fields used to create a [service product](https://stripe.com/docs/api#product_object-type).\",\n                        \"properties\": {\n                          \"active\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"id\": {\n                            \"deprecated\": true,\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"metadata\": {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"statement_descriptor\": {\n                            \"maxLength\": 22,\n                            \"type\": \"string\"\n                          },\n                          \"tax_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"unit_label\": {\n                            \"maxLength\": 12,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"name\"],\n                        \"title\": \"inline_product_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"description\": \"The ID of the product whose pricing the created plan will represent.\",\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ]\n                  },\n                  \"tiers\": {\n                    \"description\": \"Each element represents a pricing tier. This parameter requires `billing_scheme` to be set to `tiered`. See also the documentation for `billing_scheme`.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"flat_amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"flat_amount_decimal\": {\n                          \"format\": \"decimal\",\n                          \"type\": \"string\"\n                        },\n                        \"unit_amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"unit_amount_decimal\": {\n                          \"format\": \"decimal\",\n                          \"type\": \"string\"\n                        },\n                        \"up_to\": {\n                          \"anyOf\": [\n                            {\n                              \"enum\": [\"inf\"],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"type\": \"integer\"\n                            }\n                          ]\n                        }\n                      },\n                      \"required\": [\"up_to\"],\n                      \"title\": \"tier\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"tiers_mode\": {\n                    \"description\": \"Defines if the tiering price should be `graduated` or `volume` based. In `volume`-based tiering, the maximum quantity within a period determines the per unit price, in `graduated` tiering pricing can successively change as the quantity grows.\",\n                    \"enum\": [\"graduated\", \"volume\"],\n                    \"type\": \"string\"\n                  },\n                  \"transform_usage\": {\n                    \"description\": \"Apply a transformation to the reported usage or set quantity before computing the billed price. Cannot be combined with `tiers`.\",\n                    \"properties\": {\n                      \"divide_by\": {\n                        \"type\": \"integer\"\n                      },\n                      \"round\": {\n                        \"enum\": [\"down\", \"up\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"divide_by\", \"round\"],\n                    \"title\": \"transform_usage_param\",\n                    \"type\": \"object\"\n                  },\n                  \"trial_period_days\": {\n                    \"description\": \"Default number of trial days when subscribing a customer to this plan using [`trial_from_plan=true`](https://stripe.com/docs/api#create_subscription-trial_from_plan).\",\n                    \"type\": \"integer\"\n                  },\n                  \"usage_type\": {\n                    \"description\": \"Configures how the quantity per period should be determined. Can be either `metered` or `licensed`. `licensed` automatically bills the `quantity` set when adding it to a subscription. `metered` aggregates the total usage based on usage records. Defaults to `licensed`.\",\n                    \"enum\": [\"licensed\", \"metered\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"currency\", \"interval\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/plan\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a plan\"\n      }\n    },\n    \"/v1/plans/{plan}\": {\n      \"delete\": {\n        \"description\": \"<p>Deleting plans means new subscribers can’t be added. Existing subscribers aren’t affected.</p>\",\n        \"operationId\": \"DeletePlansPlan\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"plan\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_plan\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a plan\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the plan with the given ID.</p>\",\n        \"operationId\": \"GetPlansPlan\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"plan\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/plan\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a plan\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified plan by setting the values of the parameters passed. Any parameters not provided are left unchanged. By design, you cannot change a plan’s ID, amount, currency, or billing cycle.</p>\",\n        \"operationId\": \"PostPlansPlan\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"plan\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the plan is currently available for new subscriptions.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"nickname\": {\n                    \"description\": \"A brief description of the plan, hidden from customers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"product\": {\n                    \"description\": \"The product the plan belongs to. This cannot be changed once it has been used in a subscription or subscription schedule.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"trial_period_days\": {\n                    \"description\": \"Default number of trial days when subscribing a customer to this plan using [`trial_from_plan=true`](https://stripe.com/docs/api#create_subscription-trial_from_plan).\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/plan\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a plan\"\n      }\n    },\n    \"/v1/prices\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your active prices, excluding <a href=\\\"/docs/products-prices/pricing-models#inline-pricing\\\">inline prices</a>. For the list of inactive prices, set <code>active</code> to false.</p>\",\n        \"operationId\": \"GetPrices\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return prices that are active or inactive (e.g., pass `false` to list all inactive prices).\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return prices for the given currency.\",\n            \"in\": \"query\",\n            \"name\": \"currency\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"currency\",\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return the price with these lookup_keys, if any exist. You can specify up to 10 lookup_keys.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"lookup_keys\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return prices for the given product.\",\n            \"in\": \"query\",\n            \"name\": \"product\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return prices with these recurring fields.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"recurring\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"interval\": {\n                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                  \"type\": \"string\"\n                },\n                \"meter\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                \"usage_type\": {\n                  \"enum\": [\"licensed\", \"metered\"],\n                  \"type\": \"string\"\n                }\n              },\n              \"title\": \"all_prices_recurring_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return prices of type `recurring` or `one_time`.\",\n            \"in\": \"query\",\n            \"name\": \"type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"one_time\", \"recurring\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/price\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/prices\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PriceList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all prices\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new price for an existing product. The price can be recurring or one-time.</p>\",\n        \"operationId\": \"PostPrices\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"currency_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"custom_unit_amount\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"product_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"recurring\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tiers\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transform_quantity\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the price can be used for new purchases. Defaults to `true`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"billing_scheme\": {\n                    \"description\": \"Describes how to compute the price per period. Either `per_unit` or `tiered`. `per_unit` indicates that the fixed amount (specified in `unit_amount` or `unit_amount_decimal`) will be charged per unit in `quantity` (for prices with `usage_type=licensed`), or per unit of total usage (for prices with `usage_type=metered`). `tiered` indicates that the unit pricing will be computed using a tiering strategy as defined using the `tiers` and `tiers_mode` attributes.\",\n                    \"enum\": [\"per_unit\", \"tiered\"],\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"currency_options\": {\n                    \"additionalProperties\": {\n                      \"properties\": {\n                        \"custom_unit_amount\": {\n                          \"properties\": {\n                            \"enabled\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"maximum\": {\n                              \"type\": \"integer\"\n                            },\n                            \"minimum\": {\n                              \"type\": \"integer\"\n                            },\n                            \"preset\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"enabled\"],\n                          \"title\": \"custom_unit_amount\",\n                          \"type\": \"object\"\n                        },\n                        \"tax_behavior\": {\n                          \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                          \"type\": \"string\"\n                        },\n                        \"tiers\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"flat_amount\": {\n                                \"type\": \"integer\"\n                              },\n                              \"flat_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              },\n                              \"unit_amount\": {\n                                \"type\": \"integer\"\n                              },\n                              \"unit_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              },\n                              \"up_to\": {\n                                \"anyOf\": [\n                                  {\n                                    \"enum\": [\"inf\"],\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"type\": \"integer\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"required\": [\"up_to\"],\n                            \"title\": \"tier\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"unit_amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"unit_amount_decimal\": {\n                          \"format\": \"decimal\",\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"title\": \"currency_option\",\n                      \"type\": \"object\"\n                    },\n                    \"description\": \"Prices defined in each available currency option. Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"type\": \"object\"\n                  },\n                  \"custom_unit_amount\": {\n                    \"description\": \"When set, provides configuration for the amount to be adjusted by the customer during Checkout Sessions and Payment Links.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"maximum\": {\n                        \"type\": \"integer\"\n                      },\n                      \"minimum\": {\n                        \"type\": \"integer\"\n                      },\n                      \"preset\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"custom_unit_amount\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"lookup_key\": {\n                    \"description\": \"A lookup key used to retrieve prices dynamically from a static string. This may be up to 200 characters.\",\n                    \"maxLength\": 200,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"nickname\": {\n                    \"description\": \"A brief description of the price, hidden from customers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"product\": {\n                    \"description\": \"The ID of the product that this price will belong to.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"product_data\": {\n                    \"description\": \"These fields can be used to create a new product that this price will belong to.\",\n                    \"properties\": {\n                      \"active\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"id\": {\n                        \"deprecated\": true,\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"statement_descriptor\": {\n                        \"maxLength\": 22,\n                        \"type\": \"string\"\n                      },\n                      \"tax_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"unit_label\": {\n                        \"maxLength\": 12,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"name\"],\n                    \"title\": \"inline_product_params\",\n                    \"type\": \"object\"\n                  },\n                  \"recurring\": {\n                    \"description\": \"The recurring components of a price such as `interval` and `usage_type`.\",\n                    \"properties\": {\n                      \"aggregate_usage\": {\n                        \"enum\": [\n                          \"last_during_period\",\n                          \"last_ever\",\n                          \"max\",\n                          \"sum\"\n                        ],\n                        \"type\": \"string\"\n                      },\n                      \"interval\": {\n                        \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                        \"type\": \"string\"\n                      },\n                      \"interval_count\": {\n                        \"type\": \"integer\"\n                      },\n                      \"meter\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"usage_type\": {\n                        \"enum\": [\"licensed\", \"metered\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"interval\"],\n                    \"title\": \"recurring\",\n                    \"type\": \"object\"\n                  },\n                  \"tax_behavior\": {\n                    \"description\": \"Only required if a [default tax behavior](https://stripe.com/docs/tax/products-prices-tax-categories-tax-behavior#setting-a-default-tax-behavior-(recommended)) was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`. Once specified as either `inclusive` or `exclusive`, it cannot be changed.\",\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"tiers\": {\n                    \"description\": \"Each element represents a pricing tier. This parameter requires `billing_scheme` to be set to `tiered`. See also the documentation for `billing_scheme`.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"flat_amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"flat_amount_decimal\": {\n                          \"format\": \"decimal\",\n                          \"type\": \"string\"\n                        },\n                        \"unit_amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"unit_amount_decimal\": {\n                          \"format\": \"decimal\",\n                          \"type\": \"string\"\n                        },\n                        \"up_to\": {\n                          \"anyOf\": [\n                            {\n                              \"enum\": [\"inf\"],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"type\": \"integer\"\n                            }\n                          ]\n                        }\n                      },\n                      \"required\": [\"up_to\"],\n                      \"title\": \"tier\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"tiers_mode\": {\n                    \"description\": \"Defines if the tiering price should be `graduated` or `volume` based. In `volume`-based tiering, the maximum quantity within a period determines the per unit price, in `graduated` tiering pricing can successively change as the quantity grows.\",\n                    \"enum\": [\"graduated\", \"volume\"],\n                    \"type\": \"string\"\n                  },\n                  \"transfer_lookup_key\": {\n                    \"description\": \"If set to true, will atomically remove the lookup key from the existing price, and assign it to this price.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"transform_quantity\": {\n                    \"description\": \"Apply a transformation to the reported usage or set quantity before computing the billed price. Cannot be combined with `tiers`.\",\n                    \"properties\": {\n                      \"divide_by\": {\n                        \"type\": \"integer\"\n                      },\n                      \"round\": {\n                        \"enum\": [\"down\", \"up\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"divide_by\", \"round\"],\n                    \"title\": \"transform_usage_param\",\n                    \"type\": \"object\"\n                  },\n                  \"unit_amount\": {\n                    \"description\": \"A positive integer in cents (or local equivalent) (or 0 for a free price) representing how much to charge. One of `unit_amount`, `unit_amount_decimal`, or `custom_unit_amount` is required, unless `billing_scheme=tiered`.\",\n                    \"type\": \"integer\"\n                  },\n                  \"unit_amount_decimal\": {\n                    \"description\": \"Same as `unit_amount`, but accepts a decimal value in cents (or local equivalent) with at most 12 decimal places. Only one of `unit_amount` and `unit_amount_decimal` can be set.\",\n                    \"format\": \"decimal\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"currency\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/price\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a price\"\n      }\n    },\n    \"/v1/prices/search\": {\n      \"get\": {\n        \"description\": \"<p>Search for prices you’ve previously created using Stripe’s <a href=\\\"/docs/search#search-query-language\\\">Search Query Language</a>.\\nDon’t use search in read-after-write flows where strict consistency is necessary. Under normal operating\\nconditions, data is searchable in less than a minute. Occasionally, propagation of new or updated data can be up\\nto an hour behind during outages. Search functionality is not available to merchants in India.</p>\",\n        \"operationId\": \"GetPricesSearch\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for pagination across multiple pages of results. Don't include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.\",\n            \"in\": \"query\",\n            \"name\": \"page\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The search query string. See [search query language](https://stripe.com/docs/search#search-query-language) and the list of supported [query fields for prices](https://stripe.com/docs/search#query-fields-for-prices).\",\n            \"in\": \"query\",\n            \"name\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/price\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"type\": \"boolean\"\n                    },\n                    \"next_page\": {\n                      \"maxLength\": 5000,\n                      \"nullable\": true,\n                      \"type\": \"string\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n                      \"enum\": [\"search_result\"],\n                      \"type\": \"string\"\n                    },\n                    \"total_count\": {\n                      \"description\": \"The total number of objects that match the query, only accurate up to 10,000.\",\n                      \"type\": \"integer\"\n                    },\n                    \"url\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SearchResult\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Search prices\"\n      }\n    },\n    \"/v1/prices/{price}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the price with the given ID.</p>\",\n        \"operationId\": \"GetPricesPrice\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"price\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/price\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a price\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified price by setting the values of the parameters passed. Any parameters not provided are left unchanged.</p>\",\n        \"operationId\": \"PostPricesPrice\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"price\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"currency_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the price can be used for new purchases. Defaults to `true`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"currency_options\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"properties\": {\n                            \"custom_unit_amount\": {\n                              \"properties\": {\n                                \"enabled\": {\n                                  \"type\": \"boolean\"\n                                },\n                                \"maximum\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"minimum\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"preset\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"enabled\"],\n                              \"title\": \"custom_unit_amount\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"tiers\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"flat_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"flat_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"unit_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"unit_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"up_to\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"enum\": [\"inf\"],\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"type\": \"integer\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"required\": [\"up_to\"],\n                                \"title\": \"tier\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"currency_option\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Prices defined in each available currency option. Each key must be a three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html) and a [supported currency](https://stripe.com/docs/currencies).\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"lookup_key\": {\n                    \"description\": \"A lookup key used to retrieve prices dynamically from a static string. This may be up to 200 characters.\",\n                    \"maxLength\": 200,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"nickname\": {\n                    \"description\": \"A brief description of the price, hidden from customers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"tax_behavior\": {\n                    \"description\": \"Only required if a [default tax behavior](https://stripe.com/docs/tax/products-prices-tax-categories-tax-behavior#setting-a-default-tax-behavior-(recommended)) was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`. Once specified as either `inclusive` or `exclusive`, it cannot be changed.\",\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"transfer_lookup_key\": {\n                    \"description\": \"If set to true, will atomically remove the lookup key from the existing price, and assign it to this price.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/price\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a price\"\n      }\n    },\n    \"/v1/products\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your products. The products are returned sorted by creation date, with the most recently created products appearing first.</p>\",\n        \"operationId\": \"GetProducts\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return products that are active or inactive (e.g., pass `false` to list all inactive products).\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return products that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return products with the given IDs. Cannot be used with [starting_after](https://stripe.com/docs/api#list_products-starting_after) or [ending_before](https://stripe.com/docs/api#list_products-ending_before).\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"ids\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return products that can be shipped (i.e., physical, not digital products).\",\n            \"in\": \"query\",\n            \"name\": \"shippable\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return products with the given url.\",\n            \"in\": \"query\",\n            \"name\": \"url\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/product\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/products\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ProductList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all products\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new product object.</p>\",\n        \"operationId\": \"PostProducts\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"default_price_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"images\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"marketing_features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"package_dimensions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the product is currently available for purchase. Defaults to `true`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"default_price_data\": {\n                    \"description\": \"Data used to generate a new [Price](https://stripe.com/docs/api/prices) object. This Price will be set as the default price for this product.\",\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"currency_options\": {\n                        \"additionalProperties\": {\n                          \"properties\": {\n                            \"custom_unit_amount\": {\n                              \"properties\": {\n                                \"enabled\": {\n                                  \"type\": \"boolean\"\n                                },\n                                \"maximum\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"minimum\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"preset\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"enabled\"],\n                              \"title\": \"custom_unit_amount\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"tiers\": {\n                              \"items\": {\n                                \"properties\": {\n                                  \"flat_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"flat_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"unit_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"unit_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"up_to\": {\n                                    \"anyOf\": [\n                                      {\n                                        \"enum\": [\"inf\"],\n                                        \"maxLength\": 5000,\n                                        \"type\": \"string\"\n                                      },\n                                      {\n                                        \"type\": \"integer\"\n                                      }\n                                    ]\n                                  }\n                                },\n                                \"required\": [\"up_to\"],\n                                \"title\": \"tier\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"currency_option\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"custom_unit_amount\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"maximum\": {\n                            \"type\": \"integer\"\n                          },\n                          \"minimum\": {\n                            \"type\": \"integer\"\n                          },\n                          \"preset\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"custom_unit_amount\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"recurring\": {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"recurring_adhoc\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\"],\n                    \"title\": \"price_data_without_product_with_metadata\",\n                    \"type\": \"object\"\n                  },\n                  \"description\": {\n                    \"description\": \"The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes.\",\n                    \"maxLength\": 40000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"id\": {\n                    \"description\": \"An identifier will be randomly generated by Stripe. You can optionally override this ID, but the ID must be unique across all products in your Stripe account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"images\": {\n                    \"description\": \"A list of up to 8 URLs of images for this product, meant to be displayable to the customer.\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"marketing_features\": {\n                    \"description\": \"A list of up to 15 marketing features for this product. These are displayed in [pricing tables](https://stripe.com/docs/payments/checkout/pricing-table).\",\n                    \"items\": {\n                      \"properties\": {\n                        \"name\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"name\"],\n                      \"title\": \"features\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"The product's name, meant to be displayable to the customer.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"package_dimensions\": {\n                    \"description\": \"The dimensions of this product for shipping purposes.\",\n                    \"properties\": {\n                      \"height\": {\n                        \"type\": \"number\"\n                      },\n                      \"length\": {\n                        \"type\": \"number\"\n                      },\n                      \"weight\": {\n                        \"type\": \"number\"\n                      },\n                      \"width\": {\n                        \"type\": \"number\"\n                      }\n                    },\n                    \"required\": [\"height\", \"length\", \"weight\", \"width\"],\n                    \"title\": \"package_dimensions_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"shippable\": {\n                    \"description\": \"Whether this product is shipped (i.e., physical goods).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"An arbitrary string to be displayed on your customer's credit card or bank statement. While most banks display this information consistently, some may display it incorrectly or not at all.\\n\\nThis may be up to 22 characters. The statement description may not include `<`, `>`, `\\\\`, `\\\"`, `'` characters, and will appear on your customer's statement in capital letters. Non-ASCII characters are automatically stripped.\\n It must contain at least one letter. Only used for subscription payments.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"tax_code\": {\n                    \"description\": \"A [tax code](https://stripe.com/docs/tax/tax-categories) ID.\",\n                    \"type\": \"string\"\n                  },\n                  \"unit_label\": {\n                    \"description\": \"A label that represents units of this product. When set, this will be included in customers' receipts, invoices, Checkout, and the customer portal.\",\n                    \"maxLength\": 12,\n                    \"type\": \"string\"\n                  },\n                  \"url\": {\n                    \"description\": \"A URL of a publicly-accessible webpage for this product.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/product\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a product\"\n      }\n    },\n    \"/v1/products/search\": {\n      \"get\": {\n        \"description\": \"<p>Search for products you’ve previously created using Stripe’s <a href=\\\"/docs/search#search-query-language\\\">Search Query Language</a>.\\nDon’t use search in read-after-write flows where strict consistency is necessary. Under normal operating\\nconditions, data is searchable in less than a minute. Occasionally, propagation of new or updated data can be up\\nto an hour behind during outages. Search functionality is not available to merchants in India.</p>\",\n        \"operationId\": \"GetProductsSearch\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for pagination across multiple pages of results. Don't include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.\",\n            \"in\": \"query\",\n            \"name\": \"page\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The search query string. See [search query language](https://stripe.com/docs/search#search-query-language) and the list of supported [query fields for products](https://stripe.com/docs/search#query-fields-for-products).\",\n            \"in\": \"query\",\n            \"name\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/product\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"type\": \"boolean\"\n                    },\n                    \"next_page\": {\n                      \"maxLength\": 5000,\n                      \"nullable\": true,\n                      \"type\": \"string\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n                      \"enum\": [\"search_result\"],\n                      \"type\": \"string\"\n                    },\n                    \"total_count\": {\n                      \"description\": \"The total number of objects that match the query, only accurate up to 10,000.\",\n                      \"type\": \"integer\"\n                    },\n                    \"url\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SearchResult\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Search products\"\n      }\n    },\n    \"/v1/products/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Delete a product. Deleting a product is only possible if it has no prices associated with it. Additionally, deleting a product with <code>type=good</code> is only possible if it has no SKUs associated with it.</p>\",\n        \"operationId\": \"DeleteProductsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_product\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a product\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing product. Supply the unique product ID from either a product creation request or the product list, and Stripe will return the corresponding product information.</p>\",\n        \"operationId\": \"GetProductsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/product\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a product\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specific product by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostProductsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"description\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"images\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"marketing_features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"package_dimensions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_code\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"unit_label\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"url\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the product is available for purchase.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"default_price\": {\n                    \"description\": \"The ID of the [Price](https://stripe.com/docs/api/prices) object that is the default price for this product.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 40000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"images\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of up to 8 URLs of images for this product, meant to be displayable to the customer.\"\n                  },\n                  \"marketing_features\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"name\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"name\"],\n                          \"title\": \"features\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of up to 15 marketing features for this product. These are displayed in [pricing tables](https://stripe.com/docs/payments/checkout/pricing-table).\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"name\": {\n                    \"description\": \"The product's name, meant to be displayable to the customer.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"package_dimensions\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"height\": {\n                            \"type\": \"number\"\n                          },\n                          \"length\": {\n                            \"type\": \"number\"\n                          },\n                          \"weight\": {\n                            \"type\": \"number\"\n                          },\n                          \"width\": {\n                            \"type\": \"number\"\n                          }\n                        },\n                        \"required\": [\"height\", \"length\", \"weight\", \"width\"],\n                        \"title\": \"package_dimensions_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The dimensions of this product for shipping purposes.\"\n                  },\n                  \"shippable\": {\n                    \"description\": \"Whether this product is shipped (i.e., physical goods).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"An arbitrary string to be displayed on your customer's credit card or bank statement. While most banks display this information consistently, some may display it incorrectly or not at all.\\n\\nThis may be up to 22 characters. The statement description may not include `<`, `>`, `\\\\`, `\\\"`, `'` characters, and will appear on your customer's statement in capital letters. Non-ASCII characters are automatically stripped.\\n It must contain at least one letter. May only be set if `type=service`. Only used for subscription payments.\",\n                    \"maxLength\": 22,\n                    \"type\": \"string\"\n                  },\n                  \"tax_code\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A [tax code](https://stripe.com/docs/tax/tax-categories) ID.\"\n                  },\n                  \"unit_label\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 12,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A label that represents units of this product. When set, this will be included in customers' receipts, invoices, Checkout, and the customer portal. May only be set if `type=service`.\"\n                  },\n                  \"url\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A URL of a publicly-accessible webpage for this product.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/product\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a product\"\n      }\n    },\n    \"/v1/products/{product}/features\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve a list of features for a product</p>\",\n        \"operationId\": \"GetProductsProductFeatures\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"product\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/product_feature\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"EntitlementsResourceProductFeatureList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all features attached to a product\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a product_feature, which represents a feature attachment to a product</p>\",\n        \"operationId\": \"PostProductsProductFeatures\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"product\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"entitlement_feature\": {\n                    \"description\": \"The ID of the [Feature](https://stripe.com/docs/api/entitlements/feature) object attached to this product.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"entitlement_feature\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/product_feature\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Attach a feature to a product\"\n      }\n    },\n    \"/v1/products/{product}/features/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes the feature attachment to a product</p>\",\n        \"operationId\": \"DeleteProductsProductFeaturesId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"product\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_product_feature\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Remove a feature from a product\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a product_feature, which represents a feature attachment to a product</p>\",\n        \"operationId\": \"GetProductsProductFeaturesId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The ID of the product_feature.\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"The ID of the product.\",\n            \"in\": \"path\",\n            \"name\": \"product\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/product_feature\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a product_feature\"\n      }\n    },\n    \"/v1/promotion_codes\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your promotion codes.</p>\",\n        \"operationId\": \"GetPromotionCodes\",\n        \"parameters\": [\n          {\n            \"description\": \"Filter promotion codes by whether they are active.\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return promotion codes that have this case-insensitive code.\",\n            \"in\": \"query\",\n            \"name\": \"code\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return promotion codes for this coupon.\",\n            \"in\": \"query\",\n            \"name\": \"coupon\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return promotion codes that are restricted to this customer.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/promotion_code\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/promotion_codes\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PromotionCodesResourcePromotionCodeList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all promotion codes\"\n      },\n      \"post\": {\n        \"description\": \"<p>A promotion code points to a coupon. You can optionally restrict the code to a specific customer, redemption limit, and expiration date.</p>\",\n        \"operationId\": \"PostPromotionCodes\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"restrictions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the promotion code is currently active.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"code\": {\n                    \"description\": \"The customer-facing code. Regardless of case, this code must be unique across all active promotion codes for a specific customer. Valid characters are lower case letters (a-z), upper case letters (A-Z), and digits (0-9).\\n\\nIf left blank, we will generate one automatically.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"coupon\": {\n                    \"description\": \"The coupon for this promotion code.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The customer that this promotion code can be used by. If not set, the promotion code can be used by all customers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"The timestamp at which this promotion code will expire. If the coupon has specified a `redeems_by`, then this value cannot be after the coupon's `redeems_by`.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"max_redemptions\": {\n                    \"description\": \"A positive integer specifying the number of times the promotion code can be redeemed. If the coupon has specified a `max_redemptions`, then this value cannot be greater than the coupon's `max_redemptions`.\",\n                    \"type\": \"integer\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"restrictions\": {\n                    \"description\": \"Settings that restrict the redemption of the promotion code.\",\n                    \"properties\": {\n                      \"currency_options\": {\n                        \"additionalProperties\": {\n                          \"properties\": {\n                            \"minimum_amount\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"currency_option\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"first_time_transaction\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"minimum_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"minimum_amount_currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"restrictions_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"coupon\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/promotion_code\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a promotion code\"\n      }\n    },\n    \"/v1/promotion_codes/{promotion_code}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the promotion code with the given ID. In order to retrieve a promotion code by the customer-facing <code>code</code> use <a href=\\\"/docs/api/promotion_codes/list\\\">list</a> with the desired <code>code</code>.</p>\",\n        \"operationId\": \"GetPromotionCodesPromotionCode\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"promotion_code\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/promotion_code\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a promotion code\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified promotion code by setting the values of the parameters passed. Most fields are, by design, not editable.</p>\",\n        \"operationId\": \"PostPromotionCodesPromotionCode\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"promotion_code\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"restrictions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the promotion code is currently active. A promotion code can only be reactivated when the coupon is still valid and the promotion code is otherwise redeemable.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"restrictions\": {\n                    \"description\": \"Settings that restrict the redemption of the promotion code.\",\n                    \"properties\": {\n                      \"currency_options\": {\n                        \"additionalProperties\": {\n                          \"properties\": {\n                            \"minimum_amount\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"currency_option\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"restrictions_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/promotion_code\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a promotion code\"\n      }\n    },\n    \"/v1/quotes\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your quotes.</p>\",\n        \"operationId\": \"GetQuotes\",\n        \"parameters\": [\n          {\n            \"description\": \"The ID of the customer whose quotes will be retrieved.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The status of the quote.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"accepted\", \"canceled\", \"draft\", \"open\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Provides a list of quotes that are associated with the specified test clock. The response will not include quotes with test clocks if this and the customer parameter is not set.\",\n            \"in\": \"query\",\n            \"name\": \"test_clock\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/quote\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/quotes\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"QuotesResourceQuoteList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all quotes\"\n      },\n      \"post\": {\n        \"description\": \"<p>A quote models prices and services for a customer. Default options for <code>header</code>, <code>description</code>, <code>footer</code>, and <code>expires_at</code> can be set in the dashboard via the <a href=\\\"https://dashboard.stripe.com/settings/billing/quote\\\">quote template</a>.</p>\",\n        \"operationId\": \"PostQuotes\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"application_fee_amount\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"application_fee_percent\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"description\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"footer\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"from_quote\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"header\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"line_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"on_behalf_of\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"subscription_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"application_fee_amount\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. There cannot be any line items with recurring prices when using this field.\"\n                  },\n                  \"application_fee_percent\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"number\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. There must be at least 1 line item with a recurring price to use this field.\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Settings for automatic tax lookup for this quote and resulting invoices and subscriptions.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_param\",\n                    \"type\": \"object\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay invoices at the end of the subscription cycle or at invoice finalization using the default payment method attached to the subscription or customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`. Defaults to `charge_automatically`.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The customer for which this quote belongs to. A customer is required before finalizing the quote. Once specified, it cannot be changed.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates that will apply to any line item that does not have `tax_rates` set.\"\n                  },\n                  \"description\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A description that will be displayed on the quote PDF. If no value is passed, the default description configured in your [quote template settings](https://dashboard.stripe.com/settings/billing/quote) will be used.\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The discounts applied to the quote.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"A future timestamp on which the quote will be canceled if in `open` or `draft` status. Measured in seconds since the Unix epoch. If no value is passed, the default expiration date configured in your [quote template settings](https://dashboard.stripe.com/settings/billing/quote) will be used.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"footer\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A footer that will be displayed on the quote PDF. If no value is passed, the default footer configured in your [quote template settings](https://dashboard.stripe.com/settings/billing/quote) will be used.\"\n                  },\n                  \"from_quote\": {\n                    \"description\": \"Clone an existing quote. The new quote will be created in `status=draft`. When using this parameter, you cannot specify any other parameters except for `expires_at`.\",\n                    \"properties\": {\n                      \"is_revision\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"quote\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"quote\"],\n                    \"title\": \"from_quote_params\",\n                    \"type\": \"object\"\n                  },\n                  \"header\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 50,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A header that will be displayed on the quote PDF. If no value is passed, the default header configured in your [quote template settings](https://dashboard.stripe.com/settings/billing/quote) will be used.\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"All invoices will be billed using the specified settings.\",\n                    \"properties\": {\n                      \"days_until_due\": {\n                        \"type\": \"integer\"\n                      },\n                      \"issuer\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"quote_param\",\n                    \"type\": \"object\"\n                  },\n                  \"line_items\": {\n                    \"description\": \"A list of line items the customer is being quoted for. Each line item includes information about the product, the quantity, and the resulting cost.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"recurring\": {\n                              \"properties\": {\n                                \"interval\": {\n                                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                  \"type\": \"string\"\n                                },\n                                \"interval_count\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"interval\"],\n                              \"title\": \"recurring_adhoc\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\"],\n                          \"title\": \"price_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"line_item_create_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"on_behalf_of\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account on behalf of which to charge.\"\n                  },\n                  \"subscription_data\": {\n                    \"description\": \"When creating a subscription or subscription schedule, the specified configuration data will be used. There must be at least one line item with a recurring price for a subscription or subscription schedule to be created. A subscription schedule is created if `subscription_data[effective_date]` is present and in the future, otherwise a subscription is created.\",\n                    \"properties\": {\n                      \"description\": {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      \"effective_date\": {\n                        \"anyOf\": [\n                          {\n                            \"enum\": [\"current_period_end\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"trial_period_days\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"subscription_data_create_params\",\n                    \"type\": \"object\"\n                  },\n                  \"test_clock\": {\n                    \"description\": \"ID of the test clock to attach to the quote.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"amount_percent\": {\n                            \"type\": \"number\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The data with which to automatically create a Transfer for each of the invoices.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a quote\"\n      }\n    },\n    \"/v1/quotes/{quote}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the quote with the given ID.</p>\",\n        \"operationId\": \"GetQuotesQuote\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a quote\"\n      },\n      \"post\": {\n        \"description\": \"<p>A quote models prices and services for a customer.</p>\",\n        \"operationId\": \"PostQuotesQuote\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"application_fee_amount\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"application_fee_percent\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"description\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"footer\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"header\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"line_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"on_behalf_of\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"subscription_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"application_fee_amount\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. There cannot be any line items with recurring prices when using this field.\"\n                  },\n                  \"application_fee_percent\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"number\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. There must be at least 1 line item with a recurring price to use this field.\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Settings for automatic tax lookup for this quote and resulting invoices and subscriptions.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_param\",\n                    \"type\": \"object\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay invoices at the end of the subscription cycle or at invoice finalization using the default payment method attached to the subscription or customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`. Defaults to `charge_automatically`.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The customer for which this quote belongs to. A customer is required before finalizing the quote. Once specified, it cannot be changed.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates that will apply to any line item that does not have `tax_rates` set.\"\n                  },\n                  \"description\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A description that will be displayed on the quote PDF.\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The discounts applied to the quote.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"A future timestamp on which the quote will be canceled if in `open` or `draft` status. Measured in seconds since the Unix epoch.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"footer\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A footer that will be displayed on the quote PDF.\"\n                  },\n                  \"header\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 50,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A header that will be displayed on the quote PDF.\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"All invoices will be billed using the specified settings.\",\n                    \"properties\": {\n                      \"days_until_due\": {\n                        \"type\": \"integer\"\n                      },\n                      \"issuer\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"quote_param\",\n                    \"type\": \"object\"\n                  },\n                  \"line_items\": {\n                    \"description\": \"A list of line items the customer is being quoted for. Each line item includes information about the product, the quantity, and the resulting cost.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"id\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"recurring\": {\n                              \"properties\": {\n                                \"interval\": {\n                                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                  \"type\": \"string\"\n                                },\n                                \"interval_count\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"interval\"],\n                              \"title\": \"recurring_adhoc\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\"],\n                          \"title\": \"price_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"line_item_update_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"on_behalf_of\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account on behalf of which to charge.\"\n                  },\n                  \"subscription_data\": {\n                    \"description\": \"When creating a subscription or subscription schedule, the specified configuration data will be used. There must be at least one line item with a recurring price for a subscription or subscription schedule to be created. A subscription schedule is created if `subscription_data[effective_date]` is present and in the future, otherwise a subscription is created.\",\n                    \"properties\": {\n                      \"description\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"effective_date\": {\n                        \"anyOf\": [\n                          {\n                            \"enum\": [\"current_period_end\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"trial_period_days\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"subscription_data_update_params\",\n                    \"type\": \"object\"\n                  },\n                  \"transfer_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount\": {\n                            \"type\": \"integer\"\n                          },\n                          \"amount_percent\": {\n                            \"type\": \"number\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The data with which to automatically create a Transfer for each of the invoices.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a quote\"\n      }\n    },\n    \"/v1/quotes/{quote}/accept\": {\n      \"post\": {\n        \"description\": \"<p>Accepts the specified quote.</p>\",\n        \"operationId\": \"PostQuotesQuoteAccept\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Accept a quote\"\n      }\n    },\n    \"/v1/quotes/{quote}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>Cancels the quote.</p>\",\n        \"operationId\": \"PostQuotesQuoteCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a quote\"\n      }\n    },\n    \"/v1/quotes/{quote}/computed_upfront_line_items\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving a quote, there is an includable <a href=\\\"https://stripe.com/docs/api/quotes/object#quote_object-computed-upfront-line_items\\\"><strong>computed.upfront.line_items</strong></a> property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of upfront line items.</p>\",\n        \"operationId\": \"GetQuotesQuoteComputedUpfrontLineItems\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"QuotesResourceListLineItems\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a quote's upfront line items\"\n      }\n    },\n    \"/v1/quotes/{quote}/finalize\": {\n      \"post\": {\n        \"description\": \"<p>Finalizes the quote.</p>\",\n        \"operationId\": \"PostQuotesQuoteFinalize\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"A future timestamp on which the quote will be canceled if in `open` or `draft` status. Measured in seconds since the Unix epoch.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/quote\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Finalize a quote\"\n      }\n    },\n    \"/v1/quotes/{quote}/line_items\": {\n      \"get\": {\n        \"description\": \"<p>When retrieving a quote, there is an includable <strong>line_items</strong> property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.</p>\",\n        \"operationId\": \"GetQuotesQuoteLineItems\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"QuotesResourceListLineItems\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a quote's line items\"\n      }\n    },\n    \"/v1/quotes/{quote}/pdf\": {\n      \"get\": {\n        \"description\": \"<p>Download the PDF for a finalized quote. Explanation for special handling can be found <a href=\\\"https://docs.stripe.com/quotes/overview#quote_pdf\\\">here</a></p>\",\n        \"operationId\": \"GetQuotesQuotePdf\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"quote\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/pdf\": {\n                \"schema\": {\n                  \"format\": \"binary\",\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"servers\": [\n          {\n            \"url\": \"https://files.stripe.com/\"\n          }\n        ],\n        \"summary\": \"Download quote PDF\"\n      }\n    },\n    \"/v1/radar/early_fraud_warnings\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of early fraud warnings.</p>\",\n        \"operationId\": \"GetRadarEarlyFraudWarnings\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return early fraud warnings for the charge specified by this charge ID.\",\n            \"in\": \"query\",\n            \"name\": \"charge\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return early fraud warnings that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return early fraud warnings for charges that were created by the PaymentIntent specified by this PaymentIntent ID.\",\n            \"in\": \"query\",\n            \"name\": \"payment_intent\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/radar.early_fraud_warning\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/radar/early_fraud_warnings\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"RadarEarlyFraudWarningList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all early fraud warnings\"\n      }\n    },\n    \"/v1/radar/early_fraud_warnings/{early_fraud_warning}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an early fraud warning that has previously been created. </p>\\n\\n<p>Please refer to the <a href=\\\"#early_fraud_warning_object\\\">early fraud warning</a> object reference for more details.</p>\",\n        \"operationId\": \"GetRadarEarlyFraudWarningsEarlyFraudWarning\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"early_fraud_warning\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/radar.early_fraud_warning\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an early fraud warning\"\n      }\n    },\n    \"/v1/radar/value_list_items\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of <code>ValueListItem</code> objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetRadarValueListItems\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return items that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Return items belonging to the parent list whose value matches the specified value (using an \\\"is like\\\" match).\",\n            \"in\": \"query\",\n            \"name\": \"value\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 800,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Identifier for the parent value list this item belongs to.\",\n            \"in\": \"query\",\n            \"name\": \"value_list\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/radar.value_list_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/radar/value_list_items\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"RadarListListItemList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all value list items\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new <code>ValueListItem</code> object, which is added to the specified parent value list.</p>\",\n        \"operationId\": \"PostRadarValueListItems\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"value\": {\n                    \"description\": \"The value of the item (whose type must match the type of the parent value list).\",\n                    \"maxLength\": 800,\n                    \"type\": \"string\"\n                  },\n                  \"value_list\": {\n                    \"description\": \"The identifier of the value list which the created item will be added to.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"value\", \"value_list\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/radar.value_list_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a value list item\"\n      }\n    },\n    \"/v1/radar/value_list_items/{item}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes a <code>ValueListItem</code> object, removing it from its parent value list.</p>\",\n        \"operationId\": \"DeleteRadarValueListItemsItem\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"item\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_radar.value_list_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a value list item\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a <code>ValueListItem</code> object.</p>\",\n        \"operationId\": \"GetRadarValueListItemsItem\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"item\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/radar.value_list_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a value list item\"\n      }\n    },\n    \"/v1/radar/value_lists\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of <code>ValueList</code> objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetRadarValueLists\",\n        \"parameters\": [\n          {\n            \"description\": \"The alias used to reference the value list when writing rules.\",\n            \"in\": \"query\",\n            \"name\": \"alias\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 100,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A value contained within a value list - returns all value lists containing this value.\",\n            \"in\": \"query\",\n            \"name\": \"contains\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 800,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return value lists that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/radar.value_list\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/radar/value_lists\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"RadarListListList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all value lists\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new <code>ValueList</code> object, which can then be referenced in rules.</p>\",\n        \"operationId\": \"PostRadarValueLists\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"alias\": {\n                    \"description\": \"The name of the value list for use in rules.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"item_type\": {\n                    \"description\": \"Type of the items in the value list. One of `card_fingerprint`, `us_bank_account_fingerprint`, `sepa_debit_fingerprint`, `card_bin`, `email`, `ip_address`, `country`, `string`, `case_sensitive_string`, or `customer_id`. Use `string` if the item type is unknown or mixed.\",\n                    \"enum\": [\n                      \"card_bin\",\n                      \"card_fingerprint\",\n                      \"case_sensitive_string\",\n                      \"country\",\n                      \"customer_id\",\n                      \"email\",\n                      \"ip_address\",\n                      \"sepa_debit_fingerprint\",\n                      \"string\",\n                      \"us_bank_account_fingerprint\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"The human-readable name of the value list.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"alias\", \"name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/radar.value_list\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a value list\"\n      }\n    },\n    \"/v1/radar/value_lists/{value_list}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes a <code>ValueList</code> object, also deleting any items contained within the value list. To be deleted, a value list must not be referenced in any rules.</p>\",\n        \"operationId\": \"DeleteRadarValueListsValueList\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"value_list\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_radar.value_list\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a value list\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a <code>ValueList</code> object.</p>\",\n        \"operationId\": \"GetRadarValueListsValueList\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"value_list\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/radar.value_list\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a value list\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a <code>ValueList</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged. Note that <code>item_type</code> is immutable.</p>\",\n        \"operationId\": \"PostRadarValueListsValueList\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"value_list\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"alias\": {\n                    \"description\": \"The name of the value list for use in rules.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"name\": {\n                    \"description\": \"The human-readable name of the value list.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/radar.value_list\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a value list\"\n      }\n    },\n    \"/v1/refunds\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of all refunds you created. We return the refunds in sorted order, with the most recent refunds appearing first. The 10 most recent refunds are always available by default on the Charge object.</p>\",\n        \"operationId\": \"GetRefunds\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return refunds for the charge specified by this charge ID.\",\n            \"in\": \"query\",\n            \"name\": \"charge\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return refunds that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return refunds for the PaymentIntent specified by this ID.\",\n            \"in\": \"query\",\n            \"name\": \"payment_intent\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/refund\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/refunds\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"APIMethodRefundList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all refunds\"\n      },\n      \"post\": {\n        \"description\": \"<p>When you create a new refund, you must specify a Charge or a PaymentIntent object on which to create it.</p>\\n\\n<p>Creating a new refund will refund a charge that has previously been created but not yet refunded.\\nFunds will be refunded to the credit or debit card that was originally charged.</p>\\n\\n<p>You can optionally refund only part of a charge.\\nYou can do so multiple times, until the entire charge has been refunded.</p>\\n\\n<p>Once entirely refunded, a charge can’t be refunded again.\\nThis method will raise an error when called on an already-refunded charge,\\nor when trying to refund more money than is left on a charge.</p>\",\n        \"operationId\": \"PostRefunds\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"type\": \"integer\"\n                  },\n                  \"charge\": {\n                    \"description\": \"The identifier of the charge to refund.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"Customer whose customer balance to refund from.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"instructions_email\": {\n                    \"description\": \"For payment methods without native refund support (e.g., Konbini, PromptPay), use this email from the customer to receive refund instructions.\",\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"origin\": {\n                    \"description\": \"Origin of the refund\",\n                    \"enum\": [\"customer_balance\"],\n                    \"type\": \"string\"\n                  },\n                  \"payment_intent\": {\n                    \"description\": \"The identifier of the PaymentIntent to refund.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"reason\": {\n                    \"description\": \"String indicating the reason for the refund. If set, possible values are `duplicate`, `fraudulent`, and `requested_by_customer`. If you believe the charge to be fraudulent, specifying `fraudulent` as the reason will add the associated card and email to your [block lists](https://stripe.com/docs/radar/lists), and will also help us improve our fraud detection algorithms.\",\n                    \"enum\": [\n                      \"duplicate\",\n                      \"fraudulent\",\n                      \"requested_by_customer\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"refund_application_fee\": {\n                    \"description\": \"Boolean indicating whether the application fee should be refunded when refunding this charge. If a full charge refund is given, the full application fee will be refunded. Otherwise, the application fee will be refunded in an amount proportional to the amount of the charge refunded. An application fee can be refunded only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"reverse_transfer\": {\n                    \"description\": \"Boolean indicating whether the transfer should be reversed when refunding this charge. The transfer will be reversed proportionally to the amount being refunded (either the entire or partial amount).<br><br>A transfer can be reversed only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create customer balance refund\"\n      }\n    },\n    \"/v1/refunds/{refund}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing refund.</p>\",\n        \"operationId\": \"GetRefundsRefund\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"refund\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a refund\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the refund that you specify by setting the values of the passed parameters. Any parameters that you don’t provide remain unchanged.</p>\\n\\n<p>This request only accepts <code>metadata</code> as an argument.</p>\",\n        \"operationId\": \"PostRefundsRefund\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"refund\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a refund\"\n      }\n    },\n    \"/v1/refunds/{refund}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>Cancels a refund with a status of <code>requires_action</code>.</p>\\n\\n<p>You can’t cancel refunds in other states. Only refunds for payment methods that require customer action can enter the <code>requires_action</code> state.</p>\",\n        \"operationId\": \"PostRefundsRefundCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"refund\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a refund\"\n      }\n    },\n    \"/v1/reporting/report_runs\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Report Runs, with the most recent appearing first.</p>\",\n        \"operationId\": \"GetReportingReportRuns\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return Report Runs that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/reporting.report_run\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/reporting/report_runs\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"FinancialReportingFinanceReportRunList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Report Runs\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new object and begin running the report. (Certain report types require a <a href=\\\"https://stripe.com/docs/keys#test-live-modes\\\">live-mode API key</a>.)</p>\",\n        \"operationId\": \"PostReportingReportRuns\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"parameters\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"parameters\": {\n                    \"description\": \"Parameters specifying how the report should be run. Different Report Types have different required and optional parameters, listed in the [API Access to Reports](https://stripe.com/docs/reporting/statements/api) documentation.\",\n                    \"properties\": {\n                      \"columns\": {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"connected_account\": {\n                        \"type\": \"string\"\n                      },\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"interval_end\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"interval_start\": {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      \"payout\": {\n                        \"type\": \"string\"\n                      },\n                      \"reporting_category\": {\n                        \"enum\": [\n                          \"advance\",\n                          \"advance_funding\",\n                          \"anticipation_repayment\",\n                          \"charge\",\n                          \"charge_failure\",\n                          \"climate_order_purchase\",\n                          \"climate_order_refund\",\n                          \"connect_collection_transfer\",\n                          \"connect_reserved_funds\",\n                          \"contribution\",\n                          \"dispute\",\n                          \"dispute_reversal\",\n                          \"fee\",\n                          \"financing_paydown\",\n                          \"financing_paydown_reversal\",\n                          \"financing_payout\",\n                          \"financing_payout_reversal\",\n                          \"issuing_authorization_hold\",\n                          \"issuing_authorization_release\",\n                          \"issuing_dispute\",\n                          \"issuing_transaction\",\n                          \"network_cost\",\n                          \"other_adjustment\",\n                          \"partial_capture_reversal\",\n                          \"payout\",\n                          \"payout_reversal\",\n                          \"platform_earning\",\n                          \"platform_earning_refund\",\n                          \"refund\",\n                          \"refund_failure\",\n                          \"risk_reserved_funds\",\n                          \"tax\",\n                          \"topup\",\n                          \"topup_reversal\",\n                          \"transfer\",\n                          \"transfer_reversal\",\n                          \"unreconciled_customer_funds\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"timezone\": {\n                        \"enum\": [\n                          \"Africa/Abidjan\",\n                          \"Africa/Accra\",\n                          \"Africa/Addis_Ababa\",\n                          \"Africa/Algiers\",\n                          \"Africa/Asmara\",\n                          \"Africa/Asmera\",\n                          \"Africa/Bamako\",\n                          \"Africa/Bangui\",\n                          \"Africa/Banjul\",\n                          \"Africa/Bissau\",\n                          \"Africa/Blantyre\",\n                          \"Africa/Brazzaville\",\n                          \"Africa/Bujumbura\",\n                          \"Africa/Cairo\",\n                          \"Africa/Casablanca\",\n                          \"Africa/Ceuta\",\n                          \"Africa/Conakry\",\n                          \"Africa/Dakar\",\n                          \"Africa/Dar_es_Salaam\",\n                          \"Africa/Djibouti\",\n                          \"Africa/Douala\",\n                          \"Africa/El_Aaiun\",\n                          \"Africa/Freetown\",\n                          \"Africa/Gaborone\",\n                          \"Africa/Harare\",\n                          \"Africa/Johannesburg\",\n                          \"Africa/Juba\",\n                          \"Africa/Kampala\",\n                          \"Africa/Khartoum\",\n                          \"Africa/Kigali\",\n                          \"Africa/Kinshasa\",\n                          \"Africa/Lagos\",\n                          \"Africa/Libreville\",\n                          \"Africa/Lome\",\n                          \"Africa/Luanda\",\n                          \"Africa/Lubumbashi\",\n                          \"Africa/Lusaka\",\n                          \"Africa/Malabo\",\n                          \"Africa/Maputo\",\n                          \"Africa/Maseru\",\n                          \"Africa/Mbabane\",\n                          \"Africa/Mogadishu\",\n                          \"Africa/Monrovia\",\n                          \"Africa/Nairobi\",\n                          \"Africa/Ndjamena\",\n                          \"Africa/Niamey\",\n                          \"Africa/Nouakchott\",\n                          \"Africa/Ouagadougou\",\n                          \"Africa/Porto-Novo\",\n                          \"Africa/Sao_Tome\",\n                          \"Africa/Timbuktu\",\n                          \"Africa/Tripoli\",\n                          \"Africa/Tunis\",\n                          \"Africa/Windhoek\",\n                          \"America/Adak\",\n                          \"America/Anchorage\",\n                          \"America/Anguilla\",\n                          \"America/Antigua\",\n                          \"America/Araguaina\",\n                          \"America/Argentina/Buenos_Aires\",\n                          \"America/Argentina/Catamarca\",\n                          \"America/Argentina/ComodRivadavia\",\n                          \"America/Argentina/Cordoba\",\n                          \"America/Argentina/Jujuy\",\n                          \"America/Argentina/La_Rioja\",\n                          \"America/Argentina/Mendoza\",\n                          \"America/Argentina/Rio_Gallegos\",\n                          \"America/Argentina/Salta\",\n                          \"America/Argentina/San_Juan\",\n                          \"America/Argentina/San_Luis\",\n                          \"America/Argentina/Tucuman\",\n                          \"America/Argentina/Ushuaia\",\n                          \"America/Aruba\",\n                          \"America/Asuncion\",\n                          \"America/Atikokan\",\n                          \"America/Atka\",\n                          \"America/Bahia\",\n                          \"America/Bahia_Banderas\",\n                          \"America/Barbados\",\n                          \"America/Belem\",\n                          \"America/Belize\",\n                          \"America/Blanc-Sablon\",\n                          \"America/Boa_Vista\",\n                          \"America/Bogota\",\n                          \"America/Boise\",\n                          \"America/Buenos_Aires\",\n                          \"America/Cambridge_Bay\",\n                          \"America/Campo_Grande\",\n                          \"America/Cancun\",\n                          \"America/Caracas\",\n                          \"America/Catamarca\",\n                          \"America/Cayenne\",\n                          \"America/Cayman\",\n                          \"America/Chicago\",\n                          \"America/Chihuahua\",\n                          \"America/Ciudad_Juarez\",\n                          \"America/Coral_Harbour\",\n                          \"America/Cordoba\",\n                          \"America/Costa_Rica\",\n                          \"America/Creston\",\n                          \"America/Cuiaba\",\n                          \"America/Curacao\",\n                          \"America/Danmarkshavn\",\n                          \"America/Dawson\",\n                          \"America/Dawson_Creek\",\n                          \"America/Denver\",\n                          \"America/Detroit\",\n                          \"America/Dominica\",\n                          \"America/Edmonton\",\n                          \"America/Eirunepe\",\n                          \"America/El_Salvador\",\n                          \"America/Ensenada\",\n                          \"America/Fort_Nelson\",\n                          \"America/Fort_Wayne\",\n                          \"America/Fortaleza\",\n                          \"America/Glace_Bay\",\n                          \"America/Godthab\",\n                          \"America/Goose_Bay\",\n                          \"America/Grand_Turk\",\n                          \"America/Grenada\",\n                          \"America/Guadeloupe\",\n                          \"America/Guatemala\",\n                          \"America/Guayaquil\",\n                          \"America/Guyana\",\n                          \"America/Halifax\",\n                          \"America/Havana\",\n                          \"America/Hermosillo\",\n                          \"America/Indiana/Indianapolis\",\n                          \"America/Indiana/Knox\",\n                          \"America/Indiana/Marengo\",\n                          \"America/Indiana/Petersburg\",\n                          \"America/Indiana/Tell_City\",\n                          \"America/Indiana/Vevay\",\n                          \"America/Indiana/Vincennes\",\n                          \"America/Indiana/Winamac\",\n                          \"America/Indianapolis\",\n                          \"America/Inuvik\",\n                          \"America/Iqaluit\",\n                          \"America/Jamaica\",\n                          \"America/Jujuy\",\n                          \"America/Juneau\",\n                          \"America/Kentucky/Louisville\",\n                          \"America/Kentucky/Monticello\",\n                          \"America/Knox_IN\",\n                          \"America/Kralendijk\",\n                          \"America/La_Paz\",\n                          \"America/Lima\",\n                          \"America/Los_Angeles\",\n                          \"America/Louisville\",\n                          \"America/Lower_Princes\",\n                          \"America/Maceio\",\n                          \"America/Managua\",\n                          \"America/Manaus\",\n                          \"America/Marigot\",\n                          \"America/Martinique\",\n                          \"America/Matamoros\",\n                          \"America/Mazatlan\",\n                          \"America/Mendoza\",\n                          \"America/Menominee\",\n                          \"America/Merida\",\n                          \"America/Metlakatla\",\n                          \"America/Mexico_City\",\n                          \"America/Miquelon\",\n                          \"America/Moncton\",\n                          \"America/Monterrey\",\n                          \"America/Montevideo\",\n                          \"America/Montreal\",\n                          \"America/Montserrat\",\n                          \"America/Nassau\",\n                          \"America/New_York\",\n                          \"America/Nipigon\",\n                          \"America/Nome\",\n                          \"America/Noronha\",\n                          \"America/North_Dakota/Beulah\",\n                          \"America/North_Dakota/Center\",\n                          \"America/North_Dakota/New_Salem\",\n                          \"America/Nuuk\",\n                          \"America/Ojinaga\",\n                          \"America/Panama\",\n                          \"America/Pangnirtung\",\n                          \"America/Paramaribo\",\n                          \"America/Phoenix\",\n                          \"America/Port-au-Prince\",\n                          \"America/Port_of_Spain\",\n                          \"America/Porto_Acre\",\n                          \"America/Porto_Velho\",\n                          \"America/Puerto_Rico\",\n                          \"America/Punta_Arenas\",\n                          \"America/Rainy_River\",\n                          \"America/Rankin_Inlet\",\n                          \"America/Recife\",\n                          \"America/Regina\",\n                          \"America/Resolute\",\n                          \"America/Rio_Branco\",\n                          \"America/Rosario\",\n                          \"America/Santa_Isabel\",\n                          \"America/Santarem\",\n                          \"America/Santiago\",\n                          \"America/Santo_Domingo\",\n                          \"America/Sao_Paulo\",\n                          \"America/Scoresbysund\",\n                          \"America/Shiprock\",\n                          \"America/Sitka\",\n                          \"America/St_Barthelemy\",\n                          \"America/St_Johns\",\n                          \"America/St_Kitts\",\n                          \"America/St_Lucia\",\n                          \"America/St_Thomas\",\n                          \"America/St_Vincent\",\n                          \"America/Swift_Current\",\n                          \"America/Tegucigalpa\",\n                          \"America/Thule\",\n                          \"America/Thunder_Bay\",\n                          \"America/Tijuana\",\n                          \"America/Toronto\",\n                          \"America/Tortola\",\n                          \"America/Vancouver\",\n                          \"America/Virgin\",\n                          \"America/Whitehorse\",\n                          \"America/Winnipeg\",\n                          \"America/Yakutat\",\n                          \"America/Yellowknife\",\n                          \"Antarctica/Casey\",\n                          \"Antarctica/Davis\",\n                          \"Antarctica/DumontDUrville\",\n                          \"Antarctica/Macquarie\",\n                          \"Antarctica/Mawson\",\n                          \"Antarctica/McMurdo\",\n                          \"Antarctica/Palmer\",\n                          \"Antarctica/Rothera\",\n                          \"Antarctica/South_Pole\",\n                          \"Antarctica/Syowa\",\n                          \"Antarctica/Troll\",\n                          \"Antarctica/Vostok\",\n                          \"Arctic/Longyearbyen\",\n                          \"Asia/Aden\",\n                          \"Asia/Almaty\",\n                          \"Asia/Amman\",\n                          \"Asia/Anadyr\",\n                          \"Asia/Aqtau\",\n                          \"Asia/Aqtobe\",\n                          \"Asia/Ashgabat\",\n                          \"Asia/Ashkhabad\",\n                          \"Asia/Atyrau\",\n                          \"Asia/Baghdad\",\n                          \"Asia/Bahrain\",\n                          \"Asia/Baku\",\n                          \"Asia/Bangkok\",\n                          \"Asia/Barnaul\",\n                          \"Asia/Beirut\",\n                          \"Asia/Bishkek\",\n                          \"Asia/Brunei\",\n                          \"Asia/Calcutta\",\n                          \"Asia/Chita\",\n                          \"Asia/Choibalsan\",\n                          \"Asia/Chongqing\",\n                          \"Asia/Chungking\",\n                          \"Asia/Colombo\",\n                          \"Asia/Dacca\",\n                          \"Asia/Damascus\",\n                          \"Asia/Dhaka\",\n                          \"Asia/Dili\",\n                          \"Asia/Dubai\",\n                          \"Asia/Dushanbe\",\n                          \"Asia/Famagusta\",\n                          \"Asia/Gaza\",\n                          \"Asia/Harbin\",\n                          \"Asia/Hebron\",\n                          \"Asia/Ho_Chi_Minh\",\n                          \"Asia/Hong_Kong\",\n                          \"Asia/Hovd\",\n                          \"Asia/Irkutsk\",\n                          \"Asia/Istanbul\",\n                          \"Asia/Jakarta\",\n                          \"Asia/Jayapura\",\n                          \"Asia/Jerusalem\",\n                          \"Asia/Kabul\",\n                          \"Asia/Kamchatka\",\n                          \"Asia/Karachi\",\n                          \"Asia/Kashgar\",\n                          \"Asia/Kathmandu\",\n                          \"Asia/Katmandu\",\n                          \"Asia/Khandyga\",\n                          \"Asia/Kolkata\",\n                          \"Asia/Krasnoyarsk\",\n                          \"Asia/Kuala_Lumpur\",\n                          \"Asia/Kuching\",\n                          \"Asia/Kuwait\",\n                          \"Asia/Macao\",\n                          \"Asia/Macau\",\n                          \"Asia/Magadan\",\n                          \"Asia/Makassar\",\n                          \"Asia/Manila\",\n                          \"Asia/Muscat\",\n                          \"Asia/Nicosia\",\n                          \"Asia/Novokuznetsk\",\n                          \"Asia/Novosibirsk\",\n                          \"Asia/Omsk\",\n                          \"Asia/Oral\",\n                          \"Asia/Phnom_Penh\",\n                          \"Asia/Pontianak\",\n                          \"Asia/Pyongyang\",\n                          \"Asia/Qatar\",\n                          \"Asia/Qostanay\",\n                          \"Asia/Qyzylorda\",\n                          \"Asia/Rangoon\",\n                          \"Asia/Riyadh\",\n                          \"Asia/Saigon\",\n                          \"Asia/Sakhalin\",\n                          \"Asia/Samarkand\",\n                          \"Asia/Seoul\",\n                          \"Asia/Shanghai\",\n                          \"Asia/Singapore\",\n                          \"Asia/Srednekolymsk\",\n                          \"Asia/Taipei\",\n                          \"Asia/Tashkent\",\n                          \"Asia/Tbilisi\",\n                          \"Asia/Tehran\",\n                          \"Asia/Tel_Aviv\",\n                          \"Asia/Thimbu\",\n                          \"Asia/Thimphu\",\n                          \"Asia/Tokyo\",\n                          \"Asia/Tomsk\",\n                          \"Asia/Ujung_Pandang\",\n                          \"Asia/Ulaanbaatar\",\n                          \"Asia/Ulan_Bator\",\n                          \"Asia/Urumqi\",\n                          \"Asia/Ust-Nera\",\n                          \"Asia/Vientiane\",\n                          \"Asia/Vladivostok\",\n                          \"Asia/Yakutsk\",\n                          \"Asia/Yangon\",\n                          \"Asia/Yekaterinburg\",\n                          \"Asia/Yerevan\",\n                          \"Atlantic/Azores\",\n                          \"Atlantic/Bermuda\",\n                          \"Atlantic/Canary\",\n                          \"Atlantic/Cape_Verde\",\n                          \"Atlantic/Faeroe\",\n                          \"Atlantic/Faroe\",\n                          \"Atlantic/Jan_Mayen\",\n                          \"Atlantic/Madeira\",\n                          \"Atlantic/Reykjavik\",\n                          \"Atlantic/South_Georgia\",\n                          \"Atlantic/St_Helena\",\n                          \"Atlantic/Stanley\",\n                          \"Australia/ACT\",\n                          \"Australia/Adelaide\",\n                          \"Australia/Brisbane\",\n                          \"Australia/Broken_Hill\",\n                          \"Australia/Canberra\",\n                          \"Australia/Currie\",\n                          \"Australia/Darwin\",\n                          \"Australia/Eucla\",\n                          \"Australia/Hobart\",\n                          \"Australia/LHI\",\n                          \"Australia/Lindeman\",\n                          \"Australia/Lord_Howe\",\n                          \"Australia/Melbourne\",\n                          \"Australia/NSW\",\n                          \"Australia/North\",\n                          \"Australia/Perth\",\n                          \"Australia/Queensland\",\n                          \"Australia/South\",\n                          \"Australia/Sydney\",\n                          \"Australia/Tasmania\",\n                          \"Australia/Victoria\",\n                          \"Australia/West\",\n                          \"Australia/Yancowinna\",\n                          \"Brazil/Acre\",\n                          \"Brazil/DeNoronha\",\n                          \"Brazil/East\",\n                          \"Brazil/West\",\n                          \"CET\",\n                          \"CST6CDT\",\n                          \"Canada/Atlantic\",\n                          \"Canada/Central\",\n                          \"Canada/Eastern\",\n                          \"Canada/Mountain\",\n                          \"Canada/Newfoundland\",\n                          \"Canada/Pacific\",\n                          \"Canada/Saskatchewan\",\n                          \"Canada/Yukon\",\n                          \"Chile/Continental\",\n                          \"Chile/EasterIsland\",\n                          \"Cuba\",\n                          \"EET\",\n                          \"EST\",\n                          \"EST5EDT\",\n                          \"Egypt\",\n                          \"Eire\",\n                          \"Etc/GMT\",\n                          \"Etc/GMT+0\",\n                          \"Etc/GMT+1\",\n                          \"Etc/GMT+10\",\n                          \"Etc/GMT+11\",\n                          \"Etc/GMT+12\",\n                          \"Etc/GMT+2\",\n                          \"Etc/GMT+3\",\n                          \"Etc/GMT+4\",\n                          \"Etc/GMT+5\",\n                          \"Etc/GMT+6\",\n                          \"Etc/GMT+7\",\n                          \"Etc/GMT+8\",\n                          \"Etc/GMT+9\",\n                          \"Etc/GMT-0\",\n                          \"Etc/GMT-1\",\n                          \"Etc/GMT-10\",\n                          \"Etc/GMT-11\",\n                          \"Etc/GMT-12\",\n                          \"Etc/GMT-13\",\n                          \"Etc/GMT-14\",\n                          \"Etc/GMT-2\",\n                          \"Etc/GMT-3\",\n                          \"Etc/GMT-4\",\n                          \"Etc/GMT-5\",\n                          \"Etc/GMT-6\",\n                          \"Etc/GMT-7\",\n                          \"Etc/GMT-8\",\n                          \"Etc/GMT-9\",\n                          \"Etc/GMT0\",\n                          \"Etc/Greenwich\",\n                          \"Etc/UCT\",\n                          \"Etc/UTC\",\n                          \"Etc/Universal\",\n                          \"Etc/Zulu\",\n                          \"Europe/Amsterdam\",\n                          \"Europe/Andorra\",\n                          \"Europe/Astrakhan\",\n                          \"Europe/Athens\",\n                          \"Europe/Belfast\",\n                          \"Europe/Belgrade\",\n                          \"Europe/Berlin\",\n                          \"Europe/Bratislava\",\n                          \"Europe/Brussels\",\n                          \"Europe/Bucharest\",\n                          \"Europe/Budapest\",\n                          \"Europe/Busingen\",\n                          \"Europe/Chisinau\",\n                          \"Europe/Copenhagen\",\n                          \"Europe/Dublin\",\n                          \"Europe/Gibraltar\",\n                          \"Europe/Guernsey\",\n                          \"Europe/Helsinki\",\n                          \"Europe/Isle_of_Man\",\n                          \"Europe/Istanbul\",\n                          \"Europe/Jersey\",\n                          \"Europe/Kaliningrad\",\n                          \"Europe/Kiev\",\n                          \"Europe/Kirov\",\n                          \"Europe/Kyiv\",\n                          \"Europe/Lisbon\",\n                          \"Europe/Ljubljana\",\n                          \"Europe/London\",\n                          \"Europe/Luxembourg\",\n                          \"Europe/Madrid\",\n                          \"Europe/Malta\",\n                          \"Europe/Mariehamn\",\n                          \"Europe/Minsk\",\n                          \"Europe/Monaco\",\n                          \"Europe/Moscow\",\n                          \"Europe/Nicosia\",\n                          \"Europe/Oslo\",\n                          \"Europe/Paris\",\n                          \"Europe/Podgorica\",\n                          \"Europe/Prague\",\n                          \"Europe/Riga\",\n                          \"Europe/Rome\",\n                          \"Europe/Samara\",\n                          \"Europe/San_Marino\",\n                          \"Europe/Sarajevo\",\n                          \"Europe/Saratov\",\n                          \"Europe/Simferopol\",\n                          \"Europe/Skopje\",\n                          \"Europe/Sofia\",\n                          \"Europe/Stockholm\",\n                          \"Europe/Tallinn\",\n                          \"Europe/Tirane\",\n                          \"Europe/Tiraspol\",\n                          \"Europe/Ulyanovsk\",\n                          \"Europe/Uzhgorod\",\n                          \"Europe/Vaduz\",\n                          \"Europe/Vatican\",\n                          \"Europe/Vienna\",\n                          \"Europe/Vilnius\",\n                          \"Europe/Volgograd\",\n                          \"Europe/Warsaw\",\n                          \"Europe/Zagreb\",\n                          \"Europe/Zaporozhye\",\n                          \"Europe/Zurich\",\n                          \"Factory\",\n                          \"GB\",\n                          \"GB-Eire\",\n                          \"GMT\",\n                          \"GMT+0\",\n                          \"GMT-0\",\n                          \"GMT0\",\n                          \"Greenwich\",\n                          \"HST\",\n                          \"Hongkong\",\n                          \"Iceland\",\n                          \"Indian/Antananarivo\",\n                          \"Indian/Chagos\",\n                          \"Indian/Christmas\",\n                          \"Indian/Cocos\",\n                          \"Indian/Comoro\",\n                          \"Indian/Kerguelen\",\n                          \"Indian/Mahe\",\n                          \"Indian/Maldives\",\n                          \"Indian/Mauritius\",\n                          \"Indian/Mayotte\",\n                          \"Indian/Reunion\",\n                          \"Iran\",\n                          \"Israel\",\n                          \"Jamaica\",\n                          \"Japan\",\n                          \"Kwajalein\",\n                          \"Libya\",\n                          \"MET\",\n                          \"MST\",\n                          \"MST7MDT\",\n                          \"Mexico/BajaNorte\",\n                          \"Mexico/BajaSur\",\n                          \"Mexico/General\",\n                          \"NZ\",\n                          \"NZ-CHAT\",\n                          \"Navajo\",\n                          \"PRC\",\n                          \"PST8PDT\",\n                          \"Pacific/Apia\",\n                          \"Pacific/Auckland\",\n                          \"Pacific/Bougainville\",\n                          \"Pacific/Chatham\",\n                          \"Pacific/Chuuk\",\n                          \"Pacific/Easter\",\n                          \"Pacific/Efate\",\n                          \"Pacific/Enderbury\",\n                          \"Pacific/Fakaofo\",\n                          \"Pacific/Fiji\",\n                          \"Pacific/Funafuti\",\n                          \"Pacific/Galapagos\",\n                          \"Pacific/Gambier\",\n                          \"Pacific/Guadalcanal\",\n                          \"Pacific/Guam\",\n                          \"Pacific/Honolulu\",\n                          \"Pacific/Johnston\",\n                          \"Pacific/Kanton\",\n                          \"Pacific/Kiritimati\",\n                          \"Pacific/Kosrae\",\n                          \"Pacific/Kwajalein\",\n                          \"Pacific/Majuro\",\n                          \"Pacific/Marquesas\",\n                          \"Pacific/Midway\",\n                          \"Pacific/Nauru\",\n                          \"Pacific/Niue\",\n                          \"Pacific/Norfolk\",\n                          \"Pacific/Noumea\",\n                          \"Pacific/Pago_Pago\",\n                          \"Pacific/Palau\",\n                          \"Pacific/Pitcairn\",\n                          \"Pacific/Pohnpei\",\n                          \"Pacific/Ponape\",\n                          \"Pacific/Port_Moresby\",\n                          \"Pacific/Rarotonga\",\n                          \"Pacific/Saipan\",\n                          \"Pacific/Samoa\",\n                          \"Pacific/Tahiti\",\n                          \"Pacific/Tarawa\",\n                          \"Pacific/Tongatapu\",\n                          \"Pacific/Truk\",\n                          \"Pacific/Wake\",\n                          \"Pacific/Wallis\",\n                          \"Pacific/Yap\",\n                          \"Poland\",\n                          \"Portugal\",\n                          \"ROC\",\n                          \"ROK\",\n                          \"Singapore\",\n                          \"Turkey\",\n                          \"UCT\",\n                          \"US/Alaska\",\n                          \"US/Aleutian\",\n                          \"US/Arizona\",\n                          \"US/Central\",\n                          \"US/East-Indiana\",\n                          \"US/Eastern\",\n                          \"US/Hawaii\",\n                          \"US/Indiana-Starke\",\n                          \"US/Michigan\",\n                          \"US/Mountain\",\n                          \"US/Pacific\",\n                          \"US/Pacific-New\",\n                          \"US/Samoa\",\n                          \"UTC\",\n                          \"Universal\",\n                          \"W-SU\",\n                          \"WET\",\n                          \"Zulu\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"run_parameter_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"report_type\": {\n                    \"description\": \"The ID of the [report type](https://stripe.com/docs/reporting/statements/api#report-types) to run, such as `\\\"balance.summary.1\\\"`.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"report_type\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/reporting.report_run\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Report Run\"\n      }\n    },\n    \"/v1/reporting/report_runs/{report_run}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing Report Run.</p>\",\n        \"operationId\": \"GetReportingReportRunsReportRun\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"report_run\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/reporting.report_run\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Report Run\"\n      }\n    },\n    \"/v1/reporting/report_types\": {\n      \"get\": {\n        \"description\": \"<p>Returns a full list of Report Types.</p>\",\n        \"operationId\": \"GetReportingReportTypes\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/reporting.report_type\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"FinancialReportingFinanceReportTypeList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Report Types\"\n      }\n    },\n    \"/v1/reporting/report_types/{report_type}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a Report Type. (Certain report types require a <a href=\\\"https://stripe.com/docs/keys#test-live-modes\\\">live-mode API key</a>.)</p>\",\n        \"operationId\": \"GetReportingReportTypesReportType\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"report_type\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/reporting.report_type\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Report Type\"\n      }\n    },\n    \"/v1/reviews\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of <code>Review</code> objects that have <code>open</code> set to <code>true</code>. The objects are sorted in descending order by creation date, with the most recently created object appearing first.</p>\",\n        \"operationId\": \"GetReviews\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return reviews that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/review\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"RadarReviewList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all open reviews\"\n      }\n    },\n    \"/v1/reviews/{review}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a <code>Review</code> object.</p>\",\n        \"operationId\": \"GetReviewsReview\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"review\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/review\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a review\"\n      }\n    },\n    \"/v1/reviews/{review}/approve\": {\n      \"post\": {\n        \"description\": \"<p>Approves a <code>Review</code> object, closing it and removing it from the list of reviews.</p>\",\n        \"operationId\": \"PostReviewsReviewApprove\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"review\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/review\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Approve a review\"\n      }\n    },\n    \"/v1/setup_attempts\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of SetupAttempts that associate with a provided SetupIntent.</p>\",\n        \"operationId\": \"GetSetupAttempts\",\n        \"parameters\": [\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value\\ncan be a string with an integer Unix timestamp or a\\ndictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return SetupAttempts created by the SetupIntent specified by\\nthis ID.\",\n            \"in\": \"query\",\n            \"name\": \"setup_intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/setup_attempt\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/setup_attempts\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentFlowsSetupIntentSetupAttemptList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all SetupAttempts\"\n      }\n    },\n    \"/v1/setup_intents\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of SetupIntents.</p>\",\n        \"operationId\": \"GetSetupIntents\",\n        \"parameters\": [\n          {\n            \"description\": \"If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.\\n\\nIt can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.\",\n            \"in\": \"query\",\n            \"name\": \"attach_to_self\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return SetupIntents for the customer specified by this customer ID.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return SetupIntents that associate with the specified payment method.\",\n            \"in\": \"query\",\n            \"name\": \"payment_method\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/setup_intent\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/setup_intents\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"PaymentFlowsSetupIntentList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all SetupIntents\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a SetupIntent object.</p>\\n\\n<p>After you create the SetupIntent, attach a payment method and <a href=\\\"/docs/api/setup_intents/confirm\\\">confirm</a>\\nit to collect any required permissions to charge the payment method later.</p>\",\n        \"operationId\": \"PostSetupIntents\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"automatic_payment_methods\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"flow_directions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mandate_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"single_use\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"attach_to_self\": {\n                    \"description\": \"If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.\\n\\nIt can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"automatic_payment_methods\": {\n                    \"description\": \"When you enable this parameter, this SetupIntent accepts payment methods that you enable in the Dashboard and that are compatible with its other parameters.\",\n                    \"properties\": {\n                      \"allow_redirects\": {\n                        \"enum\": [\"always\", \"never\"],\n                        \"type\": \"string\"\n                      },\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_payment_methods_param\",\n                    \"type\": \"object\"\n                  },\n                  \"confirm\": {\n                    \"description\": \"Set to `true` to attempt to confirm this SetupIntent immediately. This parameter defaults to `false`. If a card is the attached payment method, you can provide a `return_url` in case further authentication is necessary.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"confirmation_token\": {\n                    \"description\": \"ID of the ConfirmationToken used to confirm this SetupIntent.\\n\\nIf the provided ConfirmationToken contains properties that are also being provided in this request, such as `payment_method`, then the values in this request will take precedence.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"ID of the Customer this SetupIntent belongs to, if one exists.\\n\\nIf present, the SetupIntent's payment method will be attached to the Customer on successful setup. Payment methods attached to other Customers cannot be used with this SetupIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 1000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"flow_directions\": {\n                    \"description\": \"Indicates the directions of money movement for which this payment method is intended to be used.\\n\\nInclude `inbound` if you intend to use the payment method as the origin to pull funds from. Include `outbound` if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.\",\n                    \"items\": {\n                      \"enum\": [\"inbound\", \"outbound\"],\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"mandate_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"customer_acceptance\": {\n                            \"properties\": {\n                              \"accepted_at\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"offline\": {\n                                \"properties\": {},\n                                \"title\": \"offline_param\",\n                                \"type\": \"object\"\n                              },\n                              \"online\": {\n                                \"properties\": {\n                                  \"ip_address\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"user_agent\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"ip_address\", \"user_agent\"],\n                                \"title\": \"online_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"offline\", \"online\"],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"customer_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"customer_acceptance\"],\n                        \"title\": \"secret_key_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"This hash contains details about the mandate to create. This parameter can only be used with [`confirm=true`](https://stripe.com/docs/api/setup_intents/create#create_setup_intent-confirm).\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"on_behalf_of\": {\n                    \"description\": \"The Stripe account ID created for this SetupIntent.\",\n                    \"type\": \"string\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"ID of the payment method (a PaymentMethod, Card, or saved Source object) to attach to this SetupIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_configuration\": {\n                    \"description\": \"The ID of the [payment method configuration](https://stripe.com/docs/api/payment_method_configurations) to use with this SetupIntent.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"When included, this hash creates a PaymentMethod that is set as the [`payment_method`](https://stripe.com/docs/api/setup_intents/object#setup_intent_object-payment_method)\\nvalue in the SetupIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"institution_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"transit_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"account_number\",\n                          \"institution_number\",\n                          \"transit_number\"\n                        ],\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"alma\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"bsb_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"bsb_number\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"sort_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"blik\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"tax_id\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"arzte_und_apotheker_bank\",\n                              \"austrian_anadi_bank_ag\",\n                              \"bank_austria\",\n                              \"bankhaus_carl_spangler\",\n                              \"bankhaus_schelhammer_und_schattera_ag\",\n                              \"bawag_psk_ag\",\n                              \"bks_bank_ag\",\n                              \"brull_kallmus_bank_ag\",\n                              \"btv_vier_lander_bank\",\n                              \"capital_bank_grawe_gruppe_ag\",\n                              \"deutsche_bank_ag\",\n                              \"dolomitenbank\",\n                              \"easybank_ag\",\n                              \"erste_bank_und_sparkassen\",\n                              \"hypo_alpeadriabank_international_ag\",\n                              \"hypo_bank_burgenland_aktiengesellschaft\",\n                              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                              \"hypo_oberosterreich_salzburg_steiermark\",\n                              \"hypo_tirol_bank_ag\",\n                              \"hypo_vorarlberg_bank_ag\",\n                              \"marchfelder_bank\",\n                              \"oberbank_ag\",\n                              \"raiffeisen_bankengruppe_osterreich\",\n                              \"schoellerbank_ag\",\n                              \"sparda_bank_wien\",\n                              \"volksbank_gruppe\",\n                              \"volkskreditbank_ag\",\n                              \"vr_bank_braunau\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"affin_bank\",\n                              \"agrobank\",\n                              \"alliance_bank\",\n                              \"ambank\",\n                              \"bank_islam\",\n                              \"bank_muamalat\",\n                              \"bank_of_china\",\n                              \"bank_rakyat\",\n                              \"bsn\",\n                              \"cimb\",\n                              \"deutsche_bank\",\n                              \"hong_leong_bank\",\n                              \"hsbc\",\n                              \"kfh\",\n                              \"maybank2e\",\n                              \"maybank2u\",\n                              \"ocbc\",\n                              \"pb_enterprise\",\n                              \"public_bank\",\n                              \"rhb\",\n                              \"standard_chartered\",\n                              \"uob\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"bank\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"abn_amro\",\n                              \"asn_bank\",\n                              \"bunq\",\n                              \"handelsbanken\",\n                              \"ing\",\n                              \"knab\",\n                              \"moneyou\",\n                              \"n26\",\n                              \"nn\",\n                              \"rabobank\",\n                              \"regiobank\",\n                              \"revolut\",\n                              \"sns_bank\",\n                              \"triodos_bank\",\n                              \"van_lanschot\",\n                              \"yoursafe\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"interac_present\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"dob\": {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"funding\": {\n                            \"enum\": [\"card\", \"points\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"alior_bank\",\n                              \"bank_millennium\",\n                              \"bank_nowy_bfg_sa\",\n                              \"bank_pekao_sa\",\n                              \"banki_spbdzielcze\",\n                              \"blik\",\n                              \"bnp_paribas\",\n                              \"boz\",\n                              \"citi_handlowy\",\n                              \"credit_agricole\",\n                              \"envelobank\",\n                              \"etransfer_pocztowy24\",\n                              \"getin_bank\",\n                              \"ideabank\",\n                              \"ing\",\n                              \"inteligo\",\n                              \"mbank_mtransfer\",\n                              \"nest_przelew\",\n                              \"noble_pay\",\n                              \"pbac_z_ipko\",\n                              \"plus_bank\",\n                              \"santander_przelew24\",\n                              \"tmobile_usbugi_bankowe\",\n                              \"toyota_bank\",\n                              \"velobank\",\n                              \"volkswagen_bank\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"radar_options\": {\n                        \"properties\": {\n                          \"session\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"radar_options_with_hidden_options\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"iban\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"iban\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"acss_debit\",\n                          \"affirm\",\n                          \"afterpay_clearpay\",\n                          \"alipay\",\n                          \"alma\",\n                          \"amazon_pay\",\n                          \"au_becs_debit\",\n                          \"bacs_debit\",\n                          \"bancontact\",\n                          \"blik\",\n                          \"boleto\",\n                          \"cashapp\",\n                          \"customer_balance\",\n                          \"eps\",\n                          \"fpx\",\n                          \"giropay\",\n                          \"grabpay\",\n                          \"ideal\",\n                          \"kakao_pay\",\n                          \"klarna\",\n                          \"konbini\",\n                          \"kr_card\",\n                          \"link\",\n                          \"mobilepay\",\n                          \"multibanco\",\n                          \"naver_pay\",\n                          \"oxxo\",\n                          \"p24\",\n                          \"pay_by_bank\",\n                          \"payco\",\n                          \"paynow\",\n                          \"paypal\",\n                          \"pix\",\n                          \"promptpay\",\n                          \"revolut_pay\",\n                          \"samsung_pay\",\n                          \"sepa_debit\",\n                          \"sofort\",\n                          \"swish\",\n                          \"twint\",\n                          \"us_bank_account\",\n                          \"wechat_pay\",\n                          \"zip\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_options\": {\n                    \"description\": \"Payment method-specific configuration for this SetupIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"currency\": {\n                            \"enum\": [\"cad\", \"usd\"],\n                            \"type\": \"string\"\n                          },\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"custom_mandate_url\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"default_for\": {\n                                \"items\": {\n                                  \"enum\": [\"invoice\", \"subscription\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"interval_description\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"payment_schedule\": {\n                                \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n                                \"type\": \"string\"\n                              },\n                              \"transaction_type\": {\n                                \"enum\": [\"business\", \"personal\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"setup_intent_payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"amount\": {\n                                \"type\": \"integer\"\n                              },\n                              \"amount_type\": {\n                                \"enum\": [\"fixed\", \"maximum\"],\n                                \"type\": \"string\"\n                              },\n                              \"currency\": {\n                                \"format\": \"currency\",\n                                \"type\": \"string\"\n                              },\n                              \"description\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"end_date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"interval\": {\n                                \"enum\": [\n                                  \"day\",\n                                  \"month\",\n                                  \"sporadic\",\n                                  \"week\",\n                                  \"year\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"interval_count\": {\n                                \"type\": \"integer\"\n                              },\n                              \"reference\": {\n                                \"maxLength\": 80,\n                                \"type\": \"string\"\n                              },\n                              \"start_date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"supported_types\": {\n                                \"items\": {\n                                  \"enum\": [\"india\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"required\": [\n                              \"amount\",\n                              \"amount_type\",\n                              \"currency\",\n                              \"interval\",\n                              \"reference\",\n                              \"start_date\"\n                            ],\n                            \"title\": \"setup_intent_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"network\": {\n                            \"enum\": [\n                              \"amex\",\n                              \"cartes_bancaires\",\n                              \"diners\",\n                              \"discover\",\n                              \"eftpos_au\",\n                              \"girocard\",\n                              \"interac\",\n                              \"jcb\",\n                              \"link\",\n                              \"mastercard\",\n                              \"unionpay\",\n                              \"unknown\",\n                              \"visa\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"request_three_d_secure\": {\n                            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"three_d_secure\": {\n                            \"properties\": {\n                              \"ares_trans_status\": {\n                                \"enum\": [\"A\", \"C\", \"I\", \"N\", \"R\", \"U\", \"Y\"],\n                                \"type\": \"string\"\n                              },\n                              \"cryptogram\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"electronic_commerce_indicator\": {\n                                \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"network_options\": {\n                                \"properties\": {\n                                  \"cartes_bancaires\": {\n                                    \"properties\": {\n                                      \"cb_avalgo\": {\n                                        \"enum\": [\"0\", \"1\", \"2\", \"3\", \"4\", \"A\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"cb_exemption\": {\n                                        \"maxLength\": 4,\n                                        \"type\": \"string\"\n                                      },\n                                      \"cb_score\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"cb_avalgo\"],\n                                    \"title\": \"cartes_bancaires_network_options_param\",\n                                    \"type\": \"object\"\n                                  }\n                                },\n                                \"title\": \"network_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"requestor_challenge_indicator\": {\n                                \"maxLength\": 2,\n                                \"type\": \"string\"\n                              },\n                              \"transaction_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"version\": {\n                                \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"setup_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card_present\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {\n                          \"billing_agreement_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"financial_connections\": {\n                            \"properties\": {\n                              \"filters\": {\n                                \"properties\": {\n                                  \"account_subcategories\": {\n                                    \"items\": {\n                                      \"enum\": [\"checking\", \"savings\"],\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"linked_account_options_filters_param\",\n                                \"type\": \"object\"\n                              },\n                              \"permissions\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"payment_method\",\n                                    \"transactions\"\n                                  ],\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"prefetch\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"transactions\"\n                                  ],\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"return_url\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"linked_account_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"collection_method\": {\n                                \"enum\": [\"\", \"paper\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"networks\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"items\": {\n                                  \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"networks_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_types\": {\n                    \"description\": \"The list of payment method types (for example, card) that this SetupIntent can use. If you don't provide this, Stripe will dynamically show relevant payment methods from your [payment method settings](https://dashboard.stripe.com/settings/payment_methods).\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The URL to redirect your customer back to after they authenticate or cancel their payment on the payment method's app or site. To redirect to a mobile application, you can alternatively supply an application URI scheme. This parameter can only be used with [`confirm=true`](https://stripe.com/docs/api/setup_intents/create#create_setup_intent-confirm).\",\n                    \"type\": \"string\"\n                  },\n                  \"single_use\": {\n                    \"description\": \"If you populate this hash, this SetupIntent generates a `single_use` mandate after successful completion.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"amount\", \"currency\"],\n                    \"title\": \"setup_intent_single_use_params\",\n                    \"type\": \"object\"\n                  },\n                  \"usage\": {\n                    \"description\": \"Indicates how the payment method is intended to be used in the future. If not provided, this value defaults to `off_session`.\",\n                    \"enum\": [\"off_session\", \"on_session\"],\n                    \"type\": \"string\"\n                  },\n                  \"use_stripe_sdk\": {\n                    \"description\": \"Set to `true` when confirming server-side and using Stripe.js, iOS, or Android client-side SDKs to handle the next actions.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a SetupIntent\"\n      }\n    },\n    \"/v1/setup_intents/{intent}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a SetupIntent that has previously been created. </p>\\n\\n<p>Client-side retrieval using a publishable key is allowed when the <code>client_secret</code> is provided in the query string. </p>\\n\\n<p>When retrieved with a publishable key, only a subset of properties will be returned. Please refer to the <a href=\\\"#setup_intent_object\\\">SetupIntent</a> object reference for more details.</p>\",\n        \"operationId\": \"GetSetupIntentsIntent\",\n        \"parameters\": [\n          {\n            \"description\": \"The client secret of the SetupIntent. We require this string if you use a publishable key to retrieve the SetupIntent.\",\n            \"in\": \"query\",\n            \"name\": \"client_secret\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a SetupIntent\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a SetupIntent object.</p>\",\n        \"operationId\": \"PostSetupIntentsIntent\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"flow_directions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_types\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"attach_to_self\": {\n                    \"description\": \"If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.\\n\\nIt can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"customer\": {\n                    \"description\": \"ID of the Customer this SetupIntent belongs to, if one exists.\\n\\nIf present, the SetupIntent's payment method will be attached to the Customer on successful setup. Payment methods attached to other Customers cannot be used with this SetupIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 1000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"flow_directions\": {\n                    \"description\": \"Indicates the directions of money movement for which this payment method is intended to be used.\\n\\nInclude `inbound` if you intend to use the payment method as the origin to pull funds from. Include `outbound` if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.\",\n                    \"items\": {\n                      \"enum\": [\"inbound\", \"outbound\"],\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"ID of the payment method (a PaymentMethod, Card, or saved Source object) to attach to this SetupIntent. To unset this field to null, pass in an empty string.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_configuration\": {\n                    \"description\": \"The ID of the [payment method configuration](https://stripe.com/docs/api/payment_method_configurations) to use with this SetupIntent.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"When included, this hash creates a PaymentMethod that is set as the [`payment_method`](https://stripe.com/docs/api/setup_intents/object#setup_intent_object-payment_method)\\nvalue in the SetupIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"institution_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"transit_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"account_number\",\n                          \"institution_number\",\n                          \"transit_number\"\n                        ],\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"alma\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"bsb_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"bsb_number\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"sort_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"blik\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"tax_id\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"arzte_und_apotheker_bank\",\n                              \"austrian_anadi_bank_ag\",\n                              \"bank_austria\",\n                              \"bankhaus_carl_spangler\",\n                              \"bankhaus_schelhammer_und_schattera_ag\",\n                              \"bawag_psk_ag\",\n                              \"bks_bank_ag\",\n                              \"brull_kallmus_bank_ag\",\n                              \"btv_vier_lander_bank\",\n                              \"capital_bank_grawe_gruppe_ag\",\n                              \"deutsche_bank_ag\",\n                              \"dolomitenbank\",\n                              \"easybank_ag\",\n                              \"erste_bank_und_sparkassen\",\n                              \"hypo_alpeadriabank_international_ag\",\n                              \"hypo_bank_burgenland_aktiengesellschaft\",\n                              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                              \"hypo_oberosterreich_salzburg_steiermark\",\n                              \"hypo_tirol_bank_ag\",\n                              \"hypo_vorarlberg_bank_ag\",\n                              \"marchfelder_bank\",\n                              \"oberbank_ag\",\n                              \"raiffeisen_bankengruppe_osterreich\",\n                              \"schoellerbank_ag\",\n                              \"sparda_bank_wien\",\n                              \"volksbank_gruppe\",\n                              \"volkskreditbank_ag\",\n                              \"vr_bank_braunau\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"affin_bank\",\n                              \"agrobank\",\n                              \"alliance_bank\",\n                              \"ambank\",\n                              \"bank_islam\",\n                              \"bank_muamalat\",\n                              \"bank_of_china\",\n                              \"bank_rakyat\",\n                              \"bsn\",\n                              \"cimb\",\n                              \"deutsche_bank\",\n                              \"hong_leong_bank\",\n                              \"hsbc\",\n                              \"kfh\",\n                              \"maybank2e\",\n                              \"maybank2u\",\n                              \"ocbc\",\n                              \"pb_enterprise\",\n                              \"public_bank\",\n                              \"rhb\",\n                              \"standard_chartered\",\n                              \"uob\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"bank\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"abn_amro\",\n                              \"asn_bank\",\n                              \"bunq\",\n                              \"handelsbanken\",\n                              \"ing\",\n                              \"knab\",\n                              \"moneyou\",\n                              \"n26\",\n                              \"nn\",\n                              \"rabobank\",\n                              \"regiobank\",\n                              \"revolut\",\n                              \"sns_bank\",\n                              \"triodos_bank\",\n                              \"van_lanschot\",\n                              \"yoursafe\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"interac_present\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"dob\": {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"funding\": {\n                            \"enum\": [\"card\", \"points\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"alior_bank\",\n                              \"bank_millennium\",\n                              \"bank_nowy_bfg_sa\",\n                              \"bank_pekao_sa\",\n                              \"banki_spbdzielcze\",\n                              \"blik\",\n                              \"bnp_paribas\",\n                              \"boz\",\n                              \"citi_handlowy\",\n                              \"credit_agricole\",\n                              \"envelobank\",\n                              \"etransfer_pocztowy24\",\n                              \"getin_bank\",\n                              \"ideabank\",\n                              \"ing\",\n                              \"inteligo\",\n                              \"mbank_mtransfer\",\n                              \"nest_przelew\",\n                              \"noble_pay\",\n                              \"pbac_z_ipko\",\n                              \"plus_bank\",\n                              \"santander_przelew24\",\n                              \"tmobile_usbugi_bankowe\",\n                              \"toyota_bank\",\n                              \"velobank\",\n                              \"volkswagen_bank\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"radar_options\": {\n                        \"properties\": {\n                          \"session\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"radar_options_with_hidden_options\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"iban\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"iban\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"acss_debit\",\n                          \"affirm\",\n                          \"afterpay_clearpay\",\n                          \"alipay\",\n                          \"alma\",\n                          \"amazon_pay\",\n                          \"au_becs_debit\",\n                          \"bacs_debit\",\n                          \"bancontact\",\n                          \"blik\",\n                          \"boleto\",\n                          \"cashapp\",\n                          \"customer_balance\",\n                          \"eps\",\n                          \"fpx\",\n                          \"giropay\",\n                          \"grabpay\",\n                          \"ideal\",\n                          \"kakao_pay\",\n                          \"klarna\",\n                          \"konbini\",\n                          \"kr_card\",\n                          \"link\",\n                          \"mobilepay\",\n                          \"multibanco\",\n                          \"naver_pay\",\n                          \"oxxo\",\n                          \"p24\",\n                          \"pay_by_bank\",\n                          \"payco\",\n                          \"paynow\",\n                          \"paypal\",\n                          \"pix\",\n                          \"promptpay\",\n                          \"revolut_pay\",\n                          \"samsung_pay\",\n                          \"sepa_debit\",\n                          \"sofort\",\n                          \"swish\",\n                          \"twint\",\n                          \"us_bank_account\",\n                          \"wechat_pay\",\n                          \"zip\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_options\": {\n                    \"description\": \"Payment method-specific configuration for this SetupIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"currency\": {\n                            \"enum\": [\"cad\", \"usd\"],\n                            \"type\": \"string\"\n                          },\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"custom_mandate_url\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"default_for\": {\n                                \"items\": {\n                                  \"enum\": [\"invoice\", \"subscription\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"interval_description\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"payment_schedule\": {\n                                \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n                                \"type\": \"string\"\n                              },\n                              \"transaction_type\": {\n                                \"enum\": [\"business\", \"personal\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"setup_intent_payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"amount\": {\n                                \"type\": \"integer\"\n                              },\n                              \"amount_type\": {\n                                \"enum\": [\"fixed\", \"maximum\"],\n                                \"type\": \"string\"\n                              },\n                              \"currency\": {\n                                \"format\": \"currency\",\n                                \"type\": \"string\"\n                              },\n                              \"description\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"end_date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"interval\": {\n                                \"enum\": [\n                                  \"day\",\n                                  \"month\",\n                                  \"sporadic\",\n                                  \"week\",\n                                  \"year\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"interval_count\": {\n                                \"type\": \"integer\"\n                              },\n                              \"reference\": {\n                                \"maxLength\": 80,\n                                \"type\": \"string\"\n                              },\n                              \"start_date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"supported_types\": {\n                                \"items\": {\n                                  \"enum\": [\"india\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"required\": [\n                              \"amount\",\n                              \"amount_type\",\n                              \"currency\",\n                              \"interval\",\n                              \"reference\",\n                              \"start_date\"\n                            ],\n                            \"title\": \"setup_intent_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"network\": {\n                            \"enum\": [\n                              \"amex\",\n                              \"cartes_bancaires\",\n                              \"diners\",\n                              \"discover\",\n                              \"eftpos_au\",\n                              \"girocard\",\n                              \"interac\",\n                              \"jcb\",\n                              \"link\",\n                              \"mastercard\",\n                              \"unionpay\",\n                              \"unknown\",\n                              \"visa\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"request_three_d_secure\": {\n                            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"three_d_secure\": {\n                            \"properties\": {\n                              \"ares_trans_status\": {\n                                \"enum\": [\"A\", \"C\", \"I\", \"N\", \"R\", \"U\", \"Y\"],\n                                \"type\": \"string\"\n                              },\n                              \"cryptogram\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"electronic_commerce_indicator\": {\n                                \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"network_options\": {\n                                \"properties\": {\n                                  \"cartes_bancaires\": {\n                                    \"properties\": {\n                                      \"cb_avalgo\": {\n                                        \"enum\": [\"0\", \"1\", \"2\", \"3\", \"4\", \"A\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"cb_exemption\": {\n                                        \"maxLength\": 4,\n                                        \"type\": \"string\"\n                                      },\n                                      \"cb_score\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"cb_avalgo\"],\n                                    \"title\": \"cartes_bancaires_network_options_param\",\n                                    \"type\": \"object\"\n                                  }\n                                },\n                                \"title\": \"network_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"requestor_challenge_indicator\": {\n                                \"maxLength\": 2,\n                                \"type\": \"string\"\n                              },\n                              \"transaction_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"version\": {\n                                \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"setup_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card_present\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {\n                          \"billing_agreement_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"financial_connections\": {\n                            \"properties\": {\n                              \"filters\": {\n                                \"properties\": {\n                                  \"account_subcategories\": {\n                                    \"items\": {\n                                      \"enum\": [\"checking\", \"savings\"],\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"linked_account_options_filters_param\",\n                                \"type\": \"object\"\n                              },\n                              \"permissions\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"payment_method\",\n                                    \"transactions\"\n                                  ],\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"prefetch\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"transactions\"\n                                  ],\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"return_url\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"linked_account_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"collection_method\": {\n                                \"enum\": [\"\", \"paper\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"networks\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"items\": {\n                                  \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"networks_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_types\": {\n                    \"description\": \"The list of payment method types (for example, card) that this SetupIntent can set up. If you don't provide this, Stripe will dynamically show relevant payment methods from your [payment method settings](https://dashboard.stripe.com/settings/payment_methods).\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a SetupIntent\"\n      }\n    },\n    \"/v1/setup_intents/{intent}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>You can cancel a SetupIntent object when it’s in one of these statuses: <code>requires_payment_method</code>, <code>requires_confirmation</code>, or <code>requires_action</code>. </p>\\n\\n<p>After you cancel it, setup is abandoned and any operations on the SetupIntent fail with an error. You can’t cancel the SetupIntent for a Checkout Session. <a href=\\\"/docs/api/checkout/sessions/expire\\\">Expire the Checkout Session</a> instead.</p>\",\n        \"operationId\": \"PostSetupIntentsIntentCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"cancellation_reason\": {\n                    \"description\": \"Reason for canceling this SetupIntent. Possible values are: `abandoned`, `requested_by_customer`, or `duplicate`\",\n                    \"enum\": [\"abandoned\", \"duplicate\", \"requested_by_customer\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a SetupIntent\"\n      }\n    },\n    \"/v1/setup_intents/{intent}/confirm\": {\n      \"post\": {\n        \"description\": \"<p>Confirm that your customer intends to set up the current or\\nprovided payment method. For example, you would confirm a SetupIntent\\nwhen a customer hits the “Save” button on a payment method management\\npage on your website.</p>\\n\\n<p>If the selected payment method does not require any additional\\nsteps from the customer, the SetupIntent will transition to the\\n<code>succeeded</code> status.</p>\\n\\n<p>Otherwise, it will transition to the <code>requires_action</code> status and\\nsuggest additional actions via <code>next_action</code>. If setup fails,\\nthe SetupIntent will transition to the\\n<code>requires_payment_method</code> status or the <code>canceled</code> status if the\\nconfirmation limit is reached.</p>\",\n        \"operationId\": \"PostSetupIntentsIntentConfirm\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mandate_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"client_secret\": {\n                    \"description\": \"The client secret of the SetupIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"confirmation_token\": {\n                    \"description\": \"ID of the ConfirmationToken used to confirm this SetupIntent.\\n\\nIf the provided ConfirmationToken contains properties that are also being provided in this request, such as `payment_method`, then the values in this request will take precedence.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"mandate_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"customer_acceptance\": {\n                            \"properties\": {\n                              \"accepted_at\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"offline\": {\n                                \"properties\": {},\n                                \"title\": \"offline_param\",\n                                \"type\": \"object\"\n                              },\n                              \"online\": {\n                                \"properties\": {\n                                  \"ip_address\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"user_agent\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"ip_address\", \"user_agent\"],\n                                \"title\": \"online_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"offline\", \"online\"],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"customer_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"customer_acceptance\"],\n                        \"title\": \"secret_key_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"description\": \"This hash contains details about the Mandate to create\",\n                        \"properties\": {\n                          \"customer_acceptance\": {\n                            \"properties\": {\n                              \"online\": {\n                                \"properties\": {\n                                  \"ip_address\": {\n                                    \"type\": \"string\"\n                                  },\n                                  \"user_agent\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"online_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"online\"],\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"online\", \"type\"],\n                            \"title\": \"customer_acceptance_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"customer_acceptance\"],\n                        \"title\": \"client_key_param\",\n                        \"type\": \"object\"\n                      }\n                    ]\n                  },\n                  \"payment_method\": {\n                    \"description\": \"ID of the payment method (a PaymentMethod, Card, or saved Source object) to attach to this SetupIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"When included, this hash creates a PaymentMethod that is set as the [`payment_method`](https://stripe.com/docs/api/setup_intents/object#setup_intent_object-payment_method)\\nvalue in the SetupIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"institution_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"transit_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"account_number\",\n                          \"institution_number\",\n                          \"transit_number\"\n                        ],\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"alma\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"bsb_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"bsb_number\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"sort_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"blik\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"tax_id\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"arzte_und_apotheker_bank\",\n                              \"austrian_anadi_bank_ag\",\n                              \"bank_austria\",\n                              \"bankhaus_carl_spangler\",\n                              \"bankhaus_schelhammer_und_schattera_ag\",\n                              \"bawag_psk_ag\",\n                              \"bks_bank_ag\",\n                              \"brull_kallmus_bank_ag\",\n                              \"btv_vier_lander_bank\",\n                              \"capital_bank_grawe_gruppe_ag\",\n                              \"deutsche_bank_ag\",\n                              \"dolomitenbank\",\n                              \"easybank_ag\",\n                              \"erste_bank_und_sparkassen\",\n                              \"hypo_alpeadriabank_international_ag\",\n                              \"hypo_bank_burgenland_aktiengesellschaft\",\n                              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                              \"hypo_oberosterreich_salzburg_steiermark\",\n                              \"hypo_tirol_bank_ag\",\n                              \"hypo_vorarlberg_bank_ag\",\n                              \"marchfelder_bank\",\n                              \"oberbank_ag\",\n                              \"raiffeisen_bankengruppe_osterreich\",\n                              \"schoellerbank_ag\",\n                              \"sparda_bank_wien\",\n                              \"volksbank_gruppe\",\n                              \"volkskreditbank_ag\",\n                              \"vr_bank_braunau\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"affin_bank\",\n                              \"agrobank\",\n                              \"alliance_bank\",\n                              \"ambank\",\n                              \"bank_islam\",\n                              \"bank_muamalat\",\n                              \"bank_of_china\",\n                              \"bank_rakyat\",\n                              \"bsn\",\n                              \"cimb\",\n                              \"deutsche_bank\",\n                              \"hong_leong_bank\",\n                              \"hsbc\",\n                              \"kfh\",\n                              \"maybank2e\",\n                              \"maybank2u\",\n                              \"ocbc\",\n                              \"pb_enterprise\",\n                              \"public_bank\",\n                              \"rhb\",\n                              \"standard_chartered\",\n                              \"uob\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"bank\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"abn_amro\",\n                              \"asn_bank\",\n                              \"bunq\",\n                              \"handelsbanken\",\n                              \"ing\",\n                              \"knab\",\n                              \"moneyou\",\n                              \"n26\",\n                              \"nn\",\n                              \"rabobank\",\n                              \"regiobank\",\n                              \"revolut\",\n                              \"sns_bank\",\n                              \"triodos_bank\",\n                              \"van_lanschot\",\n                              \"yoursafe\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"interac_present\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"dob\": {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"funding\": {\n                            \"enum\": [\"card\", \"points\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"alior_bank\",\n                              \"bank_millennium\",\n                              \"bank_nowy_bfg_sa\",\n                              \"bank_pekao_sa\",\n                              \"banki_spbdzielcze\",\n                              \"blik\",\n                              \"bnp_paribas\",\n                              \"boz\",\n                              \"citi_handlowy\",\n                              \"credit_agricole\",\n                              \"envelobank\",\n                              \"etransfer_pocztowy24\",\n                              \"getin_bank\",\n                              \"ideabank\",\n                              \"ing\",\n                              \"inteligo\",\n                              \"mbank_mtransfer\",\n                              \"nest_przelew\",\n                              \"noble_pay\",\n                              \"pbac_z_ipko\",\n                              \"plus_bank\",\n                              \"santander_przelew24\",\n                              \"tmobile_usbugi_bankowe\",\n                              \"toyota_bank\",\n                              \"velobank\",\n                              \"volkswagen_bank\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"radar_options\": {\n                        \"properties\": {\n                          \"session\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"radar_options_with_hidden_options\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"iban\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"iban\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"acss_debit\",\n                          \"affirm\",\n                          \"afterpay_clearpay\",\n                          \"alipay\",\n                          \"alma\",\n                          \"amazon_pay\",\n                          \"au_becs_debit\",\n                          \"bacs_debit\",\n                          \"bancontact\",\n                          \"blik\",\n                          \"boleto\",\n                          \"cashapp\",\n                          \"customer_balance\",\n                          \"eps\",\n                          \"fpx\",\n                          \"giropay\",\n                          \"grabpay\",\n                          \"ideal\",\n                          \"kakao_pay\",\n                          \"klarna\",\n                          \"konbini\",\n                          \"kr_card\",\n                          \"link\",\n                          \"mobilepay\",\n                          \"multibanco\",\n                          \"naver_pay\",\n                          \"oxxo\",\n                          \"p24\",\n                          \"pay_by_bank\",\n                          \"payco\",\n                          \"paynow\",\n                          \"paypal\",\n                          \"pix\",\n                          \"promptpay\",\n                          \"revolut_pay\",\n                          \"samsung_pay\",\n                          \"sepa_debit\",\n                          \"sofort\",\n                          \"swish\",\n                          \"twint\",\n                          \"us_bank_account\",\n                          \"wechat_pay\",\n                          \"zip\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_method_options\": {\n                    \"description\": \"Payment method-specific configuration for this SetupIntent.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"currency\": {\n                            \"enum\": [\"cad\", \"usd\"],\n                            \"type\": \"string\"\n                          },\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"custom_mandate_url\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"default_for\": {\n                                \"items\": {\n                                  \"enum\": [\"invoice\", \"subscription\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"interval_description\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"payment_schedule\": {\n                                \"enum\": [\"combined\", \"interval\", \"sporadic\"],\n                                \"type\": \"string\"\n                              },\n                              \"transaction_type\": {\n                                \"enum\": [\"business\", \"personal\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"setup_intent_payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"amount\": {\n                                \"type\": \"integer\"\n                              },\n                              \"amount_type\": {\n                                \"enum\": [\"fixed\", \"maximum\"],\n                                \"type\": \"string\"\n                              },\n                              \"currency\": {\n                                \"format\": \"currency\",\n                                \"type\": \"string\"\n                              },\n                              \"description\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"end_date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"interval\": {\n                                \"enum\": [\n                                  \"day\",\n                                  \"month\",\n                                  \"sporadic\",\n                                  \"week\",\n                                  \"year\"\n                                ],\n                                \"type\": \"string\"\n                              },\n                              \"interval_count\": {\n                                \"type\": \"integer\"\n                              },\n                              \"reference\": {\n                                \"maxLength\": 80,\n                                \"type\": \"string\"\n                              },\n                              \"start_date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"supported_types\": {\n                                \"items\": {\n                                  \"enum\": [\"india\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"required\": [\n                              \"amount\",\n                              \"amount_type\",\n                              \"currency\",\n                              \"interval\",\n                              \"reference\",\n                              \"start_date\"\n                            ],\n                            \"title\": \"setup_intent_mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"network\": {\n                            \"enum\": [\n                              \"amex\",\n                              \"cartes_bancaires\",\n                              \"diners\",\n                              \"discover\",\n                              \"eftpos_au\",\n                              \"girocard\",\n                              \"interac\",\n                              \"jcb\",\n                              \"link\",\n                              \"mastercard\",\n                              \"unionpay\",\n                              \"unknown\",\n                              \"visa\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"request_three_d_secure\": {\n                            \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"three_d_secure\": {\n                            \"properties\": {\n                              \"ares_trans_status\": {\n                                \"enum\": [\"A\", \"C\", \"I\", \"N\", \"R\", \"U\", \"Y\"],\n                                \"type\": \"string\"\n                              },\n                              \"cryptogram\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"electronic_commerce_indicator\": {\n                                \"enum\": [\"01\", \"02\", \"05\", \"06\", \"07\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              },\n                              \"network_options\": {\n                                \"properties\": {\n                                  \"cartes_bancaires\": {\n                                    \"properties\": {\n                                      \"cb_avalgo\": {\n                                        \"enum\": [\"0\", \"1\", \"2\", \"3\", \"4\", \"A\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"cb_exemption\": {\n                                        \"maxLength\": 4,\n                                        \"type\": \"string\"\n                                      },\n                                      \"cb_score\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"cb_avalgo\"],\n                                    \"title\": \"cartes_bancaires_network_options_param\",\n                                    \"type\": \"object\"\n                                  }\n                                },\n                                \"title\": \"network_options_param\",\n                                \"type\": \"object\"\n                              },\n                              \"requestor_challenge_indicator\": {\n                                \"maxLength\": 2,\n                                \"type\": \"string\"\n                              },\n                              \"transaction_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"version\": {\n                                \"enum\": [\"1.0.2\", \"2.1.0\", \"2.2.0\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"setup_intent_payment_method_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_param\",\n                        \"type\": \"object\"\n                      },\n                      \"card_present\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {\n                          \"billing_agreement_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"reference_prefix\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 12,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"payment_method_options_mandate_options_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"financial_connections\": {\n                            \"properties\": {\n                              \"filters\": {\n                                \"properties\": {\n                                  \"account_subcategories\": {\n                                    \"items\": {\n                                      \"enum\": [\"checking\", \"savings\"],\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  }\n                                },\n                                \"title\": \"linked_account_options_filters_param\",\n                                \"type\": \"object\"\n                              },\n                              \"permissions\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"payment_method\",\n                                    \"transactions\"\n                                  ],\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"prefetch\": {\n                                \"items\": {\n                                  \"enum\": [\n                                    \"balances\",\n                                    \"ownership\",\n                                    \"transactions\"\n                                  ],\n                                  \"type\": \"string\",\n                                  \"x-stripeBypassValidation\": true\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"return_url\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"linked_account_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"mandate_options\": {\n                            \"properties\": {\n                              \"collection_method\": {\n                                \"enum\": [\"\", \"paper\"],\n                                \"type\": \"string\",\n                                \"x-stripeBypassValidation\": true\n                              }\n                            },\n                            \"title\": \"mandate_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"networks\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"items\": {\n                                  \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"networks_options_param\",\n                            \"type\": \"object\"\n                          },\n                          \"verification_method\": {\n                            \"enum\": [\"automatic\", \"instant\", \"microdeposits\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"setup_intent_payment_method_options_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"payment_method_options_param\",\n                    \"type\": \"object\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"The URL to redirect your customer back to after they authenticate on the payment method's app or site.\\nIf you'd prefer to redirect to a mobile application, you can alternatively supply an application URI scheme.\\nThis parameter is only used for cards and other redirect-based payment methods.\",\n                    \"type\": \"string\"\n                  },\n                  \"use_stripe_sdk\": {\n                    \"description\": \"Set to `true` when confirming server-side and using Stripe.js, iOS, or Android client-side SDKs to handle the next actions.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Confirm a SetupIntent\"\n      }\n    },\n    \"/v1/setup_intents/{intent}/verify_microdeposits\": {\n      \"post\": {\n        \"description\": \"<p>Verifies microdeposits on a SetupIntent object.</p>\",\n        \"operationId\": \"PostSetupIntentsIntentVerifyMicrodeposits\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"intent\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"amounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amounts\": {\n                    \"description\": \"Two positive integers, in *cents*, equal to the values of the microdeposits sent to the bank account.\",\n                    \"items\": {\n                      \"type\": \"integer\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"client_secret\": {\n                    \"description\": \"The client secret of the SetupIntent.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"descriptor_code\": {\n                    \"description\": \"A six-character code starting with SM present in the microdeposit sent to the bank account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/setup_intent\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Verify microdeposits on a SetupIntent\"\n      }\n    },\n    \"/v1/shipping_rates\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your shipping rates.</p>\",\n        \"operationId\": \"GetShippingRates\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return shipping rates that are active or inactive.\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return shipping rates for the given currency.\",\n            \"in\": \"query\",\n            \"name\": \"currency\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"currency\",\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/shipping_rate\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/shipping_rates\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ShippingResourcesShippingRateList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all shipping rates\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new shipping rate object.</p>\",\n        \"operationId\": \"PostShippingRates\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"delivery_estimate\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fixed_amount\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"delivery_estimate\": {\n                    \"description\": \"The estimated range for how long shipping will take, meant to be displayable to the customer. This will appear on CheckoutSessions.\",\n                    \"properties\": {\n                      \"maximum\": {\n                        \"properties\": {\n                          \"unit\": {\n                            \"enum\": [\n                              \"business_day\",\n                              \"day\",\n                              \"hour\",\n                              \"month\",\n                              \"week\"\n                            ],\n                            \"type\": \"string\"\n                          },\n                          \"value\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"unit\", \"value\"],\n                        \"title\": \"delivery_estimate_bound\",\n                        \"type\": \"object\"\n                      },\n                      \"minimum\": {\n                        \"properties\": {\n                          \"unit\": {\n                            \"enum\": [\n                              \"business_day\",\n                              \"day\",\n                              \"hour\",\n                              \"month\",\n                              \"week\"\n                            ],\n                            \"type\": \"string\"\n                          },\n                          \"value\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"unit\", \"value\"],\n                        \"title\": \"delivery_estimate_bound\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"delivery_estimate\",\n                    \"type\": \"object\"\n                  },\n                  \"display_name\": {\n                    \"description\": \"The name of the shipping rate, meant to be displayable to the customer. This will appear on CheckoutSessions.\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"fixed_amount\": {\n                    \"description\": \"Describes a fixed amount to charge for shipping. Must be present if type is `fixed_amount`.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"currency_options\": {\n                        \"additionalProperties\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"amount\"],\n                          \"title\": \"currency_option\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"amount\", \"currency\"],\n                    \"title\": \"fixed_amount\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"tax_behavior\": {\n                    \"description\": \"Specifies whether the rate is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`.\",\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"tax_code\": {\n                    \"description\": \"A [tax code](https://stripe.com/docs/tax/tax-categories) ID. The Shipping tax code is `txcd_92010001`.\",\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"description\": \"The type of calculation to use on the shipping rate.\",\n                    \"enum\": [\"fixed_amount\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"display_name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/shipping_rate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a shipping rate\"\n      }\n    },\n    \"/v1/shipping_rates/{shipping_rate_token}\": {\n      \"get\": {\n        \"description\": \"<p>Returns the shipping rate object with the given ID.</p>\",\n        \"operationId\": \"GetShippingRatesShippingRateToken\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"shipping_rate_token\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/shipping_rate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a shipping rate\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing shipping rate object.</p>\",\n        \"operationId\": \"PostShippingRatesShippingRateToken\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"shipping_rate_token\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fixed_amount\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Whether the shipping rate can be used for new purchases. Defaults to `true`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"fixed_amount\": {\n                    \"description\": \"Describes a fixed amount to charge for shipping. Must be present if type is `fixed_amount`.\",\n                    \"properties\": {\n                      \"currency_options\": {\n                        \"additionalProperties\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"currency_option_update\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"fixed_amount_update\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"tax_behavior\": {\n                    \"description\": \"Specifies whether the rate is considered inclusive of taxes or exclusive of taxes. One of `inclusive`, `exclusive`, or `unspecified`.\",\n                    \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/shipping_rate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a shipping rate\"\n      }\n    },\n    \"/v1/sigma/scheduled_query_runs\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of scheduled query runs.</p>\",\n        \"operationId\": \"GetSigmaScheduledQueryRuns\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/scheduled_query_run\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/sigma/scheduled_query_runs\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SigmaScheduledQueryRunList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all scheduled query runs\"\n      }\n    },\n    \"/v1/sigma/scheduled_query_runs/{scheduled_query_run}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an scheduled query run.</p>\",\n        \"operationId\": \"GetSigmaScheduledQueryRunsScheduledQueryRun\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"scheduled_query_run\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/scheduled_query_run\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a scheduled query run\"\n      }\n    },\n    \"/v1/sources\": {\n      \"post\": {\n        \"description\": \"<p>Creates a new source object.</p>\",\n        \"operationId\": \"PostSources\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mandate\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"owner\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"receiver\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"redirect\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"source_order\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount associated with the source. This is the amount for which the source will be chargeable once ready. Required for `single_use` sources. Not supported for `receiver` type sources, where charge amount may not be specified until funds land.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO code for the currency](https://stripe.com/docs/currencies) associated with the source. This is the currency for which the source will be chargeable once ready.\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The `Customer` to whom the original source is attached to. Must be set when the original source is not a `Source` (e.g., `Card`).\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"flow\": {\n                    \"description\": \"The authentication `flow` of the source to create. `flow` is one of `redirect`, `receiver`, `code_verification`, `none`. It is generally inferred unless a type supports multiple flows.\",\n                    \"enum\": [\n                      \"code_verification\",\n                      \"none\",\n                      \"receiver\",\n                      \"redirect\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"mandate\": {\n                    \"description\": \"Information about a mandate possibility attached to a source object (generally for bank debits) as well as its acceptance status.\",\n                    \"properties\": {\n                      \"acceptance\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"offline\": {\n                            \"properties\": {\n                              \"contact_email\": {\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"contact_email\"],\n                            \"title\": \"mandate_offline_acceptance_params\",\n                            \"type\": \"object\"\n                          },\n                          \"online\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"mandate_online_acceptance_params\",\n                            \"type\": \"object\"\n                          },\n                          \"status\": {\n                            \"enum\": [\n                              \"accepted\",\n                              \"pending\",\n                              \"refused\",\n                              \"revoked\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"offline\", \"online\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"status\"],\n                        \"title\": \"mandate_acceptance_params\",\n                        \"type\": \"object\"\n                      },\n                      \"amount\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"interval\": {\n                        \"enum\": [\"one_time\", \"scheduled\", \"variable\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"notification_method\": {\n                        \"enum\": [\n                          \"deprecated_none\",\n                          \"email\",\n                          \"manual\",\n                          \"none\",\n                          \"stripe_email\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"mandate_params\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"object\"\n                  },\n                  \"original_source\": {\n                    \"description\": \"The source to share.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"owner\": {\n                    \"description\": \"Information about the owner of the payment instrument that may be used or required by particular source types.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"source_address\",\n                        \"type\": \"object\"\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"owner\",\n                    \"type\": \"object\"\n                  },\n                  \"receiver\": {\n                    \"description\": \"Optional parameters for the receiver flow. Can be set only if the source is a receiver (`flow` is `receiver`).\",\n                    \"properties\": {\n                      \"refund_attributes_method\": {\n                        \"enum\": [\"email\", \"manual\", \"none\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"receiver_params\",\n                    \"type\": \"object\"\n                  },\n                  \"redirect\": {\n                    \"description\": \"Parameters required for the redirect flow. Required if the source is authenticated by a redirect (`flow` is `redirect`).\",\n                    \"properties\": {\n                      \"return_url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"return_url\"],\n                    \"title\": \"redirect_params\",\n                    \"type\": \"object\"\n                  },\n                  \"source_order\": {\n                    \"description\": \"Information about the items and shipping associated with the source. Required for transactional credit (for example Klarna) sources before you can charge it.\",\n                    \"properties\": {\n                      \"items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"description\": {\n                              \"maxLength\": 1000,\n                              \"type\": \"string\"\n                            },\n                            \"parent\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            },\n                            \"type\": {\n                              \"enum\": [\"discount\", \"shipping\", \"sku\", \"tax\"],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"order_item_specs\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"shipping\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"line1\"],\n                            \"title\": \"address\",\n                            \"type\": \"object\"\n                          },\n                          \"carrier\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"tracking_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\"],\n                        \"title\": \"order_shipping\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"shallow_order_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"An arbitrary string to be displayed on your customer's statement. As an example, if your website is `RunClub` and the item you're charging for is a race ticket, you may want to specify a `statement_descriptor` of `RunClub 5K race ticket.` While many payment types will display this information, some may not display it at all.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"token\": {\n                    \"description\": \"An optional token used to create the source. When passed, token properties will override source parameters.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"description\": \"The `type` of the source to create. Required unless `customer` and `original_source` are specified (see the [Cloning card Sources](https://stripe.com/docs/sources/connect#cloning-card-sources) guide)\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"usage\": {\n                    \"enum\": [\"reusable\", \"single_use\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Shares a source\"\n      }\n    },\n    \"/v1/sources/{source}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves an existing source object. Supply the unique source ID from a source creation request and Stripe will return the corresponding up-to-date source object information.</p>\",\n        \"operationId\": \"GetSourcesSource\",\n        \"parameters\": [\n          {\n            \"description\": \"The client secret of the source. Required if a publishable key is used to retrieve the source.\",\n            \"in\": \"query\",\n            \"name\": \"client_secret\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"source\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a source\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified source by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\\n\\n<p>This request accepts the <code>metadata</code> and <code>owner</code> as arguments. It is also possible to update type specific information for selected payment methods. Please refer to our <a href=\\\"/docs/sources\\\">payment method guides</a> for more detail.</p>\",\n        \"operationId\": \"PostSourcesSource\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"source\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"mandate\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"owner\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"source_order\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount associated with the source.\",\n                    \"type\": \"integer\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"mandate\": {\n                    \"description\": \"Information about a mandate possibility attached to a source object (generally for bank debits) as well as its acceptance status.\",\n                    \"properties\": {\n                      \"acceptance\": {\n                        \"properties\": {\n                          \"date\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"ip\": {\n                            \"type\": \"string\"\n                          },\n                          \"offline\": {\n                            \"properties\": {\n                              \"contact_email\": {\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"contact_email\"],\n                            \"title\": \"mandate_offline_acceptance_params\",\n                            \"type\": \"object\"\n                          },\n                          \"online\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"mandate_online_acceptance_params\",\n                            \"type\": \"object\"\n                          },\n                          \"status\": {\n                            \"enum\": [\n                              \"accepted\",\n                              \"pending\",\n                              \"refused\",\n                              \"revoked\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"offline\", \"online\"],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"user_agent\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"status\"],\n                        \"title\": \"mandate_acceptance_params\",\n                        \"type\": \"object\"\n                      },\n                      \"amount\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"integer\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"interval\": {\n                        \"enum\": [\"one_time\", \"scheduled\", \"variable\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"notification_method\": {\n                        \"enum\": [\n                          \"deprecated_none\",\n                          \"email\",\n                          \"manual\",\n                          \"none\",\n                          \"stripe_email\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"mandate_params\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"owner\": {\n                    \"description\": \"Information about the owner of the payment instrument that may be used or required by particular source types.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"source_address\",\n                        \"type\": \"object\"\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"owner\",\n                    \"type\": \"object\"\n                  },\n                  \"source_order\": {\n                    \"description\": \"Information about the items and shipping associated with the source. Required for transactional credit (for example Klarna) sources before you can charge it.\",\n                    \"properties\": {\n                      \"items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"description\": {\n                              \"maxLength\": 1000,\n                              \"type\": \"string\"\n                            },\n                            \"parent\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            },\n                            \"type\": {\n                              \"enum\": [\"discount\", \"shipping\", \"sku\", \"tax\"],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"order_item_specs\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"shipping\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"line1\"],\n                            \"title\": \"address\",\n                            \"type\": \"object\"\n                          },\n                          \"carrier\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"tracking_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"address\"],\n                        \"title\": \"order_shipping\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"order_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a source\"\n      }\n    },\n    \"/v1/sources/{source}/mandate_notifications/{mandate_notification}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a new Source MandateNotification.</p>\",\n        \"operationId\": \"GetSourcesSourceMandateNotificationsMandateNotification\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"mandate_notification\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"source\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/source_mandate_notification\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Source MandateNotification\"\n      }\n    },\n    \"/v1/sources/{source}/source_transactions\": {\n      \"get\": {\n        \"description\": \"<p>List source transactions for a given source.</p>\",\n        \"operationId\": \"GetSourcesSourceSourceTransactions\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"source\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/source_transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"ApmsSourcesSourceTransactionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/sources/{source}/source_transactions/{source_transaction}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieve an existing source transaction object. Supply the unique source ID from a source creation request and the source transaction ID and Stripe will return the corresponding up-to-date source object information.</p>\",\n        \"operationId\": \"GetSourcesSourceSourceTransactionsSourceTransaction\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"source\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"source_transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/source_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a source transaction\"\n      }\n    },\n    \"/v1/sources/{source}/verify\": {\n      \"post\": {\n        \"description\": \"<p>Verify a given source.</p>\",\n        \"operationId\": \"PostSourcesSourceVerify\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"source\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"values\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"values\": {\n                    \"description\": \"The values needed to verify the source.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"values\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/source\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        }\n      }\n    },\n    \"/v1/subscription_items\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your subscription items for a given subscription.</p>\",\n        \"operationId\": \"GetSubscriptionItems\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The ID of the subscription whose items will be retrieved.\",\n            \"in\": \"query\",\n            \"name\": \"subscription\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/subscription_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/subscription_items\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SubscriptionsItemsSubscriptionItemList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all subscription items\"\n      },\n      \"post\": {\n        \"description\": \"<p>Adds a new item to an existing subscription. No existing items will be changed or replaced.</p>\",\n        \"operationId\": \"PostSubscriptionItems\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"billing_thresholds\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"price_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"usage_gte\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"usage_gte\"],\n                        \"title\": \"item_billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period. When updating, pass an empty string to remove previously-defined thresholds.\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons to redeem into discounts for the subscription item.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_behavior\": {\n                    \"description\": \"Use `allow_incomplete` to transition the subscription to `status=past_due` if a payment is required but cannot be paid. This allows you to manage scenarios where additional user actions are needed to pay a subscription's invoice. For example, SCA regulation may require 3DS authentication to complete payment. See the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication) for Billing to learn more. This is the default behavior.\\n\\nUse `default_incomplete` to transition the subscription to `status=past_due` when payment is required and await explicit confirmation of the invoice's payment intent. This allows simpler management of scenarios where additional user actions are needed to pay a subscription’s invoice. Such as failed payments, [SCA regulation](https://stripe.com/docs/billing/migration/strong-customer-authentication), or collecting a mandate for a bank debit payment method.\\n\\nUse `pending_if_incomplete` to update the subscription using [pending updates](https://stripe.com/docs/billing/subscriptions/pending-updates). When you use `pending_if_incomplete` you can only pass the parameters [supported by pending updates](https://stripe.com/docs/billing/pending-updates-reference#supported-attributes).\\n\\nUse `error_if_incomplete` if you want Stripe to return an HTTP 402 status code if a subscription's invoice cannot be paid. For example, if a payment method requires 3DS authentication due to SCA regulation and further user action is needed, this parameter does not update the subscription and returns an error instead. This was the default behavior for API versions prior to 2019-03-14. See the [changelog](https://stripe.com/docs/upgrades#2019-03-14) to learn more.\",\n                    \"enum\": [\n                      \"allow_incomplete\",\n                      \"default_incomplete\",\n                      \"error_if_incomplete\",\n                      \"pending_if_incomplete\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"price\": {\n                    \"description\": \"The ID of the price object.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"description\": \"Data used to generate a new [Price](https://stripe.com/docs/api/prices) object inline.\",\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"recurring\": {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"recurring_adhoc\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\", \"recurring\"],\n                    \"title\": \"recurring_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"proration_date\": {\n                    \"description\": \"If set, the proration will be calculated as though the subscription was updated at the given time. This can be used to apply the same proration that was previewed with the [upcoming invoice](https://stripe.com/docs/api#retrieve_customer_invoice) endpoint.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"quantity\": {\n                    \"description\": \"The quantity you'd like to apply to the subscription item you're creating.\",\n                    \"type\": \"integer\"\n                  },\n                  \"subscription\": {\n                    \"description\": \"The identifier of the subscription to modify.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of [Tax Rate](https://stripe.com/docs/api/tax_rates) ids. These Tax Rates will override the [`default_tax_rates`](https://stripe.com/docs/api/subscriptions/create#create_subscription-default_tax_rates) on the Subscription. When updating, pass an empty string to remove previously-defined tax rates.\"\n                  }\n                },\n                \"required\": [\"subscription\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a subscription item\"\n      }\n    },\n    \"/v1/subscription_items/{item}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes an item from the subscription. Removing a subscription item from a subscription will not cancel the subscription.</p>\",\n        \"operationId\": \"DeleteSubscriptionItemsItem\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"item\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"clear_usage\": {\n                    \"description\": \"Delete all usage for the given subscription item. Allowed only when the current plan's `usage_type` is `metered`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"proration_date\": {\n                    \"description\": \"If set, the proration will be calculated as though the subscription was updated at the given time. This can be used to apply the same proration that was previewed with the [upcoming invoice](https://stripe.com/docs/api#retrieve_customer_invoice) endpoint.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_subscription_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a subscription item\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the subscription item with the given ID.</p>\",\n        \"operationId\": \"GetSubscriptionItemsItem\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"item\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a subscription item\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the plan or quantity of an item on a current subscription.</p>\",\n        \"operationId\": \"PostSubscriptionItemsItem\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"item\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"billing_thresholds\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"price_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"usage_gte\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"usage_gte\"],\n                        \"title\": \"item_billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period. When updating, pass an empty string to remove previously-defined thresholds.\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons to redeem into discounts for the subscription item.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"off_session\": {\n                    \"description\": \"Indicates if a customer is on or off-session while an invoice payment is attempted. Defaults to `false` (on-session).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"payment_behavior\": {\n                    \"description\": \"Use `allow_incomplete` to transition the subscription to `status=past_due` if a payment is required but cannot be paid. This allows you to manage scenarios where additional user actions are needed to pay a subscription's invoice. For example, SCA regulation may require 3DS authentication to complete payment. See the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication) for Billing to learn more. This is the default behavior.\\n\\nUse `default_incomplete` to transition the subscription to `status=past_due` when payment is required and await explicit confirmation of the invoice's payment intent. This allows simpler management of scenarios where additional user actions are needed to pay a subscription’s invoice. Such as failed payments, [SCA regulation](https://stripe.com/docs/billing/migration/strong-customer-authentication), or collecting a mandate for a bank debit payment method.\\n\\nUse `pending_if_incomplete` to update the subscription using [pending updates](https://stripe.com/docs/billing/subscriptions/pending-updates). When you use `pending_if_incomplete` you can only pass the parameters [supported by pending updates](https://stripe.com/docs/billing/pending-updates-reference#supported-attributes).\\n\\nUse `error_if_incomplete` if you want Stripe to return an HTTP 402 status code if a subscription's invoice cannot be paid. For example, if a payment method requires 3DS authentication due to SCA regulation and further user action is needed, this parameter does not update the subscription and returns an error instead. This was the default behavior for API versions prior to 2019-03-14. See the [changelog](https://stripe.com/docs/upgrades#2019-03-14) to learn more.\",\n                    \"enum\": [\n                      \"allow_incomplete\",\n                      \"default_incomplete\",\n                      \"error_if_incomplete\",\n                      \"pending_if_incomplete\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"price\": {\n                    \"description\": \"The ID of the price object. One of `price` or `price_data` is required. When changing a subscription item's price, `quantity` is set to 1 unless a `quantity` parameter is provided.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"price_data\": {\n                    \"description\": \"Data used to generate a new [Price](https://stripe.com/docs/api/prices) object inline. One of `price` or `price_data` is required.\",\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"product\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"recurring\": {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"recurring_adhoc\",\n                        \"type\": \"object\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"unit_amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"unit_amount_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"product\", \"recurring\"],\n                    \"title\": \"recurring_price_data\",\n                    \"type\": \"object\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"proration_date\": {\n                    \"description\": \"If set, the proration will be calculated as though the subscription was updated at the given time. This can be used to apply the same proration that was previewed with the [upcoming invoice](https://stripe.com/docs/api#retrieve_customer_invoice) endpoint.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"quantity\": {\n                    \"description\": \"The quantity you'd like to apply to the subscription item you're creating.\",\n                    \"type\": \"integer\"\n                  },\n                  \"tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A list of [Tax Rate](https://stripe.com/docs/api/tax_rates) ids. These Tax Rates will override the [`default_tax_rates`](https://stripe.com/docs/api/subscriptions/create#create_subscription-default_tax_rates) on the Subscription. When updating, pass an empty string to remove previously-defined tax rates.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_item\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a subscription item\"\n      }\n    },\n    \"/v1/subscription_items/{subscription_item}/usage_record_summaries\": {\n      \"get\": {\n        \"description\": \"<p>For the specified subscription item, returns a list of summary objects. Each object in the list provides usage information that’s been summarized from multiple usage records and over a subscription billing period (e.g., 15 usage records in the month of September).</p>\\n\\n<p>The list is sorted in reverse-chronological order (newest first). The first list item represents the most current usage period that hasn’t ended yet. Since new usage records can still be added, the returned summary information for the subscription item’s ID should be seen as unstable until the subscription billing period ends.</p>\",\n        \"operationId\": \"GetSubscriptionItemsSubscriptionItemUsageRecordSummaries\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_item\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/usage_record_summary\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"UsageEventsResourceUsageRecordSummaryList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all subscription item period summaries\"\n      }\n    },\n    \"/v1/subscription_items/{subscription_item}/usage_records\": {\n      \"post\": {\n        \"description\": \"<p>Creates a usage record for a specified subscription item and date, and fills it with a quantity.</p>\\n\\n<p>Usage records provide <code>quantity</code> information that Stripe uses to track how much a customer is using your service. With usage information and the pricing model set up by the <a href=\\\"https://stripe.com/docs/billing/subscriptions/metered-billing\\\">metered billing</a> plan, Stripe helps you send accurate invoices to your customers.</p>\\n\\n<p>The default calculation for usage is to add up all the <code>quantity</code> values of the usage records within a billing period. You can change this default behavior with the billing plan’s <code>aggregate_usage</code> <a href=\\\"/docs/api/plans/create#create_plan-aggregate_usage\\\">parameter</a>. When there is more than one usage record with the same timestamp, Stripe adds the <code>quantity</code> values together. In most cases, this is the desired resolution, however, you can change this behavior with the <code>action</code> parameter.</p>\\n\\n<p>The default pricing model for metered billing is <a href=\\\"/docs/api/plans/object#plan_object-billing_scheme\\\">per-unit pricing</a>. For finer granularity, you can configure metered billing to have a <a href=\\\"https://stripe.com/docs/billing/subscriptions/tiers\\\">tiered pricing</a> model.</p>\",\n        \"operationId\": \"PostSubscriptionItemsSubscriptionItemUsageRecords\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_item\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"timestamp\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"action\": {\n                    \"description\": \"Valid values are `increment` (default) or `set`. When using `increment` the specified `quantity` will be added to the usage at the specified timestamp. The `set` action will overwrite the usage quantity at that timestamp. If the subscription has [billing thresholds](https://stripe.com/docs/api/subscriptions/object#subscription_object-billing_thresholds), `increment` is the only allowed value.\",\n                    \"enum\": [\"increment\", \"set\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"quantity\": {\n                    \"description\": \"The usage quantity for the specified timestamp.\",\n                    \"type\": \"integer\"\n                  },\n                  \"timestamp\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    ],\n                    \"description\": \"The timestamp for the usage event. This timestamp must be within the current billing period of the subscription of the provided `subscription_item`, and must not be in the future. When passing `\\\"now\\\"`, Stripe records usage for the current time. Default is `\\\"now\\\"` if a value is not provided.\"\n                  }\n                },\n                \"required\": [\"quantity\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/usage_record\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a usage record\"\n      }\n    },\n    \"/v1/subscription_schedules\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the list of your subscription schedules.</p>\",\n        \"operationId\": \"GetSubscriptionSchedules\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return subscription schedules that were created canceled the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"canceled_at\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return subscription schedules that completed during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"completed_at\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return subscription schedules that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return subscription schedules for the given customer.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return subscription schedules that were released during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"released_at\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return subscription schedules that have not started yet.\",\n            \"in\": \"query\",\n            \"name\": \"scheduled\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/subscription_schedule\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/subscription_schedules\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SubscriptionSchedulesResourceScheduleList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all schedules\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new subscription schedule object. Each customer can have up to 500 active or scheduled subscriptions.</p>\",\n        \"operationId\": \"PostSubscriptionSchedules\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"default_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"phases\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"start_date\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"customer\": {\n                    \"description\": \"The identifier of the customer to create the subscription schedule for.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_settings\": {\n                    \"description\": \"Object representing the subscription schedule's default settings.\",\n                    \"properties\": {\n                      \"application_fee_percent\": {\n                        \"type\": \"number\"\n                      },\n                      \"automatic_tax\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"liability\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"automatic_tax_config\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_cycle_anchor\": {\n                        \"enum\": [\"automatic\", \"phase_start\"],\n                        \"type\": \"string\"\n                      },\n                      \"billing_thresholds\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_gte\": {\n                                \"type\": \"integer\"\n                              },\n                              \"reset_billing_cycle_anchor\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"billing_thresholds_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"collection_method\": {\n                        \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                        \"type\": \"string\"\n                      },\n                      \"default_payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"description\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"invoice_settings\": {\n                        \"properties\": {\n                          \"account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"days_until_due\": {\n                            \"type\": \"integer\"\n                          },\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"subscription_schedule_default_settings_param\",\n                        \"type\": \"object\"\n                      },\n                      \"on_behalf_of\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"transfer_data\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_percent\": {\n                                \"type\": \"number\"\n                              },\n                              \"destination\": {\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"destination\"],\n                            \"title\": \"transfer_data_specs\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"default_settings_params\",\n                    \"type\": \"object\"\n                  },\n                  \"end_behavior\": {\n                    \"description\": \"Behavior of the subscription schedule and underlying subscription when it ends. Possible values are `release` or `cancel` with the default being `release`. `release` will end the subscription schedule and keep the underlying subscription running. `cancel` will end the subscription schedule and cancel the underlying subscription.\",\n                    \"enum\": [\"cancel\", \"none\", \"release\", \"renew\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"from_subscription\": {\n                    \"description\": \"Migrate an existing subscription to be managed by a subscription schedule. If this parameter is set, a subscription schedule will be created using the subscription's item(s), set to auto-renew using the subscription's interval. When using this parameter, other parameters (such as phase values) cannot be set. To create a subscription schedule with other modifications, we recommend making two separate API calls.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"phases\": {\n                    \"description\": \"List representing phases of the subscription schedule. Each phase can be customized to have different durations, plans, and coupons. If there are multiple phases, the `end_date` of one phase will always equal the `start_date` of the next phase.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"add_invoice_items\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"discounts\": {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"coupon\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"discount\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"promotion_code\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"title\": \"discounts_data_param\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"price\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"price_data\": {\n                                \"properties\": {\n                                  \"currency\": {\n                                    \"format\": \"currency\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"product\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"tax_behavior\": {\n                                    \"enum\": [\n                                      \"exclusive\",\n                                      \"inclusive\",\n                                      \"unspecified\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"unit_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"unit_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"currency\", \"product\"],\n                                \"title\": \"one_time_price_data_with_negative_amounts\",\n                                \"type\": \"object\"\n                              },\n                              \"quantity\": {\n                                \"type\": \"integer\"\n                              },\n                              \"tax_rates\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"add_invoice_item_entry\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"application_fee_percent\": {\n                          \"type\": \"number\"\n                        },\n                        \"automatic_tax\": {\n                          \"properties\": {\n                            \"enabled\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"liability\": {\n                              \"properties\": {\n                                \"account\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": {\n                                  \"enum\": [\"account\", \"self\"],\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"type\"],\n                              \"title\": \"param\",\n                              \"type\": \"object\"\n                            }\n                          },\n                          \"required\": [\"enabled\"],\n                          \"title\": \"automatic_tax_config\",\n                          \"type\": \"object\"\n                        },\n                        \"billing_cycle_anchor\": {\n                          \"enum\": [\"automatic\", \"phase_start\"],\n                          \"type\": \"string\"\n                        },\n                        \"billing_thresholds\": {\n                          \"anyOf\": [\n                            {\n                              \"properties\": {\n                                \"amount_gte\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"reset_billing_cycle_anchor\": {\n                                  \"type\": \"boolean\"\n                                }\n                              },\n                              \"title\": \"billing_thresholds_param\",\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"collection_method\": {\n                          \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                          \"type\": \"string\"\n                        },\n                        \"coupon\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"currency\": {\n                          \"format\": \"currency\",\n                          \"type\": \"string\"\n                        },\n                        \"default_payment_method\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"default_tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"description\": {\n                          \"anyOf\": [\n                            {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"end_date\": {\n                          \"format\": \"unix-time\",\n                          \"type\": \"integer\"\n                        },\n                        \"invoice_settings\": {\n                          \"properties\": {\n                            \"account_tax_ids\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"days_until_due\": {\n                              \"type\": \"integer\"\n                            },\n                            \"issuer\": {\n                              \"properties\": {\n                                \"account\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": {\n                                  \"enum\": [\"account\", \"self\"],\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"type\"],\n                              \"title\": \"param\",\n                              \"type\": \"object\"\n                            }\n                          },\n                          \"title\": \"invoice_settings\",\n                          \"type\": \"object\"\n                        },\n                        \"items\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"billing_thresholds\": {\n                                \"anyOf\": [\n                                  {\n                                    \"properties\": {\n                                      \"usage_gte\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"usage_gte\"],\n                                    \"title\": \"item_billing_thresholds_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"discounts\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"properties\": {\n                                        \"coupon\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"discount\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"promotion_code\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        }\n                                      },\n                                      \"title\": \"discounts_data_param\",\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"metadata\": {\n                                \"additionalProperties\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"object\"\n                              },\n                              \"price\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"price_data\": {\n                                \"properties\": {\n                                  \"currency\": {\n                                    \"format\": \"currency\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"product\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"recurring\": {\n                                    \"properties\": {\n                                      \"interval\": {\n                                        \"enum\": [\n                                          \"day\",\n                                          \"month\",\n                                          \"week\",\n                                          \"year\"\n                                        ],\n                                        \"type\": \"string\"\n                                      },\n                                      \"interval_count\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"interval\"],\n                                    \"title\": \"recurring_adhoc\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"tax_behavior\": {\n                                    \"enum\": [\n                                      \"exclusive\",\n                                      \"inclusive\",\n                                      \"unspecified\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"unit_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"unit_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"currency\",\n                                  \"product\",\n                                  \"recurring\"\n                                ],\n                                \"title\": \"recurring_price_data\",\n                                \"type\": \"object\"\n                              },\n                              \"quantity\": {\n                                \"type\": \"integer\"\n                              },\n                              \"tax_rates\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"configuration_item_params\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"iterations\": {\n                          \"type\": \"integer\"\n                        },\n                        \"metadata\": {\n                          \"additionalProperties\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": \"object\"\n                        },\n                        \"on_behalf_of\": {\n                          \"type\": \"string\"\n                        },\n                        \"proration_behavior\": {\n                          \"enum\": [\n                            \"always_invoice\",\n                            \"create_prorations\",\n                            \"none\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"transfer_data\": {\n                          \"properties\": {\n                            \"amount_percent\": {\n                              \"type\": \"number\"\n                            },\n                            \"destination\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"destination\"],\n                          \"title\": \"transfer_data_specs\",\n                          \"type\": \"object\"\n                        },\n                        \"trial\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"trial_end\": {\n                          \"format\": \"unix-time\",\n                          \"type\": \"integer\"\n                        }\n                      },\n                      \"required\": [\"items\"],\n                      \"title\": \"phase_configuration_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"start_date\": {\n                    \"anyOf\": [\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"When the subscription schedule starts. We recommend using `now` so that it starts the subscription immediately. You can also use a Unix timestamp to backdate the subscription so that it starts on a past date, or set a future date for the subscription to start on.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_schedule\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a schedule\"\n      }\n    },\n    \"/v1/subscription_schedules/{schedule}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing subscription schedule. You only need to supply the unique subscription schedule identifier that was returned upon subscription schedule creation.</p>\",\n        \"operationId\": \"GetSubscriptionSchedulesSchedule\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"schedule\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_schedule\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a schedule\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing subscription schedule.</p>\",\n        \"operationId\": \"PostSubscriptionSchedulesSchedule\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"schedule\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"default_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"phases\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"default_settings\": {\n                    \"description\": \"Object representing the subscription schedule's default settings.\",\n                    \"properties\": {\n                      \"application_fee_percent\": {\n                        \"type\": \"number\"\n                      },\n                      \"automatic_tax\": {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"liability\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"automatic_tax_config\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_cycle_anchor\": {\n                        \"enum\": [\"automatic\", \"phase_start\"],\n                        \"type\": \"string\"\n                      },\n                      \"billing_thresholds\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_gte\": {\n                                \"type\": \"integer\"\n                              },\n                              \"reset_billing_cycle_anchor\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"title\": \"billing_thresholds_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"collection_method\": {\n                        \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                        \"type\": \"string\"\n                      },\n                      \"default_payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"description\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 500,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"invoice_settings\": {\n                        \"properties\": {\n                          \"account_tax_ids\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"days_until_due\": {\n                            \"type\": \"integer\"\n                          },\n                          \"issuer\": {\n                            \"properties\": {\n                              \"account\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": {\n                                \"enum\": [\"account\", \"self\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"type\"],\n                            \"title\": \"param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"subscription_schedule_default_settings_param\",\n                        \"type\": \"object\"\n                      },\n                      \"on_behalf_of\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"transfer_data\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"amount_percent\": {\n                                \"type\": \"number\"\n                              },\n                              \"destination\": {\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"destination\"],\n                            \"title\": \"transfer_data_specs\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"default_settings_params\",\n                    \"type\": \"object\"\n                  },\n                  \"end_behavior\": {\n                    \"description\": \"Behavior of the subscription schedule and underlying subscription when it ends. Possible values are `release` or `cancel` with the default being `release`. `release` will end the subscription schedule and keep the underlying subscription running. `cancel` will end the subscription schedule and cancel the underlying subscription.\",\n                    \"enum\": [\"cancel\", \"none\", \"release\", \"renew\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"phases\": {\n                    \"description\": \"List representing phases of the subscription schedule. Each phase can be customized to have different durations, plans, and coupons. If there are multiple phases, the `end_date` of one phase will always equal the `start_date` of the next phase. Note that past phases can be omitted.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"add_invoice_items\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"discounts\": {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"coupon\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"discount\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"promotion_code\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"title\": \"discounts_data_param\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"price\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"price_data\": {\n                                \"properties\": {\n                                  \"currency\": {\n                                    \"format\": \"currency\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"product\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"tax_behavior\": {\n                                    \"enum\": [\n                                      \"exclusive\",\n                                      \"inclusive\",\n                                      \"unspecified\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"unit_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"unit_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\"currency\", \"product\"],\n                                \"title\": \"one_time_price_data_with_negative_amounts\",\n                                \"type\": \"object\"\n                              },\n                              \"quantity\": {\n                                \"type\": \"integer\"\n                              },\n                              \"tax_rates\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"add_invoice_item_entry\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"application_fee_percent\": {\n                          \"type\": \"number\"\n                        },\n                        \"automatic_tax\": {\n                          \"properties\": {\n                            \"enabled\": {\n                              \"type\": \"boolean\"\n                            },\n                            \"liability\": {\n                              \"properties\": {\n                                \"account\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": {\n                                  \"enum\": [\"account\", \"self\"],\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"type\"],\n                              \"title\": \"param\",\n                              \"type\": \"object\"\n                            }\n                          },\n                          \"required\": [\"enabled\"],\n                          \"title\": \"automatic_tax_config\",\n                          \"type\": \"object\"\n                        },\n                        \"billing_cycle_anchor\": {\n                          \"enum\": [\"automatic\", \"phase_start\"],\n                          \"type\": \"string\"\n                        },\n                        \"billing_thresholds\": {\n                          \"anyOf\": [\n                            {\n                              \"properties\": {\n                                \"amount_gte\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"reset_billing_cycle_anchor\": {\n                                  \"type\": \"boolean\"\n                                }\n                              },\n                              \"title\": \"billing_thresholds_param\",\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"collection_method\": {\n                          \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                          \"type\": \"string\"\n                        },\n                        \"coupon\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"default_payment_method\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"default_tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"description\": {\n                          \"anyOf\": [\n                            {\n                              \"maxLength\": 500,\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"end_date\": {\n                          \"anyOf\": [\n                            {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            },\n                            {\n                              \"enum\": [\"now\"],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"invoice_settings\": {\n                          \"properties\": {\n                            \"account_tax_ids\": {\n                              \"anyOf\": [\n                                {\n                                  \"items\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"type\": \"array\"\n                                },\n                                {\n                                  \"enum\": [\"\"],\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"days_until_due\": {\n                              \"type\": \"integer\"\n                            },\n                            \"issuer\": {\n                              \"properties\": {\n                                \"account\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": {\n                                  \"enum\": [\"account\", \"self\"],\n                                  \"type\": \"string\"\n                                }\n                              },\n                              \"required\": [\"type\"],\n                              \"title\": \"param\",\n                              \"type\": \"object\"\n                            }\n                          },\n                          \"title\": \"invoice_settings\",\n                          \"type\": \"object\"\n                        },\n                        \"items\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"billing_thresholds\": {\n                                \"anyOf\": [\n                                  {\n                                    \"properties\": {\n                                      \"usage_gte\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"usage_gte\"],\n                                    \"title\": \"item_billing_thresholds_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"discounts\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"properties\": {\n                                        \"coupon\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"discount\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        },\n                                        \"promotion_code\": {\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\"\n                                        }\n                                      },\n                                      \"title\": \"discounts_data_param\",\n                                      \"type\": \"object\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"metadata\": {\n                                \"additionalProperties\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"object\"\n                              },\n                              \"price\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"price_data\": {\n                                \"properties\": {\n                                  \"currency\": {\n                                    \"format\": \"currency\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"product\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"recurring\": {\n                                    \"properties\": {\n                                      \"interval\": {\n                                        \"enum\": [\n                                          \"day\",\n                                          \"month\",\n                                          \"week\",\n                                          \"year\"\n                                        ],\n                                        \"type\": \"string\"\n                                      },\n                                      \"interval_count\": {\n                                        \"type\": \"integer\"\n                                      }\n                                    },\n                                    \"required\": [\"interval\"],\n                                    \"title\": \"recurring_adhoc\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"tax_behavior\": {\n                                    \"enum\": [\n                                      \"exclusive\",\n                                      \"inclusive\",\n                                      \"unspecified\"\n                                    ],\n                                    \"type\": \"string\"\n                                  },\n                                  \"unit_amount\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"unit_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"required\": [\n                                  \"currency\",\n                                  \"product\",\n                                  \"recurring\"\n                                ],\n                                \"title\": \"recurring_price_data\",\n                                \"type\": \"object\"\n                              },\n                              \"quantity\": {\n                                \"type\": \"integer\"\n                              },\n                              \"tax_rates\": {\n                                \"anyOf\": [\n                                  {\n                                    \"items\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": \"array\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"configuration_item_params\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"iterations\": {\n                          \"type\": \"integer\"\n                        },\n                        \"metadata\": {\n                          \"additionalProperties\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": \"object\"\n                        },\n                        \"on_behalf_of\": {\n                          \"type\": \"string\"\n                        },\n                        \"proration_behavior\": {\n                          \"enum\": [\n                            \"always_invoice\",\n                            \"create_prorations\",\n                            \"none\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"start_date\": {\n                          \"anyOf\": [\n                            {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            },\n                            {\n                              \"enum\": [\"now\"],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"transfer_data\": {\n                          \"properties\": {\n                            \"amount_percent\": {\n                              \"type\": \"number\"\n                            },\n                            \"destination\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"destination\"],\n                          \"title\": \"transfer_data_specs\",\n                          \"type\": \"object\"\n                        },\n                        \"trial\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"trial_end\": {\n                          \"anyOf\": [\n                            {\n                              \"format\": \"unix-time\",\n                              \"type\": \"integer\"\n                            },\n                            {\n                              \"enum\": [\"now\"],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"required\": [\"items\"],\n                      \"title\": \"phase_configuration_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"If the update changes the current phase, indicates whether the changes should be prorated. The default value is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_schedule\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a schedule\"\n      }\n    },\n    \"/v1/subscription_schedules/{schedule}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>Cancels a subscription schedule and its associated subscription immediately (if the subscription schedule has an active subscription). A subscription schedule can only be canceled if its status is <code>not_started</code> or <code>active</code>.</p>\",\n        \"operationId\": \"PostSubscriptionSchedulesScheduleCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"schedule\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_now\": {\n                    \"description\": \"If the subscription schedule is `active`, indicates if a final invoice will be generated that contains any un-invoiced metered usage and new/pending proration invoice items. Defaults to `true`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"prorate\": {\n                    \"description\": \"If the subscription schedule is `active`, indicates if the cancellation should be prorated. Defaults to `true`.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_schedule\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a schedule\"\n      }\n    },\n    \"/v1/subscription_schedules/{schedule}/release\": {\n      \"post\": {\n        \"description\": \"<p>Releases the subscription schedule immediately, which will stop scheduling of its phases, but leave any existing subscription in place. A schedule can only be released if its status is <code>not_started</code> or <code>active</code>. If the subscription schedule is currently associated with a subscription, releasing it will remove its <code>subscription</code> property and set the subscription’s ID to the <code>released_subscription</code> property.</p>\",\n        \"operationId\": \"PostSubscriptionSchedulesScheduleRelease\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"schedule\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"preserve_cancel_date\": {\n                    \"description\": \"Keep any cancellation on the subscription that the schedule has set\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription_schedule\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Release a schedule\"\n      }\n    },\n    \"/v1/subscriptions\": {\n      \"get\": {\n        \"description\": \"<p>By default, returns a list of subscriptions that have not been canceled. In order to list canceled subscriptions, specify <code>status=canceled</code>.</p>\",\n        \"operationId\": \"GetSubscriptions\",\n        \"parameters\": [\n          {\n            \"description\": \"Filter subscriptions by their automatic tax settings.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"automatic_tax\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"enabled\": {\n                  \"type\": \"boolean\"\n                }\n              },\n              \"required\": [\"enabled\"],\n              \"title\": \"automatic_tax_filter_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The collection method of the subscriptions to retrieve. Either `charge_automatically` or `send_invoice`.\",\n            \"in\": \"query\",\n            \"name\": \"collection_method\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"charge_automatically\", \"send_invoice\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return subscriptions that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return subscriptions whose current_period_end falls within the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"current_period_end\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return subscriptions whose current_period_start falls within the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"current_period_start\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The ID of the customer whose subscriptions will be retrieved.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filter for subscriptions that contain this recurring price ID.\",\n            \"in\": \"query\",\n            \"name\": \"price\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The status of the subscriptions to retrieve. Passing in a value of `canceled` will return all canceled subscriptions, including those belonging to deleted customers. Pass `ended` to find subscriptions that are canceled and subscriptions that are expired due to [incomplete payment](https://stripe.com/docs/billing/subscriptions/overview#subscription-statuses). Passing in a value of `all` will return subscriptions of all statuses. If no value is supplied, all subscriptions that have not been canceled are returned.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"active\",\n                \"all\",\n                \"canceled\",\n                \"ended\",\n                \"incomplete\",\n                \"incomplete_expired\",\n                \"past_due\",\n                \"paused\",\n                \"trialing\",\n                \"unpaid\"\n              ],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filter for subscriptions that are associated with the specified test clock. The response will not include subscriptions with test clocks if this and the customer parameter is not set.\",\n            \"in\": \"query\",\n            \"name\": \"test_clock\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/subscription\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/subscriptions\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SubscriptionsSubscriptionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List subscriptions\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new subscription on an existing customer. Each customer can have up to 500 active or scheduled subscriptions.</p>\\n\\n<p>When you create a subscription with <code>collection_method=charge_automatically</code>, the first invoice is finalized as part of the request.\\nThe <code>payment_behavior</code> parameter determines the exact behavior of the initial payment.</p>\\n\\n<p>To start subscriptions where the first invoice always begins in a <code>draft</code> status, use <a href=\\\"/docs/billing/subscriptions/subscription-schedules#managing\\\">subscription schedules</a> instead.\\nSchedules provide the flexibility to model more complex billing configurations that change over time.</p>\",\n        \"operationId\": \"PostSubscriptions\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"add_invoice_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"application_fee_percent\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"billing_cycle_anchor_config\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"billing_thresholds\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"on_behalf_of\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pending_invoice_item_interval\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_end\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"add_invoice_items\": {\n                    \"description\": \"A list of prices and quantities that will generate invoice items appended to the next invoice for this subscription. You may pass up to 20 items.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"discounts\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"coupon\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"discount\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"promotion_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"discounts_data_param\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\"],\n                          \"title\": \"one_time_price_data_with_negative_amounts\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"add_invoice_item_entry\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"application_fee_percent\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"number\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. The request must be made by a platform account on a connected account in order to set an application fee percentage. For more information, see the application fees [documentation](https://stripe.com/docs/connect/subscriptions#collecting-fees-on-subscriptions).\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Automatic tax settings for this subscription. We recommend you only include this parameter when the existing value is being changed.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_config\",\n                    \"type\": \"object\"\n                  },\n                  \"backdate_start_date\": {\n                    \"description\": \"For new subscriptions, a past timestamp to backdate the subscription's start date to. If set, the first invoice will contain a proration for the timespan between the start date and the current time. Can be combined with trials and the billing cycle anchor.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"billing_cycle_anchor\": {\n                    \"description\": \"A future timestamp in UTC format to anchor the subscription's [billing cycle](https://stripe.com/docs/subscriptions/billing-cycle). The anchor is the reference point that aligns future billing cycle dates. It sets the day of week for `week` intervals, the day of month for `month` and `year` intervals, and the month of year for `year` intervals.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"billing_cycle_anchor_config\": {\n                    \"description\": \"Mutually exclusive with billing_cycle_anchor and only valid with monthly and yearly price intervals. When provided, the billing_cycle_anchor is set to the next occurence of the day_of_month at the hour, minute, and second UTC.\",\n                    \"properties\": {\n                      \"day_of_month\": {\n                        \"type\": \"integer\"\n                      },\n                      \"hour\": {\n                        \"type\": \"integer\"\n                      },\n                      \"minute\": {\n                        \"type\": \"integer\"\n                      },\n                      \"month\": {\n                        \"type\": \"integer\"\n                      },\n                      \"second\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"day_of_month\"],\n                    \"title\": \"billing_cycle_anchor_config_param\",\n                    \"type\": \"object\"\n                  },\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount_gte\": {\n                            \"type\": \"integer\"\n                          },\n                          \"reset_billing_cycle_anchor\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period. Pass an empty string to remove previously-defined thresholds.\"\n                  },\n                  \"cancel_at\": {\n                    \"description\": \"A timestamp at which the subscription should cancel. If set to a date before the current period ends, this will cause a proration if prorations have been enabled using `proration_behavior`. If set during a future period, this will always cause a proration for that period.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"cancel_at_period_end\": {\n                    \"description\": \"Indicate whether this subscription should cancel at the end of the current period (`current_period_end`). Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`. Defaults to `charge_automatically`.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"coupon\": {\n                    \"description\": \"The ID of the coupon to apply to this subscription. A coupon applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The identifier of the customer to subscribe.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"days_until_due\": {\n                    \"description\": \"Number of days a customer has to pay invoices generated by this subscription. Valid only for subscriptions where `collection_method` is set to `send_invoice`.\",\n                    \"type\": \"integer\"\n                  },\n                  \"default_payment_method\": {\n                    \"description\": \"ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over `default_source`. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_source\": {\n                    \"description\": \"ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If `default_payment_method` is also set, `default_payment_method` will take precedence. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates that will apply to any subscription item that does not have `tax_rates` set. Invoices created will have their `default_tax_rates` populated from the subscription.\"\n                  },\n                  \"description\": {\n                    \"description\": \"The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons to redeem into discounts for the subscription. If not specified or empty, inherits the discount from the subscription's customer.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"All invoices will be billed using the specified settings.\",\n                    \"properties\": {\n                      \"account_tax_ids\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"issuer\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"invoice_settings_param\",\n                    \"type\": \"object\"\n                  },\n                  \"items\": {\n                    \"description\": \"A list of up to 20 subscription items, each with an attached price.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"billing_thresholds\": {\n                          \"anyOf\": [\n                            {\n                              \"properties\": {\n                                \"usage_gte\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"usage_gte\"],\n                              \"title\": \"item_billing_thresholds_param\",\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"metadata\": {\n                          \"additionalProperties\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": \"object\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"recurring\": {\n                              \"properties\": {\n                                \"interval\": {\n                                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                  \"type\": \"string\"\n                                },\n                                \"interval_count\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"interval\"],\n                              \"title\": \"recurring_adhoc\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\", \"recurring\"],\n                          \"title\": \"recurring_price_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"subscription_item_create_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"off_session\": {\n                    \"description\": \"Indicates if a customer is on or off-session while an invoice payment is attempted. Defaults to `false` (on-session).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"on_behalf_of\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account on behalf of which to charge, for each of the subscription's invoices.\"\n                  },\n                  \"payment_behavior\": {\n                    \"description\": \"Only applies to subscriptions with `collection_method=charge_automatically`.\\n\\nUse `allow_incomplete` to create Subscriptions with `status=incomplete` if the first invoice can't be paid. Creating Subscriptions with this status allows you to manage scenarios where additional customer actions are needed to pay a subscription's invoice. For example, SCA regulation may require 3DS authentication to complete payment. See the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication) for Billing to learn more. This is the default behavior.\\n\\nUse `default_incomplete` to create Subscriptions with `status=incomplete` when the first invoice requires payment, otherwise start as active. Subscriptions transition to `status=active` when successfully confirming the PaymentIntent on the first invoice. This allows simpler management of scenarios where additional customer actions are needed to pay a subscription’s invoice, such as failed payments, [SCA regulation](https://stripe.com/docs/billing/migration/strong-customer-authentication), or collecting a mandate for a bank debit payment method. If the PaymentIntent is not confirmed within 23 hours Subscriptions transition to `status=incomplete_expired`, which is a terminal state.\\n\\nUse `error_if_incomplete` if you want Stripe to return an HTTP 402 status code if a subscription's first invoice can't be paid. For example, if a payment method requires 3DS authentication due to SCA regulation and further customer action is needed, this parameter doesn't create a Subscription and returns an error instead. This was the default behavior for API versions prior to 2019-03-14. See the [changelog](https://stripe.com/docs/upgrades#2019-03-14) to learn more.\\n\\n`pending_if_incomplete` is only used with updates and cannot be passed when creating a Subscription.\\n\\nSubscriptions with `collection_method=send_invoice` are automatically activated regardless of the first Invoice status.\",\n                    \"enum\": [\n                      \"allow_incomplete\",\n                      \"default_incomplete\",\n                      \"error_if_incomplete\",\n                      \"pending_if_incomplete\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"payment_settings\": {\n                    \"description\": \"Payment settings to pass to invoices created by the subscription.\",\n                    \"properties\": {\n                      \"payment_method_options\": {\n                        \"properties\": {\n                          \"acss_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"transaction_type\": {\n                                        \"enum\": [\"business\", \"personal\"],\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"bancontact\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"preferred_language\": {\n                                    \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"card\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"amount\": {\n                                        \"type\": \"integer\"\n                                      },\n                                      \"amount_type\": {\n                                        \"enum\": [\"fixed\", \"maximum\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"description\": {\n                                        \"maxLength\": 200,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"network\": {\n                                    \"enum\": [\n                                      \"amex\",\n                                      \"cartes_bancaires\",\n                                      \"diners\",\n                                      \"discover\",\n                                      \"eftpos_au\",\n                                      \"girocard\",\n                                      \"interac\",\n                                      \"jcb\",\n                                      \"link\",\n                                      \"mastercard\",\n                                      \"unionpay\",\n                                      \"unknown\",\n                                      \"visa\"\n                                    ],\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  },\n                                  \"request_three_d_secure\": {\n                                    \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"subscription_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"customer_balance\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"bank_transfer\": {\n                                    \"properties\": {\n                                      \"eu_bank_transfer\": {\n                                        \"properties\": {\n                                          \"country\": {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          }\n                                        },\n                                        \"required\": [\"country\"],\n                                        \"title\": \"eu_bank_transfer_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"type\": {\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"bank_transfer_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"funding_type\": {\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"konbini\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"sepa_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"us_bank_account\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"financial_connections\": {\n                                    \"properties\": {\n                                      \"filters\": {\n                                        \"properties\": {\n                                          \"account_subcategories\": {\n                                            \"items\": {\n                                              \"enum\": [\"checking\", \"savings\"],\n                                              \"type\": \"string\"\n                                            },\n                                            \"type\": \"array\"\n                                          }\n                                        },\n                                        \"title\": \"invoice_linked_account_options_filters_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"permissions\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"payment_method\",\n                                            \"transactions\"\n                                          ],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"prefetch\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"transactions\"\n                                          ],\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"invoice_linked_account_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"payment_method_options\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_types\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"enum\": [\n                                \"ach_credit_transfer\",\n                                \"ach_debit\",\n                                \"acss_debit\",\n                                \"amazon_pay\",\n                                \"au_becs_debit\",\n                                \"bacs_debit\",\n                                \"bancontact\",\n                                \"boleto\",\n                                \"card\",\n                                \"cashapp\",\n                                \"customer_balance\",\n                                \"eps\",\n                                \"fpx\",\n                                \"giropay\",\n                                \"grabpay\",\n                                \"ideal\",\n                                \"jp_credit_transfer\",\n                                \"kakao_pay\",\n                                \"konbini\",\n                                \"kr_card\",\n                                \"link\",\n                                \"multibanco\",\n                                \"naver_pay\",\n                                \"p24\",\n                                \"payco\",\n                                \"paynow\",\n                                \"paypal\",\n                                \"promptpay\",\n                                \"revolut_pay\",\n                                \"sepa_credit_transfer\",\n                                \"sepa_debit\",\n                                \"sofort\",\n                                \"swish\",\n                                \"us_bank_account\",\n                                \"wechat_pay\"\n                              ],\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"save_default_payment_method\": {\n                        \"enum\": [\"off\", \"on_subscription\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_settings\",\n                    \"type\": \"object\"\n                  },\n                  \"pending_invoice_item_interval\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"pending_invoice_item_interval_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling [Create an invoice](https://stripe.com/docs/api#create_invoice) for the given subscription at the specified interval.\"\n                  },\n                  \"promotion_code\": {\n                    \"description\": \"The promotion code to apply to this subscription. A promotion code applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) resulting from the `billing_cycle_anchor`. If no value is passed, the default is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"transfer_data\": {\n                    \"description\": \"If specified, the funds from the subscription's invoices will be transferred to the destination and the ID of the resulting transfers will be found on the resulting charges.\",\n                    \"properties\": {\n                      \"amount_percent\": {\n                        \"type\": \"number\"\n                      },\n                      \"destination\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"destination\"],\n                    \"title\": \"transfer_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"trial_end\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    ],\n                    \"description\": \"Unix timestamp representing the end of the trial period the customer will get before being charged for the first time. If set, trial_end will override the default trial period of the plan the customer is being subscribed to. The special value `now` can be provided to end the customer's trial immediately. Can be at most two years from `billing_cycle_anchor`. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\"\n                  },\n                  \"trial_from_plan\": {\n                    \"description\": \"Indicates if a plan's `trial_period_days` should be applied to the subscription. Setting `trial_end` per subscription is preferred, and this defaults to `false`. Setting this flag to `true` together with `trial_end` is not allowed. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"trial_period_days\": {\n                    \"description\": \"Integer representing the number of trial period days before the customer is charged for the first time. This will always overwrite any trials that might apply via a subscribed plan. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\",\n                    \"type\": \"integer\"\n                  },\n                  \"trial_settings\": {\n                    \"description\": \"Settings related to subscription trials.\",\n                    \"properties\": {\n                      \"end_behavior\": {\n                        \"properties\": {\n                          \"missing_payment_method\": {\n                            \"enum\": [\"cancel\", \"create_invoice\", \"pause\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"missing_payment_method\"],\n                        \"title\": \"end_behavior\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"end_behavior\"],\n                    \"title\": \"trial_settings_config\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"customer\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a subscription\"\n      }\n    },\n    \"/v1/subscriptions/search\": {\n      \"get\": {\n        \"description\": \"<p>Search for subscriptions you’ve previously created using Stripe’s <a href=\\\"/docs/search#search-query-language\\\">Search Query Language</a>.\\nDon’t use search in read-after-write flows where strict consistency is necessary. Under normal operating\\nconditions, data is searchable in less than a minute. Occasionally, propagation of new or updated data can be up\\nto an hour behind during outages. Search functionality is not available to merchants in India.</p>\",\n        \"operationId\": \"GetSubscriptionsSearch\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for pagination across multiple pages of results. Don't include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.\",\n            \"in\": \"query\",\n            \"name\": \"page\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The search query string. See [search query language](https://stripe.com/docs/search#search-query-language) and the list of supported [query fields for subscriptions](https://stripe.com/docs/search#query-fields-for-subscriptions).\",\n            \"in\": \"query\",\n            \"name\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/subscription\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"type\": \"boolean\"\n                    },\n                    \"next_page\": {\n                      \"maxLength\": 5000,\n                      \"nullable\": true,\n                      \"type\": \"string\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value.\",\n                      \"enum\": [\"search_result\"],\n                      \"type\": \"string\"\n                    },\n                    \"total_count\": {\n                      \"description\": \"The total number of objects that match the query, only accurate up to 10,000.\",\n                      \"type\": \"integer\"\n                    },\n                    \"url\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"SearchResult\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Search subscriptions\"\n      }\n    },\n    \"/v1/subscriptions/{subscription_exposed_id}\": {\n      \"delete\": {\n        \"description\": \"<p>Cancels a customer’s subscription immediately. The customer won’t be charged again for the subscription. After it’s canceled, you can no longer update the subscription or its <a href=\\\"/metadata\\\">metadata</a>.</p>\\n\\n<p>Any pending invoice items that you’ve created are still charged at the end of the period, unless manually <a href=\\\"#delete_invoiceitem\\\">deleted</a>. If you’ve set the subscription to cancel at the end of the period, any pending prorations are also left in place and collected at the end of the period. But if the subscription is set to cancel immediately, pending prorations are removed.</p>\\n\\n<p>By default, upon subscription cancellation, Stripe stops automatic collection of all finalized invoices for the customer. This is intended to prevent unexpected payment attempts after the customer has canceled a subscription. However, you can resume automatic collection of the invoices manually after subscription cancellation to have us proceed. Or, you could check for unpaid invoices before allowing the customer to cancel the subscription at all.</p>\",\n        \"operationId\": \"DeleteSubscriptionsSubscriptionExposedId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"cancellation_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"cancellation_details\": {\n                    \"description\": \"Details about why this subscription was cancelled\",\n                    \"properties\": {\n                      \"comment\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"feedback\": {\n                        \"enum\": [\n                          \"\",\n                          \"customer_service\",\n                          \"low_quality\",\n                          \"missing_features\",\n                          \"other\",\n                          \"switched_service\",\n                          \"too_complex\",\n                          \"too_expensive\",\n                          \"unused\"\n                        ],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"cancellation_details_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_now\": {\n                    \"description\": \"Will generate a final invoice that invoices for any un-invoiced metered usage and new/pending proration invoice items. Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"prorate\": {\n                    \"description\": \"Will generate a proration invoice item that credits remaining unused time until the subscription period end. Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a subscription\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the subscription with the given ID.</p>\",\n        \"operationId\": \"GetSubscriptionsSubscriptionExposedId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a subscription\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing subscription to match the specified parameters.\\nWhen changing prices or quantities, we optionally prorate the price we charge next month to make up for any price changes.\\nTo preview how the proration is calculated, use the <a href=\\\"/docs/api/invoices/create_preview\\\">create preview</a> endpoint.</p>\\n\\n<p>By default, we prorate subscription changes. For example, if a customer signs up on May 1 for a <currency>100</currency> price, they’ll be billed <currency>100</currency> immediately. If on May 15 they switch to a <currency>200</currency> price, then on June 1 they’ll be billed <currency>250</currency> (<currency>200</currency> for a renewal of her subscription, plus a <currency>50</currency> prorating adjustment for half of the previous month’s <currency>100</currency> difference). Similarly, a downgrade generates a credit that is applied to the next invoice. We also prorate when you make quantity changes.</p>\\n\\n<p>Switching prices does not normally change the billing date or generate an immediate charge unless:</p>\\n\\n<ul>\\n<li>The billing interval is changed (for example, from monthly to yearly).</li>\\n<li>The subscription moves from free to paid.</li>\\n<li>A trial starts or ends.</li>\\n</ul>\\n\\n<p>In these cases, we apply a credit for the unused time on the previous price, immediately charge the customer using the new price, and reset the billing date. Learn about how <a href=\\\"/docs/billing/subscriptions/upgrade-downgrade#immediate-payment\\\">Stripe immediately attempts payment for subscription changes</a>.</p>\\n\\n<p>If you want to charge for an upgrade immediately, pass <code>proration_behavior</code> as <code>always_invoice</code> to create prorations, automatically invoice the customer for those proration adjustments, and attempt to collect payment. If you pass <code>create_prorations</code>, the prorations are created but not automatically invoiced. If you want to bill the customer for the prorations before the subscription’s renewal date, you need to manually <a href=\\\"/docs/api/invoices/create\\\">invoice the customer</a>.</p>\\n\\n<p>If you don’t want to prorate, set the <code>proration_behavior</code> option to <code>none</code>. With this option, the customer is billed <currency>100</currency> on May 1 and <currency>200</currency> on June 1. Similarly, if you set <code>proration_behavior</code> to <code>none</code> when switching between different billing intervals (for example, from monthly to yearly), we don’t generate any credits for the old subscription’s unused time. We still reset the billing date and bill immediately for the new subscription.</p>\\n\\n<p>Updating the quantity on a subscription many times in an hour may result in <a href=\\\"/docs/rate-limits\\\">rate limiting</a>. If you need to bill for a frequently changing quantity, consider integrating <a href=\\\"/docs/billing/subscriptions/usage-based\\\">usage-based billing</a> instead.</p>\",\n        \"operationId\": \"PostSubscriptionsSubscriptionExposedId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"add_invoice_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"application_fee_percent\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"automatic_tax\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"billing_thresholds\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cancel_at\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cancellation_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_source\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"default_tax_rates\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"description\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"discounts\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"invoice_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"on_behalf_of\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pause_collection\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pending_invoice_item_interval\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"transfer_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_end\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"trial_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"add_invoice_items\": {\n                    \"description\": \"A list of prices and quantities that will generate invoice items appended to the next invoice for this subscription. You may pass up to 20 items.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"discounts\": {\n                          \"items\": {\n                            \"properties\": {\n                              \"coupon\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"discount\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"promotion_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"discounts_data_param\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": \"array\"\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\"],\n                          \"title\": \"one_time_price_data_with_negative_amounts\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"add_invoice_item_entry\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"application_fee_percent\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"number\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. The request must be made by a platform account on a connected account in order to set an application fee percentage. For more information, see the application fees [documentation](https://stripe.com/docs/connect/subscriptions#collecting-fees-on-subscriptions).\"\n                  },\n                  \"automatic_tax\": {\n                    \"description\": \"Automatic tax settings for this subscription. We recommend you only include this parameter when the existing value is being changed.\",\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"liability\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"enabled\"],\n                    \"title\": \"automatic_tax_config\",\n                    \"type\": \"object\"\n                  },\n                  \"billing_cycle_anchor\": {\n                    \"description\": \"Either `now` or `unchanged`. Setting the value to `now` resets the subscription's billing cycle anchor to the current time (in UTC). For more information, see the billing cycle [documentation](https://stripe.com/docs/billing/subscriptions/billing-cycle).\",\n                    \"enum\": [\"now\", \"unchanged\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"billing_thresholds\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount_gte\": {\n                            \"type\": \"integer\"\n                          },\n                          \"reset_billing_cycle_anchor\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"title\": \"billing_thresholds_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period. Pass an empty string to remove previously-defined thresholds.\"\n                  },\n                  \"cancel_at\": {\n                    \"anyOf\": [\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"A timestamp at which the subscription should cancel. If set to a date before the current period ends, this will cause a proration if prorations have been enabled using `proration_behavior`. If set during a future period, this will always cause a proration for that period.\"\n                  },\n                  \"cancel_at_period_end\": {\n                    \"description\": \"Indicate whether this subscription should cancel at the end of the current period (`current_period_end`). Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"cancellation_details\": {\n                    \"description\": \"Details about why this subscription was cancelled\",\n                    \"properties\": {\n                      \"comment\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"feedback\": {\n                        \"enum\": [\n                          \"\",\n                          \"customer_service\",\n                          \"low_quality\",\n                          \"missing_features\",\n                          \"other\",\n                          \"switched_service\",\n                          \"too_complex\",\n                          \"too_expensive\",\n                          \"unused\"\n                        ],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"cancellation_details_param\",\n                    \"type\": \"object\"\n                  },\n                  \"collection_method\": {\n                    \"description\": \"Either `charge_automatically`, or `send_invoice`. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as `active`. Defaults to `charge_automatically`.\",\n                    \"enum\": [\"charge_automatically\", \"send_invoice\"],\n                    \"type\": \"string\"\n                  },\n                  \"coupon\": {\n                    \"description\": \"The ID of the coupon to apply to this subscription. A coupon applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"days_until_due\": {\n                    \"description\": \"Number of days a customer has to pay invoices generated by this subscription. Valid only for subscriptions where `collection_method` is set to `send_invoice`.\",\n                    \"type\": \"integer\"\n                  },\n                  \"default_payment_method\": {\n                    \"description\": \"ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over `default_source`. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"default_source\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If `default_payment_method` is also set, `default_payment_method` will take precedence. If neither are set, invoices will use the customer's [invoice_settings.default_payment_method](https://stripe.com/docs/api/customers/object#customer_object-invoice_settings-default_payment_method) or [default_source](https://stripe.com/docs/api/customers/object#customer_object-default_source).\"\n                  },\n                  \"default_tax_rates\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The tax rates that will apply to any subscription item that does not have `tax_rates` set. Invoices created will have their `default_tax_rates` populated from the subscription. Pass an empty string to remove previously-defined tax rates.\"\n                  },\n                  \"description\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 500,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs.\"\n                  },\n                  \"discounts\": {\n                    \"anyOf\": [\n                      {\n                        \"items\": {\n                          \"properties\": {\n                            \"coupon\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"discount\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"promotion_code\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"title\": \"discounts_data_param\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The coupons to redeem into discounts for the subscription. If not specified or empty, inherits the discount from the subscription's customer.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"invoice_settings\": {\n                    \"description\": \"All invoices will be billed using the specified settings.\",\n                    \"properties\": {\n                      \"account_tax_ids\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"issuer\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\"account\", \"self\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"invoice_settings_param\",\n                    \"type\": \"object\"\n                  },\n                  \"items\": {\n                    \"description\": \"A list of up to 20 subscription items, each with an attached price.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"billing_thresholds\": {\n                          \"anyOf\": [\n                            {\n                              \"properties\": {\n                                \"usage_gte\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"usage_gte\"],\n                              \"title\": \"item_billing_thresholds_param\",\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"clear_usage\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"deleted\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"discounts\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"properties\": {\n                                  \"coupon\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"discount\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"promotion_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"discounts_data_param\",\n                                \"type\": \"object\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"id\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"metadata\": {\n                          \"anyOf\": [\n                            {\n                              \"additionalProperties\": {\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"object\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        },\n                        \"price\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"price_data\": {\n                          \"properties\": {\n                            \"currency\": {\n                              \"format\": \"currency\",\n                              \"type\": \"string\"\n                            },\n                            \"product\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"recurring\": {\n                              \"properties\": {\n                                \"interval\": {\n                                  \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                                  \"type\": \"string\"\n                                },\n                                \"interval_count\": {\n                                  \"type\": \"integer\"\n                                }\n                              },\n                              \"required\": [\"interval\"],\n                              \"title\": \"recurring_adhoc\",\n                              \"type\": \"object\"\n                            },\n                            \"tax_behavior\": {\n                              \"enum\": [\"exclusive\", \"inclusive\", \"unspecified\"],\n                              \"type\": \"string\"\n                            },\n                            \"unit_amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_amount_decimal\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"currency\", \"product\", \"recurring\"],\n                          \"title\": \"recurring_price_data\",\n                          \"type\": \"object\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"tax_rates\": {\n                          \"anyOf\": [\n                            {\n                              \"items\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"type\": \"array\"\n                            },\n                            {\n                              \"enum\": [\"\"],\n                              \"type\": \"string\"\n                            }\n                          ]\n                        }\n                      },\n                      \"title\": \"subscription_item_update_params\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"off_session\": {\n                    \"description\": \"Indicates if a customer is on or off-session while an invoice payment is attempted. Defaults to `false` (on-session).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"on_behalf_of\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The account on behalf of which to charge, for each of the subscription's invoices.\"\n                  },\n                  \"pause_collection\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"behavior\": {\n                            \"enum\": [\n                              \"keep_as_draft\",\n                              \"mark_uncollectible\",\n                              \"void\"\n                            ],\n                            \"type\": \"string\"\n                          },\n                          \"resumes_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"behavior\"],\n                        \"title\": \"pause_collection_param\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"If specified, payment collection for this subscription will be paused. Note that the subscription status will be unchanged and will not be updated to `paused`. Learn more about [pausing collection](https://stripe.com/docs/billing/subscriptions/pause-payment).\"\n                  },\n                  \"payment_behavior\": {\n                    \"description\": \"Use `allow_incomplete` to transition the subscription to `status=past_due` if a payment is required but cannot be paid. This allows you to manage scenarios where additional user actions are needed to pay a subscription's invoice. For example, SCA regulation may require 3DS authentication to complete payment. See the [SCA Migration Guide](https://stripe.com/docs/billing/migration/strong-customer-authentication) for Billing to learn more. This is the default behavior.\\n\\nUse `default_incomplete` to transition the subscription to `status=past_due` when payment is required and await explicit confirmation of the invoice's payment intent. This allows simpler management of scenarios where additional user actions are needed to pay a subscription’s invoice. Such as failed payments, [SCA regulation](https://stripe.com/docs/billing/migration/strong-customer-authentication), or collecting a mandate for a bank debit payment method.\\n\\nUse `pending_if_incomplete` to update the subscription using [pending updates](https://stripe.com/docs/billing/subscriptions/pending-updates). When you use `pending_if_incomplete` you can only pass the parameters [supported by pending updates](https://stripe.com/docs/billing/pending-updates-reference#supported-attributes).\\n\\nUse `error_if_incomplete` if you want Stripe to return an HTTP 402 status code if a subscription's invoice cannot be paid. For example, if a payment method requires 3DS authentication due to SCA regulation and further user action is needed, this parameter does not update the subscription and returns an error instead. This was the default behavior for API versions prior to 2019-03-14. See the [changelog](https://stripe.com/docs/upgrades#2019-03-14) to learn more.\",\n                    \"enum\": [\n                      \"allow_incomplete\",\n                      \"default_incomplete\",\n                      \"error_if_incomplete\",\n                      \"pending_if_incomplete\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"payment_settings\": {\n                    \"description\": \"Payment settings to pass to invoices created by the subscription.\",\n                    \"properties\": {\n                      \"payment_method_options\": {\n                        \"properties\": {\n                          \"acss_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"transaction_type\": {\n                                        \"enum\": [\"business\", \"personal\"],\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"bancontact\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"preferred_language\": {\n                                    \"enum\": [\"de\", \"en\", \"fr\", \"nl\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"card\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"mandate_options\": {\n                                    \"properties\": {\n                                      \"amount\": {\n                                        \"type\": \"integer\"\n                                      },\n                                      \"amount_type\": {\n                                        \"enum\": [\"fixed\", \"maximum\"],\n                                        \"type\": \"string\"\n                                      },\n                                      \"description\": {\n                                        \"maxLength\": 200,\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"mandate_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"network\": {\n                                    \"enum\": [\n                                      \"amex\",\n                                      \"cartes_bancaires\",\n                                      \"diners\",\n                                      \"discover\",\n                                      \"eftpos_au\",\n                                      \"girocard\",\n                                      \"interac\",\n                                      \"jcb\",\n                                      \"link\",\n                                      \"mastercard\",\n                                      \"unionpay\",\n                                      \"unknown\",\n                                      \"visa\"\n                                    ],\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  },\n                                  \"request_three_d_secure\": {\n                                    \"enum\": [\"any\", \"automatic\", \"challenge\"],\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"subscription_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"customer_balance\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"bank_transfer\": {\n                                    \"properties\": {\n                                      \"eu_bank_transfer\": {\n                                        \"properties\": {\n                                          \"country\": {\n                                            \"maxLength\": 5000,\n                                            \"type\": \"string\"\n                                          }\n                                        },\n                                        \"required\": [\"country\"],\n                                        \"title\": \"eu_bank_transfer_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"type\": {\n                                        \"type\": \"string\"\n                                      }\n                                    },\n                                    \"title\": \"bank_transfer_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"funding_type\": {\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"konbini\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"sepa_debit\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {},\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"us_bank_account\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"financial_connections\": {\n                                    \"properties\": {\n                                      \"filters\": {\n                                        \"properties\": {\n                                          \"account_subcategories\": {\n                                            \"items\": {\n                                              \"enum\": [\"checking\", \"savings\"],\n                                              \"type\": \"string\"\n                                            },\n                                            \"type\": \"array\"\n                                          }\n                                        },\n                                        \"title\": \"invoice_linked_account_options_filters_param\",\n                                        \"type\": \"object\"\n                                      },\n                                      \"permissions\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"payment_method\",\n                                            \"transactions\"\n                                          ],\n                                          \"maxLength\": 5000,\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      },\n                                      \"prefetch\": {\n                                        \"items\": {\n                                          \"enum\": [\n                                            \"balances\",\n                                            \"ownership\",\n                                            \"transactions\"\n                                          ],\n                                          \"type\": \"string\",\n                                          \"x-stripeBypassValidation\": true\n                                        },\n                                        \"type\": \"array\"\n                                      }\n                                    },\n                                    \"title\": \"invoice_linked_account_options_param\",\n                                    \"type\": \"object\"\n                                  },\n                                  \"verification_method\": {\n                                    \"enum\": [\n                                      \"automatic\",\n                                      \"instant\",\n                                      \"microdeposits\"\n                                    ],\n                                    \"type\": \"string\",\n                                    \"x-stripeBypassValidation\": true\n                                  }\n                                },\n                                \"title\": \"invoice_payment_method_options_param\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"payment_method_options\",\n                        \"type\": \"object\"\n                      },\n                      \"payment_method_types\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"enum\": [\n                                \"ach_credit_transfer\",\n                                \"ach_debit\",\n                                \"acss_debit\",\n                                \"amazon_pay\",\n                                \"au_becs_debit\",\n                                \"bacs_debit\",\n                                \"bancontact\",\n                                \"boleto\",\n                                \"card\",\n                                \"cashapp\",\n                                \"customer_balance\",\n                                \"eps\",\n                                \"fpx\",\n                                \"giropay\",\n                                \"grabpay\",\n                                \"ideal\",\n                                \"jp_credit_transfer\",\n                                \"kakao_pay\",\n                                \"konbini\",\n                                \"kr_card\",\n                                \"link\",\n                                \"multibanco\",\n                                \"naver_pay\",\n                                \"p24\",\n                                \"payco\",\n                                \"paynow\",\n                                \"paypal\",\n                                \"promptpay\",\n                                \"revolut_pay\",\n                                \"sepa_credit_transfer\",\n                                \"sepa_debit\",\n                                \"sofort\",\n                                \"swish\",\n                                \"us_bank_account\",\n                                \"wechat_pay\"\n                              ],\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"save_default_payment_method\": {\n                        \"enum\": [\"off\", \"on_subscription\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"payment_settings\",\n                    \"type\": \"object\"\n                  },\n                  \"pending_invoice_item_interval\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"interval\": {\n                            \"enum\": [\"day\", \"month\", \"week\", \"year\"],\n                            \"type\": \"string\"\n                          },\n                          \"interval_count\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"interval\"],\n                        \"title\": \"pending_invoice_item_interval_params\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling [Create an invoice](https://stripe.com/docs/api#create_invoice) for the given subscription at the specified interval.\"\n                  },\n                  \"promotion_code\": {\n                    \"description\": \"The promotion code to apply to this subscription. A promotion code applied to a subscription will only affect invoices created for that particular subscription. This field has been deprecated and will be removed in a future API version. Use `discounts` instead.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"proration_date\": {\n                    \"description\": \"If set, the proration will be calculated as though the subscription was updated at the given time. This can be used to apply exactly the same proration that was previewed with [upcoming invoice](https://stripe.com/docs/api#upcoming_invoice) endpoint. It can also be used to implement custom proration logic, such as prorating by day instead of by second, by providing the time that you wish to use for proration calculations.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"transfer_data\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"amount_percent\": {\n                            \"type\": \"number\"\n                          },\n                          \"destination\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"destination\"],\n                        \"title\": \"transfer_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"If specified, the funds from the subscription's invoices will be transferred to the destination and the ID of the resulting transfers will be found on the resulting charges. This will be unset if you POST an empty value.\"\n                  },\n                  \"trial_end\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    ],\n                    \"description\": \"Unix timestamp representing the end of the trial period the customer will get before being charged for the first time. This will always overwrite any trials that might apply via a subscribed plan. If set, trial_end will override the default trial period of the plan the customer is being subscribed to. The special value `now` can be provided to end the customer's trial immediately. Can be at most two years from `billing_cycle_anchor`.\"\n                  },\n                  \"trial_from_plan\": {\n                    \"description\": \"Indicates if a plan's `trial_period_days` should be applied to the subscription. Setting `trial_end` per subscription is preferred, and this defaults to `false`. Setting this flag to `true` together with `trial_end` is not allowed. See [Using trial periods on subscriptions](https://stripe.com/docs/billing/subscriptions/trials) to learn more.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"trial_settings\": {\n                    \"description\": \"Settings related to subscription trials.\",\n                    \"properties\": {\n                      \"end_behavior\": {\n                        \"properties\": {\n                          \"missing_payment_method\": {\n                            \"enum\": [\"cancel\", \"create_invoice\", \"pause\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"missing_payment_method\"],\n                        \"title\": \"end_behavior\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"end_behavior\"],\n                    \"title\": \"trial_settings_config\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a subscription\"\n      }\n    },\n    \"/v1/subscriptions/{subscription_exposed_id}/discount\": {\n      \"delete\": {\n        \"description\": \"<p>Removes the currently applied discount on a subscription.</p>\",\n        \"operationId\": \"DeleteSubscriptionsSubscriptionExposedIdDiscount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription_exposed_id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_discount\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a subscription discount\"\n      }\n    },\n    \"/v1/subscriptions/{subscription}/resume\": {\n      \"post\": {\n        \"description\": \"<p>Initiates resumption of a paused subscription, optionally resetting the billing cycle anchor and creating prorations. If a resumption invoice is generated, it must be paid or marked uncollectible before the subscription will be unpaused. If payment succeeds the subscription will become <code>active</code>, and if payment fails the subscription will be <code>past_due</code>. The resumption invoice will void automatically if not paid by the expiration date.</p>\",\n        \"operationId\": \"PostSubscriptionsSubscriptionResume\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"subscription\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"billing_cycle_anchor\": {\n                    \"description\": \"The billing cycle anchor that applies when the subscription is resumed. Either `now` or `unchanged`. The default is `now`. For more information, see the billing cycle [documentation](https://stripe.com/docs/billing/subscriptions/billing-cycle).\",\n                    \"enum\": [\"now\", \"unchanged\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"proration_behavior\": {\n                    \"description\": \"Determines how to handle [prorations](https://stripe.com/docs/billing/subscriptions/prorations) when the billing cycle changes (e.g., when switching plans, resetting `billing_cycle_anchor=now`, or starting a trial), or if an item's `quantity` changes. The default value is `create_prorations`.\",\n                    \"enum\": [\"always_invoice\", \"create_prorations\", \"none\"],\n                    \"type\": \"string\"\n                  },\n                  \"proration_date\": {\n                    \"description\": \"If set, the proration will be calculated as though the subscription was resumed at the given time. This can be used to apply exactly the same proration that was previewed with [upcoming invoice](https://stripe.com/docs/api#retrieve_customer_invoice) endpoint.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/subscription\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Resume a subscription\"\n      }\n    },\n    \"/v1/tax/calculations\": {\n      \"post\": {\n        \"description\": \"<p>Calculates tax based on the input and returns a Tax <code>Calculation</code> object.</p>\",\n        \"operationId\": \"PostTaxCalculations\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"customer_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"line_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"ship_from_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_cost\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"The ID of an existing customer to use for this calculation. If provided, the customer's address and tax IDs are copied to `customer_details`.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"customer_details\": {\n                    \"description\": \"Details about the customer, including address and tax IDs.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"line2\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"postal_code\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"state\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"postal_address\",\n                        \"type\": \"object\"\n                      },\n                      \"address_source\": {\n                        \"enum\": [\"billing\", \"shipping\"],\n                        \"type\": \"string\"\n                      },\n                      \"ip_address\": {\n                        \"type\": \"string\"\n                      },\n                      \"tax_ids\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"type\": {\n                              \"enum\": [\n                                \"ad_nrt\",\n                                \"ae_trn\",\n                                \"al_tin\",\n                                \"am_tin\",\n                                \"ao_tin\",\n                                \"ar_cuit\",\n                                \"au_abn\",\n                                \"au_arn\",\n                                \"ba_tin\",\n                                \"bb_tin\",\n                                \"bg_uic\",\n                                \"bh_vat\",\n                                \"bo_tin\",\n                                \"br_cnpj\",\n                                \"br_cpf\",\n                                \"bs_tin\",\n                                \"by_tin\",\n                                \"ca_bn\",\n                                \"ca_gst_hst\",\n                                \"ca_pst_bc\",\n                                \"ca_pst_mb\",\n                                \"ca_pst_sk\",\n                                \"ca_qst\",\n                                \"cd_nif\",\n                                \"ch_uid\",\n                                \"ch_vat\",\n                                \"cl_tin\",\n                                \"cn_tin\",\n                                \"co_nit\",\n                                \"cr_tin\",\n                                \"de_stn\",\n                                \"do_rcn\",\n                                \"ec_ruc\",\n                                \"eg_tin\",\n                                \"es_cif\",\n                                \"eu_oss_vat\",\n                                \"eu_vat\",\n                                \"gb_vat\",\n                                \"ge_vat\",\n                                \"gn_nif\",\n                                \"hk_br\",\n                                \"hr_oib\",\n                                \"hu_tin\",\n                                \"id_npwp\",\n                                \"il_vat\",\n                                \"in_gst\",\n                                \"is_vat\",\n                                \"jp_cn\",\n                                \"jp_rn\",\n                                \"jp_trn\",\n                                \"ke_pin\",\n                                \"kh_tin\",\n                                \"kr_brn\",\n                                \"kz_bin\",\n                                \"li_uid\",\n                                \"li_vat\",\n                                \"ma_vat\",\n                                \"md_vat\",\n                                \"me_pib\",\n                                \"mk_vat\",\n                                \"mr_nif\",\n                                \"mx_rfc\",\n                                \"my_frp\",\n                                \"my_itn\",\n                                \"my_sst\",\n                                \"ng_tin\",\n                                \"no_vat\",\n                                \"no_voec\",\n                                \"np_pan\",\n                                \"nz_gst\",\n                                \"om_vat\",\n                                \"pe_ruc\",\n                                \"ph_tin\",\n                                \"ro_tin\",\n                                \"rs_pib\",\n                                \"ru_inn\",\n                                \"ru_kpp\",\n                                \"sa_vat\",\n                                \"sg_gst\",\n                                \"sg_uen\",\n                                \"si_tin\",\n                                \"sn_ninea\",\n                                \"sr_fin\",\n                                \"sv_nit\",\n                                \"th_vat\",\n                                \"tj_tin\",\n                                \"tr_tin\",\n                                \"tw_vat\",\n                                \"tz_vat\",\n                                \"ua_vat\",\n                                \"ug_tin\",\n                                \"us_ein\",\n                                \"uy_ruc\",\n                                \"uz_tin\",\n                                \"uz_vat\",\n                                \"ve_rif\",\n                                \"vn_tin\",\n                                \"za_vat\",\n                                \"zm_tin\",\n                                \"zw_tin\"\n                              ],\n                              \"maxLength\": 5000,\n                              \"type\": \"string\",\n                              \"x-stripeBypassValidation\": true\n                            },\n                            \"value\": {\n                              \"type\": \"string\"\n                            }\n                          },\n                          \"required\": [\"type\", \"value\"],\n                          \"title\": \"data_params\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"taxability_override\": {\n                        \"enum\": [\"customer_exempt\", \"none\", \"reverse_charge\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"customer_details\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"line_items\": {\n                    \"description\": \"A list of items the customer is purchasing.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"product\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"reference\": {\n                          \"maxLength\": 500,\n                          \"type\": \"string\"\n                        },\n                        \"tax_behavior\": {\n                          \"enum\": [\"exclusive\", \"inclusive\"],\n                          \"type\": \"string\"\n                        },\n                        \"tax_code\": {\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"amount\"],\n                      \"title\": \"calculation_line_item\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"ship_from_details\": {\n                    \"description\": \"Details about the address from which the goods are being shipped.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"line2\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"postal_code\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"state\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"merchant_postal_address\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"address\"],\n                    \"title\": \"ship_from_details\",\n                    \"type\": \"object\"\n                  },\n                  \"shipping_cost\": {\n                    \"description\": \"Shipping cost details to be used for the calculation.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"shipping_rate\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"tax_behavior\": {\n                        \"enum\": [\"exclusive\", \"inclusive\"],\n                        \"type\": \"string\"\n                      },\n                      \"tax_code\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"shipping_cost\",\n                    \"type\": \"object\"\n                  },\n                  \"tax_date\": {\n                    \"description\": \"Timestamp of date at which the tax rules and rates in effect applies for the calculation. Measured in seconds since the Unix epoch. Can be up to 48 hours in the past, and up to 48 hours in the future.\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"required\": [\"currency\", \"line_items\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.calculation\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Tax Calculation\"\n      }\n    },\n    \"/v1/tax/calculations/{calculation}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a Tax <code>Calculation</code> object, if the calculation hasn’t expired.</p>\",\n        \"operationId\": \"GetTaxCalculationsCalculation\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"calculation\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.calculation\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Tax Calculation\"\n      }\n    },\n    \"/v1/tax/calculations/{calculation}/line_items\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the line items of a tax calculation as a collection, if the calculation hasn’t expired.</p>\",\n        \"operationId\": \"GetTaxCalculationsCalculationLineItems\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"calculation\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/tax.calculation_line_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/tax/calculations/[^/]+/line_items\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TaxProductResourceTaxCalculationLineItemList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a calculation's line items\"\n      }\n    },\n    \"/v1/tax/registrations\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of Tax <code>Registration</code> objects.</p>\",\n        \"operationId\": \"GetTaxRegistrations\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The status of the Tax Registration.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"active\", \"all\", \"expired\", \"scheduled\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/tax.registration\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/tax/registrations\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TaxProductRegistrationsResourceTaxRegistrationList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List registrations\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new Tax <code>Registration</code> object.</p>\",\n        \"operationId\": \"PostTaxRegistrations\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"active_from\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"country_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active_from\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    ],\n                    \"description\": \"Time at which the Tax Registration becomes active. It can be either `now` to indicate the current time, or a future timestamp measured in seconds since the Unix epoch.\"\n                  },\n                  \"country\": {\n                    \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"country_options\": {\n                    \"description\": \"Specific options for a registration in the specified `country`.\",\n                    \"properties\": {\n                      \"ae\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"al\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"am\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"ao\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"at\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"au\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"ba\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"bb\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"be\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"bg\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"bh\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"bs\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"by\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"ca\": {\n                        \"properties\": {\n                          \"province_standard\": {\n                            \"properties\": {\n                              \"province\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"province\"],\n                            \"title\": \"province_standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"province_standard\",\n                              \"simplified\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"canada\",\n                        \"type\": \"object\"\n                      },\n                      \"cd\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"ch\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"cl\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"co\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"cr\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"cy\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"cz\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"de\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"dk\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"ec\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"ee\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"eg\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"es\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"fi\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"fr\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"gb\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"ge\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"gn\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"gr\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"hr\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"hu\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"id\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"ie\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"is\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"it\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"jp\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"ke\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"kh\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"kr\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"kz\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"lt\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"lu\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"lv\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"ma\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"md\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"me\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"mk\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"mr\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"mt\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"mx\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"my\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"ng\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"nl\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"no\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"np\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"nz\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"om\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"pe\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"pl\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"pt\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"ro\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"rs\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"ru\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"sa\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"se\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"sg\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"si\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"sk\": {\n                        \"properties\": {\n                          \"standard\": {\n                            \"properties\": {\n                              \"place_of_supply_scheme\": {\n                                \"enum\": [\"small_seller\", \"standard\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"place_of_supply_scheme\"],\n                            \"title\": \"standard\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"ioss\",\n                              \"oss_non_union\",\n                              \"oss_union\",\n                              \"standard\"\n                            ],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"europe\",\n                        \"type\": \"object\"\n                      },\n                      \"sn\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"sr\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"th\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"tj\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"tr\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"tz\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"ug\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"us\": {\n                        \"properties\": {\n                          \"local_amusement_tax\": {\n                            \"properties\": {\n                              \"jurisdiction\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"jurisdiction\"],\n                            \"title\": \"local_amusement_tax\",\n                            \"type\": \"object\"\n                          },\n                          \"local_lease_tax\": {\n                            \"properties\": {\n                              \"jurisdiction\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"jurisdiction\"],\n                            \"title\": \"local_lease_tax\",\n                            \"type\": \"object\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state_sales_tax\": {\n                            \"properties\": {\n                              \"elections\": {\n                                \"items\": {\n                                  \"properties\": {\n                                    \"jurisdiction\": {\n                                      \"maxLength\": 5000,\n                                      \"type\": \"string\"\n                                    },\n                                    \"type\": {\n                                      \"enum\": [\n                                        \"local_use_tax\",\n                                        \"simplified_sellers_use_tax\",\n                                        \"single_local_use_tax\"\n                                      ],\n                                      \"type\": \"string\"\n                                    }\n                                  },\n                                  \"required\": [\"type\"],\n                                  \"title\": \"state_sales_tax_election\",\n                                  \"type\": \"object\"\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"required\": [\"elections\"],\n                            \"title\": \"state_sales_tax\",\n                            \"type\": \"object\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"local_amusement_tax\",\n                              \"local_lease_tax\",\n                              \"state_communications_tax\",\n                              \"state_retail_delivery_fee\",\n                              \"state_sales_tax\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"state\", \"type\"],\n                        \"title\": \"united_states\",\n                        \"type\": \"object\"\n                      },\n                      \"uy\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"uz\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"vn\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"za\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      },\n                      \"zm\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"simplified\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"simplified\",\n                        \"type\": \"object\"\n                      },\n                      \"zw\": {\n                        \"properties\": {\n                          \"type\": {\n                            \"enum\": [\"standard\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\"],\n                        \"title\": \"default\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"country_options\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"description\": \"If set, the Tax Registration stops being active at this time. If not set, the Tax Registration will be active indefinitely. Timestamp measured in seconds since the Unix epoch.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"required\": [\"active_from\", \"country\", \"country_options\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.registration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a registration\"\n      }\n    },\n    \"/v1/tax/registrations/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Returns a Tax <code>Registration</code> object.</p>\",\n        \"operationId\": \"GetTaxRegistrationsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.registration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a registration\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing Tax <code>Registration</code> object.</p>\\n\\n<p>A registration cannot be deleted after it has been created. If you wish to end a registration you may do so by setting <code>expires_at</code>.</p>\",\n        \"operationId\": \"PostTaxRegistrationsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"active_from\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expires_at\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active_from\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      }\n                    ],\n                    \"description\": \"Time at which the registration becomes active. It can be either `now` to indicate the current time, or a timestamp measured in seconds since the Unix epoch.\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expires_at\": {\n                    \"anyOf\": [\n                      {\n                        \"enum\": [\"now\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"format\": \"unix-time\",\n                        \"type\": \"integer\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"If set, the registration stops being active at this time. If not set, the registration will be active indefinitely. It can be either `now` to indicate the current time, or a timestamp measured in seconds since the Unix epoch.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.registration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a registration\"\n      }\n    },\n    \"/v1/tax/settings\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves Tax <code>Settings</code> for a merchant.</p>\",\n        \"operationId\": \"GetTaxSettings\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.settings\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve settings\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates Tax <code>Settings</code> parameters used in tax calculations. All parameters are editable but none can be removed once set.</p>\",\n        \"operationId\": \"PostTaxSettings\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"defaults\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"head_office\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"defaults\": {\n                    \"description\": \"Default configuration to be used on Stripe Tax calculations.\",\n                    \"properties\": {\n                      \"tax_behavior\": {\n                        \"enum\": [\n                          \"exclusive\",\n                          \"inclusive\",\n                          \"inferred_by_currency\"\n                        ],\n                        \"type\": \"string\"\n                      },\n                      \"tax_code\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"defaults_param\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"head_office\": {\n                    \"description\": \"The place where your business is located.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"validated_country_address\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"address\"],\n                    \"title\": \"head_office_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.settings\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update settings\"\n      }\n    },\n    \"/v1/tax/transactions/create_from_calculation\": {\n      \"post\": {\n        \"description\": \"<p>Creates a Tax Transaction from a calculation, if that calculation hasn’t expired. Calculations expire after 90 days.</p>\",\n        \"operationId\": \"PostTaxTransactionsCreateFromCalculation\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"calculation\": {\n                    \"description\": \"Tax Calculation ID to be used as input when creating the transaction.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"posted_at\": {\n                    \"description\": \"The Unix timestamp representing when the tax liability is assumed or reduced, which determines the liability posting period and handling in tax liability reports. The timestamp must fall within the `tax_date` and the current time, unless the `tax_date` is scheduled in advance. Defaults to the current time.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"reference\": {\n                    \"description\": \"A custom order or sale identifier, such as 'myOrder_123'. Must be unique across all transactions, including reversals.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"calculation\", \"reference\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a transaction from a calculation\"\n      }\n    },\n    \"/v1/tax/transactions/create_reversal\": {\n      \"post\": {\n        \"description\": \"<p>Partially or fully reverses a previously created <code>Transaction</code>.</p>\",\n        \"operationId\": \"PostTaxTransactionsCreateReversal\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"line_items\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping_cost\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"flat_amount\": {\n                    \"description\": \"A flat amount to reverse across the entire transaction, in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) in negative. This value represents the total amount to refund from the transaction, including taxes.\",\n                    \"type\": \"integer\"\n                  },\n                  \"line_items\": {\n                    \"description\": \"The line item amounts to reverse.\",\n                    \"items\": {\n                      \"properties\": {\n                        \"amount\": {\n                          \"type\": \"integer\"\n                        },\n                        \"amount_tax\": {\n                          \"type\": \"integer\"\n                        },\n                        \"metadata\": {\n                          \"additionalProperties\": {\n                            \"type\": \"string\"\n                          },\n                          \"type\": \"object\"\n                        },\n                        \"original_line_item\": {\n                          \"maxLength\": 5000,\n                          \"type\": \"string\"\n                        },\n                        \"quantity\": {\n                          \"type\": \"integer\"\n                        },\n                        \"reference\": {\n                          \"maxLength\": 500,\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\n                        \"amount\",\n                        \"amount_tax\",\n                        \"original_line_item\",\n                        \"reference\"\n                      ],\n                      \"title\": \"transaction_line_item_reversal\",\n                      \"type\": \"object\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"mode\": {\n                    \"description\": \"If `partial`, the provided line item or shipping cost amounts are reversed. If `full`, the original transaction is fully reversed.\",\n                    \"enum\": [\"full\", \"partial\"],\n                    \"type\": \"string\"\n                  },\n                  \"original_transaction\": {\n                    \"description\": \"The ID of the Transaction to partially or fully reverse.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"reference\": {\n                    \"description\": \"A custom identifier for this reversal, such as `myOrder_123-refund_1`, which must be unique across all transactions. The reference helps identify this reversal transaction in exported [tax reports](https://stripe.com/docs/tax/reports).\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"shipping_cost\": {\n                    \"description\": \"The shipping cost to reverse.\",\n                    \"properties\": {\n                      \"amount\": {\n                        \"type\": \"integer\"\n                      },\n                      \"amount_tax\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"amount\", \"amount_tax\"],\n                    \"title\": \"transaction_shipping_cost_reversal\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"mode\", \"original_transaction\", \"reference\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a reversal transaction\"\n      }\n    },\n    \"/v1/tax/transactions/{transaction}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a Tax <code>Transaction</code> object.</p>\",\n        \"operationId\": \"GetTaxTransactionsTransaction\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a transaction\"\n      }\n    },\n    \"/v1/tax/transactions/{transaction}/line_items\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the line items of a committed standalone transaction as a collection.</p>\",\n        \"operationId\": \"GetTaxTransactionsTransactionLineItems\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 500,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/tax.transaction_line_item\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/tax/transactions/[^/]+/line_items\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TaxProductResourceTaxTransactionLineItemList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a transaction's line items\"\n      }\n    },\n    \"/v1/tax_codes\": {\n      \"get\": {\n        \"description\": \"<p>A list of <a href=\\\"https://stripe.com/docs/tax/tax-categories\\\">all tax codes available</a> to add to Products in order to allow specific tax calculations.</p>\",\n        \"operationId\": \"GetTaxCodes\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/tax_code\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TaxProductResourceTaxCodeList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all tax codes\"\n      }\n    },\n    \"/v1/tax_codes/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing tax code. Supply the unique tax code ID and Stripe will return the corresponding tax code information.</p>\",\n        \"operationId\": \"GetTaxCodesId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_code\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a tax code\"\n      }\n    },\n    \"/v1/tax_ids\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of tax IDs.</p>\",\n        \"operationId\": \"GetTaxIds\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The account or customer the tax ID belongs to. Defaults to `owner[type]=self`.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"owner\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"account\": {\n                  \"type\": \"string\"\n                },\n                \"customer\": {\n                  \"maxLength\": 5000,\n                  \"type\": \"string\"\n                },\n                \"type\": {\n                  \"enum\": [\"account\", \"application\", \"customer\", \"self\"],\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"type\"],\n              \"title\": \"owner_params\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/tax_id\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TaxIDsList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all tax IDs\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new account or customer <code>tax_id</code> object.</p>\",\n        \"operationId\": \"PostTaxIds\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"owner\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"owner\": {\n                    \"description\": \"The account or customer the tax ID belongs to. Defaults to `owner[type]=self`.\",\n                    \"properties\": {\n                      \"account\": {\n                        \"type\": \"string\"\n                      },\n                      \"customer\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"account\", \"application\", \"customer\", \"self\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"owner_params\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": {\n                    \"description\": \"Type of the tax ID, one of `ad_nrt`, `ae_trn`, `al_tin`, `am_tin`, `ao_tin`, `ar_cuit`, `au_abn`, `au_arn`, `ba_tin`, `bb_tin`, `bg_uic`, `bh_vat`, `bo_tin`, `br_cnpj`, `br_cpf`, `bs_tin`, `by_tin`, `ca_bn`, `ca_gst_hst`, `ca_pst_bc`, `ca_pst_mb`, `ca_pst_sk`, `ca_qst`, `cd_nif`, `ch_uid`, `ch_vat`, `cl_tin`, `cn_tin`, `co_nit`, `cr_tin`, `de_stn`, `do_rcn`, `ec_ruc`, `eg_tin`, `es_cif`, `eu_oss_vat`, `eu_vat`, `gb_vat`, `ge_vat`, `gn_nif`, `hk_br`, `hr_oib`, `hu_tin`, `id_npwp`, `il_vat`, `in_gst`, `is_vat`, `jp_cn`, `jp_rn`, `jp_trn`, `ke_pin`, `kh_tin`, `kr_brn`, `kz_bin`, `li_uid`, `li_vat`, `ma_vat`, `md_vat`, `me_pib`, `mk_vat`, `mr_nif`, `mx_rfc`, `my_frp`, `my_itn`, `my_sst`, `ng_tin`, `no_vat`, `no_voec`, `np_pan`, `nz_gst`, `om_vat`, `pe_ruc`, `ph_tin`, `ro_tin`, `rs_pib`, `ru_inn`, `ru_kpp`, `sa_vat`, `sg_gst`, `sg_uen`, `si_tin`, `sn_ninea`, `sr_fin`, `sv_nit`, `th_vat`, `tj_tin`, `tr_tin`, `tw_vat`, `tz_vat`, `ua_vat`, `ug_tin`, `us_ein`, `uy_ruc`, `uz_tin`, `uz_vat`, `ve_rif`, `vn_tin`, `za_vat`, `zm_tin`, or `zw_tin`\",\n                    \"enum\": [\n                      \"ad_nrt\",\n                      \"ae_trn\",\n                      \"al_tin\",\n                      \"am_tin\",\n                      \"ao_tin\",\n                      \"ar_cuit\",\n                      \"au_abn\",\n                      \"au_arn\",\n                      \"ba_tin\",\n                      \"bb_tin\",\n                      \"bg_uic\",\n                      \"bh_vat\",\n                      \"bo_tin\",\n                      \"br_cnpj\",\n                      \"br_cpf\",\n                      \"bs_tin\",\n                      \"by_tin\",\n                      \"ca_bn\",\n                      \"ca_gst_hst\",\n                      \"ca_pst_bc\",\n                      \"ca_pst_mb\",\n                      \"ca_pst_sk\",\n                      \"ca_qst\",\n                      \"cd_nif\",\n                      \"ch_uid\",\n                      \"ch_vat\",\n                      \"cl_tin\",\n                      \"cn_tin\",\n                      \"co_nit\",\n                      \"cr_tin\",\n                      \"de_stn\",\n                      \"do_rcn\",\n                      \"ec_ruc\",\n                      \"eg_tin\",\n                      \"es_cif\",\n                      \"eu_oss_vat\",\n                      \"eu_vat\",\n                      \"gb_vat\",\n                      \"ge_vat\",\n                      \"gn_nif\",\n                      \"hk_br\",\n                      \"hr_oib\",\n                      \"hu_tin\",\n                      \"id_npwp\",\n                      \"il_vat\",\n                      \"in_gst\",\n                      \"is_vat\",\n                      \"jp_cn\",\n                      \"jp_rn\",\n                      \"jp_trn\",\n                      \"ke_pin\",\n                      \"kh_tin\",\n                      \"kr_brn\",\n                      \"kz_bin\",\n                      \"li_uid\",\n                      \"li_vat\",\n                      \"ma_vat\",\n                      \"md_vat\",\n                      \"me_pib\",\n                      \"mk_vat\",\n                      \"mr_nif\",\n                      \"mx_rfc\",\n                      \"my_frp\",\n                      \"my_itn\",\n                      \"my_sst\",\n                      \"ng_tin\",\n                      \"no_vat\",\n                      \"no_voec\",\n                      \"np_pan\",\n                      \"nz_gst\",\n                      \"om_vat\",\n                      \"pe_ruc\",\n                      \"ph_tin\",\n                      \"ro_tin\",\n                      \"rs_pib\",\n                      \"ru_inn\",\n                      \"ru_kpp\",\n                      \"sa_vat\",\n                      \"sg_gst\",\n                      \"sg_uen\",\n                      \"si_tin\",\n                      \"sn_ninea\",\n                      \"sr_fin\",\n                      \"sv_nit\",\n                      \"th_vat\",\n                      \"tj_tin\",\n                      \"tr_tin\",\n                      \"tw_vat\",\n                      \"tz_vat\",\n                      \"ua_vat\",\n                      \"ug_tin\",\n                      \"us_ein\",\n                      \"uy_ruc\",\n                      \"uz_tin\",\n                      \"uz_vat\",\n                      \"ve_rif\",\n                      \"vn_tin\",\n                      \"za_vat\",\n                      \"zm_tin\",\n                      \"zw_tin\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"value\": {\n                    \"description\": \"Value of the tax ID.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"value\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a tax ID\"\n      }\n    },\n    \"/v1/tax_ids/{id}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes an existing account or customer <code>tax_id</code> object.</p>\",\n        \"operationId\": \"DeleteTaxIdsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_tax_id\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a tax ID\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves an account or customer <code>tax_id</code> object.</p>\",\n        \"operationId\": \"GetTaxIdsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_id\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a tax ID\"\n      }\n    },\n    \"/v1/tax_rates\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your tax rates. Tax rates are returned sorted by creation date, with the most recently created tax rates appearing first.</p>\",\n        \"operationId\": \"GetTaxRates\",\n        \"parameters\": [\n          {\n            \"description\": \"Optional flag to filter by tax rates that are either active or inactive (archived).\",\n            \"in\": \"query\",\n            \"name\": \"active\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Optional range for filtering created date.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Optional flag to filter by tax rates that are inclusive (or those that are not inclusive).\",\n            \"in\": \"query\",\n            \"name\": \"inclusive\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/tax_rate\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/tax_rates\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TaxRatesList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all tax rates\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new tax rate.</p>\",\n        \"operationId\": \"PostTaxRates\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Flag determining whether the tax rate is active or inactive (archived). Inactive tax rates cannot be used with new applications or Checkout Sessions, but will still work for subscriptions and invoices that already have it set.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"country\": {\n                    \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the tax rate for your internal use only. It will not be visible to your customers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"display_name\": {\n                    \"description\": \"The display name of the tax rate, which will be shown to users.\",\n                    \"maxLength\": 50,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"inclusive\": {\n                    \"description\": \"This specifies if the tax rate is inclusive or exclusive.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"jurisdiction\": {\n                    \"description\": \"The jurisdiction for the tax rate. You can use this label field for tax reporting purposes. It also appears on your customer’s invoice.\",\n                    \"maxLength\": 50,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"percentage\": {\n                    \"description\": \"This represents the tax rate percent out of 100.\",\n                    \"type\": \"number\"\n                  },\n                  \"state\": {\n                    \"description\": \"[ISO 3166-2 subdivision code](https://en.wikipedia.org/wiki/ISO_3166-2), without country prefix. For example, \\\"NY\\\" for New York, United States.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"tax_type\": {\n                    \"description\": \"The high-level tax type, such as `vat` or `sales_tax`.\",\n                    \"enum\": [\n                      \"amusement_tax\",\n                      \"communications_tax\",\n                      \"gst\",\n                      \"hst\",\n                      \"igst\",\n                      \"jct\",\n                      \"lease_tax\",\n                      \"pst\",\n                      \"qst\",\n                      \"retail_delivery_fee\",\n                      \"rst\",\n                      \"sales_tax\",\n                      \"service_tax\",\n                      \"vat\"\n                    ],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"required\": [\"display_name\", \"inclusive\", \"percentage\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_rate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a tax rate\"\n      }\n    },\n    \"/v1/tax_rates/{tax_rate}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a tax rate with the given ID</p>\",\n        \"operationId\": \"GetTaxRatesTaxRate\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"tax_rate\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_rate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a tax rate\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates an existing tax rate.</p>\",\n        \"operationId\": \"PostTaxRatesTaxRate\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"tax_rate\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"active\": {\n                    \"description\": \"Flag determining whether the tax rate is active or inactive (archived). Inactive tax rates cannot be used with new applications or Checkout Sessions, but will still work for subscriptions and invoices that already have it set.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"country\": {\n                    \"description\": \"Two-letter country code ([ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the tax rate for your internal use only. It will not be visible to your customers.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"display_name\": {\n                    \"description\": \"The display name of the tax rate, which will be shown to users.\",\n                    \"maxLength\": 50,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"jurisdiction\": {\n                    \"description\": \"The jurisdiction for the tax rate. You can use this label field for tax reporting purposes. It also appears on your customer’s invoice.\",\n                    \"maxLength\": 50,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"state\": {\n                    \"description\": \"[ISO 3166-2 subdivision code](https://en.wikipedia.org/wiki/ISO_3166-2), without country prefix. For example, \\\"NY\\\" for New York, United States.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"tax_type\": {\n                    \"description\": \"The high-level tax type, such as `vat` or `sales_tax`.\",\n                    \"enum\": [\n                      \"amusement_tax\",\n                      \"communications_tax\",\n                      \"gst\",\n                      \"hst\",\n                      \"igst\",\n                      \"jct\",\n                      \"lease_tax\",\n                      \"pst\",\n                      \"qst\",\n                      \"retail_delivery_fee\",\n                      \"rst\",\n                      \"sales_tax\",\n                      \"service_tax\",\n                      \"vat\"\n                    ],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/tax_rate\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a tax rate\"\n      }\n    },\n    \"/v1/terminal/configurations\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of <code>Configuration</code> objects.</p>\",\n        \"operationId\": \"GetTerminalConfigurations\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"if present, only return the account default or non-default configurations.\",\n            \"in\": \"query\",\n            \"name\": \"is_account_default\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"boolean\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/terminal.configuration\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/terminal/configurations\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TerminalConfigurationConfigurationList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Configurations\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new <code>Configuration</code> object.</p>\",\n        \"operationId\": \"PostTerminalConfigurations\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bbpos_wisepos_e\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"offline\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"reboot_window\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"stripe_s700\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"verifone_p400\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"bbpos_wisepos_e\": {\n                    \"description\": \"An object containing device type specific settings for BBPOS WisePOS E readers\",\n                    \"properties\": {\n                      \"splashscreen\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"bbpos_wise_pose\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"name\": {\n                    \"description\": \"Name of the configuration\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"offline\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"offline\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Configurations for collecting transactions offline.\"\n                  },\n                  \"reboot_window\": {\n                    \"description\": \"Reboot time settings for readers that support customized reboot time configuration.\",\n                    \"properties\": {\n                      \"end_hour\": {\n                        \"type\": \"integer\"\n                      },\n                      \"start_hour\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"end_hour\", \"start_hour\"],\n                    \"title\": \"reboot_window\",\n                    \"type\": \"object\"\n                  },\n                  \"stripe_s700\": {\n                    \"description\": \"An object containing device type specific settings for Stripe S700 readers\",\n                    \"properties\": {\n                      \"splashscreen\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"stripe_s700\",\n                    \"type\": \"object\"\n                  },\n                  \"tipping\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"aud\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"cad\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"chf\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"czk\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"dkk\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"eur\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"gbp\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"hkd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"jpy\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"myr\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"nok\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"nzd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"pln\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"sek\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"sgd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"usd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"tipping\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Tipping configurations for readers supporting on-reader tips\"\n                  },\n                  \"verifone_p400\": {\n                    \"description\": \"An object containing device type specific settings for Verifone P400 readers\",\n                    \"properties\": {\n                      \"splashscreen\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"verifone_p400\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Configuration\"\n      }\n    },\n    \"/v1/terminal/configurations/{configuration}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes a <code>Configuration</code> object.</p>\",\n        \"operationId\": \"DeleteTerminalConfigurationsConfiguration\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_terminal.configuration\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a Configuration\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a <code>Configuration</code> object.</p>\",\n        \"operationId\": \"GetTerminalConfigurationsConfiguration\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/terminal.configuration\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_terminal.configuration\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Configuration\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a new <code>Configuration</code> object.</p>\",\n        \"operationId\": \"PostTerminalConfigurationsConfiguration\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"bbpos_wisepos_e\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"offline\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"reboot_window\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"stripe_s700\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"verifone_p400\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"bbpos_wisepos_e\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"splashscreen\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"bbpos_wise_pose\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"An object containing device type specific settings for BBPOS WisePOS E readers\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"name\": {\n                    \"description\": \"Name of the configuration\",\n                    \"maxLength\": 100,\n                    \"type\": \"string\"\n                  },\n                  \"offline\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"enabled\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"enabled\"],\n                        \"title\": \"offline\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Configurations for collecting transactions offline.\"\n                  },\n                  \"reboot_window\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"end_hour\": {\n                            \"type\": \"integer\"\n                          },\n                          \"start_hour\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"required\": [\"end_hour\", \"start_hour\"],\n                        \"title\": \"reboot_window\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Reboot time settings for readers that support customized reboot time configuration.\"\n                  },\n                  \"stripe_s700\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"splashscreen\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"stripe_s700\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"An object containing device type specific settings for Stripe S700 readers\"\n                  },\n                  \"tipping\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"aud\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"cad\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"chf\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"czk\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"dkk\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"eur\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"gbp\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"hkd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"jpy\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"myr\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"nok\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"nzd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"pln\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"sek\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"sgd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          },\n                          \"usd\": {\n                            \"properties\": {\n                              \"fixed_amounts\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"percentages\": {\n                                \"items\": {\n                                  \"type\": \"integer\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              \"smart_tip_threshold\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"title\": \"currency_specific_config\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"tipping\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Tipping configurations for readers supporting on-reader tips\"\n                  },\n                  \"verifone_p400\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"splashscreen\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"verifone_p400\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"An object containing device type specific settings for Verifone P400 readers\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/terminal.configuration\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_terminal.configuration\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a Configuration\"\n      }\n    },\n    \"/v1/terminal/connection_tokens\": {\n      \"post\": {\n        \"description\": \"<p>To connect to a reader the Stripe Terminal SDK needs to retrieve a short-lived connection token from Stripe, proxied through your server. On your backend, add an endpoint that creates and returns a connection token.</p>\",\n        \"operationId\": \"PostTerminalConnectionTokens\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"location\": {\n                    \"description\": \"The id of the location that this connection token is scoped to. If specified the connection token will only be usable with readers assigned to that location, otherwise the connection token will be usable with all readers. Note that location scoping only applies to internet-connected readers. For more details, see [the docs on scoping connection tokens](https://docs.stripe.com/terminal/fleet/locations-and-zones?dashboard-or-api=api#connection-tokens).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.connection_token\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Connection Token\"\n      }\n    },\n    \"/v1/terminal/locations\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of <code>Location</code> objects.</p>\",\n        \"operationId\": \"GetTerminalLocations\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/terminal.location\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/terminal/locations\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TerminalLocationLocationList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Locations\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new <code>Location</code> object.\\nFor further details, including which address fields are required in each country, see the <a href=\\\"/docs/terminal/fleet/locations\\\">Manage locations</a> guide.</p>\",\n        \"operationId\": \"PostTerminalLocations\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"address\": {\n                    \"description\": \"The full address of the location.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"country\"],\n                    \"title\": \"create_location_address_param\",\n                    \"type\": \"object\"\n                  },\n                  \"configuration_overrides\": {\n                    \"description\": \"The ID of a configuration that will be used to customize all readers in this location.\",\n                    \"maxLength\": 500,\n                    \"type\": \"string\"\n                  },\n                  \"display_name\": {\n                    \"description\": \"A name for the location. Maximum length is 1000 characters.\",\n                    \"maxLength\": 1000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"required\": [\"address\", \"display_name\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.location\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Location\"\n      }\n    },\n    \"/v1/terminal/locations/{location}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes a <code>Location</code> object.</p>\",\n        \"operationId\": \"DeleteTerminalLocationsLocation\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"location\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_terminal.location\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a Location\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a <code>Location</code> object.</p>\",\n        \"operationId\": \"GetTerminalLocationsLocation\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"location\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/terminal.location\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_terminal.location\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Location\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a <code>Location</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostTerminalLocationsLocation\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"location\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"address\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"configuration_overrides\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"address\": {\n                    \"description\": \"The full address of the location. You can't change the location's `country`. If you need to modify the `country` field, create a new `Location` object and re-register any existing readers to that location.\",\n                    \"properties\": {\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line1\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"line2\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"optional_fields_address\",\n                    \"type\": \"object\"\n                  },\n                  \"configuration_overrides\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 1000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The ID of a configuration that will be used to customize all readers in this location.\"\n                  },\n                  \"display_name\": {\n                    \"description\": \"A name for the location.\",\n                    \"maxLength\": 1000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/terminal.location\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_terminal.location\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a Location\"\n      }\n    },\n    \"/v1/terminal/readers\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of <code>Reader</code> objects.</p>\",\n        \"operationId\": \"GetTerminalReaders\",\n        \"parameters\": [\n          {\n            \"description\": \"Filters readers by device type\",\n            \"in\": \"query\",\n            \"name\": \"device_type\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"bbpos_chipper2x\",\n                \"bbpos_wisepad3\",\n                \"bbpos_wisepos_e\",\n                \"mobile_phone_reader\",\n                \"simulated_wisepos_e\",\n                \"stripe_m2\",\n                \"stripe_s700\",\n                \"verifone_P400\"\n              ],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A location ID to filter the response list to only readers at the specific location\",\n            \"in\": \"query\",\n            \"name\": \"location\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Filters readers by serial number\",\n            \"in\": \"query\",\n            \"name\": \"serial_number\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A status filter to filter readers to only offline or online readers\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"offline\", \"online\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"A list of readers\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/terminal.reader\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TerminalReaderRetrieveReader\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Readers\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new <code>Reader</code> object.</p>\",\n        \"operationId\": \"PostTerminalReaders\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"label\": {\n                    \"description\": \"Custom label given to the reader for easier identification. If no label is specified, the registration code will be used.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"location\": {\n                    \"description\": \"The location to assign the reader to.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"registration_code\": {\n                    \"description\": \"A code generated by the reader used for registering to an account.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"registration_code\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a Reader\"\n      }\n    },\n    \"/v1/terminal/readers/{reader}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes a <code>Reader</code> object.</p>\",\n        \"operationId\": \"DeleteTerminalReadersReader\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a Reader\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a <code>Reader</code> object.</p>\",\n        \"operationId\": \"GetTerminalReadersReader\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/terminal.reader\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_terminal.reader\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Reader\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates a <code>Reader</code> object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\",\n        \"operationId\": \"PostTerminalReadersReader\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"label\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"label\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The new label of the reader.\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"anyOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/terminal.reader\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/deleted_terminal.reader\"\n                    }\n                  ]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a Reader\"\n      }\n    },\n    \"/v1/terminal/readers/{reader}/cancel_action\": {\n      \"post\": {\n        \"description\": \"<p>Cancels the current reader action.</p>\",\n        \"operationId\": \"PostTerminalReadersReaderCancelAction\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel the current reader action\"\n      }\n    },\n    \"/v1/terminal/readers/{reader}/process_payment_intent\": {\n      \"post\": {\n        \"description\": \"<p>Initiates a payment flow on a Reader.</p>\",\n        \"operationId\": \"PostTerminalReadersReaderProcessPaymentIntent\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"process_config\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"payment_intent\": {\n                    \"description\": \"PaymentIntent ID\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"process_config\": {\n                    \"description\": \"Configuration overrides\",\n                    \"properties\": {\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"enable_customer_cancellation\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"skip_tipping\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"tipping\": {\n                        \"properties\": {\n                          \"amount_eligible\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"title\": \"tipping_config\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"process_config\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"payment_intent\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Hand-off a PaymentIntent to a Reader\"\n      }\n    },\n    \"/v1/terminal/readers/{reader}/process_setup_intent\": {\n      \"post\": {\n        \"description\": \"<p>Initiates a setup intent flow on a Reader.</p>\",\n        \"operationId\": \"PostTerminalReadersReaderProcessSetupIntent\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"process_config\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"allow_redisplay\": {\n                    \"description\": \"This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow.\",\n                    \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"process_config\": {\n                    \"description\": \"Configuration overrides\",\n                    \"properties\": {\n                      \"enable_customer_cancellation\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"title\": \"process_setup_config\",\n                    \"type\": \"object\"\n                  },\n                  \"setup_intent\": {\n                    \"description\": \"SetupIntent ID\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"allow_redisplay\", \"setup_intent\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Hand-off a SetupIntent to a Reader\"\n      }\n    },\n    \"/v1/terminal/readers/{reader}/refund_payment\": {\n      \"post\": {\n        \"description\": \"<p>Initiates a refund on a Reader</p>\",\n        \"operationId\": \"PostTerminalReadersReaderRefundPayment\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"refund_payment_config\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"A positive integer in __cents__ representing how much of this charge to refund.\",\n                    \"type\": \"integer\"\n                  },\n                  \"charge\": {\n                    \"description\": \"ID of the Charge to refund.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"payment_intent\": {\n                    \"description\": \"ID of the PaymentIntent to refund.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"refund_application_fee\": {\n                    \"description\": \"Boolean indicating whether the application fee should be refunded when refunding this charge. If a full charge refund is given, the full application fee will be refunded. Otherwise, the application fee will be refunded in an amount proportional to the amount of the charge refunded. An application fee can be refunded only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"refund_payment_config\": {\n                    \"description\": \"Configuration overrides\",\n                    \"properties\": {\n                      \"enable_customer_cancellation\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"title\": \"refund_payment_config\",\n                    \"type\": \"object\"\n                  },\n                  \"reverse_transfer\": {\n                    \"description\": \"Boolean indicating whether the transfer should be reversed when refunding this charge. The transfer will be reversed proportionally to the amount being refunded (either the entire or partial amount). A transfer can be reversed only by the application that created the charge.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Refund a Charge or a PaymentIntent in-person\"\n      }\n    },\n    \"/v1/terminal/readers/{reader}/set_reader_display\": {\n      \"post\": {\n        \"description\": \"<p>Sets reader display to show cart details.</p>\",\n        \"operationId\": \"PostTerminalReadersReaderSetReaderDisplay\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"cart\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"cart\": {\n                    \"description\": \"Cart\",\n                    \"properties\": {\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"line_items\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"amount\": {\n                              \"type\": \"integer\"\n                            },\n                            \"description\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"quantity\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"required\": [\"amount\", \"description\", \"quantity\"],\n                          \"title\": \"line_item\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"tax\": {\n                        \"type\": \"integer\"\n                      },\n                      \"total\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"required\": [\"currency\", \"line_items\", \"total\"],\n                    \"title\": \"cart\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"type\": {\n                    \"description\": \"Type\",\n                    \"enum\": [\"cart\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Set reader display\"\n      }\n    },\n    \"/v1/test_helpers/confirmation_tokens\": {\n      \"post\": {\n        \"description\": \"<p>Creates a test mode Confirmation Token server side for your integration tests.</p>\",\n        \"operationId\": \"PostTestHelpersConfirmationTokens\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"shipping\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"payment_method\": {\n                    \"description\": \"ID of an existing PaymentMethod.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"payment_method_data\": {\n                    \"description\": \"If provided, this hash will be used to create a PaymentMethod.\",\n                    \"properties\": {\n                      \"acss_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"institution_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"transit_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\n                          \"account_number\",\n                          \"institution_number\",\n                          \"transit_number\"\n                        ],\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"affirm\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"afterpay_clearpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"alipay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"allow_redisplay\": {\n                        \"enum\": [\"always\", \"limited\", \"unspecified\"],\n                        \"type\": \"string\"\n                      },\n                      \"alma\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"amazon_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"au_becs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"bsb_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"account_number\", \"bsb_number\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bacs_debit\": {\n                        \"properties\": {\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"sort_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"bancontact\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"blik\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"boleto\": {\n                        \"properties\": {\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"tax_id\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"cashapp\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"customer_balance\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"eps\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"arzte_und_apotheker_bank\",\n                              \"austrian_anadi_bank_ag\",\n                              \"bank_austria\",\n                              \"bankhaus_carl_spangler\",\n                              \"bankhaus_schelhammer_und_schattera_ag\",\n                              \"bawag_psk_ag\",\n                              \"bks_bank_ag\",\n                              \"brull_kallmus_bank_ag\",\n                              \"btv_vier_lander_bank\",\n                              \"capital_bank_grawe_gruppe_ag\",\n                              \"deutsche_bank_ag\",\n                              \"dolomitenbank\",\n                              \"easybank_ag\",\n                              \"erste_bank_und_sparkassen\",\n                              \"hypo_alpeadriabank_international_ag\",\n                              \"hypo_bank_burgenland_aktiengesellschaft\",\n                              \"hypo_noe_lb_fur_niederosterreich_u_wien\",\n                              \"hypo_oberosterreich_salzburg_steiermark\",\n                              \"hypo_tirol_bank_ag\",\n                              \"hypo_vorarlberg_bank_ag\",\n                              \"marchfelder_bank\",\n                              \"oberbank_ag\",\n                              \"raiffeisen_bankengruppe_osterreich\",\n                              \"schoellerbank_ag\",\n                              \"sparda_bank_wien\",\n                              \"volksbank_gruppe\",\n                              \"volkskreditbank_ag\",\n                              \"vr_bank_braunau\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"fpx\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"affin_bank\",\n                              \"agrobank\",\n                              \"alliance_bank\",\n                              \"ambank\",\n                              \"bank_islam\",\n                              \"bank_muamalat\",\n                              \"bank_of_china\",\n                              \"bank_rakyat\",\n                              \"bsn\",\n                              \"cimb\",\n                              \"deutsche_bank\",\n                              \"hong_leong_bank\",\n                              \"hsbc\",\n                              \"kfh\",\n                              \"maybank2e\",\n                              \"maybank2u\",\n                              \"ocbc\",\n                              \"pb_enterprise\",\n                              \"public_bank\",\n                              \"rhb\",\n                              \"standard_chartered\",\n                              \"uob\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"bank\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"giropay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"grabpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"ideal\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"abn_amro\",\n                              \"asn_bank\",\n                              \"bunq\",\n                              \"handelsbanken\",\n                              \"ing\",\n                              \"knab\",\n                              \"moneyou\",\n                              \"n26\",\n                              \"nn\",\n                              \"rabobank\",\n                              \"regiobank\",\n                              \"revolut\",\n                              \"sns_bank\",\n                              \"triodos_bank\",\n                              \"van_lanschot\",\n                              \"yoursafe\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"interac_present\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kakao_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"klarna\": {\n                        \"properties\": {\n                          \"dob\": {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"konbini\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"kr_card\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"link\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"mobilepay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"multibanco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"naver_pay\": {\n                        \"properties\": {\n                          \"funding\": {\n                            \"enum\": [\"card\", \"points\"],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"oxxo\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"p24\": {\n                        \"properties\": {\n                          \"bank\": {\n                            \"enum\": [\n                              \"alior_bank\",\n                              \"bank_millennium\",\n                              \"bank_nowy_bfg_sa\",\n                              \"bank_pekao_sa\",\n                              \"banki_spbdzielcze\",\n                              \"blik\",\n                              \"bnp_paribas\",\n                              \"boz\",\n                              \"citi_handlowy\",\n                              \"credit_agricole\",\n                              \"envelobank\",\n                              \"etransfer_pocztowy24\",\n                              \"getin_bank\",\n                              \"ideabank\",\n                              \"ing\",\n                              \"inteligo\",\n                              \"mbank_mtransfer\",\n                              \"nest_przelew\",\n                              \"noble_pay\",\n                              \"pbac_z_ipko\",\n                              \"plus_bank\",\n                              \"santander_przelew24\",\n                              \"tmobile_usbugi_bankowe\",\n                              \"toyota_bank\",\n                              \"velobank\",\n                              \"volkswagen_bank\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pay_by_bank\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"payco\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paynow\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"paypal\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"pix\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"promptpay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"radar_options\": {\n                        \"properties\": {\n                          \"session\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"radar_options_with_hidden_options\",\n                        \"type\": \"object\"\n                      },\n                      \"revolut_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"samsung_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sepa_debit\": {\n                        \"properties\": {\n                          \"iban\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"iban\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"sofort\": {\n                        \"properties\": {\n                          \"country\": {\n                            \"enum\": [\"AT\", \"BE\", \"DE\", \"ES\", \"IT\", \"NL\"],\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"country\"],\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"swish\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"twint\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"acss_debit\",\n                          \"affirm\",\n                          \"afterpay_clearpay\",\n                          \"alipay\",\n                          \"alma\",\n                          \"amazon_pay\",\n                          \"au_becs_debit\",\n                          \"bacs_debit\",\n                          \"bancontact\",\n                          \"blik\",\n                          \"boleto\",\n                          \"cashapp\",\n                          \"customer_balance\",\n                          \"eps\",\n                          \"fpx\",\n                          \"giropay\",\n                          \"grabpay\",\n                          \"ideal\",\n                          \"kakao_pay\",\n                          \"klarna\",\n                          \"konbini\",\n                          \"kr_card\",\n                          \"link\",\n                          \"mobilepay\",\n                          \"multibanco\",\n                          \"naver_pay\",\n                          \"oxxo\",\n                          \"p24\",\n                          \"pay_by_bank\",\n                          \"payco\",\n                          \"paynow\",\n                          \"paypal\",\n                          \"pix\",\n                          \"promptpay\",\n                          \"revolut_pay\",\n                          \"samsung_pay\",\n                          \"sepa_debit\",\n                          \"sofort\",\n                          \"swish\",\n                          \"twint\",\n                          \"us_bank_account\",\n                          \"wechat_pay\",\n                          \"zip\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      },\n                      \"wechat_pay\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      },\n                      \"zip\": {\n                        \"properties\": {},\n                        \"title\": \"param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data_params\",\n                    \"type\": \"object\"\n                  },\n                  \"return_url\": {\n                    \"description\": \"Return URL used to confirm the Intent.\",\n                    \"type\": \"string\"\n                  },\n                  \"setup_future_usage\": {\n                    \"description\": \"Indicates that you intend to make future payments with this ConfirmationToken's payment method.\\n\\nThe presence of this property will [attach the payment method](https://stripe.com/docs/payments/save-during-payment) to the PaymentIntent's Customer, if present, after the PaymentIntent is confirmed and any required actions from the user are complete.\",\n                    \"enum\": [\"off_session\", \"on_session\"],\n                    \"type\": \"string\"\n                  },\n                  \"shipping\": {\n                    \"description\": \"Shipping information for this ConfirmationToken.\",\n                    \"properties\": {\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"optional_fields_address\",\n                        \"type\": \"object\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"anyOf\": [\n                          {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\"address\", \"name\"],\n                    \"title\": \"recipient_shipping_with_optional_fields_address\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/confirmation_token\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a test Confirmation Token\"\n      }\n    },\n    \"/v1/test_helpers/customers/{customer}/fund_cash_balance\": {\n      \"post\": {\n        \"description\": \"<p>Create an incoming testmode bank transfer</p>\",\n        \"operationId\": \"PostTestHelpersCustomersCustomerFundCashBalance\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"customer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount to be used for this test cash balance transaction. A positive integer representing how much to fund in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal) (e.g., 100 cents to fund $1.00 or 100 to fund ¥100, a zero-decimal currency).\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"reference\": {\n                    \"description\": \"A description of the test funding. This simulates free-text references supplied by customers when making bank transfers to their cash balance. You can use this to test how Stripe's [reconciliation algorithm](https://stripe.com/docs/payments/customer-balance/reconciliation) applies to different user inputs.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"amount\", \"currency\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/customer_cash_balance_transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Fund a test mode cash balance\"\n      }\n    },\n    \"/v1/test_helpers/issuing/authorizations\": {\n      \"post\": {\n        \"description\": \"<p>Create a test-mode authorization.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingAuthorizations\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"amount_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fleet\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fuel\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"merchant_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"network_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"verification_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The total amount to attempt to authorize. This amount is in the provided currency, or defaults to the card's currency, and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"amount_details\": {\n                    \"description\": \"Detailed breakdown of amount components. These amounts are denominated in `currency` and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"properties\": {\n                      \"atm_fee\": {\n                        \"type\": \"integer\"\n                      },\n                      \"cashback_amount\": {\n                        \"type\": \"integer\"\n                      }\n                    },\n                    \"title\": \"amount_details_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"authorization_method\": {\n                    \"description\": \"How the card details were provided. Defaults to online.\",\n                    \"enum\": [\n                      \"chip\",\n                      \"contactless\",\n                      \"keyed_in\",\n                      \"online\",\n                      \"swipe\"\n                    ],\n                    \"type\": \"string\"\n                  },\n                  \"card\": {\n                    \"description\": \"Card associated with this authorization.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"The currency of the authorization. If not provided, defaults to the currency of the card. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"fleet\": {\n                    \"description\": \"Fleet-specific information for authorizations using Fleet cards.\",\n                    \"properties\": {\n                      \"cardholder_prompt_data\": {\n                        \"properties\": {\n                          \"driver_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"odometer\": {\n                            \"type\": \"integer\"\n                          },\n                          \"unspecified_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"user_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"vehicle_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fleet_cardholder_prompt_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"purchase_type\": {\n                        \"enum\": [\n                          \"fuel_and_non_fuel_purchase\",\n                          \"fuel_purchase\",\n                          \"non_fuel_purchase\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"reported_breakdown\": {\n                        \"properties\": {\n                          \"fuel\": {\n                            \"properties\": {\n                              \"gross_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_fuel_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"non_fuel\": {\n                            \"properties\": {\n                              \"gross_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_non_fuel_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"tax\": {\n                            \"properties\": {\n                              \"local_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              },\n                              \"national_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_tax_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"fleet_reported_breakdown_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"service_type\": {\n                        \"enum\": [\n                          \"full_service\",\n                          \"non_fuel_transaction\",\n                          \"self_service\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"fleet_testmode_authorization_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"fuel\": {\n                    \"description\": \"Information about fuel that was purchased with this transaction.\",\n                    \"properties\": {\n                      \"industry_product_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"quantity_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"diesel\",\n                          \"other\",\n                          \"unleaded_plus\",\n                          \"unleaded_regular\",\n                          \"unleaded_super\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"unit\": {\n                        \"enum\": [\n                          \"charging_minute\",\n                          \"imperial_gallon\",\n                          \"kilogram\",\n                          \"kilowatt_hour\",\n                          \"liter\",\n                          \"other\",\n                          \"pound\",\n                          \"us_gallon\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"unit_cost_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"fuel_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"is_amount_controllable\": {\n                    \"description\": \"If set `true`, you may provide [amount](https://stripe.com/docs/api/issuing/authorizations/approve#approve_issuing_authorization-amount) to control how much to hold for the authorization.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"merchant_amount\": {\n                    \"description\": \"The total amount to attempt to authorize. This amount is in the provided merchant currency, and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"merchant_currency\": {\n                    \"description\": \"The currency of the authorization. If not provided, defaults to the currency of the card. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"merchant_data\": {\n                    \"description\": \"Details about the seller (grocery store, e-commerce website, etc.) where the card authorization happened.\",\n                    \"properties\": {\n                      \"category\": {\n                        \"enum\": [\n                          \"ac_refrigeration_repair\",\n                          \"accounting_bookkeeping_services\",\n                          \"advertising_services\",\n                          \"agricultural_cooperative\",\n                          \"airlines_air_carriers\",\n                          \"airports_flying_fields\",\n                          \"ambulance_services\",\n                          \"amusement_parks_carnivals\",\n                          \"antique_reproductions\",\n                          \"antique_shops\",\n                          \"aquariums\",\n                          \"architectural_surveying_services\",\n                          \"art_dealers_and_galleries\",\n                          \"artists_supply_and_craft_shops\",\n                          \"auto_and_home_supply_stores\",\n                          \"auto_body_repair_shops\",\n                          \"auto_paint_shops\",\n                          \"auto_service_shops\",\n                          \"automated_cash_disburse\",\n                          \"automated_fuel_dispensers\",\n                          \"automobile_associations\",\n                          \"automotive_parts_and_accessories_stores\",\n                          \"automotive_tire_stores\",\n                          \"bail_and_bond_payments\",\n                          \"bakeries\",\n                          \"bands_orchestras\",\n                          \"barber_and_beauty_shops\",\n                          \"betting_casino_gambling\",\n                          \"bicycle_shops\",\n                          \"billiard_pool_establishments\",\n                          \"boat_dealers\",\n                          \"boat_rentals_and_leases\",\n                          \"book_stores\",\n                          \"books_periodicals_and_newspapers\",\n                          \"bowling_alleys\",\n                          \"bus_lines\",\n                          \"business_secretarial_schools\",\n                          \"buying_shopping_services\",\n                          \"cable_satellite_and_other_pay_television_and_radio\",\n                          \"camera_and_photographic_supply_stores\",\n                          \"candy_nut_and_confectionery_stores\",\n                          \"car_and_truck_dealers_new_used\",\n                          \"car_and_truck_dealers_used_only\",\n                          \"car_rental_agencies\",\n                          \"car_washes\",\n                          \"carpentry_services\",\n                          \"carpet_upholstery_cleaning\",\n                          \"caterers\",\n                          \"charitable_and_social_service_organizations_fundraising\",\n                          \"chemicals_and_allied_products\",\n                          \"child_care_services\",\n                          \"childrens_and_infants_wear_stores\",\n                          \"chiropodists_podiatrists\",\n                          \"chiropractors\",\n                          \"cigar_stores_and_stands\",\n                          \"civic_social_fraternal_associations\",\n                          \"cleaning_and_maintenance\",\n                          \"clothing_rental\",\n                          \"colleges_universities\",\n                          \"commercial_equipment\",\n                          \"commercial_footwear\",\n                          \"commercial_photography_art_and_graphics\",\n                          \"commuter_transport_and_ferries\",\n                          \"computer_network_services\",\n                          \"computer_programming\",\n                          \"computer_repair\",\n                          \"computer_software_stores\",\n                          \"computers_peripherals_and_software\",\n                          \"concrete_work_services\",\n                          \"construction_materials\",\n                          \"consulting_public_relations\",\n                          \"correspondence_schools\",\n                          \"cosmetic_stores\",\n                          \"counseling_services\",\n                          \"country_clubs\",\n                          \"courier_services\",\n                          \"court_costs\",\n                          \"credit_reporting_agencies\",\n                          \"cruise_lines\",\n                          \"dairy_products_stores\",\n                          \"dance_hall_studios_schools\",\n                          \"dating_escort_services\",\n                          \"dentists_orthodontists\",\n                          \"department_stores\",\n                          \"detective_agencies\",\n                          \"digital_goods_applications\",\n                          \"digital_goods_games\",\n                          \"digital_goods_large_volume\",\n                          \"digital_goods_media\",\n                          \"direct_marketing_catalog_merchant\",\n                          \"direct_marketing_combination_catalog_and_retail_merchant\",\n                          \"direct_marketing_inbound_telemarketing\",\n                          \"direct_marketing_insurance_services\",\n                          \"direct_marketing_other\",\n                          \"direct_marketing_outbound_telemarketing\",\n                          \"direct_marketing_subscription\",\n                          \"direct_marketing_travel\",\n                          \"discount_stores\",\n                          \"doctors\",\n                          \"door_to_door_sales\",\n                          \"drapery_window_covering_and_upholstery_stores\",\n                          \"drinking_places\",\n                          \"drug_stores_and_pharmacies\",\n                          \"drugs_drug_proprietaries_and_druggist_sundries\",\n                          \"dry_cleaners\",\n                          \"durable_goods\",\n                          \"duty_free_stores\",\n                          \"eating_places_restaurants\",\n                          \"educational_services\",\n                          \"electric_razor_stores\",\n                          \"electric_vehicle_charging\",\n                          \"electrical_parts_and_equipment\",\n                          \"electrical_services\",\n                          \"electronics_repair_shops\",\n                          \"electronics_stores\",\n                          \"elementary_secondary_schools\",\n                          \"emergency_services_gcas_visa_use_only\",\n                          \"employment_temp_agencies\",\n                          \"equipment_rental\",\n                          \"exterminating_services\",\n                          \"family_clothing_stores\",\n                          \"fast_food_restaurants\",\n                          \"financial_institutions\",\n                          \"fines_government_administrative_entities\",\n                          \"fireplace_fireplace_screens_and_accessories_stores\",\n                          \"floor_covering_stores\",\n                          \"florists\",\n                          \"florists_supplies_nursery_stock_and_flowers\",\n                          \"freezer_and_locker_meat_provisioners\",\n                          \"fuel_dealers_non_automotive\",\n                          \"funeral_services_crematories\",\n                          \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                          \"furniture_repair_refinishing\",\n                          \"furriers_and_fur_shops\",\n                          \"general_services\",\n                          \"gift_card_novelty_and_souvenir_shops\",\n                          \"glass_paint_and_wallpaper_stores\",\n                          \"glassware_crystal_stores\",\n                          \"golf_courses_public\",\n                          \"government_licensed_horse_dog_racing_us_region_only\",\n                          \"government_licensed_online_casions_online_gambling_us_region_only\",\n                          \"government_owned_lotteries_non_us_region\",\n                          \"government_owned_lotteries_us_region_only\",\n                          \"government_services\",\n                          \"grocery_stores_supermarkets\",\n                          \"hardware_equipment_and_supplies\",\n                          \"hardware_stores\",\n                          \"health_and_beauty_spas\",\n                          \"hearing_aids_sales_and_supplies\",\n                          \"heating_plumbing_a_c\",\n                          \"hobby_toy_and_game_shops\",\n                          \"home_supply_warehouse_stores\",\n                          \"hospitals\",\n                          \"hotels_motels_and_resorts\",\n                          \"household_appliance_stores\",\n                          \"industrial_supplies\",\n                          \"information_retrieval_services\",\n                          \"insurance_default\",\n                          \"insurance_underwriting_premiums\",\n                          \"intra_company_purchases\",\n                          \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                          \"landscaping_services\",\n                          \"laundries\",\n                          \"laundry_cleaning_services\",\n                          \"legal_services_attorneys\",\n                          \"luggage_and_leather_goods_stores\",\n                          \"lumber_building_materials_stores\",\n                          \"manual_cash_disburse\",\n                          \"marinas_service_and_supplies\",\n                          \"marketplaces\",\n                          \"masonry_stonework_and_plaster\",\n                          \"massage_parlors\",\n                          \"medical_and_dental_labs\",\n                          \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                          \"medical_services\",\n                          \"membership_organizations\",\n                          \"mens_and_boys_clothing_and_accessories_stores\",\n                          \"mens_womens_clothing_stores\",\n                          \"metal_service_centers\",\n                          \"miscellaneous_apparel_and_accessory_shops\",\n                          \"miscellaneous_auto_dealers\",\n                          \"miscellaneous_business_services\",\n                          \"miscellaneous_food_stores\",\n                          \"miscellaneous_general_merchandise\",\n                          \"miscellaneous_general_services\",\n                          \"miscellaneous_home_furnishing_specialty_stores\",\n                          \"miscellaneous_publishing_and_printing\",\n                          \"miscellaneous_recreation_services\",\n                          \"miscellaneous_repair_shops\",\n                          \"miscellaneous_specialty_retail\",\n                          \"mobile_home_dealers\",\n                          \"motion_picture_theaters\",\n                          \"motor_freight_carriers_and_trucking\",\n                          \"motor_homes_dealers\",\n                          \"motor_vehicle_supplies_and_new_parts\",\n                          \"motorcycle_shops_and_dealers\",\n                          \"motorcycle_shops_dealers\",\n                          \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                          \"news_dealers_and_newsstands\",\n                          \"non_fi_money_orders\",\n                          \"non_fi_stored_value_card_purchase_load\",\n                          \"nondurable_goods\",\n                          \"nurseries_lawn_and_garden_supply_stores\",\n                          \"nursing_personal_care\",\n                          \"office_and_commercial_furniture\",\n                          \"opticians_eyeglasses\",\n                          \"optometrists_ophthalmologist\",\n                          \"orthopedic_goods_prosthetic_devices\",\n                          \"osteopaths\",\n                          \"package_stores_beer_wine_and_liquor\",\n                          \"paints_varnishes_and_supplies\",\n                          \"parking_lots_garages\",\n                          \"passenger_railways\",\n                          \"pawn_shops\",\n                          \"pet_shops_pet_food_and_supplies\",\n                          \"petroleum_and_petroleum_products\",\n                          \"photo_developing\",\n                          \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                          \"photographic_studios\",\n                          \"picture_video_production\",\n                          \"piece_goods_notions_and_other_dry_goods\",\n                          \"plumbing_heating_equipment_and_supplies\",\n                          \"political_organizations\",\n                          \"postal_services_government_only\",\n                          \"precious_stones_and_metals_watches_and_jewelry\",\n                          \"professional_services\",\n                          \"public_warehousing_and_storage\",\n                          \"quick_copy_repro_and_blueprint\",\n                          \"railroads\",\n                          \"real_estate_agents_and_managers_rentals\",\n                          \"record_stores\",\n                          \"recreational_vehicle_rentals\",\n                          \"religious_goods_stores\",\n                          \"religious_organizations\",\n                          \"roofing_siding_sheet_metal\",\n                          \"secretarial_support_services\",\n                          \"security_brokers_dealers\",\n                          \"service_stations\",\n                          \"sewing_needlework_fabric_and_piece_goods_stores\",\n                          \"shoe_repair_hat_cleaning\",\n                          \"shoe_stores\",\n                          \"small_appliance_repair\",\n                          \"snowmobile_dealers\",\n                          \"special_trade_services\",\n                          \"specialty_cleaning\",\n                          \"sporting_goods_stores\",\n                          \"sporting_recreation_camps\",\n                          \"sports_and_riding_apparel_stores\",\n                          \"sports_clubs_fields\",\n                          \"stamp_and_coin_stores\",\n                          \"stationary_office_supplies_printing_and_writing_paper\",\n                          \"stationery_stores_office_and_school_supply_stores\",\n                          \"swimming_pools_sales\",\n                          \"t_ui_travel_germany\",\n                          \"tailors_alterations\",\n                          \"tax_payments_government_agencies\",\n                          \"tax_preparation_services\",\n                          \"taxicabs_limousines\",\n                          \"telecommunication_equipment_and_telephone_sales\",\n                          \"telecommunication_services\",\n                          \"telegraph_services\",\n                          \"tent_and_awning_shops\",\n                          \"testing_laboratories\",\n                          \"theatrical_ticket_agencies\",\n                          \"timeshares\",\n                          \"tire_retreading_and_repair\",\n                          \"tolls_bridge_fees\",\n                          \"tourist_attractions_and_exhibits\",\n                          \"towing_services\",\n                          \"trailer_parks_campgrounds\",\n                          \"transportation_services\",\n                          \"travel_agencies_tour_operators\",\n                          \"truck_stop_iteration\",\n                          \"truck_utility_trailer_rentals\",\n                          \"typesetting_plate_making_and_related_services\",\n                          \"typewriter_stores\",\n                          \"u_s_federal_government_agencies_or_departments\",\n                          \"uniforms_commercial_clothing\",\n                          \"used_merchandise_and_secondhand_stores\",\n                          \"utilities\",\n                          \"variety_stores\",\n                          \"veterinary_services\",\n                          \"video_amusement_game_supplies\",\n                          \"video_game_arcades\",\n                          \"video_tape_rental_stores\",\n                          \"vocational_trade_schools\",\n                          \"watch_jewelry_repair\",\n                          \"welding_repair\",\n                          \"wholesale_clubs\",\n                          \"wig_and_toupee_stores\",\n                          \"wires_money_orders\",\n                          \"womens_accessory_and_specialty_shops\",\n                          \"womens_ready_to_wear_stores\",\n                          \"wrecking_and_salvage_yards\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"network_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"terminal_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"url\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"merchant_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"network_data\": {\n                    \"description\": \"Details about the authorization, such as identifiers, set by the card network.\",\n                    \"properties\": {\n                      \"acquiring_institution_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"network_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"verification_data\": {\n                    \"description\": \"Verifications that Stripe performed on information that the cardholder provided to the merchant.\",\n                    \"properties\": {\n                      \"address_line1_check\": {\n                        \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n                        \"type\": \"string\"\n                      },\n                      \"address_postal_code_check\": {\n                        \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n                        \"type\": \"string\"\n                      },\n                      \"authentication_exemption\": {\n                        \"properties\": {\n                          \"claimed_by\": {\n                            \"enum\": [\"acquirer\", \"issuer\"],\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"low_value_transaction\",\n                              \"transaction_risk_analysis\",\n                              \"unknown\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"claimed_by\", \"type\"],\n                        \"title\": \"authentication_exemption_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"cvc_check\": {\n                        \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n                        \"type\": \"string\"\n                      },\n                      \"expiry_check\": {\n                        \"enum\": [\"match\", \"mismatch\", \"not_provided\"],\n                        \"type\": \"string\"\n                      },\n                      \"three_d_secure\": {\n                        \"properties\": {\n                          \"result\": {\n                            \"enum\": [\n                              \"attempt_acknowledged\",\n                              \"authenticated\",\n                              \"failed\",\n                              \"required\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          }\n                        },\n                        \"required\": [\"result\"],\n                        \"title\": \"three_d_secure_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"verification_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"wallet\": {\n                    \"description\": \"The digital wallet used for this transaction. One of `apple_pay`, `google_pay`, or `samsung_pay`. Will populate as `null` when no digital wallet was utilized.\",\n                    \"enum\": [\"apple_pay\", \"google_pay\", \"samsung_pay\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"card\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a test-mode authorization\"\n      }\n    },\n    \"/v1/test_helpers/issuing/authorizations/{authorization}/capture\": {\n      \"post\": {\n        \"description\": \"<p>Capture a test-mode authorization.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingAuthorizationsAuthorizationCapture\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"purchase_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"capture_amount\": {\n                    \"description\": \"The amount to capture from the authorization. If not provided, the full amount of the authorization will be captured. This amount is in the authorization currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"close_authorization\": {\n                    \"description\": \"Whether to close the authorization after capture. Defaults to true. Set to false to enable multi-capture flows.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"purchase_details\": {\n                    \"description\": \"Additional purchase information that is optionally provided by the merchant.\",\n                    \"properties\": {\n                      \"fleet\": {\n                        \"properties\": {\n                          \"cardholder_prompt_data\": {\n                            \"properties\": {\n                              \"driver_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"odometer\": {\n                                \"type\": \"integer\"\n                              },\n                              \"unspecified_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"user_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"vehicle_number\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_cardholder_prompt_data_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"purchase_type\": {\n                            \"enum\": [\n                              \"fuel_and_non_fuel_purchase\",\n                              \"fuel_purchase\",\n                              \"non_fuel_purchase\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"reported_breakdown\": {\n                            \"properties\": {\n                              \"fuel\": {\n                                \"properties\": {\n                                  \"gross_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_fuel_specs\",\n                                \"type\": \"object\"\n                              },\n                              \"non_fuel\": {\n                                \"properties\": {\n                                  \"gross_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_non_fuel_specs\",\n                                \"type\": \"object\"\n                              },\n                              \"tax\": {\n                                \"properties\": {\n                                  \"local_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"national_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_tax_specs\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"service_type\": {\n                            \"enum\": [\n                              \"full_service\",\n                              \"non_fuel_transaction\",\n                              \"self_service\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fleet_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"flight\": {\n                        \"properties\": {\n                          \"departure_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"passenger_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"refundable\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"segments\": {\n                            \"items\": {\n                              \"properties\": {\n                                \"arrival_airport_code\": {\n                                  \"maxLength\": 3,\n                                  \"type\": \"string\"\n                                },\n                                \"carrier\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"departure_airport_code\": {\n                                  \"maxLength\": 3,\n                                  \"type\": \"string\"\n                                },\n                                \"flight_number\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"service_class\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"stopover_allowed\": {\n                                  \"type\": \"boolean\"\n                                }\n                              },\n                              \"title\": \"flight_segment_specs\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          \"travel_agency\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"flight_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"fuel\": {\n                        \"properties\": {\n                          \"industry_product_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"quantity_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"diesel\",\n                              \"other\",\n                              \"unleaded_plus\",\n                              \"unleaded_regular\",\n                              \"unleaded_super\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"unit\": {\n                            \"enum\": [\n                              \"charging_minute\",\n                              \"imperial_gallon\",\n                              \"kilogram\",\n                              \"kilowatt_hour\",\n                              \"liter\",\n                              \"other\",\n                              \"pound\",\n                              \"us_gallon\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"unit_cost_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fuel_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"lodging\": {\n                        \"properties\": {\n                          \"check_in_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"nights\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"title\": \"lodging_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"receipt\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"description\": {\n                              \"maxLength\": 26,\n                              \"type\": \"string\"\n                            },\n                            \"quantity\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            },\n                            \"total\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_cost\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"receipt_specs\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"reference\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"purchase_details_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Capture a test-mode authorization\"\n      }\n    },\n    \"/v1/test_helpers/issuing/authorizations/{authorization}/expire\": {\n      \"post\": {\n        \"description\": \"<p>Expire a test-mode Authorization.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingAuthorizationsAuthorizationExpire\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Expire a test-mode authorization\"\n      }\n    },\n    \"/v1/test_helpers/issuing/authorizations/{authorization}/finalize_amount\": {\n      \"post\": {\n        \"description\": \"<p>Finalize the amount on an Authorization prior to capture, when the initial authorization was for an estimated amount.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingAuthorizationsAuthorizationFinalizeAmount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fleet\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"fuel\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"final_amount\": {\n                    \"description\": \"The final authorization amount that will be captured by the merchant. This amount is in the authorization currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"fleet\": {\n                    \"description\": \"Fleet-specific information for authorizations using Fleet cards.\",\n                    \"properties\": {\n                      \"cardholder_prompt_data\": {\n                        \"properties\": {\n                          \"driver_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"odometer\": {\n                            \"type\": \"integer\"\n                          },\n                          \"unspecified_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"user_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"vehicle_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fleet_cardholder_prompt_data_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"purchase_type\": {\n                        \"enum\": [\n                          \"fuel_and_non_fuel_purchase\",\n                          \"fuel_purchase\",\n                          \"non_fuel_purchase\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"reported_breakdown\": {\n                        \"properties\": {\n                          \"fuel\": {\n                            \"properties\": {\n                              \"gross_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_fuel_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"non_fuel\": {\n                            \"properties\": {\n                              \"gross_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_non_fuel_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"tax\": {\n                            \"properties\": {\n                              \"local_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              },\n                              \"national_amount_decimal\": {\n                                \"format\": \"decimal\",\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_tax_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"fleet_reported_breakdown_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"service_type\": {\n                        \"enum\": [\n                          \"full_service\",\n                          \"non_fuel_transaction\",\n                          \"self_service\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"fleet_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"fuel\": {\n                    \"description\": \"Information about fuel that was purchased with this transaction.\",\n                    \"properties\": {\n                      \"industry_product_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"quantity_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"diesel\",\n                          \"other\",\n                          \"unleaded_plus\",\n                          \"unleaded_regular\",\n                          \"unleaded_super\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"unit\": {\n                        \"enum\": [\n                          \"charging_minute\",\n                          \"imperial_gallon\",\n                          \"kilogram\",\n                          \"kilowatt_hour\",\n                          \"liter\",\n                          \"other\",\n                          \"pound\",\n                          \"us_gallon\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"unit_cost_decimal\": {\n                        \"format\": \"decimal\",\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"fuel_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"final_amount\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Finalize a test-mode authorization's amount\"\n      }\n    },\n    \"/v1/test_helpers/issuing/authorizations/{authorization}/fraud_challenges/respond\": {\n      \"post\": {\n        \"description\": \"<p>Respond to a fraud challenge on a testmode Issuing authorization, simulating either a confirmation of fraud or a correction of legitimacy.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingAuthorizationsAuthorizationFraudChallengesRespond\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"confirmed\": {\n                    \"description\": \"Whether to simulate the user confirming that the transaction was legitimate (true) or telling Stripe that it was fraudulent (false).\",\n                    \"type\": \"boolean\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"confirmed\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Respond to fraud challenge\"\n      }\n    },\n    \"/v1/test_helpers/issuing/authorizations/{authorization}/increment\": {\n      \"post\": {\n        \"description\": \"<p>Increment a test-mode Authorization.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingAuthorizationsAuthorizationIncrement\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"increment_amount\": {\n                    \"description\": \"The amount to increment the authorization by. This amount is in the authorization currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"is_amount_controllable\": {\n                    \"description\": \"If set `true`, you may provide [amount](https://stripe.com/docs/api/issuing/authorizations/approve#approve_issuing_authorization-amount) to control how much to hold for the authorization.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"required\": [\"increment_amount\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Increment a test-mode authorization\"\n      }\n    },\n    \"/v1/test_helpers/issuing/authorizations/{authorization}/reverse\": {\n      \"post\": {\n        \"description\": \"<p>Reverse a test-mode Authorization.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingAuthorizationsAuthorizationReverse\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"authorization\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"reverse_amount\": {\n                    \"description\": \"The amount to reverse from the authorization. If not provided, the full amount of the authorization will be reversed. This amount is in the authorization currency and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.authorization\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Reverse a test-mode authorization\"\n      }\n    },\n    \"/v1/test_helpers/issuing/cards/{card}/shipping/deliver\": {\n      \"post\": {\n        \"description\": \"<p>Updates the shipping status of the specified Issuing <code>Card</code> object to <code>delivered</code>.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingCardsCardShippingDeliver\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Deliver a testmode card\"\n      }\n    },\n    \"/v1/test_helpers/issuing/cards/{card}/shipping/fail\": {\n      \"post\": {\n        \"description\": \"<p>Updates the shipping status of the specified Issuing <code>Card</code> object to <code>failure</code>.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingCardsCardShippingFail\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Fail a testmode card\"\n      }\n    },\n    \"/v1/test_helpers/issuing/cards/{card}/shipping/return\": {\n      \"post\": {\n        \"description\": \"<p>Updates the shipping status of the specified Issuing <code>Card</code> object to <code>returned</code>.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingCardsCardShippingReturn\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Return a testmode card\"\n      }\n    },\n    \"/v1/test_helpers/issuing/cards/{card}/shipping/ship\": {\n      \"post\": {\n        \"description\": \"<p>Updates the shipping status of the specified Issuing <code>Card</code> object to <code>shipped</code>.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingCardsCardShippingShip\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Ship a testmode card\"\n      }\n    },\n    \"/v1/test_helpers/issuing/cards/{card}/shipping/submit\": {\n      \"post\": {\n        \"description\": \"<p>Updates the shipping status of the specified Issuing <code>Card</code> object to <code>submitted</code>. This method requires Stripe Version ‘2024-09-30.acacia’ or later.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingCardsCardShippingSubmit\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"card\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.card\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Submit a testmode card\"\n      }\n    },\n    \"/v1/test_helpers/issuing/personalization_designs/{personalization_design}/activate\": {\n      \"post\": {\n        \"description\": \"<p>Updates the <code>status</code> of the specified testmode personalization design object to <code>active</code>.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingPersonalizationDesignsPersonalizationDesignActivate\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"personalization_design\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Activate a testmode personalization design\"\n      }\n    },\n    \"/v1/test_helpers/issuing/personalization_designs/{personalization_design}/deactivate\": {\n      \"post\": {\n        \"description\": \"<p>Updates the <code>status</code> of the specified testmode personalization design object to <code>inactive</code>.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingPersonalizationDesignsPersonalizationDesignDeactivate\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"personalization_design\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Deactivate a testmode personalization design\"\n      }\n    },\n    \"/v1/test_helpers/issuing/personalization_designs/{personalization_design}/reject\": {\n      \"post\": {\n        \"description\": \"<p>Updates the <code>status</code> of the specified testmode personalization design object to <code>rejected</code>.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingPersonalizationDesignsPersonalizationDesignReject\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"personalization_design\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"rejection_reasons\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"rejection_reasons\": {\n                    \"description\": \"The reason(s) the personalization design was rejected.\",\n                    \"properties\": {\n                      \"card_logo\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"geographic_location\",\n                            \"inappropriate\",\n                            \"network_name\",\n                            \"non_binary_image\",\n                            \"non_fiat_currency\",\n                            \"other\",\n                            \"other_entity\",\n                            \"promotional_material\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"carrier_text\": {\n                        \"items\": {\n                          \"enum\": [\n                            \"geographic_location\",\n                            \"inappropriate\",\n                            \"network_name\",\n                            \"non_fiat_currency\",\n                            \"other\",\n                            \"other_entity\",\n                            \"promotional_material\"\n                          ],\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"array\"\n                      }\n                    },\n                    \"title\": \"rejection_reasons_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"rejection_reasons\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.personalization_design\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Reject a testmode personalization design\"\n      }\n    },\n    \"/v1/test_helpers/issuing/settlements\": {\n      \"post\": {\n        \"description\": \"<p>Allows the user to create an Issuing settlement.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingSettlements\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"bin\": {\n                    \"description\": \"The Bank Identification Number reflecting this settlement record.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"clearing_date\": {\n                    \"description\": \"The date that the transactions are cleared and posted to user's accounts.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"interchange_fees\": {\n                    \"description\": \"The total interchange received as reimbursement for the transactions.\",\n                    \"type\": \"integer\"\n                  },\n                  \"net_total\": {\n                    \"description\": \"The total net amount required to settle with the network.\",\n                    \"type\": \"integer\"\n                  },\n                  \"network_settlement_identifier\": {\n                    \"description\": \"The Settlement Identification Number assigned by the network.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"transaction_count\": {\n                    \"description\": \"The total number of transactions reflected in this settlement.\",\n                    \"type\": \"integer\"\n                  },\n                  \"transaction_volume\": {\n                    \"description\": \"The total transaction amount reflected in this settlement.\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"required\": [\"bin\", \"clearing_date\", \"currency\", \"net_total\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.settlement\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a test-mode settleemnt\"\n      }\n    },\n    \"/v1/test_helpers/issuing/settlements/{settlement}/complete\": {\n      \"post\": {\n        \"description\": \"<p>Allows the user to mark an Issuing settlement as complete.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingSettlementsSettlementComplete\",\n        \"parameters\": [\n          {\n            \"description\": \"The settlement token to mark as complete.\",\n            \"in\": \"path\",\n            \"name\": \"settlement\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.settlement\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Complete a test-mode settlement\"\n      }\n    },\n    \"/v1/test_helpers/issuing/transactions/create_force_capture\": {\n      \"post\": {\n        \"description\": \"<p>Allows the user to capture an arbitrary amount, also known as a forced capture.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingTransactionsCreateForceCapture\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"merchant_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"purchase_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The total amount to attempt to capture. This amount is in the provided currency, or defaults to the cards currency, and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"card\": {\n                    \"description\": \"Card associated with this transaction.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"The currency of the capture. If not provided, defaults to the currency of the card. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"merchant_data\": {\n                    \"description\": \"Details about the seller (grocery store, e-commerce website, etc.) where the card authorization happened.\",\n                    \"properties\": {\n                      \"category\": {\n                        \"enum\": [\n                          \"ac_refrigeration_repair\",\n                          \"accounting_bookkeeping_services\",\n                          \"advertising_services\",\n                          \"agricultural_cooperative\",\n                          \"airlines_air_carriers\",\n                          \"airports_flying_fields\",\n                          \"ambulance_services\",\n                          \"amusement_parks_carnivals\",\n                          \"antique_reproductions\",\n                          \"antique_shops\",\n                          \"aquariums\",\n                          \"architectural_surveying_services\",\n                          \"art_dealers_and_galleries\",\n                          \"artists_supply_and_craft_shops\",\n                          \"auto_and_home_supply_stores\",\n                          \"auto_body_repair_shops\",\n                          \"auto_paint_shops\",\n                          \"auto_service_shops\",\n                          \"automated_cash_disburse\",\n                          \"automated_fuel_dispensers\",\n                          \"automobile_associations\",\n                          \"automotive_parts_and_accessories_stores\",\n                          \"automotive_tire_stores\",\n                          \"bail_and_bond_payments\",\n                          \"bakeries\",\n                          \"bands_orchestras\",\n                          \"barber_and_beauty_shops\",\n                          \"betting_casino_gambling\",\n                          \"bicycle_shops\",\n                          \"billiard_pool_establishments\",\n                          \"boat_dealers\",\n                          \"boat_rentals_and_leases\",\n                          \"book_stores\",\n                          \"books_periodicals_and_newspapers\",\n                          \"bowling_alleys\",\n                          \"bus_lines\",\n                          \"business_secretarial_schools\",\n                          \"buying_shopping_services\",\n                          \"cable_satellite_and_other_pay_television_and_radio\",\n                          \"camera_and_photographic_supply_stores\",\n                          \"candy_nut_and_confectionery_stores\",\n                          \"car_and_truck_dealers_new_used\",\n                          \"car_and_truck_dealers_used_only\",\n                          \"car_rental_agencies\",\n                          \"car_washes\",\n                          \"carpentry_services\",\n                          \"carpet_upholstery_cleaning\",\n                          \"caterers\",\n                          \"charitable_and_social_service_organizations_fundraising\",\n                          \"chemicals_and_allied_products\",\n                          \"child_care_services\",\n                          \"childrens_and_infants_wear_stores\",\n                          \"chiropodists_podiatrists\",\n                          \"chiropractors\",\n                          \"cigar_stores_and_stands\",\n                          \"civic_social_fraternal_associations\",\n                          \"cleaning_and_maintenance\",\n                          \"clothing_rental\",\n                          \"colleges_universities\",\n                          \"commercial_equipment\",\n                          \"commercial_footwear\",\n                          \"commercial_photography_art_and_graphics\",\n                          \"commuter_transport_and_ferries\",\n                          \"computer_network_services\",\n                          \"computer_programming\",\n                          \"computer_repair\",\n                          \"computer_software_stores\",\n                          \"computers_peripherals_and_software\",\n                          \"concrete_work_services\",\n                          \"construction_materials\",\n                          \"consulting_public_relations\",\n                          \"correspondence_schools\",\n                          \"cosmetic_stores\",\n                          \"counseling_services\",\n                          \"country_clubs\",\n                          \"courier_services\",\n                          \"court_costs\",\n                          \"credit_reporting_agencies\",\n                          \"cruise_lines\",\n                          \"dairy_products_stores\",\n                          \"dance_hall_studios_schools\",\n                          \"dating_escort_services\",\n                          \"dentists_orthodontists\",\n                          \"department_stores\",\n                          \"detective_agencies\",\n                          \"digital_goods_applications\",\n                          \"digital_goods_games\",\n                          \"digital_goods_large_volume\",\n                          \"digital_goods_media\",\n                          \"direct_marketing_catalog_merchant\",\n                          \"direct_marketing_combination_catalog_and_retail_merchant\",\n                          \"direct_marketing_inbound_telemarketing\",\n                          \"direct_marketing_insurance_services\",\n                          \"direct_marketing_other\",\n                          \"direct_marketing_outbound_telemarketing\",\n                          \"direct_marketing_subscription\",\n                          \"direct_marketing_travel\",\n                          \"discount_stores\",\n                          \"doctors\",\n                          \"door_to_door_sales\",\n                          \"drapery_window_covering_and_upholstery_stores\",\n                          \"drinking_places\",\n                          \"drug_stores_and_pharmacies\",\n                          \"drugs_drug_proprietaries_and_druggist_sundries\",\n                          \"dry_cleaners\",\n                          \"durable_goods\",\n                          \"duty_free_stores\",\n                          \"eating_places_restaurants\",\n                          \"educational_services\",\n                          \"electric_razor_stores\",\n                          \"electric_vehicle_charging\",\n                          \"electrical_parts_and_equipment\",\n                          \"electrical_services\",\n                          \"electronics_repair_shops\",\n                          \"electronics_stores\",\n                          \"elementary_secondary_schools\",\n                          \"emergency_services_gcas_visa_use_only\",\n                          \"employment_temp_agencies\",\n                          \"equipment_rental\",\n                          \"exterminating_services\",\n                          \"family_clothing_stores\",\n                          \"fast_food_restaurants\",\n                          \"financial_institutions\",\n                          \"fines_government_administrative_entities\",\n                          \"fireplace_fireplace_screens_and_accessories_stores\",\n                          \"floor_covering_stores\",\n                          \"florists\",\n                          \"florists_supplies_nursery_stock_and_flowers\",\n                          \"freezer_and_locker_meat_provisioners\",\n                          \"fuel_dealers_non_automotive\",\n                          \"funeral_services_crematories\",\n                          \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                          \"furniture_repair_refinishing\",\n                          \"furriers_and_fur_shops\",\n                          \"general_services\",\n                          \"gift_card_novelty_and_souvenir_shops\",\n                          \"glass_paint_and_wallpaper_stores\",\n                          \"glassware_crystal_stores\",\n                          \"golf_courses_public\",\n                          \"government_licensed_horse_dog_racing_us_region_only\",\n                          \"government_licensed_online_casions_online_gambling_us_region_only\",\n                          \"government_owned_lotteries_non_us_region\",\n                          \"government_owned_lotteries_us_region_only\",\n                          \"government_services\",\n                          \"grocery_stores_supermarkets\",\n                          \"hardware_equipment_and_supplies\",\n                          \"hardware_stores\",\n                          \"health_and_beauty_spas\",\n                          \"hearing_aids_sales_and_supplies\",\n                          \"heating_plumbing_a_c\",\n                          \"hobby_toy_and_game_shops\",\n                          \"home_supply_warehouse_stores\",\n                          \"hospitals\",\n                          \"hotels_motels_and_resorts\",\n                          \"household_appliance_stores\",\n                          \"industrial_supplies\",\n                          \"information_retrieval_services\",\n                          \"insurance_default\",\n                          \"insurance_underwriting_premiums\",\n                          \"intra_company_purchases\",\n                          \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                          \"landscaping_services\",\n                          \"laundries\",\n                          \"laundry_cleaning_services\",\n                          \"legal_services_attorneys\",\n                          \"luggage_and_leather_goods_stores\",\n                          \"lumber_building_materials_stores\",\n                          \"manual_cash_disburse\",\n                          \"marinas_service_and_supplies\",\n                          \"marketplaces\",\n                          \"masonry_stonework_and_plaster\",\n                          \"massage_parlors\",\n                          \"medical_and_dental_labs\",\n                          \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                          \"medical_services\",\n                          \"membership_organizations\",\n                          \"mens_and_boys_clothing_and_accessories_stores\",\n                          \"mens_womens_clothing_stores\",\n                          \"metal_service_centers\",\n                          \"miscellaneous_apparel_and_accessory_shops\",\n                          \"miscellaneous_auto_dealers\",\n                          \"miscellaneous_business_services\",\n                          \"miscellaneous_food_stores\",\n                          \"miscellaneous_general_merchandise\",\n                          \"miscellaneous_general_services\",\n                          \"miscellaneous_home_furnishing_specialty_stores\",\n                          \"miscellaneous_publishing_and_printing\",\n                          \"miscellaneous_recreation_services\",\n                          \"miscellaneous_repair_shops\",\n                          \"miscellaneous_specialty_retail\",\n                          \"mobile_home_dealers\",\n                          \"motion_picture_theaters\",\n                          \"motor_freight_carriers_and_trucking\",\n                          \"motor_homes_dealers\",\n                          \"motor_vehicle_supplies_and_new_parts\",\n                          \"motorcycle_shops_and_dealers\",\n                          \"motorcycle_shops_dealers\",\n                          \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                          \"news_dealers_and_newsstands\",\n                          \"non_fi_money_orders\",\n                          \"non_fi_stored_value_card_purchase_load\",\n                          \"nondurable_goods\",\n                          \"nurseries_lawn_and_garden_supply_stores\",\n                          \"nursing_personal_care\",\n                          \"office_and_commercial_furniture\",\n                          \"opticians_eyeglasses\",\n                          \"optometrists_ophthalmologist\",\n                          \"orthopedic_goods_prosthetic_devices\",\n                          \"osteopaths\",\n                          \"package_stores_beer_wine_and_liquor\",\n                          \"paints_varnishes_and_supplies\",\n                          \"parking_lots_garages\",\n                          \"passenger_railways\",\n                          \"pawn_shops\",\n                          \"pet_shops_pet_food_and_supplies\",\n                          \"petroleum_and_petroleum_products\",\n                          \"photo_developing\",\n                          \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                          \"photographic_studios\",\n                          \"picture_video_production\",\n                          \"piece_goods_notions_and_other_dry_goods\",\n                          \"plumbing_heating_equipment_and_supplies\",\n                          \"political_organizations\",\n                          \"postal_services_government_only\",\n                          \"precious_stones_and_metals_watches_and_jewelry\",\n                          \"professional_services\",\n                          \"public_warehousing_and_storage\",\n                          \"quick_copy_repro_and_blueprint\",\n                          \"railroads\",\n                          \"real_estate_agents_and_managers_rentals\",\n                          \"record_stores\",\n                          \"recreational_vehicle_rentals\",\n                          \"religious_goods_stores\",\n                          \"religious_organizations\",\n                          \"roofing_siding_sheet_metal\",\n                          \"secretarial_support_services\",\n                          \"security_brokers_dealers\",\n                          \"service_stations\",\n                          \"sewing_needlework_fabric_and_piece_goods_stores\",\n                          \"shoe_repair_hat_cleaning\",\n                          \"shoe_stores\",\n                          \"small_appliance_repair\",\n                          \"snowmobile_dealers\",\n                          \"special_trade_services\",\n                          \"specialty_cleaning\",\n                          \"sporting_goods_stores\",\n                          \"sporting_recreation_camps\",\n                          \"sports_and_riding_apparel_stores\",\n                          \"sports_clubs_fields\",\n                          \"stamp_and_coin_stores\",\n                          \"stationary_office_supplies_printing_and_writing_paper\",\n                          \"stationery_stores_office_and_school_supply_stores\",\n                          \"swimming_pools_sales\",\n                          \"t_ui_travel_germany\",\n                          \"tailors_alterations\",\n                          \"tax_payments_government_agencies\",\n                          \"tax_preparation_services\",\n                          \"taxicabs_limousines\",\n                          \"telecommunication_equipment_and_telephone_sales\",\n                          \"telecommunication_services\",\n                          \"telegraph_services\",\n                          \"tent_and_awning_shops\",\n                          \"testing_laboratories\",\n                          \"theatrical_ticket_agencies\",\n                          \"timeshares\",\n                          \"tire_retreading_and_repair\",\n                          \"tolls_bridge_fees\",\n                          \"tourist_attractions_and_exhibits\",\n                          \"towing_services\",\n                          \"trailer_parks_campgrounds\",\n                          \"transportation_services\",\n                          \"travel_agencies_tour_operators\",\n                          \"truck_stop_iteration\",\n                          \"truck_utility_trailer_rentals\",\n                          \"typesetting_plate_making_and_related_services\",\n                          \"typewriter_stores\",\n                          \"u_s_federal_government_agencies_or_departments\",\n                          \"uniforms_commercial_clothing\",\n                          \"used_merchandise_and_secondhand_stores\",\n                          \"utilities\",\n                          \"variety_stores\",\n                          \"veterinary_services\",\n                          \"video_amusement_game_supplies\",\n                          \"video_game_arcades\",\n                          \"video_tape_rental_stores\",\n                          \"vocational_trade_schools\",\n                          \"watch_jewelry_repair\",\n                          \"welding_repair\",\n                          \"wholesale_clubs\",\n                          \"wig_and_toupee_stores\",\n                          \"wires_money_orders\",\n                          \"womens_accessory_and_specialty_shops\",\n                          \"womens_ready_to_wear_stores\",\n                          \"wrecking_and_salvage_yards\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"network_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"terminal_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"url\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"merchant_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"purchase_details\": {\n                    \"description\": \"Additional purchase information that is optionally provided by the merchant.\",\n                    \"properties\": {\n                      \"fleet\": {\n                        \"properties\": {\n                          \"cardholder_prompt_data\": {\n                            \"properties\": {\n                              \"driver_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"odometer\": {\n                                \"type\": \"integer\"\n                              },\n                              \"unspecified_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"user_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"vehicle_number\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_cardholder_prompt_data_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"purchase_type\": {\n                            \"enum\": [\n                              \"fuel_and_non_fuel_purchase\",\n                              \"fuel_purchase\",\n                              \"non_fuel_purchase\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"reported_breakdown\": {\n                            \"properties\": {\n                              \"fuel\": {\n                                \"properties\": {\n                                  \"gross_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_fuel_specs\",\n                                \"type\": \"object\"\n                              },\n                              \"non_fuel\": {\n                                \"properties\": {\n                                  \"gross_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_non_fuel_specs\",\n                                \"type\": \"object\"\n                              },\n                              \"tax\": {\n                                \"properties\": {\n                                  \"local_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"national_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_tax_specs\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"service_type\": {\n                            \"enum\": [\n                              \"full_service\",\n                              \"non_fuel_transaction\",\n                              \"self_service\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fleet_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"flight\": {\n                        \"properties\": {\n                          \"departure_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"passenger_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"refundable\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"segments\": {\n                            \"items\": {\n                              \"properties\": {\n                                \"arrival_airport_code\": {\n                                  \"maxLength\": 3,\n                                  \"type\": \"string\"\n                                },\n                                \"carrier\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"departure_airport_code\": {\n                                  \"maxLength\": 3,\n                                  \"type\": \"string\"\n                                },\n                                \"flight_number\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"service_class\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"stopover_allowed\": {\n                                  \"type\": \"boolean\"\n                                }\n                              },\n                              \"title\": \"flight_segment_specs\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          \"travel_agency\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"flight_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"fuel\": {\n                        \"properties\": {\n                          \"industry_product_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"quantity_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"diesel\",\n                              \"other\",\n                              \"unleaded_plus\",\n                              \"unleaded_regular\",\n                              \"unleaded_super\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"unit\": {\n                            \"enum\": [\n                              \"charging_minute\",\n                              \"imperial_gallon\",\n                              \"kilogram\",\n                              \"kilowatt_hour\",\n                              \"liter\",\n                              \"other\",\n                              \"pound\",\n                              \"us_gallon\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"unit_cost_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fuel_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"lodging\": {\n                        \"properties\": {\n                          \"check_in_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"nights\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"title\": \"lodging_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"receipt\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"description\": {\n                              \"maxLength\": 26,\n                              \"type\": \"string\"\n                            },\n                            \"quantity\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            },\n                            \"total\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_cost\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"receipt_specs\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"reference\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"purchase_details_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"amount\", \"card\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a test-mode force capture\"\n      }\n    },\n    \"/v1/test_helpers/issuing/transactions/create_unlinked_refund\": {\n      \"post\": {\n        \"description\": \"<p>Allows the user to refund an arbitrary amount, also known as a unlinked refund.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingTransactionsCreateUnlinkedRefund\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"merchant_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"purchase_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"The total amount to attempt to refund. This amount is in the provided currency, or defaults to the cards currency, and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  },\n                  \"card\": {\n                    \"description\": \"Card associated with this unlinked refund transaction.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"currency\": {\n                    \"description\": \"The currency of the unlinked refund. If not provided, defaults to the currency of the card. Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"merchant_data\": {\n                    \"description\": \"Details about the seller (grocery store, e-commerce website, etc.) where the card authorization happened.\",\n                    \"properties\": {\n                      \"category\": {\n                        \"enum\": [\n                          \"ac_refrigeration_repair\",\n                          \"accounting_bookkeeping_services\",\n                          \"advertising_services\",\n                          \"agricultural_cooperative\",\n                          \"airlines_air_carriers\",\n                          \"airports_flying_fields\",\n                          \"ambulance_services\",\n                          \"amusement_parks_carnivals\",\n                          \"antique_reproductions\",\n                          \"antique_shops\",\n                          \"aquariums\",\n                          \"architectural_surveying_services\",\n                          \"art_dealers_and_galleries\",\n                          \"artists_supply_and_craft_shops\",\n                          \"auto_and_home_supply_stores\",\n                          \"auto_body_repair_shops\",\n                          \"auto_paint_shops\",\n                          \"auto_service_shops\",\n                          \"automated_cash_disburse\",\n                          \"automated_fuel_dispensers\",\n                          \"automobile_associations\",\n                          \"automotive_parts_and_accessories_stores\",\n                          \"automotive_tire_stores\",\n                          \"bail_and_bond_payments\",\n                          \"bakeries\",\n                          \"bands_orchestras\",\n                          \"barber_and_beauty_shops\",\n                          \"betting_casino_gambling\",\n                          \"bicycle_shops\",\n                          \"billiard_pool_establishments\",\n                          \"boat_dealers\",\n                          \"boat_rentals_and_leases\",\n                          \"book_stores\",\n                          \"books_periodicals_and_newspapers\",\n                          \"bowling_alleys\",\n                          \"bus_lines\",\n                          \"business_secretarial_schools\",\n                          \"buying_shopping_services\",\n                          \"cable_satellite_and_other_pay_television_and_radio\",\n                          \"camera_and_photographic_supply_stores\",\n                          \"candy_nut_and_confectionery_stores\",\n                          \"car_and_truck_dealers_new_used\",\n                          \"car_and_truck_dealers_used_only\",\n                          \"car_rental_agencies\",\n                          \"car_washes\",\n                          \"carpentry_services\",\n                          \"carpet_upholstery_cleaning\",\n                          \"caterers\",\n                          \"charitable_and_social_service_organizations_fundraising\",\n                          \"chemicals_and_allied_products\",\n                          \"child_care_services\",\n                          \"childrens_and_infants_wear_stores\",\n                          \"chiropodists_podiatrists\",\n                          \"chiropractors\",\n                          \"cigar_stores_and_stands\",\n                          \"civic_social_fraternal_associations\",\n                          \"cleaning_and_maintenance\",\n                          \"clothing_rental\",\n                          \"colleges_universities\",\n                          \"commercial_equipment\",\n                          \"commercial_footwear\",\n                          \"commercial_photography_art_and_graphics\",\n                          \"commuter_transport_and_ferries\",\n                          \"computer_network_services\",\n                          \"computer_programming\",\n                          \"computer_repair\",\n                          \"computer_software_stores\",\n                          \"computers_peripherals_and_software\",\n                          \"concrete_work_services\",\n                          \"construction_materials\",\n                          \"consulting_public_relations\",\n                          \"correspondence_schools\",\n                          \"cosmetic_stores\",\n                          \"counseling_services\",\n                          \"country_clubs\",\n                          \"courier_services\",\n                          \"court_costs\",\n                          \"credit_reporting_agencies\",\n                          \"cruise_lines\",\n                          \"dairy_products_stores\",\n                          \"dance_hall_studios_schools\",\n                          \"dating_escort_services\",\n                          \"dentists_orthodontists\",\n                          \"department_stores\",\n                          \"detective_agencies\",\n                          \"digital_goods_applications\",\n                          \"digital_goods_games\",\n                          \"digital_goods_large_volume\",\n                          \"digital_goods_media\",\n                          \"direct_marketing_catalog_merchant\",\n                          \"direct_marketing_combination_catalog_and_retail_merchant\",\n                          \"direct_marketing_inbound_telemarketing\",\n                          \"direct_marketing_insurance_services\",\n                          \"direct_marketing_other\",\n                          \"direct_marketing_outbound_telemarketing\",\n                          \"direct_marketing_subscription\",\n                          \"direct_marketing_travel\",\n                          \"discount_stores\",\n                          \"doctors\",\n                          \"door_to_door_sales\",\n                          \"drapery_window_covering_and_upholstery_stores\",\n                          \"drinking_places\",\n                          \"drug_stores_and_pharmacies\",\n                          \"drugs_drug_proprietaries_and_druggist_sundries\",\n                          \"dry_cleaners\",\n                          \"durable_goods\",\n                          \"duty_free_stores\",\n                          \"eating_places_restaurants\",\n                          \"educational_services\",\n                          \"electric_razor_stores\",\n                          \"electric_vehicle_charging\",\n                          \"electrical_parts_and_equipment\",\n                          \"electrical_services\",\n                          \"electronics_repair_shops\",\n                          \"electronics_stores\",\n                          \"elementary_secondary_schools\",\n                          \"emergency_services_gcas_visa_use_only\",\n                          \"employment_temp_agencies\",\n                          \"equipment_rental\",\n                          \"exterminating_services\",\n                          \"family_clothing_stores\",\n                          \"fast_food_restaurants\",\n                          \"financial_institutions\",\n                          \"fines_government_administrative_entities\",\n                          \"fireplace_fireplace_screens_and_accessories_stores\",\n                          \"floor_covering_stores\",\n                          \"florists\",\n                          \"florists_supplies_nursery_stock_and_flowers\",\n                          \"freezer_and_locker_meat_provisioners\",\n                          \"fuel_dealers_non_automotive\",\n                          \"funeral_services_crematories\",\n                          \"furniture_home_furnishings_and_equipment_stores_except_appliances\",\n                          \"furniture_repair_refinishing\",\n                          \"furriers_and_fur_shops\",\n                          \"general_services\",\n                          \"gift_card_novelty_and_souvenir_shops\",\n                          \"glass_paint_and_wallpaper_stores\",\n                          \"glassware_crystal_stores\",\n                          \"golf_courses_public\",\n                          \"government_licensed_horse_dog_racing_us_region_only\",\n                          \"government_licensed_online_casions_online_gambling_us_region_only\",\n                          \"government_owned_lotteries_non_us_region\",\n                          \"government_owned_lotteries_us_region_only\",\n                          \"government_services\",\n                          \"grocery_stores_supermarkets\",\n                          \"hardware_equipment_and_supplies\",\n                          \"hardware_stores\",\n                          \"health_and_beauty_spas\",\n                          \"hearing_aids_sales_and_supplies\",\n                          \"heating_plumbing_a_c\",\n                          \"hobby_toy_and_game_shops\",\n                          \"home_supply_warehouse_stores\",\n                          \"hospitals\",\n                          \"hotels_motels_and_resorts\",\n                          \"household_appliance_stores\",\n                          \"industrial_supplies\",\n                          \"information_retrieval_services\",\n                          \"insurance_default\",\n                          \"insurance_underwriting_premiums\",\n                          \"intra_company_purchases\",\n                          \"jewelry_stores_watches_clocks_and_silverware_stores\",\n                          \"landscaping_services\",\n                          \"laundries\",\n                          \"laundry_cleaning_services\",\n                          \"legal_services_attorneys\",\n                          \"luggage_and_leather_goods_stores\",\n                          \"lumber_building_materials_stores\",\n                          \"manual_cash_disburse\",\n                          \"marinas_service_and_supplies\",\n                          \"marketplaces\",\n                          \"masonry_stonework_and_plaster\",\n                          \"massage_parlors\",\n                          \"medical_and_dental_labs\",\n                          \"medical_dental_ophthalmic_and_hospital_equipment_and_supplies\",\n                          \"medical_services\",\n                          \"membership_organizations\",\n                          \"mens_and_boys_clothing_and_accessories_stores\",\n                          \"mens_womens_clothing_stores\",\n                          \"metal_service_centers\",\n                          \"miscellaneous_apparel_and_accessory_shops\",\n                          \"miscellaneous_auto_dealers\",\n                          \"miscellaneous_business_services\",\n                          \"miscellaneous_food_stores\",\n                          \"miscellaneous_general_merchandise\",\n                          \"miscellaneous_general_services\",\n                          \"miscellaneous_home_furnishing_specialty_stores\",\n                          \"miscellaneous_publishing_and_printing\",\n                          \"miscellaneous_recreation_services\",\n                          \"miscellaneous_repair_shops\",\n                          \"miscellaneous_specialty_retail\",\n                          \"mobile_home_dealers\",\n                          \"motion_picture_theaters\",\n                          \"motor_freight_carriers_and_trucking\",\n                          \"motor_homes_dealers\",\n                          \"motor_vehicle_supplies_and_new_parts\",\n                          \"motorcycle_shops_and_dealers\",\n                          \"motorcycle_shops_dealers\",\n                          \"music_stores_musical_instruments_pianos_and_sheet_music\",\n                          \"news_dealers_and_newsstands\",\n                          \"non_fi_money_orders\",\n                          \"non_fi_stored_value_card_purchase_load\",\n                          \"nondurable_goods\",\n                          \"nurseries_lawn_and_garden_supply_stores\",\n                          \"nursing_personal_care\",\n                          \"office_and_commercial_furniture\",\n                          \"opticians_eyeglasses\",\n                          \"optometrists_ophthalmologist\",\n                          \"orthopedic_goods_prosthetic_devices\",\n                          \"osteopaths\",\n                          \"package_stores_beer_wine_and_liquor\",\n                          \"paints_varnishes_and_supplies\",\n                          \"parking_lots_garages\",\n                          \"passenger_railways\",\n                          \"pawn_shops\",\n                          \"pet_shops_pet_food_and_supplies\",\n                          \"petroleum_and_petroleum_products\",\n                          \"photo_developing\",\n                          \"photographic_photocopy_microfilm_equipment_and_supplies\",\n                          \"photographic_studios\",\n                          \"picture_video_production\",\n                          \"piece_goods_notions_and_other_dry_goods\",\n                          \"plumbing_heating_equipment_and_supplies\",\n                          \"political_organizations\",\n                          \"postal_services_government_only\",\n                          \"precious_stones_and_metals_watches_and_jewelry\",\n                          \"professional_services\",\n                          \"public_warehousing_and_storage\",\n                          \"quick_copy_repro_and_blueprint\",\n                          \"railroads\",\n                          \"real_estate_agents_and_managers_rentals\",\n                          \"record_stores\",\n                          \"recreational_vehicle_rentals\",\n                          \"religious_goods_stores\",\n                          \"religious_organizations\",\n                          \"roofing_siding_sheet_metal\",\n                          \"secretarial_support_services\",\n                          \"security_brokers_dealers\",\n                          \"service_stations\",\n                          \"sewing_needlework_fabric_and_piece_goods_stores\",\n                          \"shoe_repair_hat_cleaning\",\n                          \"shoe_stores\",\n                          \"small_appliance_repair\",\n                          \"snowmobile_dealers\",\n                          \"special_trade_services\",\n                          \"specialty_cleaning\",\n                          \"sporting_goods_stores\",\n                          \"sporting_recreation_camps\",\n                          \"sports_and_riding_apparel_stores\",\n                          \"sports_clubs_fields\",\n                          \"stamp_and_coin_stores\",\n                          \"stationary_office_supplies_printing_and_writing_paper\",\n                          \"stationery_stores_office_and_school_supply_stores\",\n                          \"swimming_pools_sales\",\n                          \"t_ui_travel_germany\",\n                          \"tailors_alterations\",\n                          \"tax_payments_government_agencies\",\n                          \"tax_preparation_services\",\n                          \"taxicabs_limousines\",\n                          \"telecommunication_equipment_and_telephone_sales\",\n                          \"telecommunication_services\",\n                          \"telegraph_services\",\n                          \"tent_and_awning_shops\",\n                          \"testing_laboratories\",\n                          \"theatrical_ticket_agencies\",\n                          \"timeshares\",\n                          \"tire_retreading_and_repair\",\n                          \"tolls_bridge_fees\",\n                          \"tourist_attractions_and_exhibits\",\n                          \"towing_services\",\n                          \"trailer_parks_campgrounds\",\n                          \"transportation_services\",\n                          \"travel_agencies_tour_operators\",\n                          \"truck_stop_iteration\",\n                          \"truck_utility_trailer_rentals\",\n                          \"typesetting_plate_making_and_related_services\",\n                          \"typewriter_stores\",\n                          \"u_s_federal_government_agencies_or_departments\",\n                          \"uniforms_commercial_clothing\",\n                          \"used_merchandise_and_secondhand_stores\",\n                          \"utilities\",\n                          \"variety_stores\",\n                          \"veterinary_services\",\n                          \"video_amusement_game_supplies\",\n                          \"video_game_arcades\",\n                          \"video_tape_rental_stores\",\n                          \"vocational_trade_schools\",\n                          \"watch_jewelry_repair\",\n                          \"welding_repair\",\n                          \"wholesale_clubs\",\n                          \"wig_and_toupee_stores\",\n                          \"wires_money_orders\",\n                          \"womens_accessory_and_specialty_shops\",\n                          \"womens_ready_to_wear_stores\",\n                          \"wrecking_and_salvage_yards\"\n                        ],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"city\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"network_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"postal_code\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"state\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"terminal_id\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"url\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"merchant_data_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"purchase_details\": {\n                    \"description\": \"Additional purchase information that is optionally provided by the merchant.\",\n                    \"properties\": {\n                      \"fleet\": {\n                        \"properties\": {\n                          \"cardholder_prompt_data\": {\n                            \"properties\": {\n                              \"driver_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"odometer\": {\n                                \"type\": \"integer\"\n                              },\n                              \"unspecified_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"user_id\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"vehicle_number\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"fleet_cardholder_prompt_data_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"purchase_type\": {\n                            \"enum\": [\n                              \"fuel_and_non_fuel_purchase\",\n                              \"fuel_purchase\",\n                              \"non_fuel_purchase\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"reported_breakdown\": {\n                            \"properties\": {\n                              \"fuel\": {\n                                \"properties\": {\n                                  \"gross_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_fuel_specs\",\n                                \"type\": \"object\"\n                              },\n                              \"non_fuel\": {\n                                \"properties\": {\n                                  \"gross_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_non_fuel_specs\",\n                                \"type\": \"object\"\n                              },\n                              \"tax\": {\n                                \"properties\": {\n                                  \"local_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  },\n                                  \"national_amount_decimal\": {\n                                    \"format\": \"decimal\",\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"fleet_reported_breakdown_tax_specs\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"fleet_reported_breakdown_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"service_type\": {\n                            \"enum\": [\n                              \"full_service\",\n                              \"non_fuel_transaction\",\n                              \"self_service\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fleet_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"flight\": {\n                        \"properties\": {\n                          \"departure_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"passenger_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"refundable\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"segments\": {\n                            \"items\": {\n                              \"properties\": {\n                                \"arrival_airport_code\": {\n                                  \"maxLength\": 3,\n                                  \"type\": \"string\"\n                                },\n                                \"carrier\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"departure_airport_code\": {\n                                  \"maxLength\": 3,\n                                  \"type\": \"string\"\n                                },\n                                \"flight_number\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"service_class\": {\n                                  \"maxLength\": 5000,\n                                  \"type\": \"string\"\n                                },\n                                \"stopover_allowed\": {\n                                  \"type\": \"boolean\"\n                                }\n                              },\n                              \"title\": \"flight_segment_specs\",\n                              \"type\": \"object\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          \"travel_agency\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"flight_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"fuel\": {\n                        \"properties\": {\n                          \"industry_product_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"quantity_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"diesel\",\n                              \"other\",\n                              \"unleaded_plus\",\n                              \"unleaded_regular\",\n                              \"unleaded_super\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"unit\": {\n                            \"enum\": [\n                              \"charging_minute\",\n                              \"imperial_gallon\",\n                              \"kilogram\",\n                              \"kilowatt_hour\",\n                              \"liter\",\n                              \"other\",\n                              \"pound\",\n                              \"us_gallon\"\n                            ],\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"unit_cost_decimal\": {\n                            \"format\": \"decimal\",\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"fuel_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"lodging\": {\n                        \"properties\": {\n                          \"check_in_at\": {\n                            \"format\": \"unix-time\",\n                            \"type\": \"integer\"\n                          },\n                          \"nights\": {\n                            \"type\": \"integer\"\n                          }\n                        },\n                        \"title\": \"lodging_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"receipt\": {\n                        \"items\": {\n                          \"properties\": {\n                            \"description\": {\n                              \"maxLength\": 26,\n                              \"type\": \"string\"\n                            },\n                            \"quantity\": {\n                              \"format\": \"decimal\",\n                              \"type\": \"string\"\n                            },\n                            \"total\": {\n                              \"type\": \"integer\"\n                            },\n                            \"unit_cost\": {\n                              \"type\": \"integer\"\n                            }\n                          },\n                          \"title\": \"receipt_specs\",\n                          \"type\": \"object\"\n                        },\n                        \"type\": \"array\"\n                      },\n                      \"reference\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"purchase_details_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"amount\", \"card\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a test-mode unlinked refund\"\n      }\n    },\n    \"/v1/test_helpers/issuing/transactions/{transaction}/refund\": {\n      \"post\": {\n        \"description\": \"<p>Refund a test-mode Transaction.</p>\",\n        \"operationId\": \"PostTestHelpersIssuingTransactionsTransactionRefund\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"transaction\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"refund_amount\": {\n                    \"description\": \"The total amount to attempt to refund. This amount is in the provided currency, or defaults to the cards currency, and in the [smallest currency unit](https://stripe.com/docs/currencies#zero-decimal).\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/issuing.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Refund a test-mode transaction\"\n      }\n    },\n    \"/v1/test_helpers/refunds/{refund}/expire\": {\n      \"post\": {\n        \"description\": \"<p>Expire a refund with a status of <code>requires_action</code>.</p>\",\n        \"operationId\": \"PostTestHelpersRefundsRefundExpire\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"refund\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/refund\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Expire a pending refund.\"\n      }\n    },\n    \"/v1/test_helpers/terminal/readers/{reader}/present_payment_method\": {\n      \"post\": {\n        \"description\": \"<p>Presents a payment method on a simulated reader. Can be used to simulate accepting a payment, saving a card or refunding a transaction.</p>\",\n        \"operationId\": \"PostTestHelpersTerminalReadersReaderPresentPaymentMethod\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"reader\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"card_present\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"interac_present\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount_tip\": {\n                    \"description\": \"Simulated on-reader tip amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"card_present\": {\n                    \"description\": \"Simulated data for the card_present payment method.\",\n                    \"properties\": {\n                      \"number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"card_present\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"interac_present\": {\n                    \"description\": \"Simulated data for the interac_present payment method.\",\n                    \"properties\": {\n                      \"number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"interac_present\",\n                    \"type\": \"object\"\n                  },\n                  \"type\": {\n                    \"description\": \"Simulated payment type.\",\n                    \"enum\": [\"card_present\", \"interac_present\"],\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/terminal.reader\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Simulate presenting a payment method\"\n      }\n    },\n    \"/v1/test_helpers/test_clocks\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your test clocks.</p>\",\n        \"operationId\": \"GetTestHelpersTestClocks\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/test_helpers/test_clocks\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"BillingClocksResourceBillingClockList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all test clocks\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new test clock that can be attached to new customers and quotes.</p>\",\n        \"operationId\": \"PostTestHelpersTestClocks\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"frozen_time\": {\n                    \"description\": \"The initial frozen time for this test clock.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  },\n                  \"name\": {\n                    \"description\": \"The name for this test clock.\",\n                    \"maxLength\": 300,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"frozen_time\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a test clock\"\n      }\n    },\n    \"/v1/test_helpers/test_clocks/{test_clock}\": {\n      \"delete\": {\n        \"description\": \"<p>Deletes a test clock.</p>\",\n        \"operationId\": \"DeleteTestHelpersTestClocksTestClock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"test_clock\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_test_helpers.test_clock\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a test clock\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves a test clock.</p>\",\n        \"operationId\": \"GetTestHelpersTestClocksTestClock\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"test_clock\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a test clock\"\n      }\n    },\n    \"/v1/test_helpers/test_clocks/{test_clock}/advance\": {\n      \"post\": {\n        \"description\": \"<p>Starts advancing a test clock to a specified time in the future. Advancement is done when status changes to <code>Ready</code>.</p>\",\n        \"operationId\": \"PostTestHelpersTestClocksTestClockAdvance\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"test_clock\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"frozen_time\": {\n                    \"description\": \"The time to advance the test clock. Must be after the test clock's current frozen time. Cannot be more than two intervals in the future from the shortest subscription in this test clock. If there are no subscriptions in this test clock, it cannot be more than two years in the future.\",\n                    \"format\": \"unix-time\",\n                    \"type\": \"integer\"\n                  }\n                },\n                \"required\": [\"frozen_time\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/test_helpers.test_clock\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Advance a test clock\"\n      }\n    },\n    \"/v1/test_helpers/treasury/inbound_transfers/{id}/fail\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created InboundTransfer to the <code>failed</code> status. The InboundTransfer must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryInboundTransfersIdFail\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"failure_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"failure_details\": {\n                    \"description\": \"Details about a failed InboundTransfer.\",\n                    \"properties\": {\n                      \"code\": {\n                        \"enum\": [\n                          \"account_closed\",\n                          \"account_frozen\",\n                          \"bank_account_restricted\",\n                          \"bank_ownership_changed\",\n                          \"debit_not_authorized\",\n                          \"incorrect_account_holder_address\",\n                          \"incorrect_account_holder_name\",\n                          \"incorrect_account_holder_tax_id\",\n                          \"insufficient_funds\",\n                          \"invalid_account_number\",\n                          \"invalid_currency\",\n                          \"no_account\",\n                          \"other\"\n                        ],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"failure_details_param\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Fail an InboundTransfer\"\n      }\n    },\n    \"/v1/test_helpers/treasury/inbound_transfers/{id}/return\": {\n      \"post\": {\n        \"description\": \"<p>Marks the test mode InboundTransfer object as returned and links the InboundTransfer to a ReceivedDebit. The InboundTransfer must already be in the <code>succeeded</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryInboundTransfersIdReturn\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Return an InboundTransfer\"\n      }\n    },\n    \"/v1/test_helpers/treasury/inbound_transfers/{id}/succeed\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created InboundTransfer to the <code>succeeded</code> status. The InboundTransfer must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryInboundTransfersIdSucceed\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Succeed an InboundTransfer\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_payments/{id}\": {\n      \"post\": {\n        \"description\": \"<p>Updates a test mode created OutboundPayment with tracking details. The OutboundPayment must not be cancelable, and cannot be in the <code>canceled</code> or <code>failed</code> states.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundPaymentsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tracking_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"tracking_details\": {\n                    \"description\": \"Details about network-specific tracking information.\",\n                    \"properties\": {\n                      \"ach\": {\n                        \"properties\": {\n                          \"trace_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"trace_id\"],\n                        \"title\": \"ach_tracking_details_params\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"ach\", \"us_domestic_wire\"],\n                        \"type\": \"string\"\n                      },\n                      \"us_domestic_wire\": {\n                        \"properties\": {\n                          \"chips\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"imad\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"omad\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"us_domestic_wire_tracking_details_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"tracking_details_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"tracking_details\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Update an OutboundPayment\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_payments/{id}/fail\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created OutboundPayment to the <code>failed</code> status. The OutboundPayment must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundPaymentsIdFail\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Fail an OutboundPayment\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_payments/{id}/post\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created OutboundPayment to the <code>posted</code> status. The OutboundPayment must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundPaymentsIdPost\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Post an OutboundPayment\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_payments/{id}/return\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created OutboundPayment to the <code>returned</code> status. The OutboundPayment must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundPaymentsIdReturn\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"returned_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"returned_details\": {\n                    \"description\": \"Optional hash to set the return code.\",\n                    \"properties\": {\n                      \"code\": {\n                        \"enum\": [\n                          \"account_closed\",\n                          \"account_frozen\",\n                          \"bank_account_restricted\",\n                          \"bank_ownership_changed\",\n                          \"declined\",\n                          \"incorrect_account_holder_name\",\n                          \"invalid_account_number\",\n                          \"invalid_currency\",\n                          \"no_account\",\n                          \"other\"\n                        ],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"returned_details_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Return an OutboundPayment\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}\": {\n      \"post\": {\n        \"description\": \"<p>Updates a test mode created OutboundTransfer with tracking details. The OutboundTransfer must not be cancelable, and cannot be in the <code>canceled</code> or <code>failed</code> states.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundTransfersOutboundTransfer\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"outbound_transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"tracking_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"tracking_details\": {\n                    \"description\": \"Details about network-specific tracking information.\",\n                    \"properties\": {\n                      \"ach\": {\n                        \"properties\": {\n                          \"trace_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"trace_id\"],\n                        \"title\": \"ach_tracking_details_params\",\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"ach\", \"us_domestic_wire\"],\n                        \"type\": \"string\"\n                      },\n                      \"us_domestic_wire\": {\n                        \"properties\": {\n                          \"chips\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"imad\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"omad\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"us_domestic_wire_tracking_details_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"tracking_details_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"required\": [\"tracking_details\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Update an OutboundTransfer\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}/fail\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created OutboundTransfer to the <code>failed</code> status. The OutboundTransfer must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundTransfersOutboundTransferFail\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"outbound_transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Fail an OutboundTransfer\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}/post\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created OutboundTransfer to the <code>posted</code> status. The OutboundTransfer must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundTransfersOutboundTransferPost\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"outbound_transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Post an OutboundTransfer\"\n      }\n    },\n    \"/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}/return\": {\n      \"post\": {\n        \"description\": \"<p>Transitions a test mode created OutboundTransfer to the <code>returned</code> status. The OutboundTransfer must already be in the <code>processing</code> state.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryOutboundTransfersOutboundTransferReturn\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"outbound_transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"returned_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"returned_details\": {\n                    \"description\": \"Details about a returned OutboundTransfer.\",\n                    \"properties\": {\n                      \"code\": {\n                        \"enum\": [\n                          \"account_closed\",\n                          \"account_frozen\",\n                          \"bank_account_restricted\",\n                          \"bank_ownership_changed\",\n                          \"declined\",\n                          \"incorrect_account_holder_name\",\n                          \"invalid_account_number\",\n                          \"invalid_currency\",\n                          \"no_account\",\n                          \"other\"\n                        ],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"returned_details_params\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Return an OutboundTransfer\"\n      }\n    },\n    \"/v1/test_helpers/treasury/received_credits\": {\n      \"post\": {\n        \"description\": \"<p>Use this endpoint to simulate a test mode ReceivedCredit initiated by a third party. In live mode, you can’t directly create ReceivedCredits initiated by third parties.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryReceivedCredits\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"initiating_payment_method_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount (in cents) to be transferred.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"financial_account\": {\n                    \"description\": \"The FinancialAccount to send funds to.\",\n                    \"type\": \"string\"\n                  },\n                  \"initiating_payment_method_details\": {\n                    \"description\": \"Initiating payment method details for the object.\",\n                    \"properties\": {\n                      \"type\": {\n                        \"enum\": [\"us_bank_account\"],\n                        \"type\": \"string\"\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"us_bank_account_source_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"source_params\",\n                    \"type\": \"object\"\n                  },\n                  \"network\": {\n                    \"description\": \"Specifies the network rails to be used. If not set, will default to the PaymentMethod's preferred network. See the [docs](https://stripe.com/docs/treasury/money-movement/timelines) to learn more about money movement timelines for each network type.\",\n                    \"enum\": [\"ach\", \"us_domestic_wire\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"amount\",\n                  \"currency\",\n                  \"financial_account\",\n                  \"network\"\n                ],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.received_credit\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Create a ReceivedCredit\"\n      }\n    },\n    \"/v1/test_helpers/treasury/received_debits\": {\n      \"post\": {\n        \"description\": \"<p>Use this endpoint to simulate a test mode ReceivedDebit initiated by a third party. In live mode, you can’t directly create ReceivedDebits initiated by third parties.</p>\",\n        \"operationId\": \"PostTestHelpersTreasuryReceivedDebits\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"initiating_payment_method_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount (in cents) to be transferred.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"financial_account\": {\n                    \"description\": \"The FinancialAccount to pull funds from.\",\n                    \"type\": \"string\"\n                  },\n                  \"initiating_payment_method_details\": {\n                    \"description\": \"Initiating payment method details for the object.\",\n                    \"properties\": {\n                      \"type\": {\n                        \"enum\": [\"us_bank_account\"],\n                        \"type\": \"string\"\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"us_bank_account_source_params\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"source_params\",\n                    \"type\": \"object\"\n                  },\n                  \"network\": {\n                    \"description\": \"Specifies the network rails to be used. If not set, will default to the PaymentMethod's preferred network. See the [docs](https://stripe.com/docs/treasury/money-movement/timelines) to learn more about money movement timelines for each network type.\",\n                    \"enum\": [\"ach\"],\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"amount\",\n                  \"currency\",\n                  \"financial_account\",\n                  \"network\"\n                ],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.received_debit\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Test mode: Create a ReceivedDebit\"\n      }\n    },\n    \"/v1/tokens\": {\n      \"post\": {\n        \"description\": \"<p>Creates a single-use token that represents a bank account’s details.\\nYou can use this token with any v1 API method in place of a bank account dictionary. You can only use this token once. To do so, attach it to a <a href=\\\"#accounts\\\">connected account</a> where <a href=\\\"/api/accounts/object#account_object-controller-requirement_collection\\\">controller.requirement_collection</a> is <code>application</code>, which includes Custom accounts.</p>\",\n        \"operationId\": \"PostTokens\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"bank_account\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"card\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"cvc_update\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"person\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"pii\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"account\": {\n                    \"description\": \"Information for the account this token represents.\",\n                    \"properties\": {\n                      \"business_type\": {\n                        \"enum\": [\n                          \"company\",\n                          \"government_entity\",\n                          \"individual\",\n                          \"non_profit\"\n                        ],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"company\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 100,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"legal_entity_and_kyc_address_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"address_kana\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"town\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"japan_address_kana_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"address_kanji\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"town\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"japan_address_kanji_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"directors_provided\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"directorship_declaration\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"company_directorship_declaration\",\n                            \"type\": \"object\"\n                          },\n                          \"executives_provided\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"export_license_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"export_purpose_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"name_kana\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"name_kanji\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"owners_provided\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"ownership_declaration\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"company_ownership_declaration\",\n                            \"type\": \"object\"\n                          },\n                          \"ownership_declaration_shown_and_signed\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"ownership_exemption_reason\": {\n                            \"enum\": [\n                              \"\",\n                              \"qualified_entity_exceeds_ownership_threshold\",\n                              \"qualifies_as_financial_institution\"\n                            ],\n                            \"type\": \"string\"\n                          },\n                          \"phone\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"registration_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"structure\": {\n                            \"enum\": [\n                              \"\",\n                              \"free_zone_establishment\",\n                              \"free_zone_llc\",\n                              \"government_instrumentality\",\n                              \"governmental_unit\",\n                              \"incorporated_non_profit\",\n                              \"incorporated_partnership\",\n                              \"limited_liability_partnership\",\n                              \"llc\",\n                              \"multi_member_llc\",\n                              \"private_company\",\n                              \"private_corporation\",\n                              \"private_partnership\",\n                              \"public_company\",\n                              \"public_corporation\",\n                              \"public_partnership\",\n                              \"registered_charity\",\n                              \"single_member_llc\",\n                              \"sole_establishment\",\n                              \"sole_proprietorship\",\n                              \"tax_exempt_government_instrumentality\",\n                              \"unincorporated_association\",\n                              \"unincorporated_non_profit\",\n                              \"unincorporated_partnership\"\n                            ],\n                            \"type\": \"string\",\n                            \"x-stripeBypassValidation\": true\n                          },\n                          \"tax_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"tax_id_registrar\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"vat_id\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"verification\": {\n                            \"properties\": {\n                              \"document\": {\n                                \"properties\": {\n                                  \"back\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  },\n                                  \"front\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"verification_document_specs\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"verification_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"connect_js_account_token_company_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"individual\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 100,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"address_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"address_kana\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"town\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"japan_address_kana_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"address_kanji\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"town\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"japan_address_kanji_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"dob\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"day\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"month\": {\n                                    \"type\": \"integer\"\n                                  },\n                                  \"year\": {\n                                    \"type\": \"integer\"\n                                  }\n                                },\n                                \"required\": [\"day\", \"month\", \"year\"],\n                                \"title\": \"date_of_birth_specs\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"type\": \"string\"\n                          },\n                          \"first_name\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"first_name_kana\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"first_name_kanji\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"full_name_aliases\": {\n                            \"anyOf\": [\n                              {\n                                \"items\": {\n                                  \"maxLength\": 300,\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"array\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"gender\": {\n                            \"type\": \"string\"\n                          },\n                          \"id_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"id_number_secondary\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"last_name\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"last_name_kana\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"last_name_kanji\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"maiden_name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"metadata\": {\n                            \"anyOf\": [\n                              {\n                                \"additionalProperties\": {\n                                  \"type\": \"string\"\n                                },\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"type\": \"string\"\n                          },\n                          \"political_exposure\": {\n                            \"enum\": [\"existing\", \"none\"],\n                            \"type\": \"string\"\n                          },\n                          \"registered_address\": {\n                            \"properties\": {\n                              \"city\": {\n                                \"maxLength\": 100,\n                                \"type\": \"string\"\n                              },\n                              \"country\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"line1\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"line2\": {\n                                \"maxLength\": 200,\n                                \"type\": \"string\"\n                              },\n                              \"postal_code\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              \"state\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"address_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"relationship\": {\n                            \"properties\": {\n                              \"director\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"executive\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"owner\": {\n                                \"type\": \"boolean\"\n                              },\n                              \"percent_ownership\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"number\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              },\n                              \"title\": {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"individual_relationship_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"ssn_last_4\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"verification\": {\n                            \"properties\": {\n                              \"additional_document\": {\n                                \"properties\": {\n                                  \"back\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  },\n                                  \"front\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"person_verification_document_specs\",\n                                \"type\": \"object\"\n                              },\n                              \"document\": {\n                                \"properties\": {\n                                  \"back\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  },\n                                  \"front\": {\n                                    \"maxLength\": 500,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"person_verification_document_specs\",\n                                \"type\": \"object\"\n                              }\n                            },\n                            \"title\": \"person_verification_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"individual_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"tos_shown_and_accepted\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"title\": \"connect_js_account_token_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"bank_account\": {\n                    \"description\": \"The bank account this token will represent.\",\n                    \"properties\": {\n                      \"account_holder_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"account_holder_type\": {\n                        \"enum\": [\"company\", \"individual\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"account_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"account_type\": {\n                        \"enum\": [\"checking\", \"futsu\", \"savings\", \"toza\"],\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"country\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"currency\": {\n                        \"format\": \"currency\",\n                        \"type\": \"string\"\n                      },\n                      \"payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"routing_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"account_number\", \"country\"],\n                    \"title\": \"token_create_bank_account\",\n                    \"type\": \"object\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"card\": {\n                    \"anyOf\": [\n                      {\n                        \"properties\": {\n                          \"address_city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"address_zip\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"currency\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"cvc\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_month\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"exp_year\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"name\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"networks\": {\n                            \"properties\": {\n                              \"preferred\": {\n                                \"enum\": [\n                                  \"cartes_bancaires\",\n                                  \"mastercard\",\n                                  \"visa\"\n                                ],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"networks_param_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"exp_month\", \"exp_year\", \"number\"],\n                        \"title\": \"credit_card_specs\",\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The card this token will represent. If you also pass in a customer, the card must be the ID of a card belonging to the customer. Otherwise, if you do not pass in a customer, this is a dictionary containing a user's credit card details, with the options described below.\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"customer\": {\n                    \"description\": \"Create a token for the customer, which is owned by the application's account. You can only use this with an [OAuth access token](https://stripe.com/docs/connect/standard-accounts) or [Stripe-Account header](https://stripe.com/docs/connect/authentication). Learn more about [cloning saved payment methods](https://stripe.com/docs/connect/cloning-saved-payment-methods).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"cvc_update\": {\n                    \"description\": \"The updated CVC value this token represents.\",\n                    \"properties\": {\n                      \"cvc\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"cvc\"],\n                    \"title\": \"cvc_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"person\": {\n                    \"description\": \"Information for the person this token represents.\",\n                    \"properties\": {\n                      \"additional_tos_acceptances\": {\n                        \"properties\": {\n                          \"account\": {\n                            \"properties\": {\n                              \"date\": {\n                                \"format\": \"unix-time\",\n                                \"type\": \"integer\"\n                              },\n                              \"ip\": {\n                                \"type\": \"string\"\n                              },\n                              \"user_agent\": {\n                                \"anyOf\": [\n                                  {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  {\n                                    \"enum\": [\"\"],\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            \"title\": \"settings_terms_of_service_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"person_additional_tos_acceptances_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"legal_entity_and_kyc_address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kana\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kana_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"address_kanji\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"town\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"japan_address_kanji_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"dob\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"day\": {\n                                \"type\": \"integer\"\n                              },\n                              \"month\": {\n                                \"type\": \"integer\"\n                              },\n                              \"year\": {\n                                \"type\": \"integer\"\n                              }\n                            },\n                            \"required\": [\"day\", \"month\", \"year\"],\n                            \"title\": \"date_of_birth_specs\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"documents\": {\n                        \"properties\": {\n                          \"company_authorization\": {\n                            \"properties\": {\n                              \"files\": {\n                                \"items\": {\n                                  \"anyOf\": [\n                                    {\n                                      \"maxLength\": 500,\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"enum\": [\"\"],\n                                      \"type\": \"string\"\n                                    }\n                                  ]\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"documents_param\",\n                            \"type\": \"object\"\n                          },\n                          \"passport\": {\n                            \"properties\": {\n                              \"files\": {\n                                \"items\": {\n                                  \"anyOf\": [\n                                    {\n                                      \"maxLength\": 500,\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"enum\": [\"\"],\n                                      \"type\": \"string\"\n                                    }\n                                  ]\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"documents_param\",\n                            \"type\": \"object\"\n                          },\n                          \"visa\": {\n                            \"properties\": {\n                              \"files\": {\n                                \"items\": {\n                                  \"anyOf\": [\n                                    {\n                                      \"maxLength\": 500,\n                                      \"type\": \"string\"\n                                    },\n                                    {\n                                      \"enum\": [\"\"],\n                                      \"type\": \"string\"\n                                    }\n                                  ]\n                                },\n                                \"type\": \"array\"\n                              }\n                            },\n                            \"title\": \"documents_param\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"person_documents_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"email\": {\n                        \"type\": \"string\"\n                      },\n                      \"first_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"first_name_kana\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"first_name_kanji\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"full_name_aliases\": {\n                        \"anyOf\": [\n                          {\n                            \"items\": {\n                              \"maxLength\": 5000,\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"array\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"gender\": {\n                        \"type\": \"string\"\n                      },\n                      \"id_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"id_number_secondary\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"last_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"last_name_kana\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"last_name_kanji\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"maiden_name\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"anyOf\": [\n                          {\n                            \"additionalProperties\": {\n                              \"type\": \"string\"\n                            },\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"nationality\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"phone\": {\n                        \"type\": \"string\"\n                      },\n                      \"political_exposure\": {\n                        \"enum\": [\"existing\", \"none\"],\n                        \"type\": \"string\"\n                      },\n                      \"registered_address\": {\n                        \"properties\": {\n                          \"city\": {\n                            \"maxLength\": 100,\n                            \"type\": \"string\"\n                          },\n                          \"country\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"line1\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"line2\": {\n                            \"maxLength\": 200,\n                            \"type\": \"string\"\n                          },\n                          \"postal_code\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"state\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"address_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"relationship\": {\n                        \"properties\": {\n                          \"authorizer\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"director\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"executive\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"legal_guardian\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"owner\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"percent_ownership\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"number\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"representative\": {\n                            \"type\": \"boolean\"\n                          },\n                          \"title\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"relationship_specs\",\n                        \"type\": \"object\"\n                      },\n                      \"ssn_last_4\": {\n                        \"type\": \"string\"\n                      },\n                      \"verification\": {\n                        \"properties\": {\n                          \"additional_document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_specs\",\n                            \"type\": \"object\"\n                          },\n                          \"document\": {\n                            \"properties\": {\n                              \"back\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              },\n                              \"front\": {\n                                \"maxLength\": 500,\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"person_verification_document_specs\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"person_verification_specs\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"person_token_specs\",\n                    \"type\": \"object\"\n                  },\n                  \"pii\": {\n                    \"description\": \"The PII this token represents.\",\n                    \"properties\": {\n                      \"id_number\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"pii_token_specs\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/token\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a CVC update token\"\n      }\n    },\n    \"/v1/tokens/{token}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the token with the given ID.</p>\",\n        \"operationId\": \"GetTokensToken\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"token\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/token\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a token\"\n      }\n    },\n    \"/v1/topups\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of top-ups.</p>\",\n        \"operationId\": \"GetTopups\",\n        \"parameters\": [\n          {\n            \"description\": \"A positive integer representing how much to transfer.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"amount\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A filter on the list, based on the object `created` field. The value can be a string with an integer Unix timestamp, or it can be a dictionary with a number of different query options.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return top-ups that have the given status. One of `canceled`, `failed`, `pending` or `succeeded`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"canceled\", \"failed\", \"pending\", \"succeeded\"],\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/topup\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/topups\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TopupList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all top-ups\"\n      },\n      \"post\": {\n        \"description\": \"<p>Top up the balance of an account</p>\",\n        \"operationId\": \"PostTopups\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"A positive integer representing how much to transfer.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"source\": {\n                    \"description\": \"The ID of a source to transfer funds from. For most users, this should be left unspecified which will use the bank account that was set up in the dashboard for the specified currency. In test mode, this can be a test bank token (see [Testing Top-ups](https://stripe.com/docs/connect/testing#testing-top-ups)).\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Extra information about a top-up for the source's bank statement. Limited to 15 ASCII characters.\",\n                    \"maxLength\": 15,\n                    \"type\": \"string\"\n                  },\n                  \"transfer_group\": {\n                    \"description\": \"A string that identifies this top-up as part of a group.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"amount\", \"currency\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/topup\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a top-up\"\n      }\n    },\n    \"/v1/topups/{topup}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a top-up that has previously been created. Supply the unique top-up ID that was returned from your previous request, and Stripe will return the corresponding top-up information.</p>\",\n        \"operationId\": \"GetTopupsTopup\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"topup\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/topup\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a top-up\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the metadata of a top-up. Other top-up details are not editable by design.</p>\",\n        \"operationId\": \"PostTopupsTopup\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"topup\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/topup\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a top-up\"\n      }\n    },\n    \"/v1/topups/{topup}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>Cancels a top-up. Only pending top-ups can be canceled.</p>\",\n        \"operationId\": \"PostTopupsTopupCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"topup\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/topup\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel a top-up\"\n      }\n    },\n    \"/v1/transfers\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of existing transfers sent to connected accounts. The transfers are returned in sorted order, with the most recently created transfers appearing first.</p>\",\n        \"operationId\": \"GetTransfers\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return transfers that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return transfers for the destination specified by this account ID.\",\n            \"in\": \"query\",\n            \"name\": \"destination\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return transfers with the specified transfer group.\",\n            \"in\": \"query\",\n            \"name\": \"transfer_group\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/transfer\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/transfers\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TransferList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all transfers\"\n      },\n      \"post\": {\n        \"description\": \"<p>To send funds from your Stripe account to a connected account, you create a new transfer object. Your <a href=\\\"#balance\\\">Stripe balance</a> must be able to cover the transfer amount, or you’ll receive an “Insufficient Funds” error.</p>\",\n        \"operationId\": \"PostTransfers\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"A positive integer in cents (or local equivalent) representing how much to transfer.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO code for currency](https://www.iso.org/iso-4217-currency-codes.html) in lowercase. Must be a [supported currency](https://docs.stripe.com/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"destination\": {\n                    \"description\": \"The ID of a connected Stripe account. <a href=\\\"/docs/connect/separate-charges-and-transfers\\\">See the Connect documentation</a> for details.\",\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"source_transaction\": {\n                    \"description\": \"You can use this parameter to transfer funds from a charge before they are added to your available balance. A pending balance will transfer immediately but the funds will not become available until the original charge becomes available. [See the Connect documentation](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-availability) for details.\",\n                    \"type\": \"string\"\n                  },\n                  \"source_type\": {\n                    \"description\": \"The source balance to use for this transfer. One of `bank_account`, `card`, or `fpx`. For most users, this will default to `card`.\",\n                    \"enum\": [\"bank_account\", \"card\", \"fpx\"],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"transfer_group\": {\n                    \"description\": \"A string that identifies this transaction as part of a group. See the [Connect documentation](https://stripe.com/docs/connect/separate-charges-and-transfers#transfer-options) for details.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"currency\", \"destination\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a transfer\"\n      }\n    },\n    \"/v1/transfers/{id}/reversals\": {\n      \"get\": {\n        \"description\": \"<p>You can see a list of the reversals belonging to a specific transfer. Note that the 10 most recent reversals are always available by default on the transfer object. If you need more than those 10, you can use this API method and the <code>limit</code> and <code>starting_after</code> parameters to page through additional reversals.</p>\",\n        \"operationId\": \"GetTransfersIdReversals\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/transfer_reversal\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TransferReversalList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all reversals\"\n      },\n      \"post\": {\n        \"description\": \"<p>When you create a new reversal, you must specify a transfer to create it on.</p>\\n\\n<p>When reversing transfers, you can optionally reverse part of the transfer. You can do so as many times as you wish until the entire transfer has been reversed.</p>\\n\\n<p>Once entirely reversed, a transfer can’t be reversed again. This method will return an error when called on an already-reversed transfer, or when trying to reverse more money than is left on a transfer.</p>\",\n        \"operationId\": \"PostTransfersIdReversals\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"A positive integer in cents (or local equivalent) representing how much of this transfer to reverse. Can only reverse up to the unreversed amount remaining of the transfer. Partial transfer reversals are only allowed for transfers to Stripe Accounts. Defaults to the entire transfer amount.\",\n                    \"type\": \"integer\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string which you can attach to a reversal object. This will be unset if you POST an empty value.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"refund_application_fee\": {\n                    \"description\": \"Boolean indicating whether the application fee should be refunded when reversing this transfer. If a full transfer reversal is given, the full application fee will be refunded. Otherwise, the application fee will be refunded with an amount proportional to the amount of the transfer reversed.\",\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/transfer_reversal\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a transfer reversal\"\n      }\n    },\n    \"/v1/transfers/{transfer}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing transfer. Supply the unique transfer ID from either a transfer creation request or the transfer list, and Stripe will return the corresponding transfer information.</p>\",\n        \"operationId\": \"GetTransfersTransfer\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a transfer\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified transfer by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\\n\\n<p>This request accepts only metadata as an argument.</p>\",\n        \"operationId\": \"PostTransfersTransfer\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a transfer\"\n      }\n    },\n    \"/v1/transfers/{transfer}/reversals/{id}\": {\n      \"get\": {\n        \"description\": \"<p>By default, you can see the 10 most recent reversals stored directly on the transfer object, but you can also retrieve details about a specific reversal stored on the transfer.</p>\",\n        \"operationId\": \"GetTransfersTransferReversalsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/transfer_reversal\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a reversal\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the specified reversal by setting the values of the parameters passed. Any parameters not provided will be left unchanged.</p>\\n\\n<p>This request only accepts metadata and description as arguments.</p>\",\n        \"operationId\": \"PostTransfersTransferReversalsId\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/transfer_reversal\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a reversal\"\n      }\n    },\n    \"/v1/treasury/credit_reversals\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of CreditReversals.</p>\",\n        \"operationId\": \"GetTreasuryCreditReversals\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Returns objects associated with this FinancialAccount.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return CreditReversals for the ReceivedCredit ID.\",\n            \"in\": \"query\",\n            \"name\": \"received_credit\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return CreditReversals for a given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"canceled\", \"posted\", \"processing\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.credit_reversal\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryReceivedCreditsResourceCreditReversalList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all CreditReversals\"\n      },\n      \"post\": {\n        \"description\": \"<p>Reverses a ReceivedCredit and creates a CreditReversal object.</p>\",\n        \"operationId\": \"PostTreasuryCreditReversals\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"received_credit\": {\n                    \"description\": \"The ReceivedCredit to reverse.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"received_credit\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.credit_reversal\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a CreditReversal\"\n      }\n    },\n    \"/v1/treasury/credit_reversals/{credit_reversal}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing CreditReversal by passing the unique CreditReversal ID from either the CreditReversal creation request or CreditReversal list</p>\",\n        \"operationId\": \"GetTreasuryCreditReversalsCreditReversal\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"credit_reversal\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.credit_reversal\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a CreditReversal\"\n      }\n    },\n    \"/v1/treasury/debit_reversals\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of DebitReversals.</p>\",\n        \"operationId\": \"GetTreasuryDebitReversals\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Returns objects associated with this FinancialAccount.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return DebitReversals for the ReceivedDebit ID.\",\n            \"in\": \"query\",\n            \"name\": \"received_debit\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return DebitReversals for a given resolution.\",\n            \"in\": \"query\",\n            \"name\": \"resolution\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"lost\", \"won\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return DebitReversals for a given status.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"canceled\", \"completed\", \"processing\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.debit_reversal\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryReceivedDebitsResourceDebitReversalList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all DebitReversals\"\n      },\n      \"post\": {\n        \"description\": \"<p>Reverses a ReceivedDebit and creates a DebitReversal object.</p>\",\n        \"operationId\": \"PostTreasuryDebitReversals\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"received_debit\": {\n                    \"description\": \"The ReceivedDebit to reverse.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"received_debit\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.debit_reversal\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a DebitReversal\"\n      }\n    },\n    \"/v1/treasury/debit_reversals/{debit_reversal}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a DebitReversal object.</p>\",\n        \"operationId\": \"GetTreasuryDebitReversalsDebitReversal\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"debit_reversal\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.debit_reversal\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a DebitReversal\"\n      }\n    },\n    \"/v1/treasury/financial_accounts\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of FinancialAccounts.</p>\",\n        \"operationId\": \"GetTreasuryFinancialAccounts\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return FinancialAccounts that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"An object ID cursor for use in pagination.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit ranging from 1 to 100 (defaults to 10).\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"An object ID cursor for use in pagination.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.financial_account\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/treasury/financial_accounts\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryFinancialAccountsResourceFinancialAccountList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all FinancialAccounts\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates a new FinancialAccount. For now, each connected account can only have one FinancialAccount.</p>\",\n        \"operationId\": \"PostTreasuryFinancialAccounts\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"nickname\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"platform_restrictions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"supported_currencies\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"Encodes whether a FinancialAccount has access to a particular feature. Stripe or the platform can control features via the requested field.\",\n                    \"properties\": {\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      },\n                      \"deposit_insurance\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      },\n                      \"financial_addresses\": {\n                        \"properties\": {\n                          \"aba\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"aba_access\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"financial_addresses\",\n                        \"type\": \"object\"\n                      },\n                      \"inbound_transfers\": {\n                        \"properties\": {\n                          \"ach\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access_with_ach_details\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"inbound_transfers\",\n                        \"type\": \"object\"\n                      },\n                      \"intra_stripe_flows\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      },\n                      \"outbound_payments\": {\n                        \"properties\": {\n                          \"ach\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access_with_ach_details\",\n                            \"type\": \"object\"\n                          },\n                          \"us_domestic_wire\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"outbound_payments\",\n                        \"type\": \"object\"\n                      },\n                      \"outbound_transfers\": {\n                        \"properties\": {\n                          \"ach\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access_with_ach_details\",\n                            \"type\": \"object\"\n                          },\n                          \"us_domestic_wire\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"outbound_transfers\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"feature_access\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"nickname\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The nickname for the FinancialAccount.\"\n                  },\n                  \"platform_restrictions\": {\n                    \"description\": \"The set of functionalities that the platform can restrict on the FinancialAccount.\",\n                    \"properties\": {\n                      \"inbound_flows\": {\n                        \"enum\": [\"restricted\", \"unrestricted\"],\n                        \"type\": \"string\"\n                      },\n                      \"outbound_flows\": {\n                        \"enum\": [\"restricted\", \"unrestricted\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"platform_restrictions\",\n                    \"type\": \"object\"\n                  },\n                  \"supported_currencies\": {\n                    \"description\": \"The currencies the FinancialAccount can hold a balance in.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"required\": [\"supported_currencies\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.financial_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a FinancialAccount\"\n      }\n    },\n    \"/v1/treasury/financial_accounts/{financial_account}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of a FinancialAccount.</p>\",\n        \"operationId\": \"GetTreasuryFinancialAccountsFinancialAccount\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.financial_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a FinancialAccount\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the details of a FinancialAccount.</p>\",\n        \"operationId\": \"PostTreasuryFinancialAccountsFinancialAccount\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"features\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"forwarding_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"nickname\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"platform_restrictions\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"features\": {\n                    \"description\": \"Encodes whether a FinancialAccount has access to a particular feature, with a status enum and associated `status_details`. Stripe or the platform may control features via the requested field.\",\n                    \"properties\": {\n                      \"card_issuing\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      },\n                      \"deposit_insurance\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      },\n                      \"financial_addresses\": {\n                        \"properties\": {\n                          \"aba\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"aba_access\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"financial_addresses\",\n                        \"type\": \"object\"\n                      },\n                      \"inbound_transfers\": {\n                        \"properties\": {\n                          \"ach\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access_with_ach_details\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"inbound_transfers\",\n                        \"type\": \"object\"\n                      },\n                      \"intra_stripe_flows\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      },\n                      \"outbound_payments\": {\n                        \"properties\": {\n                          \"ach\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access_with_ach_details\",\n                            \"type\": \"object\"\n                          },\n                          \"us_domestic_wire\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"outbound_payments\",\n                        \"type\": \"object\"\n                      },\n                      \"outbound_transfers\": {\n                        \"properties\": {\n                          \"ach\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access_with_ach_details\",\n                            \"type\": \"object\"\n                          },\n                          \"us_domestic_wire\": {\n                            \"properties\": {\n                              \"requested\": {\n                                \"type\": \"boolean\"\n                              }\n                            },\n                            \"required\": [\"requested\"],\n                            \"title\": \"access\",\n                            \"type\": \"object\"\n                          }\n                        },\n                        \"title\": \"outbound_transfers\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"feature_access\",\n                    \"type\": \"object\"\n                  },\n                  \"forwarding_settings\": {\n                    \"description\": \"A different bank account where funds can be deposited/debited in order to get the closing FA's balance to $0\",\n                    \"properties\": {\n                      \"financial_account\": {\n                        \"type\": \"string\"\n                      },\n                      \"payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"financial_account\", \"payment_method\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"forwarding_settings\",\n                    \"type\": \"object\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"nickname\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"The nickname for the FinancialAccount.\"\n                  },\n                  \"platform_restrictions\": {\n                    \"description\": \"The set of functionalities that the platform can restrict on the FinancialAccount.\",\n                    \"properties\": {\n                      \"inbound_flows\": {\n                        \"enum\": [\"restricted\", \"unrestricted\"],\n                        \"type\": \"string\"\n                      },\n                      \"outbound_flows\": {\n                        \"enum\": [\"restricted\", \"unrestricted\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"title\": \"platform_restrictions\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.financial_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a FinancialAccount\"\n      }\n    },\n    \"/v1/treasury/financial_accounts/{financial_account}/close\": {\n      \"post\": {\n        \"description\": \"<p>Closes a FinancialAccount. A FinancialAccount can only be closed if it has a zero balance, has no pending InboundTransfers, and has canceled all attached Issuing cards.</p>\",\n        \"operationId\": \"PostTreasuryFinancialAccountsFinancialAccountClose\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"forwarding_settings\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"forwarding_settings\": {\n                    \"description\": \"A different bank account where funds can be deposited/debited in order to get the closing FA's balance to $0\",\n                    \"properties\": {\n                      \"financial_account\": {\n                        \"type\": \"string\"\n                      },\n                      \"payment_method\": {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"financial_account\", \"payment_method\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"forwarding_settings\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.financial_account\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Close a FinancialAccount\"\n      }\n    },\n    \"/v1/treasury/financial_accounts/{financial_account}/features\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves Features information associated with the FinancialAccount.</p>\",\n        \"operationId\": \"GetTreasuryFinancialAccountsFinancialAccountFeatures\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.financial_account_features\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve FinancialAccount Features\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the Features associated with a FinancialAccount.</p>\",\n        \"operationId\": \"PostTreasuryFinancialAccountsFinancialAccountFeatures\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"card_issuing\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"deposit_insurance\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"financial_addresses\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"inbound_transfers\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"intra_stripe_flows\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"outbound_payments\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"outbound_transfers\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"card_issuing\": {\n                    \"description\": \"Encodes the FinancialAccount's ability to be used with the Issuing product, including attaching cards to and drawing funds from the FinancialAccount.\",\n                    \"properties\": {\n                      \"requested\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"requested\"],\n                    \"title\": \"access\",\n                    \"type\": \"object\"\n                  },\n                  \"deposit_insurance\": {\n                    \"description\": \"Represents whether this FinancialAccount is eligible for deposit insurance. Various factors determine the insurance amount.\",\n                    \"properties\": {\n                      \"requested\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"requested\"],\n                    \"title\": \"access\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"financial_addresses\": {\n                    \"description\": \"Contains Features that add FinancialAddresses to the FinancialAccount.\",\n                    \"properties\": {\n                      \"aba\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"aba_access\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"financial_addresses\",\n                    \"type\": \"object\"\n                  },\n                  \"inbound_transfers\": {\n                    \"description\": \"Contains settings related to adding funds to a FinancialAccount from another Account with the same owner.\",\n                    \"properties\": {\n                      \"ach\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access_with_ach_details\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"inbound_transfers\",\n                    \"type\": \"object\"\n                  },\n                  \"intra_stripe_flows\": {\n                    \"description\": \"Represents the ability for the FinancialAccount to send money to, or receive money from other FinancialAccounts (for example, via OutboundPayment).\",\n                    \"properties\": {\n                      \"requested\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"requested\"],\n                    \"title\": \"access\",\n                    \"type\": \"object\"\n                  },\n                  \"outbound_payments\": {\n                    \"description\": \"Includes Features related to initiating money movement out of the FinancialAccount to someone else's bucket of money.\",\n                    \"properties\": {\n                      \"ach\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access_with_ach_details\",\n                        \"type\": \"object\"\n                      },\n                      \"us_domestic_wire\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"outbound_payments\",\n                    \"type\": \"object\"\n                  },\n                  \"outbound_transfers\": {\n                    \"description\": \"Contains a Feature and settings related to moving money out of the FinancialAccount into another Account with the same owner.\",\n                    \"properties\": {\n                      \"ach\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access_with_ach_details\",\n                        \"type\": \"object\"\n                      },\n                      \"us_domestic_wire\": {\n                        \"properties\": {\n                          \"requested\": {\n                            \"type\": \"boolean\"\n                          }\n                        },\n                        \"required\": [\"requested\"],\n                        \"title\": \"access\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"title\": \"outbound_transfers\",\n                    \"type\": \"object\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.financial_account_features\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update FinancialAccount Features\"\n      }\n    },\n    \"/v1/treasury/inbound_transfers\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of InboundTransfers sent from the specified FinancialAccount.</p>\",\n        \"operationId\": \"GetTreasuryInboundTransfers\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Returns objects associated with this FinancialAccount.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return InboundTransfers that have the given status: `processing`, `succeeded`, `failed` or `canceled`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"canceled\", \"failed\", \"processing\", \"succeeded\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryInboundTransfersResourceInboundTransferList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all InboundTransfers\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates an InboundTransfer.</p>\",\n        \"operationId\": \"PostTreasuryInboundTransfers\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount (in cents) to be transferred.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"financial_account\": {\n                    \"description\": \"The FinancialAccount to send funds to.\",\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"origin_payment_method\": {\n                    \"description\": \"The origin payment method to be debited for the InboundTransfer.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"The complete description that appears on your customers' statements. Maximum 10 characters.\",\n                    \"maxLength\": 10,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"amount\",\n                  \"currency\",\n                  \"financial_account\",\n                  \"origin_payment_method\"\n                ],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an InboundTransfer\"\n      }\n    },\n    \"/v1/treasury/inbound_transfers/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing InboundTransfer.</p>\",\n        \"operationId\": \"GetTreasuryInboundTransfersId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an InboundTransfer\"\n      }\n    },\n    \"/v1/treasury/inbound_transfers/{inbound_transfer}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>Cancels an InboundTransfer.</p>\",\n        \"operationId\": \"PostTreasuryInboundTransfersInboundTransferCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"inbound_transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.inbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel an InboundTransfer\"\n      }\n    },\n    \"/v1/treasury/outbound_payments\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of OutboundPayments sent from the specified FinancialAccount.</p>\",\n        \"operationId\": \"GetTreasuryOutboundPayments\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return OutboundPayments that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Only return OutboundPayments sent to this customer.\",\n            \"in\": \"query\",\n            \"name\": \"customer\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Returns objects associated with this FinancialAccount.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return OutboundPayments that have the given status: `processing`, `failed`, `posted`, `returned`, or `canceled`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"canceled\",\n                \"failed\",\n                \"posted\",\n                \"processing\",\n                \"returned\"\n              ],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/treasury/outbound_payments\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryOutboundPaymentsResourceOutboundPaymentList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all OutboundPayments\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates an OutboundPayment.</p>\",\n        \"operationId\": \"PostTreasuryOutboundPayments\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"destination_payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"destination_payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"end_user_details\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount (in cents) to be transferred.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"customer\": {\n                    \"description\": \"ID of the customer to whom the OutboundPayment is sent. Must match the Customer attached to the `destination_payment_method` passed in.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"destination_payment_method\": {\n                    \"description\": \"The PaymentMethod to use as the payment instrument for the OutboundPayment. Exclusive with `destination_payment_method_data`.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"destination_payment_method_data\": {\n                    \"description\": \"Hash used to generate the PaymentMethod to be used for this OutboundPayment. Exclusive with `destination_payment_method`.\",\n                    \"properties\": {\n                      \"billing_details\": {\n                        \"properties\": {\n                          \"address\": {\n                            \"anyOf\": [\n                              {\n                                \"properties\": {\n                                  \"city\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"country\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line1\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"line2\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"postal_code\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  },\n                                  \"state\": {\n                                    \"maxLength\": 5000,\n                                    \"type\": \"string\"\n                                  }\n                                },\n                                \"title\": \"billing_details_address\",\n                                \"type\": \"object\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"email\": {\n                            \"anyOf\": [\n                              {\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"name\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          },\n                          \"phone\": {\n                            \"anyOf\": [\n                              {\n                                \"maxLength\": 5000,\n                                \"type\": \"string\"\n                              },\n                              {\n                                \"enum\": [\"\"],\n                                \"type\": \"string\"\n                              }\n                            ]\n                          }\n                        },\n                        \"title\": \"billing_details_inner_params\",\n                        \"type\": \"object\"\n                      },\n                      \"financial_account\": {\n                        \"type\": \"string\"\n                      },\n                      \"metadata\": {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"financial_account\", \"us_bank_account\"],\n                        \"type\": \"string\",\n                        \"x-stripeBypassValidation\": true\n                      },\n                      \"us_bank_account\": {\n                        \"properties\": {\n                          \"account_holder_type\": {\n                            \"enum\": [\"company\", \"individual\"],\n                            \"type\": \"string\"\n                          },\n                          \"account_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"account_type\": {\n                            \"enum\": [\"checking\", \"savings\"],\n                            \"type\": \"string\"\n                          },\n                          \"financial_connections_account\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          },\n                          \"routing_number\": {\n                            \"maxLength\": 5000,\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"title\": \"payment_method_param\",\n                        \"type\": \"object\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data\",\n                    \"type\": \"object\"\n                  },\n                  \"destination_payment_method_options\": {\n                    \"description\": \"Payment method-specific configuration for this OutboundPayment.\",\n                    \"properties\": {\n                      \"us_bank_account\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"network\": {\n                                \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_method_options\",\n                    \"type\": \"object\"\n                  },\n                  \"end_user_details\": {\n                    \"description\": \"End user details.\",\n                    \"properties\": {\n                      \"ip_address\": {\n                        \"type\": \"string\"\n                      },\n                      \"present\": {\n                        \"type\": \"boolean\"\n                      }\n                    },\n                    \"required\": [\"present\"],\n                    \"title\": \"end_user_details_params\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"financial_account\": {\n                    \"description\": \"The FinancialAccount to pull funds from.\",\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"The description that appears on the receiving end for this OutboundPayment (for example, bank statement for external bank transfer). Maximum 10 characters for `ach` payments, 140 characters for `us_domestic_wire` payments, or 500 characters for `stripe` network transfers. The default value is \\\"payment\\\".\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"amount\", \"currency\", \"financial_account\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an OutboundPayment\"\n      }\n    },\n    \"/v1/treasury/outbound_payments/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing OutboundPayment by passing the unique OutboundPayment ID from either the OutboundPayment creation request or OutboundPayment list.</p>\",\n        \"operationId\": \"GetTreasuryOutboundPaymentsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an OutboundPayment\"\n      }\n    },\n    \"/v1/treasury/outbound_payments/{id}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>Cancel an OutboundPayment.</p>\",\n        \"operationId\": \"PostTreasuryOutboundPaymentsIdCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_payment\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel an OutboundPayment\"\n      }\n    },\n    \"/v1/treasury/outbound_transfers\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of OutboundTransfers sent from the specified FinancialAccount.</p>\",\n        \"operationId\": \"GetTreasuryOutboundTransfers\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Returns objects associated with this FinancialAccount.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return OutboundTransfers that have the given status: `processing`, `canceled`, `failed`, `posted`, or `returned`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\n                \"canceled\",\n                \"failed\",\n                \"posted\",\n                \"processing\",\n                \"returned\"\n              ],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryOutboundTransfersResourceOutboundTransferList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all OutboundTransfers\"\n      },\n      \"post\": {\n        \"description\": \"<p>Creates an OutboundTransfer.</p>\",\n        \"operationId\": \"PostTreasuryOutboundTransfers\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"destination_payment_method_data\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"destination_payment_method_options\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"amount\": {\n                    \"description\": \"Amount (in cents) to be transferred.\",\n                    \"type\": \"integer\"\n                  },\n                  \"currency\": {\n                    \"description\": \"Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies).\",\n                    \"format\": \"currency\",\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"description\": \"An arbitrary string attached to the object. Often useful for displaying to users.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"destination_payment_method\": {\n                    \"description\": \"The PaymentMethod to use as the payment instrument for the OutboundTransfer.\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  },\n                  \"destination_payment_method_data\": {\n                    \"description\": \"Hash used to generate the PaymentMethod to be used for this OutboundTransfer. Exclusive with `destination_payment_method`.\",\n                    \"properties\": {\n                      \"financial_account\": {\n                        \"type\": \"string\"\n                      },\n                      \"type\": {\n                        \"enum\": [\"financial_account\"],\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\"],\n                    \"title\": \"payment_method_data\",\n                    \"type\": \"object\"\n                  },\n                  \"destination_payment_method_options\": {\n                    \"description\": \"Hash describing payment method configuration details.\",\n                    \"properties\": {\n                      \"us_bank_account\": {\n                        \"anyOf\": [\n                          {\n                            \"properties\": {\n                              \"network\": {\n                                \"enum\": [\"ach\", \"us_domestic_wire\"],\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"title\": \"payment_method_options_param\",\n                            \"type\": \"object\"\n                          },\n                          {\n                            \"enum\": [\"\"],\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    \"title\": \"payment_method_options\",\n                    \"type\": \"object\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"financial_account\": {\n                    \"description\": \"The FinancialAccount to pull funds from.\",\n                    \"type\": \"string\"\n                  },\n                  \"metadata\": {\n                    \"additionalProperties\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\",\n                    \"type\": \"object\"\n                  },\n                  \"statement_descriptor\": {\n                    \"description\": \"Statement descriptor to be shown on the receiving end of an OutboundTransfer. Maximum 10 characters for `ach` transfers or 140 characters for `us_domestic_wire` transfers. The default value is \\\"transfer\\\".\",\n                    \"maxLength\": 5000,\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"amount\", \"currency\", \"financial_account\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create an OutboundTransfer\"\n      }\n    },\n    \"/v1/treasury/outbound_transfers/{outbound_transfer}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing OutboundTransfer by passing the unique OutboundTransfer ID from either the OutboundTransfer creation request or OutboundTransfer list.</p>\",\n        \"operationId\": \"GetTreasuryOutboundTransfersOutboundTransfer\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"outbound_transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve an OutboundTransfer\"\n      }\n    },\n    \"/v1/treasury/outbound_transfers/{outbound_transfer}/cancel\": {\n      \"post\": {\n        \"description\": \"<p>An OutboundTransfer can be canceled if the funds have not yet been paid out.</p>\",\n        \"operationId\": \"PostTreasuryOutboundTransfersOutboundTransferCancel\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"outbound_transfer\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.outbound_transfer\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Cancel an OutboundTransfer\"\n      }\n    },\n    \"/v1/treasury/received_credits\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of ReceivedCredits.</p>\",\n        \"operationId\": \"GetTreasuryReceivedCredits\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The FinancialAccount that received the funds.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return ReceivedCredits described by the flow.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"linked_flows\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"source_flow_type\": {\n                  \"enum\": [\n                    \"credit_reversal\",\n                    \"other\",\n                    \"outbound_payment\",\n                    \"outbound_transfer\",\n                    \"payout\"\n                  ],\n                  \"type\": \"string\"\n                }\n              },\n              \"required\": [\"source_flow_type\"],\n              \"title\": \"linked_flows_param\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return ReceivedCredits that have the given status: `succeeded` or `failed`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"failed\", \"succeeded\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.received_credit\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryReceivedCreditsResourceReceivedCreditList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all ReceivedCredits\"\n      }\n    },\n    \"/v1/treasury/received_credits/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing ReceivedCredit by passing the unique ReceivedCredit ID from the ReceivedCredit list.</p>\",\n        \"operationId\": \"GetTreasuryReceivedCreditsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.received_credit\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a ReceivedCredit\"\n      }\n    },\n    \"/v1/treasury/received_debits\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of ReceivedDebits.</p>\",\n        \"operationId\": \"GetTreasuryReceivedDebits\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"The FinancialAccount that funds were pulled from.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return ReceivedDebits that have the given status: `succeeded` or `failed`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"failed\", \"succeeded\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.received_debit\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryReceivedDebitsResourceReceivedDebitList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all ReceivedDebits\"\n      }\n    },\n    \"/v1/treasury/received_debits/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing ReceivedDebit by passing the unique ReceivedDebit ID from the ReceivedDebit list</p>\",\n        \"operationId\": \"GetTreasuryReceivedDebitsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.received_debit\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a ReceivedDebit\"\n      }\n    },\n    \"/v1/treasury/transaction_entries\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a list of TransactionEntry objects.</p>\",\n        \"operationId\": \"GetTreasuryTransactionEntries\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return TransactionEntries that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"effective_at\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Returns objects associated with this FinancialAccount.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The results are in reverse chronological order by `created` or `effective_at`. The default is `created`.\",\n            \"in\": \"query\",\n            \"name\": \"order_by\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"created\", \"effective_at\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return TransactionEntries associated with this Transaction.\",\n            \"in\": \"query\",\n            \"name\": \"transaction\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.transaction_entry\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/treasury/transaction_entries\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryTransactionsResourceTransactionEntryList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all TransactionEntries\"\n      }\n    },\n    \"/v1/treasury/transaction_entries/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a TransactionEntry object.</p>\",\n        \"operationId\": \"GetTreasuryTransactionEntriesId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.transaction_entry\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a TransactionEntry\"\n      }\n    },\n    \"/v1/treasury/transactions\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves a list of Transaction objects.</p>\",\n        \"operationId\": \"GetTreasuryTransactions\",\n        \"parameters\": [\n          {\n            \"description\": \"Only return Transactions that were created during the given date interval.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"created\",\n            \"required\": false,\n            \"schema\": {\n              \"anyOf\": [\n                {\n                  \"properties\": {\n                    \"gt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"gte\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lt\": {\n                      \"type\": \"integer\"\n                    },\n                    \"lte\": {\n                      \"type\": \"integer\"\n                    }\n                  },\n                  \"title\": \"range_query_specs\",\n                  \"type\": \"object\"\n                },\n                {\n                  \"type\": \"integer\"\n                }\n              ]\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"Returns objects associated with this FinancialAccount.\",\n            \"in\": \"query\",\n            \"name\": \"financial_account\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"The results are in reverse chronological order by `created` or `posted_at`. The default is `created`.\",\n            \"in\": \"query\",\n            \"name\": \"order_by\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"created\", \"posted_at\"],\n              \"type\": \"string\",\n              \"x-stripeBypassValidation\": true\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Only return Transactions that have the given status: `open`, `posted`, or `void`.\",\n            \"in\": \"query\",\n            \"name\": \"status\",\n            \"required\": false,\n            \"schema\": {\n              \"enum\": [\"open\", \"posted\", \"void\"],\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A filter for the `status_transitions.posted_at` timestamp. When using this filter, `status=posted` and `order_by=posted_at` must also be specified.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"status_transitions\",\n            \"required\": false,\n            \"schema\": {\n              \"properties\": {\n                \"posted_at\": {\n                  \"anyOf\": [\n                    {\n                      \"properties\": {\n                        \"gt\": {\n                          \"type\": \"integer\"\n                        },\n                        \"gte\": {\n                          \"type\": \"integer\"\n                        },\n                        \"lt\": {\n                          \"type\": \"integer\"\n                        },\n                        \"lte\": {\n                          \"type\": \"integer\"\n                        }\n                      },\n                      \"title\": \"range_query_specs\",\n                      \"type\": \"object\"\n                    },\n                    {\n                      \"type\": \"integer\"\n                    }\n                  ]\n                }\n              },\n              \"title\": \"status_transition_timestamp_specs\",\n              \"type\": \"object\"\n            },\n            \"style\": \"deepObject\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"description\": \"Details about each object.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/treasury.transaction\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"TreasuryTransactionsResourceTransactionList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all Transactions\"\n      }\n    },\n    \"/v1/treasury/transactions/{id}\": {\n      \"get\": {\n        \"description\": \"<p>Retrieves the details of an existing Transaction.</p>\",\n        \"operationId\": \"GetTreasuryTransactionsId\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/treasury.transaction\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a Transaction\"\n      }\n    },\n    \"/v1/webhook_endpoints\": {\n      \"get\": {\n        \"description\": \"<p>Returns a list of your webhook endpoints.</p>\",\n        \"operationId\": \"GetWebhookEndpoints\",\n        \"parameters\": [\n          {\n            \"description\": \"A cursor for use in pagination. `ending_before` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, starting with `obj_bar`, your subsequent call can include `ending_before=obj_bar` in order to fetch the previous page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"ending_before\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"description\": \"A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 10.\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\"\n            },\n            \"style\": \"form\"\n          },\n          {\n            \"description\": \"A cursor for use in pagination. `starting_after` is an object ID that defines your place in the list. For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call can include `starting_after=obj_foo` in order to fetch the next page of the list.\",\n            \"in\": \"query\",\n            \"name\": \"starting_after\",\n            \"required\": false,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"form\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"description\": \"\",\n                  \"properties\": {\n                    \"data\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/webhook_endpoint\"\n                      },\n                      \"type\": \"array\"\n                    },\n                    \"has_more\": {\n                      \"description\": \"True if this list has another page of items after this one that can be fetched.\",\n                      \"type\": \"boolean\"\n                    },\n                    \"object\": {\n                      \"description\": \"String representing the object's type. Objects of the same type share the same value. Always has the value `list`.\",\n                      \"enum\": [\"list\"],\n                      \"type\": \"string\"\n                    },\n                    \"url\": {\n                      \"description\": \"The URL where this list can be accessed.\",\n                      \"maxLength\": 5000,\n                      \"pattern\": \"^/v1/webhook_endpoints\",\n                      \"type\": \"string\"\n                    }\n                  },\n                  \"required\": [\"data\", \"has_more\", \"object\", \"url\"],\n                  \"title\": \"NotificationWebhookEndpointList\",\n                  \"type\": \"object\",\n                  \"x-expandableFields\": [\"data\"]\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"List all webhook endpoints\"\n      },\n      \"post\": {\n        \"description\": \"<p>A webhook endpoint must have a <code>url</code> and a list of <code>enabled_events</code>. You may optionally specify the Boolean <code>connect</code> parameter. If set to true, then a Connect webhook endpoint that notifies the specified <code>url</code> about events from all connected accounts is created; otherwise an account webhook endpoint that notifies the specified <code>url</code> only about events from your account is created. You can also create webhook endpoints in the <a href=\\\"https://dashboard.stripe.com/account/webhooks\\\">webhooks settings</a> section of the Dashboard.</p>\",\n        \"operationId\": \"PostWebhookEndpoints\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"description\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"enabled_events\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"api_version\": {\n                    \"description\": \"Events sent to this endpoint will be generated with this Stripe Version instead of your account's default Stripe Version.\",\n                    \"enum\": [\n                      \"2011-01-01\",\n                      \"2011-06-21\",\n                      \"2011-06-28\",\n                      \"2011-08-01\",\n                      \"2011-09-15\",\n                      \"2011-11-17\",\n                      \"2012-02-23\",\n                      \"2012-03-25\",\n                      \"2012-06-18\",\n                      \"2012-06-28\",\n                      \"2012-07-09\",\n                      \"2012-09-24\",\n                      \"2012-10-26\",\n                      \"2012-11-07\",\n                      \"2013-02-11\",\n                      \"2013-02-13\",\n                      \"2013-07-05\",\n                      \"2013-08-12\",\n                      \"2013-08-13\",\n                      \"2013-10-29\",\n                      \"2013-12-03\",\n                      \"2014-01-31\",\n                      \"2014-03-13\",\n                      \"2014-03-28\",\n                      \"2014-05-19\",\n                      \"2014-06-13\",\n                      \"2014-06-17\",\n                      \"2014-07-22\",\n                      \"2014-07-26\",\n                      \"2014-08-04\",\n                      \"2014-08-20\",\n                      \"2014-09-08\",\n                      \"2014-10-07\",\n                      \"2014-11-05\",\n                      \"2014-11-20\",\n                      \"2014-12-08\",\n                      \"2014-12-17\",\n                      \"2014-12-22\",\n                      \"2015-01-11\",\n                      \"2015-01-26\",\n                      \"2015-02-10\",\n                      \"2015-02-16\",\n                      \"2015-02-18\",\n                      \"2015-03-24\",\n                      \"2015-04-07\",\n                      \"2015-06-15\",\n                      \"2015-07-07\",\n                      \"2015-07-13\",\n                      \"2015-07-28\",\n                      \"2015-08-07\",\n                      \"2015-08-19\",\n                      \"2015-09-03\",\n                      \"2015-09-08\",\n                      \"2015-09-23\",\n                      \"2015-10-01\",\n                      \"2015-10-12\",\n                      \"2015-10-16\",\n                      \"2016-02-03\",\n                      \"2016-02-19\",\n                      \"2016-02-22\",\n                      \"2016-02-23\",\n                      \"2016-02-29\",\n                      \"2016-03-07\",\n                      \"2016-06-15\",\n                      \"2016-07-06\",\n                      \"2016-10-19\",\n                      \"2017-01-27\",\n                      \"2017-02-14\",\n                      \"2017-04-06\",\n                      \"2017-05-25\",\n                      \"2017-06-05\",\n                      \"2017-08-15\",\n                      \"2017-12-14\",\n                      \"2018-01-23\",\n                      \"2018-02-05\",\n                      \"2018-02-06\",\n                      \"2018-02-28\",\n                      \"2018-05-21\",\n                      \"2018-07-27\",\n                      \"2018-08-23\",\n                      \"2018-09-06\",\n                      \"2018-09-24\",\n                      \"2018-10-31\",\n                      \"2018-11-08\",\n                      \"2019-02-11\",\n                      \"2019-02-19\",\n                      \"2019-03-14\",\n                      \"2019-05-16\",\n                      \"2019-08-14\",\n                      \"2019-09-09\",\n                      \"2019-10-08\",\n                      \"2019-10-17\",\n                      \"2019-11-05\",\n                      \"2019-12-03\",\n                      \"2020-03-02\",\n                      \"2020-08-27\",\n                      \"2022-08-01\",\n                      \"2022-11-15\",\n                      \"2023-08-16\",\n                      \"2023-10-16\",\n                      \"2024-04-10\",\n                      \"2024-06-20\",\n                      \"2024-09-30.acacia\",\n                      \"2024-10-28.acacia\",\n                      \"2024-11-20.acacia\",\n                      \"2024-12-18.acacia\",\n                      \"2025-01-27.acacia\",\n                      \"2025-02-24.acacia\"\n                    ],\n                    \"maxLength\": 5000,\n                    \"type\": \"string\",\n                    \"x-stripeBypassValidation\": true\n                  },\n                  \"connect\": {\n                    \"description\": \"Whether this endpoint should receive events from connected accounts (`true`), or from your account (`false`). Defaults to `false`.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"description\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"An optional description of what the webhook is used for.\"\n                  },\n                  \"enabled_events\": {\n                    \"description\": \"The list of events to enable for this endpoint. You may specify `['*']` to enable all events, except those that require explicit selection.\",\n                    \"items\": {\n                      \"enum\": [\n                        \"*\",\n                        \"account.application.authorized\",\n                        \"account.application.deauthorized\",\n                        \"account.external_account.created\",\n                        \"account.external_account.deleted\",\n                        \"account.external_account.updated\",\n                        \"account.updated\",\n                        \"application_fee.created\",\n                        \"application_fee.refund.updated\",\n                        \"application_fee.refunded\",\n                        \"balance.available\",\n                        \"billing.alert.triggered\",\n                        \"billing_portal.configuration.created\",\n                        \"billing_portal.configuration.updated\",\n                        \"billing_portal.session.created\",\n                        \"capability.updated\",\n                        \"cash_balance.funds_available\",\n                        \"charge.captured\",\n                        \"charge.dispute.closed\",\n                        \"charge.dispute.created\",\n                        \"charge.dispute.funds_reinstated\",\n                        \"charge.dispute.funds_withdrawn\",\n                        \"charge.dispute.updated\",\n                        \"charge.expired\",\n                        \"charge.failed\",\n                        \"charge.pending\",\n                        \"charge.refund.updated\",\n                        \"charge.refunded\",\n                        \"charge.succeeded\",\n                        \"charge.updated\",\n                        \"checkout.session.async_payment_failed\",\n                        \"checkout.session.async_payment_succeeded\",\n                        \"checkout.session.completed\",\n                        \"checkout.session.expired\",\n                        \"climate.order.canceled\",\n                        \"climate.order.created\",\n                        \"climate.order.delayed\",\n                        \"climate.order.delivered\",\n                        \"climate.order.product_substituted\",\n                        \"climate.product.created\",\n                        \"climate.product.pricing_updated\",\n                        \"coupon.created\",\n                        \"coupon.deleted\",\n                        \"coupon.updated\",\n                        \"credit_note.created\",\n                        \"credit_note.updated\",\n                        \"credit_note.voided\",\n                        \"customer.created\",\n                        \"customer.deleted\",\n                        \"customer.discount.created\",\n                        \"customer.discount.deleted\",\n                        \"customer.discount.updated\",\n                        \"customer.source.created\",\n                        \"customer.source.deleted\",\n                        \"customer.source.expiring\",\n                        \"customer.source.updated\",\n                        \"customer.subscription.created\",\n                        \"customer.subscription.deleted\",\n                        \"customer.subscription.paused\",\n                        \"customer.subscription.pending_update_applied\",\n                        \"customer.subscription.pending_update_expired\",\n                        \"customer.subscription.resumed\",\n                        \"customer.subscription.trial_will_end\",\n                        \"customer.subscription.updated\",\n                        \"customer.tax_id.created\",\n                        \"customer.tax_id.deleted\",\n                        \"customer.tax_id.updated\",\n                        \"customer.updated\",\n                        \"customer_cash_balance_transaction.created\",\n                        \"entitlements.active_entitlement_summary.updated\",\n                        \"file.created\",\n                        \"financial_connections.account.created\",\n                        \"financial_connections.account.deactivated\",\n                        \"financial_connections.account.disconnected\",\n                        \"financial_connections.account.reactivated\",\n                        \"financial_connections.account.refreshed_balance\",\n                        \"financial_connections.account.refreshed_ownership\",\n                        \"financial_connections.account.refreshed_transactions\",\n                        \"identity.verification_session.canceled\",\n                        \"identity.verification_session.created\",\n                        \"identity.verification_session.processing\",\n                        \"identity.verification_session.redacted\",\n                        \"identity.verification_session.requires_input\",\n                        \"identity.verification_session.verified\",\n                        \"invoice.created\",\n                        \"invoice.deleted\",\n                        \"invoice.finalization_failed\",\n                        \"invoice.finalized\",\n                        \"invoice.marked_uncollectible\",\n                        \"invoice.overdue\",\n                        \"invoice.paid\",\n                        \"invoice.payment_action_required\",\n                        \"invoice.payment_failed\",\n                        \"invoice.payment_succeeded\",\n                        \"invoice.sent\",\n                        \"invoice.upcoming\",\n                        \"invoice.updated\",\n                        \"invoice.voided\",\n                        \"invoice.will_be_due\",\n                        \"invoiceitem.created\",\n                        \"invoiceitem.deleted\",\n                        \"issuing_authorization.created\",\n                        \"issuing_authorization.request\",\n                        \"issuing_authorization.updated\",\n                        \"issuing_card.created\",\n                        \"issuing_card.updated\",\n                        \"issuing_cardholder.created\",\n                        \"issuing_cardholder.updated\",\n                        \"issuing_dispute.closed\",\n                        \"issuing_dispute.created\",\n                        \"issuing_dispute.funds_reinstated\",\n                        \"issuing_dispute.funds_rescinded\",\n                        \"issuing_dispute.submitted\",\n                        \"issuing_dispute.updated\",\n                        \"issuing_personalization_design.activated\",\n                        \"issuing_personalization_design.deactivated\",\n                        \"issuing_personalization_design.rejected\",\n                        \"issuing_personalization_design.updated\",\n                        \"issuing_token.created\",\n                        \"issuing_token.updated\",\n                        \"issuing_transaction.created\",\n                        \"issuing_transaction.purchase_details_receipt_updated\",\n                        \"issuing_transaction.updated\",\n                        \"mandate.updated\",\n                        \"payment_intent.amount_capturable_updated\",\n                        \"payment_intent.canceled\",\n                        \"payment_intent.created\",\n                        \"payment_intent.partially_funded\",\n                        \"payment_intent.payment_failed\",\n                        \"payment_intent.processing\",\n                        \"payment_intent.requires_action\",\n                        \"payment_intent.succeeded\",\n                        \"payment_link.created\",\n                        \"payment_link.updated\",\n                        \"payment_method.attached\",\n                        \"payment_method.automatically_updated\",\n                        \"payment_method.detached\",\n                        \"payment_method.updated\",\n                        \"payout.canceled\",\n                        \"payout.created\",\n                        \"payout.failed\",\n                        \"payout.paid\",\n                        \"payout.reconciliation_completed\",\n                        \"payout.updated\",\n                        \"person.created\",\n                        \"person.deleted\",\n                        \"person.updated\",\n                        \"plan.created\",\n                        \"plan.deleted\",\n                        \"plan.updated\",\n                        \"price.created\",\n                        \"price.deleted\",\n                        \"price.updated\",\n                        \"product.created\",\n                        \"product.deleted\",\n                        \"product.updated\",\n                        \"promotion_code.created\",\n                        \"promotion_code.updated\",\n                        \"quote.accepted\",\n                        \"quote.canceled\",\n                        \"quote.created\",\n                        \"quote.finalized\",\n                        \"radar.early_fraud_warning.created\",\n                        \"radar.early_fraud_warning.updated\",\n                        \"refund.created\",\n                        \"refund.failed\",\n                        \"refund.updated\",\n                        \"reporting.report_run.failed\",\n                        \"reporting.report_run.succeeded\",\n                        \"reporting.report_type.updated\",\n                        \"review.closed\",\n                        \"review.opened\",\n                        \"setup_intent.canceled\",\n                        \"setup_intent.created\",\n                        \"setup_intent.requires_action\",\n                        \"setup_intent.setup_failed\",\n                        \"setup_intent.succeeded\",\n                        \"sigma.scheduled_query_run.created\",\n                        \"source.canceled\",\n                        \"source.chargeable\",\n                        \"source.failed\",\n                        \"source.mandate_notification\",\n                        \"source.refund_attributes_required\",\n                        \"source.transaction.created\",\n                        \"source.transaction.updated\",\n                        \"subscription_schedule.aborted\",\n                        \"subscription_schedule.canceled\",\n                        \"subscription_schedule.completed\",\n                        \"subscription_schedule.created\",\n                        \"subscription_schedule.expiring\",\n                        \"subscription_schedule.released\",\n                        \"subscription_schedule.updated\",\n                        \"tax.settings.updated\",\n                        \"tax_rate.created\",\n                        \"tax_rate.updated\",\n                        \"terminal.reader.action_failed\",\n                        \"terminal.reader.action_succeeded\",\n                        \"test_helpers.test_clock.advancing\",\n                        \"test_helpers.test_clock.created\",\n                        \"test_helpers.test_clock.deleted\",\n                        \"test_helpers.test_clock.internal_failure\",\n                        \"test_helpers.test_clock.ready\",\n                        \"topup.canceled\",\n                        \"topup.created\",\n                        \"topup.failed\",\n                        \"topup.reversed\",\n                        \"topup.succeeded\",\n                        \"transfer.created\",\n                        \"transfer.reversed\",\n                        \"transfer.updated\",\n                        \"treasury.credit_reversal.created\",\n                        \"treasury.credit_reversal.posted\",\n                        \"treasury.debit_reversal.completed\",\n                        \"treasury.debit_reversal.created\",\n                        \"treasury.debit_reversal.initial_credit_granted\",\n                        \"treasury.financial_account.closed\",\n                        \"treasury.financial_account.created\",\n                        \"treasury.financial_account.features_status_updated\",\n                        \"treasury.inbound_transfer.canceled\",\n                        \"treasury.inbound_transfer.created\",\n                        \"treasury.inbound_transfer.failed\",\n                        \"treasury.inbound_transfer.succeeded\",\n                        \"treasury.outbound_payment.canceled\",\n                        \"treasury.outbound_payment.created\",\n                        \"treasury.outbound_payment.expected_arrival_date_updated\",\n                        \"treasury.outbound_payment.failed\",\n                        \"treasury.outbound_payment.posted\",\n                        \"treasury.outbound_payment.returned\",\n                        \"treasury.outbound_payment.tracking_details_updated\",\n                        \"treasury.outbound_transfer.canceled\",\n                        \"treasury.outbound_transfer.created\",\n                        \"treasury.outbound_transfer.expected_arrival_date_updated\",\n                        \"treasury.outbound_transfer.failed\",\n                        \"treasury.outbound_transfer.posted\",\n                        \"treasury.outbound_transfer.returned\",\n                        \"treasury.outbound_transfer.tracking_details_updated\",\n                        \"treasury.received_credit.created\",\n                        \"treasury.received_credit.failed\",\n                        \"treasury.received_credit.succeeded\",\n                        \"treasury.received_debit.created\"\n                      ],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"url\": {\n                    \"description\": \"The URL of the webhook endpoint.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"enabled_events\", \"url\"],\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/webhook_endpoint\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Create a webhook endpoint\"\n      }\n    },\n    \"/v1/webhook_endpoints/{webhook_endpoint}\": {\n      \"delete\": {\n        \"description\": \"<p>You can also delete webhook endpoints via the <a href=\\\"https://dashboard.stripe.com/account/webhooks\\\">webhook endpoint management</a> page of the Stripe dashboard.</p>\",\n        \"operationId\": \"DeleteWebhookEndpointsWebhookEndpoint\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"webhook_endpoint\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/deleted_webhook_endpoint\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Delete a webhook endpoint\"\n      },\n      \"get\": {\n        \"description\": \"<p>Retrieves the webhook endpoint with the given ID.</p>\",\n        \"operationId\": \"GetWebhookEndpointsWebhookEndpoint\",\n        \"parameters\": [\n          {\n            \"description\": \"Specifies which fields in the response should be expanded.\",\n            \"explode\": true,\n            \"in\": \"query\",\n            \"name\": \"expand\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"maxLength\": 5000,\n                \"type\": \"string\"\n              },\n              \"type\": \"array\"\n            },\n            \"style\": \"deepObject\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"webhook_endpoint\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {},\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {},\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/webhook_endpoint\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Retrieve a webhook endpoint\"\n      },\n      \"post\": {\n        \"description\": \"<p>Updates the webhook endpoint. You may edit the <code>url</code>, the list of <code>enabled_events</code>, and the status of your endpoint.</p>\",\n        \"operationId\": \"PostWebhookEndpointsWebhookEndpoint\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"webhook_endpoint\",\n            \"required\": true,\n            \"schema\": {\n              \"maxLength\": 5000,\n              \"type\": \"string\"\n            },\n            \"style\": \"simple\"\n          }\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/x-www-form-urlencoded\": {\n              \"encoding\": {\n                \"description\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"enabled_events\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"expand\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                },\n                \"metadata\": {\n                  \"explode\": true,\n                  \"style\": \"deepObject\"\n                }\n              },\n              \"schema\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"description\": {\n                    \"anyOf\": [\n                      {\n                        \"maxLength\": 5000,\n                        \"type\": \"string\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"An optional description of what the webhook is used for.\"\n                  },\n                  \"disabled\": {\n                    \"description\": \"Disable the webhook endpoint if set to true.\",\n                    \"type\": \"boolean\"\n                  },\n                  \"enabled_events\": {\n                    \"description\": \"The list of events to enable for this endpoint. You may specify `['*']` to enable all events, except those that require explicit selection.\",\n                    \"items\": {\n                      \"enum\": [\n                        \"*\",\n                        \"account.application.authorized\",\n                        \"account.application.deauthorized\",\n                        \"account.external_account.created\",\n                        \"account.external_account.deleted\",\n                        \"account.external_account.updated\",\n                        \"account.updated\",\n                        \"application_fee.created\",\n                        \"application_fee.refund.updated\",\n                        \"application_fee.refunded\",\n                        \"balance.available\",\n                        \"billing.alert.triggered\",\n                        \"billing_portal.configuration.created\",\n                        \"billing_portal.configuration.updated\",\n                        \"billing_portal.session.created\",\n                        \"capability.updated\",\n                        \"cash_balance.funds_available\",\n                        \"charge.captured\",\n                        \"charge.dispute.closed\",\n                        \"charge.dispute.created\",\n                        \"charge.dispute.funds_reinstated\",\n                        \"charge.dispute.funds_withdrawn\",\n                        \"charge.dispute.updated\",\n                        \"charge.expired\",\n                        \"charge.failed\",\n                        \"charge.pending\",\n                        \"charge.refund.updated\",\n                        \"charge.refunded\",\n                        \"charge.succeeded\",\n                        \"charge.updated\",\n                        \"checkout.session.async_payment_failed\",\n                        \"checkout.session.async_payment_succeeded\",\n                        \"checkout.session.completed\",\n                        \"checkout.session.expired\",\n                        \"climate.order.canceled\",\n                        \"climate.order.created\",\n                        \"climate.order.delayed\",\n                        \"climate.order.delivered\",\n                        \"climate.order.product_substituted\",\n                        \"climate.product.created\",\n                        \"climate.product.pricing_updated\",\n                        \"coupon.created\",\n                        \"coupon.deleted\",\n                        \"coupon.updated\",\n                        \"credit_note.created\",\n                        \"credit_note.updated\",\n                        \"credit_note.voided\",\n                        \"customer.created\",\n                        \"customer.deleted\",\n                        \"customer.discount.created\",\n                        \"customer.discount.deleted\",\n                        \"customer.discount.updated\",\n                        \"customer.source.created\",\n                        \"customer.source.deleted\",\n                        \"customer.source.expiring\",\n                        \"customer.source.updated\",\n                        \"customer.subscription.created\",\n                        \"customer.subscription.deleted\",\n                        \"customer.subscription.paused\",\n                        \"customer.subscription.pending_update_applied\",\n                        \"customer.subscription.pending_update_expired\",\n                        \"customer.subscription.resumed\",\n                        \"customer.subscription.trial_will_end\",\n                        \"customer.subscription.updated\",\n                        \"customer.tax_id.created\",\n                        \"customer.tax_id.deleted\",\n                        \"customer.tax_id.updated\",\n                        \"customer.updated\",\n                        \"customer_cash_balance_transaction.created\",\n                        \"entitlements.active_entitlement_summary.updated\",\n                        \"file.created\",\n                        \"financial_connections.account.created\",\n                        \"financial_connections.account.deactivated\",\n                        \"financial_connections.account.disconnected\",\n                        \"financial_connections.account.reactivated\",\n                        \"financial_connections.account.refreshed_balance\",\n                        \"financial_connections.account.refreshed_ownership\",\n                        \"financial_connections.account.refreshed_transactions\",\n                        \"identity.verification_session.canceled\",\n                        \"identity.verification_session.created\",\n                        \"identity.verification_session.processing\",\n                        \"identity.verification_session.redacted\",\n                        \"identity.verification_session.requires_input\",\n                        \"identity.verification_session.verified\",\n                        \"invoice.created\",\n                        \"invoice.deleted\",\n                        \"invoice.finalization_failed\",\n                        \"invoice.finalized\",\n                        \"invoice.marked_uncollectible\",\n                        \"invoice.overdue\",\n                        \"invoice.paid\",\n                        \"invoice.payment_action_required\",\n                        \"invoice.payment_failed\",\n                        \"invoice.payment_succeeded\",\n                        \"invoice.sent\",\n                        \"invoice.upcoming\",\n                        \"invoice.updated\",\n                        \"invoice.voided\",\n                        \"invoice.will_be_due\",\n                        \"invoiceitem.created\",\n                        \"invoiceitem.deleted\",\n                        \"issuing_authorization.created\",\n                        \"issuing_authorization.request\",\n                        \"issuing_authorization.updated\",\n                        \"issuing_card.created\",\n                        \"issuing_card.updated\",\n                        \"issuing_cardholder.created\",\n                        \"issuing_cardholder.updated\",\n                        \"issuing_dispute.closed\",\n                        \"issuing_dispute.created\",\n                        \"issuing_dispute.funds_reinstated\",\n                        \"issuing_dispute.funds_rescinded\",\n                        \"issuing_dispute.submitted\",\n                        \"issuing_dispute.updated\",\n                        \"issuing_personalization_design.activated\",\n                        \"issuing_personalization_design.deactivated\",\n                        \"issuing_personalization_design.rejected\",\n                        \"issuing_personalization_design.updated\",\n                        \"issuing_token.created\",\n                        \"issuing_token.updated\",\n                        \"issuing_transaction.created\",\n                        \"issuing_transaction.purchase_details_receipt_updated\",\n                        \"issuing_transaction.updated\",\n                        \"mandate.updated\",\n                        \"payment_intent.amount_capturable_updated\",\n                        \"payment_intent.canceled\",\n                        \"payment_intent.created\",\n                        \"payment_intent.partially_funded\",\n                        \"payment_intent.payment_failed\",\n                        \"payment_intent.processing\",\n                        \"payment_intent.requires_action\",\n                        \"payment_intent.succeeded\",\n                        \"payment_link.created\",\n                        \"payment_link.updated\",\n                        \"payment_method.attached\",\n                        \"payment_method.automatically_updated\",\n                        \"payment_method.detached\",\n                        \"payment_method.updated\",\n                        \"payout.canceled\",\n                        \"payout.created\",\n                        \"payout.failed\",\n                        \"payout.paid\",\n                        \"payout.reconciliation_completed\",\n                        \"payout.updated\",\n                        \"person.created\",\n                        \"person.deleted\",\n                        \"person.updated\",\n                        \"plan.created\",\n                        \"plan.deleted\",\n                        \"plan.updated\",\n                        \"price.created\",\n                        \"price.deleted\",\n                        \"price.updated\",\n                        \"product.created\",\n                        \"product.deleted\",\n                        \"product.updated\",\n                        \"promotion_code.created\",\n                        \"promotion_code.updated\",\n                        \"quote.accepted\",\n                        \"quote.canceled\",\n                        \"quote.created\",\n                        \"quote.finalized\",\n                        \"radar.early_fraud_warning.created\",\n                        \"radar.early_fraud_warning.updated\",\n                        \"refund.created\",\n                        \"refund.failed\",\n                        \"refund.updated\",\n                        \"reporting.report_run.failed\",\n                        \"reporting.report_run.succeeded\",\n                        \"reporting.report_type.updated\",\n                        \"review.closed\",\n                        \"review.opened\",\n                        \"setup_intent.canceled\",\n                        \"setup_intent.created\",\n                        \"setup_intent.requires_action\",\n                        \"setup_intent.setup_failed\",\n                        \"setup_intent.succeeded\",\n                        \"sigma.scheduled_query_run.created\",\n                        \"source.canceled\",\n                        \"source.chargeable\",\n                        \"source.failed\",\n                        \"source.mandate_notification\",\n                        \"source.refund_attributes_required\",\n                        \"source.transaction.created\",\n                        \"source.transaction.updated\",\n                        \"subscription_schedule.aborted\",\n                        \"subscription_schedule.canceled\",\n                        \"subscription_schedule.completed\",\n                        \"subscription_schedule.created\",\n                        \"subscription_schedule.expiring\",\n                        \"subscription_schedule.released\",\n                        \"subscription_schedule.updated\",\n                        \"tax.settings.updated\",\n                        \"tax_rate.created\",\n                        \"tax_rate.updated\",\n                        \"terminal.reader.action_failed\",\n                        \"terminal.reader.action_succeeded\",\n                        \"test_helpers.test_clock.advancing\",\n                        \"test_helpers.test_clock.created\",\n                        \"test_helpers.test_clock.deleted\",\n                        \"test_helpers.test_clock.internal_failure\",\n                        \"test_helpers.test_clock.ready\",\n                        \"topup.canceled\",\n                        \"topup.created\",\n                        \"topup.failed\",\n                        \"topup.reversed\",\n                        \"topup.succeeded\",\n                        \"transfer.created\",\n                        \"transfer.reversed\",\n                        \"transfer.updated\",\n                        \"treasury.credit_reversal.created\",\n                        \"treasury.credit_reversal.posted\",\n                        \"treasury.debit_reversal.completed\",\n                        \"treasury.debit_reversal.created\",\n                        \"treasury.debit_reversal.initial_credit_granted\",\n                        \"treasury.financial_account.closed\",\n                        \"treasury.financial_account.created\",\n                        \"treasury.financial_account.features_status_updated\",\n                        \"treasury.inbound_transfer.canceled\",\n                        \"treasury.inbound_transfer.created\",\n                        \"treasury.inbound_transfer.failed\",\n                        \"treasury.inbound_transfer.succeeded\",\n                        \"treasury.outbound_payment.canceled\",\n                        \"treasury.outbound_payment.created\",\n                        \"treasury.outbound_payment.expected_arrival_date_updated\",\n                        \"treasury.outbound_payment.failed\",\n                        \"treasury.outbound_payment.posted\",\n                        \"treasury.outbound_payment.returned\",\n                        \"treasury.outbound_payment.tracking_details_updated\",\n                        \"treasury.outbound_transfer.canceled\",\n                        \"treasury.outbound_transfer.created\",\n                        \"treasury.outbound_transfer.expected_arrival_date_updated\",\n                        \"treasury.outbound_transfer.failed\",\n                        \"treasury.outbound_transfer.posted\",\n                        \"treasury.outbound_transfer.returned\",\n                        \"treasury.outbound_transfer.tracking_details_updated\",\n                        \"treasury.received_credit.created\",\n                        \"treasury.received_credit.failed\",\n                        \"treasury.received_credit.succeeded\",\n                        \"treasury.received_debit.created\"\n                      ],\n                      \"type\": \"string\",\n                      \"x-stripeBypassValidation\": true\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"expand\": {\n                    \"description\": \"Specifies which fields in the response should be expanded.\",\n                    \"items\": {\n                      \"maxLength\": 5000,\n                      \"type\": \"string\"\n                    },\n                    \"type\": \"array\"\n                  },\n                  \"metadata\": {\n                    \"anyOf\": [\n                      {\n                        \"additionalProperties\": {\n                          \"type\": \"string\"\n                        },\n                        \"type\": \"object\"\n                      },\n                      {\n                        \"enum\": [\"\"],\n                        \"type\": \"string\"\n                      }\n                    ],\n                    \"description\": \"Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to `metadata`.\"\n                  },\n                  \"url\": {\n                    \"description\": \"The URL of the webhook endpoint.\",\n                    \"type\": \"string\"\n                  }\n                },\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"required\": false\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/webhook_endpoint\"\n                }\n              }\n            },\n            \"description\": \"Successful response.\"\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/error\"\n                }\n              }\n            },\n            \"description\": \"Error response.\"\n          }\n        },\n        \"summary\": \"Update a webhook endpoint\"\n      }\n    }\n  },\n  \"security\": [\n    {\n      \"basicAuth\": []\n    },\n    {\n      \"bearerAuth\": []\n    }\n  ],\n  \"servers\": [\n    {\n      \"url\": \"https://api.stripe.com/\"\n    }\n  ]\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/fixtures/openapi/tic-tac-toe.json",
    "content": "{\n  \"openapi\": \"3.1.0\",\n  \"info\": {\n    \"title\": \"Tic Tac Toe\",\n    \"description\": \"This API allows writing down marks on a Tic Tac Toe board\\nand requesting the state of the board or of individual squares.\\n\",\n    \"version\": \"1.0.0\"\n  },\n  \"tags\": [\n    {\n      \"name\": \"Gameplay\"\n    }\n  ],\n  \"paths\": {\n    \"/board\": {\n      \"get\": {\n        \"summary\": \"Get the whole board\",\n        \"description\": \"Retrieves the current state of the board and the winner.\",\n        \"tags\": [\"Gameplay\"],\n        \"operationId\": \"get-board\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\"\n                }\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"defaultApiKey\": []\n          },\n          {\n            \"app2AppOauth\": [\"board:read\"]\n          }\n        ]\n      }\n    },\n    \"/board/{row}/{column}\": {\n      \"parameters\": [\n        {\n          \"$ref\": \"#/components/parameters/rowParam\"\n        },\n        {\n          \"$ref\": \"#/components/parameters/columnParam\"\n        }\n      ],\n      \"get\": {\n        \"summary\": \"Get a single board square\",\n        \"description\": \"Retrieves the requested square.\",\n        \"tags\": [\"Gameplay\"],\n        \"operationId\": \"get-square\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/mark\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"The provided parameters are incorrect\",\n            \"content\": {\n              \"text/html\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\"\n                },\n                \"example\": \"Illegal coordinates\"\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": []\n          },\n          {\n            \"user2AppOauth\": [\"board:read\"]\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"Set a single board square\",\n        \"description\": \"Places a mark on the board and retrieves the whole board and the winner (if any).\",\n        \"tags\": [\"Gameplay\"],\n        \"operationId\": \"put-square\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/mark\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"The provided parameters are incorrect\",\n            \"content\": {\n              \"text/html\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\"\n                },\n                \"examples\": {\n                  \"illegalCoordinates\": {\n                    \"value\": \"Illegal coordinates.\"\n                  },\n                  \"notEmpty\": {\n                    \"value\": \"Square is not empty.\"\n                  },\n                  \"invalidMark\": {\n                    \"value\": \"Invalid Mark (X or O).\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": []\n          },\n          {\n            \"user2AppOauth\": [\"board:write\"]\n          }\n        ]\n      }\n    }\n  },\n  \"components\": {\n    \"parameters\": {\n      \"rowParam\": {\n        \"description\": \"Board row (vertical coordinate)\",\n        \"name\": \"row\",\n        \"in\": \"path\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\"\n        }\n      },\n      \"columnParam\": {\n        \"description\": \"Board column (horizontal coordinate)\",\n        \"name\": \"column\",\n        \"in\": \"path\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\"\n        }\n      }\n    },\n    \"schemas\": {\n      \"errorMessage\": {\n        \"type\": \"string\",\n        \"maxLength\": 256,\n        \"description\": \"A text message describing an error\"\n      },\n      \"coordinate\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 3,\n        \"example\": 1\n      },\n      \"mark\": {\n        \"type\": \"string\",\n        \"enum\": [\".\", \"X\", \"O\"],\n        \"description\": \"Possible values for a board square. `.` means empty square.\",\n        \"example\": \".\"\n      },\n      \"board\": {\n        \"type\": \"array\",\n        \"maxItems\": 3,\n        \"minItems\": 3,\n        \"items\": {\n          \"type\": \"array\",\n          \"maxItems\": 3,\n          \"minItems\": 3,\n          \"items\": {\n            \"$ref\": \"#/components/schemas/mark\"\n          }\n        }\n      },\n      \"winner\": {\n        \"type\": \"string\",\n        \"enum\": [\".\", \"X\", \"O\"],\n        \"description\": \"Winner of the game. `.` means nobody has won yet.\",\n        \"example\": \".\"\n      },\n      \"status\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"winner\": {\n            \"$ref\": \"#/components/schemas/winner\"\n          },\n          \"board\": {\n            \"$ref\": \"#/components/schemas/board\"\n          }\n        }\n      }\n    },\n    \"securitySchemes\": {\n      \"defaultApiKey\": {\n        \"description\": \"API key provided in console\",\n        \"type\": \"apiKey\",\n        \"name\": \"api-key\",\n        \"in\": \"header\"\n      },\n      \"basicHttpAuthentication\": {\n        \"description\": \"Basic HTTP Authentication\",\n        \"type\": \"http\",\n        \"scheme\": \"Basic\"\n      },\n      \"bearerHttpAuthentication\": {\n        \"description\": \"Bearer token using a JWT\",\n        \"type\": \"http\",\n        \"scheme\": \"Bearer\",\n        \"bearerFormat\": \"JWT\"\n      },\n      \"app2AppOauth\": {\n        \"type\": \"oauth2\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n            \"scopes\": {\n              \"board:read\": \"Read the board\"\n            }\n          }\n        }\n      },\n      \"user2AppOauth\": {\n        \"type\": \"oauth2\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://learn.openapis.org/oauth/2.0/auth\",\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n              \"board:write\": \"Write to the board\"\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/package.json",
    "content": "{\n  \"name\": \"@agentic/openapi-to-ts\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Generate an Agentic TypeScript client from an OpenAPI spec.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/openapi-to-ts\"\n  },\n  \"type\": \"module\",\n  \"bin\": {\n    \"openapi-to-ts\": \"./dist/openapi-to-ts.js\"\n  },\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@apidevtools/swagger-parser\": \"catalog:\",\n    \"camelcase\": \"catalog:\",\n    \"cleye\": \"catalog:\",\n    \"decamelize\": \"catalog:\",\n    \"execa\": \"catalog:\",\n    \"exit-hook\": \"catalog:\",\n    \"json-schema-to-zod\": \"catalog:\",\n    \"openapi-types\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"ky\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/src/__snapshots__/generate-ts-from-openapi.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`openapi-to-ts > firecrawl.json 1`] = `\n\"/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace firecrawl {\n  export const apiBaseUrl = 'https://api.firecrawl.dev/v0'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const ScrapeResponseSchema = z.object({\n    success: z.boolean().optional(),\n    /** Warning message to let you know of any issues. */\n    warning: z\n      .string()\n      .describe('Warning message to let you know of any issues.')\n      .optional(),\n    data: z\n      .object({\n        /** Markdown content of the page if the \\`markdown\\` format was specified (default) */\n        markdown: z\n          .string()\n          .describe(\n            'Markdown content of the page if the \\`markdown\\` format was specified (default)'\n          )\n          .optional(),\n        /** HTML version of the content on page if the \\`html\\` format was specified */\n        html: z\n          .string()\n          .describe(\n            'HTML version of the content on page if the \\`html\\` format was specified'\n          )\n          .optional(),\n        /** Raw HTML content of the page if the \\`rawHtml\\` format was specified */\n        rawHtml: z\n          .string()\n          .describe(\n            'Raw HTML content of the page if the \\`rawHtml\\` format was specified'\n          )\n          .optional(),\n        /** Links on the page if the \\`links\\` format was specified */\n        links: z\n          .array(z.string().url())\n          .describe('Links on the page if the \\`links\\` format was specified')\n          .optional(),\n        /** URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified */\n        screenshot: z\n          .string()\n          .describe(\n            'URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified'\n          )\n          .optional(),\n        metadata: z\n          .object({\n            title: z.string().optional(),\n            description: z.string().optional(),\n            language: z.string().optional(),\n            sourceURL: z.string().url().optional(),\n            '<any other metadata> ': z.string().optional(),\n            /** The status code of the page */\n            statusCode: z\n              .number()\n              .int()\n              .describe('The status code of the page')\n              .optional(),\n            /** The error message of the page */\n            error: z\n              .string()\n              .describe('The error message of the page')\n              .optional()\n          })\n          .optional()\n      })\n      .optional()\n  })\n  export type ScrapeResponse = z.infer<typeof ScrapeResponseSchema>\n\n  export const CrawlResponseSchema = z.object({\n    success: z.boolean().optional(),\n    id: z.string().optional(),\n    url: z.string().url().optional()\n  })\n  export type CrawlResponse = z.infer<typeof CrawlResponseSchema>\n\n  export const SearchResponseSchema = z.object({\n    success: z.boolean().optional(),\n    data: z.array(z.any()).optional()\n  })\n  export type SearchResponse = z.infer<typeof SearchResponseSchema>\n\n  export const CrawlStatusResponseObjSchema = z.object({\n    /** Markdown content of the page if the \\`markdown\\` format was specified (default) */\n    markdown: z\n      .string()\n      .describe(\n        'Markdown content of the page if the \\`markdown\\` format was specified (default)'\n      )\n      .optional(),\n    /** HTML version of the content on page if the \\`html\\` format was specified */\n    html: z\n      .string()\n      .describe(\n        'HTML version of the content on page if the \\`html\\` format was specified'\n      )\n      .optional(),\n    /** Raw HTML content of the page if the \\`rawHtml\\` format was specified */\n    rawHtml: z\n      .string()\n      .describe(\n        'Raw HTML content of the page if the \\`rawHtml\\` format was specified'\n      )\n      .optional(),\n    /** Links on the page if the \\`links\\` format was specified */\n    links: z\n      .array(z.string().url())\n      .describe('Links on the page if the \\`links\\` format was specified')\n      .optional(),\n    /** URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified */\n    screenshot: z\n      .string()\n      .describe(\n        'URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified'\n      )\n      .optional(),\n    metadata: z\n      .object({\n        title: z.string().optional(),\n        description: z.string().optional(),\n        language: z.string().optional(),\n        sourceURL: z.string().url().optional(),\n        '<any other metadata> ': z.string().optional(),\n        /** The status code of the page */\n        statusCode: z\n          .number()\n          .int()\n          .describe('The status code of the page')\n          .optional(),\n        /** The error message of the page */\n        error: z.string().describe('The error message of the page').optional()\n      })\n      .optional()\n  })\n  export type CrawlStatusResponseObj = z.infer<\n    typeof CrawlStatusResponseObjSchema\n  >\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const ScrapeParamsSchema = z.object({\n    /** The URL to scrape */\n    url: z.string().url().describe('The URL to scrape'),\n    /**\n     * Specific formats to return.\n     *\n     *  - markdown: The page in Markdown format.\n     *  - html: The page's HTML, trimmed to include only meaningful content.\n     *  - rawHtml: The page's original HTML.\n     *  - links: The links on the page.\n     *  - screenshot: A screenshot of the top of the page.\n     *  - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\n     */\n    formats: z\n      .array(\n        z.enum([\n          'markdown',\n          'html',\n          'rawHtml',\n          'links',\n          'screenshot',\n          'screenshot@fullPage'\n        ])\n      )\n      .describe(\n        \"Specific formats to return.\\\\n\\\\n - markdown: The page in Markdown format.\\\\n - html: The page's HTML, trimmed to include only meaningful content.\\\\n - rawHtml: The page's original HTML.\\\\n - links: The links on the page.\\\\n - screenshot: A screenshot of the top of the page.\\\\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\"\n      )\n      .default(['markdown']),\n    /** Headers to send with the request. Can be used to send cookies, user-agent, etc. */\n    headers: z\n      .record(z.any())\n      .describe(\n        'Headers to send with the request. Can be used to send cookies, user-agent, etc.'\n      )\n      .optional(),\n    /** Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer' */\n    includeTags: z\n      .array(z.string())\n      .describe(\n        \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n      )\n      .optional(),\n    /** Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer' */\n    excludeTags: z\n      .array(z.string())\n      .describe(\n        \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n      )\n      .optional(),\n    /** Only return the main content of the page excluding headers, navs, footers, etc. */\n    onlyMainContent: z\n      .boolean()\n      .describe(\n        'Only return the main content of the page excluding headers, navs, footers, etc.'\n      )\n      .default(true),\n    /** Timeout in milliseconds for the request */\n    timeout: z\n      .number()\n      .int()\n      .describe('Timeout in milliseconds for the request')\n      .default(30000),\n    /** Wait x amount of milliseconds for the page to load to fetch content */\n    waitFor: z\n      .number()\n      .int()\n      .describe(\n        'Wait x amount of milliseconds for the page to load to fetch content'\n      )\n      .default(0)\n  })\n  export type ScrapeParams = z.infer<typeof ScrapeParamsSchema>\n\n  export const CrawlUrlsParamsSchema = z.object({\n    /** The base URL to start crawling from */\n    url: z.string().url().describe('The base URL to start crawling from'),\n    crawlerOptions: z\n      .object({\n        /** URL patterns to include */\n        includes: z\n          .array(z.string())\n          .describe('URL patterns to include')\n          .optional(),\n        /** URL patterns to exclude */\n        excludes: z\n          .array(z.string())\n          .describe('URL patterns to exclude')\n          .optional(),\n        /** Generate alt text for images using LLMs (must have a paid plan) */\n        generateImgAltText: z\n          .boolean()\n          .describe(\n            'Generate alt text for images using LLMs (must have a paid plan)'\n          )\n          .default(false),\n        /** If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents. */\n        returnOnlyUrls: z\n          .boolean()\n          .describe(\n            'If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.'\n          )\n          .default(false),\n        /** Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern. */\n        maxDepth: z\n          .number()\n          .int()\n          .describe(\n            'Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.'\n          )\n          .optional(),\n        /** The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites. */\n        mode: z\n          .enum(['default', 'fast'])\n          .describe(\n            \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\"\n          )\n          .default('default'),\n        /** Ignore the website sitemap when crawling */\n        ignoreSitemap: z\n          .boolean()\n          .describe('Ignore the website sitemap when crawling')\n          .default(false),\n        /** Maximum number of pages to crawl */\n        limit: z\n          .number()\n          .int()\n          .describe('Maximum number of pages to crawl')\n          .default(10000),\n        /** Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product' */\n        allowBackwardCrawling: z\n          .boolean()\n          .describe(\n            \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\"\n          )\n          .default(false),\n        /** Allows the crawler to follow links to external websites. */\n        allowExternalContentLinks: z\n          .boolean()\n          .describe('Allows the crawler to follow links to external websites.')\n          .default(false)\n      })\n      .optional(),\n    pageOptions: z\n      .object({\n        /** Headers to send with the request. Can be used to send cookies, user-agent, etc. */\n        headers: z\n          .record(z.any())\n          .describe(\n            'Headers to send with the request. Can be used to send cookies, user-agent, etc.'\n          )\n          .optional(),\n        /** Include the HTML version of the content on page. Will output a html key in the response. */\n        includeHtml: z\n          .boolean()\n          .describe(\n            'Include the HTML version of the content on page. Will output a html key in the response.'\n          )\n          .default(false),\n        /** Include the raw HTML content of the page. Will output a rawHtml key in the response. */\n        includeRawHtml: z\n          .boolean()\n          .describe(\n            'Include the raw HTML content of the page. Will output a rawHtml key in the response.'\n          )\n          .default(false),\n        /** Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer' */\n        onlyIncludeTags: z\n          .array(z.string())\n          .describe(\n            \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n          )\n          .optional(),\n        /** Only return the main content of the page excluding headers, navs, footers, etc. */\n        onlyMainContent: z\n          .boolean()\n          .describe(\n            'Only return the main content of the page excluding headers, navs, footers, etc.'\n          )\n          .default(false),\n        /** Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer' */\n        removeTags: z\n          .array(z.string())\n          .describe(\n            \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n          )\n          .optional(),\n        /** Replace all relative paths with absolute paths for images and links */\n        replaceAllPathsWithAbsolutePaths: z\n          .boolean()\n          .describe(\n            'Replace all relative paths with absolute paths for images and links'\n          )\n          .default(false),\n        /** Include a screenshot of the top of the page that you are scraping. */\n        screenshot: z\n          .boolean()\n          .describe(\n            'Include a screenshot of the top of the page that you are scraping.'\n          )\n          .default(false),\n        /** Include a full page screenshot of the page that you are scraping. */\n        fullPageScreenshot: z\n          .boolean()\n          .describe(\n            'Include a full page screenshot of the page that you are scraping.'\n          )\n          .default(false),\n        /** Wait x amount of milliseconds for the page to load to fetch content */\n        waitFor: z\n          .number()\n          .int()\n          .describe(\n            'Wait x amount of milliseconds for the page to load to fetch content'\n          )\n          .default(0)\n      })\n      .optional()\n  })\n  export type CrawlUrlsParams = z.infer<typeof CrawlUrlsParamsSchema>\n\n  export const CrawlUrlsResponseSchema = CrawlResponseSchema\n  export type CrawlUrlsResponse = z.infer<typeof CrawlUrlsResponseSchema>\n\n  export const SearchGoogleParamsSchema = z.object({\n    /** The query to search for */\n    query: z.string().url().describe('The query to search for'),\n    pageOptions: z\n      .object({\n        /** Only return the main content of the page excluding headers, navs, footers, etc. */\n        onlyMainContent: z\n          .boolean()\n          .describe(\n            'Only return the main content of the page excluding headers, navs, footers, etc.'\n          )\n          .default(false),\n        /** Fetch the content of each page. If false, defaults to a basic fast serp API. */\n        fetchPageContent: z\n          .boolean()\n          .describe(\n            'Fetch the content of each page. If false, defaults to a basic fast serp API.'\n          )\n          .default(true),\n        /** Include the HTML version of the content on page. Will output a html key in the response. */\n        includeHtml: z\n          .boolean()\n          .describe(\n            'Include the HTML version of the content on page. Will output a html key in the response.'\n          )\n          .default(false),\n        /** Include the raw HTML content of the page. Will output a rawHtml key in the response. */\n        includeRawHtml: z\n          .boolean()\n          .describe(\n            'Include the raw HTML content of the page. Will output a rawHtml key in the response.'\n          )\n          .default(false)\n      })\n      .optional(),\n    searchOptions: z\n      .object({\n        /** Maximum number of results. Max is 20 during beta. */\n        limit: z\n          .number()\n          .int()\n          .describe('Maximum number of results. Max is 20 during beta.')\n          .optional()\n      })\n      .optional()\n  })\n  export type SearchGoogleParams = z.infer<typeof SearchGoogleParamsSchema>\n\n  export const SearchGoogleResponseSchema = SearchResponseSchema\n  export type SearchGoogleResponse = z.infer<typeof SearchGoogleResponseSchema>\n\n  export const GetCrawlStatusParamsSchema = z.object({\n    /** ID of the crawl job */\n    jobId: z.string().describe('ID of the crawl job')\n  })\n  export type GetCrawlStatusParams = z.infer<typeof GetCrawlStatusParamsSchema>\n\n  export const GetCrawlStatusResponseSchema = z.object({\n    /** Status of the job (completed, active, failed, paused) */\n    status: z\n      .string()\n      .describe('Status of the job (completed, active, failed, paused)')\n      .optional(),\n    /** Current page number */\n    current: z.number().int().describe('Current page number').optional(),\n    /** Total number of pages */\n    total: z.number().int().describe('Total number of pages').optional(),\n    /** Data returned from the job (null when it is in progress) */\n    data: z\n      .array(CrawlStatusResponseObjSchema)\n      .describe('Data returned from the job (null when it is in progress)')\n      .optional(),\n    /** Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in \\`data\\`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array. */\n    partial_data: z\n      .array(CrawlStatusResponseObjSchema)\n      .describe(\n        'Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in \\`data\\`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.'\n      )\n      .optional()\n  })\n  export type GetCrawlStatusResponse = z.infer<\n    typeof GetCrawlStatusResponseSchema\n  >\n\n  export const CancelCrawlJobParamsSchema = z.object({\n    /** ID of the crawl job */\n    jobId: z.string().describe('ID of the crawl job')\n  })\n  export type CancelCrawlJobParams = z.infer<typeof CancelCrawlJobParamsSchema>\n\n  export const CancelCrawlJobResponseSchema = z.object({\n    /** Returns cancelled. */\n    status: z.string().describe('Returns cancelled.').optional()\n  })\n  export type CancelCrawlJobResponse = z.infer<\n    typeof CancelCrawlJobResponseSchema\n  >\n}\n\n\n/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  AIFunctionsProvider,\n  aiFunction,\n  assert,\n  getEnv,\n  pick\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { firecrawl } from './firecrawl'\n\n/**\n * Agentic Firecrawl client.\n *\n * API for interacting with Firecrawl services to perform web scraping and crawling tasks.\n */\nexport class FirecrawlClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('FIRECRAWL_API_KEY'),\n    apiBaseUrl = firecrawl.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'FirecrawlClient missing required \"apiKey\" (defaults to \"FIRECRAWL_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: apiKey\n      }\n    })\n  }\n\n  /**\n   * Scrape a single URL.\n   */\n  @aiFunction({\n    name: 'firecrawl_scrape',\n    description: \\`Scrape a single URL.\\`,\n    inputSchema: firecrawl.ScrapeParamsSchema,\n    tags: ['Scraping']\n  })\n  async scrape(\n    params: firecrawl.ScrapeParams\n  ): Promise<firecrawl.ScrapeResponse> {\n    return this.ky\n      .post('/scrape', {\n        json: pick(\n          params,\n          'url',\n          'formats',\n          'headers',\n          'includeTags',\n          'excludeTags',\n          'onlyMainContent',\n          'timeout',\n          'waitFor'\n        )\n      })\n      .json<firecrawl.ScrapeResponse>()\n  }\n\n  /**\n   * Crawl multiple URLs based on options.\n   */\n  @aiFunction({\n    name: 'firecrawl_crawl_urls',\n    description: \\`Crawl multiple URLs based on options.\\`,\n    inputSchema: firecrawl.CrawlUrlsParamsSchema,\n    tags: ['Crawling']\n  })\n  async crawlUrls(\n    params: firecrawl.CrawlUrlsParams\n  ): Promise<firecrawl.CrawlUrlsResponse> {\n    return this.ky\n      .post('/crawl', {\n        json: pick(params, 'url', 'crawlerOptions', 'pageOptions')\n      })\n      .json<firecrawl.CrawlUrlsResponse>()\n  }\n\n  /**\n   * Search for a keyword in Google, returns top page results with markdown content for each page.\n   */\n  @aiFunction({\n    name: 'firecrawl_search_google',\n    description: \\`Search for a keyword in Google, returns top page results with markdown content for each page.\\`,\n    inputSchema: firecrawl.SearchGoogleParamsSchema,\n    tags: ['Search']\n  })\n  async searchGoogle(\n    params: firecrawl.SearchGoogleParams\n  ): Promise<firecrawl.SearchGoogleResponse> {\n    return this.ky\n      .post('/search', {\n        json: pick(params, 'query', 'pageOptions', 'searchOptions')\n      })\n      .json<firecrawl.SearchGoogleResponse>()\n  }\n\n  /**\n   * Get the status of a crawl job.\n   */\n  @aiFunction({\n    name: 'firecrawl_get_crawl_status',\n    description: \\`Get the status of a crawl job.\\`,\n    inputSchema: firecrawl.GetCrawlStatusParamsSchema,\n    tags: ['Crawl']\n  })\n  async getCrawlStatus(\n    params: firecrawl.GetCrawlStatusParams\n  ): Promise<firecrawl.GetCrawlStatusResponse> {\n    return this.ky\n      .get(\\`/crawl/status/\\${params['jobId']}\\`)\n      .json<firecrawl.GetCrawlStatusResponse>()\n  }\n\n  /**\n   * Cancel a crawl job.\n   */\n  @aiFunction({\n    name: 'firecrawl_cancel_crawl_job',\n    description: \\`Cancel a crawl job.\\`,\n    inputSchema: firecrawl.CancelCrawlJobParamsSchema,\n    tags: ['Crawl']\n  })\n  async cancelCrawlJob(\n    params: firecrawl.CancelCrawlJobParams\n  ): Promise<firecrawl.CancelCrawlJobResponse> {\n    return this.ky\n      .delete(\\`/crawl/cancel/\\${params['jobId']}\\`)\n      .json<firecrawl.CancelCrawlJobResponse>()\n  }\n}\n\"\n`;\n\nexports[`openapi-to-ts > notion.json 1`] = `\n\"/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace notion {\n  export const apiBaseUrl = 'https://api.notion.so'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const UserObjectResponseSchema = z.object({\n    object: z.literal('user'),\n    id: z.string(),\n    type: z.enum(['person', 'bot']),\n    name: z.string(),\n    avatar_url: z.string()\n  })\n  export type UserObjectResponse = z.infer<typeof UserObjectResponseSchema>\n\n  export const AnnotationRequestSchema = z.object({\n    bold: z.boolean().optional(),\n    italic: z.boolean().optional(),\n    strikethrough: z.boolean().optional(),\n    underline: z.boolean().optional(),\n    code: z.boolean().optional(),\n    color: z\n      .enum([\n        'default',\n        'gray',\n        'brown',\n        'orange',\n        'yellow',\n        'green',\n        'blue',\n        'purple',\n        'pink',\n        'red',\n        'gray_background',\n        'brown_background',\n        'orange_background',\n        'yellow_background',\n        'green_background',\n        'blue_background',\n        'purple_background',\n        'pink_background',\n        'red_background'\n      ])\n      .optional()\n  })\n  export type AnnotationRequest = z.infer<typeof AnnotationRequestSchema>\n\n  export const DateRequestSchema = z.object({\n    start: z.string(),\n    end: z.union([z.string(), z.null()]).optional(),\n    time_zone: z.union([z.string(), z.null()]).optional()\n  })\n  export type DateRequest = z.infer<typeof DateRequestSchema>\n\n  export const PageObjectResponseSchema = z.object({\n    object: z.literal('page'),\n    id: z.string(),\n    created_time: z.string(),\n    last_edited_time: z.string(),\n    archived: z.boolean(),\n    url: z.string()\n  })\n  export type PageObjectResponse = z.infer<typeof PageObjectResponseSchema>\n\n  export const PartialPageObjectResponseSchema = z.object({\n    object: z.literal('page'),\n    id: z.string()\n  })\n  export type PartialPageObjectResponse = z.infer<\n    typeof PartialPageObjectResponseSchema\n  >\n\n  export const PropertyItemObjectResponseSchema = z.object({\n    type: z.string(),\n    id: z.string()\n  })\n  export type PropertyItemObjectResponse = z.infer<\n    typeof PropertyItemObjectResponseSchema\n  >\n\n  export const PartialBlockObjectResponseSchema = z.object({\n    object: z.literal('block'),\n    id: z.string()\n  })\n  export type PartialBlockObjectResponse = z.infer<\n    typeof PartialBlockObjectResponseSchema\n  >\n\n  export const BlockObjectResponseSchema = z.object({\n    object: z.literal('block'),\n    id: z.string(),\n    type: z.string(),\n    created_time: z.string(),\n    last_edited_time: z.string(),\n    has_children: z.boolean(),\n    archived: z.boolean()\n  })\n  export type BlockObjectResponse = z.infer<typeof BlockObjectResponseSchema>\n\n  export const TitlePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('title'),\n    title: z.record(z.any())\n  })\n  export type TitlePropertyResponse = z.infer<\n    typeof TitlePropertyResponseSchema\n  >\n\n  export const RichTextPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('rich_text'),\n    rich_text: z.record(z.any())\n  })\n  export type RichTextPropertyResponse = z.infer<\n    typeof RichTextPropertyResponseSchema\n  >\n\n  export const NumberPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('number'),\n    number: z.object({ format: z.string() })\n  })\n  export type NumberPropertyResponse = z.infer<\n    typeof NumberPropertyResponseSchema\n  >\n\n  export const SelectOptionSchema = z.object({\n    id: z.string(),\n    name: z.string(),\n    color: z.string()\n  })\n  export type SelectOption = z.infer<typeof SelectOptionSchema>\n\n  export const DatePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('date'),\n    date: z.record(z.any())\n  })\n  export type DatePropertyResponse = z.infer<typeof DatePropertyResponseSchema>\n\n  export const PeoplePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('people'),\n    people: z.record(z.any())\n  })\n  export type PeoplePropertyResponse = z.infer<\n    typeof PeoplePropertyResponseSchema\n  >\n\n  export const FilePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('files'),\n    files: z.record(z.any())\n  })\n  export type FilePropertyResponse = z.infer<typeof FilePropertyResponseSchema>\n\n  export const CheckboxPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('checkbox'),\n    checkbox: z.record(z.any())\n  })\n  export type CheckboxPropertyResponse = z.infer<\n    typeof CheckboxPropertyResponseSchema\n  >\n\n  export const UrlPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('url'),\n    url: z.record(z.any())\n  })\n  export type UrlPropertyResponse = z.infer<typeof UrlPropertyResponseSchema>\n\n  export const EmailPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('email'),\n    email: z.record(z.any())\n  })\n  export type EmailPropertyResponse = z.infer<\n    typeof EmailPropertyResponseSchema\n  >\n\n  export const PhoneNumberPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('phone_number'),\n    phone_number: z.record(z.any())\n  })\n  export type PhoneNumberPropertyResponse = z.infer<\n    typeof PhoneNumberPropertyResponseSchema\n  >\n\n  export const FormulaPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('formula'),\n    formula: z.object({ expression: z.string() })\n  })\n  export type FormulaPropertyResponse = z.infer<\n    typeof FormulaPropertyResponseSchema\n  >\n\n  export const RelationPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('relation'),\n    relation: z.object({\n      database_id: z.string(),\n      synced_property_name: z.string(),\n      synced_property_id: z.string()\n    })\n  })\n  export type RelationPropertyResponse = z.infer<\n    typeof RelationPropertyResponseSchema\n  >\n\n  export const RollupPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('rollup'),\n    rollup: z.object({\n      relation_property_name: z.string(),\n      relation_property_id: z.string(),\n      rollup_property_name: z.string(),\n      rollup_property_id: z.string(),\n      function: z.string()\n    })\n  })\n  export type RollupPropertyResponse = z.infer<\n    typeof RollupPropertyResponseSchema\n  >\n\n  export const CreatedTimePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('created_time'),\n    created_time: z.record(z.any())\n  })\n  export type CreatedTimePropertyResponse = z.infer<\n    typeof CreatedTimePropertyResponseSchema\n  >\n\n  export const CreatedByPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('created_by'),\n    created_by: z.record(z.any())\n  })\n  export type CreatedByPropertyResponse = z.infer<\n    typeof CreatedByPropertyResponseSchema\n  >\n\n  export const LastEditedTimePropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('last_edited_time'),\n    last_edited_time: z.record(z.any())\n  })\n  export type LastEditedTimePropertyResponse = z.infer<\n    typeof LastEditedTimePropertyResponseSchema\n  >\n\n  export const LastEditedByPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('last_edited_by'),\n    last_edited_by: z.record(z.any())\n  })\n  export type LastEditedByPropertyResponse = z.infer<\n    typeof LastEditedByPropertyResponseSchema\n  >\n\n  export const PartialUserObjectResponseSchema = z.object({\n    object: z.literal('user'),\n    id: z.string()\n  })\n  export type PartialUserObjectResponse = z.infer<\n    typeof PartialUserObjectResponseSchema\n  >\n\n  export const AnnotationResponseSchema = z.object({\n    bold: z.boolean(),\n    italic: z.boolean(),\n    strikethrough: z.boolean(),\n    underline: z.boolean(),\n    code: z.boolean(),\n    color: z.enum([\n      'default',\n      'gray',\n      'brown',\n      'orange',\n      'yellow',\n      'green',\n      'blue',\n      'purple',\n      'pink',\n      'red',\n      'gray_background',\n      'brown_background',\n      'orange_background',\n      'yellow_background',\n      'green_background',\n      'blue_background',\n      'purple_background',\n      'pink_background',\n      'red_background'\n    ])\n  })\n  export type AnnotationResponse = z.infer<typeof AnnotationResponseSchema>\n\n  export const DateResponseSchema = z.object({\n    start: z.string(),\n    end: z.union([z.string(), z.null()]),\n    time_zone: z.union([z.string(), z.null()])\n  })\n  export type DateResponse = z.infer<typeof DateResponseSchema>\n\n  export const PropertyUpdateSchemaSchema = z.object({\n    name: z.string().optional(),\n    type: z.string().optional()\n  })\n  export type PropertyUpdateSchema = z.infer<typeof PropertyUpdateSchemaSchema>\n\n  export const TextPropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    does_not_equal: z.string().optional(),\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    starts_with: z.string().optional(),\n    ends_with: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type TextPropertyFilter = z.infer<typeof TextPropertyFilterSchema>\n\n  export const NumberPropertyFilterSchema = z.object({\n    equals: z.number().optional(),\n    does_not_equal: z.number().optional(),\n    greater_than: z.number().optional(),\n    less_than: z.number().optional(),\n    greater_than_or_equal_to: z.number().optional(),\n    less_than_or_equal_to: z.number().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type NumberPropertyFilter = z.infer<typeof NumberPropertyFilterSchema>\n\n  export const CheckboxPropertyFilterSchema = z.object({\n    equals: z.boolean().optional(),\n    does_not_equal: z.boolean().optional()\n  })\n  export type CheckboxPropertyFilter = z.infer<\n    typeof CheckboxPropertyFilterSchema\n  >\n\n  export const SelectPropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    does_not_equal: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type SelectPropertyFilter = z.infer<typeof SelectPropertyFilterSchema>\n\n  export const MultiSelectPropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type MultiSelectPropertyFilter = z.infer<\n    typeof MultiSelectPropertyFilterSchema\n  >\n\n  export const DatePropertyFilterSchema = z.object({\n    equals: z.string().optional(),\n    before: z.string().optional(),\n    after: z.string().optional(),\n    on_or_before: z.string().optional(),\n    on_or_after: z.string().optional(),\n    past_week: z.any().optional(),\n    past_month: z.any().optional(),\n    past_year: z.any().optional(),\n    next_week: z.any().optional(),\n    next_month: z.any().optional(),\n    next_year: z.any().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type DatePropertyFilter = z.infer<typeof DatePropertyFilterSchema>\n\n  export const PeoplePropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type PeoplePropertyFilter = z.infer<typeof PeoplePropertyFilterSchema>\n\n  export const FilesPropertyFilterSchema = z.object({\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type FilesPropertyFilter = z.infer<typeof FilesPropertyFilterSchema>\n\n  export const RelationPropertyFilterSchema = z.object({\n    contains: z.string().optional(),\n    does_not_contain: z.string().optional(),\n    is_empty: z.boolean().optional(),\n    is_not_empty: z.boolean().optional()\n  })\n  export type RelationPropertyFilter = z.infer<\n    typeof RelationPropertyFilterSchema\n  >\n\n  export const PropertySchemaSchema = z.object({\n    type: z.string(),\n    name: z.union([z.string(), z.null()]).optional()\n  })\n  export type PropertySchema = z.infer<typeof PropertySchemaSchema>\n\n  export const SearchParametersSchema = z.object({\n    query: z.string().optional(),\n    sort: z\n      .object({\n        direction: z.enum(['ascending', 'descending']),\n        timestamp: z.literal('last_edited_time')\n      })\n      .optional(),\n    filter: z\n      .object({\n        value: z.enum(['page', 'database']),\n        property: z.literal('object')\n      })\n      .optional(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type SearchParameters = z.infer<typeof SearchParametersSchema>\n\n  export const PartialCommentObjectResponseSchema = z.object({\n    object: z.literal('comment'),\n    id: z.string()\n  })\n  export type PartialCommentObjectResponse = z.infer<\n    typeof PartialCommentObjectResponseSchema\n  >\n\n  export const OauthTokenParametersSchema = z.object({\n    grant_type: z.string(),\n    code: z.string(),\n    redirect_uri: z.string().optional(),\n    external_account: z.object({ key: z.string(), name: z.string() }).optional()\n  })\n  export type OauthTokenParameters = z.infer<typeof OauthTokenParametersSchema>\n\n  export const ListUsersResponseSchema = z.object({\n    results: z.array(UserObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListUsersResponse = z.infer<typeof ListUsersResponseSchema>\n\n  export const PropertyItemListResponseSchema = z.object({\n    results: z.array(PropertyItemObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type PropertyItemListResponse = z.infer<\n    typeof PropertyItemListResponseSchema\n  >\n\n  export const SelectPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('select'),\n    select: z.object({ options: z.array(SelectOptionSchema) })\n  })\n  export type SelectPropertyResponse = z.infer<\n    typeof SelectPropertyResponseSchema\n  >\n\n  export const MultiSelectPropertyResponseSchema = z.object({\n    id: z.string(),\n    type: z.literal('multi_select'),\n    multi_select: z.object({ options: z.array(SelectOptionSchema) })\n  })\n  export type MultiSelectPropertyResponse = z.infer<\n    typeof MultiSelectPropertyResponseSchema\n  >\n\n  export const TextRichTextItemResponseSchema = z.object({\n    type: z.literal('text'),\n    text: z.object({\n      content: z.string(),\n      link: z.union([z.object({ url: z.string() }), z.null()])\n    }),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type TextRichTextItemResponse = z.infer<\n    typeof TextRichTextItemResponseSchema\n  >\n\n  export const EquationRichTextItemResponseSchema = z.object({\n    type: z.literal('equation'),\n    equation: z.object({ expression: z.string() }),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type EquationRichTextItemResponse = z.infer<\n    typeof EquationRichTextItemResponseSchema\n  >\n\n  export const ListBlockChildrenResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PartialBlockObjectResponseSchema, BlockObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListBlockChildrenResponse = z.infer<\n    typeof ListBlockChildrenResponseSchema\n  >\n\n  export const AppendBlockChildrenResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PartialBlockObjectResponseSchema, BlockObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type AppendBlockChildrenResponse = z.infer<\n    typeof AppendBlockChildrenResponseSchema\n  >\n\n  export const QueryDatabaseResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([PageObjectResponseSchema, PartialPageObjectResponseSchema])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type QueryDatabaseResponse = z.infer<\n    typeof QueryDatabaseResponseSchema\n  >\n\n  export const OauthTokenResponseSchema = z.object({\n    access_token: z.string(),\n    token_type: z.literal('bearer'),\n    bot_id: z.string(),\n    workspace_name: z.union([z.string(), z.null()]),\n    workspace_icon: z.union([z.string(), z.null()]),\n    workspace_id: z.string(),\n    owner: z.union([\n      z.object({\n        type: z.literal('user'),\n        user: z.union([\n          UserObjectResponseSchema,\n          PartialUserObjectResponseSchema\n        ])\n      }),\n      z.object({ type: z.literal('workspace'), workspace: z.literal(true) })\n    ]),\n    duplicated_template_id: z.union([z.string(), z.null()])\n  })\n  export type OauthTokenResponse = z.infer<typeof OauthTokenResponseSchema>\n\n  export const RichTextItemRequestSchema = z.union([\n    z.object({\n      text: z.object({\n        content: z.string(),\n        link: z.union([z.object({ url: z.string() }), z.null()]).optional()\n      }),\n      type: z.literal('text').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    }),\n    z.object({\n      mention: z.union([\n        z.object({\n          user: z.union([\n            z.object({ id: z.string() }),\n            UserObjectResponseSchema\n          ])\n        }),\n        z.object({ page: z.object({ id: z.string() }) }),\n        z.object({ database: z.object({ id: z.string() }) }),\n        z.object({ date: DateRequestSchema })\n      ]),\n      type: z.literal('mention').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    }),\n    z.object({\n      equation: z.object({ expression: z.string() }),\n      type: z.literal('equation').optional(),\n      annotations: AnnotationRequestSchema.optional()\n    })\n  ])\n  export type RichTextItemRequest = z.infer<typeof RichTextItemRequestSchema>\n\n  export const CreatePageParametersSchema = z.object({\n    parent: z\n      .record(z.any())\n      .and(\n        z.union([\n          z.object({ type: z.literal('page_id'), page_id: z.string() }),\n          z.object({ type: z.literal('database_id'), database_id: z.string() })\n        ])\n      ),\n    properties: z.record(\n      z.union([\n        z.object({ title: z.array(RichTextItemRequestSchema) }),\n        z.object({ rich_text: z.array(RichTextItemRequestSchema) }),\n        z.object({ number: z.union([z.number(), z.null()]) }),\n        z.object({\n          select: z.union([z.object({ name: z.string() }), z.null()])\n        })\n      ])\n    )\n  })\n  export type CreatePageParameters = z.infer<typeof CreatePageParametersSchema>\n\n  export const UpdatePageParametersSchema = z.object({\n    properties: z\n      .record(\n        z.union([\n          z.object({ title: z.array(RichTextItemRequestSchema) }),\n          z.object({ rich_text: z.array(RichTextItemRequestSchema) }),\n          z.object({ number: z.union([z.number(), z.null()]) }),\n          z.object({\n            select: z.union([z.object({ name: z.string() }), z.null()])\n          })\n        ])\n      )\n      .optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdatePageParameters = z.infer<typeof UpdatePageParametersSchema>\n\n  export const UpdateBlockParametersSchema = z.object({\n    paragraph: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_1: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_2: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    heading_3: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    bulleted_list_item: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    numbered_list_item: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    quote: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    to_do: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        checked: z.boolean().optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    toggle: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        color: z.string().optional()\n      })\n      .optional(),\n    code: z\n      .object({\n        rich_text: z.array(RichTextItemRequestSchema).optional(),\n        language: z.string().optional()\n      })\n      .optional(),\n    embed: z.object({ url: z.string().optional() }).optional(),\n    image: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    video: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    file: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    pdf: z\n      .object({ external: z.object({ url: z.string().optional() }).optional() })\n      .optional(),\n    bookmark: z.object({ url: z.string().optional() }).optional(),\n    equation: z.object({ expression: z.string().optional() }).optional(),\n    divider: z.record(z.any()).optional(),\n    table_of_contents: z.object({ color: z.string().optional() }).optional(),\n    breadcrumb: z.record(z.any()).optional(),\n    column_list: z.record(z.any()).optional(),\n    column: z.record(z.any()).optional(),\n    link_to_page: z\n      .object({\n        type: z.enum(['page_id', 'database_id']).optional(),\n        page_id: z.string().optional(),\n        database_id: z.string().optional()\n      })\n      .optional(),\n    table_row: z\n      .object({ cells: z.array(z.array(RichTextItemRequestSchema)).optional() })\n      .optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdateBlockParameters = z.infer<\n    typeof UpdateBlockParametersSchema\n  >\n\n  export const BlockObjectRequestSchema = z.union([\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('paragraph'),\n      paragraph: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_1'),\n      heading_1: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_2'),\n      heading_2: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('heading_3'),\n      heading_3: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('bulleted_list_item'),\n      bulleted_list_item: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('numbered_list_item'),\n      numbered_list_item: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('to_do'),\n      to_do: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        checked: z.boolean(),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('toggle'),\n      toggle: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        color: z.string().optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('code'),\n      code: z.object({\n        rich_text: z.array(RichTextItemRequestSchema),\n        language: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('child_page'),\n      child_page: z.object({ title: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('child_database'),\n      child_database: z.object({ title: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('embed'),\n      embed: z.object({\n        url: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('image'),\n      image: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('video'),\n      video: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('file'),\n      file: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('pdf'),\n      pdf: z.object({\n        external: z.object({ url: z.string() }),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('bookmark'),\n      bookmark: z.object({\n        url: z.string(),\n        caption: z.array(RichTextItemRequestSchema).optional()\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('equation'),\n      equation: z.object({ expression: z.string() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('divider'),\n      divider: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table_of_contents'),\n      table_of_contents: z.object({ color: z.string().optional() })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('column_list'),\n      column_list: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('column'),\n      column: z.record(z.any())\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('link_to_page'),\n      link_to_page: z.union([\n        z.object({ type: z.literal('page_id'), page_id: z.string() }),\n        z.object({ type: z.literal('database_id'), database_id: z.string() })\n      ])\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table'),\n      table: z.object({\n        table_width: z.number().int(),\n        has_column_header: z.boolean().optional(),\n        has_row_header: z.boolean().optional(),\n        children: z.array(\n          // TODO: Support recursive types for \\`BlockObjectRequestSchema\\`.\n          z.any()\n        )\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('table_row'),\n      table_row: z.object({\n        cells: z.array(z.array(RichTextItemRequestSchema))\n      })\n    }),\n    z.object({\n      object: z.literal('block'),\n      type: z.literal('synced_block'),\n      synced_block: z.object({\n        synced_from: z\n          .union([\n            z.object({ type: z.literal('block_id'), block_id: z.string() }),\n            z.null()\n          ])\n          .optional(),\n        children: z\n          .array(\n            // TODO: Support recursive types for \\`BlockObjectRequestSchema\\`.\n            z.any()\n          )\n          .optional()\n      })\n    })\n  ])\n  export type BlockObjectRequest = z.infer<typeof BlockObjectRequestSchema>\n\n  export const MentionRichTextItemResponseSchema = z.object({\n    type: z.literal('mention'),\n    mention: z.union([\n      z.object({\n        type: z.literal('user'),\n        user: z.union([\n          PartialUserObjectResponseSchema,\n          UserObjectResponseSchema\n        ])\n      }),\n      z.object({ type: z.literal('date'), date: DateResponseSchema }),\n      z.object({\n        type: z.literal('link_preview'),\n        link_preview: z.object({ url: z.string() })\n      }),\n      z.object({ type: z.literal('page'), page: z.object({ id: z.string() }) }),\n      z.object({\n        type: z.literal('database'),\n        database: z.object({ id: z.string() })\n      })\n    ]),\n    annotations: AnnotationResponseSchema,\n    plain_text: z.string(),\n    href: z.union([z.string(), z.null()])\n  })\n  export type MentionRichTextItemResponse = z.infer<\n    typeof MentionRichTextItemResponseSchema\n  >\n\n  export const CreateCommentParametersSchema = z.union([\n    z.object({\n      parent: z.object({\n        page_id: z.string(),\n        type: z.literal('page_id').optional()\n      }),\n      rich_text: z.array(RichTextItemRequestSchema)\n    }),\n    z.object({\n      discussion_id: z.string(),\n      rich_text: z.array(RichTextItemRequestSchema)\n    })\n  ])\n  export type CreateCommentParameters = z.infer<\n    typeof CreateCommentParametersSchema\n  >\n\n  export const AppendBlockChildrenParametersSchema = z.object({\n    children: z.array(BlockObjectRequestSchema)\n  })\n  export type AppendBlockChildrenParameters = z.infer<\n    typeof AppendBlockChildrenParametersSchema\n  >\n\n  export const UpdateDatabaseParametersSchema = z.object({\n    title: z.array(RichTextItemRequestSchema).optional(),\n    description: z.array(RichTextItemRequestSchema).optional(),\n    icon: z\n      .union([\n        z.object({ emoji: z.string(), type: z.literal('emoji') }),\n        z.object({\n          external: z.object({ url: z.string() }),\n          type: z.literal('external')\n        }),\n        z.null()\n      ])\n      .optional(),\n    cover: z\n      .union([\n        z.object({\n          external: z.object({ url: z.string() }),\n          type: z.literal('external')\n        }),\n        z.null()\n      ])\n      .optional(),\n    properties: z.record(PropertyUpdateSchemaSchema).optional(),\n    is_inline: z.boolean().optional(),\n    archived: z.boolean().optional()\n  })\n  export type UpdateDatabaseParameters = z.infer<\n    typeof UpdateDatabaseParametersSchema\n  >\n\n  export const CreateDatabaseParametersSchema = z.object({\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('database_id'), database_id: z.string() })\n    ]),\n    properties: z.record(PropertySchemaSchema),\n    icon: z\n      .union([\n        z.object({ type: z.literal('emoji'), emoji: z.string() }),\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    cover: z\n      .union([\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    title: z.array(RichTextItemRequestSchema),\n    description: z.array(RichTextItemRequestSchema).optional(),\n    is_inline: z.boolean().optional()\n  })\n  export type CreateDatabaseParameters = z.infer<\n    typeof CreateDatabaseParametersSchema\n  >\n\n  export const RichTextItemResponseSchema = z.union([\n    TextRichTextItemResponseSchema,\n    MentionRichTextItemResponseSchema,\n    EquationRichTextItemResponseSchema\n  ])\n  export type RichTextItemResponse = z.infer<typeof RichTextItemResponseSchema>\n\n  export const CommentObjectResponseSchema = z.object({\n    object: z.literal('comment'),\n    id: z.string(),\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('block_id'), block_id: z.string() })\n    ]),\n    discussion_id: z.string(),\n    rich_text: z.array(RichTextItemResponseSchema),\n    created_by: PartialUserObjectResponseSchema,\n    created_time: z.string(),\n    last_edited_time: z.string()\n  })\n  export type CommentObjectResponse = z.infer<\n    typeof CommentObjectResponseSchema\n  >\n\n  export const PropertyFilterSchema = z.union([\n    z.object({ property: z.string(), title: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), rich_text: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), number: NumberPropertyFilterSchema }),\n    z.object({ property: z.string(), checkbox: CheckboxPropertyFilterSchema }),\n    z.object({ property: z.string(), select: SelectPropertyFilterSchema }),\n    z.object({\n      property: z.string(),\n      multi_select: MultiSelectPropertyFilterSchema\n    }),\n    z.object({ property: z.string(), date: DatePropertyFilterSchema }),\n    z.object({ property: z.string(), people: PeoplePropertyFilterSchema }),\n    z.object({ property: z.string(), files: FilesPropertyFilterSchema }),\n    z.object({ property: z.string(), url: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), email: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), phone_number: TextPropertyFilterSchema }),\n    z.object({ property: z.string(), relation: RelationPropertyFilterSchema }),\n    z.object({ property: z.string(), created_by: PeoplePropertyFilterSchema }),\n    z.object({ property: z.string(), created_time: DatePropertyFilterSchema }),\n    z.object({\n      property: z.string(),\n      last_edited_by: PeoplePropertyFilterSchema\n    }),\n    z.object({\n      property: z.string(),\n      last_edited_time: DatePropertyFilterSchema\n    }),\n    z.object({\n      timestamp: z.enum(['created_time', 'last_edited_time']),\n      created_time: DatePropertyFilterSchema\n    }),\n    z.object({\n      timestamp: z.enum(['created_time', 'last_edited_time']),\n      last_edited_time: DatePropertyFilterSchema\n    })\n  ])\n  export type PropertyFilter = z.infer<typeof PropertyFilterSchema>\n\n  export const ListCommentsResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(CommentObjectResponseSchema),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListCommentsResponse = z.infer<typeof ListCommentsResponseSchema>\n\n  export const CompoundFilterSchema = z.object({\n    and: z.array(PropertyFilterSchema).optional(),\n    or: z.array(PropertyFilterSchema).optional()\n  })\n  export type CompoundFilter = z.infer<typeof CompoundFilterSchema>\n\n  export const QueryDatabaseParametersSchema = z.object({\n    sorts: z\n      .array(\n        z.union([\n          z.object({\n            property: z.string(),\n            direction: z.enum(['ascending', 'descending'])\n          }),\n          z.object({\n            timestamp: z.enum(['created_time', 'last_edited_time']),\n            direction: z.enum(['ascending', 'descending'])\n          })\n        ])\n      )\n      .optional(),\n    filter: z.union([PropertyFilterSchema, CompoundFilterSchema]).optional(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional(),\n    archived: z.boolean().optional()\n  })\n  export type QueryDatabaseParameters = z.infer<\n    typeof QueryDatabaseParametersSchema\n  >\n\n  export const DatabasePropertyConfigResponseSchema = z.union([\n    TitlePropertyResponseSchema,\n    RichTextPropertyResponseSchema,\n    NumberPropertyResponseSchema,\n    SelectPropertyResponseSchema,\n    MultiSelectPropertyResponseSchema,\n    DatePropertyResponseSchema,\n    PeoplePropertyResponseSchema,\n    FilePropertyResponseSchema,\n    CheckboxPropertyResponseSchema,\n    UrlPropertyResponseSchema,\n    EmailPropertyResponseSchema,\n    PhoneNumberPropertyResponseSchema,\n    FormulaPropertyResponseSchema,\n    RelationPropertyResponseSchema,\n    RollupPropertyResponseSchema,\n    CreatedTimePropertyResponseSchema,\n    CreatedByPropertyResponseSchema,\n    LastEditedTimePropertyResponseSchema,\n    LastEditedByPropertyResponseSchema\n  ])\n  export type DatabasePropertyConfigResponse = z.infer<\n    typeof DatabasePropertyConfigResponseSchema\n  >\n\n  export const PartialDatabaseObjectResponseSchema = z.object({\n    object: z.literal('database'),\n    id: z.string(),\n    properties: z.record(DatabasePropertyConfigResponseSchema)\n  })\n  export type PartialDatabaseObjectResponse = z.infer<\n    typeof PartialDatabaseObjectResponseSchema\n  >\n\n  export const DatabaseObjectResponseSchema = z.object({\n    object: z.literal('database'),\n    id: z.string(),\n    cover: z\n      .union([\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    icon: z\n      .union([\n        z.object({ type: z.literal('emoji'), emoji: z.string() }),\n        z.object({\n          type: z.literal('external'),\n          external: z.object({ url: z.string() })\n        }),\n        z.null()\n      ])\n      .optional(),\n    created_time: z.string(),\n    created_by: PartialUserObjectResponseSchema,\n    last_edited_time: z.string(),\n    last_edited_by: PartialUserObjectResponseSchema,\n    title: z.array(RichTextItemResponseSchema),\n    description: z.array(RichTextItemResponseSchema),\n    is_inline: z.boolean(),\n    properties: z.record(DatabasePropertyConfigResponseSchema),\n    parent: z.union([\n      z.object({ type: z.literal('page_id'), page_id: z.string() }),\n      z.object({ type: z.literal('workspace'), workspace: z.literal(true) })\n    ]),\n    url: z.string(),\n    archived: z.boolean()\n  })\n  export type DatabaseObjectResponse = z.infer<\n    typeof DatabaseObjectResponseSchema\n  >\n\n  export const ListDatabasesResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([\n        PartialDatabaseObjectResponseSchema,\n        DatabaseObjectResponseSchema\n      ])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type ListDatabasesResponse = z.infer<\n    typeof ListDatabasesResponseSchema\n  >\n\n  export const SearchResponseSchema = z.object({\n    object: z.literal('list'),\n    results: z.array(\n      z.union([\n        PageObjectResponseSchema,\n        PartialPageObjectResponseSchema,\n        PartialDatabaseObjectResponseSchema,\n        DatabaseObjectResponseSchema\n      ])\n    ),\n    next_cursor: z.union([z.string(), z.null()]),\n    has_more: z.boolean()\n  })\n  export type SearchResponse = z.infer<typeof SearchResponseSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetSelfParamsSchema = z.object({})\n  export type GetSelfParams = z.infer<typeof GetSelfParamsSchema>\n\n  export const GetSelfResponseSchema = UserObjectResponseSchema\n  export type GetSelfResponse = z.infer<typeof GetSelfResponseSchema>\n\n  export const GetUserParamsSchema = z.object({ user_id: z.string() })\n  export type GetUserParams = z.infer<typeof GetUserParamsSchema>\n\n  export const GetUserResponseSchema = UserObjectResponseSchema\n  export type GetUserResponse = z.infer<typeof GetUserResponseSchema>\n\n  export const ListUsersParamsSchema = z.object({\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListUsersParams = z.infer<typeof ListUsersParamsSchema>\n\n  export const CreatePageParamsSchema = CreatePageParametersSchema\n  export type CreatePageParams = z.infer<typeof CreatePageParamsSchema>\n\n  export const CreatePageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type CreatePageResponse = z.infer<typeof CreatePageResponseSchema>\n\n  export const GetPageParamsSchema = z.object({\n    page_id: z.string(),\n    filter_properties: z.array(z.string()).optional()\n  })\n  export type GetPageParams = z.infer<typeof GetPageParamsSchema>\n\n  export const GetPageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type GetPageResponse = z.infer<typeof GetPageResponseSchema>\n\n  export const UpdatePageParamsSchema = z\n    .object({ page_id: z.string() })\n    .merge(UpdatePageParametersSchema)\n  export type UpdatePageParams = z.infer<typeof UpdatePageParamsSchema>\n\n  export const UpdatePageResponseSchema = z.union([\n    PageObjectResponseSchema,\n    PartialPageObjectResponseSchema\n  ])\n  export type UpdatePageResponse = z.infer<typeof UpdatePageResponseSchema>\n\n  export const GetPagePropertyParamsSchema = z.object({\n    page_id: z.string(),\n    property_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type GetPagePropertyParams = z.infer<\n    typeof GetPagePropertyParamsSchema\n  >\n\n  export const GetPagePropertyResponseSchema = z.union([\n    PropertyItemObjectResponseSchema,\n    PropertyItemListResponseSchema\n  ])\n  export type GetPagePropertyResponse = z.infer<\n    typeof GetPagePropertyResponseSchema\n  >\n\n  export const GetBlockParamsSchema = z.object({ block_id: z.string() })\n  export type GetBlockParams = z.infer<typeof GetBlockParamsSchema>\n\n  export const GetBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type GetBlockResponse = z.infer<typeof GetBlockResponseSchema>\n\n  export const DeleteBlockParamsSchema = z.object({ block_id: z.string() })\n  export type DeleteBlockParams = z.infer<typeof DeleteBlockParamsSchema>\n\n  export const DeleteBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type DeleteBlockResponse = z.infer<typeof DeleteBlockResponseSchema>\n\n  export const UpdateBlockParamsSchema = z\n    .object({ block_id: z.string() })\n    .merge(UpdateBlockParametersSchema)\n  export type UpdateBlockParams = z.infer<typeof UpdateBlockParamsSchema>\n\n  export const UpdateBlockResponseSchema = z.union([\n    PartialBlockObjectResponseSchema,\n    BlockObjectResponseSchema\n  ])\n  export type UpdateBlockResponse = z.infer<typeof UpdateBlockResponseSchema>\n\n  export const ListBlockChildrenParamsSchema = z.object({\n    block_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListBlockChildrenParams = z.infer<\n    typeof ListBlockChildrenParamsSchema\n  >\n\n  export const AppendBlockChildrenParamsSchema = z\n    .object({ block_id: z.string() })\n    .merge(AppendBlockChildrenParametersSchema)\n  export type AppendBlockChildrenParams = z.infer<\n    typeof AppendBlockChildrenParamsSchema\n  >\n\n  export const GetDatabaseParamsSchema = z.object({ database_id: z.string() })\n  export type GetDatabaseParams = z.infer<typeof GetDatabaseParamsSchema>\n\n  export const GetDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type GetDatabaseResponse = z.infer<typeof GetDatabaseResponseSchema>\n\n  export const UpdateDatabaseParamsSchema = z\n    .object({ database_id: z.string() })\n    .merge(UpdateDatabaseParametersSchema)\n  export type UpdateDatabaseParams = z.infer<typeof UpdateDatabaseParamsSchema>\n\n  export const UpdateDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type UpdateDatabaseResponse = z.infer<\n    typeof UpdateDatabaseResponseSchema\n  >\n\n  export const QueryDatabaseParamsSchema = z\n    .object({\n      database_id: z.string(),\n      filter_properties: z.array(z.string()).optional()\n    })\n    .merge(QueryDatabaseParametersSchema)\n  export type QueryDatabaseParams = z.infer<typeof QueryDatabaseParamsSchema>\n\n  export const ListDatabasesParamsSchema = z.object({\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListDatabasesParams = z.infer<typeof ListDatabasesParamsSchema>\n\n  export const CreateDatabaseParamsSchema = CreateDatabaseParametersSchema\n  export type CreateDatabaseParams = z.infer<typeof CreateDatabaseParamsSchema>\n\n  export const CreateDatabaseResponseSchema = z.union([\n    PartialDatabaseObjectResponseSchema,\n    DatabaseObjectResponseSchema\n  ])\n  export type CreateDatabaseResponse = z.infer<\n    typeof CreateDatabaseResponseSchema\n  >\n\n  export const SearchParamsSchema = SearchParametersSchema\n  export type SearchParams = z.infer<typeof SearchParamsSchema>\n\n  export const ListCommentsParamsSchema = z.object({\n    block_id: z.string(),\n    start_cursor: z.string().optional(),\n    page_size: z.number().int().optional()\n  })\n  export type ListCommentsParams = z.infer<typeof ListCommentsParamsSchema>\n\n  export const CreateCommentParamsSchema = CreateCommentParametersSchema\n  export type CreateCommentParams = z.infer<typeof CreateCommentParamsSchema>\n\n  export const CreateCommentResponseSchema = z.union([\n    CommentObjectResponseSchema,\n    PartialCommentObjectResponseSchema\n  ])\n  export type CreateCommentResponse = z.infer<\n    typeof CreateCommentResponseSchema\n  >\n\n  export const OauthTokenParamsSchema = OauthTokenParametersSchema\n  export type OauthTokenParams = z.infer<typeof OauthTokenParamsSchema>\n}\n\n\n/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  AIFunctionsProvider,\n  aiFunction,\n  assert,\n  getEnv,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { notion } from './notion'\n\n/**\n * Agentic Notion client.\n *\n * API specification for Notion.\n */\nexport class NotionClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('NOTION_API_KEY'),\n    apiBaseUrl = notion.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'NotionClient missing required \"apiKey\" (defaults to \"NOTION_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: \\`Bearer \\${apiKey}\\`\n      }\n    })\n  }\n\n  /**\n   * Get current user.\n   */\n  @aiFunction({\n    name: 'notion_get_self',\n    description: \\`Get current user.\\`,\n    inputSchema: notion.GetSelfParamsSchema\n  })\n  async getSelf(\n    _params: notion.GetSelfParams\n  ): Promise<notion.GetSelfResponse> {\n    return this.ky.get('/users/me').json<notion.GetSelfResponse>()\n  }\n\n  /**\n   * Get user.\n   */\n  @aiFunction({\n    name: 'notion_get_user',\n    description: \\`Get user.\\`,\n    inputSchema: notion.GetUserParamsSchema\n  })\n  async getUser(params: notion.GetUserParams): Promise<notion.GetUserResponse> {\n    return this.ky\n      .get(\\`/users/\\${params['user_id']}\\`)\n      .json<notion.GetUserResponse>()\n  }\n\n  /**\n   * List users.\n   */\n  @aiFunction({\n    name: 'notion_list_users',\n    description: \\`List users.\\`,\n    inputSchema: notion.ListUsersParamsSchema\n  })\n  async listUsers(\n    params: notion.ListUsersParams\n  ): Promise<notion.ListUsersResponse> {\n    return this.ky\n      .get('/users', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListUsersResponse>()\n  }\n\n  /**\n   * Create page.\n   */\n  @aiFunction({\n    name: 'notion_create_page',\n    description: \\`Create page.\\`,\n    inputSchema: notion.CreatePageParamsSchema\n  })\n  async createPage(\n    params: notion.CreatePageParams\n  ): Promise<notion.CreatePageResponse> {\n    return this.ky\n      .post('/pages', {\n        json: pick(params, 'parent', 'properties')\n      })\n      .json<notion.CreatePageResponse>()\n  }\n\n  /**\n   * Get page.\n   */\n  @aiFunction({\n    name: 'notion_get_page',\n    description: \\`Get page.\\`,\n    inputSchema: notion.GetPageParamsSchema\n  })\n  async getPage(params: notion.GetPageParams): Promise<notion.GetPageResponse> {\n    return this.ky\n      .get(\\`/pages/\\${params['page_id']}\\`, {\n        searchParams: sanitizeSearchParams(pick(params, 'filter_properties'))\n      })\n      .json<notion.GetPageResponse>()\n  }\n\n  /**\n   * Update page.\n   */\n  @aiFunction({\n    name: 'notion_update_page',\n    description: \\`Update page.\\`,\n    inputSchema: notion.UpdatePageParamsSchema\n  })\n  async updatePage(\n    params: notion.UpdatePageParams\n  ): Promise<notion.UpdatePageResponse> {\n    return this.ky\n      .patch(\\`/pages/\\${params['page_id']}\\`, {\n        json: pick(params, 'properties', 'archived')\n      })\n      .json<notion.UpdatePageResponse>()\n  }\n\n  /**\n   * Get page property.\n   */\n  @aiFunction({\n    name: 'notion_get_page_property',\n    description: \\`Get page property.\\`,\n    inputSchema: notion.GetPagePropertyParamsSchema\n  })\n  async getPageProperty(\n    params: notion.GetPagePropertyParams\n  ): Promise<notion.GetPagePropertyResponse> {\n    return this.ky\n      .get(\\`/pages/\\${params['page_id']}/properties/\\${params['property_id']}\\`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.GetPagePropertyResponse>()\n  }\n\n  /**\n   * Get block.\n   */\n  @aiFunction({\n    name: 'notion_get_block',\n    description: \\`Get block.\\`,\n    inputSchema: notion.GetBlockParamsSchema\n  })\n  async getBlock(\n    params: notion.GetBlockParams\n  ): Promise<notion.GetBlockResponse> {\n    return this.ky\n      .get(\\`/blocks/\\${params['block_id']}\\`)\n      .json<notion.GetBlockResponse>()\n  }\n\n  /**\n   * Delete block.\n   */\n  @aiFunction({\n    name: 'notion_delete_block',\n    description: \\`Delete block.\\`,\n    inputSchema: notion.DeleteBlockParamsSchema\n  })\n  async deleteBlock(\n    params: notion.DeleteBlockParams\n  ): Promise<notion.DeleteBlockResponse> {\n    return this.ky\n      .delete(\\`/blocks/\\${params['block_id']}\\`)\n      .json<notion.DeleteBlockResponse>()\n  }\n\n  /**\n   * Update block.\n   */\n  @aiFunction({\n    name: 'notion_update_block',\n    description: \\`Update block.\\`,\n    inputSchema: notion.UpdateBlockParamsSchema\n  })\n  async updateBlock(\n    params: notion.UpdateBlockParams\n  ): Promise<notion.UpdateBlockResponse> {\n    return this.ky\n      .patch(\\`/blocks/\\${params['block_id']}\\`, {\n        json: pick(\n          params,\n          'paragraph',\n          'heading_1',\n          'heading_2',\n          'heading_3',\n          'bulleted_list_item',\n          'numbered_list_item',\n          'quote',\n          'to_do',\n          'toggle',\n          'code',\n          'embed',\n          'image',\n          'video',\n          'file',\n          'pdf',\n          'bookmark',\n          'equation',\n          'divider',\n          'table_of_contents',\n          'breadcrumb',\n          'column_list',\n          'column',\n          'link_to_page',\n          'table_row',\n          'archived'\n        )\n      })\n      .json<notion.UpdateBlockResponse>()\n  }\n\n  /**\n   * List block children.\n   */\n  @aiFunction({\n    name: 'notion_list_block_children',\n    description: \\`List block children.\\`,\n    inputSchema: notion.ListBlockChildrenParamsSchema\n  })\n  async listBlockChildren(\n    params: notion.ListBlockChildrenParams\n  ): Promise<notion.ListBlockChildrenResponse> {\n    return this.ky\n      .get(\\`/blocks/\\${params['block_id']}/children\\`, {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListBlockChildrenResponse>()\n  }\n\n  /**\n   * Append block children.\n   */\n  @aiFunction({\n    name: 'notion_append_block_children',\n    description: \\`Append block children.\\`,\n    inputSchema: notion.AppendBlockChildrenParamsSchema\n  })\n  async appendBlockChildren(\n    params: notion.AppendBlockChildrenParams\n  ): Promise<notion.AppendBlockChildrenResponse> {\n    return this.ky\n      .patch(\\`/blocks/\\${params['block_id']}/children\\`, {\n        json: pick(params, 'children')\n      })\n      .json<notion.AppendBlockChildrenResponse>()\n  }\n\n  /**\n   * Get database.\n   */\n  @aiFunction({\n    name: 'notion_get_database',\n    description: \\`Get database.\\`,\n    inputSchema: notion.GetDatabaseParamsSchema\n  })\n  async getDatabase(\n    params: notion.GetDatabaseParams\n  ): Promise<notion.GetDatabaseResponse> {\n    return this.ky\n      .get(\\`/databases/\\${params['database_id']}\\`)\n      .json<notion.GetDatabaseResponse>()\n  }\n\n  /**\n   * Update database.\n   */\n  @aiFunction({\n    name: 'notion_update_database',\n    description: \\`Update database.\\`,\n    inputSchema: notion.UpdateDatabaseParamsSchema\n  })\n  async updateDatabase(\n    params: notion.UpdateDatabaseParams\n  ): Promise<notion.UpdateDatabaseResponse> {\n    return this.ky\n      .patch(\\`/databases/\\${params['database_id']}\\`, {\n        json: pick(\n          params,\n          'title',\n          'description',\n          'icon',\n          'cover',\n          'properties',\n          'is_inline',\n          'archived'\n        )\n      })\n      .json<notion.UpdateDatabaseResponse>()\n  }\n\n  /**\n   * Query database.\n   */\n  @aiFunction({\n    name: 'notion_query_database',\n    description: \\`Query database.\\`,\n    inputSchema: notion.QueryDatabaseParamsSchema\n  })\n  async queryDatabase(\n    params: notion.QueryDatabaseParams\n  ): Promise<notion.QueryDatabaseResponse> {\n    return this.ky\n      .post(\\`/databases/\\${params['database_id']}/query\\`, {\n        searchParams: sanitizeSearchParams(pick(params, 'filter_properties')),\n        json: pick(\n          params,\n          'sorts',\n          'filter',\n          'start_cursor',\n          'page_size',\n          'archived'\n        )\n      })\n      .json<notion.QueryDatabaseResponse>()\n  }\n\n  /**\n   * List databases.\n   */\n  @aiFunction({\n    name: 'notion_list_databases',\n    description: \\`List databases.\\`,\n    inputSchema: notion.ListDatabasesParamsSchema\n  })\n  async listDatabases(\n    params: notion.ListDatabasesParams\n  ): Promise<notion.ListDatabasesResponse> {\n    return this.ky\n      .get('/databases', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListDatabasesResponse>()\n  }\n\n  /**\n   * Create database.\n   */\n  @aiFunction({\n    name: 'notion_create_database',\n    description: \\`Create database.\\`,\n    inputSchema: notion.CreateDatabaseParamsSchema\n  })\n  async createDatabase(\n    params: notion.CreateDatabaseParams\n  ): Promise<notion.CreateDatabaseResponse> {\n    return this.ky\n      .post('/databases', {\n        json: pick(\n          params,\n          'parent',\n          'properties',\n          'icon',\n          'cover',\n          'title',\n          'description',\n          'is_inline'\n        )\n      })\n      .json<notion.CreateDatabaseResponse>()\n  }\n\n  /**\n   * Search.\n   */\n  @aiFunction({\n    name: 'notion_search',\n    description: \\`Search.\\`,\n    inputSchema: notion.SearchParamsSchema\n  })\n  async search(params: notion.SearchParams): Promise<notion.SearchResponse> {\n    return this.ky\n      .post('/search', {\n        json: pick(\n          params,\n          'query',\n          'sort',\n          'filter',\n          'start_cursor',\n          'page_size'\n        )\n      })\n      .json<notion.SearchResponse>()\n  }\n\n  /**\n   * List comments.\n   */\n  @aiFunction({\n    name: 'notion_list_comments',\n    description: \\`List comments.\\`,\n    inputSchema: notion.ListCommentsParamsSchema\n  })\n  async listComments(\n    params: notion.ListCommentsParams\n  ): Promise<notion.ListCommentsResponse> {\n    return this.ky\n      .get('/comments', {\n        searchParams: sanitizeSearchParams(\n          pick(params, 'block_id', 'start_cursor', 'page_size')\n        )\n      })\n      .json<notion.ListCommentsResponse>()\n  }\n\n  /**\n   * Create comment.\n   */\n  @aiFunction({\n    name: 'notion_create_comment',\n    description: \\`Create comment.\\`,\n    // TODO: Improve handling of union params\n    inputSchema: notion.CreateCommentParamsSchema as any\n  })\n  async createComment(\n    params: notion.CreateCommentParams\n  ): Promise<notion.CreateCommentResponse> {\n    return this.ky\n      .post('/comments', {\n        json: params\n      })\n      .json<notion.CreateCommentResponse>()\n  }\n\n  /**\n   * OAuth token.\n   */\n  @aiFunction({\n    name: 'notion_oauth_token',\n    description: \\`OAuth token.\\`,\n    inputSchema: notion.OauthTokenParamsSchema\n  })\n  async oauthToken(\n    params: notion.OauthTokenParams\n  ): Promise<notion.OauthTokenResponse> {\n    return this.ky\n      .post('/oauth/token', {\n        json: pick(\n          params,\n          'grant_type',\n          'code',\n          'redirect_uri',\n          'external_account'\n        )\n      })\n      .json<notion.OauthTokenResponse>()\n  }\n}\n\"\n`;\n\nexports[`openapi-to-ts > pet-store.json 1`] = `\n\"/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace petstore {\n  export const apiBaseUrl = 'http://petstore.swagger.io/v1'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const PetSchema = z.object({\n    id: z.number().int(),\n    name: z.string(),\n    tag: z.string().optional()\n  })\n  export type Pet = z.infer<typeof PetSchema>\n\n  export const PetsSchema = z.array(PetSchema).max(100)\n  export type Pets = z.infer<typeof PetsSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const ListPetsParamsSchema = z.object({\n    /** How many items to return at one time (max 100) */\n    limit: z\n      .number()\n      .int()\n      .lte(100)\n      .describe('How many items to return at one time (max 100)')\n      .optional()\n  })\n  export type ListPetsParams = z.infer<typeof ListPetsParamsSchema>\n\n  export const ListPetsResponseSchema = PetsSchema\n  export type ListPetsResponse = z.infer<typeof ListPetsResponseSchema>\n\n  export const CreatePetsParamsSchema = PetSchema\n  export type CreatePetsParams = z.infer<typeof CreatePetsParamsSchema>\n\n  export type CreatePetsResponse = undefined\n\n  export const ShowPetByIdParamsSchema = z.object({\n    /** The id of the pet to retrieve */\n    petId: z.string().describe('The id of the pet to retrieve')\n  })\n  export type ShowPetByIdParams = z.infer<typeof ShowPetByIdParamsSchema>\n\n  export const ShowPetByIdResponseSchema = PetSchema\n  export type ShowPetByIdResponse = z.infer<typeof ShowPetByIdResponseSchema>\n}\n\n\n/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  AIFunctionsProvider,\n  aiFunction,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { petstore } from './pet-store'\n\n/**\n * Agentic PetStore client.\n */\nexport class PetStoreClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = petstore.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n   * List all pets.\n   */\n  @aiFunction({\n    name: 'pet_store_list_pets',\n    description: \\`List all pets.\\`,\n    inputSchema: petstore.ListPetsParamsSchema,\n    tags: ['pets']\n  })\n  async listPets(\n    params: petstore.ListPetsParams\n  ): Promise<petstore.ListPetsResponse> {\n    return this.ky\n      .get('/pets', {\n        searchParams: sanitizeSearchParams(params)\n      })\n      .json<petstore.ListPetsResponse>()\n  }\n\n  /**\n   * Create a pet.\n   */\n  @aiFunction({\n    name: 'pet_store_create_pets',\n    description: \\`Create a pet.\\`,\n    inputSchema: petstore.CreatePetsParamsSchema,\n    tags: ['pets']\n  })\n  async createPets(\n    params: petstore.CreatePetsParams\n  ): Promise<petstore.CreatePetsResponse> {\n    return this.ky\n      .post('/pets', {\n        json: pick(params, 'id', 'name', 'tag')\n      })\n      .json<petstore.CreatePetsResponse>()\n  }\n\n  /**\n   * Info for a specific pet.\n   */\n  @aiFunction({\n    name: 'pet_store_show_pet_by_id',\n    description: \\`Info for a specific pet.\\`,\n    inputSchema: petstore.ShowPetByIdParamsSchema,\n    tags: ['pets']\n  })\n  async showPetById(\n    params: petstore.ShowPetByIdParams\n  ): Promise<petstore.ShowPetByIdResponse> {\n    return this.ky\n      .get(\\`/pets/\\${params['petId']}\\`)\n      .json<petstore.ShowPetByIdResponse>()\n  }\n}\n\"\n`;\n\nexports[`openapi-to-ts > petstore-expanded.json 1`] = `\n\"/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace petstoreexpanded {\n  export const apiBaseUrl = 'http://petstore.swagger.io/api'\n\n  // -----------------------------------------------------------------------------\n  // Component schemas\n  // -----------------------------------------------------------------------------\n\n  export const NewPetSchema = z.object({\n    name: z.string(),\n    tag: z.string().optional()\n  })\n  export type NewPet = z.infer<typeof NewPetSchema>\n\n  export const PetSchema = z.intersection(\n    NewPetSchema,\n    z.object({ id: z.number().int() })\n  )\n  export type Pet = z.infer<typeof PetSchema>\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const FindPetsParamsSchema = z.object({\n    /** tags to filter by */\n    tags: z.array(z.string()).describe('tags to filter by').optional(),\n    /** maximum number of results to return */\n    limit: z\n      .number()\n      .int()\n      .describe('maximum number of results to return')\n      .optional()\n  })\n  export type FindPetsParams = z.infer<typeof FindPetsParamsSchema>\n\n  export const FindPetsResponseSchema = z.array(PetSchema)\n  export type FindPetsResponse = z.infer<typeof FindPetsResponseSchema>\n\n  export const AddPetParamsSchema = NewPetSchema\n  export type AddPetParams = z.infer<typeof AddPetParamsSchema>\n\n  export const AddPetResponseSchema = PetSchema\n  export type AddPetResponse = z.infer<typeof AddPetResponseSchema>\n\n  export const FindPetByIdParamsSchema = z.object({\n    /** ID of pet to fetch */\n    id: z.number().int().describe('ID of pet to fetch')\n  })\n  export type FindPetByIdParams = z.infer<typeof FindPetByIdParamsSchema>\n\n  export const FindPetByIdResponseSchema = PetSchema\n  export type FindPetByIdResponse = z.infer<typeof FindPetByIdResponseSchema>\n\n  export const DeletePetParamsSchema = z.object({\n    /** ID of pet to delete */\n    id: z.number().int().describe('ID of pet to delete')\n  })\n  export type DeletePetParams = z.infer<typeof DeletePetParamsSchema>\n\n  export type DeletePetResponse = undefined\n}\n\n\n/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  AIFunctionsProvider,\n  aiFunction,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { petstoreexpanded } from './petstore-expanded'\n\n/**\n * Agentic PetstoreExpanded client.\n *\n * A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification.\n */\nexport class PetstoreExpandedClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = petstoreexpanded.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n * Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\n */\n  @aiFunction({\n    name: 'petstore_expanded_find_pets',\n    description: \\`Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\\`,\n    inputSchema: petstoreexpanded.FindPetsParamsSchema\n  })\n  async findPets(\n    params: petstoreexpanded.FindPetsParams\n  ): Promise<petstoreexpanded.FindPetsResponse> {\n    return this.ky\n      .get('/pets', {\n        searchParams: sanitizeSearchParams(pick(params, 'tags', 'limit'))\n      })\n      .json<petstoreexpanded.FindPetsResponse>()\n  }\n\n  /**\n   * Creates a new pet in the store. Duplicates are allowed.\n   */\n  @aiFunction({\n    name: 'petstore_expanded_add_pet',\n    description: \\`Creates a new pet in the store. Duplicates are allowed.\\`,\n    inputSchema: petstoreexpanded.AddPetParamsSchema\n  })\n  async addPet(\n    params: petstoreexpanded.AddPetParams\n  ): Promise<petstoreexpanded.AddPetResponse> {\n    return this.ky\n      .post('/pets', {\n        json: pick(params, 'name', 'tag')\n      })\n      .json<petstoreexpanded.AddPetResponse>()\n  }\n\n  /**\n   * Returns a user based on a single ID, if the user does not have access to the pet.\n   */\n  @aiFunction({\n    name: 'petstore_expanded_find_pet_by_id',\n    description: \\`Returns a user based on a single ID, if the user does not have access to the pet.\\`,\n    inputSchema: petstoreexpanded.FindPetByIdParamsSchema\n  })\n  async findPetById(\n    params: petstoreexpanded.FindPetByIdParams\n  ): Promise<petstoreexpanded.FindPetByIdResponse> {\n    return this.ky\n      .get(\\`/pets/\\${params['id']}\\`)\n      .json<petstoreexpanded.FindPetByIdResponse>()\n  }\n\n  /**\n   * deletes a single pet based on the ID supplied.\n   */\n  @aiFunction({\n    name: 'petstore_expanded_delete_pet',\n    description: \\`deletes a single pet based on the ID supplied.\\`,\n    inputSchema: petstoreexpanded.DeletePetParamsSchema\n  })\n  async deletePet(\n    params: petstoreexpanded.DeletePetParams\n  ): Promise<petstoreexpanded.DeletePetResponse> {\n    return this.ky\n      .delete(\\`/pets/\\${params['id']}\\`)\n      .json<petstoreexpanded.DeletePetResponse>()\n  }\n}\n\"\n`;\n\nexports[`openapi-to-ts > security.json 1`] = `\n\"/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'\n\nexport namespace security {\n  export const apiBaseUrl = 'https://httpbin.org'\n\n  // -----------------------------------------------------------------------------\n  // Operation schemas\n  // -----------------------------------------------------------------------------\n\n  export const GetAnythingApiKeyParamsSchema = z.object({})\n  export type GetAnythingApiKeyParams = z.infer<\n    typeof GetAnythingApiKeyParamsSchema\n  >\n\n  export type GetAnythingApiKeyResponse = undefined\n\n  export const PostAnythingApiKeyParamsSchema = z.object({})\n  export type PostAnythingApiKeyParams = z.infer<\n    typeof PostAnythingApiKeyParamsSchema\n  >\n\n  export type PostAnythingApiKeyResponse = undefined\n\n  export const PutAnythingApiKeyParamsSchema = z.object({})\n  export type PutAnythingApiKeyParams = z.infer<\n    typeof PutAnythingApiKeyParamsSchema\n  >\n\n  export type PutAnythingApiKeyResponse = undefined\n\n  export const PostAnythingBasicParamsSchema = z.object({})\n  export type PostAnythingBasicParams = z.infer<\n    typeof PostAnythingBasicParamsSchema\n  >\n\n  export type PostAnythingBasicResponse = undefined\n\n  export const PostAnythingBearerParamsSchema = z.object({})\n  export type PostAnythingBearerParams = z.infer<\n    typeof PostAnythingBearerParamsSchema\n  >\n\n  export type PostAnythingBearerResponse = undefined\n\n  export const PutAnythingBearerParamsSchema = z.object({})\n  export type PutAnythingBearerParams = z.infer<\n    typeof PutAnythingBearerParamsSchema\n  >\n\n  export type PutAnythingBearerResponse = undefined\n\n  export const GetAnythingOauth2ParamsSchema = z.object({})\n  export type GetAnythingOauth2Params = z.infer<\n    typeof GetAnythingOauth2ParamsSchema\n  >\n\n  export type GetAnythingOauth2Response = undefined\n\n  export const PostAnythingOauth2ParamsSchema = z.object({})\n  export type PostAnythingOauth2Params = z.infer<\n    typeof PostAnythingOauth2ParamsSchema\n  >\n\n  export type PostAnythingOauth2Response = undefined\n\n  export const PutAnythingOauth2ParamsSchema = z.object({})\n  export type PutAnythingOauth2Params = z.infer<\n    typeof PutAnythingOauth2ParamsSchema\n  >\n\n  export type PutAnythingOauth2Response = undefined\n\n  export const DeleteAnythingOauth2ParamsSchema = z.object({})\n  export type DeleteAnythingOauth2Params = z.infer<\n    typeof DeleteAnythingOauth2ParamsSchema\n  >\n\n  export type DeleteAnythingOauth2Response = undefined\n\n  export const PatchAnythingOauth2ParamsSchema = z.object({})\n  export type PatchAnythingOauth2Params = z.infer<\n    typeof PatchAnythingOauth2ParamsSchema\n  >\n\n  export type PatchAnythingOauth2Response = undefined\n\n  export const PostAnythingOpenIdConnectParamsSchema = z.object({})\n  export type PostAnythingOpenIdConnectParams = z.infer<\n    typeof PostAnythingOpenIdConnectParamsSchema\n  >\n\n  export type PostAnythingOpenIdConnectResponse = undefined\n\n  export const PostAnythingNoAuthParamsSchema = z.object({})\n  export type PostAnythingNoAuthParams = z.infer<\n    typeof PostAnythingNoAuthParamsSchema\n  >\n\n  export type PostAnythingNoAuthResponse = undefined\n\n  export const GetAnythingOptionalAuthParamsSchema = z.object({})\n  export type GetAnythingOptionalAuthParams = z.infer<\n    typeof GetAnythingOptionalAuthParamsSchema\n  >\n\n  export type GetAnythingOptionalAuthResponse = undefined\n\n  export const PostStatus401ParamsSchema = z.object({})\n  export type PostStatus401Params = z.infer<typeof PostStatus401ParamsSchema>\n\n  export type PostStatus401Response = undefined\n}\n\n\n/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { AIFunctionsProvider, aiFunction } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { security } from './security'\n\n/**\n * Agentic Security client.\n *\n * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#securitySchemeObject.\n */\nexport class SecurityClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = security.apiBaseUrl,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl\n    })\n  }\n\n  /**\n   * \\`apiKey\\` auth will be supplied within an \\`apiKey\\` query parameter.\n   */\n  @aiFunction({\n    name: 'security_get_anything_api_key',\n    description: \\`\\\\\\`apiKey\\\\\\` auth will be supplied within an \\\\\\`apiKey\\\\\\` query parameter.\\`,\n    inputSchema: security.GetAnythingApiKeyParamsSchema,\n    tags: ['API Key']\n  })\n  async getAnythingApiKey(\n    _params: security.GetAnythingApiKeyParams\n  ): Promise<security.GetAnythingApiKeyResponse> {\n    return this.ky\n      .get('/anything/apiKey')\n      .json<security.GetAnythingApiKeyResponse>()\n  }\n\n  /**\n   * \\`apiKey\\` auth will be supplied within an \\`api_key\\` cookie.\n   */\n  @aiFunction({\n    name: 'security_post_anything_api_key',\n    description: \\`\\\\\\`apiKey\\\\\\` auth will be supplied within an \\\\\\`api_key\\\\\\` cookie.\\`,\n    inputSchema: security.PostAnythingApiKeyParamsSchema,\n    tags: ['API Key']\n  })\n  async postAnythingApiKey(\n    _params: security.PostAnythingApiKeyParams\n  ): Promise<security.PostAnythingApiKeyResponse> {\n    return this.ky\n      .post('/anything/apiKey')\n      .json<security.PostAnythingApiKeyResponse>()\n  }\n\n  /**\n   * \\`apiKey\\` auth will be supplied within an \\`X-API-KEY\\` header.\n   */\n  @aiFunction({\n    name: 'security_put_anything_api_key',\n    description: \\`\\\\\\`apiKey\\\\\\` auth will be supplied within an \\\\\\`X-API-KEY\\\\\\` header.\\`,\n    inputSchema: security.PutAnythingApiKeyParamsSchema,\n    tags: ['API Key']\n  })\n  async putAnythingApiKey(\n    _params: security.PutAnythingApiKeyParams\n  ): Promise<security.PutAnythingApiKeyResponse> {\n    return this.ky\n      .put('/anything/apiKey')\n      .json<security.PutAnythingApiKeyResponse>()\n  }\n\n  /**\n * Authentication credentials will be supplied within a \\`Basic\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.\n */\n  @aiFunction({\n    name: 'security_post_anything_basic',\n    description: \\`Authentication credentials will be supplied within a \\\\\\`Basic\\\\\\` \\\\\\`Authorization\\\\\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.\\`,\n    inputSchema: security.PostAnythingBasicParamsSchema,\n    tags: ['HTTP']\n  })\n  async postAnythingBasic(\n    _params: security.PostAnythingBasicParams\n  ): Promise<security.PostAnythingBasicResponse> {\n    return this.ky\n      .post('/anything/basic')\n      .json<security.PostAnythingBasicResponse>()\n  }\n\n  /**\n * Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.\n */\n  @aiFunction({\n    name: 'security_post_anything_bearer',\n    description: \\`Authentication credentials will be supplied within a \\\\\\`Bearer\\\\\\` \\\\\\`Authorization\\\\\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample.\\`,\n    inputSchema: security.PostAnythingBearerParamsSchema,\n    tags: ['HTTP']\n  })\n  async postAnythingBearer(\n    _params: security.PostAnythingBearerParams\n  ): Promise<security.PostAnythingBearerResponse> {\n    return this.ky\n      .post('/anything/bearer')\n      .json<security.PostAnythingBearerResponse>()\n  }\n\n  /**\n * Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard \\`Bearer\\` authentication token.\n */\n  @aiFunction({\n    name: 'security_put_anything_bearer',\n    description: \\`Authentication credentials will be supplied within a \\\\\\`Bearer\\\\\\` \\\\\\`Authorization\\\\\\` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard \\\\\\`Bearer\\\\\\` authentication token.\\`,\n    inputSchema: security.PutAnythingBearerParamsSchema,\n    tags: ['HTTP']\n  })\n  async putAnythingBearer(\n    _params: security.PutAnythingBearerParams\n  ): Promise<security.PutAnythingBearerResponse> {\n    return this.ky\n      .put('/anything/bearer')\n      .json<security.PutAnythingBearerResponse>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_get_anything_oauth2',\n    description: \\`> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\\\\\`oauth2\\\\\\` requirement we assume that the user, or the projects JWT, has a qualified \\\\\\`bearer\\\\\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\\`,\n    inputSchema: security.GetAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async getAnythingOauth2(\n    _params: security.GetAnythingOauth2Params\n  ): Promise<security.GetAnythingOauth2Response> {\n    return this.ky\n      .get('/anything/oauth2')\n      .json<security.GetAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_post_anything_oauth2',\n    description: \\`> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\\\\\`oauth2\\\\\\` requirement we assume that the user, or the projects JWT, has a qualified \\\\\\`bearer\\\\\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\\`,\n    inputSchema: security.PostAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async postAnythingOauth2(\n    _params: security.PostAnythingOauth2Params\n  ): Promise<security.PostAnythingOauth2Response> {\n    return this.ky\n      .post('/anything/oauth2')\n      .json<security.PostAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_put_anything_oauth2',\n    description: \\`> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\\\\\`oauth2\\\\\\` requirement we assume that the user, or the projects JWT, has a qualified \\\\\\`bearer\\\\\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\\`,\n    inputSchema: security.PutAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async putAnythingOauth2(\n    _params: security.PutAnythingOauth2Params\n  ): Promise<security.PutAnythingOauth2Response> {\n    return this.ky\n      .put('/anything/oauth2')\n      .json<security.PutAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_delete_anything_oauth2',\n    description: \\`> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\\\\\`oauth2\\\\\\` requirement we assume that the user, or the projects JWT, has a qualified \\\\\\`bearer\\\\\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\\`,\n    inputSchema: security.DeleteAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async deleteAnythingOauth2(\n    _params: security.DeleteAnythingOauth2Params\n  ): Promise<security.DeleteAnythingOauth2Response> {\n    return this.ky\n      .delete('/anything/oauth2')\n      .json<security.DeleteAnythingOauth2Response>()\n  }\n\n  /**\n * > ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\n */\n  @aiFunction({\n    name: 'security_patch_anything_oauth2',\n    description: \\`> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\\\\\`oauth2\\\\\\` requirement we assume that the user, or the projects JWT, has a qualified \\\\\\`bearer\\\\\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23.\\`,\n    inputSchema: security.PatchAnythingOauth2ParamsSchema,\n    tags: ['OAuth 2']\n  })\n  async patchAnythingOauth2(\n    _params: security.PatchAnythingOauth2Params\n  ): Promise<security.PatchAnythingOauth2Response> {\n    return this.ky\n      .patch('/anything/oauth2')\n      .json<security.PatchAnythingOauth2Response>()\n  }\n\n  /**\n   * 🚧 This is not supported.\n   */\n  @aiFunction({\n    name: 'security_post_anything_open_id_connect',\n    description: \\`🚧 This is not supported.\\`,\n    inputSchema: security.PostAnythingOpenIdConnectParamsSchema,\n    tags: ['OpenID Connect']\n  })\n  async postAnythingOpenIdConnect(\n    _params: security.PostAnythingOpenIdConnectParams\n  ): Promise<security.PostAnythingOpenIdConnectResponse> {\n    return this.ky\n      .post('/anything/openIdConnect')\n      .json<security.PostAnythingOpenIdConnectResponse>()\n  }\n\n  /**\n   * This operation does not have any authentication requirements.\n   */\n  @aiFunction({\n    name: 'security_post_anything_no_auth',\n    description: \\`This operation does not have any authentication requirements.\\`,\n    inputSchema: security.PostAnythingNoAuthParamsSchema,\n    tags: ['Other']\n  })\n  async postAnythingNoAuth(\n    _params: security.PostAnythingNoAuthParams\n  ): Promise<security.PostAnythingNoAuthResponse> {\n    return this.ky\n      .post('/anything/no-auth')\n      .json<security.PostAnythingNoAuthResponse>()\n  }\n\n  /**\n * The \\`apiKey\\` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object.\n */\n  @aiFunction({\n    name: 'security_get_anything_optional_auth',\n    description: \\`The \\\\\\`apiKey\\\\\\` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object.\\`,\n    inputSchema: security.GetAnythingOptionalAuthParamsSchema,\n    tags: ['Other']\n  })\n  async getAnythingOptionalAuth(\n    _params: security.GetAnythingOptionalAuthParams\n  ): Promise<security.GetAnythingOptionalAuthResponse> {\n    return this.ky\n      .get('/anything/optional-auth')\n      .json<security.GetAnythingOptionalAuthResponse>()\n  }\n\n  /**\n   * This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\n   */\n  @aiFunction({\n    name: 'security_post_status401',\n    description: \\`This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\\`,\n    inputSchema: security.PostStatus401ParamsSchema,\n    tags: ['Other']\n  })\n  async postStatus401(\n    _params: security.PostStatus401Params\n  ): Promise<security.PostStatus401Response> {\n    return this.ky.post('/status/401').json<security.PostStatus401Response>()\n  }\n}\n\"\n`;\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/src/generate-ts-from-openapi.test.ts",
    "content": "import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { describe, expect, test } from 'vitest'\n\nimport { generateTSFromOpenAPI } from './generate-ts-from-openapi'\n\nconst fixtures = [\n  'firecrawl.json',\n  // 'github.json', // TODO: not working 100% yet\n  'notion.json',\n  // 'open-meteo.yaml',\n  'pet-store.json',\n  'petstore-expanded.json',\n  'security.json'\n  // 'stripe.json', // TODO: not working 100% yet\n  // 'tic-tac-toe.json'\n]\n\nconst dirname = path.join(fileURLToPath(import.meta.url), '..', '..')\n\ndescribe('openapi-to-ts', () => {\n  for (const fixture of fixtures) {\n    test(\n      fixture,\n      {\n        timeout: 60_000\n      },\n      async () => {\n        const fixturePath = path.join(dirname, 'fixtures', 'openapi', fixture)\n        const outputDir = path.join(dirname, 'fixtures', 'generated')\n\n        const result = await generateTSFromOpenAPI({\n          openapiFilePath: fixturePath,\n          outputDir\n        })\n        expect(result).toMatchSnapshot()\n      }\n    )\n  }\n})\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/src/generate-ts-from-openapi.ts",
    "content": "/* eslint-disable no-template-curly-in-string */\nimport * as fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { IJsonSchema, OpenAPIV3 } from 'openapi-types'\nimport { assert } from '@agentic/core'\nimport SwaggerParser from '@apidevtools/swagger-parser'\nimport decamelize from 'decamelize'\nimport { execa } from 'execa'\n\nimport type { GenerateTSFromOpenAPIOptions } from './types'\nimport { convertParametersToJSONSchema } from './openapi-parameters-to-json-schema'\nimport {\n  camelCase,\n  dereference,\n  dereferenceFull,\n  getAndResolve,\n  getComponentDisplayName,\n  getDescription,\n  getOperationParamsName,\n  getOperationResponseName,\n  jsonSchemaToZod,\n  naiveMergeJSONSchemas,\n  pascalCase,\n  prettify\n} from './utils'\n\nconst jsonContentType = 'application/json'\nconst multipartFormData = 'multipart/form-data'\n\nconst httpMethods = [\n  'get',\n  'post',\n  'put',\n  'delete',\n  'options',\n  'head',\n  'patch',\n  'trace'\n] as const\n\nexport async function generateTSFromOpenAPI({\n  openapiFilePath,\n  outputDir,\n  dryRun = false,\n  prettier = true,\n  eslint = true,\n  zodSchemaJsDocs = true\n}: GenerateTSFromOpenAPIOptions): Promise<string> {\n  const parser = new SwaggerParser()\n  const spec = (await parser.bundle(openapiFilePath)) as OpenAPIV3.Document\n  // | OpenAPIV3_1.Document\n\n  if (\n    // TODO: make this less brittle\n    spec.openapi !== '3.0.0' &&\n    spec.openapi !== '3.1.0' &&\n    spec.openapi !== '3.1.1' &&\n    spec.openapi.split('.')[0] !== '3'\n  ) {\n    throw new Error(`Unexpected OpenAPI version \"${spec.openapi}\"`)\n  }\n\n  const openapiSpecName = path\n    .basename(openapiFilePath)\n    .replace(/\\.json$/, '')\n    .replace(/\\.yaml$/, '')\n  assert(\n    openapiSpecName.toLowerCase() === openapiSpecName,\n    `OpenAPI spec name \"${openapiSpecName}\" must be in kebab case`\n  )\n  const name = pascalCase(openapiSpecName)\n  const nameLowerCase = name.toLowerCase()\n  const nameSnakeCase = decamelize(name)\n  const nameKebabCase = decamelize(name, { separator: '-' })\n  const nameUpperCase = nameSnakeCase.toUpperCase()\n  const clientName = `${name}Client`\n  const namespaceName = nameLowerCase\n\n  const destFileClient = path.join(outputDir, `${nameKebabCase}-client.ts`)\n  const destFileTypes = path.join(outputDir, `${nameKebabCase}.ts`)\n  const apiBaseUrl = spec.servers?.[0]?.url\n\n  const securitySchemes = spec.components?.securitySchemes\n  const resolvedSecuritySchemes: Record<\n    string,\n    OpenAPIV3.SecuritySchemeObject\n  > = {}\n  const apiKeyHeaderNames: string[] = []\n\n  if (securitySchemes) {\n    for (const [securitySchemaName, maybeSecuritySchema] of Object.entries(\n      securitySchemes\n    )) {\n      const securitySchema = dereferenceFull(maybeSecuritySchema, parser.$refs)\n      if (!securitySchema) continue\n\n      resolvedSecuritySchemes[securitySchemaName] = securitySchema\n\n      switch (securitySchema.type) {\n        case 'apiKey':\n          apiKeyHeaderNames.push(securitySchemaName)\n          break\n\n        case 'http':\n          if (securitySchema.scheme === 'bearer') {\n            apiKeyHeaderNames.push(securitySchemaName)\n          }\n          break\n\n        case 'oauth2':\n          apiKeyHeaderNames.push(securitySchemaName)\n          break\n\n        default:\n          console.log(\n            'unsupported security schema',\n            securitySchemaName,\n            securitySchema\n          )\n      }\n    }\n  }\n\n  const hasGlobalApiKeyInHeader = apiKeyHeaderNames.length === 1\n  const componentsToProcess = new Set<string>()\n\n  const requestBodyJSONSchemaPaths = [\n    'requestBody',\n    'content',\n    jsonContentType,\n    'schema'\n  ]\n\n  const requestBodyFormDataJSONSchemaPaths = [\n    'requestBody',\n    'content',\n    multipartFormData,\n    'schema'\n  ]\n\n  const operationResponsePaths = [\n    ['responses', '200', 'content', jsonContentType, 'schema'],\n    ['responses', '201', 'content', jsonContentType, 'schema']\n    // ['responses', 'default', 'content', jsonContentType, 'schema']\n  ]\n\n  const operationRequestPaths = [\n    requestBodyJSONSchemaPaths,\n    requestBodyFormDataJSONSchemaPaths\n  ]\n\n  const operationNames = new Set<string>()\n  const operationSchemas: Record<string, string> = {}\n  const componentSchemas: Record<string, string> = {}\n  const aiClientMethods: string[] = []\n\n  for (const path in spec.paths) {\n    const pathItem = spec.paths[path]\n    assert(pathItem)\n    // console.log(JSON.stringify(pathItem, null, 2))\n\n    for (const method of httpMethods) {\n      const operation = pathItem[method]\n      if (!operation) {\n        continue\n      }\n\n      if (method === 'trace' || method === 'options') {\n        continue\n      }\n\n      const operationId =\n        operation.operationId || `${method}${path.replaceAll(/\\W+/g, '_')}`\n      assert(\n        operationId,\n        `Invalid operation id ${operationId} for path \"${method} ${path}\"`\n      )\n\n      const operationName = camelCase(operationId.replaceAll('/', '-'))\n      assert(\n        !operationNames.has(operationName),\n        `Duplicate operation name \"${operationName}\"`\n      )\n      operationNames.add(operationName)\n      const operationNameSnakeCaseTemp = decamelize(operationName)\n      const operationNameSnakeCase = operationNameSnakeCaseTemp.startsWith(\n        `${nameSnakeCase}_`\n      )\n        ? operationNameSnakeCaseTemp\n        : `${nameSnakeCase}_${operationNameSnakeCaseTemp}`\n\n      // if (path !== '/comments' || method !== 'post') continue\n      // if (path !== '/crawl/status/{jobId}') continue\n      // if (path !== '/pets' || method !== 'post') continue\n      // console.log(method, path, operationName)\n\n      const operationParamsJSONSchema = {\n        type: 'object',\n        properties: {} as Record<string, any>,\n        required: [] as string[],\n        $refs: [] as string[],\n        oneOf: undefined as IJsonSchema[] | undefined,\n        anyOf: undefined as IJsonSchema[] | undefined\n        // TODO\n        // allOf: undefined as IJsonSchema[] | undefined\n      }\n\n      const operationResponseJSONSchemas: Record<string, IJsonSchema> = {}\n\n      const operationParamsSources: Record<string, Set<string>> = {}\n      let operationParamsUnionSource: string | undefined\n\n      // eslint-disable-next-line unicorn/consistent-function-scoping\n      function addJSONSchemaParams(schema: IJsonSchema, source: string) {\n        dereferenceFull(schema, parser.$refs, componentsToProcess)\n\n        if (schema.$ref) {\n          operationParamsJSONSchema.$refs.push(schema.$ref)\n\n          const derefed = dereference(schema, parser.$refs, componentsToProcess)\n          if (derefed?.properties) {\n            for (const key of Object.keys(derefed.properties)) {\n              // assert(\n              //   !operationParamsSources[key],\n              //   `Duplicate params key ${key} for operation ${operationName} from ${operationParamsSources[key]} and ${source}`\n              // )\n              operationParamsSources[key] = new Set([\n                ...(operationParamsSources[key] || []),\n                source\n              ])\n            }\n          } else if (derefed?.anyOf || derefed?.oneOf) {\n            const componentName = getComponentDisplayName(schema.$ref)\n            operationParamsSources[componentName] = new Set([\n              ...(operationParamsSources[componentName] || []),\n              source\n            ])\n\n            // TODO: handle this case\n            assert(\n              !operationParamsUnionSource,\n              `Duplicate union source ${source} for operation ${operationName}`\n            )\n            operationParamsUnionSource = source\n          }\n        } else {\n          if (schema.properties) {\n            operationParamsJSONSchema.properties = {\n              ...operationParamsJSONSchema.properties,\n              ...schema.properties\n            }\n\n            for (const key of Object.keys(schema.properties)) {\n              // assert(\n              //   !operationParamsSources[key],\n              //   `Duplicate params key \"${key}\" for operation \"${operationName}\" from \"${operationParamsSources[key]}\" and \"${source}\"`\n              // )\n              operationParamsSources[key] = new Set([\n                ...(operationParamsSources[key] || []),\n                source\n              ])\n            }\n          }\n\n          if (schema.required) {\n            operationParamsJSONSchema.required = [\n              ...operationParamsJSONSchema.required,\n              ...schema.required\n            ]\n          }\n\n          if (schema.anyOf || schema.oneOf) {\n            operationParamsJSONSchema.anyOf = schema.anyOf\n            operationParamsJSONSchema.oneOf = schema.oneOf\n            operationParamsSources[schema.title || '__union__'] = new Set([\n              ...(operationParamsSources[schema.title || '__union__'] || []),\n              source\n            ])\n\n            // TODO: handle this case\n            assert(\n              !operationParamsUnionSource,\n              `Duplicate union source ${source} for operation ${operationName}`\n            )\n            operationParamsUnionSource = source\n          }\n        }\n      }\n\n      // eslint-disable-next-line unicorn/consistent-function-scoping\n      function addJSONSchemaResponse(schema: IJsonSchema, status: string) {\n        dereferenceFull(schema, parser.$refs, componentsToProcess)\n        operationResponseJSONSchemas[status] = schema\n      }\n\n      for (const schemaPath of operationRequestPaths) {\n        const res = getAndResolve(\n          operation,\n          schemaPath,\n          parser.$refs,\n          componentsToProcess\n        )\n\n        if (res) {\n          addJSONSchemaParams(\n            res,\n            schemaPath[2] === jsonContentType ? 'body' : 'formData'\n          )\n          break\n        }\n      }\n\n      for (const schemaPath of operationResponsePaths) {\n        const res = getAndResolve(\n          operation,\n          schemaPath,\n          parser.$refs,\n          componentsToProcess\n        )\n\n        if (res) {\n          const status = schemaPath[1]!\n          assert(\n            status,\n            `Invalid status ${status} for operation ${operationName}`\n          )\n\n          addJSONSchemaResponse(res, status)\n          break\n        }\n      }\n\n      if (operation.parameters) {\n        const parameters = operation.parameters.map((param) =>\n          dereference(param, parser.$refs, componentsToProcess)\n        )\n        const params = convertParametersToJSONSchema(parameters)\n\n        if (params.body) {\n          addJSONSchemaParams(params.body, 'body')\n        }\n\n        if (params.formData) {\n          addJSONSchemaParams(params.formData, 'formData')\n        }\n\n        if (params.headers) {\n          addJSONSchemaParams(params.headers, 'headers')\n        }\n\n        if (params.path) {\n          addJSONSchemaParams(params.path, 'path')\n        }\n\n        if (params.query) {\n          addJSONSchemaParams(params.query, 'query')\n        }\n      }\n\n      const operationParamsName = getOperationParamsName(\n        operationName,\n        componentSchemas\n      )\n      const operationResponseName = getOperationResponseName(operationName)\n      let derefedParams: any = dereference(\n        operationParamsJSONSchema,\n        parser.$refs\n      )\n      for (const ref of derefedParams.$refs) {\n        const temp: any = dereference({ $ref: ref }, parser.$refs)\n        if (temp) {\n          derefedParams = naiveMergeJSONSchemas(derefedParams, temp)\n        }\n      }\n      // console.log(JSON.stringify(derefedParams, null, 2))\n      const hasUnionParams = !!(derefedParams.anyOf || derefedParams.oneOf)\n      const hasParams =\n        Object.keys(derefedParams.properties ?? {}).length > 0 || hasUnionParams\n\n      if (hasUnionParams !== !!operationParamsUnionSource) {\n        console.log(\n          JSON.stringify(\n            { derefedParams, hasUnionParams, operationParamsUnionSource },\n            null,\n            2\n          )\n        )\n      }\n\n      assert(\n        hasUnionParams === !!operationParamsUnionSource,\n        `Unexpected union params for operation ${operationName}`\n      )\n\n      // TODO: handle empty params case\n\n      {\n        // Merge all operations params into one schema declaration\n        // TODO: Don't generate this if it's only refs. We're currently handling\n        // this in a hacky way by removing the `z.object({}).merge(...)` down\n        // below.\n        let operationsParamsSchema = jsonSchemaToZod(\n          operationParamsJSONSchema,\n          {\n            name: `${operationParamsName}Schema`,\n            type: operationParamsName,\n            withJsdocs: zodSchemaJsDocs\n          }\n        )\n\n        if (operationParamsJSONSchema.$refs.length) {\n          const refSchemas = operationParamsJSONSchema.$refs.map(\n            (ref) => `${getComponentDisplayName(ref)!}Schema`\n          )\n\n          operationsParamsSchema = operationsParamsSchema.replace(\n            // eslint-disable-next-line security/detect-non-literal-regexp\n            new RegExp(`(${operationParamsName}Schema = .*)$`, 'm'),\n            // eslint-disable-next-line unicorn/no-array-reduce\n            refSchemas.reduce(\n              (acc, refSchema) => `${acc}.merge(${refSchema})`,\n              '$1'\n            )\n          )\n        }\n\n        assert(\n          !componentSchemas[operationParamsName],\n          `Operation params name \"${operationParamsName}\" conflicts with component name`\n        )\n        operationSchemas[operationParamsName] = operationsParamsSchema\n      }\n\n      const operationResponseJSONSchema = operationResponseJSONSchemas['200']\n      if (operationResponseJSONSchema) {\n        let isDuplicateDefinition = false\n\n        if (operationResponseJSONSchema.$ref) {\n          const componentName = getComponentDisplayName(\n            operationResponseJSONSchema.$ref\n          )\n          if (componentName === operationResponseName) {\n            isDuplicateDefinition = true\n          }\n        }\n\n        if (!isDuplicateDefinition) {\n          const operationResponseSchema = jsonSchemaToZod(\n            operationResponseJSONSchema,\n            {\n              name: `${operationResponseName}Schema`,\n              type: operationResponseName,\n              withJsdocs: zodSchemaJsDocs\n            }\n          )\n\n          assert(\n            !componentSchemas[operationResponseName],\n            `Operation response name \"${operationResponseName}\" conflicts with component name`\n          )\n          operationSchemas[operationResponseName] = operationResponseSchema\n        }\n      } else {\n        assert(\n          !componentSchemas[operationResponseName],\n          `Operation response name \"${operationResponseName}\" conflicts with component name`\n        )\n        operationSchemas[operationResponseName] =\n          `export type ${operationResponseName} = undefined\\n`\n      }\n\n      // console.log(\n      //   JSON.stringify(\n      //     {\n      //       operationName,\n      //       operationParamsSources,\n      //       operationParamsJSONSchema\n      //     },\n      //     null,\n      //     2\n      //   )\n      // )\n\n      const queryParams = Object.keys(operationParamsSources).filter((key) =>\n        operationParamsSources[key]?.has('query')\n      )\n      const hasQueryParams = queryParams.length > 0\n\n      const bodyParams = Object.keys(operationParamsSources).filter((key) =>\n        operationParamsSources[key]?.has('body')\n      )\n      const hasBodyParams = bodyParams.length > 0\n\n      const formDataParams = Object.keys(operationParamsSources).filter((key) =>\n        operationParamsSources[key]?.has('formData')\n      )\n      const hasFormDataParams = formDataParams.length > 0\n\n      const pathParams = Object.keys(operationParamsSources).filter((key) =>\n        operationParamsSources[key]?.has('path')\n      )\n      const hasPathParams = pathParams.length > 0\n\n      const headersParams = Object.keys(operationParamsSources).filter((key) =>\n        operationParamsSources[key]?.has('headers')\n      )\n      const hasHeadersParams = headersParams.length > 0\n\n      const onlyHasOneParamsSource =\n        new Set(Object.values(operationParamsSources)).size === 1\n      const onlyHasPathParams = hasPathParams && onlyHasOneParamsSource\n\n      const pathTemplate = hasPathParams\n        ? '`' + path.replaceAll(/{([^}]+)}/g, '${params[\"$1\"]}') + '`'\n        : `'${path}'`\n\n      const description = getDescription(\n        operation.description || operation.summary\n      )\n\n      const { tags } = operation\n      const hasTags = !!tags?.length\n\n      const aiClientMethod = `\n        ${description ? `/**\\n * ${description}\\n */` : ''}\n        @aiFunction({\n          name: '${operationNameSnakeCase}',\n          ${description ? `description: \\`${description.replaceAll('`', '\\\\`')}\\`,` : ''}${hasUnionParams ? '\\n// TODO: Improve handling of union params' : ''}\n          inputSchema: ${namespaceName}.${operationParamsName}Schema${hasUnionParams ? ' as any' : ''}, ${hasTags ? `tags: [ '${tags.join(\"', '\")}' ]` : ''}\n        })\n        async ${operationName}(${!hasParams ? '_' : ''}params: ${namespaceName}.${operationParamsName}): Promise<${namespaceName}.${operationResponseName}> {\n          return this.ky.${method}(${pathTemplate}${\n            !hasParams || onlyHasPathParams\n              ? ''\n              : `, {\n            ${hasQueryParams ? (onlyHasOneParamsSource || hasUnionParams ? `searchParams: sanitizeSearchParams(params),` : `searchParams: sanitizeSearchParams(pick(params, '${queryParams.join(\"', '\")}')),`) : ''}\n            ${hasBodyParams ? (onlyHasOneParamsSource || hasUnionParams ? `json: params,` : `json: pick(params, '${bodyParams.join(\"', '\")}'),`) : ''}\n            ${hasFormDataParams ? (onlyHasOneParamsSource || hasUnionParams ? `form: params,` : `form: pick(params, '${formDataParams.join(\"', '\")}'),`) : ''}\n            ${hasHeadersParams ? (onlyHasOneParamsSource || hasUnionParams ? `headers: params,` : `headers: pick(params, '${headersParams.join(\"', '\")}'),`) : ''}\n          }`\n          }).json<${namespaceName}.${operationResponseName}>()\n        }\n      `\n\n      aiClientMethods.push(aiClientMethod)\n    }\n  }\n\n  const processedComponents = new Set<string>()\n  const componentToRefs: Record<\n    string,\n    { dereferenced: any; refs: Set<string> }\n  > = {}\n\n  for (const ref of componentsToProcess) {\n    const component = { $ref: ref }\n\n    const resolved = new Set<string>()\n    const dereferenced = dereference(component, parser.$refs)\n    dereferenceFull(component, parser.$refs, resolved)\n    assert(dereferenced)\n\n    for (const ref of resolved) {\n      if (ref.startsWith('#/components/examples')) continue\n\n      assert(\n        componentsToProcess.has(ref),\n        `Ref ${ref} not found in componentsToProcess`\n      )\n    }\n\n    componentToRefs[ref] = { dereferenced, refs: resolved }\n  }\n\n  const sortedComponents = Object.keys(componentToRefs).sort(\n    (a, b) => componentToRefs[a]!.refs.size - componentToRefs[b]!.refs.size\n  )\n\n  for (const ref of sortedComponents) {\n    const type = getComponentDisplayName(ref)\n    assert(type, `Invalid ref name ${ref}`)\n\n    const name = `${type}Schema`\n\n    const { dereferenced } = componentToRefs[ref]!\n    if (processedComponents.has(ref)) {\n      continue\n    }\n\n    processedComponents.add(ref)\n\n    const schema = jsonSchemaToZod(dereferenced, {\n      name,\n      type,\n      withJsdocs: zodSchemaJsDocs\n    })\n    componentSchemas[type] = schema\n  }\n\n  // console.log(\n  //   '\\ncomponents',\n  //   JSON.stringify(\n  //     sortedComponents.map((ref) => getComponentName(ref)),\n  //     null,\n  //     2\n  //   )\n  // )\n\n  // console.log(\n  //   '\\nmodels',\n  //   Object.fromEntries(\n  //     await Promise.all(\n  //       Object.entries(schemaInput).map(async ([key, value]) => {\n  //         return [key, await prettify(value)]\n  //       })\n  //     )\n  //   )\n  // )\n\n  const aiClientMethodsString = aiClientMethods.join('\\n\\n')\n\n  const prettifyImpl = async (code: string) => {\n    if (prettier) {\n      code = await prettify(code)\n    }\n\n    return code\n      .replaceAll(/z\\s*\\.object\\({}\\)\\s*\\.merge\\(([^)]*)\\)/gm, '$1')\n      .replaceAll(/\\/\\*\\*(\\S.*\\S)\\*\\//g, '/** $1 */')\n  }\n\n  const typesHeader = `\n/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport { z } from 'zod'`.trim()\n\n  const clientHeader = `\n/**\n * This file was auto-generated from an OpenAPI spec.\n */\n\nimport {\n  AIFunctionsProvider,\n  ${aiClientMethods.length > 0 ? 'aiFunction,' : ''}\n  ${hasGlobalApiKeyInHeader ? 'assert,' : ''}\n  ${hasGlobalApiKeyInHeader ? 'getEnv,' : ''}\n  ${aiClientMethodsString.includes('pick(') ? 'pick,' : ''}\n  ${aiClientMethodsString.includes('sanitizeSearchParams(') ? 'sanitizeSearchParams,' : ''}\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { ${namespaceName} } from './${nameKebabCase}'`.trim()\n\n  const commentLine = `// ${'-'.repeat(77)}`\n  const typesOutput = await prettifyImpl(\n    [\n      typesHeader,\n      `export namespace ${namespaceName} {`,\n      apiBaseUrl ? `export const apiBaseUrl = '${apiBaseUrl}'` : undefined,\n      Object.values(componentSchemas).length\n        ? `${commentLine}\\n// Component schemas\\n${commentLine}`\n        : undefined,\n      ...Object.values(componentSchemas),\n      Object.values(operationSchemas).length\n        ? `${commentLine}\\n// Operation schemas\\n${commentLine}`\n        : undefined,\n      ...Object.values(operationSchemas),\n      '}'\n    ]\n      .filter(Boolean)\n      .join('\\n\\n')\n  )\n\n  const description = getDescription(spec.info?.description)\n\n  const clientOutput = await prettifyImpl(\n    [\n      clientHeader,\n      `\n/**\n * Agentic ${name} client.${description ? `\\n *\\n * ${description}` : ''}\n */\nexport class ${clientName} extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  ${hasGlobalApiKeyInHeader ? 'protected readonly apiKey: string' : ''}\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    ${hasGlobalApiKeyInHeader ? `apiKey = getEnv('${nameUpperCase}_API_KEY'),` : ''}\n    apiBaseUrl${apiBaseUrl ? ` = ${namespaceName}.apiBaseUrl` : ''},\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    ${\n      hasGlobalApiKeyInHeader\n        ? `assert(\n      apiKey,\n      '${clientName} missing required \"apiKey\" (defaults to \"${nameUpperCase}_API_KEY\")'\n    )`\n        : ''\n    }\n    super()\n\n    ${hasGlobalApiKeyInHeader ? `this.apiKey = apiKey` : ''}\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      ${\n        hasGlobalApiKeyInHeader\n          ? `headers: {\n        ${apiKeyHeaderNames.map((name) => `'${(resolvedSecuritySchemes[name] as any).name || 'Authorization'}': ${(resolvedSecuritySchemes[name] as any).schema?.toLowerCase() === 'bearer' || resolvedSecuritySchemes[name]?.type?.toLowerCase() === 'oauth2' ? '`Bearer ${apiKey}`' : 'apiKey'}`).join(',\\n')}\n      },`\n          : ''\n      }\n    })\n  }\n`,\n      aiClientMethodsString,\n      '}'\n    ].join('\\n\\n')\n  )\n\n  const output = [typesOutput, clientOutput].join('\\n\\n')\n  if (dryRun) {\n    return output\n  }\n\n  await fs.mkdir(outputDir, { recursive: true })\n  await fs.writeFile(destFileTypes, typesOutput)\n  await fs.writeFile(destFileClient, clientOutput)\n\n  if (eslint) {\n    await execa('npx', [\n      'eslint',\n      '--fix',\n      '--no-ignore',\n      destFileClient,\n      destFileTypes\n    ])\n  }\n\n  return output\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/src/index.ts",
    "content": "export * from './generate-ts-from-openapi'\nexport type * from './types'\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/src/openapi-parameters-to-json-schema.ts",
    "content": "/**\n * This file is forked from: https://github.com/kogosoftwarellc/open-api/tree/main/packages/openapi-jsonschema-parameters\n *\n * Several fixes have been applied.\n *\n * The original code is licensed under the MIT license.\n */\n\nimport { type IJsonSchema, type OpenAPI } from 'openapi-types'\n\nexport interface OpenAPIParametersAsJSONSchema {\n  body?: IJsonSchema\n  formData?: IJsonSchema\n  headers?: IJsonSchema\n  path?: IJsonSchema\n  query?: IJsonSchema\n  cookie?: IJsonSchema\n}\n\nconst VALIDATION_KEYWORDS = new Set([\n  'additionalItems',\n  'default',\n  'example',\n  'description',\n  'enum',\n  'examples',\n  'exclusiveMaximum',\n  'exclusiveMinimum',\n  'format',\n  'items',\n  'maxItems',\n  'maxLength',\n  'maximum',\n  'minItems',\n  'minLength',\n  'minimum',\n  'multipleOf',\n  'pattern',\n  'title',\n  'type',\n  'uniqueItems'\n])\n\nconst SUBSCHEMA_KEYWORDS = [\n  'additionalItems',\n  'items',\n  'contains',\n  'additionalProperties',\n  'propertyNames',\n  'not'\n]\n\nconst SUBSCHEMA_ARRAY_KEYWORDS = ['items', 'allOf', 'anyOf', 'oneOf']\n\nconst SUBSCHEMA_OBJECT_KEYWORDS = [\n  'definitions',\n  'properties',\n  'patternProperties',\n  'dependencies'\n]\n\nexport function convertParametersToJSONSchema(\n  parameters: OpenAPI.Parameters\n): OpenAPIParametersAsJSONSchema {\n  const parametersSchema: OpenAPIParametersAsJSONSchema = {}\n  const bodySchema = getBodySchema(parameters)\n  const formDataSchema = getSchema(parameters, 'formData')\n  const headerSchema = getSchema(parameters, 'header')\n  const pathSchema = getSchema(parameters, 'path')\n  const querySchema = getSchema(parameters, 'query')\n  const cookieSchema = getSchema(parameters, 'cookie')\n\n  if (bodySchema) {\n    parametersSchema.body = bodySchema\n  }\n\n  if (formDataSchema) {\n    parametersSchema.formData = formDataSchema\n  }\n\n  if (headerSchema) {\n    parametersSchema.headers = headerSchema\n  }\n\n  if (pathSchema) {\n    parametersSchema.path = pathSchema\n  }\n\n  if (querySchema) {\n    parametersSchema.query = querySchema\n  }\n\n  if (cookieSchema) {\n    parametersSchema.cookie = cookieSchema\n  }\n\n  return parametersSchema\n}\n\nfunction copyValidationKeywords(src: any) {\n  const dst: any = {}\n  for (let i = 0, keys = Object.keys(src), len = keys.length; i < len; i++) {\n    const keyword = keys[i]\n    if (!keyword) continue\n\n    if (VALIDATION_KEYWORDS.has(keyword) || keyword.slice(0, 2) === 'x-') {\n      dst[keyword] = src[keyword]\n    }\n  }\n  return dst\n}\n\nfunction handleNullable(schema: IJsonSchema) {\n  return { anyOf: [schema, { type: 'null' }] }\n}\n\nfunction handleNullableSchema(schema: any) {\n  if (typeof schema !== 'object' || schema === null) {\n    return schema\n  }\n\n  const newSchema = { ...schema }\n\n  for (const keyword of SUBSCHEMA_KEYWORDS) {\n    if (\n      typeof schema[keyword] === 'object' &&\n      schema[keyword] !== null &&\n      !Array.isArray(schema[keyword])\n    ) {\n      newSchema[keyword] = handleNullableSchema(schema[keyword])\n    }\n  }\n\n  for (const keyword of SUBSCHEMA_ARRAY_KEYWORDS) {\n    if (Array.isArray(schema[keyword])) {\n      newSchema[keyword] = schema[keyword].map(handleNullableSchema)\n    }\n  }\n\n  for (const keyword of SUBSCHEMA_OBJECT_KEYWORDS) {\n    if (typeof schema[keyword] === 'object' && schema[keyword] !== null) {\n      newSchema[keyword] = { ...schema[keyword] }\n      for (const prop of Object.keys(schema[keyword])) {\n        newSchema[keyword][prop] = handleNullableSchema(schema[keyword][prop])\n      }\n    }\n  }\n\n  delete newSchema.$ref\n\n  if (schema.nullable) {\n    delete newSchema.nullable\n    return handleNullable(newSchema)\n  }\n  return newSchema\n}\n\nfunction getBodySchema(parameters: any[]) {\n  let bodySchema = parameters.find((param) => {\n    return param.in === 'body' && param.schema\n  })\n\n  if (bodySchema) {\n    bodySchema = bodySchema.schema\n  }\n\n  return bodySchema\n}\n\nfunction getSchema(parameters: any[], type: string) {\n  const params = parameters.filter(byIn(type))\n  let schema: any\n\n  if (params.length) {\n    schema = { type: 'object', properties: {} }\n\n    for (const param of params) {\n      let paramSchema = copyValidationKeywords(param)\n\n      if ('schema' in param) {\n        paramSchema = {\n          ...paramSchema,\n          ...handleNullableSchema(param.schema)\n        }\n        if ('examples' in param) {\n          paramSchema.examples = getExamples(param.examples)\n        }\n        schema.properties[param.name] = paramSchema\n      } else {\n        if ('examples' in paramSchema) {\n          paramSchema.examples = getExamples(paramSchema.examples)\n        }\n        schema.properties[param.name] = param.nullable\n          ? handleNullable(paramSchema)\n          : paramSchema\n      }\n    }\n\n    schema.required = getRequiredParams(params)\n  }\n\n  return schema\n}\n\nfunction getRequiredParams(parameters: any[]) {\n  return parameters.filter(byRequired).map(toName)\n}\n\nfunction getExamples(exampleSchema: any) {\n  return Object.keys(exampleSchema).map((k) => exampleSchema[k].value)\n}\n\nfunction byIn(str: string) {\n  return (param: any) => param.in === str && param.type !== 'file'\n}\n\nfunction byRequired(param: any) {\n  return !!param.required\n}\n\nfunction toName(param: any) {\n  return param.name\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/src/types.ts",
    "content": "export type GenerateTSFromOpenAPIOptions = {\n  openapiFilePath: string\n  outputDir: string\n  dryRun?: boolean\n  prettier?: boolean\n  eslint?: boolean\n  zodSchemaJsDocs?: boolean\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/src/utils.ts",
    "content": "import type SwaggerParser from '@apidevtools/swagger-parser'\nimport type { IJsonSchema, OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\nimport { assert } from '@agentic/core'\nimport camelCaseImpl from 'camelcase'\nimport {\n  type JsonSchema,\n  jsonSchemaToZod as jsonSchemaToZodImpl,\n  type ParserOverride\n} from 'json-schema-to-zod'\nimport { format as prettierFormat } from 'prettier'\n\nexport function prettify(source: string): Promise<string> {\n  return prettierFormat(source, {\n    parser: 'typescript',\n    semi: false,\n    singleQuote: true,\n    jsxSingleQuote: true,\n    bracketSpacing: true,\n    bracketSameLine: false,\n    arrowParens: 'always',\n    trailingComma: 'none'\n  })\n}\n\nexport function pascalCase(identifier: string): string {\n  return camelCaseImpl(identifier, { pascalCase: true })\n}\n\nexport function camelCase(identifier: string): string {\n  return camelCaseImpl(identifier)\n}\n\nexport function getAndResolve<T extends object = object>(\n  obj: any,\n  keys: string[],\n  refs: SwaggerParser.$Refs,\n  resolved?: Set<string>,\n  depth = 0,\n  maxDepth = 0\n): T | null {\n  if (obj === undefined) return null\n  if (typeof obj !== 'object') return null\n\n  if (!keys.length) {\n    return dereference(obj, refs, resolved, depth, maxDepth) as T\n  }\n\n  if (obj.$ref) {\n    const derefed = refs.get(obj.$ref)\n    resolved?.add(obj.$ref)\n    if (!derefed) {\n      return null\n    }\n    obj = derefed\n  }\n\n  const key = keys[0]!\n  const value = obj[key]\n  keys = keys.slice(1)\n  if (value === undefined) {\n    return null\n  }\n\n  return getAndResolve<T>(value, keys, refs, resolved, depth, maxDepth)\n}\n\nexport function dereferenceFull<T extends object = object>(\n  obj: T,\n  refs: SwaggerParser.$Refs,\n  resolved?: Set<string>\n): Exclude<T, OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject> {\n  return dereference(obj, refs, resolved, 0, Number.POSITIVE_INFINITY) as any\n}\n\nexport function dereference<T extends object = object>(\n  obj: T,\n  refs: SwaggerParser.$Refs,\n  resolved?: Set<string>,\n  depth = 0,\n  maxDepth = 1,\n  visited = new Set<string>()\n): T {\n  if (!obj) return obj\n\n  if (depth >= maxDepth) {\n    return obj\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map((item) =>\n      dereference(item, refs, resolved, depth + 1, maxDepth, visited)\n    ) as T\n  } else if (typeof obj === 'object') {\n    if ('$ref' in obj) {\n      const ref = obj.$ref as string\n      if (visited?.has(ref)) {\n        return obj\n      }\n      visited?.add(ref)\n      const derefed = refs.get(ref)\n      assert(derefed, `Invalid schema: $ref not found for ${ref}`)\n      resolved?.add(ref)\n      derefed.title ??= ref.split('/').pop()!\n      return dereference(derefed, refs, resolved, depth + 1, maxDepth, visited)\n    } else {\n      return Object.fromEntries(\n        Object.entries(obj).map(([key, value]) => [\n          key,\n          dereference(value, refs, resolved, depth + 1, maxDepth, visited)\n        ])\n      ) as T\n    }\n  } else {\n    return obj\n  }\n}\n\nfunction createParserOverride({\n  type,\n  withJsdocs\n}: {\n  type?: string\n  withJsdocs: boolean\n}): ParserOverride {\n  const jsonSchemaToZodParserOverride: ParserOverride = (schema, _refs) => {\n    if ('nullable' in schema && schema.nullable) {\n      delete schema.nullable\n    }\n\n    if ('$ref' in schema) {\n      const ref = schema.$ref as string\n      assert(ref, `Invalid schema: $ref not found for ${schema.$ref}`)\n\n      const name = getComponentDisplayName(ref)\n      if (type === name) {\n        // TODO: Support recursive types.\n        return `\\n// TODO: Support recursive types for \\`${name}Schema\\`.\\nz.any()`\n      }\n\n      return `${name}Schema`\n    } else if (schema.oneOf) {\n      const { oneOf, ...partialSchema } = schema\n\n      // Replace oneOf with anyOf because `json-schema-to-zod` treats oneOf\n      // with a complicated `z.any().superRefine(...)` which we'd like messes\n      // up the resulting types.\n      const newSchema = {\n        ...partialSchema,\n        anyOf: oneOf\n      }\n\n      const res = jsonSchemaToZodImpl(newSchema, {\n        withJsdocs,\n        parserOverride: jsonSchemaToZodParserOverride\n      })\n\n      return res\n    }\n  }\n\n  return jsonSchemaToZodParserOverride\n}\n\nexport function jsonSchemaToZod(\n  schema: JsonSchema,\n  {\n    name,\n    type,\n    withJsdocs = true\n  }: {\n    name?: string\n    type?: string\n    withJsdocs?: boolean\n  } = {}\n): string {\n  return jsonSchemaToZodImpl(schema, {\n    name,\n    module: 'esm',\n    withJsdocs,\n    type: type ?? true,\n    noImport: true,\n    parserOverride: createParserOverride({ type, withJsdocs })\n  })\n}\n\nconst reservedWords = new Set([\n  'Error',\n  'Class',\n  'Object',\n  'interface',\n  'type',\n  'default',\n  'switch',\n  'for',\n  'break',\n  'case',\n  'if',\n  'else',\n  'while',\n  'do',\n  'for',\n  'return',\n  'continue',\n  'function',\n  'console',\n  'window',\n  'global',\n  'import',\n  'export',\n  'namespace',\n  'using',\n  'require',\n  'module',\n  'process',\n  'async',\n  'await',\n  'const',\n  'let',\n  'var',\n  'void',\n  'undefined',\n  'abstract',\n  'extends',\n  'implements',\n  'private',\n  'protected',\n  'public',\n  'Infinity',\n  'Nan',\n  'Math',\n  'Date',\n  'RegExp',\n  'JSON',\n  'Buffer',\n  'Promise',\n  'Symbol',\n  'Map',\n  'Set',\n  'WeakMap',\n  'WeakSet',\n  'Array',\n  'Object',\n  'Boolean',\n  'Number',\n  'String',\n  'Function',\n  'Symbol'\n])\n\nexport function getComponentName(ref: string) {\n  const name = ref.split('/').pop()!\n  assert(name, `Invalid ref name ${ref}`)\n\n  return name\n}\n\nexport function getComponentDisplayName(ref: string) {\n  const name0 = getComponentName(ref)\n  const name1 = pascalCase(name0)\n  assert(name1, `Invalid ref name ${ref}`)\n\n  if (reservedWords.has(name1)) {\n    return `${name1}Type`\n  }\n\n  return name1\n}\n\nexport function getOperationParamsName(\n  operationName: string,\n  schemas?: Record<string, string>\n) {\n  const name = `${pascalCase(operationName)}Params`\n  if (!schemas) return name\n\n  let tempName = name\n  let index = 2\n  while (schemas[tempName]) {\n    tempName = `${name}${index}`\n    ++index\n  }\n\n  return tempName\n}\n\nexport function getOperationResponseName(\n  operationName: string,\n  schemas?: Record<string, string>\n) {\n  const name = `${pascalCase(operationName)}Response`\n  if (!schemas) return name\n\n  let tempName = name\n  let index = 2\n  while (schemas[tempName]) {\n    tempName = `${name}${index}`\n    ++index\n  }\n\n  return tempName\n}\n\nexport function naiveMergeJSONSchemas(...schemas: IJsonSchema[]): IJsonSchema {\n  const result: any = {}\n\n  for (const ischema of schemas) {\n    const schema = ischema as any\n    const arrayKeys: string[] = []\n    const objectKeys: string[] = []\n\n    for (const [key, value] of Object.entries(schema)) {\n      if (Array.isArray(value)) {\n        arrayKeys.push(key)\n      } else if (typeof value === 'object') {\n        objectKeys.push(key)\n      } else {\n        result[key] = value\n      }\n    }\n\n    for (const key of arrayKeys) {\n      result[key] = [...(result[key] ?? []), ...(schema[key] ?? [])]\n    }\n\n    for (const key of objectKeys) {\n      result[key] = { ...result[key], ...schema[key] }\n    }\n  }\n\n  return result as IJsonSchema\n}\n\nexport function getDescription(description?: string): string | undefined {\n  if (!description) return undefined\n\n  if (!/[!.?]$/.test(description)) {\n    description += '.'\n  }\n\n  return description.replaceAll('/*', '\\\\/\\\\*').replaceAll('*/', '\\\\*\\\\/')\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"bin\", \"fixtures/**/*.ts\", \"*.config.ts\"],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\",\n    \"fixtures/generated/github*.ts\",\n    \"fixtures/generated/tic-tac-toe*.ts\",\n    \"fixtures/generated/open-meteo-client.ts\"\n  ]\n}\n"
  },
  {
    "path": "legacy/packages/openapi-to-ts/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup'\n\nexport default defineConfig([\n  {\n    entry: ['src/index.ts'],\n    outDir: 'dist',\n    target: 'node18',\n    platform: 'node',\n    format: ['esm'],\n    splitting: false,\n    sourcemap: true,\n    minify: false,\n    shims: true,\n    dts: true\n  },\n  {\n    entry: ['bin/openapi-to-ts.ts'],\n    outDir: 'dist',\n    target: 'node18',\n    platform: 'node',\n    format: ['esm'],\n    splitting: false,\n    sourcemap: true,\n    minify: false,\n    shims: true,\n    dts: true\n  }\n])\n"
  },
  {
    "path": "legacy/packages/people-data-labs/package.json",
    "content": "{\n  \"name\": \"@agentic/people-data-labs\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for People Data Labs.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/people-data-labs\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/people-data-labs/src/index.ts",
    "content": "export * from './people-data-labs-client'\n"
  },
  {
    "path": "legacy/packages/people-data-labs/src/people-data-labs-client.ts",
    "content": "import { assert, getEnv, sanitizeSearchParams, throttleKy } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\n\n/**\n * TODO: I'm holding off on converting this client to an `AIFunctionsProvider`\n * because it seems to be significantly more expensive than other data sources,\n * and I'm not sure if it's worth the cost.\n */\n\nexport namespace peopledatalabs {\n  export const BASE_URL = 'https://api.peopledatalabs.com/v5/'\n\n  // Allow up to 10 requests per minute.\n  export const throttle10PerMin = pThrottle({\n    limit: 10,\n    interval: 60 * 1000,\n    strict: true\n  })\n\n  // Allow up to 100 requests per minute.\n  export const throttle100PerMin = pThrottle({\n    limit: 100,\n    interval: 60 * 1000,\n    strict: true\n  })\n\n  export const JobTitleLevels = [\n    'cxo',\n    'director',\n    'entry',\n    'manager',\n    'owner',\n    'partner',\n    'senior',\n    'training',\n    'unpaid',\n    'vp'\n  ]\n\n  export const JobTitleRoles = [\n    'customer_service',\n    'design',\n    'education',\n    'engineering',\n    'finance',\n    'health',\n    'human_resources',\n    'legal',\n    'marketing',\n    'media',\n    'operations',\n    'public_relations',\n    'real_estate',\n    'sales',\n    'trades'\n  ]\n\n  // TODO configure this type to make pdl_id or name or profile or ticker or website required.\n  // Only one is required\n  export interface CompanyLookupOptions {\n    pdl_id?: string\n    name?: string\n    profile?: string\n    ticker?: string\n    website?: string\n    location?: string[]\n    locality?: string\n    region?: string\n    country?: string\n    street_address?: string\n    postal_code?: string\n    data_include?: string\n    pretty?: boolean\n  }\n\n  export interface Naics {\n    naics_code: string\n    sector: string\n    sub_sector: string\n    industry_group: string\n    naics_industry: string | null\n    national_industry: string | null\n  }\n\n  export interface Sic {\n    sic_code: string\n    major_group: string\n    industry_group: string\n    industry_sector: string | null\n  }\n\n  export interface Location {\n    name: string\n    locality: string\n    region: string\n    metro: string\n    country: string\n    continent: string\n    street_address: string\n    address_line_2: string | null\n    postal_code: string\n    geo: string\n  }\n\n  export interface EmployeeCountByCountry {\n    [country: string]: number\n  }\n\n  export interface CompanyLookupResponse {\n    status: number\n    name: string\n    display_name: string\n    size: string\n    employee_count: number\n    id: string\n    founded: number\n    industry: string\n    naics: Naics[]\n    sic: Sic[]\n    location: Location\n    linkedin_id: string\n    linkedin_url: string\n    facebook_url: string\n    twitter_url: string\n    profiles: string[]\n    website: string\n    ticker: string\n    gics_sector: string | null\n    mic_exchange: string | null\n    type: string\n    summary: string\n    tags: string[]\n    headline: string\n    alternative_names: string[]\n    alternative_domains: string[]\n    affiliated_profiles: string[]\n    employee_count_by_country: EmployeeCountByCountry\n    likelihood: number\n  }\n\n  export interface CompanySearchOptions {\n    limit?: number\n    query: {\n      website?: string\n      tags?: string\n      industry?: string\n      'location.country'?: string\n      'location.metro'?: string\n      summary?: string\n      size?: string[]\n      affiliated_profiles?: string\n    }\n  }\n\n  export type CompanySearchOptionsQueryKeys =\n    keyof CompanySearchOptions['query']\n\n  export interface CompanySearchResponse {\n    status: number\n    data: {\n      name: string\n      display_name: string\n      size: string\n      employee_count: number\n      id: string\n      founded: number\n      industry: string\n      naics: Naics[]\n      sic: Sic[]\n      location: Location\n      linkedin_id: string\n      linkedin_url: string\n      facebook_url: string\n      twitter_url: string\n      profiles: string[]\n      website: string\n      ticker: string\n      gics_sector: string | null\n      mic_exchange: string | null\n      type: string\n      summary: string\n      tags: string[]\n      headline: string\n      alternative_names: string[]\n      alternative_domains: string[]\n      affiliated_profiles: string[]\n      employee_count_by_country: EmployeeCountByCountry\n    }[]\n    scroll_token: string\n    total: number\n  }\n\n  export interface PersonSearchOptions {\n    limit?: number\n    query: {\n      first_name?: string\n      full_name?: string\n      last_name?: string\n      job_company_website?: string\n      job_title_role?: string\n      /**\n       * The docs says this property should be an array of strings.\n       * But when sending the array a 404 error is returned.\n       * See: https://docs.peopledatalabs.com/docs/fields#job_title_levels\n       */\n      job_title_levels?: string\n      job_company_name?: string\n      job_company_location_country?: string\n    }\n  }\n\n  export type PersonSearchOptionsQueryKeys = keyof PersonSearchOptions['query']\n\n  // Person response\n  export interface SearchPersonApiResponse {\n    id: string\n    full_name: string\n    first_name: string\n    middle_initial: null | string\n    middle_name: null | string\n    last_initial: string\n    last_name: string\n    gender: string\n    birth_year: null | number\n    birth_date: null | string\n    linkedin_url: string\n    linkedin_username: string\n    linkedin_id: string\n    facebook_url: null | string\n    facebook_username: null | string\n    facebook_id: null | string\n    twitter_url: string\n    twitter_username: string\n    github_url: null | string\n    github_username: null | string\n    work_email: string\n    personal_emails: string[]\n    recommended_personal_email: null | string\n    mobile_phone: null | string\n    industry: null | string\n    job_title: string\n    job_title_role: null | string\n    job_title_sub_role: null | string\n    job_title_levels: string[]\n    job_onet_code: string\n    job_onet_major_group: string\n    job_onet_minor_group: string\n    job_onet_broad_occupation: string\n    job_onet_specific_occupation: string\n    job_onet_specific_occupation_detail: string\n    job_company_id: string\n    job_company_name: string\n    job_company_website: string\n    job_company_size: string\n    job_company_founded: number\n    job_company_industry: string\n    job_company_linkedin_url: string\n    job_company_linkedin_id: string\n    job_company_facebook_url: string\n    job_company_twitter_url: string\n    job_company_type: string\n    job_company_ticker: null | string\n    job_company_location_name: string\n    job_company_location_locality: string\n    job_company_location_metro: string\n    job_company_location_region: string\n    job_company_location_geo: string\n    job_company_location_street_address: string\n    job_company_location_address_line_2: string\n    job_company_location_postal_code: string\n    job_company_location_country: string\n    job_company_location_continent: string\n    job_last_updated: string\n    job_start_date: string\n    job_summary: null | string\n    location_name: null | string\n    location_locality: null | string\n    location_metro: null | string\n    location_region: null | string\n    location_country: null | string\n    location_continent: null | string\n    location_street_address: null | string\n    location_address_line_2: null | string\n    location_postal_code: null | string\n    location_geo: null | string\n    location_last_updated: null | string\n    linkedin_connections: number\n    facebook_friends: null | string\n    inferred_salary: string\n    inferred_years_experience: number\n    summary: null | string\n    phone_numbers: string[]\n    phones: string[]\n    emails: Email[]\n    interests: string[]\n    skills: string[]\n    location_names: string[]\n    regions: string[]\n    countries: string[]\n    street_addresses: string[]\n    experience: Experience[]\n    education: Education[]\n    profiles: Profile[]\n    name_aliases: string[]\n    possible_emails: PossibleEmail[]\n    possible_profiles: PossibleProfile[]\n    possible_phones: PossiblePhone[]\n    possible_street_addresses: string[]\n    possible_location_names: string[]\n    possible_birth_dates: string[]\n    job_history: JobHistory[]\n    certifications: string[]\n    languages: string[]\n    first_seen: string\n    num_sources: number\n    num_records: number\n    version_status: VersionStatus\n  }\n\n  export interface Email {\n    address: string\n    type: null | string\n    first_seen: string\n    last_seen: string\n    num_sources: number\n  }\n\n  export interface Experience {\n    company: Company\n    start_date: null | string\n    end_date: null | string\n    title: Title\n    location_names: string[]\n    is_primary: boolean\n    summary: null | string\n    num_sources: number\n    first_seen: string\n    last_seen: string\n  }\n\n  export interface Company {\n    name: string\n    size: string\n    id: string\n    founded: number\n    industry: string\n    location: Location\n    linkedin_url: string\n    linkedin_id: string\n    facebook_url: null | string\n    twitter_url: string\n    website: string\n    ticker: null | string\n    type: string\n    raw: string[]\n    fuzzy_match: boolean\n  }\n\n  export interface Title {\n    name: string\n    raw: string[]\n    role: null | string\n    sub_role: null | string\n    levels: string[]\n  }\n\n  export interface Education {\n    school: School\n    degrees: string[]\n    start_date: string\n    end_date: string\n    majors: string[]\n    minors: string[]\n    gpa: null | string\n    raw: string[]\n    summary: null | string\n  }\n\n  export interface School {\n    name: string\n    type: string\n    id: string\n    location: Location\n    linkedin_url: string\n    facebook_url: string\n    twitter_url: string\n    linkedin_id: string\n    website: string\n    domain: string\n    raw: string[]\n  }\n\n  export interface Profile {\n    network: string\n    id: null | string\n    url: string\n    username: string\n    num_sources: number\n    first_seen: string\n    last_seen: string\n  }\n\n  export interface PossibleEmail {\n    address: string\n    type: null | string\n    first_seen: string\n    last_seen: string\n    num_sources: number\n  }\n\n  export interface PossibleProfile {\n    network: string\n    id: null | string\n    url: string\n    username: null | string\n    num_sources: number\n    first_seen: string\n    last_seen: string\n  }\n\n  export interface PossiblePhone {\n    number: string\n    first_seen: string\n    last_seen: string\n    num_sources: number\n  }\n\n  export interface VersionStatus {\n    status: string\n    contains: string[]\n    previous_version: string\n    current_version: string\n  }\n\n  export interface JobHistory {\n    company_id: string\n    company_name: string\n    title: string\n    first_seen: string\n    last_seen: string\n    num_sources: number\n  }\n}\n\n/**\n * People & Company Data\n *\n * @see https://www.peopledatalabs.com\n */\nexport class PeopleDataLabsClient {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('PEOPLE_DATA_LABS_API_KEY'),\n    apiBaseUrl = peopledatalabs.BASE_URL,\n    timeoutMs = 30_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'PeopleDataLabsClient missing required \"apiKey\" (defaults to \"PEOPLE_DATA_LABS_API_KEY\")'\n    )\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle\n      ? throttleKy(ky, peopledatalabs.throttle10PerMin)\n      : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        'x-api-key': `${this.apiKey}`\n      }\n    })\n  }\n\n  async companyLookup(options: peopledatalabs.CompanySearchOptions) {\n    const terms = options.query\n    const termsQuery = []\n\n    for (const term of Object.keys(\n      terms\n    ) as peopledatalabs.CompanySearchOptionsQueryKeys[]) {\n      termsQuery.push({ term: { [term]: terms[term] } })\n    }\n\n    return this.ky\n      .get('company/search', {\n        searchParams: {\n          size: options.limit || 1,\n          query: JSON.stringify({\n            bool: {\n              must: termsQuery\n            }\n          })\n        }\n      })\n      .json<peopledatalabs.CompanySearchResponse>()\n  }\n\n  async companyProfile(options: peopledatalabs.CompanyLookupOptions) {\n    return this.ky\n      .get('company/enrich', {\n        searchParams: sanitizeSearchParams({ ...options })\n      })\n      .json<peopledatalabs.CompanyLookupResponse>()\n  }\n\n  async personSearch(options: peopledatalabs.PersonSearchOptions) {\n    const terms = options.query\n    const termsQuery = []\n\n    for (const term of Object.keys(\n      terms\n    ) as peopledatalabs.PersonSearchOptionsQueryKeys[]) {\n      termsQuery.push({ term: { [term]: terms[term] } })\n    }\n\n    return this.ky\n      .get('person/search', {\n        searchParams: {\n          size: options.limit || 10,\n          query: JSON.stringify({\n            bool: {\n              must: termsQuery\n            }\n          })\n        }\n      })\n      .json<peopledatalabs.SearchPersonApiResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/people-data-labs/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/perigon/package.json",
    "content": "{\n  \"name\": \"@agentic/perigon\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Perigon News API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/perigon\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/perigon/src/index.ts",
    "content": "export * from './perigon-client'\n"
  },
  {
    "path": "legacy/packages/perigon/src/perigon-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\n// TODO: https://docs.goperigon.com/docs/searching-sources\n// TODO: https://docs.goperigon.com/docs/journalist-data\n// TODO: https://docs.goperigon.com/docs/topics\n\nexport namespace perigon {\n  // Allow up to 2 requests per second by default.\n  export const throttle = pThrottle({\n    limit: 2,\n    interval: 1000,\n    strict: true\n  })\n\n  export const DEFAULT_PAGE_SIZE = 10\n  export const MAX_PAGE_SIZE = 100\n\n  export const ArticleLabelSchema = z.union([\n    z.literal('Opinion'),\n    z.literal('Non-news'),\n    z.literal('Paid News'),\n    z.literal('Fact Check'),\n    z.literal('Pop Culture'),\n    z.literal('Roundup'),\n    z.literal('Press Release')\n  ])\n  export type ArticleLabel = z.infer<typeof ArticleLabelSchema>\n\n  export const CategoriesSchema = z.union([\n    z.literal('Politics'),\n    z.literal('Tech'),\n    z.literal('Sports'),\n    z.literal('Business'),\n    z.literal('Finance'),\n    z.literal('Entertainment'),\n    z.literal('Health'),\n    z.literal('Weather'),\n    z.literal('Lifestyle'),\n    z.literal('Auto'),\n    z.literal('Science'),\n    z.literal('Travel'),\n    z.literal('Environment'),\n    z.literal('World'),\n    z.literal('General'),\n    z.literal('none')\n  ])\n  export type Categories = z.infer<typeof CategoriesSchema>\n\n  export const SourceGroupSchema = z.union([\n    z.literal('top10').describe('Top 10 most popular sources globally'),\n    z.literal('top100').describe('Top 100 most popular sources globally'),\n    z\n      .literal('top500English')\n      .describe('Top 500 most popular (English) sources globally'),\n    z\n      .literal('top25crypto')\n      .describe(\n        'Top 25 most popular sources covering cryptocurrency & blockchain developments'\n      ),\n    z\n      .literal('top25finance')\n      .describe(\n        'Top 25 most popular sources covering financial news, movement in the markets & public equities'\n      ),\n    z\n      .literal('top50tech')\n      .describe('Top 50 sources covering new technology & businesses in tech'),\n    z\n      .literal('top100sports')\n      .describe(\n        'Top 100 most popular (English) sources covering sports of all types'\n      ),\n    z\n      .literal('top100leftUS')\n      .describe(\n        'Top 100 most popular (US) sources with an average political bias rating of Left or Leans Left'\n      ),\n    z\n      .literal('top100rightUS')\n      .describe(\n        'Top 100 most popular (US) sources with an average political bias rating of Right or Leans Right'\n      ),\n    z\n      .literal('top100centerUS')\n      .describe(\n        'Top 100 most popular (US) sources with an average political bias rating of Center or Middle'\n      )\n  ])\n  export type SourceGroup = z.infer<typeof SourceGroupSchema>\n\n  export const SortBySchema = z.union([\n    z.literal('date'),\n    z.literal('relevance'),\n    z.literal('addDate'),\n    z.literal('pubDate'),\n    z.literal('refreshDate')\n  ])\n  export type SortBy = z.infer<typeof SortBySchema>\n\n  export const ArticlesSearchOptionsSchema = z.object({\n    q: z.string()\n      .describe(`Search query. It may use boolean operators (AND, OR, NOT) and quotes for exact matching. Example search queries:\n\n- election news\n- \"elon musk\" AND tesla\n- (upcoming release OR launch) AND apple\n- (Google OR Amazon) AND NOT (\"Jeff Bezos\" OR Android)\n- \"climate change\"\n`),\n    title: z\n      .string()\n      .optional()\n      .describe(\n        'Search query which applies only to article titles / headlines.'\n      ),\n    desc: z.string().optional(),\n    content: z.string().optional(),\n    url: z.string().optional(),\n    from: z\n      .string()\n      .optional()\n      .describe(\n        'Filter to only return articles published after the specified date (ISO or \"yyyy-mm-dd\" format)'\n      ),\n    to: z\n      .string()\n      .optional()\n      .describe(\n        'Filter to only return articles published before the specified date (ISO or \"yyyy-mm-dd\" format)'\n      ),\n    addDateFrom: z.string().optional(),\n    addDateTo: z.string().optional(),\n    refreshDateFrom: z.string().optional(),\n    refreshDateTo: z.string().optional(),\n    articleId: z.string().optional(),\n    clusterId: z.string().optional(),\n    medium: z.union([z.literal('article'), z.literal('video')]).optional(),\n    source: z\n      .string()\n      .optional()\n      .describe(\"Filter articles from a specific publisher's source domain.\"),\n    sourceGroup: SourceGroupSchema.optional().describe(\n      'The source group to retrieve articles from.'\n    ),\n    excludeSource: z\n      .string()\n      .optional()\n      .describe(\n        'Source website domains which should be excluded from the search. Wildcards (* and ?) are suported (e.g. \"*.cnn.com\").'\n      ),\n    paywall: z\n      .boolean()\n      .optional()\n      .describe(\n        'Filter to show only results where the source has a paywall (true) or does not have a paywall (false).'\n      ),\n    country: z\n      .string()\n      .optional()\n      .describe('Country code to filter by country.'),\n    language: z.string().optional(),\n    label: ArticleLabelSchema.optional().describe(\n      'Labels to filter by, could be \"Opinion\", \"Paid-news\", \"Non-news\", etc. If multiple parameters are passed, they will be applied as OR operations.'\n    ),\n    excludeLabel: z\n      .array(z.union([ArticleLabelSchema, z.literal('Low Content')]))\n      .optional()\n      .describe(\n        'Exclude results that include specific labels (\"Opinion\", \"Non-news\", \"Paid News\", etc.). You can filter multiple by repeating the parameter.'\n      ),\n    byline: z.string().optional(),\n    topic: z.string().optional(),\n    category: CategoriesSchema.optional().describe(\n      'Filter by categories. Categories are general themes that the article is about. Examples of categories: Tech, Politics, etc. If multiple parameters are passed, they will be applied as OR operations. Use \"none\" to search uncategorized articles.'\n    ),\n    journalistId: z.string().optional(),\n    state: z\n      .string()\n      .optional()\n      .describe(\n        'Filters articles where a specified state plays a central role in the content, beyond mere mentions, to ensure the results are deeply relevant to the state in question.'\n      ),\n    city: z\n      .string()\n      .optional()\n      .describe(\n        'Filters articles where a specified city plays a central role in the content, beyond mere mentions, to ensure the results are deeply relevant to the urban area in question.'\n      ),\n    area: z\n      .string()\n      .optional()\n      .describe(\n        'Filters articles where a specified area, such as a neighborhood, borough, or district, plays a central role in the content, beyond mere mentions, to ensure the results are deeply relevant to the area in question.'\n      ),\n    location: z.string().optional(),\n    sortBy: SortBySchema.default('relevance')\n      .optional()\n      .describe('How to sort the article results.'),\n    showReprints: z\n      .boolean()\n      .optional()\n      .describe(\n        'Whether to return reprints in the response or not. Reprints are usually wired articles from sources like AP or Reuters that are reprinted in multiple sources at the same time. By default, this parameter is \"true\".'\n      ),\n    showNumResults: z.boolean().optional(),\n    type: z\n      .union([z.literal('all'), z.literal('local'), z.literal('world')])\n      .optional(),\n    linkTo: z.string().optional(),\n    reprintGroupId: z.string().optional(),\n    personWikidataId: z.array(z.string()).optional(),\n    personName: z\n      .array(z.string())\n      .optional()\n      .describe('List of person names for exact matches.'),\n    companyId: z.array(z.string()).optional(),\n    companyName: z.string().optional().describe('Search by company name.'),\n    companyDomain: z\n      .array(z.string())\n      .optional()\n      .describe('Search by company domain.'),\n    companySymbol: z\n      .array(z.string())\n      .optional()\n      .describe('Search by company stock ticker symbol.'),\n    maxDistance: z.number().optional(),\n    lat: z.number().optional(),\n    lon: z.number().optional(),\n    searchTranslation: z\n      .boolean()\n      .optional()\n      .describe(\n        'Expand a query to search the translation, translatedTitle, and translatedDescription fields for non-English articles.'\n      ),\n    page: z\n      .number()\n      .int()\n      .max(10_000)\n      .default(0)\n      .optional()\n      .describe('Page number of results to return (zero-based)'),\n    size: z\n      .number()\n      .int()\n      .max(DEFAULT_PAGE_SIZE)\n      .optional()\n      .describe('Number of results to return per page')\n  })\n  export type ArticlesSearchOptions = z.infer<\n    typeof ArticlesSearchOptionsSchema\n  >\n\n  export const StoriesSearchOptionsSchema = ArticlesSearchOptionsSchema.pick({\n    q: true,\n    clusterId: true,\n    topic: true,\n    category: true,\n    from: true,\n    to: true,\n    state: true,\n    city: true,\n    area: true,\n    showNumResults: true,\n    page: true,\n    size: true,\n    sourceGroup: true,\n    personWikidataId: true,\n    personName: true,\n    companyId: true,\n    companyName: true,\n    companyDomain: true,\n    companySymbol: true\n  }).extend({\n    name: z.string().optional().describe('Search stories by name.'),\n    nameExists: z.boolean().optional(),\n    initializedFrom: z.string().optional(),\n    initializedTo: z.string().optional(),\n    updatedFrom: z.string().optional(),\n    updatedTo: z.string().optional(),\n    minClusterSize: z.number().optional(),\n    maxClusterSize: z.number().optional(),\n    showDuplicates: z\n      .boolean()\n      .optional()\n      .describe(\n        'Stories are deduplicated by default. If a story is deduplicated, all future articles are merged into the original story. `duplicateOf` field contains the original cluster id. When showDuplicates=true, all stories are shown.'\n      ),\n    sortBy: z\n      .union([\n        z.literal('count'),\n        z.literal('createdAt'),\n        z.literal('updatedAt')\n      ])\n      .optional()\n      .describe('How to sort the results.')\n  })\n  export type StoriesSearchOptions = z.infer<typeof StoriesSearchOptionsSchema>\n\n  export const PeopleSearchOptionsSchema = z.object({\n    name: z\n      .string()\n      .describe(\n        'Person name query to search for. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.'\n      ),\n    wikidataId: z\n      .array(z.string())\n      .optional()\n      .describe('Search by ID of Wikidata entity.'),\n    occupationId: z\n      .array(z.string())\n      .optional()\n      .describe('Search by Wikidata occupation ID.'),\n    occupationLabel: z\n      .string()\n      .optional()\n      .describe('Search by occupation name.'),\n    size: z\n      .number()\n      .int()\n      .max(DEFAULT_PAGE_SIZE)\n      .optional()\n      .describe('Number of results to return per page')\n  })\n  export type PeopleSearchOptions = z.infer<typeof PeopleSearchOptionsSchema>\n\n  export const CompanySearchOptionsSchema = z.object({\n    q: z\n      .string()\n      .optional()\n      .describe(\n        'Company search query. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.'\n      ),\n    name: z\n      .string()\n      .optional()\n      .describe(\n        'Search by company name. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.'\n      ),\n    industry: z\n      .string()\n      .optional()\n      .describe(\n        'Search by company industry. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.'\n      ),\n    sector: z\n      .string()\n      .optional()\n      .describe(\n        'Search by company sector. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.'\n      ),\n    id: z.array(z.string()).optional().describe('Search by company ID.'),\n    symbol: z\n      .array(z.string())\n      .optional()\n      .describe('Search by company stock ticker symbol.'),\n    domain: z\n      .array(z.string())\n      .optional()\n      .describe('Search by company domain.'),\n    country: z.string().optional().describe('Search by country.'),\n    exchange: z.string().optional().describe('Search by exchange name.'),\n    numEmployeesFrom: z\n      .number()\n      .int()\n      .optional()\n      .describe('Minimum number of employees.'),\n    numEmployeesTo: z\n      .number()\n      .int()\n      .optional()\n      .describe('Maximum number of employees.'),\n    ipoFrom: z\n      .string()\n      .optional()\n      .describe('Starting IPO date (ISO or \"yyyy-mm-dd\" format)'),\n    ipoTo: z\n      .string()\n      .optional()\n      .describe('Ending IPO date (ISO or \"yyyy-mm-dd\" format)'),\n    size: z\n      .number()\n      .int()\n      .max(DEFAULT_PAGE_SIZE)\n      .optional()\n      .describe('Number of results to return per page')\n  })\n  export type CompanySearchOptions = z.infer<typeof CompanySearchOptionsSchema>\n\n  export type ArticlesSearchResponse = {\n    status: number\n    numResults: number\n    articles: Article[]\n  }\n\n  export type Article = {\n    url: string\n    authorsByline: string\n    articleId: string\n    clusterId: string\n    source: {\n      domain: string\n    }\n    imageUrl: string\n    country: string\n    language: string\n    pubDate: string\n    addDate: string\n    refreshDate: string\n    score: number\n    title: string\n    description: string\n    content: string\n    medium: string\n    links: string[]\n    labels: string[]\n    matchedAuthors: string[]\n    claim: string\n    verdict: string\n    keywords: {\n      name: string\n      weight: number\n    }[]\n    topics: {\n      name: string\n    }[]\n    categories: {\n      name: string\n    }[]\n    entities: {\n      data: string\n      type: string\n      mentions: number\n    }[]\n    sentiment: {\n      positive: number\n      negative: number\n      neutral: number\n    }\n    summary: string\n    translation: string\n    locations: string[]\n    reprint: boolean\n    reprintGroupId: string\n    places: null\n  }\n\n  export type StoriesSearchResponse = {\n    status: number\n    numResults: number\n    results: Story[]\n  }\n\n  export type Story = {\n    createdAt: string\n    updatedAt: string\n    initializedAt: string\n    id: string\n    name: string\n    summary: string\n    summaryReferences: Array<any>\n    keyPoints: Array<{\n      point: string\n      references: Array<string>\n    }>\n    sentiment: {\n      positive: number\n      negative: number\n      neutral: number\n    }\n    uniqueCount: number\n    reprintCount: number\n    totalCount: number\n    countries: Array<{\n      name: string\n      count: number\n    }>\n    topCountries: Array<string>\n    topics: Array<{\n      name: string\n      count: number\n    }>\n    topTopics: Array<{ name: string }>\n    categories: Array<{\n      name: string\n      count: number\n    }>\n    topCategories: Array<{ name: string }>\n    people: Array<{ wikidataId: string; name: string; count: number }>\n    topPeople: Array<{ wikidataId: string; name: string }>\n    companies: Array<{\n      id: string\n      name: string\n      domains: Array<string>\n      symbols: Array<string>\n      count: number\n    }>\n    topCompanies: Array<{\n      id: string\n      name: string\n      domains: Array<string>\n      symbols: Array<string>\n    }>\n    locations: Array<{\n      state: string\n      city?: string\n      area?: string\n      county?: string\n      count: number\n    }>\n    topLocations: Array<{\n      state: string\n      city?: string\n      area?: string\n      county?: string\n    }>\n  }\n\n  export interface PeopleSearchResponse {\n    status: number\n    numResults: number\n    results: Person[]\n  }\n\n  export interface Person {\n    wikidataId: string\n    name: string\n    gender: Gender\n    dateOfBirth: DateOfBirth\n    dateOfDeath: any\n    description: string\n    aliases: string[]\n    occupation: Occupation[]\n    position: Position[]\n    politicalParty: PoliticalParty[]\n    image?: Image\n    abstract: string\n  }\n\n  export interface Gender {\n    wikidataId: string\n    label: string\n  }\n\n  export interface DateOfBirth {\n    time: string\n    precision: string\n  }\n\n  export interface Occupation {\n    wikidataId: string\n    label: string\n  }\n\n  export interface Position {\n    wikidataId: string\n    label: string\n    startTime: any\n    endTime: any\n    employer: any\n  }\n\n  export interface PoliticalParty {\n    wikidataId: string\n    label: string\n    startTime: any\n    endTime: any\n  }\n\n  export interface Image {\n    url: string\n  }\n\n  export interface CompanySearchResponse {\n    status: number\n    numResults: number\n    results: Company[]\n  }\n\n  export interface Company {\n    id: string\n    name: string\n    altNames: string[]\n    domains: string[]\n    monthlyVisits: number\n    globalRank?: number\n    description: string\n    ceo: any\n    industry: string\n    sector: any\n    country: string\n    fullTimeEmployees?: number\n    address: any\n    city: any\n    state: any\n    zip: any\n    logo?: string\n    favicon?: string\n    isEtf: boolean\n    isActivelyTrading: any\n    isFund: boolean\n    isAdr: boolean\n    symbols: any[]\n  }\n}\n\n/**\n * **The intelligent news API**\n *\n * Real-time global news and web content data from 140,000+ sources.\n *\n * - search news articles\n * - search news stories (clusters of related news articles)\n * - search people, companies, topics, and journalists\n *\n * @see https://www.goperigon.com/products/news-api\n */\nexport class PerigonClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n\n  constructor({\n    apiKey = getEnv('PERIGON_API_KEY'),\n    timeoutMs = 30_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    throttle?: boolean\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'PerigonClient missing required \"apiKey\" (defaults to \"PERIGON_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n\n    const throttledKy = throttle ? throttleKy(ky, perigon.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: 'https://api.goperigon.com/v1/',\n      timeout: timeoutMs\n    })\n  }\n\n  /**\n   * @see https://docs.goperigon.com/docs/overview\n   * @see https://docs.goperigon.com/reference/all-news\n   */\n  @aiFunction({\n    name: 'search_news_articles',\n    description:\n      'Search for news articles indexed by Perigon. Articles can optionally be filtered by various parameters.',\n    inputSchema: perigon.ArticlesSearchOptionsSchema.pick({\n      q: true,\n      title: true,\n      from: true,\n      to: true,\n      source: true,\n      sourceGroup: true,\n      excludeSource: true,\n      category: true,\n      personName: true,\n      companyName: true,\n      companyDomain: true,\n      sortBy: true\n    })\n  })\n  async searchArticles(opts: perigon.ArticlesSearchOptions) {\n    return this.ky\n      .get('all', {\n        searchParams: sanitizeSearchParams({\n          sortBy: 'relevance',\n          ...opts,\n          apiKey: this.apiKey,\n          size: Math.max(\n            1,\n            Math.min(\n              perigon.MAX_PAGE_SIZE,\n              opts.size || perigon.DEFAULT_PAGE_SIZE\n            )\n          )\n        })\n      })\n      .json<perigon.ArticlesSearchResponse>()\n  }\n\n  /**\n   * @see https://docs.goperigon.com/docs/stories-overview\n   * @see https://docs.goperigon.com/reference/stories-1\n   */\n  @aiFunction({\n    name: 'search_news_stories',\n    description:\n      'Search for news stories indexed by Perigon. Stories are clusters of related news articles and are useful for finding top stories and trending headlines. Stories can optionally be filtered by various parameters.',\n    inputSchema: perigon.StoriesSearchOptionsSchema.pick({\n      q: true,\n      name: true,\n      from: true,\n      to: true,\n      sourceGroup: true,\n      category: true,\n      personName: true,\n      companyName: true,\n      companyDomain: true,\n      sortBy: true\n    })\n  })\n  async searchStories(opts: perigon.StoriesSearchOptions) {\n    return this.ky\n      .get('stories/all', {\n        searchParams: sanitizeSearchParams({\n          sortBy: 'relevance',\n          ...opts,\n          apiKey: this.apiKey,\n          size: Math.max(\n            1,\n            Math.min(\n              perigon.MAX_PAGE_SIZE,\n              opts.size || perigon.DEFAULT_PAGE_SIZE\n            )\n          )\n        })\n      })\n      .json<perigon.StoriesSearchResponse>()\n  }\n\n  /**\n   * @see https://docs.goperigon.com/docs/people-data\n   * @see https://docs.goperigon.com/reference/people\n   */\n  @aiFunction({\n    name: 'search_people',\n    description: 'Search for well-known people indexed by Perigon.',\n    inputSchema: perigon.PeopleSearchOptionsSchema\n  })\n  async searchPeople(opts: perigon.PeopleSearchOptions) {\n    return this.ky\n      .get('people/all', {\n        searchParams: sanitizeSearchParams({\n          ...opts,\n          apiKey: this.apiKey,\n          size: Math.max(\n            1,\n            Math.min(\n              perigon.MAX_PAGE_SIZE,\n              opts.size || perigon.DEFAULT_PAGE_SIZE\n            )\n          )\n        })\n      })\n      .json<perigon.PeopleSearchResponse>()\n  }\n\n  /**\n   * @see https://docs.goperigon.com/docs/company-data\n   * @see https://docs.goperigon.com/reference/companies\n   */\n  @aiFunction({\n    name: 'search_companies',\n    description:\n      'Search for companies indexed by Perigon. Includes public and private companies sourced from public records and Wikidata.',\n    inputSchema: perigon.CompanySearchOptionsSchema\n  })\n  async searchCompanies(opts: perigon.CompanySearchOptions) {\n    return this.ky\n      .get('companies/all', {\n        searchParams: sanitizeSearchParams({\n          ...opts,\n          apiKey: this.apiKey,\n          size: Math.max(\n            1,\n            Math.min(\n              perigon.MAX_PAGE_SIZE,\n              opts.size || perigon.DEFAULT_PAGE_SIZE\n            )\n          )\n        })\n      })\n      .json<perigon.CompanySearchResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/perigon/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/polygon/package.json",
    "content": "{\n  \"name\": \"@agentic/polygon\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Polygon stock API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/polygon\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/polygon/src/index.ts",
    "content": "export * from './polygon-client'\n"
  },
  {
    "path": "legacy/packages/polygon/src/polygon-client.ts",
    "content": "import { AIFunctionsProvider, assert, getEnv } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\n\n// TODO: add aiFunction decorator to select methods\n\nexport namespace polygon {\n  export const API_BASE_URL = 'https://api.polygon.io'\n\n  /**\n   * Asset classes available on Polygon.\n   */\n  export type ASSET_CLASS = 'stocks' | 'options' | 'crypto' | 'fx'\n\n  /**\n   * Supported time spans for Polygon's indicator APIs.\n   */\n  export type TIMESPAN =\n    | 'minute'\n    | 'hour'\n    | 'day'\n    | 'week'\n    | 'month'\n    | 'quarter'\n    | 'year'\n\n  /**\n   * Supported series types for Polygon's indicator APIs.\n   */\n  export type SERIES_TYPE = 'close' | 'open' | 'high' | 'low'\n\n  /**\n   * Order types available on Polygon.\n   */\n  export type ORDER_TYPE = 'asc' | 'desc'\n\n  /**\n   * Input parameters for the aggregates API.\n   */\n  export interface AggregatesInput {\n    /** The ticker symbol of the stock/equity. */\n    ticker: string\n\n    /** The size of the timespan multiplier. */\n    multiplier: number\n\n    /** The size of the time window. */\n    timespan: TIMESPAN\n\n    /** The start of the aggregate time window. Either a date with the format YYYY-MM-DD or a millisecond timestamp. */\n    from: string | number\n\n    /** The end of the aggregate time window. Either a date with the format YYYY-MM-DD or a millisecond timestamp. */\n    to: string | number\n\n    /** Whether or not the results are adjusted for splits. By default, results are adjusted. Set this to false to get results that are NOT adjusted for splits. */\n    adjusted?: boolean\n\n    /** Sort the results by timestamp. \"asc\" will return results in ascending order (oldest at the top), \"desc\" will return results in descending order (newest at the top). */\n    sort?: ORDER_TYPE\n\n    /** Limits the number of base aggregates queried to create the aggregate results. Max 50000 and Default 5000. */\n    limit?: number\n  }\n\n  /**\n   * Output parameters for the aggregates API.\n   */\n  export interface AggregatesOutput {\n    /** The exchange symbol that this item is traded under. */\n    ticker: string\n\n    /** Whether or not this response was adjusted for splits. */\n    adjusted: boolean\n\n    /** The number of aggregates (minute or day) used to generate the response. */\n    queryCount: number\n\n    /** A request id assigned by the server. */\n    request_id: string\n\n    /** The total number of results for this request. */\n    resultsCount: number\n\n    /** The status of this request's response. */\n    status: string\n\n    /** The results of the query. */\n    results: Aggregate[]\n\n    /** If present, this value can be used to fetch the next page of data. */\n    next_url?: string\n  }\n\n  /**\n   * Input parameters for the grouped daily API.\n   */\n  export type GroupedDailyInput = {\n    /** The beginning date for the aggregate window. */\n    date: string\n\n    /** Whether or not the results are adjusted for splits. By default, results are adjusted. Set this to false to get results that are NOT adjusted for splits. */\n    adjusted?: boolean\n  }\n\n  /**\n   * Input parameters for the grouped daily API for stocks.\n   */\n  export interface GroupedDailyInputStocks extends GroupedDailyInput {\n    /** Include OTC securities in the response. Default is false (don't include OTC securities). */\n    include_otc?: boolean\n  }\n\n  /**\n   * Output parameters for the grouped daily API.\n   */\n  export interface GroupedDailyOutput {\n    /** Whether or not this response was adjusted for splits. */\n    adjusted: boolean\n\n    /** The number of aggregates (minute or day) used to generate the response. */\n    queryCount: number\n\n    /** A request id assigned by the server. */\n    request_id: string\n\n    /** The total number of results for this request. */\n    resultsCount: number\n\n    /** The status of this request's response. */\n    status: string\n\n    /** The results of the query. */\n    results: AggregateDaily[]\n  }\n\n  /**\n   * AggregateDaily parameters.\n   */\n  export interface AggregateDaily extends Aggregate {\n    /** The exchange symbol that this item is traded under. */\n    T: string\n  }\n\n  /**\n   * Ticker Details v3 input parameters.\n   */\n  export type TickerDetailsInput = {\n    /** The ticker symbol of the asset. */\n    ticker: string\n\n    /** Specify a point in time to get information about the ticker available on that date (formatted as YYYY-MM-DD). */\n    date?: string\n  }\n\n  /**\n   * Daily Open/Close input parameters.\n   */\n  export type DailyOpenCloseInput = {\n    /** The ticker symbol */\n    ticker: string\n\n    /** The date of the requested open/close in the format YYYY-MM-DD. */\n    date: string\n\n    /** Whether or not the results are adjusted for splits. By default, results are adjusted. */\n    adjusted?: boolean\n  }\n\n  /**\n   * Result returned by the Daily Open/Close API.\n   */\n  export interface DailyOpenCloseOutput {\n    /** The close price of the ticker symbol in after-hours trading. */\n    afterHours: number\n\n    /** The close price for the symbol in the given time period. */\n    close: number\n\n    /** The requested date. */\n    from: string\n\n    /** The highest price for the symbol in the given time period. */\n    high: number\n\n    /** The lowest price for the symbol in the given time period. */\n    low: number\n\n    /** The open price for the symbol in the given time period. */\n    open: number\n\n    /** The open price of the ticker symbol in pre-market trading. */\n    preMarket: number\n\n    /** The status of this request's response. */\n    status: string\n\n    /** The exchange symbol that this item is traded under. */\n    symbol: string\n\n    /** The trading volume of the symbol in the given time period. */\n    volume: number\n  }\n\n  /**\n   * Result returned by the Previous Close API.\n   */\n  export interface PreviousCloseOutput {\n    /** Whether or not this response was adjusted for splits. */\n    adjusted: boolean\n\n    /** The number of aggregates (minute or day) used to generate the response. */\n    queryCount: number\n\n    /** A request id assigned by the server. */\n    requestId: string\n\n    /** Array of results, each containing details for the symbol in the given time period. */\n    results: {\n      /** The exchange symbol that this item is traded under. */\n      T: string\n\n      /** The close price for the symbol in the given time period. */\n      c: number\n\n      /** The highest price for the symbol in the given time period. */\n      h: number\n\n      /** The lowest price for the symbol in the given time period. */\n      l: number\n\n      /** The open price for the symbol in the given time period. */\n      o: number\n\n      /** The Unix Msec timestamp for the start of the aggregate window. */\n      t: number\n\n      /** The trading volume of the symbol in the given time period. */\n      v: number\n\n      /** The volume weighted average price. */\n      vw: number\n    }[]\n\n    /** The total number of results for this request. */\n    resultsCount: number\n\n    /** The status of this request's response. */\n    status: string\n\n    /** The exchange symbol that this item is traded under. */\n    ticker: string\n  }\n\n  /**\n   * Result returned by the Ticker Details v3 API.\n   */\n  export interface TickerDetailsOutput {\n    /** A request id assigned by the server. */\n    requestId: string\n\n    /** Detailed results for the specific ticker. */\n    results: {\n      /** Whether the ticker is actively traded. */\n      active: boolean\n\n      /** Address of the company. */\n      address: {\n        /** The first line of the company's headquarters address. */\n        address1: string\n\n        /** The city of the company's headquarters address. */\n        city: string\n\n        /** The postal code of the company's headquarters address. */\n        postalCode: string\n\n        /** The state of the company's headquarters address. */\n        state: string\n      }\n\n      /** Branding details of the company. */\n      branding: {\n        /** A link to this ticker's company's icon. Icon's are generally smaller, square images that represent the company at a glance. */\n        iconUrl: string\n\n        /** A link to this ticker's company's logo. Note that you must provide an API key when accessing this URL. See the \"Authentication\" section at the top of this page for more details. */\n        logoUrl: string\n      }\n\n      /** Central Index Key (CIK) of the company. */\n      cik: string\n\n      /** Composite Financial Instrument Global Identifier (FIGI). */\n      compositeFigi: string\n\n      /** Name of the currency in which the company trades. */\n      currencyName: string\n\n      /** Date and time the company was delisted, if applicable. */\n      delistedUtc?: string\n\n      /** Description of the company. */\n      description: string\n\n      /** The company's homepage URL. */\n      homepageUrl: string\n\n      /** The date when the company was listed. */\n      listDate: string\n\n      /** Locale of the company. */\n      locale: string\n\n      /** Market in which the company trades. */\n      market: string\n\n      /** Market capitalization of the company. */\n      marketCap: number\n\n      /** Name of the company. */\n      name: string\n\n      /** Phone number of the company. */\n      phoneNumber: string\n\n      /** The primary exchange on which the company trades. */\n      primaryExchange: string\n\n      /** Round lot size for the company's stock. */\n      roundLot: number\n\n      /** Share class FIGI. */\n      shareClassFigi: string\n\n      /** The number of outstanding shares for the share class. */\n      shareClassSharesOutstanding: number\n\n      /** The Standard Industrial Classification (SIC) code of the company. */\n      sicCode: string\n\n      /** Description of the SIC code. */\n      sicDescription: string\n\n      /** The ticker symbol of the company. */\n      ticker: string\n\n      /** The root of the ticker symbol. */\n      tickerRoot: string\n\n      /** The suffix of the ticker symbol, if applicable. */\n      tickerSuffix?: string\n\n      /** The total number of employees in the company. */\n      totalEmployees: number\n\n      /** The type of the ticker (e.g., common stock, preferred stock, etc.). */\n      type: string\n\n      /** The number of weighted outstanding shares. */\n      weightedSharesOutstanding: number\n    }\n\n    /** The status of this request's response. */\n    status: string\n  }\n\n  /**\n   * Input parameters for technical indicators.\n   */\n  export type IndicatorInput = {\n    /** The ticker symbol for which to get data. */\n    ticker: string\n\n    /** Query by timestamp. Either a date with the format YYYY-MM-DD or a millisecond timestamp. */\n    timestamp?: string\n\n    /** The size of the aggregate time window. */\n    timespan?: TIMESPAN\n\n    /** Whether or not the aggregates are adjusted for splits. By default, aggregates are adjusted. Set this to false to get results that are NOT adjusted for splits. */\n    adjusted?: boolean\n\n    /** The window size used to calculate the indicator. i.e. a window size of 10 with daily aggregates would result in a 10 day moving average. */\n    window?: number\n\n    /** The price in the aggregate which will be used to calculate the indicator. */\n    series_type?: SERIES_TYPE\n\n    /** Whether or not to include the aggregates used to calculate this indicator in the response. */\n    expand_underlying?: boolean\n\n    /** The order in which to return the results, ordered by timestamp. */\n    order?: ORDER_TYPE\n\n    /** Limit the number of results returned, default is 10 and max is 5000 */\n    limit?: number\n  }\n\n  /**\n   * Represents an aggregate, which includes data for a given time period.\n   */\n  export interface Aggregate {\n    /** The close price for the symbol in the given time period. */\n    c: number\n\n    /** The highest price for the symbol in the given time period. */\n    h: number\n\n    /** The lowest price for the symbol in the given time period. */\n    l: number\n\n    /** The number of transactions in the aggregate window. */\n    n: number\n\n    /** The open price for the symbol in the given time period. */\n    o: number\n\n    /** Whether or not this aggregate is for an OTC ticker. This field will be left off if false. */\n    otc?: boolean\n\n    /** The Unix Msec timestamp for the start of the aggregate window. */\n    t: number\n\n    /** The trading volume of the symbol in the given time period. */\n    v: number\n\n    /** The volume weighted average price. */\n    vw?: number\n  }\n\n  /**\n   * Represents a value of the indicator, which includes timestamp and value itself.\n   */\n  export interface IndicatorValue {\n    /** The Unix Msec timestamp from the last aggregate used in this calculation. */\n    timestamp: number\n\n    /** The indicator value for this period. */\n    value: number\n  }\n\n  /**\n   * The output response from the technical indicator API.\n   */\n  export interface IndicatorOutput {\n    /** If present, this value can be used to fetch the next page of data. */\n    next_url: string\n\n    /** A request id assigned by the server. */\n    request_id: string\n\n    /** Results object containing underlying aggregates and values array. */\n    results: {\n      /** Underlying object containing aggregates and a URL to fetch underlying data. */\n      underlying: {\n        /** Array of aggregates used for calculation. */\n        aggregates: Aggregate[]\n\n        /** The URL which can be used to request the underlying aggregates used in this request. */\n        url: string\n      }\n\n      /** Array of calculated indicator values. */\n      values: IndicatorValue[]\n    }\n\n    /** The status of this request's response. */\n    status: string\n  }\n\n  /**\n   * Input parameters for the /v3/reference/tickers API.\n   */\n  export type TickerInput = {\n    /** Specify a ticker symbol. Defaults to empty string which queries all tickers. */\n    ticker?: string\n\n    /** Specify the type of the tickers. */\n    type?: string\n\n    /** Filter by market type. */\n    market?: 'crypto'\n\n    /** Specify the primary exchange of the asset in the ISO code format. */\n    exchange?: string\n\n    /** Specify the CUSIP code of the asset you want to search for. */\n    cusip?: string\n\n    /** Specify the CIK of the asset you want to search for. */\n    cik?: string\n\n    /** Specify a point in time to retrieve tickers available on that date. */\n    date?: string\n\n    /** Search for terms within the ticker and/or company name. */\n    search?: string\n\n    /** Specify if the tickers returned should be actively traded on the queried date. */\n    active?: boolean\n\n    /** Order results based on the sort field. */\n    order?: ORDER_TYPE\n\n    /** Limit the number of results returned. */\n    limit?: number\n\n    /** Sort field used for ordering. */\n    sort?: string\n  }\n\n  /**\n   * Represents a ticker that matches the query.\n   */\n  export interface Ticker {\n    /** Whether or not the asset is actively traded. */\n    active: boolean\n\n    /** The CIK number for this ticker. */\n    cik: string\n\n    /** The composite OpenFIGI number for this ticker. */\n    composite_figi: string\n\n    /** The name of the currency that this asset is traded with. */\n    currency_name: string\n\n    /** The last date that the asset was traded. */\n    delisted_utc: string\n\n    /** The information is accurate up to this time. */\n    last_updated_utc: string\n\n    /** The locale of the asset. */\n    locale: 'us' | 'global'\n\n    /** The market type of the asset. */\n    market: 'stocks' | 'crypto' | 'fx' | 'otc' | 'indices'\n\n    /** The name of the asset. */\n    name: string\n\n    /** The ISO code of the primary listing exchange for this asset. */\n    primary_exchange: string\n\n    /** The share Class OpenFIGI number for this ticker. */\n    share_class_figi: string\n\n    /** The exchange symbol that this item is traded under. */\n    ticker: string\n\n    /** The type of the asset. */\n    type: string\n  }\n\n  /**\n   * The output response from the /v3/reference/tickers API.\n   */\n  export interface TickerOutput {\n    /** The total number of results for this request. */\n    count: number\n\n    /** If present, this value can be used to fetch the next page of data. */\n    next_url: string\n\n    /** A request id assigned by the server. */\n    request_id: string\n\n    /** An array of tickers that match your query. */\n    results: Ticker[]\n\n    /** The status of this request's response. */\n    status: string\n  }\n\n  /**\n   * Output parameters for the market status API.\n   */\n  export interface MarketStatusOutput {\n    /** Whether or not the market is in post-market hours. */\n    afterHours: boolean\n\n    /** The status of the crypto and forex markets. */\n    currencies: {\n      /** The status of the crypto market. */\n      crypto: string\n      /** The status of the forex market. */\n      fx: string\n    }\n\n    /** Whether or not the market is in pre-market hours. */\n    earlyHours: boolean\n\n    /** The status of the Nasdaq, NYSE and OTC markets. */\n    exchanges: {\n      /** The status of the Nasdaq market. */\n      nasdaq: string\n      /** The status of the NYSE market. */\n      nyse: string\n      /** The status of the OTC market. */\n      otc: string\n    }\n\n    /** The status of the market as a whole. */\n    market: string\n\n    /** The current time of the server. */\n    serverTime: string\n  }\n\n  /**\n   * Output parameters for the market holidays API.\n   */\n  export interface MarketHolidayOutput {\n    /** The market close time on the holiday (if it's not closed). */\n    close?: string\n\n    /** The date of the holiday. */\n    date: string\n\n    /** Which market the record is for. */\n    exchange: string\n\n    /** The name of the holiday. */\n    name: string\n\n    /** The market open time on the holiday (if it's not closed). */\n    open?: string\n\n    /** The status of the market on the holiday. */\n    status: string\n  }\n\n  /**\n   * Input parameters for the ticker types API.\n   */\n  export type TickerTypesInput = {\n    /** Filter by asset class. */\n    asset_class?: ASSET_CLASS\n\n    /** Filter by locale. */\n    locale?: string\n  }\n\n  /**\n   * Output parameters for the ticker types API.\n   */\n  export interface TickerTypesOutput {\n    /** The total number of results for this request. */\n    count: number\n\n    /** A request ID assigned by the server. */\n    request_id: string\n\n    /** The results of the query. */\n    results: TickerType[]\n\n    /** The status of this request's response. */\n    status: string\n  }\n\n  /**\n   * Ticker type parameters.\n   */\n  export interface TickerType {\n    /** An identifier for a group of similar financial instruments. */\n    asset_class: ASSET_CLASS\n\n    /** A code used by Polygon.io to refer to this ticker type. */\n    code: string\n\n    /** A short description of this ticker type. */\n    description: string\n\n    /** An identifier for a geographical location. */\n    locale: string\n  }\n\n  /**\n   * Input parameters for the ticker news API.\n   */\n  export type TickerNewsInput = {\n    /** Ticker symbol to return results for. */\n    ticker: string\n\n    /** Date to return results published on, before, or after. */\n    published_utc?: string\n\n    /** Order results based on the sort field. */\n    order?: ORDER_TYPE\n\n    /** Limit the number of results returned, default is 10 and max is 1000. */\n    limit?: number\n\n    /** Sort field used for ordering. */\n    sort?: string\n  }\n\n  /**\n   * Output parameters for the ticker news API.\n   */\n  export interface TickerNewsOutput {\n    /** The total number of results for this request. */\n    count: number\n\n    /** If present, this value can be used to fetch the next page of data. */\n    next_url: string\n\n    /** A request id assigned by the server. */\n    request_id: string\n\n    /** The results of the query. */\n    results: TickerNews[]\n\n    /** The status of this request's response. */\n    status: string\n  }\n\n  /**\n   * Ticker news parameters.\n   */\n  export interface TickerNews {\n    /** The mobile friendly Accelerated Mobile Page (AMP) URL. */\n    amp_url?: string\n\n    /** A link to the news article. */\n    article_url: string\n\n    /** The article's author. */\n    author: string\n\n    /** A description of the article. */\n    description?: string\n\n    /** Unique identifier for the article. */\n    id: string\n\n    /** The article's image URL. */\n    image_url?: string\n\n    /** The keywords associated with the article (which will vary depending on the publishing source). */\n    keywords?: string[]\n\n    /** The date the article was published on. */\n    published_utc: string\n\n    /** The publisher's details. */\n    publisher: Publisher\n\n    /** The ticker symbols associated with the article. */\n    tickers: string[]\n\n    /** The title of the news article. */\n    title: string\n  }\n\n  /**\n   * Publisher parameters.\n   */\n  export interface Publisher {\n    /** The publisher's homepage favicon URL. */\n    favicon_url?: string\n\n    /** The publisher's homepage URL. */\n    homepage_url: string\n\n    /** The publisher's logo URL. */\n    logo_url: string\n\n    /** The publisher's name. */\n    name: string\n  }\n\n  /**\n   * Input parameters for the exchanges API.\n   */\n  export type ExchangesInput = {\n    /** Filter by asset class. */\n    asset_class?: ASSET_CLASS\n\n    /** Filter by locale. */\n    locale?: string\n  }\n\n  /**\n   * Output parameters for the exchanges API.\n   */\n  export interface ExchangesOutput {\n    /** The total number of results for this request. */\n    count: number\n\n    /** A request ID assigned by the server. */\n    request_id: string\n\n    /** The results of the query. */\n    results: Exchange[]\n\n    /** The status of this request's response. */\n    status: string\n  }\n\n  /**\n   * Exchange parameters.\n   */\n  export interface Exchange {\n    /** A commonly used abbreviation for this exchange. */\n    acronym?: string\n\n    /** An identifier for a group of similar financial instruments. */\n    asset_class: ASSET_CLASS\n\n    /** A unique identifier used by Polygon.io for this exchange. */\n    id: number\n\n    /** An identifier for a geographical location. */\n    locale: 'us' | 'global'\n\n    /** The Market Identifer Code of this exchange (see ISO 10383). */\n    mic: string\n\n    /** Name of this exchange. */\n    name: string\n\n    /** The MIC of the entity that operates this exchange. */\n    operating_mic: string\n\n    /** The ID used by SIP's to represent this exchange. */\n    participant_id?: string\n\n    /** Represents the type of exchange. */\n    type: 'exchange' | 'TRF' | 'SIP'\n\n    /** A link to this exchange's website, if one exists. */\n    url?: string\n  }\n}\n\n/**\n * Client for the Polygon.io API that lets you query the latest market data\n * from all US stock exchanges. You can also find data on company financials,\n * stock market holidays, corporate actions, and more.\n *\n * @see {@link https://polygon.io/docs}\n */\nexport class PolygonClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('POLYGON_API_KEY'),\n    apiBaseUrl = polygon.API_BASE_URL,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'PolygonClient missing required \"apiKey\" (defaults to \"POLYGON_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl,\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Returns detailed information about a single ticker.\n   *\n   * @param params - input parameters (`ticker` symbol and optional `date`)\n   * @returns promise that resolves to detailed information about a single ticker\n   */\n  async tickerDetails(params: polygon.TickerDetailsInput) {\n    let searchParams\n    if (params.date) {\n      searchParams = {\n        date: params.date\n      }\n    }\n\n    return this.ky\n      .get(`v3/reference/tickers/${params.ticker}`, {\n        searchParams\n      })\n      .json<polygon.TickerDetailsOutput>()\n  }\n\n  /**\n   * Returns the open, close and after hours prices of a stock symbol on a certain date.\n   *\n   * @param params - input parameters (`ticker` symbol and `date`)\n   * @returns promise that resolves to the open, close and after hours prices of a stock symbol on a certain date\n   */\n  async dailyOpenClose(params: polygon.DailyOpenCloseInput) {\n    return this.ky\n      .get(`v1/open-close/${params.ticker}/${params.date}`, {\n        searchParams: {\n          adjusted: params.adjusted ?? true\n        }\n      })\n      .json<polygon.DailyOpenCloseOutput>()\n  }\n\n  /**\n   * Returns the previous day's open, high, low, and close (OHLC) for the specified stock ticker.\n   *\n   * @param ticker - ticker symbol of the stock/equity\n   * @param adjusted - whether or not the results are adjusted for splits\n   * @returns promise that resolves to the previous day's open, high, low, and close (OHLC) for the specified stock ticker\n   */\n  async previousClose(ticker: string, adjusted = true) {\n    return this.ky\n      .get(`v2/aggs/ticker/${ticker}/prev`, {\n        searchParams: {\n          adjusted\n        }\n      })\n      .json<polygon.PreviousCloseOutput>()\n  }\n\n  /**\n   * Get the simple moving average (SMA) for a ticker symbol over a given time range.\n   *\n   * @param params - input parameters\n   * @returns promise that resolves to the simple moving average (SMA) for a ticker symbol over a given time range\n   */\n  async sma(params: polygon.IndicatorInput) {\n    return this.ky\n      .get(`v1/indicators/sma/${params.ticker}`, {\n        searchParams: params\n      })\n      .json<polygon.IndicatorOutput>()\n  }\n\n  /**\n   * Get the exponential moving average (EMA) for a ticker symbol over a given time range.\n   *\n   * @param params - input parameters\n   * @returns promise that resolves to the exponential moving average (EMA) for a ticker symbol over a given time range\n   */\n  async ema(params: polygon.IndicatorInput) {\n    return this.ky\n      .get(`v1/indicators/ema/${params.ticker}`, {\n        searchParams: params\n      })\n      .json<polygon.IndicatorOutput>()\n  }\n\n  /**\n   * Get moving average convergence/divergence (MACD) for a ticker symbol over a given time range.\n   *\n   * @param params - input parameters\n   * @returns promise that resolves to the moving average convergence/divergence (MACD) for a ticker symbol over a given time range\n   */\n  async macd(params: polygon.IndicatorInput) {\n    return this.ky\n      .get(`v1/indicators/ema/${params.ticker}`, {\n        searchParams: params\n      })\n      .json<polygon.IndicatorOutput>()\n  }\n\n  /**\n   * Get the relative strength index (RSI) for a ticker symbol over a given time range.\n   *\n   * @param params - input parameters\n   * @returns promise that resolves to the relative strength index (RSI) for a ticker symbol over a given time range\n   */\n  async rsi(params: polygon.IndicatorInput) {\n    return this.ky\n      .get(`v1/indicators/rsi/${params.ticker}`, {\n        searchParams: params\n      })\n      .json<polygon.IndicatorOutput>()\n  }\n\n  /**\n   * Query all ticker symbols which are supported by Polygon.io. Currently includes Stocks/Equities, Indices, Forex, and Crypto.\n   *\n   * @param params - input parameters to filter the list of ticker symbols\n   * @returns promise that resolves to a list of ticker symbols and their details\n   */\n  async tickers(params: polygon.TickerInput): Promise<polygon.TickerOutput> {\n    return this.ky\n      .get('v3/reference/tickers', { searchParams: params })\n      .json<polygon.TickerOutput>()\n  }\n\n  /**\n   * List all ticker types that Polygon.io has.\n   *\n   * @param params - input parameters (`asset_class` and `locale`)\n   * @returns promise that resolves to ticker types\n   */\n  async tickerTypes(params: polygon.TickerTypesInput = {}) {\n    return this.ky\n      .get('v3/reference/tickers/types', { searchParams: params })\n      .json<polygon.TickerTypesOutput>()\n  }\n\n  /**\n   * Get the most recent news articles relating to a stock ticker symbol.\n   *\n   * @param params - input parameters (`ticker`, `published_utc`, `order`, `limit`, `sort`)\n   * @returns promise that resolves to ticker news\n   */\n  async tickerNews(params: polygon.TickerNewsInput) {\n    return this.ky\n      .get('v2/reference/news', { searchParams: params })\n      .json<polygon.TickerNewsOutput>()\n  }\n\n  /**\n   * Returns the current trading status of the exchanges and overall financial markets.\n   *\n   * @returns promise that resolves to the market status\n   */\n  async marketStatus() {\n    return this.ky.get('v1/marketstatus/now').json<polygon.MarketStatusOutput>()\n  }\n\n  /**\n   * Gets upcoming market holidays and their open/close times.\n   *\n   * @returns promise that resolves to an array of market holidays\n   */\n  async marketHolidays(): Promise<polygon.MarketHolidayOutput[]> {\n    return this.ky\n      .get('v1/marketstatus/upcoming')\n      .json<polygon.MarketHolidayOutput[]>()\n  }\n\n  /**\n   * List all exchanges that Polygon.io knows about.\n   *\n   * @param params - input parameters (`asset_class`, `locale`)\n   * @returns promise that resolves to list of exchanges\n   */\n  async exchanges(params: polygon.ExchangesInput = {}) {\n    return this.ky\n      .get('v3/reference/exchanges', { searchParams: params })\n      .json<polygon.ExchangesOutput>()\n  }\n\n  /**\n   * Get aggregate bars for a stock over a given date range in custom time window sizes.\n   *\n   * @param params - input parameters\n   * @returns promise that resolves to list of aggregates\n   */\n  async aggregates(params: polygon.AggregatesInput) {\n    const { ticker, multiplier, timespan, from, to, ...otherParams } = params\n    const endpoint = `v2/aggs/ticker/${ticker}/range/${multiplier}/${timespan}/${from}/${to}`\n    return this.ky\n      .get(endpoint, { searchParams: otherParams })\n      .json<polygon.AggregatesOutput>()\n  }\n\n  /**\n   * Get the daily open, high, low, and close (OHLC) for the entire markets.\n   *\n   * @param assetClass - the asset class to get data for\n   * @param params - input parameters (`date`, `adjusted`)\n   * @returns promise that resolves to list of aggregates\n   */\n  async groupedDaily(\n    assetClass: polygon.ASSET_CLASS,\n    params: polygon.GroupedDailyInput\n  ) {\n    const { date, ...otherParams } = params\n    const endpoint = `v2/aggs/grouped/locale/us/market/${assetClass}/${date}`\n    return this.ky\n      .get(endpoint, { searchParams: otherParams })\n      .json<polygon.GroupedDailyOutput>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/polygon/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/predict-leads/package.json",
    "content": "{\n  \"name\": \"@agentic/predict-leads\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Predict Leads.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/predict-leads\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/predict-leads/src/index.ts",
    "content": "export * from './predict-leads-client'\n"
  },
  {
    "path": "legacy/packages/predict-leads/src/predict-leads-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  type DeepNullable,\n  getEnv,\n  pruneUndefined,\n  sanitizeSearchParams,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\n// TODO: improve `domain` validation for fast-fail\n\nexport namespace predictleads {\n  // Allow up to 20 requests per minute by default.\n  export const throttle = pThrottle({\n    limit: 20,\n    interval: 60 * 1000\n  })\n\n  export const DEFAULT_PAGE_SIZE = 100\n  export const MAX_PAGE_SIZE = 1000\n\n  export type Meta = DeepNullable<{\n    count: number\n    message?: string | null\n    message_type?: string\n  }>\n\n  export type GenericSuccessResponse = {\n    success: {\n      type: string\n      message: string\n    }\n  }\n\n  export type FollowedCompaniesResponse = {\n    data: DeepNullable<\n      Array<{\n        domain: string\n        custom_company_identifier: string | null\n      }>\n    >\n    meta: Meta\n  }\n\n  export type Relationship = Record<\n    string,\n    {\n      data: {\n        id: string\n        type: string\n      }\n    }\n  >\n\n  export type AdditionalData = {\n    relationships: {\n      companies: [string, string]\n    }\n    date: string\n    location: string\n    location_data: {\n      region?: string\n      continent?: string\n      country?: string\n      state?: string\n      zip_code?: string\n      city?: string\n      fuzzy_match?: boolean\n    }\n    contact?: string\n    job_title?: string\n    product?: string\n    product_tags?: string[]\n    amount?: number\n    recognition?: string\n    assets?: string\n    asset_tags?: string[]\n    headcount?: number\n    award?: string\n    financing_type?: string\n    financing_type_tags?: string[]\n    funding_round?: string\n    division?: string\n    conference?: string\n    vulnerability?: string\n    planning?: boolean\n    article_title?: string\n    article_sentence?: string\n    article_body?: string\n    article_source?: string\n    article_published_at?: string\n    article_image_url?: string\n  }\n\n  export type Event = {\n    id: string\n    type: string\n    attributes: {\n      categories: string[]\n      title: string\n      url: string\n      found_at: string\n      additional_data: AdditionalData\n      domain: string\n      location: string\n      location_data: {\n        state: string\n        country: string\n      }\n      company_name: string\n      friendly_company_name: string\n      ticker: null\n      meta_title: string\n      meta_description: string\n      published_at: string\n      post_type: string\n      post_url: string\n      company_domain: string\n      fuzzy_match: boolean\n    }\n    relationships: Relationship\n  }\n\n  export type Response = DeepNullable<{\n    data: Event[]\n    included: Relationship\n    meta: Meta\n  }>\n\n  export type JobOpeningData = {\n    id: string\n    type: string\n    attributes: {\n      title: string\n      url: string\n      description: string\n      salary: string\n      salary_data: {\n        salary_low: number\n        salary_high: number\n        salary_currency: string\n        salary_low_usd: number\n        salary_high_usd: number\n        salary_time_unit: string\n      }\n      job_opening_closed: boolean\n      location: string\n      contract_types: string[]\n      first_seen_at: string\n      last_seen_at: string\n      last_processed_at: string\n      categories: string[]\n      onet_code: string\n      additional_data: {\n        job_title_seniority: string\n        tags: string[]\n        location_data: {\n          country: string\n          city: string\n          fuzzy_match: boolean\n        }\n      }\n    }\n    relationships: {\n      company: {\n        data: {\n          id: string\n          type: string\n        }\n      }\n    }\n  }\n\n  export type CompanyData = {\n    id: string\n    type: string\n    attributes: {\n      domain: string\n      company_name: string\n      ticker: string | null\n    }\n  }\n\n  export type JobOpeningResponse = DeepNullable<{\n    data: JobOpeningData[]\n    included: CompanyData[]\n    meta: {\n      count: number\n    }\n  }>\n\n  export type JobOpeningByIdResponse = Omit<JobOpeningResponse, 'meta'>\n\n  export const EventCategorySchema = z\n    .union([\n      z\n        .literal('hires')\n        .describe(\n          'Company hired new executive or senior personnel. (leadership)'\n        ),\n      z\n        .literal('promotes')\n        .describe(\n          'Company promoted existing executive or senior personnel. (leadership)'\n        ),\n      z\n        .literal('leaves')\n        .describe(\n          'Executive or senior personnel left the company. (leadership)'\n        ),\n      z\n        .literal('retires')\n        .describe(\n          'Executive or senior personnel retires from the company. (leadership)'\n        ),\n      z\n        .literal('acquires')\n        .describe('Company acquired other company. (acquisition)'),\n      z\n        .literal('merges_with')\n        .describe('Company merges with other company. (acquisition)'),\n      z\n        .literal('sells_assets_to')\n        .describe(\n          'Company sells assets (like properties or warehouses) to other company. (acquisition)'\n        ),\n      z\n        .literal('expands_offices_to')\n        .describe(\n          'Company opens new offices in another town, state, country or continent. (expansion)'\n        ),\n      z\n        .literal('expands_offices_in')\n        .describe('Company expands existing offices. (expansion)'),\n      z\n        .literal('expands_facilities')\n        .describe(\n          'Company opens new or expands existing facilities like warehouses, data centers, manufacturing plants etc. (expansion)'\n        ),\n      z\n        .literal('opens_new_location')\n        .describe(\n          'Company opens new service location like hotels, restaurants, bars, hospitals etc. (expansion)'\n        ),\n      z\n        .literal('increases_headcount_by')\n        .describe('Company offers new job vacancies. (expansion)'),\n      z\n        .literal('launches')\n        .describe('Company launches new offering. (new_offering)'),\n      z\n        .literal('integrates_with')\n        .describe('Company integrates with other company. (new_offering)'),\n      z\n        .literal('is_developing')\n        .describe(\n          'Company begins development of a new offering. (new_offering)'\n        ),\n      z\n        .literal('receives_financing')\n        .describe(\n          'Company receives investment like venture funding, loan, grant etc. (investment)'\n        ),\n      z\n        .literal('invests_into')\n        .describe('Company invests into other company. (investment)'),\n      z\n        .literal('invests_into_assets')\n        .describe(\n          'Company invests into assets like property, trucks, facilities etc. (investment)'\n        ),\n      z\n        .literal('goes_public')\n        .describe(\n          'Company issues shares to the public for the first time. (investment)'\n        ),\n      z\n        .literal('closes_offices_in')\n        .describe('Company closes existing offices. (cost_cutting)'),\n      z\n        .literal('decreases_headcount_by')\n        .describe('Company lays off employees. (cost_cutting)'),\n      z\n        .literal('partners_with')\n        .describe('Company partners with other company. (partnership)'),\n      z\n        .literal('receives_award')\n        .describe(\n          'Company or person at the company receives an award. (recognition)'\n        ),\n      z\n        .literal('recognized_as')\n        .describe(\n          'Company or person at the company receives recognition. (recognition)'\n        ),\n      z\n        .literal('signs_new_client')\n        .describe('Company signs new client. (contract)'),\n      z\n        .literal('files_suit_against')\n        .describe(\n          'Company files suit against other company. (corporate_challenges)'\n        ),\n      z\n        .literal('has_issues_with')\n        .describe('Company has vulnerability problems. (corporate_challenges)'),\n      z\n        .literal('identified_as_competitor_of')\n        .describe('New or existing competitor was identified. (relational)')\n    ])\n    .describe('Event category')\n  export type EventCategory = z.infer<typeof EventCategorySchema>\n\n  export const CompanyParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company')\n  })\n  export type CompanyParams = z.infer<typeof CompanyParamsSchema>\n\n  export const CompanyEventsParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company'),\n    categories: z.array(EventCategorySchema).optional(),\n    found_at_from: z\n      .string()\n      .optional()\n      .describe('Signals found from specified date (ISO 8601).'),\n    found_at_until: z\n      .string()\n      .optional()\n      .describe('Signals found until specified date (ISO 8601).'),\n    page: z.number().int().default(1).optional(),\n    limit: z\n      .number()\n      .int()\n      .max(MAX_PAGE_SIZE)\n      .default(DEFAULT_PAGE_SIZE)\n      .optional(),\n    with_news_article_bodies: z\n      .boolean()\n      .optional()\n      .describe('Whether or not to include the body contents of news articles.')\n  })\n  export type CompanyEventsParams = z.infer<typeof CompanyEventsParamsSchema>\n\n  export const CompanyFinancingEventsParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company')\n  })\n  export type CompanyFinancingEventsParams = z.infer<\n    typeof CompanyFinancingEventsParamsSchema\n  >\n\n  export const CompanyJobOpeningsParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company'),\n    categories: z.array(EventCategorySchema).optional(),\n    found_at_from: z\n      .string()\n      .optional()\n      .describe('Signals found from specified date (ISO 8601).'),\n    found_at_until: z\n      .string()\n      .optional()\n      .describe('Signals found until specified date (ISO 8601).'),\n    limit: z\n      .number()\n      .int()\n      .max(MAX_PAGE_SIZE)\n      .default(DEFAULT_PAGE_SIZE)\n      .optional(),\n    with_job_descriptions: z\n      .boolean()\n      .optional()\n      .describe('Whether or not to include the full descriptions of the jobs.'),\n    with_description_only: z\n      .boolean()\n      .optional()\n      .describe('If set, only returns job openings with descriptions.'),\n    with_location_only: z\n      .boolean()\n      .optional()\n      .describe('If set, only returns job openings with locations.'),\n    active_only: z\n      .boolean()\n      .optional()\n      .describe(\n        'If set, only returns job openings that are not closed, have `last_seen_at` more recent than 5 days and were found in the last year.'\n      ),\n    not_closed: z\n      .boolean()\n      .optional()\n      .describe(\n        'Similar to `active_only`, but without considering `last_seen_at` timestamp.'\n      )\n  })\n  export type CompanyJobOpeningsParams = z.infer<\n    typeof CompanyJobOpeningsParamsSchema\n  >\n\n  export const CompanyTechnologiesParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company'),\n    categories: z.array(EventCategorySchema).optional(),\n    limit: z\n      .number()\n      .int()\n      .max(MAX_PAGE_SIZE)\n      .default(DEFAULT_PAGE_SIZE)\n      .optional()\n  })\n  export type CompanyTechnologiesParams = z.infer<\n    typeof CompanyTechnologiesParamsSchema\n  >\n\n  export const CompanyConnectionsParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company'),\n    categories: z.array(EventCategorySchema).optional(),\n    limit: z\n      .number()\n      .int()\n      .max(MAX_PAGE_SIZE)\n      .default(DEFAULT_PAGE_SIZE)\n      .optional()\n  })\n  export type CompanyConnectionsParams = z.infer<\n    typeof CompanyConnectionsParamsSchema\n  >\n\n  export const CompanyWebsiteEvolutionParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company'),\n    limit: z\n      .number()\n      .int()\n      .max(MAX_PAGE_SIZE)\n      .default(DEFAULT_PAGE_SIZE)\n      .optional()\n  })\n  export type CompanyWebsiteEvolutionParams = z.infer<\n    typeof CompanyWebsiteEvolutionParamsSchema\n  >\n\n  export const CompanyGitHubReposParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company'),\n    limit: z\n      .number()\n      .int()\n      .max(MAX_PAGE_SIZE)\n      .default(DEFAULT_PAGE_SIZE)\n      .optional()\n  })\n  export type CompanyGitHubReposParams = z.infer<\n    typeof CompanyGitHubReposParamsSchema\n  >\n\n  export const CompanyProductsParamsSchema = z.object({\n    domain: z.string().min(3).describe('domain of the company'),\n    sources: z.array(z.string()).optional(),\n    limit: z\n      .number()\n      .int()\n      .max(MAX_PAGE_SIZE)\n      .default(DEFAULT_PAGE_SIZE)\n      .optional()\n  })\n  export type CompanyProductsParams = z.infer<\n    typeof CompanyProductsParamsSchema\n  >\n}\n\n/**\n * In-depth company data, including signals like fundraising announcemnts,\n * hiring intent, new customers signed, technologies used, product launches,\n * location expansions, awards received, etc.\n *\n * @see https://predictleads.com\n */\nexport class PredictLeadsClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiToken: string\n\n  constructor({\n    apiKey = getEnv('PREDICT_LEADS_API_KEY'),\n    apiToken = getEnv('PREDICT_LEADS_API_TOKEN'),\n    timeoutMs = 30_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiToken?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'PredictLeadsClient missing required \"apiKey\" (defaults to \"PREDICT_LEADS_API_KEY\")'\n    )\n    assert(\n      apiToken,\n      'PredictLeadsClient missing required \"apiToken\" (defaults to \"PREDICT_LEADS_API_TOKEN\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiToken = apiToken\n\n    const throttledKy = throttle ? throttleKy(ky, predictleads.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: 'https://predictleads.com/api',\n      timeout: timeoutMs,\n      headers: {\n        'x-api-key': apiKey,\n        'x-api-token': apiToken\n      }\n    })\n  }\n\n  /**\n   * Returns basic information about a company given its `domain` like location, name, stock ticker, description, etc.\n   */\n  @aiFunction({\n    name: 'get_company',\n    description:\n      'Returns basic information about a company given its `domain` like location, name, stock ticker, description, etc.',\n    inputSchema: predictleads.CompanyParamsSchema\n  })\n  async getCompany(domainOrOpts: string | predictleads.CompanyParams) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky.get(`v2/companies/${domain}`).json<predictleads.Response>()\n  }\n\n  /**\n   * Returns a list of events from news for a given company. Events are found in press releases, industry news, blogs, social media, and other online sources.\n   */\n  @aiFunction({\n    name: 'get_company_events',\n    description:\n      'Returns a list of events from news for a given company. Events are found in press releases, industry news, blogs, social media, and other online sources.',\n    inputSchema: predictleads.CompanyEventsParamsSchema\n  })\n  async getCompanyEvents(\n    domainOrOpts: string | predictleads.CompanyEventsParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const {\n      domain,\n      page = 1,\n      limit = predictleads.DEFAULT_PAGE_SIZE,\n      ...params\n    } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/events`, {\n        searchParams: sanitizeSearchParams({\n          page,\n          limit,\n          ...params\n        })\n      })\n      .json<predictleads.Response>()\n  }\n\n  async getEventById(id: string) {\n    return this.ky.get(`v2/events/${id}`).json<predictleads.Response>()\n  }\n\n  @aiFunction({\n    name: 'get_company_financing_events',\n    description:\n      'Returns a list of financing events for a given company. Financing events include fundraising announcements and quarterly earning reports for public companies. They are sourced from press releases, industry news, blogs, social media, and other online sources.',\n    inputSchema: predictleads.CompanyFinancingEventsParamsSchema\n  })\n  async getCompanyFinancingEvents(\n    domainOrOpts: string | predictleads.CompanyFinancingEventsParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/financing_events`)\n      .json<predictleads.Response>()\n  }\n\n  @aiFunction({\n    name: 'get_company_job_openings',\n    description:\n      'Returns a list of job openings for a given company. Job openings are found on companies’ career sites and job boards.',\n    inputSchema: predictleads.CompanyJobOpeningsParamsSchema\n  })\n  async getCompanyJobOpenings(\n    domainOrOpts: string | predictleads.CompanyJobOpeningsParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/job_openings`, {\n        searchParams: sanitizeSearchParams({\n          limit,\n          ...params\n        })\n      })\n      .json<predictleads.JobOpeningResponse>()\n  }\n\n  async getJobOpeningById(id: string) {\n    return this.ky\n      .get(`v2/job_openings/${id}`)\n      .json<predictleads.JobOpeningByIdResponse>()\n  }\n\n  @aiFunction({\n    name: 'get_company_technologies',\n    description: 'Returns a list of technology providers for a given company.',\n    inputSchema: predictleads.CompanyTechnologiesParamsSchema\n  })\n  async getCompanyTechnologies(\n    domainOrOpts: string | predictleads.CompanyTechnologiesParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/technologies`, {\n        searchParams: sanitizeSearchParams({\n          limit,\n          ...params\n        })\n      })\n      .json<predictleads.Response>()\n  }\n\n  @aiFunction({\n    name: 'get_company_connections',\n    description:\n      'Returns a list of categorized business connections. Business connections can be found via backlinks or logos on /our-customers, /case-studies, /portfolio, /clients etc. pages. Business connections enable you to eg. calculate network health of a company, to build systems when new high value connections are made… Connections can be of many types: partner, vendor, investor, parent…',\n    inputSchema: predictleads.CompanyConnectionsParamsSchema\n  })\n  async getCompanyConnections(\n    domainOrOpts: string | predictleads.CompanyConnectionsParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/connections`, {\n        searchParams: sanitizeSearchParams({\n          limit,\n          ...params\n        })\n      })\n      .json<predictleads.Response>()\n  }\n\n  @aiFunction({\n    name: 'get_company_website_evolution',\n    description:\n      'Returns insights into how a website has changed over time. E.g., when pages like “Blog”, “Privacy policy”, “Pricing”, “Product”, “API Docs”, “Team”, “Support pages” etc were added. This can serve as a proxy to how quickly a website is growing, to determine the growth stage they are at and also to help segment websites.',\n    inputSchema: predictleads.CompanyWebsiteEvolutionParamsSchema\n  })\n  async getCompanyWebsiteEvolution(\n    domainOrOpts: string | predictleads.CompanyWebsiteEvolutionParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/website_evolution`, {\n        searchParams: sanitizeSearchParams({ limit, ...params })\n      })\n      .json<predictleads.Response>()\n  }\n\n  @aiFunction({\n    name: 'get_company_github_repos',\n    description:\n      'Returns insights into how frequently a company is contributing to its public GitHub repositories.',\n    inputSchema: predictleads.CompanyGitHubReposParamsSchema\n  })\n  async getCompanyGitHubRepositories(\n    domainOrOpts: string | predictleads.CompanyGitHubReposParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/github_repositories`, {\n        searchParams: sanitizeSearchParams({ limit, ...params })\n      })\n      .json<predictleads.Response>()\n  }\n\n  @aiFunction({\n    name: 'get_company_products',\n    description:\n      'Returns what kind of products / solutions / features a company is offering.',\n    inputSchema: predictleads.CompanyProductsParamsSchema\n  })\n  async getCompanyProducts(\n    domainOrOpts: string | predictleads.CompanyProductsParams\n  ) {\n    const opts =\n      typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts\n    const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts\n    assert(domain, 'Missing required company \"domain\"')\n\n    return this.ky\n      .get(`v2/companies/${domain}/products`, {\n        searchParams: sanitizeSearchParams({\n          limit,\n          ...params\n        })\n      })\n      .json<predictleads.Response>()\n  }\n\n  async discoverStartupJobsHN(params?: {\n    post_datetime_from?: string\n    post_datetime_until?: string\n    min_score?: string\n    limit?: string\n  }) {\n    return this.ky\n      .get(`v2/discover/startup_platform/jobs_hn`, {\n        searchParams: params\n      })\n      .json<predictleads.Response>()\n  }\n\n  async discoverStartupShowHN(params?: {\n    post_datetime_from?: string\n    post_datetime_until?: string\n    min_score?: string\n    limit?: string\n  }) {\n    return this.ky\n      .get(`v2/discover/startup_platform/show_hn`, {\n        searchParams: params\n      })\n      .json<predictleads.Response>()\n  }\n\n  // --------------------------------------------------------------------------\n  // Stateful endpoints which should generally not be used as AI functions.\n  // --------------------------------------------------------------------------\n\n  async followCompany(domain: string, customCompanyIdentifier?: string) {\n    return this.ky\n      .post(`v2/companies/${domain}/follow`, {\n        json: pruneUndefined({ customCompanyIdentifier })\n      })\n      .json<predictleads.GenericSuccessResponse>()\n  }\n\n  async getFollowingCompanies(limit: number = predictleads.DEFAULT_PAGE_SIZE) {\n    return this.ky\n      .get(`v2/followings`, {\n        searchParams: sanitizeSearchParams({ limit })\n      })\n      .json<predictleads.FollowedCompaniesResponse>()\n  }\n\n  async unfollowCompany(domain: string, customCompanyIdentifier?: string) {\n    return this.ky\n      .post(`v2/companies/${domain}/unfollow`, {\n        json: pruneUndefined({ customCompanyIdentifier })\n      })\n      .json<predictleads.GenericSuccessResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/predict-leads/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/proxycurl/package.json",
    "content": "{\n  \"name\": \"@agentic/proxycurl\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Proxycurl.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/proxycurl\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/proxycurl/src/index.ts",
    "content": "export * from './proxycurl-client'\n"
  },
  {
    "path": "legacy/packages/proxycurl/src/proxycurl-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams,\n  type Simplify,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\n// All proxycurl types are auto-generated from their openapi spec\nexport namespace proxycurl {\n  // Allow up to 300 requests per minute by default (enforced at 5 minute intervals).\n  export const throttle = pThrottle({\n    limit: 1500,\n    interval: 5 * 60 * 1000\n  })\n\n  export const CompanyTypeSchema = z.enum([\n    'EDUCATIONAL',\n    'GOVERNMENT_AGENCY',\n    'NON_PROFIT',\n    'PARTNERSHIP',\n    'PRIVATELY_HELD',\n    'PUBLIC_COMPANY',\n    'SELF_EMPLOYED',\n    'SELF_OWNED'\n  ])\n  export type CompanyType = z.infer<typeof CompanyTypeSchema>\n\n  export const OptionalFieldSchema = z.enum(['exclude', 'include']).optional()\n  export type OptionalField = z.infer<typeof OptionalFieldSchema>\n\n  export const OptionalEnrichFieldSchema = z.enum(['skip', 'enrich']).optional()\n  export type OptionalEnrichField = z.infer<typeof OptionalEnrichFieldSchema>\n\n  export const UseCacheSchema = z.enum(['if-present', 'if-recent']).optional()\n  export type UseCache = z.infer<typeof UseCacheSchema>\n\n  export const FallbackToCacheSchema = z.enum(['on-error', 'never']).optional()\n  export type FallbackToCache = z.infer<typeof FallbackToCacheSchema>\n\n  export const CompanyProfileEndpointParamsQueryClassSchema = z.object({\n    url: z.string(),\n    acquisitions: OptionalFieldSchema,\n    categories: OptionalFieldSchema,\n    exit_data: OptionalFieldSchema,\n    extra: OptionalFieldSchema,\n    funding_data: OptionalFieldSchema,\n    resolve_numeric_id: z.boolean().optional(),\n    fallback_to_cache: FallbackToCacheSchema,\n    use_cache: UseCacheSchema\n  })\n  export type CompanyProfileEndpointParamsQueryClass = z.infer<\n    typeof CompanyProfileEndpointParamsQueryClassSchema\n  >\n\n  /**\n   * Requires one of:\n   * - `facebook_profile_url`\n   * - `linkedin_profile_url`\n   * - `twitter_profile_url`\n   */\n  export const PersonProfileEndpointParamsQueryClassSchema = z.object({\n    facebook_profile_url: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    twitter_profile_url: z.string().optional(),\n    facebook_profile_id: OptionalFieldSchema,\n    twitter_profile_id: OptionalFieldSchema,\n    extra: OptionalFieldSchema,\n    github_profile_id: OptionalFieldSchema,\n    inferred_salary: OptionalFieldSchema,\n    personal_contact_number: OptionalFieldSchema,\n    personal_email: OptionalFieldSchema,\n    skills: OptionalFieldSchema,\n    fallback_to_cache: FallbackToCacheSchema,\n    use_cache: UseCacheSchema\n  })\n  export type PersonProfileEndpointParamsQueryClass = Simplify<\n    z.infer<typeof PersonProfileEndpointParamsQueryClassSchema>\n  >\n\n  export const PersonLookupEndpointParamsQueryClassSchema = z.object({\n    company_domain: z\n      .string()\n      .describe('The domain URL of the company the person works at'),\n    first_name: z.string(),\n    last_name: z.string().optional(),\n    location: z.string().optional(),\n    similarity_checks: z\n      .union([z.literal('include'), z.literal('skip')])\n      .optional(),\n    title: z.string().optional(),\n    enrich_profile: OptionalEnrichFieldSchema\n  })\n  export type PersonLookupEndpointParamsQueryClass = z.infer<\n    typeof PersonLookupEndpointParamsQueryClassSchema\n  >\n\n  export const RoleLookupEndpointParamsQueryClassSchema = z.object({\n    company_name: z.string(),\n    role: z.string(),\n    enrich_profile: OptionalEnrichFieldSchema\n  })\n  export type RoleLookupEndpointParamsQueryClass = z.infer<\n    typeof RoleLookupEndpointParamsQueryClassSchema\n  >\n\n  export const CompanyLookupEndpointParamsQueryClassSchema = z.object({\n    company_domain: z.string().optional(),\n    company_location: z.string().optional(),\n    company_name: z.string().optional(),\n    enrich_profile: OptionalEnrichFieldSchema\n  })\n  export type CompanyLookupEndpointParamsQueryClass = z.infer<\n    typeof CompanyLookupEndpointParamsQueryClassSchema\n  >\n\n  export const ReverseEmailLookupEndpointParamsQueryClassSchema = z.object({\n    email: z.string(),\n    enrich_profile: OptionalEnrichFieldSchema,\n    lookup_depth: z.string().optional()\n  })\n  export type ReverseEmailLookupEndpointParamsQueryClass = z.infer<\n    typeof ReverseEmailLookupEndpointParamsQueryClassSchema\n  >\n\n  export const CompanySearchEndpointParamsQueryClassSchema = z.object({\n    city: z.string().optional(),\n    country: z.string().optional(),\n    description: z.string().optional(),\n    employee_count_max: z.string().optional(),\n    employee_count_min: z.string().optional(),\n    follower_count_max: z.string().optional(),\n    follower_count_min: z.string().optional(),\n    founded_after_year: z.string().optional(),\n    founded_before_year: z.string().optional(),\n    funding_amount_max: z.string().optional(),\n    funding_amount_min: z.string().optional(),\n    funding_raised_after: z.string().optional(),\n    funding_raised_before: z.string().optional(),\n    industry: z.string().optional(),\n    name: z.string().optional(),\n    page_size: z.string().optional(),\n    public_identifier_in_list: z.string().optional(),\n    public_identifier_not_in_list: z.string().optional(),\n    region: z.string().optional(),\n    type: z.string().optional(),\n    enrich_profiles: z.string().optional()\n  })\n  export type CompanySearchEndpointParamsQueryClass = z.infer<\n    typeof CompanySearchEndpointParamsQueryClassSchema\n  >\n\n  export const PersonSearchEndpointParamsQueryClassSchema = z.object({\n    city: z.string().optional(),\n    country: z.string(),\n    current_company_city: z.string().optional(),\n    current_company_country: z.string().optional(),\n    current_company_description: z.string().optional(),\n    current_company_employee_count_max: z.string().optional(),\n    current_company_employee_count_min: z.string().optional(),\n    current_company_follower_count_max: z.string().optional(),\n    current_company_follower_count_min: z.string().optional(),\n    current_company_founded_after_year: z.string().optional(),\n    current_company_founded_before_year: z.string().optional(),\n    current_company_funding_amount_max: z.string().optional(),\n    current_company_funding_amount_min: z.string().optional(),\n    current_company_funding_raised_after: z.string().optional(),\n    current_company_funding_raised_before: z.string().optional(),\n    current_company_industry: z.string().optional(),\n    current_company_linkedin_profile_url: z.string().optional(),\n    current_company_name: z.string().optional(),\n    current_company_region: z.string().optional(),\n    current_company_type: z.string().optional(),\n    current_job_description: z.string().optional(),\n    current_role_after: z.string().optional(),\n    current_role_before: z.string().optional(),\n    current_role_title: z.string().optional(),\n    education_degree_name: z.string().optional(),\n    education_field_of_study: z.string().optional(),\n    education_school_linkedin_profile_url: z.string().optional(),\n    education_school_name: z.string().optional(),\n    enrich_profiles: z.string().optional(),\n    first_name: z.string().optional(),\n    headline: z.string().optional(),\n    industries: z.string().optional(),\n    interests: z.string().optional(),\n    languages: z.string().optional(),\n    last_name: z.string().optional(),\n    linkedin_groups: z.string().optional(),\n    page_size: z.string().optional(),\n    past_company_linkedin_profile_url: z.string().optional(),\n    past_company_name: z.string().optional(),\n    past_job_description: z.string().optional(),\n    past_role_title: z.string().optional(),\n    public_identifier_in_list: z.string().optional(),\n    public_identifier_not_in_list: z.string().optional(),\n    region: z.string().optional(),\n    skills: z.string().optional(),\n    summary: z.string().optional()\n  })\n  export type PersonSearchEndpointParamsQueryClass = z.infer<\n    typeof PersonSearchEndpointParamsQueryClassSchema\n  >\n\n  export const CourseSchema = z.object({\n    name: z.string().optional(),\n    number: z.string().optional()\n  })\n  export type Course = z.infer<typeof CourseSchema>\n\n  export const Date0Schema = z.object({\n    day: z.number().optional(),\n    month: z.number().optional(),\n    year: z.number().optional()\n  })\n  export type Date0 = z.infer<typeof Date0Schema>\n\n  export const PersonExtraSchema = z.object({\n    facebook_profile_id: z.string().optional(),\n    github_profile_id: z.string().optional(),\n    twitter_profile_id: z.string().optional(),\n    website: z.string().optional()\n  })\n  export type PersonExtra = z.infer<typeof PersonExtraSchema>\n\n  export const PeopleAlsoViewedSchema = z.object({\n    link: z.string().optional(),\n    location: z.string().optional(),\n    name: z.string().optional(),\n    summary: z.string().optional()\n  })\n  export type PeopleAlsoViewed = z.infer<typeof PeopleAlsoViewedSchema>\n\n  export const ActivitySchema = z.object({\n    activity_status: z.string().optional(),\n    link: z.string().optional(),\n    title: z.string().optional()\n  })\n  export type Activity = z.infer<typeof ActivitySchema>\n\n  export const PersonGroupSchema = z.object({\n    name: z.string().optional(),\n    profile_pic_url: z.string().optional(),\n    url: z.string().optional()\n  })\n  export type PersonGroup = z.infer<typeof PersonGroupSchema>\n\n  export const InferredSalarySchema = z.object({\n    max: z.number().optional(),\n    min: z.number().optional()\n  })\n  export type InferredSalary = z.infer<typeof InferredSalarySchema>\n\n  export const AffiliatedCompanySchema = z.object({\n    industry: z.string().optional(),\n    link: z.string().optional(),\n    location: z.string().optional(),\n    name: z.string().optional()\n  })\n  export type AffiliatedCompany = z.infer<typeof AffiliatedCompanySchema>\n\n  export const ExitSchema = z.object({\n    crunchbase_profile_url: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    name: z.string().optional()\n  })\n  export type Exit = z.infer<typeof ExitSchema>\n\n  export const InvestorSchema = z.object({\n    linkedin_profile_url: z.string().optional(),\n    name: z.string().optional(),\n    type: z.string().optional()\n  })\n  export type Investor = z.infer<typeof InvestorSchema>\n\n  export const CompanyLocationSchema = z.object({\n    city: z.string().optional(),\n    country: z.string().optional(),\n    is_hq: z.boolean().optional(),\n    line_1: z.string().optional(),\n    postal_code: z.string().optional(),\n    state: z.string().optional()\n  })\n  export type CompanyLocation = z.infer<typeof CompanyLocationSchema>\n\n  export const SimilarCompanySchema = z.object({\n    industry: z.string().optional(),\n    link: z.string().optional(),\n    location: z.string().optional(),\n    name: z.string().optional()\n  })\n  export type SimilarCompany = z.infer<typeof SimilarCompanySchema>\n\n  export const HonourAwardSchema = z.object({\n    description: z.string().optional(),\n    issued_on: Date0Schema.optional(),\n    issuer: z.string().optional(),\n    title: z.string().optional()\n  })\n  export type HonourAward = z.infer<typeof HonourAwardSchema>\n\n  export const AccomplishmentOrgSchema = z.object({\n    description: z.string().optional(),\n    ends_at: Date0Schema.optional(),\n    org_name: z.string().optional(),\n    starts_at: Date0Schema.optional(),\n    title: z.string().optional()\n  })\n  export type AccomplishmentOrg = z.infer<typeof AccomplishmentOrgSchema>\n\n  export const PatentSchema = z.object({\n    application_number: z.string().optional(),\n    description: z.string().optional(),\n    issued_on: Date0Schema.optional(),\n    issuer: z.string().optional(),\n    patent_number: z.string().optional(),\n    title: z.string().optional(),\n    url: z.string().optional()\n  })\n  export type Patent = z.infer<typeof PatentSchema>\n\n  export const ProjectSchema = z.object({\n    description: z.string().optional(),\n    ends_at: Date0Schema.optional(),\n    starts_at: Date0Schema.optional(),\n    title: z.string().optional(),\n    url: z.string().optional()\n  })\n  export type Project = z.infer<typeof ProjectSchema>\n\n  export const PublicationSchema = z.object({\n    description: z.string().optional(),\n    name: z.string().optional(),\n    published_on: Date0Schema.optional(),\n    publisher: z.string().optional(),\n    url: z.string().optional()\n  })\n  export type Publication = z.infer<typeof PublicationSchema>\n\n  export const TestScoreSchema = z.object({\n    date_on: Date0Schema.optional(),\n    description: z.string().optional(),\n    name: z.string().optional(),\n    score: z.string().optional()\n  })\n  export type TestScore = z.infer<typeof TestScoreSchema>\n\n  export const ArticleSchema = z.object({\n    author: z.string().optional(),\n    image_url: z.string().optional(),\n    link: z.string().optional(),\n    published_date: Date0Schema.optional(),\n    title: z.string().optional()\n  })\n  export type Article = z.infer<typeof ArticleSchema>\n\n  export const CertificationSchema = z.object({\n    authority: z.string().optional(),\n    display_source: z.string().optional(),\n    ends_at: Date0Schema.optional(),\n    license_number: z.string().optional(),\n    name: z.string().optional(),\n    starts_at: Date0Schema.optional(),\n    url: z.string().optional()\n  })\n  export type Certification = z.infer<typeof CertificationSchema>\n\n  export const EducationSchema = z.object({\n    activities_and_societies: z.string().optional(),\n    degree_name: z.string().optional(),\n    description: z.string().optional(),\n    ends_at: Date0Schema.optional(),\n    field_of_study: z.string().optional(),\n    grade: z.string().optional(),\n    logo_url: z.string().optional(),\n    school: z.string().optional(),\n    school_facebook_profile_url: z.string().optional(),\n    school_linkedin_profile_url: z.string().optional(),\n    starts_at: Date0Schema.optional()\n  })\n  export type Education = z.infer<typeof EducationSchema>\n\n  export const ExperienceSchema = z.object({\n    company: z.string().optional(),\n    company_facebook_profile_url: z.string().optional(),\n    company_linkedin_profile_url: z.string().optional(),\n    description: z.string().optional(),\n    ends_at: Date0Schema.optional(),\n    location: z.string().optional(),\n    logo_url: z.string().optional(),\n    starts_at: Date0Schema.optional(),\n    title: z.string().optional()\n  })\n  export type Experience = z.infer<typeof ExperienceSchema>\n\n  export const VolunteeringExperienceSchema = z.object({\n    cause: z.string().optional(),\n    company: z.string().optional(),\n    company_linkedin_profile_url: z.string().optional(),\n    description: z.string().optional(),\n    ends_at: Date0Schema.optional(),\n    logo_url: z.string().optional(),\n    starts_at: Date0Schema.optional(),\n    title: z.string().optional()\n  })\n  export type VolunteeringExperience = z.infer<\n    typeof VolunteeringExperienceSchema\n  >\n\n  export const AcquiredCompanySchema = z.object({\n    announced_date: Date0Schema.optional(),\n    crunchbase_profile_url: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    price: z.number().optional()\n  })\n  export type AcquiredCompany = z.infer<typeof AcquiredCompanySchema>\n\n  export const AcquisitorSchema = z.object({\n    announced_date: Date0Schema.optional(),\n    crunchbase_profile_url: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    price: z.number().optional()\n  })\n  export type Acquisitor = z.infer<typeof AcquisitorSchema>\n\n  export const CompanyDetailsSchema = z.object({\n    company_type: z.string().optional(),\n    contact_email: z.string().optional(),\n    crunchbase_profile_url: z.string().optional(),\n    crunchbase_rank: z.number().optional(),\n    facebook_id: z.string().optional(),\n    founding_date: Date0Schema.optional(),\n    ipo_date: Date0Schema.optional(),\n    ipo_status: z.string().optional(),\n    number_of_acquisitions: z.number().optional(),\n    number_of_exits: z.number().optional(),\n    number_of_funding_rounds: z.number().optional(),\n    number_of_investments: z.number().optional(),\n    number_of_investors: z.number().optional(),\n    number_of_lead_investments: z.number().optional(),\n    number_of_lead_investors: z.number().optional(),\n    operating_status: z.string().optional(),\n    phone_number: z.string().optional(),\n    stock_symbol: z.string().optional(),\n    total_fund_raised: z.number().optional(),\n    total_funding_amount: z.number().optional(),\n    twitter_id: z.string().optional()\n  })\n  export type CompanyDetails = z.infer<typeof CompanyDetailsSchema>\n\n  export const FundingSchema = z.object({\n    announced_date: Date0Schema.optional(),\n    funding_type: z.string().optional(),\n    investor_list: z.array(InvestorSchema).optional(),\n    money_raised: z.number().optional(),\n    number_of_investor: z.number().optional()\n  })\n  export type Funding = z.infer<typeof FundingSchema>\n\n  export const CompanyUpdateSchema = z.object({\n    article_link: z.string().optional(),\n    image: z.string().optional(),\n    posted_on: Date0Schema.optional(),\n    text: z.string().optional(),\n    total_likes: z.number().optional()\n  })\n  export type CompanyUpdate = z.infer<typeof CompanyUpdateSchema>\n\n  export const PersonLookupUrlEnrichResultProfileSchema = z.object({\n    accomplishment_courses: z.array(CourseSchema).optional(),\n    accomplishment_honors_awards: z.array(HonourAwardSchema).optional(),\n    accomplishment_organisations: z.array(AccomplishmentOrgSchema).optional(),\n    accomplishment_patents: z.array(PatentSchema).optional(),\n    accomplishment_projects: z.array(ProjectSchema).optional(),\n    accomplishment_publications: z.array(PublicationSchema).optional(),\n    accomplishment_test_scores: z.array(TestScoreSchema).optional(),\n    activities: z.array(ActivitySchema).optional(),\n    articles: z.array(ArticleSchema).optional(),\n    background_cover_image_url: z.string().optional(),\n    birth_date: Date0Schema.optional(),\n    certifications: z.array(CertificationSchema).optional(),\n    city: z.string().optional(),\n    connections: z.number().optional(),\n    country: z.string().optional(),\n    country_full_name: z.string().optional(),\n    education: z.array(EducationSchema).optional(),\n    experiences: z.array(ExperienceSchema).optional(),\n    extra: PersonExtraSchema.optional(),\n    first_name: z.string().optional(),\n    follower_count: z.number().optional(),\n    full_name: z.string().optional(),\n    gender: z.string().optional(),\n    groups: z.array(PersonGroupSchema).optional(),\n    headline: z.string().optional(),\n    industry: z.string().optional(),\n    inferred_salary: InferredSalarySchema.optional(),\n    interests: z.array(z.string()).optional(),\n    languages: z.array(z.string()).optional(),\n    last_name: z.string().optional(),\n    occupation: z.string().optional(),\n    people_also_viewed: z.array(PeopleAlsoViewedSchema).optional(),\n    personal_emails: z.array(z.string()).optional(),\n    personal_numbers: z.array(z.string()).optional(),\n    profile_pic_url: z.string().optional(),\n    public_identifier: z.string().optional(),\n    recommendations: z.array(z.string()).optional(),\n    similarly_named_profiles: z.array(PeopleAlsoViewedSchema).optional(),\n    skills: z.array(z.string()).optional(),\n    state: z.string().optional(),\n    summary: z.string().optional(),\n    volunteer_work: z.array(VolunteeringExperienceSchema).optional()\n  })\n  export type PersonLookupUrlEnrichResultProfile = z.infer<\n    typeof PersonLookupUrlEnrichResultProfileSchema\n  >\n\n  export const RoleSearchEnrichedResultProfileSchema = z.object({\n    accomplishment_courses: z.array(CourseSchema).optional(),\n    accomplishment_honors_awards: z.array(HonourAwardSchema).optional(),\n    accomplishment_organisations: z.array(AccomplishmentOrgSchema).optional(),\n    accomplishment_patents: z.array(PatentSchema).optional(),\n    accomplishment_projects: z.array(ProjectSchema).optional(),\n    accomplishment_publications: z.array(PublicationSchema).optional(),\n    accomplishment_test_scores: z.array(TestScoreSchema).optional(),\n    activities: z.array(ActivitySchema).optional(),\n    articles: z.array(ArticleSchema).optional(),\n    background_cover_image_url: z.string().optional(),\n    birth_date: Date0Schema.optional(),\n    certifications: z.array(CertificationSchema).optional(),\n    city: z.string().optional(),\n    connections: z.number().optional(),\n    country: z.string().optional(),\n    country_full_name: z.string().optional(),\n    education: z.array(EducationSchema).optional(),\n    experiences: z.array(ExperienceSchema).optional(),\n    extra: PersonExtraSchema.optional(),\n    first_name: z.string().optional(),\n    follower_count: z.number().optional(),\n    full_name: z.string().optional(),\n    gender: z.string().optional(),\n    groups: z.array(PersonGroupSchema).optional(),\n    headline: z.string().optional(),\n    industry: z.string().optional(),\n    inferred_salary: InferredSalarySchema.optional(),\n    interests: z.array(z.string()).optional(),\n    languages: z.array(z.string()).optional(),\n    last_name: z.string().optional(),\n    occupation: z.string().optional(),\n    people_also_viewed: z.array(PeopleAlsoViewedSchema).optional(),\n    personal_emails: z.array(z.string()).optional(),\n    personal_numbers: z.array(z.string()).optional(),\n    profile_pic_url: z.string().optional(),\n    public_identifier: z.string().optional(),\n    recommendations: z.array(z.string()).optional(),\n    similarly_named_profiles: z.array(PeopleAlsoViewedSchema).optional(),\n    skills: z.array(z.string()).optional(),\n    state: z.string().optional(),\n    summary: z.string().optional(),\n    volunteer_work: z.array(VolunteeringExperienceSchema).optional()\n  })\n  export type RoleSearchEnrichedResultProfile = z.infer<\n    typeof RoleSearchEnrichedResultProfileSchema\n  >\n\n  export const ReverseEmailUrlEnrichResultProfileSchema = z.object({\n    accomplishment_courses: z.array(CourseSchema).optional(),\n    accomplishment_honors_awards: z.array(HonourAwardSchema).optional(),\n    accomplishment_organisations: z.array(AccomplishmentOrgSchema).optional(),\n    accomplishment_patents: z.array(PatentSchema).optional(),\n    accomplishment_projects: z.array(ProjectSchema).optional(),\n    accomplishment_publications: z.array(PublicationSchema).optional(),\n    accomplishment_test_scores: z.array(TestScoreSchema).optional(),\n    activities: z.array(ActivitySchema).optional(),\n    articles: z.array(ArticleSchema).optional(),\n    background_cover_image_url: z.string().optional(),\n    birth_date: Date0Schema.optional(),\n    certifications: z.array(CertificationSchema).optional(),\n    city: z.string().optional(),\n    connections: z.number().optional(),\n    country: z.string().optional(),\n    country_full_name: z.string().optional(),\n    education: z.array(EducationSchema).optional(),\n    experiences: z.array(ExperienceSchema).optional(),\n    extra: PersonExtraSchema.optional(),\n    first_name: z.string().optional(),\n    follower_count: z.number().optional(),\n    full_name: z.string().optional(),\n    gender: z.string().optional(),\n    groups: z.array(PersonGroupSchema).optional(),\n    headline: z.string().optional(),\n    industry: z.string().optional(),\n    inferred_salary: InferredSalarySchema.optional(),\n    interests: z.array(z.string()).optional(),\n    languages: z.array(z.string()).optional(),\n    last_name: z.string().optional(),\n    occupation: z.string().optional(),\n    people_also_viewed: z.array(PeopleAlsoViewedSchema).optional(),\n    personal_emails: z.array(z.string()).optional(),\n    personal_numbers: z.array(z.string()).optional(),\n    profile_pic_url: z.string().optional(),\n    public_identifier: z.string().optional(),\n    recommendations: z.array(z.string()).optional(),\n    similarly_named_profiles: z.array(PeopleAlsoViewedSchema).optional(),\n    skills: z.array(z.string()).optional(),\n    state: z.string().optional(),\n    summary: z.string().optional(),\n    volunteer_work: z.array(VolunteeringExperienceSchema).optional()\n  })\n  export type ReverseEmailUrlEnrichResultProfile = z.infer<\n    typeof ReverseEmailUrlEnrichResultProfileSchema\n  >\n\n  export const PersonProfileSchema = z.object({\n    accomplishment_courses: z.array(CourseSchema).optional(),\n    accomplishment_honors_awards: z.array(HonourAwardSchema).optional(),\n    accomplishment_organisations: z.array(AccomplishmentOrgSchema).optional(),\n    accomplishment_patents: z.array(PatentSchema).optional(),\n    accomplishment_projects: z.array(ProjectSchema).optional(),\n    accomplishment_publications: z.array(PublicationSchema).optional(),\n    accomplishment_test_scores: z.array(TestScoreSchema).optional(),\n    activities: z.array(ActivitySchema).optional(),\n    articles: z.array(ArticleSchema).optional(),\n    background_cover_image_url: z.string().optional(),\n    birth_date: Date0Schema.optional(),\n    certifications: z.array(CertificationSchema).optional(),\n    city: z.string().optional(),\n    connections: z.number().optional(),\n    country: z.string().optional(),\n    country_full_name: z.string().optional(),\n    education: z.array(EducationSchema).optional(),\n    experiences: z.array(ExperienceSchema).optional(),\n    first_name: z.string().optional(),\n    follower_count: z.number().optional(),\n    full_name: z.string().optional(),\n    gender: z.string().optional(),\n    groups: z.array(PersonGroupSchema).optional(),\n    headline: z.string().optional(),\n    industry: z.string().optional(),\n    inferred_salary: InferredSalarySchema.optional(),\n    languages: z.array(z.string()).optional(),\n    last_name: z.string().optional(),\n    occupation: z.string().optional(),\n    people_also_viewed: z.array(PeopleAlsoViewedSchema).optional(),\n    personal_emails: z.array(z.string()).optional(),\n    personal_numbers: z.array(z.string()).optional(),\n    profile_pic_url: z.string().optional(),\n    public_identifier: z.string().optional(),\n    recommendations: z.array(z.string()).optional(),\n    similarly_named_profiles: z.array(PeopleAlsoViewedSchema).optional(),\n    skills: z.array(z.string()).optional(),\n    state: z.string().optional(),\n    summary: z.string().optional(),\n    volunteer_work: z.array(VolunteeringExperienceSchema).optional()\n  })\n  export type PersonProfile = z.infer<typeof PersonProfileSchema>\n\n  export type ResolvedPersonProfile = {\n    profile?: PersonProfile\n    url?: string\n    name_similarity_score?: number\n    company_similarity_score?: number\n    title_similarity_score?: number\n    location_similarity_score?: number\n    last_updated?: string\n  }\n\n  export const AcquisitionSchema = z.object({\n    acquired: z.array(AcquiredCompanySchema).optional(),\n    acquired_by: AcquisitorSchema.optional()\n  })\n  export type Acquisition = z.infer<typeof AcquisitionSchema>\n\n  export const PersonLookupUrlEnrichResultSchema = z.object({\n    company_similarity_score: z.number().optional(),\n    last_updated: z.string().optional(),\n    location_similarity_score: z.number().optional(),\n    name_similarity_score: z.number().optional(),\n    profile: PersonLookupUrlEnrichResultProfileSchema.optional(),\n    title_similarity_score: z.number().optional(),\n    url: z.string().optional()\n  })\n  export type PersonLookupUrlEnrichResult = z.infer<\n    typeof PersonLookupUrlEnrichResultSchema\n  >\n\n  export const RoleSearchEnrichedResultSchema = z.object({\n    last_updated: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    profile: RoleSearchEnrichedResultProfileSchema.optional()\n  })\n  export type RoleSearchEnrichedResult = z.infer<\n    typeof RoleSearchEnrichedResultSchema\n  >\n\n  export const ReverseEmailUrlEnrichResultSchema = z.object({\n    backwards_compatibility_notes: z.string().optional(),\n    facebook_profile_url: z.string().optional(),\n    last_updated: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    profile: ReverseEmailUrlEnrichResultProfileSchema.optional(),\n    similarity_score: z.number().optional(),\n    twitter_profile_url: z.string().optional(),\n    url: z.string().optional()\n  })\n  export type ReverseEmailUrlEnrichResult = z.infer<\n    typeof ReverseEmailUrlEnrichResultSchema\n  >\n\n  export const SearchResultSchema = z.object({\n    last_updated: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    profile: PersonProfileSchema.optional()\n  })\n  export type SearchResult = z.infer<typeof SearchResultSchema>\n\n  export const ResultProfileSchema = z.object({\n    linkedin_url: z.string().optional(),\n    acquisitions: AcquisitionSchema.optional(),\n    affiliated_companies: z.array(AffiliatedCompanySchema).optional(),\n    background_cover_image_url: z.string().optional(),\n    categories: z.array(z.string()).optional(),\n    company_size: z.array(z.number()).optional(),\n    company_size_on_linkedin: z.number().optional(),\n    company_type: CompanyTypeSchema.optional(),\n    customer_list: z.array(z.string()).optional(),\n    description: z.string().optional(),\n    exit_data: z.array(ExitSchema).optional(),\n    extra: CompanyDetailsSchema.optional(),\n    follower_count: z.number().optional(),\n    founded_year: z.number().optional(),\n    funding_data: z.array(FundingSchema).optional(),\n    hq: CompanyLocationSchema.optional(),\n    industry: z.string().optional(),\n    linkedin_internal_id: z.string().optional(),\n    locations: z.array(CompanyLocationSchema).optional(),\n    name: z.string().optional(),\n    profile_pic_url: z.string().optional(),\n    search_id: z.string().optional(),\n    similar_companies: z.array(SimilarCompanySchema).optional(),\n    specialities: z.array(z.string()).optional(),\n    tagline: z.string().optional(),\n    universal_name_id: z.string().optional(),\n    updates: z.array(CompanyUpdateSchema).optional(),\n    website: z.string().optional()\n  })\n  export type CompanyProfile = z.infer<typeof ResultProfileSchema>\n  export type ResolvedCompanyProfile = {\n    url: string\n    last_updated: string\n    profile: CompanyProfile\n  }\n\n  export const CompanyUrlEnrichResultProfileSchema = z.object({\n    acquisitions: AcquisitionSchema.optional(),\n    affiliated_companies: z.array(AffiliatedCompanySchema).optional(),\n    background_cover_image_url: z.string().optional(),\n    categories: z.array(z.string()).optional(),\n    company_size: z.array(z.number()).optional(),\n    company_size_on_linkedin: z.number().optional(),\n    company_type: CompanyTypeSchema.optional(),\n    customer_list: z.array(z.string()).optional(),\n    description: z.string().optional(),\n    exit_data: z.array(ExitSchema).optional(),\n    extra: CompanyDetailsSchema.optional(),\n    follower_count: z.number().optional(),\n    founded_year: z.number().optional(),\n    funding_data: z.array(FundingSchema).optional(),\n    hq: CompanyLocationSchema.optional(),\n    industry: z.string().optional(),\n    linkedin_internal_id: z.string().optional(),\n    locations: z.array(CompanyLocationSchema).optional(),\n    name: z.string().optional(),\n    profile_pic_url: z.string().optional(),\n    search_id: z.string().optional(),\n    similar_companies: z.array(SimilarCompanySchema).optional(),\n    specialities: z.array(z.string()).optional(),\n    tagline: z.string().optional(),\n    universal_name_id: z.string().optional(),\n    updates: z.array(CompanyUpdateSchema).optional(),\n    website: z.string().optional()\n  })\n  export type CompanyUrlEnrichResultProfile = z.infer<\n    typeof CompanyUrlEnrichResultProfileSchema\n  >\n\n  export const PersonSearchResultSchema = z.object({\n    next_page: z.string().optional(),\n    results: z.array(SearchResultSchema).optional(),\n    total_result_count: z.number().optional()\n  })\n  export type PersonSearchResult = z.infer<typeof PersonSearchResultSchema>\n\n  export const CSearchResultSchema = z.object({\n    last_updated: z.string().optional(),\n    linkedin_profile_url: z.string().optional(),\n    profile: ResultProfileSchema.optional()\n  })\n  export type CSearchResult = z.infer<typeof CSearchResultSchema>\n\n  export const CompanyUrlEnrichResultSchema = z.object({\n    last_updated: z.string().optional(),\n    profile: CompanyUrlEnrichResultProfileSchema.optional(),\n    url: z.string().optional()\n  })\n  export type CompanyUrlEnrichResult = z.infer<\n    typeof CompanyUrlEnrichResultSchema\n  >\n\n  export const CompanySearchResultSchema = z.object({\n    next_page: z.string().optional(),\n    results: z.array(CSearchResultSchema).optional(),\n    total_result_count: z.number().optional()\n  })\n  export type CompanySearchResult = z.infer<typeof CompanySearchResultSchema>\n}\n\n/**\n * Pull rich data about people and companies.\n *\n * Essentially a wrapper around LinkedIn & Crunchbase.\n *\n * @see https://nubela.co/proxycurl/\n */\nexport class ProxycurlClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('PROXYCURL_API_KEY'),\n    apiBaseUrl = getEnv('PROXYCURL_API_BASE_URL') ??\n      'https://nubela.co/proxycurl',\n    throttle = true,\n    timeoutMs = 60_000,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    throttle?: boolean\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'ProxycurlClient missing required \"apiKey\" (defaults to \"PROXYCURL_API_KEY\")'\n    )\n    assert(\n      apiBaseUrl,\n      'ProxycurlClient missing required \"apiBaseUrl\" (defaults to \"PROXYCURL_API_BASE_URL\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, proxycurl.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        Authorization: `Bearer ${apiKey}`\n      }\n    })\n  }\n\n  /** Gets the LinkedIn profile for a company given it's domain `url`. */\n  @aiFunction({\n    name: 'get_linkedin_company',\n    description:\n      \"Gets the LinkedIn profile for a company given it's domain `url`.\",\n    inputSchema: proxycurl.CompanyProfileEndpointParamsQueryClassSchema\n  })\n  async getLinkedInCompany(\n    opts: proxycurl.CompanyProfileEndpointParamsQueryClass\n  ): Promise<proxycurl.CompanyProfile> {\n    const res = await this.ky\n      .get('api/linkedin/company', {\n        searchParams: sanitizeSearchParams({\n          funding_data: 'include',\n          exit_data: 'include',\n          extra_data: 'include',\n          ...opts\n        })\n      })\n      .json<proxycurl.CompanyProfile>()\n\n    return {\n      linkedin_url: opts.url,\n      ...res\n    }\n  }\n\n  /** Gets the LinkedIn profile for a person given some unique, identifying information about them. */\n  @aiFunction({\n    name: 'get_linkedin_person',\n    description:\n      'Gets the LinkedIn profile for a person given some unique, identifying information about them.',\n    inputSchema: proxycurl.PersonProfileEndpointParamsQueryClassSchema\n  })\n  async getLinkedInPerson(\n    opts: proxycurl.PersonProfileEndpointParamsQueryClass\n  ): Promise<proxycurl.PersonProfile> {\n    return this.ky\n      .get('api/v2/linkedin', {\n        searchParams: sanitizeSearchParams(opts)\n      })\n      .json<proxycurl.PersonProfile>()\n  }\n\n  /** Resolves the LinkedIn profile for a person given their `first_name` and `company_domain` URL. */\n  @aiFunction({\n    name: 'resolve_linkedin_person',\n    description:\n      'Resolves the LinkedIn profile for a person given their `first_name` and `company_domain` URL.',\n    inputSchema: proxycurl.PersonLookupEndpointParamsQueryClassSchema\n  })\n  async resolveLinkedInPerson(\n    opts: proxycurl.PersonLookupEndpointParamsQueryClass\n  ): Promise<proxycurl.ResolvedPersonProfile> {\n    return this.ky\n      .get('api/linkedin/profile/resolve', {\n        searchParams: sanitizeSearchParams({\n          similarity_checks: 'include',\n          enrich_profile: 'enrich',\n          ...opts\n        })\n      })\n      .json<proxycurl.ResolvedPersonProfile>()\n  }\n\n  /** Resolves the LinkedIn profile for a person given their `email`. */\n  @aiFunction({\n    name: 'resolve_linkedin_person_by_email',\n    description:\n      'Resolves the LinkedIn profile for a person given their `email`.',\n    inputSchema: proxycurl.ReverseEmailLookupEndpointParamsQueryClassSchema\n  })\n  async resolveLinkedInPersonByEmail(\n    opts: proxycurl.ReverseEmailLookupEndpointParamsQueryClass\n  ) {\n    return this.ky\n      .get('api/linkedin/profile/resolve/email', {\n        searchParams: sanitizeSearchParams({\n          enrich_profile: 'enrich',\n          ...opts\n        })\n      })\n      .json<proxycurl.ReverseEmailUrlEnrichResult>()\n  }\n\n  /** Resolves the LinkedIn profile for a person at a given `company_name` and `role`. */\n  @aiFunction({\n    name: 'resolve_linkedin_person_at_company_by_role',\n    description:\n      'Resolves the LinkedIn profile for a person at a given `company_name` and `role`.',\n    inputSchema: proxycurl.RoleLookupEndpointParamsQueryClassSchema\n  })\n  async resolveLinkedInPersonAtCompanyByRole(\n    opts: proxycurl.RoleLookupEndpointParamsQueryClass\n  ): Promise<proxycurl.ResolvedPersonProfile> {\n    return this.ky\n      .get('api/find/company/role/', {\n        searchParams: sanitizeSearchParams({\n          enrich_profile: 'enrich',\n          ...opts\n        })\n      })\n      .json<proxycurl.ResolvedPersonProfile>()\n  }\n\n  /** Resolves the LinkedIn profile for a company given the `company_name` and/or `company_domain`. */\n  @aiFunction({\n    name: 'resolve_linkedin_company',\n    description:\n      'Resolves the LinkedIn profile for a company given the `company_name` and/or `company_domain`.',\n    inputSchema: proxycurl.CompanyLookupEndpointParamsQueryClassSchema\n  })\n  async resolveLinkedInCompany(\n    opts: proxycurl.CompanyLookupEndpointParamsQueryClass\n  ): Promise<proxycurl.CompanyProfile> {\n    const res = await this.ky\n      .get('api/linkedin/company/resolve', {\n        searchParams: sanitizeSearchParams({\n          enrich_profile: 'enrich',\n          ...opts\n        })\n      })\n      .json<proxycurl.ResolvedCompanyProfile>()\n\n    return {\n      linkedin_url: res.url,\n      ...res.profile\n    }\n  }\n\n  /** Searches LinkedIn company profiles based on a set of criteria such as `name`, `industry`, `region`, `description`, `city`, number of employees, founding date, funding raised, etc. */\n  @aiFunction({\n    name: 'search_linkedin_companies',\n    description:\n      'Searches LinkedIn company profiles based on a set of criteria such as `name`, `industry`, `region`, `description`, `city`, number of employees, founding date, funding raised, etc.',\n    inputSchema: proxycurl.CompanySearchEndpointParamsQueryClassSchema\n  })\n  async searchCompanies(opts: proxycurl.CompanySearchEndpointParamsQueryClass) {\n    return this.ky\n      .get('api/v2/search/company', {\n        searchParams: sanitizeSearchParams(opts)\n      })\n      .json<proxycurl.CompanySearchResult>()\n  }\n\n  /** Searches LinkedIn people profiles based on a set of criteria such as `country`, `first_name`, `last_name`, `current_company_name`, `headline`, `industries`, `past_company_name`, `summary`, `city`, `education_school_name`, etc. */\n  @aiFunction({\n    name: 'search_linkedin_people',\n    description:\n      'Searches LinkedIn people profiles based on a set of criteria such as `country`, `first_name`, `last_name`, `current_company_name`, `headline`, `industries`, `past_company_name`, `summary`, `city`, `education_school_name`, etc.',\n    inputSchema: proxycurl.PersonSearchEndpointParamsQueryClassSchema\n  })\n  async searchPeople(opts: proxycurl.PersonSearchEndpointParamsQueryClass) {\n    return this.ky\n      .get('api/v2/search/person/', {\n        searchParams: sanitizeSearchParams(opts)\n      })\n      .json<proxycurl.PersonSearchResult>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/proxycurl/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/reddit/package.json",
    "content": "{\n  \"name\": \"@agentic/reddit\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Reddit.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/reddit\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/reddit/src/index.ts",
    "content": "export * from './reddit-client'\n"
  },
  {
    "path": "legacy/packages/reddit/src/reddit-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  pick,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace reddit {\n  export const BASE_URL = 'https://www.reddit.com'\n\n  export interface Post {\n    id: string\n    name: string // name is `t3_<id>`\n    title: string\n    subreddit: string\n    selftext?: string\n    author: string\n    author_fullname: string\n    url: string\n    permalink: string\n    thumbnail?: string\n    thumbnail_width?: number\n    thumbnail_height?: number\n    score: number\n    ups: number\n    downs: number\n    num_comments: number\n    created_utc: number\n    is_self: boolean\n    is_video: boolean\n  }\n\n  export interface FullPost {\n    id: string\n    name: string\n    author: string\n    title: string\n    subreddit: string\n    subreddit_name_prefixed: string\n    score: number\n    approved_at_utc: string | null\n    selftext?: string\n    author_fullname: string\n    is_self: boolean\n    saved: boolean\n    url: string\n    permalink: string\n    mod_reason_title: string | null\n    gilded: number\n    clicked: boolean\n    link_flair_richtext: any[]\n    hidden: boolean\n    pwls: number\n    link_flair_css_class: string\n    downs: number\n    thumbnail_height: any\n    top_awarded_type: any\n    hide_score: boolean\n    quarantine: boolean\n    link_flair_text_color: string\n    upvote_ratio: number\n    author_flair_background_color: any\n    subreddit_type: string\n    ups: number\n    total_awards_received: number\n    media_embed?: any\n    secure_media_embed?: any\n    thumbnail_width: any\n    author_flair_template_id: any\n    is_original_content: boolean\n    user_reports: any[]\n    secure_media: any\n    is_reddit_media_domain: boolean\n    is_meta: boolean\n    category: any\n    link_flair_text: string\n    can_mod_post: boolean\n    approved_by: any\n    is_created_from_ads_ui: boolean\n    author_premium: boolean\n    thumbnail?: string\n    edited: boolean\n    author_flair_css_class: any\n    author_flair_richtext: any[]\n    gildings?: any\n    content_categories: any\n    mod_note: any\n    created: number\n    link_flair_type: string\n    wls: number\n    removed_by_category: any\n    banned_by: any\n    author_flair_type: string\n    domain: string\n    allow_live_comments: boolean\n    selftext_html: string\n    likes: any\n    suggested_sort: any\n    banned_at_utc: any\n    view_count: any\n    archived: boolean\n    no_follow: boolean\n    is_crosspostable: boolean\n    pinned: boolean\n    over_18: boolean\n    all_awardings: any[]\n    awarders: any[]\n    media_only: boolean\n    link_flair_template_id: string\n    can_gild: boolean\n    spoiler: boolean\n    locked: boolean\n    author_flair_text: any\n    treatment_tags: any[]\n    visited: boolean\n    removed_by: any\n    num_reports: any\n    distinguished: any\n    subreddit_id: string\n    author_is_blocked: boolean\n    mod_reason_by: any\n    removal_reason: any\n    link_flair_background_color: string\n    is_robot_indexable: boolean\n    report_reasons: any\n    discussion_type: any\n    num_comments: number\n    send_replies: boolean\n    contest_mode: boolean\n    mod_reports: any[]\n    author_patreon_flair: boolean\n    author_flair_text_color: any\n    stickied: boolean\n    subreddit_subscribers: number\n    created_utc: number\n    num_crossposts: number\n    media?: any\n    is_video: boolean\n\n    // preview images\n    preview?: {\n      enabled: boolean\n      images: Array<{\n        id: string\n        source: Image\n        resolutions: Image[]\n        variants?: Record<\n          string,\n          {\n            id: string\n            source: Image\n            resolutions: Image[]\n          }\n        >\n      }>\n    }\n  }\n\n  export interface Image {\n    url: string\n    width: number\n    height: number\n  }\n\n  export interface PostT3 {\n    kind: 't3'\n    data: FullPost\n  }\n\n  export interface PostListingResponse {\n    kind: 'Listing'\n    data: {\n      after: string\n      dist: number\n      modhash: string\n      geo_filter?: null\n      children: PostT3[]\n    }\n    before?: null\n  }\n\n  export type PostFilter = 'hot' | 'top' | 'new' | 'rising'\n\n  export type GeoFilter =\n    | 'GLOBAL'\n    | 'US'\n    | 'AR'\n    | 'AU'\n    | 'BG'\n    | 'CA'\n    | 'CL'\n    | 'CO'\n    | 'HR'\n    | 'CZ'\n    | 'FI'\n    | 'FR'\n    | 'DE'\n    | 'GR'\n    | 'HU'\n    | 'IS'\n    | 'IN'\n    | 'IE'\n    | 'IT'\n    | 'JP'\n    | 'MY'\n    | 'MX'\n    | 'NZ'\n    | 'PH'\n    | 'PL'\n    | 'PT'\n    | 'PR'\n    | 'RO'\n    | 'RS'\n    | 'SG'\n    | 'ES'\n    | 'SE'\n    | 'TW'\n    | 'TH'\n    | 'TR'\n    | 'GB'\n    | 'US_WA'\n    | 'US_DE'\n    | 'US_DC'\n    | 'US_WI'\n    | 'US_WV'\n    | 'US_HI'\n    | 'US_FL'\n    | 'US_WY'\n    | 'US_NH'\n    | 'US_NJ'\n    | 'US_NM'\n    | 'US_TX'\n    | 'US_LA'\n    | 'US_NC'\n    | 'US_ND'\n    | 'US_NE'\n    | 'US_TN'\n    | 'US_NY'\n    | 'US_PA'\n    | 'US_CA'\n    | 'US_NV'\n    | 'US_VA'\n    | 'US_CO'\n    | 'US_AK'\n    | 'US_AL'\n    | 'US_AR'\n    | 'US_VT'\n    | 'US_IL'\n    | 'US_GA'\n    | 'US_IN'\n    | 'US_IA'\n    | 'US_OK'\n    | 'US_AZ'\n    | 'US_ID'\n    | 'US_CT'\n    | 'US_ME'\n    | 'US_MD'\n    | 'US_MA'\n    | 'US_OH'\n    | 'US_UT'\n    | 'US_MO'\n    | 'US_MN'\n    | 'US_MI'\n    | 'US_RI'\n    | 'US_KS'\n    | 'US_MT'\n    | 'US_MS'\n    | 'US_SC'\n    | 'US_KY'\n    | 'US_OR'\n    | 'US_SD'\n\n  export type TimePeriod = 'hour' | 'day' | 'week' | 'month' | 'year' | 'all'\n\n  export type GetSubredditPostsOptions = {\n    subreddit: string\n    type?: PostFilter\n\n    // Pagination size and offset (count)\n    limit?: number\n    count?: number\n\n    // Pagination by fullnames of posts\n    before?: string\n    after?: string\n\n    /**\n     * Geographical filter. Only applicable to 'hot' posts.\n     */\n    geo?: GeoFilter\n\n    /**\n     * Filter by time period. Only applicable to 'top' posts.\n     */\n    time?: TimePeriod\n  }\n\n  export interface PostListingResult {\n    subreddit: string\n    type: PostFilter\n    geo?: GeoFilter\n    time?: TimePeriod\n    posts: Post[]\n  }\n}\n\n/**\n * Basic readonly Reddit API for fetching top/hot/new/rising posts from subreddits.\n *\n * Uses Reddit's legacy JSON API aimed at RSS feeds.\n *\n * @see https://old.reddit.com/dev/api\n */\nexport class RedditClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly baseUrl: string\n\n  constructor({\n    baseUrl = reddit.BASE_URL,\n    userAgent = 'agentic-reddit-client/1.0.0',\n    timeoutMs = 60_000,\n    ky = defaultKy\n  }: {\n    baseUrl?: string\n    userAgent?: string\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    super()\n\n    this.baseUrl = baseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.baseUrl,\n      timeout: timeoutMs,\n      headers: {\n        'User-Agent': userAgent\n      }\n    })\n  }\n\n  /**\n   * Fetches posts from a subreddit.\n   *\n   * @see https://old.reddit.com/dev/api/#GET_hot\n   */\n  @aiFunction({\n    name: 'get_subreddit_posts',\n    description: 'Fetches posts from a subreddit.',\n    inputSchema: z.object({\n      subreddit: z.string().describe('The subreddit to fetch posts from.'),\n      type: z\n        .union([\n          z.literal('hot'),\n          z.literal('top'),\n          z.literal('new'),\n          z.literal('rising')\n        ])\n        .optional()\n        .describe('Type of posts to fetch (defaults to \"hot\").'),\n      limit: z\n        .number()\n        .int()\n        .max(100)\n        .optional()\n        .describe('Max number of posts to return (defaults to 5).'),\n      count: z\n        .number()\n        .int()\n        .optional()\n        .describe('Number of posts to offset by (defaults to 0).'),\n      time: z\n        .union([\n          z.literal('hour'),\n          z.literal('day'),\n          z.literal('week'),\n          z.literal('month'),\n          z.literal('year'),\n          z.literal('all')\n        ])\n        .optional()\n        .describe(\n          'Time period to filter posts by (defaults to \"all\"). Only applicable to \"top\" posts type.'\n        )\n    })\n  })\n  async getSubredditPosts(\n    subredditOrOpts: string | reddit.GetSubredditPostsOptions\n  ): Promise<reddit.PostListingResult> {\n    const params =\n      typeof subredditOrOpts === 'string'\n        ? { subreddit: subredditOrOpts }\n        : subredditOrOpts\n    const { subreddit, type = 'hot', limit = 5, geo, time, ...opts } = params\n\n    const res = await this.ky\n      .get(`r/${subreddit}/${type}.json`, {\n        searchParams: sanitizeSearchParams({\n          ...opts,\n          limit,\n          g: type === 'hot' ? geo : undefined,\n          t: type === 'top' ? time : undefined\n        })\n      })\n      .json<reddit.PostListingResponse>()\n\n    return {\n      subreddit,\n      type,\n      geo: type === 'hot' ? geo : undefined,\n      time: type === 'top' ? time : undefined,\n      posts: res.data.children.map((child) => {\n        const post = child.data\n\n        // Trim the post data to only include the bare minimum\n        // TODO: add preview images\n        // TODO: add video media info\n        return {\n          ...pick(\n            post,\n            'id',\n            'name',\n            'title',\n            'subreddit',\n            'selftext',\n            'author',\n            'author_fullname',\n            'url',\n            'permalink',\n            'thumbnail',\n            'thumbnail_width',\n            'thumbnail_height',\n            'score',\n            'ups',\n            'downs',\n            'num_comments',\n            'created_utc',\n            'is_self',\n            'is_video'\n          ),\n          permalink: `${this.baseUrl}${post.permalink}`,\n          thumbnail:\n            post.thumbnail !== 'self' &&\n            post.thumbnail !== 'default' &&\n            post.thumbnail !== 'spoiler' &&\n            post.thumbnail !== 'nsfw'\n              ? post.thumbnail\n              : undefined\n        }\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/reddit/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/rocketreach/package.json",
    "content": "{\n  \"name\": \"@agentic/rocketreach\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for RocketReach.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/rocketreach\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/rocketreach/src/index.ts",
    "content": "export * from './rocketreach-client'\n"
  },
  {
    "path": "legacy/packages/rocketreach/src/rocketreach-client.ts",
    "content": "import {\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\n\nexport namespace rocketreach {\n  export const API_BASE_URL = 'https://api.rocketreach.co'\n\n  // Allow up to 5 requests per second by default.\n  export const throttle = pThrottle({\n    limit: 5,\n    interval: 1000\n  })\n\n  export interface EnrichPersonOptions {\n    // RocketReach internal person ID returned by searches.\n    id?: number\n\n    // Must specify along with current_employer.\n    name?: string\n\n    // Must specify along with name.\n    current_employer?: string\n\n    // Desired prospect's job title. May improve match rate.\n    title?: string\n\n    // LinkedIn URL of prospect to lookup.\n    linkedin_url?: string\n\n    // A known email address of the prospect. May improve match rate.\n    email?: string\n\n    // An NPI number for a US healthcare professional. Can be used as a unique match criteria.\n    npi_number?: number\n\n    // Specify an alternative lookup type to use (if available).\n    lookup_type?:\n      | 'standard'\n      | 'premium'\n      | 'premium (feeds disabled)'\n      | 'bulk'\n      | 'phone'\n      | 'enrich'\n  }\n\n  export interface Person {\n    id: number\n    status: string\n    name: string\n    profile_pic: string\n    linkedin_url: string\n    links: Record<string, string>\n    location: string\n    current_title: string\n    current_employer: string\n    current_employer_id: number\n    current_employer_domain: string\n    current_employer_website: string\n    current_employer_linkedin_url: string\n    job_history: JobHistory[]\n    education: Education[]\n    skills: string[]\n    birth_year: number\n    region_latitude: number\n    region_longitude: number\n    city: string\n    region: string\n    country: string\n    country_code: string\n    npi_data: NpiData\n    recommended_email: string\n    recommended_personal_email: string\n    recommended_professional_email: string\n    current_work_email: string\n    current_personal_email: string\n    emails: Email[]\n    phones: Phone[]\n    profile_list: ProfileList\n  }\n\n  export interface ProfileList {\n    id: number\n    name: string\n  }\n\n  export interface JobHistory {\n    start_date: string\n    end_date: string\n    company: string\n    company_name: string\n    company_id: number\n    company_linkedin_url: string\n    department: string\n    title: string\n    highest_level: string\n    description: string\n    last_updated: string\n    sub_department: string\n    is_current: boolean\n  }\n\n  export interface Education {\n    major: string\n    school: string\n    degree: string\n    start: number\n    end: number\n  }\n\n  export interface NpiData {\n    npi_number: string\n    credentials: string\n    license_number: string\n    specialization: string\n  }\n\n  export interface Email {\n    email: string\n    smtp_valid: string\n    type: string\n    last_validation_check: string\n    grade: string\n  }\n\n  export interface Phone {\n    number: string\n    type: string\n    validity: string\n    recommended: boolean\n    premium: boolean\n    last_checked: string\n  }\n}\n\n/**\n * RocketReach is a B2B person and company enrichment API.\n *\n * @see https://rocketreach.co/api/v2/docs\n */\nexport class RocketReachClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('ROCKETREACH_API_KEY'),\n    apiBaseUrl = rocketreach.API_BASE_URL,\n    timeoutMs = 60_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      `RocketReachClient missing required \"apiKey\" (defaults to \"ROCKETREACH_API_KEY\")`\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, rocketreach.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        'Api-Key': apiKey\n      }\n    })\n  }\n\n  async lookupPerson(opts: rocketreach.EnrichPersonOptions) {\n    return this.ky\n      .get('api/v2/person/lookup', { searchParams: sanitizeSearchParams(opts) })\n      .json<rocketreach.Person>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/rocketreach/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/searxng/package.json",
    "content": "{\n  \"name\": \"@agentic/searxng\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the SearXNG meta search engine.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/searxng\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/searxng/src/index.ts",
    "content": "export * from './searxng-client'\n"
  },
  {
    "path": "legacy/packages/searxng/src/searxng-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  omit,\n  pick,\n  pruneUndefined\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace searxng {\n  export const SearchCategorySchema = z.enum([\n    'general',\n    'images',\n    'videos',\n    'news',\n    'map',\n    'music',\n    'it',\n    'science',\n    'files',\n    'social media'\n  ])\n  export type SearchCategory = z.infer<typeof SearchCategorySchema>\n\n  export const SearchEngineSchema = z.enum([\n    '9gag',\n    'annas archive',\n    'apk mirror',\n    'apple app store',\n    'ahmia',\n    'anaconda',\n    'arch linux wiki',\n    'artic',\n    'arxiv',\n    'ask',\n    'bandcamp',\n    'wikipedia',\n    'bilibili',\n    'bing',\n    'bing images',\n    'bing news',\n    'bing videos',\n    'bitbucket',\n    'bpb',\n    'btdigg',\n    'ccc-tv',\n    'openverse',\n    'chefkoch',\n    'crossref',\n    'crowdview',\n    'yep',\n    'yep images',\n    'yep news',\n    'curlie',\n    'currency',\n    'bahnhof',\n    'deezer',\n    'destatis',\n    'deviantart',\n    'ddg definitions',\n    'docker hub',\n    'erowid',\n    'wikidata',\n    'duckduckgo',\n    'duckduckgo images',\n    'duckduckgo videos',\n    'duckduckgo news',\n    'duckduckgo weather',\n    'apple maps',\n    'emojipedia',\n    'tineye',\n    'etymonline',\n    '1x',\n    'fdroid',\n    'flickr',\n    'free software directory',\n    'frinkiac',\n    'fyyd',\n    'genius',\n    'gentoo',\n    'gitlab',\n    'github',\n    'codeberg',\n    'goodreads',\n    'google',\n    'google images',\n    'google news',\n    'google videos',\n    'google scholar',\n    'google play apps',\n    'google play movies',\n    'material icons',\n    'gpodder',\n    'habrahabr',\n    'hackernews',\n    'hoogle',\n    'imdb',\n    'imgur',\n    'ina',\n    'invidious',\n    'jisho',\n    'kickass',\n    'lemmy communities',\n    'lemmy users',\n    'lemmy posts',\n    'lemmy comments',\n    'library genesis',\n    'z-library',\n    'library of congress',\n    'lingva',\n    'lobste.rs',\n    'mastodon users',\n    'mastodon hashtags',\n    'mdn',\n    'metacpan',\n    'mixcloud',\n    'mozhi',\n    'mwmbl',\n    'npm',\n    'nyaa',\n    'mankier',\n    'odysee',\n    'openairedatasets',\n    'openairepublications',\n    'openstreetmap',\n    'openrepos',\n    'packagist',\n    'pdbe',\n    'photon',\n    'pinterest',\n    'piped',\n    'piped.music',\n    'piratebay',\n    'podcastindex',\n    'presearch',\n    'presearch images',\n    'presearch videos',\n    'presearch news',\n    'pub.dev',\n    'pubmed',\n    'pypi',\n    'qwant',\n    'qwant news',\n    'qwant images',\n    'qwant videos',\n    'radio browser',\n    'reddit',\n    'rottentomatoes',\n    'sepiasearch',\n    'soundcloud',\n    'stackoverflow',\n    'askubuntu',\n    'internetarchivescholar',\n    'superuser',\n    'searchcode code',\n    'semantic scholar',\n    'startpage',\n    'tokyotoshokan',\n    'solidtorrents',\n    'tagesschau',\n    'tmdb',\n    'torch',\n    'unsplash',\n    'yandex music',\n    'yahoo',\n    'yahoo news',\n    'youtube',\n    'dailymotion',\n    'vimeo',\n    'wiby',\n    'alexandria',\n    'wikibooks',\n    'wikinews',\n    'wikiquote',\n    'wikisource',\n    'wikispecies',\n    'wiktionary',\n    'wikiversity',\n    'wikivoyage',\n    'wikicommons.images',\n    'wolframalpha',\n    'dictzone',\n    'mymemory translated',\n    '1337x',\n    'duden',\n    'seznam',\n    'mojeek',\n    'moviepilot',\n    'naver',\n    'rubygems',\n    'peertube',\n    'mediathekviewweb',\n    'yacy',\n    'yacy images',\n    'rumble',\n    'livespace',\n    'wordnik',\n    'woxikon.de synonyme',\n    'seekr news',\n    'seekr images',\n    'seekr videos',\n    'sjp.pwn',\n    'stract',\n    'svgrepo',\n    'tootfinder',\n    'wallhaven',\n    'wikimini',\n    'wttr.in',\n    'yummly',\n    'brave',\n    'brave.images',\n    'brave.videos',\n    'brave.news',\n    'lib.rs',\n    'sourcehut',\n    'goo',\n    'bt4g',\n    'pkg.go.dev'\n  ])\n  export type SearchEngine = z.infer<typeof SearchEngineSchema>\n\n  export const SearchOptionsSchema = z.object({\n    query: z.string().describe('search query'),\n    categories: z\n      .array(SearchCategorySchema)\n      .optional()\n      .describe(\n        'narrows the search to only use search engines in specific categories'\n      ),\n    engines: z\n      .array(SearchEngineSchema)\n      .optional()\n      .describe('narrows the search to only use specific search engines'),\n    language: z.string().optional(),\n    pageno: z.number().int().optional()\n  })\n  export type SearchOptions = z.infer<typeof SearchOptionsSchema>\n\n  export interface SearchResult {\n    title: string\n    url: string\n    img_src?: string\n    thumbnail_src?: string\n    thumbnail?: string\n    content?: string\n    author?: string\n    iframe_src?: string\n    category?: SearchCategory\n    engine?: SearchEngine\n    publishedDate?: string\n  }\n\n  export interface SearchResponse {\n    results: SearchResult[]\n    suggestions: string[]\n    query: string\n  }\n}\n\n/**\n * Open source meta search engine capable of searching across many different\n * sources and search engines.\n *\n * The most important search engines are:\n *\n * - \"reddit\" (Reddit posts)\n * - \"google\" (Google web search)\n * - \"google news\" (Google News search)\n * - \"brave\" (Brave web search)\n * - \"arxiv\" (academic papers)\n * - \"genius\" (Genius.com for song lyrics)\n * - \"imdb\" (movies and TV shows)\n * - \"hackernews\" (Hacker News)\n * - \"wikidata\" (Wikidata)\n * - \"wolframalpha\" (Wolfram Alpha)\n * - \"youtube\" (YouTube videos)\n * - \"github\" (GitHub code and repositories)\n *\n * @see https://docs.searxng.org\n *\n * NOTE: You'll need to run a local instance of Searxng to use this client.\n *\n * See [perplexica](https://github.com/ItzCrazyKns/Perplexica/blob/master/docker-compose.yaml) for an example of how to set this up.\n */\nexport class SearxngClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiBaseUrl = getEnv('SEARXNG_API_BASE_URL'),\n    ky = defaultKy\n  }: {\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiBaseUrl,\n      'SearxngClient missing required \"apiBaseUrl\" (defaults to \"SEARXNG_API_BASE_URL\")'\n    )\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({ prefixUrl: apiBaseUrl })\n  }\n\n  /**\n   * Searches across multiple search engines using a local instance of Searxng. To search only specific engines, use the `engines` parameter.\n   *\n   * The most important search engines are:\n   *\n   * - \"reddit\" (Reddit posts)\n   * - \"google\" (Google web search)\n   * - \"google news\" (Google News search)\n   * - \"brave\" (Brave web search)\n   * - \"arxiv\" (academic papers)\n   * - \"genius\" (Genius.com for song lyrics)\n   * - \"imdb\" (movies and TV shows)\n   * - \"hackernews\" (Hacker News)\n   * - \"wikidata\" (Wikidata)\n   * - \"wolframalpha\" (Wolfram Alpha)\n   * - \"youtube\" (YouTube videos)\n   */\n  @aiFunction({\n    name: 'searxng',\n    description: `Searches across multiple search engines using a local instance of Searxng. To search only specific engines, use the \\`engines\\` parameter.\n\nThe most important search engines are:\n\n- \"reddit\" (Reddit posts)\n- \"google\" (Google web search)\n- \"google news\" (Google News search)\n- \"brave\" (Brave web search)\n- \"arxiv\" (academic papers)\n- \"genius\" (Genius.com for song lyrics)\n- \"imdb\" (movies and TV shows)\n- \"hackernews\" (Hacker News)\n- \"wikidata\" (Wikidata)\n- \"wolframalpha\" (Wolfram Alpha)\n- \"youtube\" (YouTube videos)\n- \"github\" (GitHub code and repositories)\n`,\n    inputSchema: searxng.SearchOptionsSchema\n  })\n  async search({\n    query,\n    ...opts\n  }: searxng.SearchOptions): Promise<searxng.SearchResponse> {\n    const res = await this.ky\n      .get('search', {\n        searchParams: pruneUndefined({\n          ...opts,\n          q: query,\n          categories: opts.categories?.join(','),\n          engines: opts.engines?.join(','),\n          format: 'json'\n        })\n      })\n      .json<searxng.SearchResponse>()\n\n    res.results = res.results?.map(\n      (result: any) =>\n        omit(\n          result,\n          'parsed_url',\n          'engines',\n          'positions',\n          'template'\n        ) as searxng.SearchResult\n    )\n\n    return pick(res, 'results', 'suggestions', 'query')\n  }\n}\n"
  },
  {
    "path": "legacy/packages/searxng/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/slack/package.json",
    "content": "{\n  \"name\": \"@agentic/slack\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Slack.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/slack\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/slack/src/index.ts",
    "content": "export * from './slack'\nexport * from './slack-client'\n"
  },
  {
    "path": "legacy/packages/slack/src/slack-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  delay,\n  getEnv,\n  TimeoutError\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nimport { slack } from './slack'\n\n// TODO: need to expose more aiFunctions\n\n/**\n * Minimal Slack API client for sending and receiving Slack messages.\n *\n * @see https://api.slack.com/docs\n */\nexport class SlackClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly defaultChannel?: string\n\n  constructor({\n    apiKey = getEnv('SLACK_API_KEY'),\n    apiBaseUrl = slack.API_BASE_URL,\n    defaultChannel = getEnv('SLACK_DEFAULT_CHANNEL'),\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    defaultChannel?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'SlackClient missing required \"apiKey\" (defaults to \"SLACK_API_KEY\")'\n    )\n\n    super()\n\n    this.defaultChannel = defaultChannel\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: `Bearer ${apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Sends a message to a channel.\n   */\n  @aiFunction({\n    name: 'slack_send_message',\n    description: 'Sends a slack message to a slack channel',\n    inputSchema: z.object({\n      text: z\n        .string()\n        .describe('Formatted text of the message to be published.'),\n      channel: z\n        .string()\n        .describe(\n          'Channel, private group, or IM channel to send the message to. Can be an encoded ID, or a name.'\n        )\n    })\n  })\n  public async sendMessage(options: slack.PostMessageParams) {\n    if (!options.channel && !this.defaultChannel) {\n      throw new Error('Error no channel specified')\n    }\n\n    return this.ky\n      .post('chat.postMessage', {\n        json: {\n          channel: this.defaultChannel,\n          ...options\n        }\n      })\n      .json<slack.Message>()\n  }\n\n  /**\n   * Fetches a conversation's history of messages and events.\n   */\n  public async fetchConversationHistory(\n    options: slack.ConversationHistoryParams\n  ) {\n    return this.ky\n      .get('conversations.history', {\n        searchParams: options\n      })\n      .json<slack.Replies>()\n  }\n\n  /**\n   * Fetches replies to a message in a channel.\n   */\n  protected async fetchReplies(options: slack.ConversationRepliesParams) {\n    return this.ky\n      .get('conversations.replies', {\n        searchParams: options\n      })\n      .json<slack.Replies>()\n  }\n\n  /**\n   * Returns a list of messages that were sent in a channel after a given\n   * timestamp both directly and in threads.\n   */\n  private async fetchCandidates(channel: string, ts: string) {\n    const history = await this.fetchConversationHistory({ channel })\n    const directReplies = await this.fetchReplies({ channel, ts })\n\n    let candidates: slack.Message[] = []\n\n    if (directReplies.ok) {\n      candidates = candidates.concat(directReplies.messages)\n    }\n\n    if (history.ok) {\n      candidates = candidates.concat(history.messages)\n    }\n\n    // Filter out older messages before the message was sent and drop bot messages:\n    candidates = candidates.filter(\n      (message) => message.ts > ts && !message.bot_id\n    )\n\n    // Sort by timestamp so that the most recent messages come first:\n    candidates.sort((a, b) => {\n      return Number.parseFloat(b.ts) - Number.parseFloat(a.ts)\n    })\n\n    return candidates\n  }\n\n  /**\n   * Sends a message to a channel and waits for a reply to the message, which\n   * is returned if it passes validation.\n   */\n  public async sendMessageAndWaitForReply({\n    text,\n    channel = this.defaultChannel,\n    timeoutMs = slack.DEFAULT_TIMEOUT_MS,\n    intervalMs = slack.DEFAULT_INTERVAL_MS,\n    validate = () => true,\n    stopSignal\n  }: slack.SendAndWaitOptions) {\n    if (!channel) {\n      throw new Error('SlackClient missing required \"channel\"')\n    }\n\n    let aborted = false\n    stopSignal?.addEventListener(\n      'abort',\n      () => {\n        aborted = true\n      },\n      { once: true }\n    )\n\n    const res = await this.sendMessage({ text, channel })\n\n    if (!res.ts) {\n      throw new Error('Missing ts in response')\n    }\n\n    const start = Date.now()\n    let nUserMessages = 0\n\n    do {\n      if (aborted) {\n        const reason = stopSignal?.reason || 'Aborted waiting for reply'\n\n        if (reason instanceof Error) {\n          throw reason\n        } else {\n          throw new TypeError(reason)\n        }\n      }\n\n      const candidates = await this.fetchCandidates(channel, res.ts)\n\n      if (candidates.length > 0) {\n        const candidate = candidates[0]!\n\n        if (validate(candidate)) {\n          return candidate\n        }\n\n        if (nUserMessages !== candidates.length) {\n          await this.sendMessage({\n            text: `Invalid response: ${candidate.text}. Please try again following the instructions.`,\n            channel,\n            thread_ts: candidate.ts\n          })\n        }\n\n        nUserMessages = candidates.length\n      }\n\n      await delay(intervalMs)\n    } while (Date.now() - start < timeoutMs)\n\n    throw new TimeoutError('SlackClient timed out waiting for reply')\n  }\n}\n"
  },
  {
    "path": "legacy/packages/slack/src/slack.ts",
    "content": "export namespace slack {\n  export const API_BASE_URL = 'https://slack.com/api'\n\n  export const DEFAULT_TIMEOUT_MS = 120_000\n  export const DEFAULT_INTERVAL_MS = 5000\n\n  export interface BotProfile {\n    id: string\n    app_id: string\n    name: string\n    icons: Record<string, unknown>\n    deleted: boolean\n    updated: number\n    team_id: string\n  }\n\n  export interface Replies {\n    messages: Message[]\n    has_more: boolean\n    ok: boolean\n    response_metadata: ResponseMetadata\n  }\n\n  export interface Message {\n    bot_id?: string\n    client_msg_id?: string\n    type: string\n    text: string\n    user: string\n    ts: string\n    app_id?: string\n    blocks?: Record<string, unknown>[]\n    reply_count?: number\n    subscribed?: boolean\n    last_read?: string\n    unread_count?: number\n    team?: string\n    thread_ts: string\n    parent_user_id?: string\n    bot_profile?: BotProfile\n  }\n\n  export interface ResponseMetadata {\n    next_cursor: string\n  }\n\n  export type Attachment = {\n    [key: string]: any\n  }\n\n  export type Block = {\n    [key: string]: any\n  }\n\n  /**\n   * Parameters for the Slack API's `chat.postMessage` method.\n   *\n   * @see {@link https://api.slack.com/methods/chat.postMessage}\n   */\n  export type PostMessageParams = {\n    /**\n     * The formatted text of the message to be published.\n     */\n    text: string\n\n    /**\n     * Channel, private group, or IM channel to send the message to. Can be an encoded ID, or a name.\n     */\n    channel?: string\n\n    /**\n     * Provide another message's ts value to make this message a reply. Avoid using a reply's ts value; use its parent instead.\n     */\n    thread_ts?: string\n\n    /**\n     * A JSON-based array of structured attachments, presented as a URL-encoded string.\n     */\n    attachments?: Attachment[]\n\n    /**\n     * A JSON-based array of structured blocks, presented as a URL-encoded string.\n     */\n    blocks?: Block[]\n\n    /**\n     * Emoji to use as the icon for this message. Overrides icon_url.\n     */\n    icon_emoji?: string\n\n    /**\n     * URL to an image to use as the icon for this message.\n     */\n    icon_url?: string\n\n    /**\n     * If set to true, user group handles (to name just one example) will be linked in the message text.\n     */\n    link_names?: boolean\n\n    /**\n     * Change how messages are treated (default: 'none').\n     */\n    parse?: 'full' | 'none'\n\n    /**\n     * Used in conjunction with thread_ts and indicates whether reply should be made visible to everyone in the channel or conversation.\n     */\n    reply_broadcast?: boolean\n\n    /**\n     * Pass true to enable unfurling of primarily text-based content.\n     */\n    unfurl_links?: boolean\n\n    /**\n     * Pass false to disable unfurling of media content.\n     */\n    unfurl_media?: boolean\n\n    /**\n     * Set your bot's user name.\n     */\n    username?: string\n  }\n\n  /**\n   * Parameters for the Slack API's `conversations.history` method.\n   *\n   * @see {@link https://api.slack.com/methods/conversations.history}\n   */\n  export type ConversationHistoryParams = {\n    /**\n     * The conversation ID to fetch history for.\n     */\n    channel: string\n\n    /**\n     * Only messages after this Unix timestamp will be included in results (default: `0`).\n     */\n    oldest?: string\n\n    /**\n     * The cursor value used for pagination of results (default: first page).\n     */\n    cursor?: string\n\n    /**\n     * Only messages before this Unix timestamp will be included in results (default: now).\n     */\n    latest?: string\n\n    /**\n     * The maximum number of items to return (default: `100`).\n     */\n    limit?: number\n\n    /**\n     * Include messages with the oldest or latest timestamps in results. Ignored unless either timestamp is specified (default: `false`).\n     */\n    inclusive?: boolean\n\n    /**\n     * Return all metadata associated with the messages (default: `false`).\n     */\n    include_all_metadata?: boolean\n  }\n\n  /**\n   * Parameters for the Slack API's `conversations.replies` method.\n   *\n   * @see {@link https://api.slack.com/methods/conversations.replies}\n   */\n  export type ConversationRepliesParams = {\n    /**\n     * The conversation ID to fetch the thread from.\n     */\n    channel: string\n\n    /**\n     * Unique identifier of either a thread’s parent message or a message in the thread.\n     *\n     * ### Notes\n     *\n     * -   ts must be the timestamp of an existing message with 0 or more replies.\n     * -   If there are no replies then just the single message referenced by ts will return - it is just an ordinary, unthreaded message.\n     */\n    ts: string\n\n    /**\n     * The cursor value used for pagination of results.\n     * Set this to the `next_cursor` attribute returned by a previous request's response_metadata.\n     */\n    cursor?: string\n\n    /**\n     * Only messages before this Unix timestamp will be included in results.\n     */\n    latest?: string\n\n    /**\n     * Only messages after this Unix timestamp will be included in results.\n     */\n    oddest?: string\n\n    /**\n     * The maximum number of items to return.\n     * Fewer than the requested number of items may be returned, even if the end of the users list hasn't been reached.\n     */\n    limit?: number\n\n    /**\n     * Include messages with the oldest or latest timestamps in results. Ignored unless either timestamp is specified.\n     */\n    inclusive?: boolean\n\n    /**\n     * Return all metadata associated with this message.\n     */\n    include_thread_metadata?: boolean\n  }\n\n  export type SendAndWaitOptions = {\n    /**\n     * The text of the message to send.\n     */\n    text: string\n\n    /**\n     * The ID of the channel to send the message to.\n     */\n    channel?: string\n\n    /**\n     * The timeout in milliseconds to wait for a reply before throwing an error.\n     */\n    timeoutMs?: number\n\n    /**\n     * The interval in milliseconds to poll for replies.\n     */\n    intervalMs?: number\n\n    /**\n     * A function to validate the reply message. If the function returns `true`, the reply is considered valid and the function will return the message. If the function returns `false`, the reply is considered invalid and the function will continue to wait for a reply until the timeout is reached.\n     */\n    validate?: (message: Message) => boolean\n\n    /**\n     * A stop signal from an [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController), which can be used to abort retrying. More specifically, when `AbortController.abort(reason)` is called, the function will throw an error with the `reason` argument as the error message.\n     */\n    stopSignal?: AbortSignal\n  }\n\n  export interface ListChannelsArgs {\n    limit?: number\n    cursor?: string\n  }\n\n  export interface PostMessageArgs {\n    channel_id: string\n    text: string\n  }\n\n  export interface ReplyToThreadArgs {\n    channel_id: string\n    thread_ts: string\n    text: string\n  }\n\n  export interface AddReactionArgs {\n    channel_id: string\n    timestamp: string\n    reaction: string\n  }\n\n  export interface GetChannelHistoryArgs {\n    channel_id: string\n    limit?: number\n  }\n\n  export interface GetThreadRepliesArgs {\n    channel_id: string\n    thread_ts: string\n  }\n\n  export interface GetUsersArgs {\n    cursor?: string\n    limit?: number\n  }\n\n  export interface GetUserProfileArgs {\n    user_id: string\n  }\n}\n"
  },
  {
    "path": "legacy/packages/slack/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/social-data/package.json",
    "content": "{\n  \"name\": \"@agentic/social-data\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for accessing Twitter via Social Data.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/social-data\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/social-data/src/index.ts",
    "content": "export * from './social-data-client'\n"
  },
  {
    "path": "legacy/packages/social-data/src/social-data-client.ts",
    "content": "import {\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\n\n// TODO: need to add `aiFunction` wrappers for each method\n\nexport namespace socialdata {\n  export const API_BASE_URL = 'https:///api.socialdata.tools'\n\n  // Allow up to 120 requests per minute by default.\n  export const throttle = pThrottle({\n    limit: 120,\n    interval: 60 * 1000\n  })\n\n  export type GetTweetByIdOptions = {\n    id: string\n  }\n\n  export type GetUsersByTweetByIdOptions = {\n    tweetId: string\n    cursor?: string\n  }\n\n  export type SearchTweetOptions = {\n    query: string\n    cursor?: string\n    type?: 'Latest' | 'Top'\n  }\n\n  export type SearchUsersOptions = {\n    query: string\n  }\n\n  export type GetUserByIdOptions = {\n    userId: string\n  }\n\n  export type GetUserByUsernameOptions = {\n    username: string\n  }\n\n  export type GetUsersByIdOptions = {\n    userId: string\n    cursor?: string\n  }\n\n  export type UserFollowingOptions = {\n    // The numeric ID of the desired follower.\n    sourceUserId: string\n    // The numeric ID of the desired user being followed.\n    targetUserId: string\n    // Maximum number of followers for target_user to look through.\n    maxCount?: number\n  }\n\n  export type GetTweetsByUserIdOptions = {\n    userId: string\n    cursor?: string\n    replies?: boolean\n  }\n\n  export type TweetResponse = Tweet | ErrorResponse\n  export type UserResponse = User | ErrorResponse\n\n  export type UsersResponse =\n    | {\n        next_cursor: string\n        users: User[]\n      }\n    | ErrorResponse\n\n  export type TweetsResponse =\n    | {\n        next_cursor: string\n        tweets: Tweet[]\n      }\n    | ErrorResponse\n\n  export type UserFollowingResponse = UserFollowingStatus | ErrorResponse\n\n  export interface ErrorResponse {\n    status: 'error'\n    message: string\n  }\n\n  export interface Tweet {\n    tweet_created_at: string\n    id: number\n    id_str: string\n    text: string | null\n    full_text: string\n    source: string\n    truncated: boolean\n    in_reply_to_status_id: number | null\n    in_reply_to_status_id_str: string | null\n    in_reply_to_user_id: number | null\n    in_reply_to_user_id_str: string | null\n    in_reply_to_screen_name: string | null\n    user: User\n    lang: string\n    quoted_status_id: number | null\n    quoted_status_id_str: string | null\n    is_quote_status: boolean\n    is_pinned: boolean\n    quote_count: number\n    reply_count: number\n    retweet_count: number\n    favorite_count: number\n    views_count: number\n    bookmark_count: number\n    quoted_status: Tweet | null\n    retweeted_status: Tweet | null\n    entities: Entities\n  }\n\n  export interface User {\n    id: number\n    id_str: string\n    name: string\n    screen_name: string\n    location: string\n    url: string | null\n    description: string\n    protected: boolean\n    verified: boolean\n    followers_count: number\n    friends_count: number\n    listed_count: number\n    favourites_count: number\n    statuses_count: number\n    created_at: string\n    profile_banner_url: string\n    profile_image_url_https: string\n    can_dm: boolean\n  }\n\n  export interface Entities {\n    urls?: any[]\n    user_mentions?: any[]\n    hashtags?: any[]\n    symbols?: any[]\n    media?: any[]\n    timestamps?: any[]\n  }\n\n  export interface UserFollowingStatus {\n    status: string\n    source_user_id: string\n    target_user_id: string\n    is_following: boolean\n    followers_checked_count: number\n  }\n}\n\n/**\n * SocialData API is a scalable and reliable API that simplifies the process of\n * fetching data from social media websites. At the moment, we only support X\n * (formerly Twitter), but working on adding more integrations.\n *\n * With SocialData API, you can easily retrieve tweets, user profiles, user\n * followers/following and other information without the need for proxies or\n * parsing Twitter responses. This ensures a seamless and hassle-free\n * integration with your application, saving you valuable time and effort.\n *\n * @see https://socialdata.tools\n */\nexport class SocialDataClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('SOCIAL_DATA_API_KEY'),\n    apiBaseUrl = socialdata.API_BASE_URL,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'SocialDataClient missing required \"apiKey\" (defaults to \"SOCIAL_DATA_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, socialdata.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: this.apiBaseUrl,\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Retrieve tweet details.\n   */\n  async getTweetById(idOrOpts: string | socialdata.GetTweetByIdOptions) {\n    const options = typeof idOrOpts === 'string' ? { id: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get('twitter/statuses/show', {\n          searchParams: sanitizeSearchParams(options)\n        })\n        .json<socialdata.TweetResponse>()\n    )\n  }\n\n  /**\n   * Retrieve all users who liked a tweet.\n   */\n  async getUsersWhoLikedTweetById(\n    idOrOpts: string | socialdata.GetUsersByTweetByIdOptions\n  ) {\n    const { tweetId, ...params } =\n      typeof idOrOpts === 'string' ? { tweetId: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get(`twitter/tweets/${tweetId}/liking_users`, {\n          searchParams: sanitizeSearchParams(params)\n        })\n        .json<socialdata.UsersResponse>()\n    )\n  }\n\n  /**\n   * Retrieve all users who retweeted a tweet.\n   */\n  async getUsersWhoRetweetedTweetById(\n    idOrOpts: string | socialdata.GetUsersByTweetByIdOptions\n  ) {\n    const { tweetId, ...params } =\n      typeof idOrOpts === 'string' ? { tweetId: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get(`twitter/tweets/${tweetId}/retweeted_by`, {\n          searchParams: sanitizeSearchParams(params)\n        })\n        .json<socialdata.UsersResponse>()\n    )\n  }\n\n  /**\n   * Returns array of tweets provided by Twitter search page. Typically Twitter\n   * returns ~20 results per page. You can request additional search results by\n   * sending another request to the same endpoint using cursor parameter.\n   *\n   * Search `type` defaults to `Top`.\n   */\n  async searchTweets(queryOrOpts: string | socialdata.SearchTweetOptions) {\n    const options =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get('twitter/search', {\n          searchParams: sanitizeSearchParams({\n            type: 'top',\n            ...options\n          })\n        })\n        .json<socialdata.TweetsResponse>()\n    )\n  }\n\n  /**\n   * Retrieve user profile details by user ID.\n   */\n  async getUserById(idOrOpts: string | socialdata.GetUserByIdOptions) {\n    const { userId } =\n      typeof idOrOpts === 'string' ? { userId: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky.get(`twitter/user/${userId}`).json<socialdata.UserResponse>()\n    )\n  }\n\n  /**\n   * Retrieve user profile details by username.\n   */\n  async getUserByUsername(\n    usernameOrOptions: string | socialdata.GetUserByUsernameOptions\n  ) {\n    const { username } =\n      typeof usernameOrOptions === 'string'\n        ? { username: usernameOrOptions }\n        : usernameOrOptions\n\n    return this._handleResponse(\n      this.ky.get(`twitter/user/${username}`).json<socialdata.UserResponse>()\n    )\n  }\n\n  /**\n   * Returns array of tweets from the user's tweets and replies timeline.\n   * Typically Twitter returns ~20 results per page. You can request additional\n   * search results by sending another request to the same endpoint using\n   * cursor parameter.\n   */\n  async getTweetsByUserId(\n    idOrOpts: string | socialdata.GetTweetsByUserIdOptions\n  ) {\n    const {\n      userId,\n      replies = false,\n      ...params\n    } = typeof idOrOpts === 'string' ? { userId: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get(\n          `twitter/user/${userId}/${replies ? 'tweets-and-replies' : 'tweets'}`,\n          {\n            searchParams: sanitizeSearchParams(params)\n          }\n        )\n        .json<socialdata.TweetsResponse>()\n    )\n  }\n\n  /**\n   * Returns array of tweets from the user's likes timeline. Typically Twitter\n   * returns ~20 results per page. You can request additional search results\n   * by sending another request to the same endpoint using cursor parameter.\n   */\n  async getTweetsLikedByUserId(\n    idOrOpts: string | socialdata.GetTweetsByUserIdOptions\n  ) {\n    const { userId, ...params } =\n      typeof idOrOpts === 'string' ? { userId: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get(`twitter/user/${userId}/likes`, {\n          searchParams: sanitizeSearchParams(params)\n        })\n        .json<socialdata.TweetsResponse>()\n    )\n  }\n\n  /**\n   * Retrieve user followers.\n   */\n  async getFollowersForUserId(\n    idOrOpts: string | socialdata.GetUsersByIdOptions\n  ) {\n    const { userId: user_id, ...params } =\n      typeof idOrOpts === 'string' ? { userId: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get('twitter/followers/list', {\n          searchParams: sanitizeSearchParams({\n            user_id,\n            ...params\n          })\n        })\n        .json<socialdata.UsersResponse>()\n    )\n  }\n\n  /**\n   * Retrieve user followers.\n   */\n  async getFollowingForUserId(\n    idOrOpts: string | socialdata.GetUsersByIdOptions\n  ) {\n    const { userId: user_id, ...params } =\n      typeof idOrOpts === 'string' ? { userId: idOrOpts } : idOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get('twitter/friends/list', {\n          searchParams: sanitizeSearchParams({\n            user_id,\n            ...params\n          })\n        })\n        .json<socialdata.UsersResponse>()\n    )\n  }\n\n  /**\n   * This endpoint provides a convenient way to check if a user is following\n   * another user. This will recursively retrieve all recent followers of\n   * target user (up to [max_count] total results) and check if the\n   * source_user_id is present among the retrieved followers.\n   */\n  async isUserFollowingUser(opts: socialdata.UserFollowingOptions) {\n    const { sourceUserId, targetUserId, ...params } = opts\n\n    return this._handleResponse(\n      this.ky\n        .get(`twitter/user/${sourceUserId}/following/${targetUserId}`, {\n          searchParams: sanitizeSearchParams(params)\n        })\n        .json<socialdata.UserFollowingResponse>()\n    )\n  }\n\n  /**\n   * Returns a list of users with screenname or full name matching the search query.\n   */\n  async searchUsersByUsername(\n    queryOrOpts: string | socialdata.SearchUsersOptions\n  ) {\n    const params =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    return this._handleResponse(\n      this.ky\n        .get('twitter/search-users', {\n          searchParams: sanitizeSearchParams(params)\n        })\n        .json<socialdata.UsersResponse>()\n    )\n  }\n\n  protected async _handleResponse<T extends object | socialdata.ErrorResponse>(\n    resP: Promise<T>\n  ): Promise<Exclude<T, socialdata.ErrorResponse>> {\n    const res = await resP\n\n    if ((res as socialdata.ErrorResponse).status === 'error') {\n      throw new Error((res as socialdata.ErrorResponse).message)\n    }\n\n    return res as unknown as Exclude<T, socialdata.ErrorResponse>\n  }\n}\n"
  },
  {
    "path": "legacy/packages/social-data/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/stdlib/package.json",
    "content": "{\n  \"name\": \"@agentic/stdlib\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Standard library of AI functions which work with any LLM and TypeScript AI SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/stdlib\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/airtable\": \"workspace:*\",\n    \"@agentic/apollo\": \"workspace:*\",\n    \"@agentic/arxiv\": \"workspace:*\",\n    \"@agentic/bing\": \"workspace:*\",\n    \"@agentic/brave-search\": \"workspace:*\",\n    \"@agentic/calculator\": \"workspace:*\",\n    \"@agentic/clearbit\": \"workspace:*\",\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/diffbot\": \"workspace:*\",\n    \"@agentic/duck-duck-go\": \"workspace:*\",\n    \"@agentic/exa\": \"workspace:*\",\n    \"@agentic/firecrawl\": \"workspace:*\",\n    \"@agentic/github\": \"workspace:*\",\n    \"@agentic/google-custom-search\": \"workspace:*\",\n    \"@agentic/google-docs\": \"workspace:*\",\n    \"@agentic/google-drive\": \"workspace:*\",\n    \"@agentic/gravatar\": \"workspace:*\",\n    \"@agentic/hacker-news\": \"workspace:*\",\n    \"@agentic/hunter\": \"workspace:*\",\n    \"@agentic/jina\": \"workspace:*\",\n    \"@agentic/leadmagic\": \"workspace:*\",\n    \"@agentic/midjourney\": \"workspace:*\",\n    \"@agentic/notion\": \"workspace:*\",\n    \"@agentic/novu\": \"workspace:*\",\n    \"@agentic/open-meteo\": \"workspace:*\",\n    \"@agentic/people-data-labs\": \"workspace:*\",\n    \"@agentic/perigon\": \"workspace:*\",\n    \"@agentic/polygon\": \"workspace:*\",\n    \"@agentic/predict-leads\": \"workspace:*\",\n    \"@agentic/proxycurl\": \"workspace:*\",\n    \"@agentic/reddit\": \"workspace:*\",\n    \"@agentic/rocketreach\": \"workspace:*\",\n    \"@agentic/searxng\": \"workspace:*\",\n    \"@agentic/serpapi\": \"workspace:*\",\n    \"@agentic/serper\": \"workspace:*\",\n    \"@agentic/slack\": \"workspace:*\",\n    \"@agentic/social-data\": \"workspace:*\",\n    \"@agentic/tavily\": \"workspace:*\",\n    \"@agentic/twilio\": \"workspace:*\",\n    \"@agentic/twitter\": \"workspace:*\",\n    \"@agentic/typeform\": \"workspace:*\",\n    \"@agentic/weather\": \"workspace:*\",\n    \"@agentic/wikidata\": \"workspace:*\",\n    \"@agentic/wikipedia\": \"workspace:*\",\n    \"@agentic/wolfram-alpha\": \"workspace:*\",\n    \"@agentic/youtube\": \"workspace:*\",\n    \"@agentic/zoominfo\": \"workspace:*\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"keywords\": [\n    \"agentic\",\n    \"ai\",\n    \"sdk\",\n    \"openai\",\n    \"llm\",\n    \"tools\",\n    \"functions\",\n    \"stdlib\",\n    \"standard\",\n    \"library\",\n    \"functions\",\n    \"typescript\",\n    \"agent\",\n    \"agents\",\n    \"ai tools\",\n    \"ai functions\",\n    \"ai function calling\",\n    \"ai tool calling\",\n    \"tool use\"\n  ]\n}\n"
  },
  {
    "path": "legacy/packages/stdlib/src/index.ts",
    "content": "export * from '@agentic/airtable'\nexport * from '@agentic/apollo'\nexport * from '@agentic/arxiv'\nexport * from '@agentic/bing'\nexport * from '@agentic/brave-search'\nexport * from '@agentic/calculator'\nexport * from '@agentic/clearbit'\nexport * from '@agentic/diffbot'\nexport * from '@agentic/duck-duck-go'\nexport * from '@agentic/exa'\nexport * from '@agentic/firecrawl'\nexport * from '@agentic/github'\nexport * from '@agentic/google-custom-search'\nexport * from '@agentic/google-docs'\nexport * from '@agentic/google-drive'\nexport * from '@agentic/gravatar'\nexport * from '@agentic/hacker-news'\nexport * from '@agentic/hunter'\nexport * from '@agentic/jina'\nexport * from '@agentic/leadmagic'\nexport * from '@agentic/midjourney'\nexport * from '@agentic/notion'\nexport * from '@agentic/novu'\nexport * from '@agentic/open-meteo'\nexport * from '@agentic/people-data-labs'\nexport * from '@agentic/perigon'\nexport * from '@agentic/polygon'\nexport * from '@agentic/predict-leads'\nexport * from '@agentic/proxycurl'\nexport * from '@agentic/reddit'\nexport * from '@agentic/rocketreach'\nexport * from '@agentic/searxng'\nexport * from '@agentic/serpapi'\nexport * from '@agentic/serper'\nexport * from '@agentic/slack'\nexport * from '@agentic/social-data'\nexport * from '@agentic/tavily'\nexport * from '@agentic/twilio'\nexport * from '@agentic/twitter'\nexport * from '@agentic/typeform'\nexport * from '@agentic/weather'\nexport * from '@agentic/wikidata'\nexport * from '@agentic/wikipedia'\nexport * from '@agentic/wolfram-alpha'\nexport * from '@agentic/youtube'\nexport * from '@agentic/zoominfo'\n"
  },
  {
    "path": "legacy/packages/stdlib/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/tavily/package.json",
    "content": "{\n  \"name\": \"@agentic/tavily\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Tavily search API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/tavily\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/tavily/src/index.ts",
    "content": "export * from './tavily-client'\n"
  },
  {
    "path": "legacy/packages/tavily/src/tavily-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  pruneNullOrUndefined,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace tavily {\n  export const API_BASE_URL = 'https://api.tavily.com'\n\n  // Allow up to 20 requests per minute by default.\n  export const throttle = pThrottle({\n    limit: 20,\n    interval: 60 * 1000\n  })\n\n  export interface SearchOptions {\n    /** Search query. (required) */\n    query: string\n\n    /**\n     * The category of the search.\n     * This will determine which of our agents willbe used for the search.\n     * Currently, only \"general\" and \"news\" are supported.\n     * Default is \"general\".\n     */\n    topic?: string\n\n    /**\n     * The depth of the search. It can be basic or advanced. Default is basic\n     * for quick results and advanced for indepth high quality results but\n     * longer response time. Advanced calls equals 2 requests.\n     */\n    search_depth?: 'basic' | 'advanced'\n\n    /** Include a synthesized answer in the search results. Default is `false`. */\n    include_answer?: boolean\n\n    /** Include a list of query related images in the response. Default is `false`. */\n    include_images?: boolean\n\n    /** Include raw content in the search results. Default is `false`. */\n    include_raw_content?: boolean\n\n    /** The number of maximum search results to return. Default is `5`. */\n    max_results?: number\n\n    /**\n     * A list of domains to specifically include in the search results.\n     * Default is `undefined`, which includes all domains.\n     */\n    include_domains?: string[]\n\n    /**\n     * A list of domains to specifically exclude from the search results.\n     * Default is `undefined`, which doesn't exclude any domains.\n     */\n    exclude_domains?: string[]\n  }\n\n  export interface SearchResponse {\n    /** The search query. */\n    query: string\n\n    /** A list of sorted search results ranked by relevancy. */\n    results: SearchResult[]\n\n    /** The answer to your search query. */\n    answer?: string\n\n    /** A list of query related image urls. */\n    images?: string[]\n\n    /** A list of suggested research follow up questions related to original query. */\n    follow_up_questions?: string[]\n\n    /** How long it took to generate a response. */\n    response_time: string\n  }\n\n  export interface SearchResult {\n    /** The url of the search result. */\n    url: string\n\n    /** The title of the search result page. */\n    title: string\n\n    /**\n     * The most query related content from the scraped url. We use proprietary\n     * AI and algorithms to extract only the most relevant content from each\n     * url, to optimize for context quality and size.\n     */\n    content: string\n\n    /** The parsed and cleaned HTML of the site. For now includes parsed text only. */\n    raw_content?: string\n\n    /** The relevance score of the search result. */\n    score: string\n  }\n}\n\n/**\n * Tavily provides a web search API tailored for LLMs.\n *\n * @see https://tavily.com\n */\nexport class TavilyClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('TAVILY_API_KEY'),\n    apiBaseUrl = tavily.API_BASE_URL,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'TavilyClient missing required \"apiKey\" (defaults to \"TAVILY_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, tavily.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: this.apiBaseUrl\n    })\n  }\n\n  /**\n   * Searches the web for pages relevant to the given query and summarizes the results.\n   */\n  @aiFunction({\n    name: 'search',\n    description:\n      'Searches the web to find the most relevant pages for a given query and summarizes the results. Very useful for finding up-to-date news and information about any topic.',\n    inputSchema: z.object({\n      query: z\n        .string()\n        .describe('The query to search for. Accepts any Google search query.'),\n      search_depth: z\n        .enum(['basic', 'advanced'])\n        .optional()\n        .describe(\n          'How deep of a search to perform. Use \"basic\" for quick results and \"advanced\" for slower, in-depth results.'\n        ),\n      include_answer: z\n        .boolean()\n        .optional()\n        .describe(\n          'Whether or not to include an answer summary in the results.'\n        ),\n      include_images: z\n        .boolean()\n        .optional()\n        .describe('Whether or not to include images in the results.'),\n      max_results: z\n        .number()\n        .int()\n        .default(5)\n        .optional()\n        .describe('Max number of search results to return.')\n      // include_domains: z\n      //   .array(z.string())\n      //   .optional()\n      //   .describe(\n      //     'List of domains to specifically include in the search results.'\n      //   ),\n      // exclude_domains: z\n      //   .array(z.string())\n      //   .optional()\n      //   .describe(\n      //     'List of domains to specifically exclude from the search results.'\n      //   )\n    })\n  })\n  async search(queryOrOpts: string | tavily.SearchOptions) {\n    const options =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    const res = await this.ky\n      .post('search', {\n        json: {\n          ...options,\n          api_key: this.apiKey\n        }\n      })\n      .json<tavily.SearchResponse>()\n\n    return pruneNullOrUndefined({\n      ...res,\n      results: res.results?.map(pruneNullOrUndefined)\n    })\n  }\n}\n"
  },
  {
    "path": "legacy/packages/tavily/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/twilio/package.json",
    "content": "{\n  \"name\": \"@agentic/twilio\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Twilio.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/twilio\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/twilio/src/index.ts",
    "content": "export * from './twilio-client'\n"
  },
  {
    "path": "legacy/packages/twilio/src/twilio-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  delay,\n  getEnv,\n  TimeoutError\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace twilio {\n  export const CONVERSATION_API_BASE_URL = 'https://conversations.twilio.com/v1'\n\n  export const DEFAULT_TIMEOUT_MS = 1_800_000\n  export const DEFAULT_INTERVAL_MS = 5000\n  export const DEFAULT_BOT_NAME = 'agentic'\n\n  /**\n   * Twilio recommends keeping SMS messages to a length of 320 characters or less, so we'll use that as the maximum.\n   *\n   * @see {@link https://support.twilio.com/hc/en-us/articles/360033806753-Maximum-Message-Length-with-Twilio-Programmable-Messaging}\n   */\n  export const SMS_LENGTH_SOFT_LIMIT = 320\n  export const SMS_LENGTH_HARD_LIMIT = 1600\n\n  export interface Conversation {\n    unique_name?: string\n    date_updated: Date\n    friendly_name: string\n    timers: null\n    account_sid: string\n    url: string\n    state: string\n    date_created: Date\n    messaging_service_sid: string\n    sid: string\n    attributes: string\n    bindings: null\n    chat_service_sid: string\n    links: ConversationLinks\n  }\n\n  export interface ConversationLinks {\n    participants: string\n    messages: string\n    webhooks: string\n  }\n\n  export interface ConversationMessage {\n    body: string\n    index: number\n    author: string\n    date_updated: Date\n    media: null\n    participant_sid: string | null\n    conversation_sid: string\n    account_sid: string\n    delivery: null\n    url: string\n    date_created: Date\n    content_sid: string | null\n    sid: string\n    attributes: string\n    links: {\n      delivery_receipts: string\n    }\n  }\n\n  export interface ConversationParticipant {\n    last_read_message_index: null\n    date_updated: Date\n    last_read_timestamp: null\n    conversation_sid: string\n    account_sid: string\n    url: string\n    date_created: Date\n    role_sid: string\n    sid: string\n    attributes: string\n    identity?: string\n    messaging_binding: ConversationMessagingBinding\n  }\n\n  export interface ConversationMessagingBinding {\n    proxy_address: string\n    type: string\n    address: string\n  }\n\n  export interface ConversationMessages {\n    messages: ConversationMessage[]\n    meta: {\n      page: number\n      page_size: number\n      first_page_url: string\n      previous_page_url: string | null\n      url: string\n      next_page_url: string | null\n      key: string\n    }\n  }\n\n  /**\n   * Participant Conversation Resource.\n   *\n   * This interface represents a participant in a conversation, along with the conversation details.\n   */\n  export interface ParticipantConversation {\n    /** The unique ID of the Account responsible for this conversation. */\n    account_sid: string\n\n    /** The unique ID of the Conversation Service this conversation belongs to. */\n    chat_service_sid: string\n\n    /** The unique ID of the Participant. */\n    participant_sid: string\n\n    /** The unique string that identifies the conversation participant as Conversation User. */\n    participant_user_sid: string\n\n    /**\n     * A unique string identifier for the conversation participant as Conversation User.\n     * This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate.\n     */\n    participant_identity: string\n\n    /**\n     * Information about how this participant exchanges messages with the conversation.\n     * A JSON parameter consisting of type and address fields of the participant.\n     */\n    participant_messaging_binding: object\n\n    /** The unique ID of the Conversation this Participant belongs to. */\n    conversation_sid: string\n\n    /** An application-defined string that uniquely identifies the Conversation resource. */\n    conversation_unique_name: string\n\n    /** The human-readable name of this conversation, limited to 256 characters. */\n    conversation_friendly_name: string\n\n    /**\n     * An optional string metadata field you can use to store any data you wish.\n     * The string value must contain structurally valid JSON if specified.\n     */\n    conversation_attributes: string\n\n    /** The date that this conversation was created, given in ISO 8601 format. */\n    conversation_date_created: string\n\n    /** The date that this conversation was last updated, given in ISO 8601 format. */\n    conversation_date_updated: string\n\n    /** Identity of the creator of this Conversation. */\n    conversation_created_by: string\n\n    /** The current state of this User Conversation. One of inactive, active or closed. */\n    conversation_state: 'inactive' | 'active' | 'closed'\n\n    /** Timer date values representing state update for this conversation. */\n    conversation_timers: object\n\n    /** Contains absolute URLs to access the participant and conversation of this conversation. */\n    links: { participant: string; conversation: string }\n  }\n\n  export type SendAndWaitOptions = {\n    /**\n     * The recipient's phone number in E.164 format (e.g. +14565551234).\n     */\n    recipientPhoneNumber?: string\n\n    /**\n     * The text of the message to send (or an array of strings to send as separate messages).\n     */\n    text: string | string[]\n\n    /**\n     * Friendly name of the conversation.\n     */\n    name: string\n\n    /**\n     * The timeout in milliseconds to wait for a reply before throwing an error.\n     */\n    timeoutMs?: number\n\n    /**\n     * The interval in milliseconds to poll for replies.\n     */\n    intervalMs?: number\n\n    /**\n     * A function to validate the reply message. If the function returns `true`, the reply is considered valid and the function will return the message. If the function returns `false`, the reply is considered invalid and the function will continue to wait for a reply until the timeout is reached.\n     */\n    validate?: (message: ConversationMessage) => boolean\n\n    /**\n     * A stop signal from an [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController), which can be used to abort retrying. More specifically, when `AbortController.abort(reason)` is called, the function will throw an error with the `reason` argument as the error message.\n     */\n    stopSignal?: AbortSignal\n  }\n\n  /**\n   * Chunks a string into an array of chunks.\n   *\n   * @param text - string to chunk\n   * @param maxLength - maximum length of each chunk\n   *\n   * @returns array of chunks\n   */\n  export function chunkString(text: string, maxLength: number): string[] {\n    const words = text.split(' ')\n    const chunks: string[] = []\n    let chunk = ''\n\n    for (const word of words) {\n      if (word.length > maxLength) {\n        // Truncate the word if it's too long and indicate that it was truncated:\n        chunks.push(word.slice(0, Math.max(0, maxLength - 3)) + '...')\n      } else if ((chunk + ' ' + word).length > maxLength) {\n        chunks.push(chunk.trim())\n        chunk = word\n      } else {\n        chunk += (chunk ? ' ' : '') + word\n      }\n    }\n\n    if (chunk) {\n      chunks.push(chunk.trim())\n    }\n\n    return chunks\n  }\n\n  /**\n   * Chunks an array of strings into an array of chunks while preserving\n   * existing sections.\n   *\n   * @param textSections - array of strings to chunk\n   * @param maxLength - maximum length of each chunk\n   *\n   * @returns array of chunks\n   */\n  export function chunkMultipleStrings(\n    textSections: string[],\n    maxLength: number\n  ): string[] {\n    return textSections.flatMap((section) => chunkString(section, maxLength))\n  }\n}\n\n/**\n * A client for interacting with the Twilio Conversations API to send automated\n * messages and wait for replies.\n *\n * @see {@link https://www.twilio.com/docs/conversations/api}\n */\nexport class TwilioClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly phoneNumber: string\n  protected readonly botName: string\n  protected readonly defaultRecipientPhoneNumber?: string\n\n  constructor({\n    accountSid = getEnv('TWILIO_ACCOUNT_SID'),\n    authToken = getEnv('TWILIO_AUTH_TOKEN'),\n    phoneNumber = getEnv('TWILIO_PHONE_NUMBER'),\n    defaultRecipientPhoneNumber = getEnv(\n      'TWILIO_DEFAULT_RECIPIENT_PHONE_NUMBER'\n    ),\n    apiBaseUrl = twilio.CONVERSATION_API_BASE_URL,\n    botName = twilio.DEFAULT_BOT_NAME,\n    ky = defaultKy\n  }: {\n    accountSid?: string\n    authToken?: string\n    phoneNumber?: string\n    defaultRecipientPhoneNumber?: string\n    apiBaseUrl?: string\n    botName?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      accountSid,\n      'TwilioClient missing required \"accountSid\" (defaults to \"TWILIO_ACCOUNT_SID\")'\n    )\n    assert(\n      authToken,\n      'TwilioClient missing required \"authToken\" (defaults to \"TWILIO_AUTH_TOKEN\")'\n    )\n    assert(\n      phoneNumber,\n      'TwilioClient missing required \"phoneNumber\" (defaults to \"TWILIO_PHONE_NUMBER\")'\n    )\n    super()\n\n    if (defaultRecipientPhoneNumber) {\n      this.defaultRecipientPhoneNumber = defaultRecipientPhoneNumber\n    }\n\n    this.botName = botName\n    this.phoneNumber = phoneNumber\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization:\n          'Basic ' +\n          Buffer.from(`${accountSid}:${authToken}`).toString('base64'),\n        'Content-Type': 'application/x-www-form-urlencoded'\n      }\n    })\n  }\n\n  /**\n   * Deletes a conversation and all its messages.\n   */\n  async deleteConversation(conversationSid: string) {\n    return this.ky.delete(`Conversations/${conversationSid}`)\n  }\n\n  /**\n   * Removes a participant from a conversation.\n   */\n  async removeParticipant({\n    conversationSid,\n    participantSid\n  }: {\n    conversationSid: string\n    participantSid: string\n  }) {\n    return this.ky.delete(\n      `Conversations/${conversationSid}/Participants/${participantSid}`\n    )\n  }\n\n  /**\n   * Fetches all conversations a participant as identified by their phone number is a part of.\n   */\n  async findParticipantConversations(participantPhoneNumber: string) {\n    const encodedPhoneNumber = encodeURIComponent(participantPhoneNumber)\n    return this.ky\n      .get(`ParticipantConversations?Address=${encodedPhoneNumber}`)\n      .json<{ conversations: twilio.ParticipantConversation[] }>()\n  }\n\n  /**\n   * Creates a new conversation.\n   */\n  async createConversation(friendlyName: string) {\n    const params = new URLSearchParams()\n    params.set('FriendlyName', friendlyName)\n    return this.ky\n      .post('Conversations', {\n        body: params\n      })\n      .json<twilio.Conversation>()\n  }\n\n  /**\n   * Adds a participant to a conversation.\n   */\n  async addParticipant({\n    conversationSid,\n    recipientPhoneNumber\n  }: {\n    conversationSid: string\n    recipientPhoneNumber: string\n  }) {\n    const params = new URLSearchParams()\n    params.set('MessagingBinding.Address', recipientPhoneNumber)\n    params.set('MessagingBinding.ProxyAddress', this.phoneNumber)\n    return this.ky\n      .post(`Conversations/${conversationSid}/Participants`, {\n        body: params\n      })\n      .json<twilio.ConversationParticipant>()\n  }\n\n  /**\n   * Chunks a long text message into smaller parts and sends them as separate messages.\n   */\n  async sendTextWithChunking({\n    conversationSid,\n    text\n  }: {\n    conversationSid: string\n    text: string | string[]\n    maxChunkLength?: number\n  }) {\n    let chunks\n    if (Array.isArray(text)) {\n      chunks = twilio.chunkMultipleStrings(text, twilio.SMS_LENGTH_SOFT_LIMIT)\n    } else {\n      chunks = twilio.chunkString(text, twilio.SMS_LENGTH_SOFT_LIMIT)\n    }\n\n    const out: twilio.ConversationMessage[] = []\n    for (const chunk of chunks) {\n      const sent = await this.sendMessage({\n        conversationSid,\n        text: chunk\n      })\n      out.push(sent)\n    }\n\n    return out\n  }\n\n  /**\n   * Posts a message to a conversation.\n   */\n  @aiFunction({\n    name: 'twilio_send_message',\n    description:\n      'Sends an text SMS message via the Twilio Conversation API to a specific conversation.',\n    inputSchema: z.object({\n      text: z\n        .string()\n        .describe(\n          'Text of the SMS content to sent. Must be brief as SMS has strict character limits.'\n        ),\n      conversationSid: z\n        .string()\n        .describe('ID of the Twilio Conversation to the send the emssage to.')\n    })\n  })\n  async sendMessage({\n    conversationSid,\n    text\n  }: {\n    conversationSid: string\n    text: string\n  }) {\n    // Truncate the text if it exceeds the hard limit and add an ellipsis:\n    if (text.length > twilio.SMS_LENGTH_HARD_LIMIT) {\n      text =\n        text.slice(0, Math.max(0, twilio.SMS_LENGTH_HARD_LIMIT - 3)) + '...'\n    }\n\n    const params = new URLSearchParams()\n    params.set('Body', text)\n    params.set('Author', this.botName)\n    return this.ky\n      .post(`Conversations/${conversationSid}/Messages`, {\n        body: params\n      })\n      .json<twilio.ConversationMessage>()\n  }\n\n  /**\n   * Fetches all messages in a conversation.\n   */\n  @aiFunction({\n    name: 'twilio_get_messages',\n    description:\n      'Retrieves all SMS messages contained within a specific Twilio Conversation.',\n    inputSchema: z.object({\n      conversationSid: z\n        .string()\n        .describe(\n          'ID of the Twilio Conversation to the retrieve the messages for.'\n        )\n    })\n  })\n  async fetchMessages(\n    conversationSidOrOptions: string | { conversationSid: string }\n  ) {\n    const conversationSid =\n      typeof conversationSidOrOptions === 'string'\n        ? conversationSidOrOptions\n        : conversationSidOrOptions.conversationSid\n\n    return this.ky\n      .get(`Conversations/${conversationSid}/Messages`)\n      .json<twilio.ConversationMessages>()\n  }\n\n  /**\n   * Sends a SMS to a recipient and waits for a reply to the message, which is returned if it passes validation.\n   */\n  public async sendAndWaitForReply({\n    text,\n    name,\n    recipientPhoneNumber = this.defaultRecipientPhoneNumber,\n    timeoutMs = twilio.DEFAULT_TIMEOUT_MS,\n    intervalMs = twilio.DEFAULT_INTERVAL_MS,\n    validate = () => true,\n    stopSignal\n  }: twilio.SendAndWaitOptions) {\n    if (!recipientPhoneNumber) {\n      throw new Error(\n        'TwilioClient error missing required \"recipientPhoneNumber\"'\n      )\n    }\n\n    let aborted = false\n    stopSignal?.addEventListener(\n      'abort',\n      () => {\n        aborted = true\n      },\n      { once: true }\n    )\n\n    const { sid: conversationSid } = await this.createConversation(name)\n\n    // Find and remove participant from conversation they are currently in, if any:\n    const { conversations } =\n      await this.findParticipantConversations(recipientPhoneNumber)\n\n    for (const conversation of conversations) {\n      await this.removeParticipant({\n        conversationSid: conversation.conversation_sid,\n        participantSid: conversation.participant_sid\n      })\n    }\n\n    const { sid: participantSid } = await this.addParticipant({\n      conversationSid,\n      recipientPhoneNumber\n    })\n    await this.sendTextWithChunking({ conversationSid, text })\n\n    const start = Date.now()\n    let nUserMessages = 0\n\n    do {\n      if (aborted) {\n        await this.removeParticipant({ conversationSid, participantSid })\n        const reason = stopSignal?.reason || 'Aborted waiting for reply'\n\n        if (reason instanceof Error) {\n          throw reason\n        } else {\n          throw new TypeError(reason)\n        }\n      }\n\n      const response = await this.fetchMessages(conversationSid)\n      const candidates = response.messages.filter(\n        (message) => message.author !== this.botName\n      )\n\n      if (candidates.length > 0) {\n        const candidate = candidates.at(-1)!\n\n        if (candidate && validate(candidate)) {\n          await this.removeParticipant({ conversationSid, participantSid })\n          return candidate\n        }\n\n        if (nUserMessages !== candidates.length) {\n          await this.sendMessage({\n            text: `Invalid response: ${candidate.body}. Please try again with a valid response format.`,\n            conversationSid\n          })\n        }\n\n        nUserMessages = candidates.length\n      }\n\n      await delay(intervalMs)\n    } while (Date.now() - start < timeoutMs)\n\n    await this.removeParticipant({ conversationSid, participantSid })\n    throw new TimeoutError('Twilio timeout waiting for reply')\n  }\n}\n"
  },
  {
    "path": "legacy/packages/twilio/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/twitter/package.json",
    "content": "{\n  \"name\": \"@agentic/twitter\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Twitter.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/twitter\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@nangohq/node\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\",\n    \"twitter-api-sdk\": \"catalog:\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/twitter/src/client.ts",
    "content": "import { assert, getEnv } from '@agentic/core'\nimport { auth, Client as TwitterV2Client } from 'twitter-api-sdk'\n\nimport { getNango, validateNangoConnectionOAuthScopes } from './nango'\n\n// Auth new Nango accounts here: https://app.nango.dev/connections\n\n// The Twitter OAuth2User class requires a client id, which we don't have\n// since we're using Nango for auth, so instead we just pass a dummy value\n// and allow Nango to handle all auth/refresh/access token management.\nconst dummyTwitterClientId = 'agentic'\n\nexport const defaultTwitterOAuthScopes = [\n  'tweet.read',\n  'users.read',\n  'offline.access',\n  'tweet.write'\n]\n\nasync function createTwitterAuth({\n  scopes,\n  nangoConnectionId,\n  nangoCallbackUrl,\n  nangoProviderConfigKey\n}: {\n  scopes: string[]\n  nangoConnectionId: string\n  nangoCallbackUrl: string\n  nangoProviderConfigKey: string\n}): Promise<auth.OAuth2User> {\n  const nango = getNango()\n  const connection = await nango.getConnection(\n    nangoProviderConfigKey,\n    nangoConnectionId\n  )\n\n  validateNangoConnectionOAuthScopes({\n    connection,\n    scopes\n  })\n\n  const token = connection.credentials.raw\n  assert(token)\n\n  return new auth.OAuth2User({\n    client_id: dummyTwitterClientId,\n    callback: nangoCallbackUrl,\n    scopes: scopes as any[],\n    token\n  })\n}\n\nexport async function createTwitterV2Client({\n  scopes = defaultTwitterOAuthScopes,\n  nangoConnectionId = getEnv('NANGO_CONNECTION_ID'),\n  nangoCallbackUrl = getEnv('NANGO_CALLBACK_URL') ??\n    'https://api.nango.dev/oauth/callback',\n  nangoProviderConfigKey = 'twitter-v2'\n}: {\n  scopes?: string[]\n  nangoConnectionId?: string\n  nangoCallbackUrl?: string\n  nangoProviderConfigKey?: string\n} = {}): Promise<TwitterV2Client> {\n  assert(nangoConnectionId, 'twitter client missing nangoConnectionId')\n  assert(nangoCallbackUrl, 'twitter client missing nangoCallbackUrl')\n\n  // NOTE: Nango handles refreshing the oauth access token for us\n  const twitterAuth = await createTwitterAuth({\n    scopes,\n    nangoConnectionId,\n    nangoCallbackUrl,\n    nangoProviderConfigKey\n  })\n\n  // Twitter API v2 using OAuth 2.0\n  return new TwitterV2Client(twitterAuth)\n}\n"
  },
  {
    "path": "legacy/packages/twitter/src/error.ts",
    "content": "export type TwitterErrorType =\n  | 'twitter:forbidden'\n  | 'twitter:auth'\n  | 'twitter:rate-limit'\n  | 'twitter:unknown'\n  | 'network'\n\nexport class TwitterError extends Error {\n  type: TwitterErrorType\n  isFinal: boolean\n  status?: number\n\n  constructor(\n    message: string,\n    {\n      type,\n      isFinal = false,\n      status,\n      ...opts\n    }: ErrorOptions & {\n      type: TwitterErrorType\n      isFinal?: boolean\n      status?: number\n    }\n  ) {\n    super(message, opts)\n\n    this.type = type\n    this.isFinal = isFinal\n    this.status = status ?? (opts.cause as any)?.status\n  }\n}\n"
  },
  {
    "path": "legacy/packages/twitter/src/index.ts",
    "content": "export * from './client'\nexport * from './error'\nexport * from './nango'\nexport * from './twitter-client'\nexport type * from './types'\nexport * from './utils'\n"
  },
  {
    "path": "legacy/packages/twitter/src/nango.ts",
    "content": "import { getEnv } from '@agentic/core'\nimport { type Connection, Nango } from '@nangohq/node'\n\n// This is intentionally left as a global singleton to avoid re-creating the\n// Nango connection instance on successive calls in serverless environments.\nlet _nango: Nango | null = null\n\nexport function getNango(): Nango {\n  if (!_nango) {\n    const secretKey = getEnv('NANGO_SECRET_KEY')?.trim()\n    if (!secretKey) {\n      throw new Error(`Missing required \"NANGO_SECRET_KEY\"`)\n    }\n\n    _nango = new Nango({ secretKey })\n  }\n\n  return _nango\n}\n\nexport function validateNangoConnectionOAuthScopes({\n  connection,\n  scopes\n}: {\n  connection: Connection\n  scopes: string[]\n}) {\n  const connectionScopes = new Set<string>(\n    (connection.credentials as any).raw.scope.split(' ')\n  )\n  const missingScopes = new Set<string>()\n\n  for (const scope of scopes) {\n    if (!connectionScopes.has(scope)) {\n      missingScopes.add(scope)\n    }\n  }\n\n  if (missingScopes.size > 0) {\n    throw new Error(\n      `Nango connection ${connection.id} is missing required OAuth scopes: ${[\n        ...missingScopes.values()\n      ].join(', ')}`\n    )\n  }\n}\n"
  },
  {
    "path": "legacy/packages/twitter/src/twitter-client.ts",
    "content": "import { aiFunction, AIFunctionsProvider, assert, getEnv } from '@agentic/core'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nimport type * as types from './types'\nimport { handleTwitterError } from './utils'\n\n/**\n * This file contains rate-limited wrappers around all of the core Twitter API\n * methods that this project uses.\n *\n * NOTE: Twitter has different API rate limits and quotas per plan, so in order\n * to rate-limit effectively, our throttles need to either use the lowest common\n * denominator OR vary based on the twitter developer plan you're using. We\n * chose to go with the latter.\n *\n * @see https://docs.x.com/x-api/fundamentals/rate-limits\n */\n\ntype TwitterApiMethod =\n  | 'createTweet'\n  | 'getTweetById'\n  | 'getTweetsById'\n  | 'searchRecentTweets'\n  | 'listTweetMentionsByUserId'\n  | 'listTweetsLikedByUserId'\n  | 'listTweetsByUserId'\n  | 'getUserById'\n  | 'getUserByUsername'\n\nconst TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000\nconst FIFTEEN_MINUTES_MS = 15 * 60 * 1000\n\nconst twitterApiRateLimitsByPlan: Record<\n  types.TwitterApiPlan,\n  Record<\n    TwitterApiMethod,\n    {\n      readonly limit: number\n      readonly interval: number\n    }\n  >\n> = {\n  free: {\n    // 50 per 24h per user\n    // 50 per 24h per app\n    createTweet: { limit: 50, interval: TWENTY_FOUR_HOURS_MS },\n\n    getTweetById: { limit: 1, interval: FIFTEEN_MINUTES_MS },\n    getTweetsById: { limit: 1, interval: FIFTEEN_MINUTES_MS },\n    searchRecentTweets: { limit: 1, interval: FIFTEEN_MINUTES_MS },\n    listTweetMentionsByUserId: { limit: 1, interval: FIFTEEN_MINUTES_MS },\n    listTweetsLikedByUserId: { limit: 1, interval: FIFTEEN_MINUTES_MS },\n    listTweetsByUserId: { limit: 1, interval: FIFTEEN_MINUTES_MS },\n    getUserById: { limit: 1, interval: FIFTEEN_MINUTES_MS },\n    getUserByUsername: { limit: 1, interval: FIFTEEN_MINUTES_MS }\n  },\n\n  basic: {\n    // 100 per 24h per user\n    // 1667 per 24h per app\n    createTweet: { limit: 100, interval: TWENTY_FOUR_HOURS_MS },\n\n    // 15 per 15m per user\n    // 15 per 15m per app\n    getTweetById: { limit: 15, interval: FIFTEEN_MINUTES_MS },\n    getTweetsById: { limit: 15, interval: FIFTEEN_MINUTES_MS },\n\n    // 60 per 15m per user\n    // 60 per 15m per app\n    searchRecentTweets: { limit: 60, interval: FIFTEEN_MINUTES_MS },\n\n    // 10 per 15m per user\n    // 10 per 15m per app\n    listTweetMentionsByUserId: { limit: 180, interval: FIFTEEN_MINUTES_MS },\n\n    // 5 per 15min per user\n    // 5 per 15min per app\n    listTweetsLikedByUserId: { limit: 5, interval: FIFTEEN_MINUTES_MS },\n\n    // 5 per 15min per user\n    // 10 per 15min per app\n    listTweetsByUserId: { limit: 5, interval: FIFTEEN_MINUTES_MS },\n\n    // 100 per 24h per user\n    // 500 per 24h per app\n    getUserById: { limit: 100, interval: TWENTY_FOUR_HOURS_MS },\n    getUserByUsername: { limit: 100, interval: TWENTY_FOUR_HOURS_MS }\n  },\n\n  pro: {\n    // 100 per 15m per user\n    // 10k per 24h per app\n    createTweet: { limit: 100, interval: FIFTEEN_MINUTES_MS },\n\n    // TODO: why would the per-user rate-limit be more than the per-app one?!\n    // 900 per 15m per user\n    // 450 per 15m per app\n    getTweetById: { limit: 450, interval: FIFTEEN_MINUTES_MS },\n    getTweetsById: { limit: 450, interval: FIFTEEN_MINUTES_MS },\n\n    // 300 per 15m per user\n    // 450 per 15m per app\n    searchRecentTweets: { limit: 300, interval: FIFTEEN_MINUTES_MS },\n\n    // 300 per 15m per user\n    // 450 per 15m per app\n    listTweetMentionsByUserId: { limit: 300, interval: FIFTEEN_MINUTES_MS },\n\n    // 75 per 15min per user\n    // 75 per 15min per app\n    listTweetsLikedByUserId: { limit: 75, interval: FIFTEEN_MINUTES_MS },\n\n    // 900 per 15min per user\n    // 1500 per 15min per app\n    listTweetsByUserId: { limit: 900, interval: FIFTEEN_MINUTES_MS },\n\n    // 900 per 15m per user\n    // 300 per 15m per app\n    getUserById: { limit: 300, interval: FIFTEEN_MINUTES_MS },\n    getUserByUsername: { limit: 300, interval: FIFTEEN_MINUTES_MS }\n  },\n\n  enterprise: {\n    // NOTE: these are just placeholders; the enterprise plan seems to be\n    // completely customizable, but it's still useful to define rate limits\n    // for robustness. These values just 10x those of the pro plan.\n    createTweet: { limit: 1000, interval: FIFTEEN_MINUTES_MS },\n\n    getTweetById: { limit: 4500, interval: FIFTEEN_MINUTES_MS },\n    getTweetsById: { limit: 4500, interval: FIFTEEN_MINUTES_MS },\n\n    searchRecentTweets: { limit: 3000, interval: FIFTEEN_MINUTES_MS },\n    listTweetMentionsByUserId: { limit: 3000, interval: FIFTEEN_MINUTES_MS },\n    listTweetsLikedByUserId: { limit: 750, interval: FIFTEEN_MINUTES_MS },\n    listTweetsByUserId: { limit: 9000, interval: FIFTEEN_MINUTES_MS },\n\n    getUserById: { limit: 3000, interval: FIFTEEN_MINUTES_MS },\n    getUserByUsername: { limit: 3000, interval: FIFTEEN_MINUTES_MS }\n  }\n}\n\n/**\n * Twitter/X API v2 client wrapper with rate-limited methods and `@aiFunction`\n * compatibility.\n *\n * Rate limits differ by plan, so make sure the `twitterApiPlan` parameter is\n * properly set to maximize your rate-limit usage.\n *\n * @note This class does not handle distributed rate-limits. It assumes a\n * single, local client is accessing the API at a time, which is a better fit\n * for serverful environments.\n *\n * @see https://docs.x.com/x-api/fundamentals/rate-limits\n * @see https://docs.x.com/x-api\n */\nexport class TwitterClient extends AIFunctionsProvider {\n  readonly client: types.TwitterV2Client\n  readonly twitterApiPlan: types.TwitterApiPlan\n\n  constructor({\n    client,\n    twitterApiPlan = (getEnv('TWITTER_API_PLAN') as types.TwitterApiPlan) ??\n      'free'\n  }: {\n    client: types.TwitterV2Client\n    twitterApiPlan?: types.TwitterApiPlan\n  }) {\n    assert(\n      client,\n      'TwitterClient missing required \"client\" which should be an instance of \"twitter-api-sdk\" (use `getTwitterV2Client` to initialize the underlying V2 Twitter SDK using Nango OAuth)'\n    )\n    assert(twitterApiPlan, 'TwitterClient missing required \"twitterApiPlan\"')\n\n    super()\n\n    this.client = client\n    this.twitterApiPlan = twitterApiPlan\n\n    const twitterApiRateLimits = twitterApiRateLimitsByPlan[twitterApiPlan]!\n    assert(twitterApiRateLimits, `Invalid twitter api plan: ${twitterApiPlan}`)\n\n    const createTweetThrottle = pThrottle(twitterApiRateLimits.createTweet)\n    const getTweetByIdThrottle = pThrottle(twitterApiRateLimits.getTweetById)\n    const getTweetsByIdThrottle = pThrottle(twitterApiRateLimits.getTweetsById)\n    const searchRecentTweetsThrottle = pThrottle(\n      twitterApiRateLimits.searchRecentTweets\n    )\n    const listTweetMentionsByUserIdThrottle = pThrottle(\n      twitterApiRateLimits.listTweetMentionsByUserId\n    )\n    const listTweetsLikedByUserIdThrottle = pThrottle(\n      twitterApiRateLimits.listTweetsLikedByUserId\n    )\n    const listTweetsByUserIdThrottle = pThrottle(\n      twitterApiRateLimits.listTweetsByUserId\n    )\n    const getUserByIdThrottle = pThrottle(twitterApiRateLimits.getUserById)\n    const getUserByUsernameThrottle = pThrottle(\n      twitterApiRateLimits.getUserByUsername\n    )\n\n    this._createTweet = createTweetThrottle(createTweetImpl(this.client))\n    this._getTweetById = getTweetByIdThrottle(getTweetByIdImpl(this.client))\n    this._getTweetsById = getTweetsByIdThrottle(getTweetsByIdImpl(this.client))\n    this._searchRecentTweets = searchRecentTweetsThrottle(\n      searchRecentTweetsImpl(this.client)\n    )\n    this._listTweetMentionsByUserId = listTweetMentionsByUserIdThrottle(\n      listTweetMentionsByUserIdImpl(this.client)\n    )\n    this._listTweetsLikedByUserId = listTweetsLikedByUserIdThrottle(\n      listTweetsLikedByUserIdImpl(this.client)\n    )\n    this._listTweetsByUserId = listTweetsByUserIdThrottle(\n      listTweetsByUserIdImpl(this.client)\n    )\n    this._getUserById = getUserByIdThrottle(getUserByIdImpl(this.client))\n    this._getUserByUsername = getUserByUsernameThrottle(\n      getUserByUsernameImpl(this.client)\n    )\n  }\n\n  protected _createTweet: ReturnType<typeof createTweetImpl>\n  protected _getTweetById: ReturnType<typeof getTweetByIdImpl>\n  protected _getTweetsById: ReturnType<typeof getTweetsByIdImpl>\n  protected _searchRecentTweets: ReturnType<typeof searchRecentTweetsImpl>\n  protected _listTweetMentionsByUserId: ReturnType<\n    typeof listTweetMentionsByUserIdImpl\n  >\n  protected _listTweetsLikedByUserId: ReturnType<\n    typeof listTweetsLikedByUserIdImpl\n  >\n  protected _listTweetsByUserId: ReturnType<typeof listTweetsByUserIdImpl>\n  protected _getUserById: ReturnType<typeof getUserByIdImpl>\n  protected _getUserByUsername: ReturnType<typeof getUserByUsernameImpl>\n\n  /**\n   * Creates a new tweet\n   */\n  @aiFunction({\n    name: 'create_tweet',\n    description: 'Creates a new tweet',\n    inputSchema: z.object({\n      text: z.string().nonempty()\n    })\n  })\n  async createTweet(\n    params: types.CreateTweetParams\n  ): Promise<types.CreatedTweet> {\n    return this._createTweet(params)\n  }\n\n  /**\n   * Fetch a tweet by its ID\n   */\n  @aiFunction({\n    name: 'get_tweet_by_id',\n    description: 'Fetch a tweet by its ID',\n    inputSchema: z.object({\n      id: z.string().nonempty()\n    })\n  })\n  async getTweetById(params: { id: string } & types.GetTweetByIdParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.getTweetById is not supported on free plan'\n    )\n\n    return this._getTweetById(params.id, params)\n  }\n\n  /**\n   * Fetch an array of tweets by their IDs\n   */\n  @aiFunction({\n    name: 'get_tweets_by_id',\n    description: 'Fetch an array of tweets by their IDs',\n    inputSchema: z.object({\n      ids: z.array(z.string().nonempty())\n    })\n  })\n  async getTweetsById({ ids, ...params }: types.GetTweetsByIdParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.getTweetsById is not supported on free plan'\n    )\n\n    return this._getTweetsById(ids, params)\n  }\n\n  /**\n   * Searches for recent tweets\n   */\n  @aiFunction({\n    name: 'search_recent_tweets',\n    description: 'Searches for recent tweets',\n    inputSchema: z.object({\n      query: z.string().nonempty(),\n      sort_order: z\n        .enum(['recency', 'relevancy'])\n        .default('relevancy')\n        .optional(),\n      max_results: z.number().min(10).max(100).optional(),\n      pagination_token: z.string().optional()\n    })\n  })\n  async searchRecentTweets(params: types.SearchRecentTweetsParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.searchRecentTweets is not supported on free plan'\n    )\n\n    return this._searchRecentTweets(params)\n  }\n\n  /**\n   * Lists tweets which mention the given user.\n   */\n  @aiFunction({\n    name: 'list_tweet_mentions_by_user_id',\n    description: 'Lists tweets which mention the given user.',\n    inputSchema: z.object({\n      userId: z.string().nonempty(),\n      max_results: z.number().min(5).max(100).optional(),\n      pagination_token: z.string().optional()\n    })\n  })\n  async listTweetMentionsByUserId({\n    userId,\n    ...params\n  }: { userId: string } & types.ListTweetMentionsByUserIdParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.listTweetMentionsByUserId is not supported on free plan'\n    )\n\n    return this._listTweetMentionsByUserId(userId, params)\n  }\n\n  /**\n   * Lists tweets liked by a user.\n   */\n  @aiFunction({\n    name: 'list_tweets_liked_by_user_id',\n    description: 'Lists tweets liked by a user.',\n    inputSchema: z.object({\n      userId: z.string().nonempty(),\n      max_results: z.number().min(5).max(100).optional(),\n      pagination_token: z.string().optional()\n    })\n  })\n  async listTweetsLikedByUserId({\n    userId,\n    ...params\n  }: { userId: string } & types.ListTweetsLikedByUserIdParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.listTweetsLikedByUserId is not supported on free plan'\n    )\n\n    return this._listTweetsLikedByUserId(userId, params)\n  }\n\n  /**\n   * Lists tweets authored by a user.\n   */\n  @aiFunction({\n    name: 'list_tweets_by_user_id',\n    description: 'Lists tweets authored by a user.',\n    inputSchema: z.object({\n      userId: z.string().nonempty(),\n      max_results: z.number().min(5).max(100).optional(),\n      pagination_token: z.string().optional(),\n      exclude: z\n        .array(z.union([z.literal('replies'), z.literal('retweets')]))\n        .optional()\n        .describe(\n          'By default, replies and retweets are included. Use this parameter if you want to exclude either or both of them.'\n        )\n    })\n  })\n  async listTweetsByUserId({\n    userId,\n    ...params\n  }: { userId: string } & types.ListTweetsByUserIdParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.listTweetsByUserId is not supported on free plan'\n    )\n\n    return this._listTweetsByUserId(userId, params)\n  }\n\n  /**\n   * Fetch a twitter user by ID\n   */\n  @aiFunction({\n    name: 'get_twitter_user_by_id',\n    description: 'Fetch a twitter user by ID',\n    inputSchema: z.object({\n      id: z.string().min(1)\n    })\n  })\n  async getUserById({\n    id,\n    ...params\n  }: { id: string } & types.GetUserByIdParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.getUserById not supported on free plan'\n    )\n\n    return this._getUserById(id, params)\n  }\n\n  /**\n   * Fetch a twitter user by username\n   */\n  @aiFunction({\n    name: 'get_twitter_user_by_username',\n    description: 'Fetch a twitter user by username',\n    inputSchema: z.object({\n      username: z.string().min(1)\n    })\n  })\n  async getUserByUsername({\n    username,\n    ...params\n  }: { username: string } & types.GetUserByUsernameParams) {\n    assert(\n      this.twitterApiPlan !== 'free',\n      'TwitterClient.getUserByUsername not supported on free plan'\n    )\n\n    return this._getUserByUsername(username, params)\n  }\n}\n\nconst defaultTwitterQueryTweetFields: types.TwitterQueryTweetFields = [\n  'attachments',\n  'author_id',\n  'conversation_id',\n  'created_at',\n  'entities',\n  'geo',\n  'id',\n  'in_reply_to_user_id',\n  'lang',\n  'public_metrics',\n  'possibly_sensitive',\n  'referenced_tweets',\n  'text'\n  // 'context_annotations', // not needed (way too verbose and noisy)\n  // 'edit_controls', / not needed\n  // 'non_public_metrics', // don't have access to\n  // 'organic_metrics', // don't have access to\n  // 'promoted_metrics, // don't have access to\n  // 'reply_settings', / not needed\n  // 'source', // not needed\n  // 'withheld' // not needed\n]\n\nconst defaultTwitterQueryUserFields: types.TwitterQueryUserFields = [\n  'created_at',\n  'description',\n  'entities',\n  'id',\n  'location',\n  'name',\n  'pinned_tweet_id',\n  'profile_image_url',\n  'protected',\n  'public_metrics',\n  'url',\n  'username',\n  'verified'\n  // 'most_recent_tweet_id',\n  // 'verified_type',\n  // 'withheld'\n]\n\nconst defaultTweetQueryParams: types.TweetsQueryOptions = {\n  // https://developer.twitter.com/en/docs/twitter-api/expansions\n  expansions: [\n    'author_id',\n    'in_reply_to_user_id',\n    'referenced_tweets.id',\n    'referenced_tweets.id.author_id',\n    'entities.mentions.username',\n    // TODO\n    'attachments.media_keys',\n    'geo.place_id',\n    'attachments.poll_ids'\n  ],\n  'tweet.fields': defaultTwitterQueryTweetFields,\n  'user.fields': defaultTwitterQueryUserFields\n}\n\nconst defaultUserQueryParams: types.TwitterUserQueryOptions = {\n  // https://developer.twitter.com/en/docs/twitter-api/expansions\n  expansions: ['pinned_tweet_id'],\n  'tweet.fields': defaultTwitterQueryTweetFields,\n  'user.fields': defaultTwitterQueryUserFields\n}\n\nfunction createTweetImpl(client: types.TwitterV2Client) {\n  return async (\n    params: types.CreateTweetParams\n  ): Promise<types.CreatedTweet> => {\n    try {\n      const { data: tweet } = await client.tweets.createTweet(params)\n\n      if (!tweet?.id) {\n        throw new Error('invalid createTweet response')\n      }\n\n      return tweet\n    } catch (err: any) {\n      console.error('error creating tweet', JSON.stringify(err, null, 2))\n\n      handleTwitterError(err, { label: 'error creating tweet' })\n    }\n  }\n}\n\nfunction getTweetByIdImpl(client: types.TwitterV2Client) {\n  return async (tweetId: string, params?: types.GetTweetByIdParams) => {\n    try {\n      return await client.tweets.findTweetById(tweetId, {\n        ...defaultTweetQueryParams,\n        ...params\n      })\n    } catch (err: any) {\n      handleTwitterError(err, { label: `error fetching tweet ${tweetId}` })\n    }\n  }\n}\n\nfunction getTweetsByIdImpl(client: types.TwitterV2Client) {\n  return async (\n    ids: string[],\n    params?: Omit<types.GetTweetsByIdParams, 'ids'>\n  ) => {\n    try {\n      return await client.tweets.findTweetsById({\n        ...defaultTweetQueryParams,\n        ...params,\n        ids\n      })\n    } catch (err: any) {\n      handleTwitterError(err, { label: `error fetching ${ids.length} tweets` })\n    }\n  }\n}\n\nfunction searchRecentTweetsImpl(client: types.TwitterV2Client) {\n  return async (params: types.SearchRecentTweetsParams) => {\n    try {\n      return await client.tweets.tweetsRecentSearch({\n        ...defaultTweetQueryParams,\n        ...params\n      })\n    } catch (err: any) {\n      handleTwitterError(err, {\n        label: `error searching tweets query \"${params.query}\"`\n      })\n    }\n  }\n}\n\nfunction getUserByIdImpl(client: types.TwitterV2Client) {\n  return async (userId: string, params?: types.GetUserByIdParams) => {\n    try {\n      return await client.users.findUserById(userId, {\n        ...defaultUserQueryParams,\n        ...params\n      })\n    } catch (err: any) {\n      handleTwitterError(err, {\n        label: `error fetching user ${userId}`\n      })\n    }\n  }\n}\n\nfunction getUserByUsernameImpl(client: types.TwitterV2Client) {\n  return async (username: string, params?: types.GetUserByUsernameParams) => {\n    try {\n      return await client.users.findUserByUsername(username, {\n        ...defaultUserQueryParams,\n        ...params\n      })\n    } catch (err: any) {\n      handleTwitterError(err, {\n        label: `error fetching user with username ${username}`\n      })\n    }\n  }\n}\n\nfunction listTweetMentionsByUserIdImpl(client: types.TwitterV2Client) {\n  return async (\n    userId: string,\n    params?: types.ListTweetMentionsByUserIdParams\n  ) => {\n    try {\n      return await client.tweets.usersIdMentions(userId, {\n        ...defaultTweetQueryParams,\n        ...params\n      })\n    } catch (err: any) {\n      handleTwitterError(err, {\n        label: `error fetching tweets mentions for user ${userId}`\n      })\n    }\n  }\n}\n\nfunction listTweetsLikedByUserIdImpl(client: types.TwitterV2Client) {\n  return async (\n    userId: string,\n    params?: types.ListTweetsLikedByUserIdParams\n  ) => {\n    try {\n      return await client.tweets.usersIdLikedTweets(userId, {\n        ...defaultTweetQueryParams,\n        ...params\n      })\n    } catch (err: any) {\n      handleTwitterError(err, {\n        label: `error fetching tweets liked by user ${userId}`\n      })\n    }\n  }\n}\n\nfunction listTweetsByUserIdImpl(client: types.TwitterV2Client) {\n  return async (userId: string, params?: types.ListTweetsByUserIdParams) => {\n    try {\n      return await client.tweets.usersIdTweets(userId, {\n        ...defaultTweetQueryParams,\n        ...params\n      })\n    } catch (err: any) {\n      handleTwitterError(err, {\n        label: `error fetching tweets by user ${userId}`\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/twitter/src/types.ts",
    "content": "import type { AsyncReturnType, Simplify } from 'type-fest'\nimport { type Client as TwitterV2Client } from 'twitter-api-sdk'\n\nexport { type Client as TwitterV2Client } from 'twitter-api-sdk'\n\nexport type TwitterApiPlan = 'free' | 'basic' | 'pro' | 'enterprise'\n\nexport type TweetsQueryOptions = Simplify<\n  Pick<\n    Parameters<TwitterV2Client['tweets']['findTweetsById']>[0],\n    'expansions' | 'tweet.fields' | 'user.fields'\n  >\n>\n\nexport type TwitterUserQueryOptions = Simplify<\n  Pick<\n    NonNullable<Parameters<TwitterV2Client['users']['findUserById']>[1]>,\n    'expansions' | 'tweet.fields' | 'user.fields'\n  >\n>\n\nexport type TwitterQueryTweetFields = TweetsQueryOptions['tweet.fields']\nexport type TwitterQueryUserFields = TweetsQueryOptions['user.fields']\n\nexport type TwitterUserIdMentionsQueryOptions = Simplify<\n  NonNullable<Parameters<TwitterV2Client['tweets']['usersIdMentions']>[1]>\n>\n\nexport type CreateTweetParams = Simplify<\n  Parameters<TwitterV2Client['tweets']['createTweet']>[0]\n>\n\nexport type ListTweetMentionsByUserIdParams = Simplify<\n  Parameters<TwitterV2Client['tweets']['usersIdMentions']>[1]\n>\n\nexport type GetTweetByIdParams = Simplify<\n  Parameters<TwitterV2Client['tweets']['findTweetById']>[1]\n>\n\nexport type GetTweetsByIdParams = Simplify<\n  Parameters<TwitterV2Client['tweets']['findTweetsById']>[0]\n>\n\nexport type SearchRecentTweetsParams = Simplify<\n  Parameters<TwitterV2Client['tweets']['tweetsRecentSearch']>[0]\n>\n\nexport type GetUserByIdParams = Simplify<\n  Parameters<TwitterV2Client['users']['findUserById']>[1]\n>\n\nexport type GetUserByUsernameParams = Simplify<\n  Parameters<TwitterV2Client['users']['findUserByUsername']>[1]\n>\n\nexport type ListTweetsLikedByUserIdParams = Simplify<\n  Parameters<TwitterV2Client['tweets']['usersIdLikedTweets']>[1]\n>\n\nexport type ListTweetsByUserIdParams = Simplify<\n  Parameters<TwitterV2Client['tweets']['usersIdTweets']>[1]\n>\n\ntype Unpacked<T> = T extends (infer U)[] ? U : T\n\nexport type Tweet = Simplify<\n  NonNullable<\n    Unpacked<\n      AsyncReturnType<TwitterV2Client['tweets']['findTweetsById']>['data']\n    >\n  >\n>\nexport type TwitterUser = Simplify<\n  NonNullable<AsyncReturnType<TwitterV2Client['users']['findMyUser']>['data']>\n>\nexport type CreatedTweet = Simplify<\n  NonNullable<AsyncReturnType<TwitterV2Client['tweets']['createTweet']>['data']>\n>\n\nexport type TwitterUrl = Simplify<\n  Unpacked<NonNullable<NonNullable<Tweet['entities']>['urls']>>\n>\n"
  },
  {
    "path": "legacy/packages/twitter/src/utils.ts",
    "content": "import { omit } from '@agentic/core'\n\nimport type * as types from './types'\nimport { TwitterError } from './error'\n\n/**\n * Error handler which takes in an unknown Error object and converts it to a\n * structured TwitterError object for a set of common Twitter API errors.\n *\n * Re-throws the error if not recognized and will never return.\n */\nexport function handleTwitterError(\n  err: any,\n  { label = '' }: { label?: string } = {}\n): never {\n  if (err.status === 403) {\n    // user may have deleted the tweet we're trying to respond to\n    throw new TwitterError(err.error?.detail || `${label}: 403 forbidden`, {\n      type: 'twitter:forbidden',\n      isFinal: true,\n      cause: err\n    })\n  } else if (err.status === 401) {\n    throw new TwitterError(`${label}: unauthorized`, {\n      type: 'twitter:auth',\n      cause: err\n    })\n  } else if (err.status === 400) {\n    if (\n      /value passed for the token was invalid/i.test(\n        err.error?.error_description\n      )\n    ) {\n      throw new TwitterError(`${label}: invalid auth token`, {\n        type: 'twitter:auth',\n        cause: err\n      })\n    }\n  } else if (err.status === 429) {\n    throw new TwitterError(`${label}: too many requests`, {\n      type: 'twitter:rate-limit',\n      cause: err\n    })\n  } else if (err.status === 404) {\n    throw new TwitterError(err.toString(), {\n      type: 'twitter:forbidden',\n      isFinal: true,\n      cause: err\n    })\n  }\n\n  if (err.status >= 400 && err.status < 500) {\n    throw new TwitterError(\n      `${label}: ${err.status} ${err.error?.description || err.toString()}`,\n      {\n        type: 'twitter:unknown',\n        isFinal: true,\n        cause: err\n      }\n    )\n  } else if (err.status >= 500) {\n    throw new TwitterError(\n      `${label}: ${err.status} ${err.error?.description || err.toString()}`,\n      {\n        type: 'twitter:unknown',\n        isFinal: false,\n        cause: err\n      }\n    )\n  }\n\n  const reason = err.toString().toLowerCase()\n\n  if (reason.includes('fetcherror') || reason.includes('enotfound')) {\n    throw new TwitterError(err.toString(), {\n      type: 'network',\n      cause: err\n    })\n  }\n\n  // Otherwise, propagate the original error\n  throw err\n}\n\nexport function getPrunedTweet(\n  tweet: Partial<types.Tweet>\n): Partial<types.Tweet> {\n  const urls = tweet.entities?.urls\n  let text = tweet.text\n\n  if (text && urls) {\n    for (const url of urls) {\n      if (url.expanded_url && url.url) {\n        text = text!.replaceAll(url.url, url.expanded_url!)\n      }\n    }\n  }\n\n  return {\n    ...omit(\n      tweet,\n      'conversation_id',\n      'public_metrics',\n      'created_at',\n      'entities',\n      'possibly_sensitive'\n    ),\n    text\n  }\n}\n\nexport function getPrunedTwitterUser(\n  twitterUser: Partial<types.TwitterUser>\n): Partial<types.TwitterUser> {\n  const urls = twitterUser.entities?.description?.urls\n  let description = twitterUser.description\n\n  if (description && urls) {\n    for (const url of urls) {\n      if (url.expanded_url && url.url) {\n        description = description!.replaceAll(url.url, url.expanded_url!)\n      }\n    }\n  }\n\n  return {\n    ...omit(\n      twitterUser,\n      'public_metrics',\n      'created_at',\n      'verified',\n      'protected',\n      'url',\n      'entities'\n    ),\n    description\n  }\n}\n"
  },
  {
    "path": "legacy/packages/twitter/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/typeform/package.json",
    "content": "{\n  \"name\": \"@agentic/typeform\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the Typeform API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/typeform\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/typeform/src/index.ts",
    "content": "export * from './typeform-client'\n"
  },
  {
    "path": "legacy/packages/typeform/src/typeform-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace typeform {\n  export const API_BASE_URL = 'https://api.typeform.com'\n\n  export interface GetInsightsForFormResponse {\n    fields: Array<{\n      dropoffs: number\n      id: string\n      label: string\n      ref: string\n      title: string\n      type: string\n      views: number\n    }>\n    form: {\n      platforms: Array<{\n        average_time: number\n        completion_rate: number\n        platform: string\n        responses_count: number\n        total_visits: number\n        unique_visits: number\n      }>\n      summary: {\n        average_time: number\n        completion_rate: number\n        responses_count: number\n        total_visits: number\n        unique_visits: number\n      }\n    }\n  }\n\n  export interface GetResponsesForFormParams {\n    formId: string\n    pageSize?: number\n    since?: string\n    until?: string\n    completed?: boolean\n  }\n\n  export interface GetResponsesForFormResponse {\n    total_items: number\n    page_count: number\n    items: Array<{\n      landing_id: string\n      token: string\n      landed_at: string\n      submitted_at: string\n      metadata: {\n        user_agent: string\n        platform: string\n        referer: string\n        network_id: string\n        browser: string\n      }\n      answers: Array<{\n        field: {\n          id: string\n          type: string\n          ref: string\n        }\n        type: string\n        [key: string]: any\n      }>\n      hidden: Record<string, any>\n      calculated: {\n        score: number\n      }\n      variables: Array<{\n        key: string\n        type: string\n        [key: string]: any\n      }>\n    }>\n  }\n}\n\n/**\n * Readonly Typeform API client for fetching form insights and responses.\n *\n * @see https://www.typeform.com/developers/get-started/\n */\nexport class TypeformClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('TYPEFORM_API_KEY'),\n    apiBaseUrl = typeform.API_BASE_URL,\n    timeoutMs = 60_000,\n    ky = defaultKy\n  }: {\n    /** Typeform Personal Access Token */\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'TypeformClient missing required \"apiKey\" (defaults to \"TYPEFORM_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl,\n      timeout: timeoutMs,\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`\n      }\n    })\n  }\n\n  /**\n   * Retrieves insights and analytics for a Typeform form.\n   */\n  @aiFunction({\n    name: 'typeform_get_insights_for_form',\n    description: 'Retrieve insights and analytics for a Typeform form.',\n    inputSchema: z.object({\n      formId: z\n        .string()\n        .describe('The ID of the Typeform form to get insights for.')\n    })\n  })\n  async getInsightsForForm(\n    formIdOrOptions: string | { formId: string }\n  ): Promise<typeform.GetInsightsForFormResponse> {\n    const { formId } =\n      typeof formIdOrOptions === 'string'\n        ? { formId: formIdOrOptions }\n        : formIdOrOptions\n\n    const encodedFormId = encodeURIComponent(formId)\n    return this.ky\n      .get(`insights/${encodedFormId}/summary`)\n      .json<typeform.GetInsightsForFormResponse>()\n  }\n\n  /**\n   * Retrieves responses for a Typeform form.\n   */\n  @aiFunction({\n    name: 'typeform_get_responses_for_form',\n    description: 'Retrieve responses for a Typeform form.',\n    inputSchema: z.object({\n      formId: z\n        .string()\n        .describe('The ID of the Typeform form to get responses for.'),\n      pageSize: z\n        .number()\n        .describe('The number of responses to retrieve per page.')\n        .optional(),\n      since: z\n        .string()\n        .describe('The date to start retrieving responses from.')\n        .optional(),\n      until: z\n        .string()\n        .describe('The date to stop retrieving responses at.')\n        .optional(),\n      completed: z\n        .boolean()\n        .describe('Filter responses by completion status.')\n        .optional()\n    })\n  })\n  async getResponsesForForm(\n    formIdOrOptions: string | typeform.GetResponsesForFormParams\n  ): Promise<typeform.GetResponsesForFormResponse> {\n    const { formId, ...params } =\n      typeof formIdOrOptions === 'string'\n        ? { formId: formIdOrOptions }\n        : formIdOrOptions\n\n    const encodedFormId = encodeURIComponent(formId)\n    return this.ky\n      .get(`forms/${encodedFormId}/responses`, {\n        searchParams: sanitizeSearchParams(params)\n      })\n      .json<typeform.GetResponsesForFormResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/typeform/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/weather/package.json",
    "content": "{\n  \"name\": \"@agentic/weather\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for weatherapi.com.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/weather\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/weather/src/index.ts",
    "content": "export * from './weather-client'\n"
  },
  {
    "path": "legacy/packages/weather/src/weather-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace weatherapi {\n  export const BASE_URL = 'https://api.weatherapi.com/v1'\n\n  export interface CurrentWeatherResponse {\n    current: CurrentWeather\n    location: WeatherLocation\n  }\n\n  export interface CurrentWeather {\n    cloud: number\n    condition: WeatherCondition\n    feelslike_c: number\n    feelslike_f: number\n    gust_kph: number\n    gust_mph: number\n    humidity: number\n    is_day: number\n    last_updated: string\n    last_updated_epoch: number\n    precip_in: number\n    precip_mm: number\n    pressure_in: number\n    pressure_mb: number\n    temp_c: number\n    temp_f: number\n    uv: number\n    vis_km: number\n    vis_miles: number\n    wind_degree: number\n    wind_dir: string\n    wind_kph: number\n    wind_mph: number\n  }\n\n  export interface WeatherCondition {\n    code: number\n    icon: string\n    text: string\n  }\n\n  export interface WeatherLocation {\n    country: string\n    lat: number\n    localtime: string\n    localtime_epoch: number\n    lon: number\n    name: string\n    region: string\n    tz_id: string\n  }\n\n  export interface WeatherIPInfoResponse {\n    ip: string\n    type: string\n    continent_code: string\n    continent_name: string\n    country_code: string\n    country_name: string\n    is_eu: string\n    geoname_id: number\n    city: string\n    region: string\n    lat: number\n    lon: number\n    tz_id: string\n    localtime_epoch: number\n    localtime: string\n  }\n}\n\n/**\n * Simple Weather API client for accessing weather data based on location.\n *\n * @see https://www.weatherapi.com\n */\nexport class WeatherClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('WEATHER_API_KEY'),\n    apiBaseUrl = weatherapi.BASE_URL,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'WeatherClient missing required \"apiKey\" (defaults to \"WEATHER_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({ prefixUrl: apiBaseUrl })\n  }\n\n  /**\n   * Gets info about the current weather at a given location.\n   */\n  @aiFunction({\n    name: 'get_current_weather',\n    description: 'Gets info about the current weather at a given location.',\n    inputSchema: z.object({\n      q: z\n        .string()\n        .describe(\n          'Location to get the weather for. Can be a city name, zipcode, IP address, or lat/lng coordinates. Example: \"London\"'\n        )\n    })\n  })\n  async getCurrentWeather(queryOrOptions: string | { q: string }) {\n    const options =\n      typeof queryOrOptions === 'string'\n        ? { q: queryOrOptions }\n        : queryOrOptions\n\n    return this.ky\n      .get('current.json', {\n        searchParams: sanitizeSearchParams({\n          key: this.apiKey,\n          ...options\n        })\n      })\n      .json<weatherapi.CurrentWeatherResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/weather/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/wikidata/package.json",
    "content": "{\n  \"name\": \"@agentic/wikidata\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Wikidata.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/wikidata\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\",\n    \"wikibase-sdk\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/wikidata/src/index.ts",
    "content": "export * from './wikidata-client'\n"
  },
  {
    "path": "legacy/packages/wikidata/src/wikidata-client.ts",
    "content": "import type * as wikibase from 'wikibase-sdk'\nimport { AIFunctionsProvider, assert, getEnv, throttleKy } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport wdk from 'wikibase-sdk/wikidata.org'\n\nexport namespace wikidata {\n  // Allow up to 200 requests per second by default.\n  export const throttle = pThrottle({\n    limit: 200,\n    interval: 1000\n  })\n\n  export type SimplifiedEntityMap = Record<string, SimplifiedEntity>\n\n  export interface SimplifiedEntity {\n    id: string\n    type: string\n    claims: Claims\n    modified: string\n    labels?: Descriptions\n    descriptions?: Descriptions\n    aliases?: any\n    sitelinks?: Sitelinks\n  }\n\n  export interface Claims {\n    [key: string]: Claim[]\n  }\n\n  export interface Claim {\n    value: string\n    qualifiers: Record<string, string[] | number[]>\n    references: Record<string, string[]>[]\n  }\n\n  export type Descriptions = Record<string, string>\n  export type Sitelinks = Record<string, string>\n}\n\n/**\n * Basic Wikidata client.\n *\n * @see https://github.com/maxlath/wikibase-sdk\n *\n * TODO: support any wikibase instance\n */\nexport class WikidataClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiUserAgent: string\n\n  constructor({\n    apiUserAgent = getEnv('WIKIDATA_API_USER_AGENT') ??\n      'Agentic (https://github.com/transitive-bullshit/agentic)',\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiBaseUrl?: string\n    apiUserAgent?: string\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(apiUserAgent, 'WikidataClient missing required \"apiUserAgent\"')\n    super()\n\n    this.apiUserAgent = apiUserAgent\n\n    const throttledKy = throttle ? throttleKy(ky, wikidata.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      headers: {\n        'user-agent': apiUserAgent\n      }\n    })\n  }\n\n  async getEntityById(\n    idOrOpts: string | { id: string; languages?: string[] }\n  ): Promise<wikidata.SimplifiedEntity> {\n    const { id, languages = ['en'] } =\n      typeof idOrOpts === 'string' ? { id: idOrOpts } : idOrOpts\n\n    const url = wdk.getEntities({\n      ids: id as wikibase.EntityId,\n      languages\n    })\n\n    const res = await this.ky.get(url).json<any>()\n    const entities = wdk.simplify.entities(res.entities, {\n      // TODO: Make this configurable and double-check defaults.\n      keepQualifiers: true,\n      keepReferences: true\n    })\n\n    const entity = entities[id]\n    return entity as wikidata.SimplifiedEntity\n  }\n\n  async getEntitiesByIds(\n    idsOrOpts: string[] | { ids: string; languages?: string[] }\n  ): Promise<wikidata.SimplifiedEntityMap> {\n    const { ids, languages = ['en'] } = Array.isArray(idsOrOpts)\n      ? { ids: idsOrOpts }\n      : idsOrOpts\n\n    // TODO: Separate between wdk.getEntities and wdk.getManyEntities depending\n    // on how many `ids` there are.\n    const url = wdk.getEntities({\n      ids: ids as wikibase.EntityId[],\n      languages\n    })\n\n    const res = await this.ky.get(url).json<any>()\n    const entities = wdk.simplify.entities(res.entities, {\n      keepQualifiers: true,\n      keepReferences: true\n    })\n\n    return entities as wikidata.SimplifiedEntityMap\n  }\n}\n"
  },
  {
    "path": "legacy/packages/wikidata/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/wikipedia/package.json",
    "content": "{\n  \"name\": \"@agentic/wikipedia\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for wikipedia.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/wikipedia\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/wikipedia/src/index.ts",
    "content": "export * from './wikipedia-client'\n"
  },
  {
    "path": "legacy/packages/wikipedia/src/wikipedia-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  throttleKy\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace wikipedia {\n  // Allow up to 200 requests per second by default.\n  export const throttle = pThrottle({\n    limit: 200,\n    interval: 1000\n  })\n\n  export interface SearchOptions {\n    query: string\n    limit?: number\n  }\n\n  export interface PageSearchResponse {\n    pages: Page[]\n  }\n\n  export interface Page {\n    id: number\n    key: string\n    title: string\n    matched_title: null\n    excerpt: string\n    description: null | string\n    thumbnail: Thumbnail | null\n  }\n\n  export interface Thumbnail {\n    url: string\n    width: number\n    height: number\n    mimetype: string\n    duration: null\n  }\n\n  export interface PageSummaryOptions {\n    title: string\n    redirect?: boolean\n    acceptLanguage?: string\n  }\n\n  export interface PageSummaryResponse {\n    ns?: number\n    index?: number\n    type: string\n    title: string\n    displaytitle: string\n    namespace: { id: number; text: string }\n    wikibase_item: string\n    titles: { canonical: string; normalized: string; display: string }\n    pageid: number\n    thumbnail: {\n      source: string\n      width: number\n      height: number\n    }\n    originalimage: {\n      source: string\n      width: number\n      height: number\n    }\n    lang: string\n    dir: string\n    revision: string\n    tid: string\n    timestamp: string\n    description: string\n    description_source: string\n    content_urls: {\n      desktop: {\n        page: string\n        revisions: string\n        edit: string\n        talk: string\n      }\n      mobile: {\n        page: string\n        revisions: string\n        edit: string\n        talk: string\n      }\n    }\n    extract: string\n    extract_html: string\n    normalizedtitle?: string\n    coordinates?: {\n      lat: number\n      lon: number\n    }\n  }\n}\n\n/**\n * Basic Wikipedia API client for searching wiki pages and resolving page data.\n *\n * @see https://www.mediawiki.org/wiki/API\n */\nexport class WikipediaClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiBaseUrl: string\n  protected readonly apiUserAgent: string\n\n  constructor({\n    apiBaseUrl = getEnv('WIKIPEDIA_API_BASE_URL') ??\n      'https://en.wikipedia.org/api/rest_v1',\n    apiUserAgent = getEnv('WIKIPEDIA_API_USER_AGENT') ??\n      'Agentic (https://github.com/transitive-bullshit/agentic)',\n    throttle = true,\n    ky = defaultKy\n  }: {\n    apiBaseUrl?: string\n    apiUserAgent?: string\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(apiBaseUrl, 'WikipediaClient missing required \"apiBaseUrl\"')\n    assert(apiUserAgent, 'WikipediaClient missing required \"apiUserAgent\"')\n    super()\n\n    this.apiBaseUrl = apiBaseUrl\n    this.apiUserAgent = apiUserAgent\n\n    const throttledKy = throttle ? throttleKy(ky, wikipedia.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      headers: {\n        'api-user-agent': apiUserAgent\n      }\n    })\n  }\n\n  /**\n   * Searches Wikipedia for pages matching the given query. */\n  @aiFunction({\n    name: 'wikipedia_search',\n    description: 'Searches Wikipedia for pages matching the given query.',\n    inputSchema: z.object({\n      query: z.string().describe('Search query')\n    })\n  })\n  async search({ query, ...opts }: wikipedia.SearchOptions) {\n    return (\n      // https://www.mediawiki.org/wiki/API:REST_API\n      this.ky\n        .get('https://en.wikipedia.org/w/rest.php/v1/search/page', {\n          searchParams: { q: query, ...opts }\n        })\n        .json<wikipedia.PageSearchResponse>()\n    )\n  }\n\n  /**\n   * Gets a summary of the given Wikipedia page.\n   */\n  @aiFunction({\n    name: 'wikipedia_get_page_summary',\n    description: 'Gets a summary of the given Wikipedia page.',\n    inputSchema: z.object({\n      title: z.string().describe('Wikipedia page title'),\n      acceptLanguage: z\n        .string()\n        .optional()\n        .default('en-us')\n        .describe('Locale code for the language to use.')\n    })\n  })\n  async getPageSummary({\n    title,\n    acceptLanguage = 'en-us',\n    redirect = true,\n    ...opts\n  }: wikipedia.PageSummaryOptions) {\n    title = title.trim().replaceAll(' ', '_')\n\n    // https://en.wikipedia.org/api/rest_v1/\n    return this.ky\n      .get(`page/summary/${title}`, {\n        prefixUrl: this.apiBaseUrl,\n        searchParams: { redirect, ...opts },\n        headers: {\n          'accept-language': acceptLanguage\n        }\n      })\n      .json<wikipedia.PageSummaryResponse>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/wikipedia/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/wolfram-alpha/package.json",
    "content": "{\n  \"name\": \"@agentic/wolfram-alpha\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for Wolfram Alpha.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/wolfram-alpha\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/wolfram-alpha/src/index.ts",
    "content": "export * from './wolfram-alpha-client'\n"
  },
  {
    "path": "legacy/packages/wolfram-alpha/src/wolfram-alpha-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace wolframalpha {\n  export const API_BASE_URL = 'https://www.wolframalpha.com/api/'\n\n  export const AskWolframAlphaOptionsSchema = z.object({\n    input: z.string().describe('english query'),\n    maxchars: z\n      .number()\n      .int()\n      .default(6000)\n      .optional()\n      .describe('max characters to generate in the response')\n  })\n  export type AskWolframAlphaOptions = z.infer<\n    typeof AskWolframAlphaOptionsSchema\n  >\n}\n\n/**\n * Wolfram Alpha LLM API client for answering computational, mathematical, and\n * scientific questions.\n *\n * @see https://products.wolframalpha.com/llm-api/documentation\n */\nexport class WolframAlphaClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly appId: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    appId = getEnv('WOLFRAM_APP_ID'),\n    apiBaseUrl = wolframalpha.API_BASE_URL,\n    ky = defaultKy\n  }: {\n    appId?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      appId,\n      'WolframAlphaClient missing required \"appId\" (defaults to \"WOLFRAM_APP_ID\")'\n    )\n    super()\n\n    this.appId = appId\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n      headers: {\n        Authorization: `Bearer ${appId}`\n      }\n    })\n  }\n\n  /**\n   * Answers computational, mathematical, and scientific questions.\n   *\n   * WolframAlpha understands natural language queries about entities in chemistry, physics, geography, history, art, astronomy, and more.\n   *\n   * WolframAlpha performs mathematical calculations, date and unit conversions, formula solving, etc.\n   */\n  @aiFunction({\n    name: 'ask_wolfram_alpha',\n    description: `\n- WolframAlpha understands natural language queries about entities in chemistry, physics, geography, history, art, astronomy, and more.\n- WolframAlpha performs mathematical calculations, date and unit conversions, formula solving, etc.\n- Convert inputs to simplified keyword queries whenever possible (e.g. convert \"how many people live in France\" to \"France population\").\n- Send queries in English only; translate non-English queries before sending, then respond in the original language.\n- ALWAYS use this exponent notation: \\`6*10^14\\`, NEVER \\`6e14\\`.\n- ALWAYS use proper Markdown formatting for all math, scientific, and chemical formulas, symbols, etc.:  '$$\\n[expression]\\n$$' for standalone cases and '( [expression] )' when inline.\n- Use ONLY single-letter variable names, with or without integer subscript (e.g., n, n1, n_1).\n- Use named physical constants (e.g., 'speed of light') without numerical substitution.\n- Include a space between compound units (e.g., \"Ω m\" for \"ohm*meter\").\n- To solve for a variable in an equation with units, consider solving a corresponding equation without units; exclude counting units (e.g., books), include genuine units (e.g., kg).\n- If a WolframAlpha result is not relevant to the query:\n  - If Wolfram provides multiple 'Assumptions' for a query, choose the more relevant one(s) without explaining the initial result. If you are unsure, ask the user to choose.\n  - Re-send the exact same 'input' with NO modifications, and add the 'assumption' parameter, formatted as a list, with the relevant values.\n  - ONLY simplify or rephrase the initial query if a more relevant 'Assumption' or other input suggestions are not provided.\n`.trim(),\n    inputSchema: wolframalpha.AskWolframAlphaOptionsSchema\n  })\n  async ask(queryOrOptions: string | wolframalpha.AskWolframAlphaOptions) {\n    const options =\n      typeof queryOrOptions === 'string'\n        ? { input: queryOrOptions }\n        : queryOrOptions\n\n    return this.ky\n      .get('v1/llm-api', { searchParams: sanitizeSearchParams(options) })\n      .text()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/wolfram-alpha/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/xsai/package.json",
    "content": "{\n  \"name\": \"@agentic/xsai\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic adapter for the xsAI SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/xsai\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\"\n  },\n  \"peerDependencies\": {\n    \"@xsai/tool\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@xsai/tool\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/packages/xsai/src/index.ts",
    "content": "export * from './xsai'\n"
  },
  {
    "path": "legacy/packages/xsai/src/xsai.test.ts",
    "content": "import { EchoAITool } from '@agentic/core'\nimport { expect, test } from 'vitest'\n\nimport { createXSAITools, createXSAIToolsFromIdentifier } from './xsai'\n\ntest('createXSAITools', async () => {\n  const tools = await createXSAITools(new EchoAITool())\n  expect(tools).toHaveLength(1)\n  expect(tools[0]!.function.name).toBe('echo')\n})\n\ntest('createXSAIToolsFromIdentifier', async () => {\n  const tools = await createXSAIToolsFromIdentifier('@agentic/search')\n  expect(tools).toHaveLength(1)\n  expect(tools[0]!.function.name).toBe('search')\n})\n"
  },
  {
    "path": "legacy/packages/xsai/src/xsai.ts",
    "content": "import { type AIFunctionLike, AIFunctionSet, isZodSchema } from '@agentic/core'\nimport {\n  AgenticToolClient,\n  type AgenticToolClientOptions\n} from '@agentic/platform-tool-client'\nimport { tool } from '@xsai/tool'\n\nexport type XSAITool = Awaited<ReturnType<typeof tool>>\n\n/**\n * Converts a set of Agentic stdlib AI functions to an object compatible with\n * the [xsAI SDK's](https://github.com/moeru-ai/xsai) `tools` parameter.\n */\nexport function createXSAITools(\n  ...aiFunctionLikeTools: AIFunctionLike[]\n): Promise<XSAITool[]> {\n  const fns = new AIFunctionSet(aiFunctionLikeTools)\n\n  return Promise.all(\n    fns.map((fn) => {\n      if (!isZodSchema(fn.inputSchema)) {\n        throw new Error(\n          `xsAI tools only support Standard schemas like Zod: ${fn.spec.name} tool uses a custom JSON Schema, which is currently not supported.`\n        )\n      }\n\n      return tool({\n        name: fn.spec.name,\n        description: fn.spec.description,\n        parameters: fn.inputSchema,\n        execute: fn.execute\n      })\n    })\n  )\n}\n\n/**\n * Creates an array of xsAI tools from a hosted Agentic project or deployment\n * identifier.\n *\n * You'll generally use a project identifier, which will automatically use\n * that project's `latest` version, but if you want to target a specific\n * version or preview deployment, you can use a fully-qualified deployment\n * identifier.\n *\n * @example\n * ```ts\n * const tools = await createXSAIToolsFromIdentifier('@agentic/search')\n * ```\n */\nexport async function createXSAIToolsFromIdentifier(\n  projectOrDeploymentIdentifier: string,\n  opts: AgenticToolClientOptions = {}\n): Promise<XSAITool[]> {\n  const agenticToolClient = await AgenticToolClient.fromIdentifier(\n    projectOrDeploymentIdentifier,\n    opts\n  )\n\n  return createXSAITools(agenticToolClient)\n}\n"
  },
  {
    "path": "legacy/packages/xsai/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/youtube/package.json",
    "content": "{\n  \"name\": \"@agentic/youtube\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for the YouTube data API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/youtube\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/youtube/src/index.ts",
    "content": "export * from './youtube-client'\n"
  },
  {
    "path": "legacy/packages/youtube/src/youtube-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  sanitizeSearchParams\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace youtube {\n  export const API_BASE_URL = 'https://www.googleapis.com/youtube/v3'\n\n  export interface SearchOptions {\n    query: string\n    maxResults?: number\n    pageToken?: string\n    channelId?: string\n    channelType?: 'any' | 'show'\n    eventType?: 'live' | 'completed' | 'upcoming'\n    location?: string\n    locationRadius?: string\n    order?:\n      | 'relevance'\n      | 'date'\n      | 'rating'\n      | 'title'\n      | 'videoCount'\n      | 'viewCount'\n    // The value is an RFC 3339 formatted date-time value (1970-01-01T00:00:00Z).\n    publishedAfter?: string\n    publishedBefore?: string\n    // The regionCode parameter instructs the API to return search results for videos that can be viewed in the specified country. The parameter value is an ISO 3166-1 alpha-2 country code.\n    regionCode?: string\n    relevanceLanguage?: string\n    safeSearch?: 'moderate' | 'none' | 'strict'\n    topicId?: string\n    videoCaption?: 'any' | 'closedCaption' | 'none'\n    videoCategoryId?: string\n    videoDefinition?: 'any' | 'high' | 'standard'\n    videoDimension?: '2d' | '3d' | 'any'\n    videoDuration?: 'any' | 'long' | 'medium' | 'short'\n    videoEmbeddable?: 'any' | 'true'\n    videoLicense?: 'any' | 'creativeCommon' | 'youtube'\n    videoPaidProductPlacement?: 'any' | 'true'\n    videoSyndicated?: 'any' | 'true'\n    videoType?: 'any' | 'episode' | 'movie'\n  }\n\n  export type SearchType = 'video' | 'channel' | 'playlist'\n\n  export interface SearchVideosResult {\n    videoId: string\n    title: string\n    description: string\n    thumbnail: string\n    channelId: string\n    channelTitle: string\n    publishedAt: string\n    url: string\n  }\n\n  export interface SearchChannelsResult {\n    channelId: string\n    title: string\n    description: string\n    thumbnail: string\n    publishedAt: string\n    url: string\n  }\n\n  export type SearchResponse<T extends SearchType> = {\n    results: T extends 'video'\n      ? SearchVideosResult[]\n      : T extends 'channel'\n        ? SearchChannelsResult[]\n        : never\n    totalResults: number\n    prevPageToken?: string\n    nextPageToken?: string\n  }\n\n  export type SearchVideosResponse = SearchResponse<'video'>\n  export type SearchChannelsResponse = SearchResponse<'channel'>\n}\n\n/**\n * YouTube data API v3 client.\n *\n * @see https://developers.google.com/youtube/v3\n */\nexport class YouTubeClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n\n  constructor({\n    apiKey = getEnv('YOUTUBE_API_KEY'),\n    apiBaseUrl = youtube.API_BASE_URL,\n    timeoutMs = 30_000,\n    ky = defaultKy\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    timeoutMs?: number\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      apiKey,\n      'YouTubeClient missing required \"apiKey\" (defaults to \"YOUTUBE_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl,\n      timeout: timeoutMs\n    })\n  }\n\n  /**\n   * Searches for videos on YouTube.\n   *\n   * @see https://developers.google.com/youtube/v3/docs/search/list\n   */\n  @aiFunction({\n    name: 'youtube_search_videos',\n    description: 'Searches for videos on YouTube.',\n    inputSchema: z.object({\n      query: z.string().describe(`The query to search for.\n\nYour request can optionally use the Boolean NOT (-) and OR (|) operators to exclude videos or to find videos that are associated with one of several search terms. For example, to search for videos matching either \"boating\" or \"sailing\", set the query parameter value to boating|sailing. Similarly, to search for videos matching either \"boating\" or \"sailing\" but not \"fishing\", set the query parameter value to boating|sailing -fishing.`),\n      maxResults: z\n        .number()\n        .int()\n        .optional()\n        .describe('The maximum number of results to return (defaults to 5).')\n    })\n  })\n  async searchVideos(\n    queryOrOpts: string | youtube.SearchOptions\n  ): Promise<youtube.SearchVideosResponse> {\n    const opts =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    const data = await this._search({\n      ...opts,\n      type: 'video'\n    })\n\n    const results = (data.items || [])\n      .map((item: any) => {\n        const snippet = item.snippet\n        if (!snippet) return null\n\n        const videoId = item.id?.videoId\n        if (!videoId) return null\n\n        const thumbnails = snippet.thumbnails\n        if (!thumbnails) return null\n\n        return {\n          videoId,\n          title: snippet.title,\n          description: snippet.description,\n          // https://i.ytimg.com/vi/MRtg6A1f2Ko/maxresdefault.jpg\n          thumbnail:\n            thumbnails.high?.url ||\n            thumbnails.medium?.url ||\n            thumbnails.default?.url ||\n            `https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg`,\n          channelId: snippet.channelId,\n          channelTitle: snippet.channelTitle,\n          publishedAt: snippet.publishedAt,\n          url: `https://www.youtube.com/watch?v=${videoId}`\n        }\n      })\n      .filter(Boolean)\n\n    return {\n      results,\n      totalResults: data.pageInfo?.totalResults || 0,\n      prevPageToken: data.prevPageToken,\n      nextPageToken: data.nextPageToken\n    }\n  }\n\n  /**\n   * Searches for channels on YouTube.\n   *\n   * @see https://developers.google.com/youtube/v3/docs/search/list\n   */\n  @aiFunction({\n    name: 'youtube_search_channels',\n    description: 'Searches for channels on YouTube.',\n    inputSchema: z.object({\n      query: z.string().describe('The query to search for.'),\n      maxResults: z\n        .number()\n        .int()\n        .optional()\n        .describe('The maximum number of results to return (defaults to 5).')\n    })\n  })\n  async searchChannels(\n    queryOrOpts: string | youtube.SearchOptions\n  ): Promise<youtube.SearchChannelsResponse> {\n    const opts =\n      typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts\n\n    const data = await this._search({\n      ...opts,\n      type: 'channel'\n    })\n\n    const results = (data.items || [])\n      .map((item: any) => {\n        const snippet = item.snippet\n        if (!snippet) return null\n\n        const channelId = item.id?.channelId\n        if (!channelId) return null\n\n        const thumbnails = snippet.thumbnails\n        if (!thumbnails) return null\n\n        return {\n          channelId,\n          title: snippet.title,\n          description: snippet.description,\n          thumbnail:\n            thumbnails.high?.url ||\n            thumbnails.medium?.url ||\n            thumbnails.default?.url,\n          publishedAt: snippet.publishedAt,\n          url: `https://www.youtube.com/channel/${channelId}`\n        }\n      })\n      .filter(Boolean)\n\n    return {\n      results,\n      totalResults: data.pageInfo?.totalResults || 0,\n      prevPageToken: data.prevPageToken,\n      nextPageToken: data.nextPageToken\n    }\n  }\n\n  protected async _search(\n    opts: youtube.SearchOptions & {\n      type: youtube.SearchType\n    }\n  ) {\n    const { query, ...params } = opts\n\n    return this.ky\n      .get('search', {\n        searchParams: sanitizeSearchParams({\n          q: query,\n          part: 'snippet',\n          maxResults: 5,\n          ...params,\n          key: this.apiKey\n        })\n      })\n      .json<any>()\n  }\n}\n"
  },
  {
    "path": "legacy/packages/youtube/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/packages/zoominfo/package.json",
    "content": "{\n  \"name\": \"@agentic/zoominfo\",\n  \"version\": \"7.6.9\",\n  \"description\": \"Agentic SDK for ZoomInfo.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/zoominfo\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"jsrsasign\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"p-throttle\": \"catalog:\",\n    \"zoominfo-api-auth-client\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@types/jsrsasign\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "legacy/packages/zoominfo/src/index.ts",
    "content": "export * from './zoominfo-client'\n"
  },
  {
    "path": "legacy/packages/zoominfo/src/zoominfo-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  throttleKy\n} from '@agentic/core'\nimport { KJUR } from 'jsrsasign'\nimport defaultKy, { type KyInstance } from 'ky'\nimport pThrottle from 'p-throttle'\nimport { z } from 'zod'\n\nexport namespace zoominfo {\n  export const API_BASE_URL = 'https://api.zoominfo.com'\n\n  // Access tokens expire after 60 minutes, so renew them every 57 minutes.\n  export const ACCESS_TOKEN_EXPIRATION_MS = 57 * 60 * 1000\n\n  // Allow up to 1500 requests per minute by default.\n  // https://api-docs.zoominfo.com/#rate-and-usage-limits\n  export const throttle = pThrottle({\n    limit: 1500,\n    interval: 60_000\n  })\n\n  export interface EnrichContactOptions {\n    personId?: string\n    emailAddress?: string\n    hashedEmail?: string\n    phone?: string\n\n    firstName?: string\n    lastName?: string\n    companyId?: string\n    companyName?: string\n\n    fullName?: string\n\n    jobTitle?: string\n    externalURL?: string\n    lastUpdatedDateAfter?: string\n    validDateAfter?: string\n    contactAccuracyScoreMin?: number\n\n    outputFields?: string[]\n  }\n\n  export interface EnrichCompanyOptions {\n    /**\n     * Unique ZoomInfo identifier for a company\n     */\n    companyId?: string\n    /**\n     * Company name\n     */\n    companyName?: string\n    /**\n     * Company website URL in http://www.example.com format\n     */\n    companyWebsite?: string\n    /**\n     * Company stock ticker symbol\n     */\n    companyTicker?: string\n    /**\n     * Phone number of the company headquarters\n     */\n    companyPhone?: string\n    /**\n     * Fax number of the company headquarters\n     */\n    companyFax?: string\n    /**\n     * Street address for the company's primary address\n     */\n    companyStreet?: string\n    /**\n     * City for the company's primary address\n     */\n    companyCity?: string\n    /**\n     * Company state (U.S.) or province (Canada). You can use free text state or province names (e.g., \"new hampshire\"), the two-letter common abbreviation for a U.S. state (e.g., \"nh\"), or values provided in the State lookup endpoint.\n     */\n    companyState?: string\n    /**\n     * Zip Code or Postal Code for the company's primary address\n     */\n    companyZipCode?: string\n    /**\n     * Country for the company's primary address. You can use free text or see the Country lookup endpoint for values.\n     */\n    companyCountry?: string\n    /**\n     * IP address associated with the company\n     */\n    ipAddress?: string\n\n    outputFields?: string[]\n  }\n\n  export interface EnrichContactResponse {\n    success: boolean\n    data: {\n      outputFields: string[][]\n      result: EnrichContactResult[]\n    }\n  }\n\n  export type MatchStatus =\n    | 'NO_MATCH'\n    | 'FULL_MATCH'\n    | 'CONTACT_ONLY_MATCH'\n    | 'COMPANY_ONLY_MATCH'\n    | 'NON_MATCH_BY_REQUIRED_FIELDS'\n    | 'NON_MATCH_BY_LAST_UPDATED_DATE'\n    | 'NON_MATCH_BY_VALID_DATE'\n    | 'NON_MATCH_BY_CONTACT_ACCURACY_MIN'\n    | 'INVALID_INPUT'\n    | 'LIMIT_EXCEEDED'\n    | 'SERVICE_ERROR'\n    | 'OPT_OUT'\n\n  export interface EnrichContactResult {\n    input: Partial<Omit<EnrichContactOptions, 'outputFields'>>\n    data: EnrichedContact[]\n    matchStatus?: MatchStatus\n  }\n\n  export interface EnrichedContact {\n    id: number\n    firstName: string\n    middleName: string\n    lastName: string\n    email: string\n    hasCanadianEmail: string\n    phone: string\n    directPhoneDoNotCall: boolean\n    street: string\n    city: string\n    region: string\n    metroArea: string\n    zipCode: string\n    state: string\n    country: string\n    personHasMoved: string\n    withinEu: boolean\n    withinCalifornia: boolean\n    withinCanada: boolean\n    lastUpdatedDate: string\n    noticeProvidedDate: string\n    salutation: string\n    suffix: string\n    jobTitle: string\n    jobFunction: JobFunction[]\n    education: Education[]\n    hashedEmails: string[]\n    picture: string\n    mobilePhoneDoNotCall: boolean\n    externalUrls: ExternalUrl[]\n    contactAccuracyScore: number\n    isDefunct: boolean\n    employmentHistory: EmploymentHistory[]\n    managementLevel: string[]\n    locationCompanyId: number\n    company: Company\n  }\n\n  export interface JobFunction {\n    name: string\n    department: string\n  }\n\n  export interface Education {\n    school: string\n    educationDegree: EducationDegree\n  }\n\n  export interface EducationDegree {\n    degree: string\n    areaOfStudy: string\n  }\n\n  export interface ExternalUrl {\n    type: string\n    url: string\n  }\n\n  export interface EmploymentHistory {\n    jobTitle: string\n    managementLevel: string[]\n    fromDate: string\n    toDate: string\n    company: {\n      companyId: number\n      companyName: string\n      companyPhone?: string\n      companyWebsite?: string\n    }\n  }\n\n  export interface Company {\n    id: number\n    name: string\n    type: string\n    division: string\n    descriptionList: DescriptionList[]\n    phone: string\n    fax: string\n    street: string\n    city: string\n    state: string\n    zipCode: string\n    country: string\n    logo: string\n    sicCodes: Code[]\n    naicsCodes: Code[]\n    website: string\n    revenue: string\n    revenueNumeric: number\n    employeeCount: number\n    ticker: string\n    ranking: string[]\n    socialMediaUrls: any[]\n    primaryIndustry: string[]\n    industries: string[]\n    revenueRange: string\n    employeeRange: string\n  }\n\n  export interface DescriptionList {\n    description: string\n  }\n\n  export interface Code {\n    id: string\n    name: string\n  }\n\n  export interface EnrichCompanyResponse {\n    success: boolean\n    data: {\n      outputFields: string[][]\n      result: EnrichCompanyResult[]\n    }\n  }\n\n  export interface EnrichCompanyResult {\n    input: Partial<EnrichCompanyOptions>\n    data: EnrichedCompany[]\n    matchStatus?: MatchStatus\n  }\n\n  export interface EnrichedCompany {\n    id: number\n    ticker: string\n    name: string\n    website: string\n    domainList: string[]\n    logo: string\n    socialMediaUrls: SocialMediaUrl[]\n    revenue: number\n    employeeCount: number\n    numberOfContactsInZoomInfo: number\n    phone: string\n    fax: string\n    street: string\n    city: string\n    state: string\n    zipCode: string\n    country: string\n    continent: string\n    companyStatus: string\n    companyStatusDate: string\n    descriptionList: DescriptionList[]\n    sicCodes: Code[]\n    naicsCodes: Code[]\n    competitors: Competitor[]\n    ultimateParentId: number\n    ultimateParentName: string\n    ultimateParentRevenue: number\n    ultimateParentEmployees: number\n    subUnitCodes: any[]\n    subUnitType: string\n    subUnitIndustries: string[]\n    primaryIndustry: string[]\n    industries: string[]\n    parentId: number\n    parentName: string\n    locationCount: number\n    alexaRank: string\n    metroArea: string\n    lastUpdatedDate: string\n    createdDate: string\n    certificationDate: string\n    certified: boolean\n    hashtags: Hashtag[]\n    products: any[]\n    techAttributes: TechAttribute[]\n    revenueRange: string\n    employeeRange: string\n    companyFunding: CompanyFunding[]\n    recentFundingAmount: number\n    recentFundingDate: string\n    totalFundingAmount: number\n    employeeGrowth: EmployeeGrowth\n  }\n\n  export interface SocialMediaUrl {\n    type: string\n    url: string\n    followerCount: string\n  }\n\n  export interface DescriptionList {\n    description: string\n  }\n\n  export interface Competitor {\n    rank: number\n    id: number\n    name: string\n    website: string\n    employeeCount: number\n  }\n\n  export interface Hashtag {\n    tag: string\n    external_id: any\n    searchString: string\n    displayLabel: string\n    description: string\n    group: string\n    score: any\n    priority?: number\n    parentCategory: string\n    displayScore: string\n    inverseScoreBase?: number\n    scoreMultipler: any\n    scoreUnit: string\n    hidden: boolean\n    label: string\n    categorizedFlag: boolean\n  }\n\n  export interface TechAttribute {\n    tag: string\n    categoryParent: string\n    category: string\n    vendor: string\n    product: string\n    attribute: string\n    website: string\n    logo?: string\n    domain?: string\n    createdTime: string\n    modifiedTime: string\n    description: string\n  }\n\n  export interface CompanyFunding {\n    date: string\n    type: string\n    amount: number\n  }\n\n  export interface EmployeeGrowth {\n    oneYearGrowthRate: string\n    twoYearGrowthRate: string\n    employeeGrowthDataPoints: EmployeeGrowthDataPoint[]\n  }\n\n  export interface EmployeeGrowthDataPoint {\n    label: string\n    employeeCount: number\n  }\n\n  export interface SearchContactsOptions {\n    /**\n     * Limits the results returned to the given number of results per page. Default is 25.\n     */\n    rpp?: number\n    /**\n     * Provides the results for the given page, used in conjunction with rpp\n     */\n    page?: number\n    /**\n     * Provide sortBy if specifying sortOrder. Valid values are asc, ascending, desc, and descending. By default, results are sorted in descending order.\n     */\n    sortOrder?: string\n    /**\n     * Sort results by valid output fields: contactAccuracyScore, lastName, companyName, hierarchy, sourceCount, lastMentioned, relevance\n     */\n    sortBy?: string\n    /**\n     * Unique ZoomInfo identifier for the contact. Can include a comma-separated list.\n     */\n    personId?: string\n    /**\n     * Work email address for the contact in example@example.com format\n     */\n    emailAddress?: string\n    /**\n     * Supplemental email address for the contact in example@example.com format\n     */\n    supplementalEmail?: string[]\n    /**\n     * Hashed email value for the contact. Allows searching via an email address with the extra security of not exposing the email. Supported hash algorithms are: MD5, SHA1, SHA256 and SHA512.\n     */\n    hashedEmail?: string\n    /**\n     * List of person phones or mobile numbers. Here's an example list - any of the following phone number formats are acceptable: [\"(123)-456-7890\", \"1234567890\", \"123 456 7890\", \"123-445-7890\"]. Alphabetical characters are not allowed.\n     */\n    phone?: string[]\n    /**\n     * Contact full name\n     */\n    fullName?: string\n    /**\n     * Contact first name\n     */\n    firstName?: string\n    /**\n     * Contact middle initial\n     */\n    middleInitial?: string\n    /**\n     * Contact last name\n     */\n    lastName?: string\n    /**\n     * Contact title at current place of employment. Use OR to input multiple job titles.\n     */\n    jobTitle?: string\n    /**\n     * Exclude comma-separated list of job titles\n     */\n    excludeJobTitle?: string\n    /**\n     * Contact management level at current place of employment. See the Management Levels lookup endpoint for values.\n     */\n    managementLevel?: string\n    /**\n     * Exclude contact based on management level. See the Management Levels lookup endpoint for values.\n     */\n    excludeManagementLevel?: string\n    /**\n     * Contact department at current place of employment. See the Contact Departments lookup endpoint for values.\n     */\n    department?: string\n    /**\n     * Exclude or include board members from search results. By default, the API includes board members in results. See the Board Members lookup endpoint for values.\n     */\n    boardMember?: string\n    /**\n     * Contacts who do not have an active company associated with them are considered partial profiles. Exclude contacts with a partial profile from search results.\n     */\n    excludePartialProfiles?: boolean\n    /**\n     * Return only executives\n     */\n    executivesOnly?: boolean\n    /**\n     * Specify a list of required fields for each record returned. Can include email, phone (direct or company), directPhone, personalEmail, and mobilePhone. Can include a comma-separated list of these fields. For example, requiring direct phone (directPhone) will only return contacts which have the Direct Phone Number field populated.\n     */\n    requiredFields?: string\n    /**\n     * Minimum accuracy score for search results. This score indicates the likelihood that a contact is reachable and still employed by the company listed. Minimum score is 70 and maximum is 99.\n     */\n    contactAccuracyScoreMin?: string\n    /**\n     * Maximum accuracy score for search results. This score indicates the likelihood that a contact is reachable and still employed by the company listed. Minimum score is 70 and maximum is 99.\n     */\n    contactAccuracyScoreMax?: string\n    /**\n     * Contact job function at their current place of employment. See the Job Function lookup endpoint for values.\n     */\n    jobFunction?: string\n    /**\n     * The date after which the contact's profile was last updated in YYYY-MM-DD format\n     */\n    lastUpdatedDateAfter?: string\n    /**\n     * The date after which the contact's profile was last validated in YYYY-MM-DD format\n     */\n    validDateAfter?: string\n    /**\n     * Number of months within which the contact's profile was last updated. For example, if lastUpdatedinMonths is 12 only contacts that were updated in the last 12 months will be returned.\n     */\n    lastUpdatedInMonths?: number\n    /**\n     * Contacts who have been notified of inclusion in ZoomInfo's database. Values are exclude, include, and only.\n     */\n    hasBeenNotified?: string\n    /**\n     * Returns companies based on a contact's work history. Values are present (default), past, and pastAndPresent.\n     */\n    companyPastOrPresent?: string\n    /**\n     * Contact educational institution\n     */\n    school?: string\n    /**\n     * Contact education degree\n     */\n    degree?: string\n    /**\n     * Searches by contact's location IDs. Use the Location Enrich endpoint to obtain a list of location IDs for a company.\n     */\n    locationCompanyId?: string[]\n    /**\n     * ZoomInfo unique identifier for the company. Will accept a comma-separated list.\n     */\n    companyId?: string\n    /**\n     * Company name. Can use OR and NOT operators to include or exclude companies by name. For example, \"Vodaphone OR Comcast NOT Verizon\"\n     */\n    companyName?: string\n    /**\n     * URL to the company website in http://www.example.com format\n     */\n    companyWebsite?: string\n    /**\n     * Company stock ticker symbol\n     */\n    companyTicker?: string[]\n    /**\n     * Text description unique to the company you want to use as search criteria\n     */\n    companyDescription?: string\n    /**\n     * ZoomInfo Company ID for parent company\n     */\n    parentId?: string\n    /**\n     * ZoomInfo Company ID for ultimate parent company\n     */\n    ultimateParentId?: string\n    /**\n     * Company type (private, public, and so on). See the Company Type lookup endpoint for values.\n     */\n    companyType?: string\n    /**\n     * Company address\n     */\n    address?: string\n    /**\n     * Company street\n     */\n    street?: string\n    /**\n     * Company state (U.S.) or province (Canada). You can use free text state or province names (e.g., \"new hampshire\"), the two-letter common abbreviation for a U.S. state (e.g., \"nh\"), or values provided in the State lookup endpoint.\n     */\n    state?: string\n    /**\n     * Zip Code of the company's primary address.\n     */\n    zipCode?: string\n    /**\n     * Country for the company's primary address. You can use free text or see the Country lookup endpoint for values.\n     */\n    country?: string\n    /**\n     * Continent for the company's primary address. See the Continent lookup endpoint for values.\n     */\n    continent?: string\n    /**\n     * Used in conjunction with zipCode, designates a geographical radius (in miles) from the zipCode provided.\n     */\n    zipCodeRadiusMiles?: string\n    /**\n     * Hash tags for a company. Can include a comma-separated list.\n     */\n    hashTagString?: string\n    /**\n     * Specify technology product tags. See the Tech - Product lookup endpoint for values. This string uses a numerical dot notation format similar to an IP address. The notation denotes the hierarchical structure: parent-category.category.vendor. For example, 333.202.28. You can use wildcards in the notation (e.g., 333.202.\\\\\\\\\\\\*, \\\\\\\\\\\\*.202.\\\\\\\\\\\\*, and so on).\n     */\n    techAttributeTagList?: string\n    /**\n     * Company sub types (e.g., division, subsidiary and so on). See the Sub Unit Type lookup endpoint for values.\n     */\n    subUnitTypes?: string\n    /**\n     * Used in conjunction with the industryCodes input parameter. When set to true, any result returned must have one of the specified industries as a primary industry. If no industries are specified, then this parameter will be ignored. Default is false.\n     */\n    primaryIndustriesOnly?: boolean\n    /**\n     * Top-level industry that the contact works in. A contact can have multiple top level industries. Tags are based on the contact's current company. Can include a comma-separated list. See the Industry Codes lookup endpoint for values.\n     */\n    industryCodes?: string\n    /**\n     * Industry keywords associated with a company. Can include a comma-separated list.\n     */\n    industryKeywords?: string\n    /**\n     * The Standard Industrial Classification is a system for classifying industries by a four-digit code. See the SIC Codes lookup endpoint for values.\n     */\n    sicCodes?: string\n    /**\n     * The North American Industry Classification System (NAICS) is the standard used by Federal statistical agencies in classifying business establishments for the purpose of collecting, analyzing, and publishing statistical data related to the U.S. business economy. See the NAICS Codes lookup endpoint for values.\n     */\n    naicsCodes?: string\n    /**\n     * Minimum annual revenue for a company in U.S. dollars. Use with revenueMax to set a range. Alternatively, you can use the revenue parameter to search for pre-defined ranges.\n     */\n    revenueMin?: number\n    /**\n     * Maximum annual revenue for a company in U.S. dollars. Use with revenueMin to set a range. Alternatively, you can use the revenue parameter to search for pre-defined ranges.\n     */\n    revenueMax?: number\n    /**\n     * Annual revenue range in U.S. dollars. Accepts a comma-separated list of values. See the Revenue Range lookup endpoint for values. Alternatively, to get more granular ranges, you can use the revenueMin and revenueMax parameters.\n     */\n    revenue?: string\n    /**\n     * Minimum employee count for a company. Use with employeeRangeMax to set a range. Alternatively, you can use the employeeCount parameter to search for pre-defined ranges.\n     */\n    employeeRangeMin?: string\n    /**\n     * Maximum employee count for a company. Use with employeeRangeMin to set a range. Alternatively, you can use the employeeCount parameter to search for pre-defined ranges.\n     */\n    employeeRangeMax?: string\n    /**\n     * Employee count range. Accepts a comma-separated list of values. See the Employee Count lookup endpoint for values. Alternatively, to get more granular ranges, you can use the employeeRangeMin and employeeRangeMax parameters.\n     */\n    employeeCount?: string\n    /**\n     * Company ranking list (e.g., Fortune 500 and so on). See the Company Ranking lookup endpoint for values.\n     */\n    companyRanking?: string\n    /**\n     * Company metro area. Accepts a comma-separated list of U.S. and Canada metro areas. See the Metro Area lookup endpoint for values.\n     */\n    metroRegion?: string\n    /**\n     * Location criteria for search. Values are PersonOrHQ, PersonAndHQ, Person, HQ, PersonThenHQ.\n     */\n    locationSearchType?: string\n    /**\n     * Minimum funding amount in thousands (e.g., 1 = 1000, 500 = 500,000). If fundingAmountMin is used without fundingAmountMax, the result will be the amount specified or greater.\n     */\n    fundingAmountMin?: number\n    /**\n     * Maximum funding amount in thousands (e.g., 1 = 1000, 500 = 500,000). If fundingAmountMax is used without fundingAmountMin, the result will be the amount specified or less.\n     */\n    fundingAmountMax?: number\n    /**\n     * Start date of the funding in YYYY-MM-DD format. If fundingStartDate and fundingEndDate are both specified, they will be used as a range. Start date after end date returns an error. If start date and end date are the same, will return results for exact date.\n     */\n    fundingStartDate?: string\n    /**\n     * End date of the funding in YYYY-MM-DD format. If fundingStartDate and fundingEndDate are both specified, they will be used as a range. Start date after end date returns an error. If start date and end date are the same, will return results for exact date.\n     */\n    fundingEndDate?: string\n    /**\n     * Exclude a company metro area. Accepts a comma-separated list of U.S. and Canada metro areas. See the Metro Area lookup endpoint for values.\n     */\n    excludedRegions?: string\n    /**\n     * Minimum number of ZoomInfo contacts associated with company\n     */\n    zoominfoContactsMin?: string\n    /**\n     * Maximum number of ZoomInfo contacts associated with company\n     */\n    zoominfoContactsMax?: string\n    /**\n     * Company hierarchical structure\n     */\n    companyStructureIncludedSubUnitTypes?: string\n    /**\n     * Minimum one year employee growth rate for a company. Use with oneYearEmployeeGrowthRateMax to set a range.\n     */\n    oneYearEmployeeGrowthRateMin?: string\n    /**\n     * Maximum one year employee growth rate for a company. Use with oneYearEmployeeGrowthRateMin to set a range.\n     */\n    oneYearEmployeeGrowthRateMax?: string\n    /**\n     * Minimum two year employee growth rate for a company. Use with twoYearEmployeeGrowthRateMax to set a range.\n     */\n    twoYearEmployeeGrowthRateMin?: string\n    /**\n     * Maximum two year employee growth rate for a company. Use with twoYearEmployeeGrowthRateMin to set a range.\n     */\n    twoYearEmployeeGrowthRateMax?: string\n    /**\n     * Minimum date for when a contact began current employment. Use with positionStartDateMax to set a range.\n     */\n    positionStartDateMin?: string\n    /**\n     * Maximum date for when a contact began current employment. Use with positionStartDateMin to set a range.\n     */\n    positionStartDateMax?: string\n    /**\n     * List of web references for a contact. Default criteria is OR between multiple values. Should only contain english letters and numbers.\n     */\n    webReferences?: string[]\n    /**\n     * Boolean flag for Buying Committee. Setting this to TRUE will filter the results based on the Buying Committees set for the account. Default is FALSE.\n     */\n    filterByBuyingCommittee?: boolean\n    /**\n     * List of technology skills for a contact. Default criteria is OR between multiple values. Should only contain string numbers\n     */\n    techSkills?: string[]\n    /**\n     * Years of overall experience. Must be a comma-separated string of values. See the Years of Experience lookup endpoint for values.\n     */\n    yearsOfExperience?: string\n    /**\n     * Engagement start date in YYYY-MM-DD format.\n     */\n    engagementStartDate?: string\n    /**\n     * Engagement end date in YYYY-MM-DD format. EngagementStartDate is required.\n     */\n    engagementEndDate?: string\n    /**\n     * List of engagement types to search for. Accepted values are a list of email, phone, online meeting.\n     */\n    engagementType?: string[]\n  }\n\n  export interface SearchCompaniesOptions {\n    /**\n     * Limits the results returned to the given number of results per page. Default is 25.\n     */\n    rpp?: number\n    /**\n     * Provides the results for the given page, used in conjunction with rpp\n     */\n    page?: number\n    /**\n     * Provide sortBy if specifying sortOrder. Valid values are asc, ascending, desc, and descending. By default, results are sorted in descending order.\n     */\n    sortOrder?: string\n    /**\n     * Sort results by valid output fields: name, employeeCount, revenue\n     */\n    sortBy?: string\n    /**\n     * ZoomInfo unique identifier for the company. Will accept-comma-separated list.\n     */\n    companyId?: string\n    /**\n     * Company name\n     */\n    companyName?: string\n    /**\n     * URL to the company website in http://www.example.com format\n     */\n    companyWebsite?: string\n    /**\n     * Text description unique to the company you want to use as search criteria\n     */\n    companyDescription?: string\n    /**\n     * ZoomInfo Company ID for parent company\n     */\n    parentId?: string\n    /**\n     * ZoomInfo Company ID for ultimate parent company\n     */\n    ultimateParentId?: string\n    /**\n     * Company stock ticker symbol\n     */\n    companyTicker?: string[]\n    /**\n     * Company type (private, public, and so on). See the Company Type lookup endpoint for values.\n     */\n    companyType?: string\n    /**\n     * Search using Business Model (B2C, B2B, B2G) for a company. Default is All\n     */\n    businessModel?: string[]\n    /**\n     * Company address\n     */\n    address?: string\n    /**\n     * Company street\n     */\n    street?: string\n    /**\n     * Company state (U.S.) or province (Canada). You can use free text state or province names (e.g., \"new hampshire\"), the two-letter common abbreviation for a U.S. state (e.g., \"nh\"), or values provided in the State lookup endpoint. Do not use state in conjunction with country in a search request, as the system uses OR logic between these two fields. If both are included in the request, the returned results will reflect all states.\n     */\n    state?: string\n    /**\n     * Zip Code of the company's primary address.\n     */\n    zipCode?: string\n    /**\n     * Country for the company's primary address. You can use free text or see the Country lookup endpoint for values. Do not use country in conjunction with state in a search request, as the system uses OR logic between these two fields. If both are included in the request, the returned results will reflect all states.\n     */\n    country?: string\n    /**\n     * Continent for the company's primary address. See the Continent lookup endpoint for values.\n     */\n    continent?: string\n    /**\n     * Used in conjunction with zipCode, designates a geographical radius (in miles) from the zipCode provided.\n     */\n    zipCodeRadiusMiles?: string\n    /**\n     * Hash tags for a company. Can include a comma-separated list.\n     */\n    hashTagString?: string\n    /**\n     * Specify technology product tags. See the Tech - Product lookup endpoint for values. This string uses a numerical dot notation format similar to an IP address. The notation denotes the hierarchical structure: parent-category.category.vendor. For example, 333.202.28. You can use wildcards in the notation (e.g., 333.202.\\\\\\\\*, \\\\\\\\*.202.\\\\\\\\*, and so on).\n     */\n    techAttributeTagList?: string\n    /**\n     * Company sub types (e.g., division, subsidiary and so on). See the Sub Unit Type lookup endpoint for values.\n     */\n    subUnitTypes?: string\n    /**\n     * Used in conjunction with the industryCodes input parameter. When set to true, any result returned must have one of the specified industries as a primary industry. If no industries are specified, then this parameter will be ignored. Default is false.\n     */\n    primaryIndustriesOnly?: boolean\n    /**\n     * Top-level Industry that the contact works in. A contact can have multiple top level industries. Tags are based on the contact's current company. Can include a comma-separated list. See the Industry Codes lookup endpoint for values.\n     */\n    industryCodes?: string\n    /**\n     * Industry keywords associated with a company. Can include either 'AND' or 'OR' operators. For example, 'software AND security' or 'software OR security'.\n     */\n    industryKeywords?: string\n    /**\n     * The Standard Industrial Classification is a system for classifying industries by a four-digit code. See the SIC Codes lookup endpoint for values.\n     */\n    sicCodes?: string\n    /**\n     * The North American Industry Classification System (NAICS) is the standard used by Federal statistical agencies in classifying business establishments for the purpose of collecting, analyzing, and publishing statistical data related to the U.S. business economy. See the NAICS Codes lookup endpoint for values.\n     */\n    naicsCodes?: string\n    /**\n     * Minimum annual revenue for a company in U.S. dollars. Use with revenueMax to set a range. Alternatively, you can use the revenue parameter to search for pre-defined ranges.\n     */\n    revenueMin?: number\n    /**\n     * Maximum annual revenue for a company in U.S. dollars. Use with revenueMin to set a range. Alternatively, you can use the revenue parameter to search for pre-defined ranges.\n     */\n    revenueMax?: number\n    /**\n     * Annual revenue range in U.S. dollars. Accepts a comma-separated list of values. See the Revenue Range lookup endpoint for values. Alternatively, to get more granular ranges, you can use the revenueMin and revenueMax parameters.\n     */\n    revenue?: string\n    /**\n     * Minimum employee count for a company. Use with employeeRangeMax to set a range. Alternatively, you can use the employeeCount parameter to search for pre-defined ranges.\n     */\n    employeeRangeMin?: string\n    /**\n     * Maximum employee count for a company. Use with employeeRangeMin to set a range. Alternatively, you can use the employeeCount parameter to search for pre-defined ranges.\n     */\n    employeeRangeMax?: string\n    /**\n     * Employee count range. Accepts a comma-separated list of values. See the Employee Count lookup endpoint for values. Alternatively, to get more granular ranges, you can use the employeeRangeMin and employeeRangeMax parameters.\n     */\n    employeeCount?: string\n    /**\n     * Company ranking list (e.g., Fortune 500 and so on). See the Company Ranking lookup endpoint for values.\n     */\n    companyRanking?: string\n    /**\n     * Company metro area. Accepts a comma-separated list of U.S. and Canada metro areas. See the Metro Area lookup endpoint for values.\n     */\n    metroRegion?: string\n    /**\n     * Location criteria for search. Values are PersonOrHQ, PersonAndHQ, Person, HQ, PersonThenHQ.\n     */\n    locationSearchType?: string\n    /**\n     * Minimum funding amount in thousands (e.g., 1 = 1000, 500 = 500,000). If fundingAmountMin is used without fundingAmountMax, the result will be the amount specified or greater.\n     */\n    fundingAmountMin?: number\n    /**\n     * Maximum funding amount in thousands (e.g., 1 = 1000, 500 = 500,000). If fundingAmountMax is used without fundingAmountMin, the result will be the amount specified or less.\n     */\n    fundingAmountMax?: number\n    /**\n     * Start date of the funding in YYYY-MM-DD format. If fundingStartDate and fundingEndDate are both specified, they will be used as a range. Start date after end date returns an error. If start date and end date are the same, will return results for exact date.\n     */\n    fundingStartDate?: string\n    /**\n     * End date of the funding in YYYY-MM-DD format. If fundingStartDate and fundingEndDate are both specified, they will be used as a range. Start date after end date returns an error. If start date and end date are the same, will return results for exact date.\n     */\n    fundingEndDate?: string\n    /**\n     * Exclude a company metro area. Accepts a comma-separated list of U.S. and Canada metro areas. See the Metro Area lookup endpoint for values.\n     */\n    excludedRegions?: string\n    /**\n     * Minimum number of ZoomInfo contacts associated with company\n     */\n    zoominfoContactsMin?: string\n    /**\n     * Maximum number of ZoomInfo contacts associated with company\n     */\n    zoominfoContactsMax?: string\n    /**\n     * Company hierarchical structure\n     */\n    companyStructureIncludedSubUnitTypes?: string\n    /**\n     * Denotes if ZoomInfo's research and data team has confirmed activity within the past 12 months\n     */\n    certified?: number\n    /**\n     * Include or exclude defunct companies. The default value is false.\n     */\n    excludeDefunctCompanies?: boolean\n    /**\n     * Minimum one year employee growth rate for a company. Use with oneYearEmployeeGrowthRateMax to set a range.\n     */\n    oneYearEmployeeGrowthRateMin?: string\n    /**\n     * Maximum one year employee growth rate for a company. Use with oneYearEmployeeGrowthRateMin to set a range.\n     */\n    oneYearEmployeeGrowthRateMax?: string\n    /**\n     * Minimum two year employee growth rate for a company. Use with twoYearEmployeeGrowthRateMax to set a range.\n     */\n    twoYearEmployeeGrowthRateMin?: string\n    /**\n     * Maximum two year employee growth rate for a company. Use with twoYearEmployeeGrowthRateMin to set a range.\n     */\n    twoYearEmployeeGrowthRateMax?: string\n    /**\n     * Engagement start date in YYYY-MM-DD format.\n     */\n    engagementStartDate?: string\n    /**\n     * Engagement end date in YYYY-MM-DD format. EngagementStartDate is required.\n     */\n    engagementEndDate?: string\n    /**\n     * List of engagement types to search for. Accepted values are a list of email, phone, online meeting.\n     */\n    engagementType?: string[]\n  }\n\n  export interface SearchResult<T> {\n    maxResults: number\n    totalResults: number\n    currentPage: number\n    data: T[]\n  }\n\n  export type SearchContactsResponse = SearchResult<ContactSearchResult>\n  export type SearchCompaniesResponse = SearchResult<CompanySearchResult>\n\n  export interface ContactSearchResult {\n    id: number\n    firstName: string\n    middleName: string\n    lastName: string\n    validDate: string\n    lastUpdatedDate: string\n    jobTitle: string\n    contactAccuracyScore: number\n    hasEmail: boolean\n    hasSupplementalEmail: boolean\n    hasDirectPhone: boolean\n    hasMobilePhone: boolean\n    hasCompanyIndustry: boolean\n    hasCompanyPhone: boolean\n    hasCompanyStreet: boolean\n    hasCompanyState: boolean\n    hasCompanyZipCode: boolean\n    hasCompanyCountry: boolean\n    hasCompanyRevenue: boolean\n    hasCompanyEmployeeCount: boolean\n    company: CompanySearchResult\n  }\n\n  export interface CompanySearchResult {\n    id: number\n    name: string\n  }\n\n  export const defaultEnrichContactOutputFields = [\n    'id',\n    'firstName',\n    'middleName',\n    'lastName',\n    'email',\n    'hasCanadianEmail',\n    'phone',\n    'directPhoneDoNotCall',\n    'street',\n    'city',\n    'region',\n    'metroArea',\n    'zipCode',\n    'state',\n    'country',\n    'personHasMoved',\n    'withinEu',\n    'withinCalifornia',\n    'withinCanada',\n    'lastUpdatedDate',\n    'noticeProvidedDate',\n    'salutation',\n    'suffix',\n    'jobTitle',\n    'jobFunction',\n    'companyDivision',\n    'education',\n    'hashedEmails',\n    'picture',\n    'mobilePhoneDoNotCall',\n    'externalUrls',\n    'companyId',\n    'companyName',\n    'companyDescriptionList',\n    'companyPhone',\n    'companyFax',\n    'companyStreet',\n    'companyCity',\n    'companyState',\n    'companyZipCode',\n    'companyCountry',\n    'companyLogo',\n    'companySicCodes',\n    'companyNaicsCodes',\n    'contactAccuracyScore',\n    'companyWebsite',\n    'companyRevenue',\n    'companyRevenueNumeric',\n    'companyEmployeeCount',\n    'companyType',\n    'companyTicker',\n    'companyRanking',\n    'isDefunct',\n    'companySocialMediaUrls',\n    'companyPrimaryIndustry',\n    'companyIndustries',\n    'companyRevenueRange',\n    'companyEmployeeRange',\n    'employmentHistory',\n    'managementLevel',\n    'locationCompanyId'\n  ] as const\n\n  export const defaultEnrichCompanyOutputFields = [\n    'id',\n    'name',\n    'website',\n    'domainList',\n    'logo',\n    'ticker',\n    'revenue',\n    'socialMediaUrls',\n    'employeeCount',\n    'numberOfContactsInZoomInfo',\n    'phone',\n    'fax',\n    'street',\n    'city',\n    'state',\n    'zipCode',\n    'country',\n    'continent',\n    'companyStatus',\n    'companyStatusDate',\n    'descriptionList',\n    'sicCodes',\n    'naicsCodes',\n    'competitors',\n    'ultimateParentId',\n    'ultimateParentName',\n    'ultimateParentRevenue',\n    'ultimateParentEmployees',\n    'subUnitCodes',\n    'subUnitType',\n    'subUnitIndustries',\n    'primaryIndustry',\n    'industries',\n    'parentId',\n    'parentName',\n    'locationCount',\n    'metroArea',\n    'lastUpdatedDate',\n    'createdDate',\n    'certificationDate',\n    'certified',\n    'hashtags',\n    'products',\n    'techAttributes',\n    'revenueRange',\n    'employeeRange',\n    'companyFunding',\n    'recentFundingAmount',\n    'recentFundingDate',\n    'totalFundingAmount',\n    'employeeGrowth'\n  ] as const\n\n  export interface UsageResponse {\n    usage: Usage[]\n  }\n\n  export interface Usage {\n    limitType: string\n    description: string\n    limit: number\n    currentUsage: number\n    usageRemaining: number\n  }\n}\n\n/**\n * ZoomInfo is a robust B2B enrichment and search API for people and companies.\n *\n * @see https://api-docs.zoominfo.com\n * @see https://tech-docs.zoominfo.com/enterprise-api-getting-started-guide.pdf\n */\nexport class ZoomInfoClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiBaseUrl: string\n\n  protected readonly username: string\n  protected readonly password: string | undefined\n  protected readonly clientId: string | undefined\n  protected readonly privateKey: string | undefined\n\n  protected accessToken: string | undefined\n  protected accessTokenDateMS: number | undefined\n\n  constructor({\n    username = getEnv('ZOOMINFO_USERNAME'),\n    password = getEnv('ZOOMINFO_PASSWORD'),\n    clientId = getEnv('ZOOMINFO_CLIENT_ID'),\n    privateKey = getEnv('ZOOMINFO_PRIVATE_KEY'),\n    apiBaseUrl = zoominfo.API_BASE_URL,\n    timeoutMs = 60_000,\n    throttle = true,\n    ky = defaultKy\n  }: {\n    username?: string\n    password?: string\n    clientId?: string\n    privateKey?: string\n    apiBaseUrl?: string\n    apiKnowledgeGraphBaseUrl?: string\n    timeoutMs?: number\n    throttle?: boolean\n    ky?: KyInstance\n  } = {}) {\n    assert(\n      username,\n      `ZoomInfoClient missing required \"username\" (defaults to \"ZOOMINFO_USERNAME\")`\n    )\n    assert(\n      password || (clientId && privateKey),\n      `ZoomInfoClient missing required \"password\" for basic auth or \"clientId\" and \"privateKey\" for PKI auth (defaults to \"ZOOMINFO_PASSWORD\", \"ZOOMINFO_CLIENT_ID\", and \"ZOOMINFO_PRIVATE_KEY\")`\n    )\n    super()\n\n    this.username = username\n    this.password = password\n    this.clientId = clientId\n    this.privateKey = privateKey\n\n    this.apiBaseUrl = apiBaseUrl\n\n    const throttledKy = throttle ? throttleKy(ky, zoominfo.throttle) : ky\n\n    this.ky = throttledKy.extend({\n      prefixUrl: apiBaseUrl,\n      timeout: timeoutMs\n    })\n  }\n\n  /**\n   * Attempts to authenticate with ZoomInfo using the provided credentials\n   * (either basic auth or PKI auth). If there's already a valid access token,\n   * then it will be reused unless `force` is set to `true`.\n   *\n   * NOTE: All API methods call this internally, so there is no reason to call\n   * this yourself unless you need to force a re-authentication.\n   */\n  async authenticate({\n    force = false\n  }: { force?: boolean } = {}): Promise<void> {\n    if (\n      !force &&\n      this.accessToken &&\n      this.accessTokenDateMS! + zoominfo.ACCESS_TOKEN_EXPIRATION_MS > Date.now()\n    ) {\n      // Access token is still valid.\n      return\n    }\n\n    if (this.username && this.password) {\n      this.accessTokenDateMS = Date.now()\n      this.accessToken = await this.getAccessTokenViaBasicAuth({\n        username: this.username,\n        password: this.password\n      })\n\n      assert(\n        this.accessToken,\n        'ZoomInfo failed to get access token via basic auth'\n      )\n      return\n    }\n\n    if (this.username && this.clientId && this.privateKey) {\n      this.accessTokenDateMS = Date.now()\n      this.accessToken = await this.getAccessTokenViaPKI({\n        username: this.username,\n        clientId: this.clientId,\n        privateKey: this.privateKey\n      })\n\n      assert(\n        this.accessToken,\n        'ZoomInfo failed to get access token via PKI auth'\n      )\n      return\n    }\n\n    throw new Error(\n      'ZoomInfoClient missing required authentication credentials'\n    )\n  }\n\n  /**\n   * This method is used internally and should not be called directly except\n   * for advanced use cases.\n   */\n  async getAccessTokenViaBasicAuth({\n    username,\n    password\n  }: {\n    username: string\n    password: string\n  }): Promise<string> {\n    const res = await this.ky\n      .post('authenticate', {\n        json: {\n          username,\n          password\n        },\n        headers: {\n          'cache-control': 'no-cache'\n        }\n      })\n      .json<{ jwt: string }>()\n\n    return res.jwt\n  }\n\n  /**\n   * This method is used internally and should not be called directly except\n   * for advanced use cases.\n   */\n  async getAccessTokenViaPKI({\n    username,\n    clientId,\n    privateKey\n  }: {\n    username: string\n    clientId: string\n    privateKey: string\n  }): Promise<string> {\n    const dtNow = Date.now()\n    const header = {\n      typ: 'JWT',\n      alg: 'RS256'\n    }\n    const data = {\n      aud: 'enterprise_api',\n      iss: 'api-client@zoominfo.com',\n      username,\n      client_id: clientId,\n      iat: getIAT(dtNow),\n      exp: getEXP(dtNow)\n    }\n    const sHeader = JSON.stringify(header)\n    const sPayload = JSON.stringify(data)\n\n    const clientJWT = KJUR.jws.JWS.sign(\n      header.alg,\n      sHeader,\n      sPayload,\n      privateKey\n    )\n\n    const res = await this.ky\n      .post('authenticate', {\n        json: {},\n        headers: {\n          Authorization: `Bearer ${clientJWT}`,\n          'cache-control': 'no-cache'\n        }\n      })\n      .json<{ jwt: string }>()\n\n    return res.jwt\n  }\n\n  /**\n   * Attempts to enrich a person contact with ZoomInfo data\n   */\n  @aiFunction({\n    name: 'zoominfo_enrich_contact',\n    description: `Attempts to enrich a person contact with ZoomInfo data. To match a contact, you must use one of the following combinations of parameters to construct your input:\n\npersonId OR emailAddress OR hashedEmail OR phone. Because these values are unique to a single person, you can use any one of these values to search without providing any additional parameters. You can optionally combine one of these values with a companyId/companyName.\n\nfirstName AND lastName AND companyId/companyName. Combining these values effectively results in a unique person.\n\nfullName AND companyId/companyName. Combining these values effectively results in a unique person.`,\n    inputSchema: z.object({\n      firstName: z.string().optional().describe('First name of the person.'),\n      lastName: z.string().optional().describe('Last name of the person.'),\n      companyId: z\n        .string()\n        .optional()\n        .describe(\"Unique ZoomInfo identifier of the person's company.\"),\n      companyName: z\n        .string()\n        .optional()\n        .describe(\n          'Name of the company where the contact works, or has worked.'\n        ),\n      personId: z\n        .string()\n        .optional()\n        .describe('Unique ZoomInfo identifier of the person.'),\n      emailAddress: z.string().optional(),\n      hashedEmail: z.string().optional(),\n      phone: z.string().optional(),\n      fullName: z.string().optional(),\n      jobTitle: z.string().optional(),\n      externalURL: z.string().optional(),\n      lastUpdatedDateAfter: z.string().optional(),\n      validDateAfter: z.string().optional(),\n      contactAccuracyScoreMin: z.number().optional(),\n      outputFields: z.array(z.string()).optional()\n    })\n  })\n  async enrichContact(opts: zoominfo.EnrichContactOptions) {\n    await this.authenticate()\n\n    const {\n      outputFields = zoominfo.defaultEnrichContactOutputFields,\n      ...matchPersonInput\n    } = opts\n\n    return this.ky\n      .post('enrich/contact', {\n        json: {\n          matchPersonInput: [matchPersonInput],\n          outputFields\n        },\n        headers: {\n          Authorization: `Bearer ${this.accessToken}`\n        }\n      })\n      .json<zoominfo.EnrichContactResponse>()\n  }\n\n  /**\n   * Attempts to enrich a company with ZoomInfo data.\n   */\n  @aiFunction({\n    name: 'zoominfo_enrich_company',\n    description:\n      'Attempts to enrich a company with ZoomInfo data. To match a company, you should ideally provide the `companyName` and `companyWebsite`.',\n    inputSchema: z.object({\n      companyId: z\n        .string()\n        .optional()\n        .describe('Unique ZoomInfo identifier of company.'),\n      companyName: z.string().optional().describe('Name of the company.'),\n      companyWebsite: z.string().optional(),\n      companyTicker: z.string().optional(),\n      companyPhone: z.string().optional(),\n      companyFax: z.string().optional(),\n      companyStreet: z.string().optional(),\n      companyCity: z.string().optional(),\n      companyState: z.string().optional(),\n      companyZipCode: z.string().optional(),\n      companyCountry: z.string().optional(),\n      ipAddress: z.string().optional(),\n      outputFields: z.array(z.string()).optional()\n    })\n  })\n  async enrichCompany(opts: zoominfo.EnrichCompanyOptions) {\n    await this.authenticate()\n\n    const {\n      outputFields = zoominfo.defaultEnrichCompanyOutputFields,\n      ...matchCompanyInput\n    } = opts\n\n    return this.ky\n      .post('enrich/company', {\n        json: {\n          matchCompanyInput: [matchCompanyInput],\n          outputFields\n        },\n        headers: {\n          Authorization: `Bearer ${this.accessToken}`\n        }\n      })\n      .json<zoominfo.EnrichCompanyResponse>()\n  }\n\n  /**\n   * Returns a list of Contacts from ZoomInfo's data that meet the specified\n   * search criteria.\n   */\n  @aiFunction({\n    name: 'zoominfo_search_contacts',\n    description:\n      \"Returns a list of Contacts from ZoomInfo's data that meet the specified search criteria.\",\n    inputSchema: z.object({\n      rpp: z.number().optional(),\n      page: z.number().optional(),\n      sortOrder: z.string().optional(),\n      sortBy: z.string().optional(),\n      personId: z.string().optional(),\n      emailAddress: z.string().optional(),\n      supplementalEmail: z.array(z.string()).optional(),\n      hashedEmail: z.string().optional(),\n      phone: z.array(z.string()).optional(),\n      fullName: z.string().optional(),\n      firstName: z.string().optional(),\n      middleInitial: z.string().optional(),\n      lastName: z.string().optional(),\n      jobTitle: z.string().optional(),\n      excludeJobTitle: z.string().optional(),\n      managementLevel: z.string().optional(),\n      excludeManagementLevel: z.string().optional(),\n      department: z.string().optional(),\n      boardMember: z.string().optional(),\n      excludePartialProfiles: z.boolean().optional(),\n      executivesOnly: z.boolean().optional(),\n      requiredFields: z.string().optional(),\n      contactAccuracyScoreMin: z.string().optional(),\n      contactAccuracyScoreMax: z.string().optional(),\n      jobFunction: z.string().optional(),\n      lastUpdatedDateAfter: z.string().optional(),\n      validDateAfter: z.string().optional(),\n      lastUpdatedInMonths: z.number().optional(),\n      hasBeenNotified: z.string().optional(),\n      companyPastOrPresent: z.string().optional(),\n      school: z.string().optional(),\n      degree: z.string().optional(),\n      locationCompanyId: z.array(z.string()).optional(),\n      companyId: z.string().optional(),\n      companyName: z.string().optional(),\n      companyWebsite: z.string().optional(),\n      companyTicker: z.array(z.string()).optional(),\n      companyDescription: z.string().optional(),\n      parentId: z.string().optional(),\n      ultimateParentId: z.string().optional(),\n      companyType: z.string().optional(),\n      address: z.string().optional(),\n      street: z.string().optional(),\n      state: z.string().optional(),\n      zipCode: z.string().optional(),\n      country: z.string().optional(),\n      continent: z.string().optional(),\n      zipCodeRadiusMiles: z.string().optional(),\n      hashTagString: z.string().optional(),\n      techAttributeTagList: z.string().optional(),\n      subUnitTypes: z.string().optional(),\n      primaryIndustriesOnly: z.boolean().optional(),\n      industryCodes: z.string().optional(),\n      industryKeywords: z.string().optional(),\n      sicCodes: z.string().optional(),\n      naicsCodes: z.string().optional(),\n      revenueMin: z.number().optional(),\n      revenueMax: z.number().optional(),\n      revenue: z.string().optional(),\n      employeeRangeMin: z.string().optional(),\n      employeeRangeMax: z.string().optional(),\n      employeeCount: z.string().optional(),\n      companyRanking: z.string().optional(),\n      metroRegion: z.string().optional(),\n      locationSearchType: z.string().optional(),\n      fundingAmountMin: z.number().optional(),\n      fundingAmountMax: z.number().optional(),\n      fundingStartDate: z.string().optional(),\n      fundingEndDate: z.string().optional(),\n      excludedRegions: z.string().optional(),\n      zoominfoContactsMin: z.string().optional(),\n      zoominfoContactsMax: z.string().optional(),\n      companyStructureIncludedSubUnitTypes: z.string().optional(),\n      oneYearEmployeeGrowthRateMin: z.string().optional(),\n      oneYearEmployeeGrowthRateMax: z.string().optional(),\n      twoYearEmployeeGrowthRateMin: z.string().optional(),\n      twoYearEmployeeGrowthRateMax: z.string().optional(),\n      positionStartDateMin: z.string().optional(),\n      positionStartDateMax: z.string().optional(),\n      webReferences: z.array(z.string()).optional(),\n      filterByBuyingCommittee: z.boolean().optional(),\n      techSkills: z.array(z.string()).optional(),\n      yearsOfExperience: z.string().optional(),\n      engagementStartDate: z.string().optional(),\n      engagementEndDate: z.string().optional(),\n      engagementType: z.array(z.string()).optional()\n    })\n  })\n  async searchContacts(opts: zoominfo.SearchContactsOptions) {\n    await this.authenticate()\n\n    return this.ky\n      .post('search/contact', {\n        json: opts,\n        headers: {\n          Authorization: `Bearer ${this.accessToken}`\n        }\n      })\n      .json<zoominfo.SearchContactsResponse>()\n  }\n\n  /**\n   * Returns a list of Companies from ZoomInfo's data which meet the specified\n   * search criteria.\n   */\n  @aiFunction({\n    name: 'zoominfo_search_companies',\n    description:\n      \"Returns a list of Companies from ZoomInfo's data that meet the specified search criteria.\",\n    inputSchema: z.object({\n      rpp: z.number().optional(),\n      page: z.number().optional(),\n      sortOrder: z.string().optional(),\n      sortBy: z.string().optional(),\n      companyId: z.string().optional(),\n      companyName: z.string().optional(),\n      companyWebsite: z.string().optional(),\n      companyDescription: z.string().optional(),\n      parentId: z.string().optional(),\n      ultimateParentId: z.string().optional(),\n      companyTicker: z.array(z.string()).optional(),\n      companyType: z.string().optional(),\n      businessModel: z.array(z.string()).optional(),\n      address: z.string().optional(),\n      street: z.string().optional(),\n      state: z.string().optional(),\n      zipCode: z.string().optional(),\n      country: z.string().optional(),\n      continent: z.string().optional(),\n      zipCodeRadiusMiles: z.string().optional(),\n      hashTagString: z.string().optional(),\n      techAttributeTagList: z.string().optional(),\n      subUnitTypes: z.string().optional(),\n      primaryIndustriesOnly: z.boolean().optional(),\n      industryCodes: z.string().optional(),\n      industryKeywords: z.string().optional(),\n      sicCodes: z.string().optional(),\n      naicsCodes: z.string().optional(),\n      revenueMin: z.number().optional(),\n      revenueMax: z.number().optional(),\n      revenue: z.string().optional(),\n      employeeRangeMin: z.string().optional(),\n      employeeRangeMax: z.string().optional(),\n      employeeCount: z.string().optional(),\n      companyRanking: z.string().optional(),\n      metroRegion: z.string().optional(),\n      locationSearchType: z.string().optional(),\n      fundingAmountMin: z.number().optional(),\n      fundingAmountMax: z.number().optional(),\n      fundingStartDate: z.string().optional(),\n      fundingEndDate: z.string().optional(),\n      excludedRegions: z.string().optional(),\n      zoominfoContactsMin: z.string().optional(),\n      zoominfoContactsMax: z.string().optional(),\n      companyStructureIncludedSubUnitTypes: z.string().optional(),\n      certified: z.number().optional(),\n      excludeDefunctCompanies: z.boolean().optional(),\n      oneYearEmployeeGrowthRateMin: z.string().optional(),\n      oneYearEmployeeGrowthRateMax: z.string().optional(),\n      twoYearEmployeeGrowthRateMin: z.string().optional(),\n      twoYearEmployeeGrowthRateMax: z.string().optional(),\n      engagementStartDate: z.string().optional(),\n      engagementEndDate: z.string().optional(),\n      engagementType: z.array(z.string()).optional()\n    })\n  })\n  async searchCompanies(opts: zoominfo.SearchCompaniesOptions) {\n    await this.authenticate()\n\n    return this.ky\n      .post('search/company', {\n        json: opts,\n        headers: {\n          Authorization: `Bearer ${this.accessToken}`\n        }\n      })\n      .json<zoominfo.SearchCompaniesResponse>()\n  }\n\n  /**\n   * Retrieve current usage stats and available data depending on your\n   * ZoomInfo plan.\n   */\n  @aiFunction({\n    name: 'zoominfo_get_usage',\n    description:\n      'Retrieves current usage stats for available data depending on your ZoomInfo plan.',\n    inputSchema: z.object({})\n  })\n  async getUsage() {\n    await this.authenticate()\n\n    return this.ky\n      .get('lookup/usage', {\n        headers: {\n          Authorization: `Bearer ${this.accessToken}`,\n          'cache-control': 'no-cache'\n        }\n      })\n      .json<zoominfo.UsageResponse>()\n  }\n}\n\nfunction getIAT(dtNow: number) {\n  const iat = Math.floor(dtNow / 1000)\n  return iat - 60\n}\n\nfunction getEXP(dtNow: number) {\n  const exp = Math.floor(dtNow / 1000) + 5 * 60\n  return exp - 60\n}\n"
  },
  {
    "path": "legacy/packages/zoominfo/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/pnpm-workspace.yaml",
    "content": "packages:\n  - packages/*\n  - examples/*\n\ncatalog:\n  '@ai-sdk/openai': ^1.3.22\n  '@apidevtools/swagger-parser': ^10.1.1\n  '@dexaai/dexter': ^4.1.1\n  '@e2b/code-interpreter': ^1.5.1\n  '@fisch0920/config': ^1.1.4\n  '@googleapis/customsearch': ^4.0.1\n  '@langchain/core': ^0.3.60\n  '@langchain/openai': ^0.5.14\n  '@llamaindex/openai': ^0.4.4\n  '@llamaindex/workflow': ^1.1.9\n  '@mastra/core': ^0.10.6\n  '@modelcontextprotocol/sdk': ^1.13.0\n  '@nangohq/node': 0.42.22\n  '@types/jsrsasign': ^10.5.15\n  '@types/node': ^24.0.4\n  '@xsai/tool': ^0.3.0-beta.4\n  ai: ^4.3.16\n  bumpp: ^10.2.0\n  camelcase: ^8.0.0\n  cleye: ^1.3.4\n  decamelize: ^6.0.0\n  dedent: ^1.6.0\n  del-cli: ^6.0.0\n  delay: ^6.0.0\n  dotenv: ^16.5.0\n  duck-duck-scrape: ^2.2.7\n  eslint: ^9.29.0\n  execa: ^9.6.0\n  exit-hook: ^4.0.0\n  fast-xml-parser: ^5.2.5\n  genkit: ^1.13.0\n  genkitx-openai: ^0.22.3\n  google-auth-library: ^9.15.1\n  googleapis: ^150.0.1\n  json-schema-to-zod: ^2.6.1\n  jsonrepair: ^3.12.0\n  jsrsasign: ^10.9.0\n  ky: ^1.8.1\n  langchain: ^0.3.29\n  lint-staged: ^16.1.2\n  llamaindex: ^0.11.8\n  mathjs: ^13.2.3\n  npm-run-all2: ^8.0.4\n  octokit: ^5.0.3\n  only-allow: ^1.2.1\n  openai: ^5.5.1\n  openai-fetch: ^3.4.2\n  openai-zod-to-json-schema: ^1.0.3\n  openapi-types: ^12.1.3\n  p-map: ^7.0.3\n  p-throttle: 6.2.0\n  prettier: ^3.6.0\n  restore-cursor: ^5.1.0\n  simple-git-hooks: ^2.13.0\n  string-strip-html: ^13.4.12\n  syncpack: 14.0.0-alpha.10\n  tsup: ^8.5.0\n  tsx: ^4.20.3\n  turbo: ^2.5.4\n  twitter-api-sdk: ^1.2.1\n  type-fest: ^4.41.0\n  typescript: ^5.8.3\n  vitest: ^3.2.4\n  wikibase-sdk: ^10.2.3\n  xsai: ^0.3.0-beta.4\n  zod: ^3.25.67\n  zod-validation-error: ^3.5.2\n  zoominfo-api-auth-client: ^1.0.1\n\nignoredBuiltDependencies:\n  - '@fisch0920/config'\n\nupdateConfig:\n  ignoreDependencies:\n    - p-throttle\n    - '@nangohq/node'\n"
  },
  {
    "path": "legacy/readme.md",
    "content": "> [!IMPORTANT]\n> (_June 28, 2025_) As part of an upcoming major Agentic 2.0 release, our site and docs will be undergoing breaking changes over the next few days. Please be patient if the site / docs don't load correctly until the transition is complete. Thank you && really excited to share more about Agentic's new direction soon!! 🙏\n\n<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"/docs/media/agentic-header.jpg\" width=\"308\">\n  </a>\n</p>\n\n<p align=\"center\">\n  <em>AI agent stdlib that works with any LLM and TypeScript AI SDK.</em>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/stdlib\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/stdlib.svg\" /></a>\n  <a href=\"https://github.com/transitive-bullshit/agentic/blob/main/license\"><img alt=\"MIT License\" src=\"https://img.shields.io/badge/license-MIT-blue\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# Agentic <!-- omit from toc -->\n\n- [Intro](#intro)\n  - [Using Multiple Tools](#using-multiple-tools)\n- [Features](#features)\n- [Docs](#docs)\n- [AI SDKs](#ai-sdks)\n  - [Vercel AI SDK](#vercel-ai-sdk)\n  - [Mastra](#mastra)\n  - [LangChain](#langchain)\n  - [LlamaIndex](#llamaindex)\n  - [Firebase Genkit](#firebase-genkit)\n  - [Dexa Dexter](#dexa-dexter)\n  - [OpenAI](#openai)\n  - [GenAIScript](#genaiscript)\n  - [xsAI SDK](#xsai-sdk)\n- [Tools](#tools)\n- [Contributors](#contributors)\n- [License](#license)\n\n## Intro\n\nAgentic is a **standard library of AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based usage**. Agentic works with all of the major TS AI SDKs (Vercel AI SDK, Mastra, LangChain, LlamaIndex, OpenAI SDK, MCP, etc).\n\nAgentic clients like `WeatherClient` can be used as normal TS classes:\n\n```ts\nimport { WeatherClient } from '@agentic/stdlib'\n\n// Requires `process.env.WEATHER_API_KEY` (free from weatherapi.com)\nconst weather = new WeatherClient()\n\nconst result = await weather.getCurrentWeather({\n  q: 'San Francisco'\n})\nconsole.log(result)\n```\n\nOr you can use these clients as **LLM-based tools**. Here's an example using [Vercel's AI SDK](https://github.com/vercel/ai):\n\n```ts\n// sdk-specific imports\nimport { openai } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\nimport { createAISDKTools } from '@agentic/ai-sdk'\n\n// sdk-agnostic imports\nimport { WeatherClient } from '@agentic/stdlib'\n\nconst weather = new WeatherClient()\n\nconst result = await generateText({\n  model: openai('gpt-4o-mini'),\n  // this is the key line which uses the `@agentic/ai-sdk` adapter\n  tools: createAISDKTools(weather),\n  toolChoice: 'required',\n  prompt: 'What is the weather in San Francisco?'\n})\n\nconsole.log(result.toolResults[0])\n```\n\nYou can use our standard library of thoroughly tested AI functions with your favorite AI SDK – without having to write any glue code!\n\n### Using Multiple Tools\n\nAll adapters (like `createAISDKTools`) accept a very flexible var args of `AIFunctionLike` parameters, so you can pass as many tools as you'd like.\n\nThey also expose a `.functions` property which is an `AIFunctionSet`. This combination makes it really easy to mix & match different tools together.\n\n```ts\nimport { SerperClient, WikipediaClient, FirecrawlClient } from '@agentic/stdlib'\nimport { createAIFunction } from '@agentic/core'\nimport { z } from 'zod'\n\nconst googleSearch = new SerperClient()\nconst wikipedia = new WikipediaClient()\nconst firecrawl = new FirecrawlClient()\n\nconst result = await generateText({\n  model: openai('gpt-4o-mini'),\n  // This example uses tools from 4 different sources. You can pass as many\n  // AIFunctionLike objects as you want.\n  tools: createAISDKTools(\n    googleSearch,\n    wikipedia,\n    // Pick a single function from the firecrawl client's set of AI functions\n    firecrawl.functions.pick('firecrawl_search'),\n    // Create a custom AI function (based off of Anthropic's think tool: https://www.anthropic.com/engineering/claude-think-tool)\n    createAIFunction({\n      name: 'think',\n      description: `Use this tool to think about something. It will not obtain new information or change the database, but just append the thought to the log. Use it when complex reasoning or some cache memory is needed.`,\n      inputSchema: z.object({\n        thought: z.string().describe('A thought to think about.')\n      }),\n      execute: ({ thought }) => thought\n    })\n  ),\n  prompt:\n    'What year did Jurassic Park the movie come out, and what else happened that year?'\n})\n```\n\nAn `AIFunctionLike` can be any agentic client instance, a single `AIFunction` selected from the client's `.functions` property (which holds an `AIFunctionSet` of available AI functions), or an AI function created manually via `createAIFunction`.\n\n`AIFunctionLike` and `AIFunctionSet` are implementation details that you likely won't have to touch directly, but they're important because of their flexibility.\n\n## Features\n\n- ✅ All tools are thoroughly tested in production\n- ✅ Tools work across all leading TS AI SDKs\n- ✅ Tools are hand-coded and extremely minimal\n- ✅ Tools have both a good manual DX and LLM DX via the `@aiFunction` decorator\n- ✅ Tools use native `fetch`\n- ✅ Tools use [ky](https://github.com/sindresorhus/ky) to wrap `fetch`, so HTTP options, throttling, retries, etc are easy to customize\n- ✅ Supports tools from any MCP server ([createMcpTools(...)](https://agentic.so/tools/mcp))\n- ✅ Generate new Agentic tool clients from OpenAPI specs ([@agentic/openapi-to-ts](./packages/openapi-to-ts))\n- ✅ 100% open source && not trying to sell you anything 💯\n\n## Docs\n\nFull docs are available at [agentic.so](https://agentic.so).\n\n## AI SDKs\n\n### Vercel AI SDK\n\n[Agentic adapter docs for the Vercel AI SDK](https://agentic.so/sdks/ai-sdk)\n\n### Mastra\n\n[Agentic adapter docs for the Mastra AI Agent framework](https://agentic.so/sdks/mastra)\n\n### LangChain\n\n[Agentic adapter docs for LangChain](https://agentic.so/sdks/langchain)\n\n### LlamaIndex\n\n[Agentic adapter docs for LlamaIndex](https://agentic.so/sdks/llamaindex)\n\n### Firebase Genkit\n\n[Agentic adapter docs for Genkit](https://agentic.so/sdks/genkit)\n\n### Dexa Dexter\n\n[Agentic adapter docs for Dexter](https://agentic.so/sdks/dexter)\n\n### OpenAI\n\n[Agentic adapter docs for OpenAI](https://agentic.so/sdks/openai)\n\n### GenAIScript\n\n[Agentic support in GenAIScript](https://agentic.so/sdks/genaiscript)\n\n### xsAI SDK\n\n[Agentic adapter docs for the xsAI SDK](https://agentic.so/sdks/xsai)\n\n## Tools\n\n| Service / Tool                                                                  | Package                         | Docs                                                  | Description                                                                                                                                                                                                                                                    |\n| ------------------------------------------------------------------------------- | ------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [Airtable](https://airtable.com/developers/web/api/introduction)                | `@agentic/airtable`             | [docs](https://agentic.so/tools/airtable)             | No-code spreadsheets, CRM, and database.                                                                                                                                                                                                                       |\n| [Apollo](https://docs.apollo.io)                                                | `@agentic/apollo`               | [docs](https://agentic.so/tools/apollo)               | B2B person and company enrichment API.                                                                                                                                                                                                                         |\n| [ArXiv](https://arxiv.org)                                                      | `@agentic/arxiv`                | [docs](https://agentic.so/tools/arxiv)                | Search for research articles.                                                                                                                                                                                                                                  |\n| [Bing](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api)           | `@agentic/bing`                 | [docs](https://agentic.so/tools/bing)                 | Bing web search.                                                                                                                                                                                                                                               |\n| [Brave Search](https://brave.com/search/api)                                    | `@agentic/brave-search`         | [docs](https://agentic.so/tools/brave-search)         | Brave web search and local places search.                                                                                                                                                                                                                      |\n| [Calculator](https://github.com/josdejong/mathjs)                               | `@agentic/calculator`           | [docs](https://agentic.so/tools/calculator)           | Basic calculator for simple mathematical expressions.                                                                                                                                                                                                          |\n| [Clearbit](https://dashboard.clearbit.com/docs)                                 | `@agentic/clearbit`             | [docs](https://agentic.so/tools/clearbit)             | Resolving and enriching people and company data.                                                                                                                                                                                                               |\n| [Dexa](https://dexa.ai)                                                         | `@agentic/dexa`                 | [docs](https://agentic.so/tools/dexa)                 | Answers questions from the world's best podcasters.                                                                                                                                                                                                            |\n| [Diffbot](https://docs.diffbot.com)                                             | `@agentic/diffbot`              | [docs](https://agentic.so/tools/diffbot)              | Web page classification and scraping; person and company data enrichment.                                                                                                                                                                                      |\n| [DuckDuckGo](https://duckduckgo.com)                                            | `@agentic/duck-duck-go`         | [docs](https://agentic.so/tools/duck-duck-go)         | Privacy-focused web search API.                                                                                                                                                                                                                                |\n| [E2B](https://e2b.dev)                                                          | `@agentic/e2b`                  | [docs](https://agentic.so/tools/e2b)                  | Hosted Python code interpreter sandbox which is really useful for data analysis, flexible code execution, and advanced reasoning on-the-fly.                                                                                                                   |\n| [Exa](https://docs.exa.ai)                                                      | `@agentic/exa`                  | [docs](https://agentic.so/tools/exa)                  | Web search tailored for LLMs.                                                                                                                                                                                                                                  |\n| [Firecrawl](https://www.firecrawl.dev)                                          | `@agentic/firecrawl`            | [docs](https://agentic.so/tools/firecrawl)            | Website scraping and structured data extraction.                                                                                                                                                                                                               |\n| [Google Custom Search](https://developers.google.com/custom-search/v1/overview) | `@agentic/google-custom-search` | [docs](https://agentic.so/tools/google-custom-search) | Official Google Custom Search API.                                                                                                                                                                                                                             |\n| [Google Drive](https://developers.google.com/workspace/drive/api)               | `@agentic/google-drive`         | [docs](https://agentic.so/tools/google-drive)         | Simplified Google Drive API.                                                                                                                                                                                                                                   |\n| [Google Docs](https://developers.google.com/workspace/docs/api)                 | `@agentic/google-docs`          | [docs](https://agentic.so/tools/google-docs)          | Simplified Google Docs API.                                                                                                                                                                                                                                    |\n| [Gravatar](https://docs.gravatar.com/api/profiles/rest-api/)                    | `@agentic/gravatar`             | [docs](https://agentic.so/tools/gravatar)             | Gravatar profile API.                                                                                                                                                                                                                                          |\n| [HackerNews](https://github.com/HackerNews/API)                                 | `@agentic/hacker-news`          | [docs](https://agentic.so/tools/hacker-news)          | Official HackerNews API.                                                                                                                                                                                                                                       |\n| [Hunter](https://hunter.io)                                                     | `@agentic/hunter`               | [docs](https://agentic.so/tools/hunter)               | Email finder, verifier, and enrichment.                                                                                                                                                                                                                        |\n| [Jina](https://jina.ai/reader)                                                  | `@agentic/jina`                 | [docs](https://agentic.so/tools/jina)                 | URL scraper and web search.                                                                                                                                                                                                                                    |\n| [LeadMagic](https://leadmagic.io)                                               | `@agentic/leadmagic`            | [docs](https://agentic.so/tools/leadmagic)            | B2B person, company, and email enrichment API.                                                                                                                                                                                                                 |\n| [Midjourney](https://www.imagineapi.dev)                                        | `@agentic/midjourney`           | [docs](https://agentic.so/tools/midjourney)           | Unofficial Midjourney client for generative images.                                                                                                                                                                                                            |\n| [McpTools](https://modelcontextprotocol.io)                                     | `@agentic/mcp`                  | [docs](https://agentic.so/tools/mcp)                  | Model Context Protocol (MCP) client, supporting any MCP server. Use [createMcpTools](https://agentic.so/tools/mcp) to spawn or connect to an MCP server.                                                                                                       |\n| [Notion](https://developers.notion.com/docs)                                    | `@agentic/notion`               | [docs](https://agentic.so/tools/notion)               | Official Notion API for accessing pages, databases, and content.                                                                                                                                                                                               |\n| [Novu](https://novu.co)                                                         | `@agentic/novu`                 | [docs](https://agentic.so/tools/novu)                 | Sending notifications (email, SMS, in-app, push, etc).                                                                                                                                                                                                         |\n| [Open Meteo](https://open-meteo.com)                                            | `@agentic/open-meteo`           | [docs](https://agentic.so/tools/open-meteo)           | Free weather API (no API key required).                                                                                                                                                                                                                        |\n| [People Data Labs](https://www.peopledatalabs.com)                              | `@agentic/people-data-labs`     | [docs](https://agentic.so/tools/people-data-labs)     | People & company data (WIP).                                                                                                                                                                                                                                   |\n| [Perigon](https://www.goperigon.com/products/news-api)                          | `@agentic/perigon`              | [docs](https://agentic.so/tools/perigon)              | Real-time news API and web content data from 140,000+ sources. Structured and enriched by AI, primed for LLMs.                                                                                                                                                 |\n| [Polygon](https://polygon.io)                                                   | `@agentic/polygon`              | [docs](https://agentic.so/tools/polygon)              | Stock market and company financial data.                                                                                                                                                                                                                       |\n| [PredictLeads](https://predictleads.com)                                        | `@agentic/predict-leads`        | [docs](https://agentic.so/tools/predict-leads)        | In-depth company data including signals like fundraising events, hiring news, product launches, technologies used, etc.                                                                                                                                        |\n| [Proxycurl](https://nubela.co/proxycurl)                                        | `@agentic/proxycurl`            | [docs](https://agentic.so/tools/proxycurl)            | People and company data from LinkedIn & Crunchbase.                                                                                                                                                                                                            |\n| [Reddit](https://old.reddit.com/dev/api)                                        | `@agentic/reddit`               | [docs](https://agentic.so/tools/reddit)               | Basic readonly Reddit API for getting top/hot/new/rising posts from subreddits.                                                                                                                                                                                |\n| [RocketReach](https://rocketreach.co/api/v2/docs)                               | `@agentic/rocketreach`          | [docs](https://agentic.so/tools/rocketreach)          | B2B person and company enrichment API.                                                                                                                                                                                                                         |\n| [Searxng](https://docs.searxng.org)                                             | `@agentic/searxng`              | [docs](https://agentic.so/tools/searxng)              | OSS meta search engine capable of searching across many providers like Reddit, Google, Brave, Arxiv, Genius, IMDB, Rotten Tomatoes, Wikidata, Wolfram Alpha, YouTube, GitHub, [etc](https://docs.searxng.org/user/configured_engines.html#configured-engines). |\n| [SerpAPI](https://serpapi.com/search-api)                                       | `@agentic/serpapi`              | [docs](https://agentic.so/tools/serpapi)              | Lightweight wrapper around SerpAPI for Google search.                                                                                                                                                                                                          |\n| [Serper](https://serper.dev)                                                    | `@agentic/serper`               | [docs](https://agentic.so/tools/serper)               | Lightweight wrapper around Serper for Google search.                                                                                                                                                                                                           |\n| [Slack](https://api.slack.com/docs)                                             | `@agentic/slack`                | [docs](https://agentic.so/tools/slack)                | Send and receive Slack messages.                                                                                                                                                                                                                               |\n| [SocialData](https://socialdata.tools)                                          | `@agentic/social-data`          | [docs](https://agentic.so/tools/social-data)          | Unofficial Twitter / X client (readonly) which is much cheaper than the official Twitter API.                                                                                                                                                                  |\n| [Tavily](https://tavily.com)                                                    | `@agentic/tavily`               | [docs](https://agentic.so/tools/tavily)               | Web search API tailored for LLMs.                                                                                                                                                                                                                              |\n| [Twilio](https://www.twilio.com/docs/conversations/api)                         | `@agentic/twilio`               | [docs](https://agentic.so/tools/twilio)               | Twilio conversation API to send and receive SMS messages.                                                                                                                                                                                                      |\n| [Twitter](https://developer.x.com/en/docs/twitter-api)                          | `@agentic/twitter`              | [docs](https://agentic.so/tools/twitter)              | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. Uses [Nango](https://www.nango.dev) for OAuth support.                                                                       |\n| [Typeform](https://www.typeform.com/developers/get-started/)                    | `@agentic/typeform`             | [docs](https://agentic.so/tools/typeform)             | Readonly Typeform client for fetching form insights and responses.                                                                                                                                                                                             |\n| [Weather](https://www.weatherapi.com)                                           | `@agentic/weather`              | [docs](https://agentic.so/tools/weather)              | Basic access to current weather data based on location.                                                                                                                                                                                                        |\n| [Wikidata](https://www.wikidata.org/wiki/Wikidata:Data_access)                  | `@agentic/wikidata`             | [docs](https://agentic.so/tools/wikidata)             | Basic Wikidata client.                                                                                                                                                                                                                                         |\n| [Wikipedia](https://www.mediawiki.org/wiki/API)                                 | `@agentic/wikipedia`            | [docs](https://agentic.so/tools/wikipedia)            | Wikipedia page search and summaries.                                                                                                                                                                                                                           |\n| [Wolfram Alpha](https://products.wolframalpha.com/llm-api/documentation)        | `@agentic/wolfram-alpha`        | [docs](https://agentic.so/tools/wolfram-alpha)        | Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions.                                                                                                                                                              |\n| [YouTube](https://developers.google.com/youtube/v3)                             | `@agentic/youtube`              | [docs](https://agentic.so/tools/youtube)              | YouTube data API v3 for searching YT videos and channels.                                                                                                                                                                                                      |\n| [ZoomInfo](https://api-docs.zoominfo.com)                                       | `@agentic/zoominfo`             | [docs](https://agentic.so/tools/zoominfo)             | Powerful B2B person and company data enrichment.                                                                                                                                                                                                               |\n\n> [!NOTE]\n> Missing a tool or want to add your own tool to this list? If you have an OpenAPI v3 spec for your tool's API, we make it extremely easy to add support using our [@agentic/openapi-to-ts](./packages/openapi-to-ts) CLI. Otherwise, feel free to [open an issue to discuss](https://github.com/transitive-bullshit/agentic/issues/new?q=sort%3Aupdated-desc+is%3Aissue+is%3Aopen) or submit a PR.\n\nFor more details on tool usage, see the [docs](https://agentic.so).\n\n## Contributors\n\n- [Travis Fischer](https://x.com/transitive_bs)\n- [David Zhang](https://x.com/dzhng)\n- [Philipp Burckhardt](https://x.com/burckhap)\n- And all of these [amazing OSS contributors](https://github.com/transitive-bullshit/agentic/graphs/contributors):\n\n<p align=\"center\">\n  <a href=\"https://github.com/transitive-bullshit/agentic/graphs/contributors\">\n    <img src=\"https://contrib.rocks/image?repo=transitive-bullshit/agentic&max=150\" width=\"600\" />\n  </a>\n</p>\n\n## License\n\nMIT © [Travis Fischer](https://x.com/transitive_bs)\n\nTo stay up to date or learn more, follow [@transitive_bs](https://x.com/transitive_bs) on Twitter.\n"
  },
  {
    "path": "legacy/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"*.config.ts\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "legacy/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup'\n\nexport default defineConfig([\n  {\n    entry: ['src/index.ts'],\n    outDir: 'dist',\n    target: 'node18',\n    platform: 'node',\n    format: ['esm'],\n    splitting: false,\n    sourcemap: true,\n    minify: false,\n    shims: true,\n    dts: true\n  }\n])\n"
  },
  {
    "path": "legacy/turbo.json",
    "content": "{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"ui\": \"stream\",\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist/**\"],\n      \"outputLogs\": \"new-only\"\n    },\n    \"clean\": {\n      \"cache\": false,\n      \"dependsOn\": [\"^clean\"]\n    },\n    \"test\": {\n      \"dependsOn\": [\"test:format\", \"test:lint\", \"test:typecheck\", \"test:unit\"]\n    },\n    \"test:lint\": {\n      \"dependsOn\": [\"^test:lint\"],\n      \"outputLogs\": \"errors-only\"\n    },\n    \"test:typecheck\": {\n      \"dependsOn\": [\"^test:typecheck\"],\n      \"outputLogs\": \"errors-only\"\n    },\n    \"test:unit\": {\n      \"dependsOn\": [\"^test:unit\"],\n      \"outputLogs\": \"errors-only\"\n    },\n    \"test:format\": {\n      \"dependsOn\": [\"//#test:format\", \"^test:format\"]\n    },\n    \"//#test:format\": {},\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n"
  },
  {
    "path": "legacy/vite.config.ts",
    "content": "import { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n  esbuild: {\n    target: 'es2022'\n  }\n})\n"
  },
  {
    "path": "license",
    "content": "Agentic is open source licensed under the [GNU AGPL 3.0 license](https://choosealicense.com/licenses/agpl-3.0/).\n\nSome of Agentic's public packages are licensed under the more permissive [MIT license](https://choosealicense.com/licenses/mit/). If a directory includes an MIT license file, that overrides the default. If it doesn't, then that code and all code under that subdirectory defaults to Agentic's general [GNU AGPL 3.0 license](https://choosealicense.com/licenses/agpl-3.0/).\n\nAll Agentic packages under the `apps/`, `examples/`, `docs/`, and `packages/` folders are AGPL-3.0 licensed.\n\nAll Agentic packages under the `stdlib/` folder are MIT licensed.\n\n---\n\n                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\nCopyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\nEveryone is permitted to copy and distribute verbatim copies\nof this license document, but changing it is not allowed.\n\n                            Preamble\n\nThe GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\nThe licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\nWhen we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\nDevelopers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\nA secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate. Many developers of free software are heartened and\nencouraged by the resulting cooperation. However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\nThe GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community. It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server. Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\nAn older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals. This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\nThe precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n0. Definitions.\n\n\"This License\" refers to version 3 of the GNU Affero General Public License.\n\n\"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n\"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\nTo \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\nA \"covered work\" means either the unmodified Program or a work based\non the Program.\n\nTo \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\nTo \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\nAn interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n1. Source Code.\n\nThe \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\nA \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\nThe \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\nThe \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\nThe Corresponding Source for a work in source code form is that\nsame work.\n\n2. Basic Permissions.\n\nAll rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\nNo covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\nWhen you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n4. Conveying Verbatim Copies.\n\nYou may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n5. Conveying Modified Source Versions.\n\nYou may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\nA compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n6. Conveying Non-Source Forms.\n\nYou may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\nA \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n\"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\nIf you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\nThe requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\nCorresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n7. Additional Terms.\n\n\"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\nAll other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n8. Termination.\n\nYou may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\nHowever, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\nTermination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n9. Acceptance Not Required for Having Copies.\n\nYou are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n10. Automatic Licensing of Downstream Recipients.\n\nEach time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\nAn \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n11. Patents.\n\nA \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\nA contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\nIn the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\nA patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n12. No Surrender of Others' Freedom.\n\nIf conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n13. Remote Network Interaction; Use with the GNU General Public License.\n\nNotwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software. This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\nNotwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n14. Revised Versions of this License.\n\nThe Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time. Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation. If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\nIf the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\nLater license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n15. Disclaimer of Warranty.\n\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n16. Limitation of Liability.\n\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n17. Interpretation of Sections 15 and 16.\n\nIf the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\nTo do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source. For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code. There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\nYou should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"agentic\",\n  \"private\": true,\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\"\n  },\n  \"packageManager\": \"pnpm@10.17.0\",\n  \"engines\": {\n    \"node\": \">=20\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"turbo build --filter=!web --concurrency=32\",\n    \"dev\": \"turbo dev --continue --filter=!./examples/**/*\",\n    \"docs\": \"turbo run docs\",\n    \"clean\": \"turbo clean\",\n    \"fix\": \"run-s fix:*\",\n    \"cli\": \"cd ./packages/cli && pnpm run cli\",\n    \"fix:format\": \"prettier --write \\\"**/*.{js,ts,tsx}\\\"\",\n    \"test\": \"turbo test --concurrency=32\",\n    \"test:format\": \"prettier --check \\\"**/*.{js,ts,tsx}\\\"\",\n    \"test:lint\": \"eslint --cache .\",\n    \"test:typecheck\": \"turbo test:typecheck --concurrency=32\",\n    \"test:unit\": \"turbo test:unit --concurrency=32\",\n    \"pretest\": \"run-s build\",\n    \"preinstall\": \"npx only-allow pnpm\",\n    \"prerelease\": \"run-s build\",\n    \"prepare\": \"simple-git-hooks\",\n    \"release\": \"bumpp -r && run-s build && pnpm publish -r\",\n    \"knip\": \"knip\"\n  },\n  \"devDependencies\": {\n    \"@dotenvx/dotenvx\": \"catalog:\",\n    \"@fisch0920/config\": \"catalog:\",\n    \"@types/node\": \"catalog:\",\n    \"bumpp\": \"catalog:\",\n    \"del-cli\": \"catalog:\",\n    \"dotenv\": \"catalog:\",\n    \"eslint\": \"catalog:\",\n    \"eslint-plugin-drizzle\": \"catalog:\",\n    \"knip\": \"catalog:\",\n    \"lint-staged\": \"catalog:\",\n    \"npm-run-all2\": \"catalog:\",\n    \"only-allow\": \"catalog:\",\n    \"prettier\": \"catalog:\",\n    \"simple-git-hooks\": \"catalog:\",\n    \"tsup\": \"catalog:\",\n    \"tsx\": \"catalog:\",\n    \"turbo\": \"catalog:\",\n    \"typescript\": \"catalog:\",\n    \"vite-tsconfig-paths\": \"catalog:\",\n    \"vitest\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"prettier\": \"@fisch0920/config/prettier\",\n  \"simple-git-hooks\": {\n    \"pre-commit\": \"pnpm lint-staged\"\n  },\n  \"lint-staged\": {\n    \"*.{ts,tsx}\": [\n      \"prettier --ignore-unknown --write\",\n      \"eslint --cache --fix\"\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/api-client/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-api-client\",\n  \"version\": \"8.4.4\",\n  \"description\": \"TypeScript API client for the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/api-client\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@standard-schema/spec\": \"catalog:\",\n    \"file-type\": \"^21.0.0\",\n    \"ky\": \"catalog:\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/api-client/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/platform-api-client\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform-api-client.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-api-client <!-- omit from toc -->\n\n> TypeScript API client for the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n> [!TIP]\n> You likely don't need this package directly. See [@agentic/cli](https://github.com/transitive-bullshit/agentic/tree/main/packages/cli), [@agentic/platform](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform), and [@agentic/platform-tool-client](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform-tool-client) for more public-facing packages.\n\n## Install\n\n```bash\nnpm i @agentic/platform-api-client\n```\n\n## Usage\n\n```ts\nimport { AgenticApiClient } from '@agentic/platform-api-client'\n\n// Takes an optional `apiKey`\nconst agenticApiClient = new AgenticApiClient()\n\nconst searchProject = await agenticApiClient.getPublicProjectByIdentifier({\n  projectIdentifier: '@agentic/search'\n})\nconsole.log(searchProject)\n```\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/api-client/src/agentic-api-client.ts",
    "content": "import type {\n  AdminConsumer,\n  AdminDeployment,\n  AuthSession,\n  Consumer,\n  Deployment,\n  openapi,\n  Project,\n  Team,\n  TeamMember,\n  User\n} from '@agentic/platform-types'\nimport type { Simplify } from 'type-fest'\nimport { assert, sanitizeSearchParams, sha256 } from '@agentic/platform-core'\nimport { fileTypeFromBuffer } from 'file-type'\nimport defaultKy, { type KyInstance } from 'ky'\n\nimport type { OnUpdateAuthSessionFunction } from './types'\n\nexport class AgenticApiClient {\n  static readonly DEFAULT_API_BASE_URL = 'https://api.agentic.so'\n\n  public readonly apiBaseUrl: string\n  public readonly apiKey?: string\n  public readonly ky: KyInstance\n  public readonly onUpdateAuth?: OnUpdateAuthSessionFunction\n\n  // protected _authClient: AuthClient\n  protected _authSession?: AuthSession\n\n  constructor({\n    apiBaseUrl = AgenticApiClient.DEFAULT_API_BASE_URL,\n    apiKey,\n    ky = defaultKy,\n    onUpdateAuth\n  }: {\n    apiBaseUrl?: string\n    apiKey?: string\n    ky?: KyInstance\n    onUpdateAuth?: OnUpdateAuthSessionFunction\n  } = {}) {\n    assert(apiBaseUrl, 'AgenticApiClient missing required \"apiBaseUrl\"')\n\n    this.apiBaseUrl = apiBaseUrl\n    this.apiKey = apiKey\n    this.onUpdateAuth = onUpdateAuth\n\n    // this._authClient = createAuthClient({\n    //   issuer: apiBaseUrl,\n    //   clientId: 'agentic-api-client'\n    // })\n\n    this.ky = ky.extend({\n      prefixUrl: apiBaseUrl,\n\n      // Set a longer timeout on localhost to account for backend debugging / breakpoints.\n      timeout: apiBaseUrl.startsWith('http://localhost') ? 120_000 : undefined,\n\n      headers: apiKey\n        ? {\n            Authorization: `Bearer ${apiKey}`\n          }\n        : undefined,\n\n      hooks: {\n        beforeRequest: [\n          async (request) => {\n            if (!this.apiKey && this._authSession) {\n              // Always verify freshness of auth tokens before making a request\n              // TODO: handle refreshing auth tokens\n              // await this.verifyAuthAndRefreshIfNecessary()\n              // assert(this._authSession, 'Not authenticated')\n\n              request.headers.set(\n                'Authorization',\n                `Bearer ${this._authSession.token}`\n              )\n            }\n          }\n        ]\n      }\n    })\n  }\n\n  get isAuthenticated(): boolean {\n    return !!this._authSession\n  }\n\n  get authSession(): AuthSession | undefined {\n    return structuredClone(this._authSession)\n  }\n\n  set authSession(authSession: AuthSession | undefined) {\n    // TODO: validate auth sessino with zod\n    this._authSession = structuredClone(authSession)\n  }\n\n  // async verifyAuthAndRefreshIfNecessary(): Promise<AuthSession> {\n  //   this._ensureNoApiKey()\n\n  //   if (!this._authTokens) {\n  //     throw new Error('This method requires authentication.')\n  //   }\n\n  //   const verified = await this._authClient.verify(\n  //     authSubjects,\n  //     this._authTokens.access,\n  //     {\n  //       refresh: this._authTokens.refresh\n  //     }\n  //   )\n\n  //   if (verified.err) {\n  //     throw verified.err\n  //   }\n\n  //   if (verified.tokens) {\n  //     this._authTokens = verified.tokens\n  //   }\n\n  //   this.onUpdateAuth?.({\n  //     session: this._authTokens,\n  //     user: verified.subject.properties\n  //   })\n\n  //   return verified.subject.properties\n  // }\n\n  // async exchangeAuthCode({\n  //   code,\n  //   redirectUri,\n  //   verifier\n  // }: {\n  //   code: string\n  //   redirectUri: string\n  //   verifier?: string\n  // }): Promise<AuthSession> {\n  //   this._ensureNoApiKey()\n  //   const result = await this._authClient.exchange(code, redirectUri, verifier)\n\n  //   if (result.err) {\n  //     throw result.err\n  //   }\n\n  //   this._authTokens = result.tokens\n  //   return this.verifyAuthAndRefreshIfNecessary()\n  // }\n\n  // async initAuthFlow({\n  //   redirectUri,\n  //   provider\n  // }: {\n  //   redirectUri: string\n  //   provider: 'github'\n  // }): Promise<AuthorizeResult> {\n  //   this._ensureNoApiKey()\n\n  //   return this._authClient.authorize(redirectUri, 'code', {\n  //     provider\n  //   })\n  // }\n\n  async logout(): Promise<void> {\n    this._authSession = undefined\n    this.onUpdateAuth?.()\n  }\n\n  protected _ensureNoApiKey() {\n    assert(\n      !this.apiKey,\n      'AgenticApiClient was initialized with an API key. This method is only supported with wnon-API-key-based authentication.'\n    )\n  }\n\n  /** Signs in with email + password. */\n  async signInWithPassword(\n    json: OperationBody<'signInWithPassword'>\n    // searchParams?: OperationParameters<'signInWithPassword'>\n  ): Promise<AuthSession> {\n    this._authSession = await this.ky\n      .post('v1/auth/password/signin', { json })\n      .json<AuthSession>()\n\n    this.onUpdateAuth?.(this._authSession)\n    return this._authSession\n  }\n\n  /** Registers a new account with username + email + password. */\n  async signUpWithPassword(\n    json: OperationBody<'signUpWithPassword'>\n    // searchParams?: OperationParameters<'signUpWithPassword'>\n  ): Promise<AuthSession> {\n    this._authSession = await this.ky\n      .post('v1/auth/password/signup', { json })\n      .json()\n\n    this.onUpdateAuth?.(this._authSession)\n    return this._authSession\n  }\n\n  // TODO\n  async initAuthFlowWithGitHub({\n    redirectUri,\n    scope = 'user:email',\n    clientId = 'Iv23lizZv3CnggDT7JED'\n  }: {\n    redirectUri: string\n    scope?: string\n    clientId?: string\n  }): Promise<string> {\n    const url = new URL(`${this.apiBaseUrl}/v1/auth/github/init`)\n    url.searchParams.append('client_id', clientId)\n    url.searchParams.append('scope', scope)\n    url.searchParams.append('redirect_uri', redirectUri)\n\n    return url.toString()\n  }\n\n  // TODO\n  async exchangeOAuthCodeWithGitHub(\n    json: OperationBody<'exchangeOAuthCodeWithGitHub'>\n  ): Promise<AuthSession> {\n    this._authSession = await this.ky\n      .post('v1/auth/github/exchange', { json })\n      .json()\n\n    this.onUpdateAuth?.(this._authSession)\n    return this._authSession\n  }\n\n  /** Gets the currently authenticated user. */\n  async getMe(): Promise<User> {\n    // const user = await this.verifyAuthAndRefreshIfNecessary()\n    const userId = this._authSession?.user.id\n    assert(userId, 'This method requires authentication.')\n\n    return this.ky.get(`v1/users/${userId}`).json()\n  }\n\n  /** Gets a user by ID. */\n  async getUser({\n    userId,\n    ...searchParams\n  }: OperationParameters<'getUser'>): Promise<User> {\n    return this.ky.get(`v1/users/${userId}`, { searchParams }).json()\n  }\n\n  /** Updates a user. */\n  async updateUser(\n    user: OperationBody<'updateUser'>,\n    { userId, ...searchParams }: OperationParameters<'updateUser'>\n  ): Promise<User> {\n    return this.ky\n      .post(`v1/users/${userId}`, { json: user, searchParams })\n      .json()\n  }\n\n  /** Lists all teams the authenticated user belongs to. */\n  async listTeams(\n    searchParams: OperationParameters<'listTeams'> = {}\n  ): Promise<Array<Team>> {\n    return this.ky\n      .get('v1/teams', { searchParams: sanitizeSearchParams(searchParams) })\n      .json()\n  }\n\n  /** Creates a team. */\n  async createTeam(\n    team: OperationBody<'createTeam'>,\n    searchParams: OperationParameters<'createTeam'> = {}\n  ): Promise<Team> {\n    return this.ky\n      .post('v1/teams', {\n        json: team,\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Gets a team by ID. */\n  async getTeam({\n    teamId,\n    ...searchParams\n  }: OperationParameters<'getTeam'>): Promise<Team> {\n    return this.ky.get(`v1/teams/${teamId}`, { searchParams }).json()\n  }\n\n  /** Updates a team. */\n  async updateTeam(\n    team: OperationBody<'updateTeam'>,\n    { teamId, ...searchParams }: OperationParameters<'updateTeam'>\n  ): Promise<Team> {\n    return this.ky\n      .post(`v1/teams/${teamId}`, { json: team, searchParams })\n      .json()\n  }\n\n  /** Deletes a team by ID. */\n  async deleteTeam({\n    teamId,\n    ...searchParams\n  }: OperationParameters<'deleteTeam'>): Promise<Team> {\n    return this.ky.delete(`v1/teams/${teamId}`, { searchParams }).json()\n  }\n\n  /** Creates a new team member. */\n  async createTeamMember(\n    member: OperationBody<'createTeamMember'>,\n    { teamId, ...searchParams }: OperationParameters<'createTeamMember'>\n  ): Promise<TeamMember> {\n    return this.ky\n      .post(`v1/teams/${teamId}/members`, { json: member, searchParams })\n      .json()\n  }\n\n  /** Updates a team member. */\n  async updateTeamMember(\n    member: OperationBody<'updateTeamMember'>,\n    { teamId, userId, ...searchParams }: OperationParameters<'updateTeamMember'>\n  ): Promise<TeamMember> {\n    return this.ky\n      .post(`v1/teams/${teamId}/members/${userId}`, {\n        json: member,\n        searchParams\n      })\n      .json()\n  }\n\n  /** Deletes a team member. */\n  async deleteTeamMember({\n    teamId,\n    userId,\n    ...searchParams\n  }: OperationParameters<'deleteTeamMember'>): Promise<TeamMember> {\n    return this.ky\n      .delete(`v1/teams/${teamId}/members/${userId}`, { searchParams })\n      .json()\n  }\n\n  /**\n   * Gets a signed URL for uploading a file to Agentic's blob storage.\n   *\n   * Files are namespaced to a given project and are identified by a key that\n   * should be a hash of the file's contents, with the correct file extension.\n   *\n   * @example\n   * ```ts\n   * const { signedUploadUrl, publicObjectUrl } = await client.getSignedStorageUploadUrl({\n   *   projectIdentifier: '@username/my-project',\n   *   key: '9f86d081884c7d659a2feaa0c55ad015a.png'\n   * })\n   * ```\n   */\n  async getSignedStorageUploadUrl(\n    searchParams: OperationParameters<'getSignedStorageUploadUrl'>\n  ): Promise<{\n    /** The signed upload URL. */\n    signedUploadUrl: string\n\n    /** The public URL the object will have once uploaded. */\n    publicObjectUrl: string\n  }> {\n    return this.ky\n      .get(`v1/storage/signed-upload-url`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Uploads a file to Agentic's blob storage for a given project.\n   *\n   * @example\n   * ```ts\n   * const publicObjectUrl = await client.uploadFileUrlToStorage(\n   *   new URL('https://example.com/image.png'),\n   *   { projectIdentifier: '@username/my-project' }\n   * )\n   * ```\n   */\n  async uploadFileUrlToStorage(\n    source: string | ArrayBuffer | URL,\n    {\n      projectIdentifier\n    }: {\n      projectIdentifier: string\n    }\n  ): Promise<string> {\n    let sourceBuffer: ArrayBuffer\n\n    if (typeof source === 'string') {\n      try {\n        source = new URL(source)\n      } catch {\n        // Not a URL\n        throw new Error(`Invalid source file URL: ${source}`)\n      }\n    }\n\n    if (source instanceof URL) {\n      if (source.hostname === 'storage.agentic.so') {\n        // The source is already a public URL hosted on Agentic's blob storage.\n        return source.toString()\n      }\n\n      sourceBuffer = await defaultKy.get(source).arrayBuffer()\n    } else if (source instanceof ArrayBuffer) {\n      sourceBuffer = source\n    } else {\n      throw new Error(`Invalid source file: ${source}`)\n    }\n\n    const [hash, fileType] = await Promise.all([\n      sha256(sourceBuffer),\n      fileTypeFromBuffer(sourceBuffer)\n    ])\n\n    const key = fileType ? `${hash}.${fileType.ext}` : hash\n\n    const { signedUploadUrl, publicObjectUrl } =\n      await this.getSignedStorageUploadUrl({\n        projectIdentifier,\n        key\n      })\n\n    try {\n      // Check if the object already exists.\n      await defaultKy.head(publicObjectUrl)\n    } catch {\n      // Object doesn't exist yet, so upload it.\n      await defaultKy.post(signedUploadUrl, {\n        body: sourceBuffer,\n        headers: {\n          'Content-Type': fileType?.mime ?? 'application/octet-stream'\n        }\n      })\n    }\n\n    return publicObjectUrl\n  }\n\n  /** Lists projects that have been published publicly to the marketplace. */\n  async listPublicProjects<\n    TPopulate extends NonNullable<\n      OperationParameters<'listPublicProjects'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'listPublicProjects'> & {\n      populate?: TPopulate[]\n    } = {}\n  ): Promise<Array<PopulateProject<TPopulate>>> {\n    return this.ky\n      .get('v1/projects/public', {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Gets a public project by ID. The project must be publicly available on\n   * the marketplace.\n   */\n  async getPublicProject<\n    TPopulate extends NonNullable<\n      OperationParameters<'getPublicProject'>['populate']\n    >[number]\n  >({\n    projectId,\n    ...searchParams\n  }: OperationParameters<'getPublicProject'> & {\n    populate?: TPopulate[]\n  }): Promise<PopulateProject<TPopulate>> {\n    return this.ky\n      .get(`v1/projects/public/${projectId}`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Gets a public project by its identifier. The project must be publicly\n   * available on the marketplace.\n   */\n  async getPublicProjectByIdentifier<\n    TPopulate extends NonNullable<\n      OperationParameters<'getPublicProjectByIdentifier'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'getPublicProjectByIdentifier'> & {\n      populate?: TPopulate[]\n    }\n  ): Promise<PopulateProject<TPopulate>> {\n    return this.ky\n      .get('v1/projects/public/by-identifier', {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Lists projects the authenticated user has access to.\n   */\n  async listProjects<\n    TPopulate extends NonNullable<\n      OperationParameters<'listProjects'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'listProjects'> & {\n      populate?: TPopulate[]\n    } = {}\n  ): Promise<Array<PopulateProject<TPopulate>>> {\n    return this.ky\n      .get(`v1/projects`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Creates a new project. */\n  async createProject(\n    project: OperationBody<'createProject'>,\n    searchParams: OperationParameters<'createProject'> = {}\n  ): Promise<Project> {\n    return this.ky.post('v1/projects', { json: project, searchParams }).json()\n  }\n\n  /**\n   * Gets a project by ID. Authenticated user must have access to the project.\n   */\n  async getProject<\n    TPopulate extends NonNullable<\n      OperationParameters<'getProject'>['populate']\n    >[number]\n  >({\n    projectId,\n    ...searchParams\n  }: OperationParameters<'getProject'> & {\n    populate?: TPopulate[]\n  }): Promise<PopulateProject<TPopulate>> {\n    return this.ky\n      .get(`v1/projects/${projectId}`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Gets a project by its identifier. Authenticated user must have access to\n   * the project.\n   */\n  async getProjectByIdentifier<\n    TPopulate extends NonNullable<\n      OperationParameters<'getProjectByIdentifier'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'getProjectByIdentifier'> & {\n      populate?: TPopulate[]\n    }\n  ): Promise<PopulateProject<TPopulate>> {\n    return this.ky\n      .get(`v1/projects/by-identifier`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Updates a project. Authenticated user must have access to the project.\n   */\n  async updateProject(\n    project: OperationBody<'updateProject'>,\n    { projectId, ...searchParams }: OperationParameters<'updateProject'>\n  ): Promise<Project> {\n    return this.ky\n      .post(`v1/projects/${projectId}`, { json: project, searchParams })\n      .json()\n  }\n\n  /** Gets a consumer by ID. */\n  async getConsumer<\n    TPopulate extends NonNullable<\n      OperationParameters<'getConsumer'>['populate']\n    >[number]\n  >({\n    consumerId,\n    ...searchParams\n  }: OperationParameters<'getConsumer'> & {\n    populate?: TPopulate[]\n  }): Promise<PopulateConsumer<TPopulate>> {\n    return this.ky\n      .get(`v1/consumers/${consumerId}`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Gets a consumer by ID. */\n  async getConsumerByProjectIdentifier<\n    TPopulate extends NonNullable<\n      OperationParameters<'getConsumerByProjectIdentifier'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'getConsumerByProjectIdentifier'> & {\n      populate?: TPopulate[]\n    }\n  ): Promise<PopulateConsumer<TPopulate>> {\n    return this.ky\n      .get(`v1/consumers/by-project-identifier`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Updates a consumer's subscription to a different deployment or pricing\n   * plan. Set `plan` to undefined to cancel the subscription.\n   */\n  async updateConsumer(\n    consumer: OperationBody<'updateConsumer'>,\n    { consumerId, ...searchParams }: OperationParameters<'updateConsumer'>\n  ): Promise<Consumer> {\n    return this.ky\n      .post(`v1/consumers/${consumerId}`, { json: consumer, searchParams })\n      .json()\n  }\n\n  /**\n   * Creates a new consumer by subscribing a customer to a project.\n   *\n   * @deprecated Use `createConsumerCheckoutSession` instead. This method will\n   * be removed in a future version.\n   */\n  async createConsumer(\n    consumer: OperationBody<'createConsumer'>,\n    searchParams: OperationParameters<'createConsumer'> = {}\n  ): Promise<Consumer> {\n    return this.ky\n      .post('v1/consumers', {\n        json: consumer,\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Creates a Stripe Checkout Session for a customer to modify their\n   * subscription to a project.\n   */\n  async createConsumerCheckoutSession(\n    consumer: OperationBody<'createConsumerCheckoutSession'>,\n    searchParams: OperationParameters<'createConsumerCheckoutSession'> = {}\n  ): Promise<{\n    checkoutSession: {\n      id: string\n      url: string\n    }\n    consumer: Consumer\n  }> {\n    return this.ky\n      .post('v1/consumers/checkout', {\n        json: consumer,\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Creates a Stripe Billing Portal Session for the authenticated user.\n   */\n  async createBillingPortalSession(\n    searchParams: OperationParameters<'createBillingPortalSession'> = {}\n  ): Promise<{\n    url: string\n  }> {\n    return this.ky\n      .post(`v1/consumers/billing-portal`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Creates a Stripe Billing Portal Session for a customer.\n   */\n  async createConsumerBillingPortalSession({\n    consumerId,\n    ...searchParams\n  }: OperationParameters<'createConsumerBillingPortalSession'>): Promise<{\n    url: string\n  }> {\n    return this.ky\n      .post(`v1/consumers/${consumerId}/billing-portal`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Refreshes a consumer's API key. */\n  async refreshConsumerApiKey({\n    consumerId,\n    ...searchParams\n  }: OperationParameters<'refreshConsumerApiKey'>): Promise<Consumer> {\n    return this.ky\n      .post(`v1/consumers/${consumerId}/refresh-api-key`, { searchParams })\n      .json()\n  }\n\n  /** Lists all of the customers. */\n  async listConsumers<\n    TPopulate extends NonNullable<\n      OperationParameters<'listConsumers'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'listConsumers'> & {\n      populate?: TPopulate[]\n    } = {}\n  ): Promise<Array<PopulateConsumer<TPopulate>>> {\n    return this.ky\n      .get('v1/consumers', {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Lists all of the customers for a project. */\n  async listConsumersForProject<\n    TPopulate extends NonNullable<\n      OperationParameters<'listConsumersForProject'>['populate']\n    >[number]\n  >({\n    projectId,\n    ...searchParams\n  }: OperationParameters<'listConsumersForProject'> & {\n    populate?: TPopulate[]\n  }): Promise<Array<PopulateConsumer<TPopulate>>> {\n    return this.ky\n      .get(`v1/projects/${projectId}/consumers`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Gets a deployment by its ID. */\n  async getDeployment<\n    TPopulate extends NonNullable<\n      OperationParameters<'getDeployment'>['populate']\n    >[number]\n  >({\n    deploymentId,\n    ...searchParams\n  }: OperationParameters<'getDeployment'> & {\n    populate?: TPopulate[]\n  }): Promise<PopulateDeployment<TPopulate>> {\n    return this.ky\n      .get(`v1/deployments/${deploymentId}`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Gets a deployment by its identifier. */\n  async getDeploymentByIdentifier<\n    TPopulate extends NonNullable<\n      OperationParameters<'getDeploymentByIdentifier'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'getDeploymentByIdentifier'> & {\n      populate?: TPopulate[]\n    }\n  ): Promise<PopulateDeployment<TPopulate>> {\n    return this.ky\n      .get(`v1/deployments/by-identifier`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Gets a public deployment by its identifier. */\n  async getPublicDeploymentByIdentifier<\n    TPopulate extends NonNullable<\n      OperationParameters<'getPublicDeploymentByIdentifier'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'getPublicDeploymentByIdentifier'> & {\n      populate?: TPopulate[]\n    }\n  ): Promise<PopulateDeployment<TPopulate>> {\n    return this.ky\n      .get(`v1/deployments/public/by-identifier`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Updates a deployment. */\n  async updateDeployment(\n    deployment: OperationBody<'updateDeployment'>,\n    { deploymentId, ...searchParams }: OperationParameters<'updateDeployment'>\n  ): Promise<Deployment> {\n    return this.ky\n      .post(`v1/deployments/${deploymentId}`, {\n        json: deployment,\n        searchParams\n      })\n      .json()\n  }\n\n  /**\n   * Lists deployments the user or team has access to, optionally filtering by\n   * project.\n   */\n  async listDeployments<\n    TPopulate extends NonNullable<\n      OperationParameters<'listDeployments'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'listDeployments'> & {\n      populate?: TPopulate[]\n    } = {}\n  ): Promise<Array<PopulateDeployment<TPopulate>>> {\n    return this.ky\n      .get('v1/deployments', {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /** Creates a new deployment within a project. */\n  async createDeployment(\n    deployment: OperationBody<'createDeployment'>,\n    searchParams: OperationParameters<'createDeployment'> = {}\n  ): Promise<Deployment> {\n    return this.ky\n      .post('v1/deployments', { json: deployment, searchParams })\n      .json()\n  }\n\n  /** Publishes a deployment. */\n  async publishDeployment(\n    deployment: OperationBody<'publishDeployment'>,\n    { deploymentId, ...searchParams }: OperationParameters<'publishDeployment'>\n  ): Promise<Deployment> {\n    return this.ky\n      .post(`v1/deployments/${deploymentId}/publish`, {\n        json: deployment,\n        searchParams\n      })\n      .json()\n  }\n\n  /**\n   * Gets a consumer by API key. This method is admin-only.\n   *\n   * @internal\n   */\n  async adminGetConsumerByApiKey<\n    TPopulate extends NonNullable<\n      OperationParameters<'adminGetConsumerByApiKey'>['populate']\n    >[number]\n  >({\n    apiKey,\n    ...searchParams\n  }: OperationParameters<'adminGetConsumerByApiKey'> & {\n    populate?: TPopulate[]\n  }): Promise<PopulateConsumer<TPopulate, AdminConsumer>> {\n    return this.ky\n      .get(`v1/admin/consumers/api-keys/${apiKey}`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Activates a consumer signifying that at least one API call has been made\n   * using the consumer's API key. This method is idempotent and admin-only.\n   *\n   * @internal\n   */\n  async adminActivateConsumer({\n    consumerId,\n    ...searchParams\n  }: OperationParameters<'adminActivateConsumer'>): Promise<AdminConsumer> {\n    return this.ky\n      .put(`v1/admin/consumers/${consumerId}/activate`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n\n  /**\n   * Gets a deployment by its public identifier. This method is admin-only.\n   *\n   * @internal\n   */\n  async adminGetDeploymentByIdentifier<\n    TPopulate extends NonNullable<\n      OperationParameters<'adminGetDeploymentByIdentifier'>['populate']\n    >[number]\n  >(\n    searchParams: OperationParameters<'adminGetDeploymentByIdentifier'> & {\n      populate?: TPopulate[]\n    }\n  ): Promise<PopulateDeployment<TPopulate, AdminDeployment>> {\n    return this.ky\n      .get(`v1/admin/deployments/by-identifier`, {\n        searchParams: sanitizeSearchParams(searchParams)\n      })\n      .json()\n  }\n}\n\ntype Operations = openapi.operations\n\ntype OperationParameters<\n  T extends keyof Operations,\n  Q = NonNullable<Operations[T]['parameters']['query']>,\n  P = NonNullable<Operations[T]['parameters']['path']>\n> = Simplify<\n  ([Q] extends [never] ? unknown : Q) & ([P] extends [never] ? unknown : P)\n>\n\n// Currently unused because some types need customization (e.g. Deployment) over\n// the default OpenAPI types.\n// type OperationResponse<T extends keyof Operations> =\n//   Operations[T]['responses'][200]['content']['application/json']\n\ntype OperationKeysWithRequestBody = {\n  [K in keyof Operations]: Operations[K]['requestBody'] extends {\n    content: {\n      'application/json': unknown\n    }\n  }\n    ? K\n    : never\n}[keyof Operations]\n\ntype OperationBody<\n  T extends OperationKeysWithRequestBody,\n  B extends\n    | object\n    | undefined = Operations[T]['requestBody']['content']['application/json']\n> = B\n\ntype PopulateProject<TPopulate> = Simplify<\n  Project &\n    (TPopulate extends 'user'\n      ? {\n          user: User\n        }\n      : unknown) &\n    (TPopulate extends 'team'\n      ? {\n          team: Team\n        }\n      : unknown) &\n    (TPopulate extends 'lastPublishedDeployment'\n      ? {\n          lastPublishedDeployment?: Deployment\n        }\n      : unknown) &\n    (TPopulate extends 'lastDeployment'\n      ? {\n          lastDeployment?: Deployment\n        }\n      : unknown)\n>\n\ntype PopulateDeployment<\n  TPopulate,\n  TDeployment extends Deployment = Deployment\n> = Simplify<\n  TDeployment &\n    (TPopulate extends 'user'\n      ? {\n          user: User\n        }\n      : unknown) &\n    (TPopulate extends 'team'\n      ? {\n          team: Team\n        }\n      : unknown) &\n    (TPopulate extends 'project'\n      ? {\n          project: Project\n        }\n      : unknown)\n>\n\ntype PopulateConsumer<\n  TPopulate,\n  TConsumer extends Consumer = Consumer\n> = Simplify<\n  TConsumer &\n    (TPopulate extends 'user'\n      ? {\n          user: User\n        }\n      : unknown) &\n    (TPopulate extends 'project'\n      ? {\n          project: Project\n        }\n      : unknown) &\n    (TPopulate extends 'deployment'\n      ? {\n          deployment: Deployment\n        }\n      : unknown)\n>\n"
  },
  {
    "path": "packages/api-client/src/index.ts",
    "content": "export * from './agentic-api-client'\nexport type * from './types'\n"
  },
  {
    "path": "packages/api-client/src/types.ts",
    "content": "import type { AuthSession } from '@agentic/platform-types'\n\nexport type { AuthSession } from '@agentic/platform-types'\n\nexport type OnUpdateAuthSessionFunction = (update?: AuthSession) => unknown\n"
  },
  {
    "path": "packages/api-client/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/cli/package.json",
    "content": "{\n  \"name\": \"@agentic/cli\",\n  \"version\": \"8.4.4\",\n  \"description\": \"CLI for the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/cli\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"source\": \"./src/cli.ts\",\n  \"bin\": {\n    \"agentic\": \"./dist/cli.js\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"cli\": \"AGENTIC_API_BASE_URL=\\\"http://localhost:3001\\\" tsx ./src/cli.ts\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform\": \"workspace:*\",\n    \"@agentic/platform-api-client\": \"workspace:*\",\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@agentic/platform-validators\": \"workspace:*\",\n    \"@clack/prompts\": \"catalog:\",\n    \"@hono/node-server\": \"catalog:\",\n    \"commander\": \"catalog:\",\n    \"conf\": \"catalog:\",\n    \"exit-hook\": \"catalog:\",\n    \"get-port\": \"catalog:\",\n    \"hono\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"open\": \"catalog:\",\n    \"ora\": \"catalog:\",\n    \"restore-cursor\": \"catalog:\",\n    \"semver\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@commander-js/extra-typings\": \"catalog:\",\n    \"@types/semver\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/cli/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/cli\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/cli.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/cli <!-- omit from toc -->\n\n> CLI for the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so/publishing)\n\n## Install\n\n```bash\nnpm i -g @agentic/cli\n```\n\n## Usage\n\n```sh\nUsage: agentic [options] [command]\n\nOptions:\n  -j, --json                                Print output as JSON\n  -V, --version                             output the version number\n  -h, --help                                display help for command\n\nCommands:\n  login|signin [options]                    Signs in to Agentic. If no credentials are provided, uses GitHub auth.\n  signup [options]                          Creates a new account for Agentic. If no credentials are provided, uses\n                                            GitHub auth.\n  whoami                                    Displays info about the current user.\n  logout|signout                            Signs the current user out.\n  deploy [options]                          Creates a new deployment.\n  publish [options] [deploymentIdentifier]  Publishes a deployment. Defaults to the most recent deployment for the\n                                            project in the target directory. If a deployment identifier is provided, it\n                                            will be used instead.\n  get <deploymentIdentifier>                Gets details for a specific deployment.\n  list|ls [options] [identifier]            Lists deployments.\n  debug [options]                           Prints config for a local project.\n  help [command]                            display help for command\n```\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/cli/src/cli.ts",
    "content": "#!/usr/bin/env node\n\nimport { AgenticApiClient } from '@agentic/platform-api-client'\nimport { Command } from 'commander'\n\nimport type { Context } from './types'\nimport { version } from '../package.json'\nimport { registerDebugCommand } from './commands/debug'\nimport { registerDeployCommand } from './commands/deploy'\nimport { registerGetDeploymentCommand } from './commands/get'\nimport { registerListDeploymentsCommand } from './commands/list'\nimport { registerPublishCommand } from './commands/publish'\nimport { registerSigninCommand } from './commands/signin'\nimport { registerSignoutCommand } from './commands/signout'\nimport { registerSignupCommand } from './commands/signup'\nimport { registerWhoAmICommand } from './commands/whoami'\nimport { AuthStore } from './lib/auth-store'\nimport { agenticApiBaseUrl } from './lib/env'\nimport { initExitHooks } from './lib/exit-hooks'\nimport { createErrorHandler } from './lib/handle-error'\n\nasync function main() {\n  initExitHooks()\n\n  // Initialize the API client\n  const client = new AgenticApiClient({\n    apiBaseUrl: agenticApiBaseUrl,\n    onUpdateAuth: (update) => {\n      if (update) {\n        AuthStore.setAuth(update)\n      } else {\n        AuthStore.clearAuth()\n      }\n    }\n  })\n\n  // Initialize the existing auth session if one exists\n  const authSession = AuthStore.tryGetAuth()\n  if (authSession) {\n    try {\n      client.authSession = authSession\n    } catch {\n      console.warn('Existing auth session is invalid; logging out.\\n')\n      AuthStore.clearAuth()\n    }\n  }\n\n  // Initialize the CLI program\n  const program = new Command('agentic')\n    .option('-j, --json', 'Print output as JSON')\n    .version(version)\n    .showHelpAfterError()\n\n  const logger = {\n    log: (...args: any[]) => {\n      if (program.opts().json) {\n        console.log(\n          args.length === 1\n            ? JSON.stringify(args[0], null, 2)\n            : JSON.stringify(args, null, 2)\n        )\n      } else {\n        console.log(...args)\n      }\n    },\n    info: (...args: any[]) => {\n      console.info(...args)\n    },\n    error: (...args: any[]) => {\n      console.error(...args)\n    }\n  }\n\n  const partialCtx = {\n    client,\n    program,\n    logger\n  }\n\n  const errorHandler = createErrorHandler(partialCtx)\n  const ctx: Context = {\n    ...partialCtx,\n    handleError: errorHandler\n  }\n\n  // Register all commands\n  registerSigninCommand(ctx)\n  registerSignupCommand(ctx)\n  registerWhoAmICommand(ctx)\n  registerSignoutCommand(ctx)\n  registerDeployCommand(ctx)\n  registerPublishCommand(ctx)\n  registerGetDeploymentCommand(ctx)\n  registerListDeploymentsCommand(ctx)\n  registerDebugCommand(ctx)\n\n  program.parse()\n}\n\nawait main()\n"
  },
  {
    "path": "packages/cli/src/commands/debug.ts",
    "content": "import { loadAgenticConfig } from '@agentic/platform'\nimport { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\nimport { oraPromise } from 'ora'\n\nimport type { Context } from '../types'\n\nexport function registerDebugCommand({\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('debug')\n    .description('Prints config for a local project.')\n    .option(\n      '-c, --cwd <dir>',\n      'The directory to load the Agentic project config from (defaults to the cwd). This directory must contain an \"agentic.config.{ts,js,json}\" project file.'\n    )\n    .action(async (opts) => {\n      try {\n        // Load the Agentic project config, parse, and validate it. This will also\n        // validate any origin adapter config such as OpenAPI or MCP specs and\n        // embed them if they point to local files or URLs. Note that the server\n        // also performs validation; this is just a client-side convenience for\n        // failing fast and sharing 99% of the validation code between server and\n        // client.\n        const config = await oraPromise(\n          loadAgenticConfig({\n            cwd: opts.cwd\n          }),\n          {\n            text: `Loading Agentic config from ${opts.cwd ?? process.cwd()}`,\n            successText: `Agentic config loaded successfully.`,\n            failText: 'Failed to load Agentic config.'\n          }\n        )\n\n        // TODO: we may want to resolve the resulting agentic config so we see\n        // the inferred `tools` (and `toolToOperationMap` for mcp servers)\n\n        logger.log(config)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/deploy.ts",
    "content": "import { loadAgenticConfig } from '@agentic/platform'\nimport { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\nimport { oraPromise } from 'ora'\n\nimport type { Context } from '../types'\nimport { AuthStore } from '../lib/auth-store'\n\nexport function registerDeployCommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('deploy')\n    .description('Creates a new deployment.')\n    .option(\n      '-c, --cwd <dir>',\n      'The directory to load the Agentic project config from (defaults to the cwd). This directory must contain an \"agentic.config.{ts,js,json}\" project file.'\n    )\n    .option('-d, --debug', 'Print out the parsed agentic config and return.')\n    // TODO\n    //.option('-p, --publish', 'Publishes the deployment after creating it.')\n    .action(async (opts) => {\n      AuthStore.requireAuth()\n\n      try {\n        // Load the Agentic project config, parse, and validate it. This will also\n        // validate any origin adapter config such as OpenAPI or MCP specs and\n        // embed them if they point to local files or URLs. Note that the server\n        // also performs validation; this is just a client-side convenience for\n        // failing fast and sharing 99% of the validation code between server and\n        // client.\n        const config = await oraPromise(\n          loadAgenticConfig({\n            cwd: opts.cwd\n          }),\n          {\n            text: `Loading Agentic config from ${opts.cwd ?? process.cwd()}`,\n            successText: `Agentic config loaded successfully.`,\n            failText: 'Failed to load Agentic config.'\n          }\n        )\n\n        if (opts.debug) {\n          logger.log(config)\n          gracefulExit(0)\n          return\n        }\n\n        // Create the deployment on the backend, validating it in the process.\n        // Note that the backend performs more validation than the client does\n        // and is the ultimate source of truth.\n        const deployment = await oraPromise(\n          client.createDeployment(\n            config\n            // TODO: need to prompt to get or confirm version before publishing\n            // {\n            //   publish: opts.publish ? 'true' : 'false'\n            // }\n          ),\n          {\n            text: `Creating deployment for project \"${config.slug}\"`,\n            successText: `Deployment created successfully`,\n            failText: 'Failed to create deployment'\n          }\n        )\n\n        logger.log(deployment)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/get.ts",
    "content": "import { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\nimport { oraPromise } from 'ora'\n\nimport type { Context } from '../types'\nimport { AuthStore } from '../lib/auth-store'\n\nexport function registerGetDeploymentCommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('get')\n    .description('Gets details for a specific deployment.')\n    .argument('<deploymentIdentifier>', 'Deployment ID or identifier')\n    .action(async (deploymentIdentifier) => {\n      AuthStore.requireAuth()\n\n      try {\n        const deployment = await oraPromise(\n          client.getDeploymentByIdentifier({\n            deploymentIdentifier\n          }),\n          {\n            text: 'Resolving deployment...',\n            successText: 'Resolved deployment',\n            failText: 'Failed to resolve deployment'\n          }\n        )\n\n        logger.log(deployment)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/list.ts",
    "content": "import type { Deployment } from '@agentic/platform-types'\nimport { parseDeploymentIdentifier } from '@agentic/platform-validators'\nimport { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\nimport { oraPromise } from 'ora'\n\nimport type { Context } from '../types'\nimport { AuthStore } from '../lib/auth-store'\nimport { pruneDeployment } from '../lib/utils'\n\nexport function registerListDeploymentsCommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('list')\n    .alias('ls')\n    .description('Lists deployments.')\n    .argument(\n      '[identifier]',\n      'Optional project or deployment identifier to filter by.'\n    )\n    .option('-v, --verbose', 'Display full deployments', false)\n    .action(async (identifier, opts) => {\n      AuthStore.requireAuth()\n\n      try {\n        const query: Parameters<typeof client.listDeployments>[0] = {}\n        let label = 'Fetching all projects and deployments'\n\n        if (identifier) {\n          const parsedDeploymentIdentifier = parseDeploymentIdentifier(\n            identifier,\n            {\n              strict: false\n            }\n          )\n\n          query.projectIdentifier = parsedDeploymentIdentifier.projectIdentifier\n          label = `Fetching deployments for project \"${query.projectIdentifier}\"`\n\n          // TODO: this logic needs tweaking.\n          if (\n            parsedDeploymentIdentifier.deploymentVersion !== 'latest' ||\n            identifier.includes('@latest')\n          ) {\n            query.deploymentIdentifier =\n              parsedDeploymentIdentifier.deploymentIdentifier\n            label = `Fetching deployment \"${query.deploymentIdentifier}\"`\n          }\n        }\n\n        const deployments = await oraPromise(\n          client.listDeployments(query),\n          label\n        )\n\n        const projectIdToDeploymentsMap: Record<string, Deployment[]> = {}\n        const sortedProjects: {\n          projectId: string\n          deployments: Deployment[]\n        }[] = []\n\n        // Aggregate deployments by project\n        for (const deployment of deployments) {\n          const prunedDeployment = pruneDeployment(deployment, opts)\n\n          const { projectId } = deployment\n          if (!projectIdToDeploymentsMap[projectId]) {\n            projectIdToDeploymentsMap[projectId] = []\n          }\n\n          projectIdToDeploymentsMap[projectId].push(prunedDeployment)\n        }\n\n        // Sort deployments within each project with recently created first\n        for (const projectId of Object.keys(projectIdToDeploymentsMap)) {\n          const deployments = projectIdToDeploymentsMap[projectId]!\n          deployments.sort(\n            (a, b) =>\n              new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n          )\n\n          sortedProjects.push({\n            projectId,\n            deployments\n          })\n        }\n\n        // Sort projects with most recently created first\n        sortedProjects.sort(\n          (a, b) =>\n            new Date(b.deployments[0]!.createdAt).getTime() -\n            new Date(a.deployments[0]!.createdAt).getTime()\n        )\n\n        // TODO: better output formatting\n        logger.log(sortedProjects)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/publish.ts",
    "content": "import { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\nimport { oraPromise } from 'ora'\n\nimport type { Context } from '../types'\nimport { AuthStore } from '../lib/auth-store'\nimport { promptForDeploymentVersion } from '../lib/prompt-for-deployment-version'\nimport { resolveDeployment } from '../lib/resolve-deployment'\n\nexport function registerPublishCommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('publish')\n    .description(\n      'Publishes a deployment. Defaults to the most recent deployment for the project in the target directory. If a deployment identifier is provided, it will be used instead.'\n    )\n    .argument('[deploymentIdentifier]', 'Optional deployment identifier')\n    .option(\n      '-c, --cwd <dir>',\n      'The directory to load the Agentic project config from (defaults to cwd). This directory must contain an \"agentic.config.{ts,js,json}\" project file.'\n    )\n    .action(async (deploymentIdentifier, opts) => {\n      AuthStore.requireAuth()\n\n      if (deploymentIdentifier) {\n        // TODO: parseToolIdentifier\n      }\n\n      try {\n        const deployment = await oraPromise(\n          resolveDeployment({\n            client,\n            deploymentIdentifier,\n            fuzzyDeploymentIdentifierVersion: 'dev',\n            cwd: opts.cwd,\n            populate: ['project']\n          }),\n          {\n            text: 'Resolving deployment...',\n            successText: 'Resolved deployment',\n            failText: 'Failed to resolve deployment'\n          }\n        )\n        const { project } = deployment\n\n        if (deployment.published) {\n          logger.error(\n            deploymentIdentifier\n              ? `Deployment \"${deploymentIdentifier}\" is already published`\n              : `Latest deployment \"${deployment.identifier}\" is already published`\n          )\n          return gracefulExit(1)\n        }\n\n        if (!project) {\n          logger.error(\n            deploymentIdentifier\n              ? `Deployment \"${deploymentIdentifier}\" failed to fetch project \"${deployment.projectId}\"`\n              : `Latest deployment \"${deployment.identifier}\" failed to fetch project \"${deployment.projectId}\"`\n          )\n          return gracefulExit(1)\n        }\n\n        const version = await promptForDeploymentVersion({\n          deployment,\n          project,\n          logger\n        })\n\n        if (!version || typeof version !== 'string') {\n          logger.error('No version selected')\n          return gracefulExit(1)\n        }\n\n        const publishedDeployment = await client.publishDeployment(\n          {\n            version\n          },\n          {\n            deploymentId: deployment.id\n          }\n        )\n\n        logger.info(\n          `Deployment \"${publishedDeployment.identifier}\" published with version \"${publishedDeployment.version}\"`\n        )\n        logger.log(publishedDeployment)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/signin.ts",
    "content": "import { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\n\nimport type { Context } from '../types'\nimport { auth } from '../lib/auth'\n\nexport function registerSigninCommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('login')\n    .alias('signin')\n    .description(\n      'Signs in to Agentic. If no credentials are provided, uses GitHub auth.'\n    )\n    .option('-e, --email <email>', 'Account email')\n    .option('-p, --password <password>', 'Account password')\n    .action(async (opts) => {\n      if (!!opts.email !== !!opts.password) {\n        logger.error(\n          'either pass email and password or neither (which will use github auth)'\n        )\n        program.outputHelp()\n        return gracefulExit(1)\n      }\n\n      try {\n        if (opts.email && opts.password) {\n          await client.signInWithPassword({\n            email: opts.email,\n            password: opts.password\n          })\n        } else {\n          await auth({ client, provider: 'github' })\n        }\n\n        const user = await client.getMe()\n        logger.log(user)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/signout.ts",
    "content": "import { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\n\nimport type { Context } from '../types'\nimport { AuthStore } from '../lib/auth-store'\n\nexport function registerSignoutCommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('logout')\n    .alias('signout')\n    .description('Signs the current user out.')\n    .action(async () => {\n      if (!client.isAuthenticated) {\n        logger.log('You are already signed out')\n        return gracefulExit(0)\n      }\n\n      try {\n        await client.logout()\n        AuthStore.clearAuth()\n\n        logger.log('Signed out')\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/signup.ts",
    "content": "import { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\n\nimport type { Context } from '../types'\nimport { auth } from '../lib/auth'\n\nexport function registerSignupCommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('signup')\n    .description(\n      'Creates a new account for Agentic. If no credentials are provided, uses GitHub auth.'\n    )\n    .option('-e, --email <email>', 'Account email')\n    .option('-u, --username <username>', 'Account username')\n    .option('-p, --password <password>', 'Account password')\n    .action(async (opts) => {\n      if (\n        !!opts.email !== !!opts.password ||\n        !!opts.email !== !!opts.username\n      ) {\n        logger.error(\n          'either pass email, username, and password or none of them (which will use github auth)'\n        )\n        program.outputHelp()\n        return gracefulExit(1)\n      }\n\n      try {\n        if (opts.email && opts.username && opts.password) {\n          await client.signUpWithPassword({\n            email: opts.email,\n            username: opts.username,\n            password: opts.password\n          })\n        } else {\n          await auth({ client, provider: 'github' })\n        }\n\n        const user = await client.getMe()\n        logger.log(user)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/commands/whoami.ts",
    "content": "import { Command } from 'commander'\nimport { gracefulExit } from 'exit-hook'\n\nimport type { Context } from '../types'\nimport { AuthStore } from '../lib/auth-store'\n\nexport function registerWhoAmICommand({\n  client,\n  program,\n  logger,\n  handleError\n}: Context) {\n  const command = new Command('whoami')\n    .description('Displays info about the current user.')\n    .action(async () => {\n      AuthStore.requireAuth()\n\n      try {\n        const res = await client.getMe()\n        logger.log(res)\n        gracefulExit(0)\n      } catch (err) {\n        handleError(err)\n      }\n    })\n\n  program.addCommand(command)\n}\n"
  },
  {
    "path": "packages/cli/src/lib/auth-store.ts",
    "content": "import type { AuthSession } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\nimport Conf from 'conf'\n\nimport { agenticApiBaseUrl } from './env'\n\nconst keyAuthSession = `authSession:${agenticApiBaseUrl}`\n\nexport const AuthStore = {\n  store: new Conf<{\n    [keyAuthSession]: AuthSession\n  }>({ projectName: 'agentic' }),\n\n  isAuthenticated() {\n    return this.store.has(keyAuthSession)\n  },\n\n  requireAuth() {\n    assert(\n      this.isAuthenticated(),\n      'This command requires authentication. Please login first.'\n    )\n  },\n\n  tryGetAuth(): AuthSession | undefined {\n    if (!this.isAuthenticated()) {\n      return undefined\n    }\n\n    return this.store.get(keyAuthSession)\n  },\n\n  getAuth(): AuthSession {\n    this.requireAuth()\n    return this.tryGetAuth()!\n  },\n\n  setAuth(authSession: AuthSession) {\n    this.store.set(keyAuthSession, authSession)\n  },\n\n  clearAuth() {\n    this.store.delete(keyAuthSession)\n  }\n\n  // switchTeam(team?: { id: string; slug: string }) {\n  //   if (team?.id) {\n  //     this.store.set(keyTeamId, team.id)\n  //     this.store.set(keyTeamSlug, team.slug)\n  //   } else {\n  //     this.store.delete(keyTeamId)\n  //     this.store.delete(keyTeamSlug)\n  //   }\n  // }\n}\n"
  },
  {
    "path": "packages/cli/src/lib/auth.ts",
    "content": "import type {\n  AgenticApiClient,\n  AuthSession\n} from '@agentic/platform-api-client'\nimport { assert } from '@agentic/platform-core'\nimport { serve } from '@hono/node-server'\nimport getPort from 'get-port'\nimport { Hono } from 'hono'\nimport open from 'open'\nimport { oraPromise } from 'ora'\n\nimport { AuthStore } from './auth-store'\n\nconst providerToLabel = {\n  github: 'GitHub'\n  // password: 'email and password'\n}\n\nexport async function auth({\n  client,\n  provider,\n  preferredPort = 6013\n}: {\n  client: AgenticApiClient\n  provider: 'github' // | 'password'\n  preferredPort?: number\n}): Promise<AuthSession> {\n  const providerLabel = providerToLabel[provider]\n  assert(providerLabel, `Missing required provider: ${provider}`)\n\n  const port = await getPort({ port: preferredPort })\n  const app = new Hono()\n\n  const redirectUri = `http://localhost:${port}/callback/${provider}/success`\n  let _resolveAuth: any\n  let _rejectAuth: any\n\n  // NOTE: Promise.withResolvers requires Node.js 22+\n  const authP = new Promise<AuthSession>((resolve, reject) => {\n    _resolveAuth = resolve\n    _rejectAuth = reject\n  })\n\n  app.get(`/callback/${provider}/success`, async (c) => {\n    // console.log(`/callback/${provider}/success`, c.req.method, c.req.url, {\n    //   headers: c.req.header(),\n    //   query: c.req.query()\n    // })\n\n    const code = c.req.query('code')\n    assert(code, 'Missing required code query parameter')\n\n    await client.exchangeOAuthCodeWithGitHub({ code })\n    assert(\n      client.authSession,\n      `Error ${providerLabel} auth: failed to exchange auth code for token`\n    )\n\n    // await client.exchangeAuthCode({\n    //   code,\n    //   redirectUri,\n    //   verifier: authorizeResult.challenge?.verifier\n    // })\n    // assert(\n    //   client.authSession,\n    //   `Error ${providerLabel} auth: failed to exchange auth code for token`\n    // )\n\n    // AuthStore should be updated via the onUpdateAuth callback\n    const session = AuthStore.tryGetAuth()\n    assert(session && session?.token === client.authSession?.token)\n    _resolveAuth(session)\n\n    return c.text(\n      `Huzzah! You are now signed in to the Agentic CLI.\\n\\nYou may close this browser tab. 😄`\n    )\n  })\n\n  const server = serve({\n    fetch: app.fetch,\n    port\n  })\n\n  // TODO: clean these up\n  process.on('SIGINT', () => {\n    server.close()\n    process.exit(0)\n  })\n  process.on('SIGTERM', () => {\n    server.close((err) => {\n      if (err) {\n        console.error(err)\n        process.exit(1)\n      }\n      process.exit(0)\n    })\n  })\n\n  const url = await client.initAuthFlowWithGitHub({\n    redirectUri\n  })\n  await open(url.toString())\n\n  // TODO\n  // const authorizeResult = await client.initAuthFlow({\n  //   provider,\n  //   redirectUri\n  // })\n  // assert(authorizeResult.url, `Error signing in with ${providerLabel}`)\n  // await open(authorizeResult.url)\n\n  const authSession = await oraPromise(authP, {\n    text: `Signing in with ${providerLabel}`,\n    successText: 'You are now signed in.',\n    failText: 'Failed to sign in.'\n  })\n  server.close()\n\n  return authSession\n}\n"
  },
  {
    "path": "packages/cli/src/lib/commander.d.ts",
    "content": "declare module 'commander' {\n  export * from '@commander-js/extra-typings'\n}\n"
  },
  {
    "path": "packages/cli/src/lib/env.ts",
    "content": "export const agenticApiBaseUrl =\n  process.env.AGENTIC_API_BASE_URL || 'https://api.agentic.so'\n"
  },
  {
    "path": "packages/cli/src/lib/exit-hooks.ts",
    "content": "import restoreCursor from 'restore-cursor'\n\nexport function initExitHooks() {\n  // Gracefully restore the cursor if run from a TTY\n  restoreCursor()\n\n  process.on('SIGINT', () => {\n    process.exit(0)\n  })\n\n  process.on('SIGTERM', () => {\n    process.exit(0)\n  })\n}\n"
  },
  {
    "path": "packages/cli/src/lib/handle-error.ts",
    "content": "import { gracefulExit } from 'exit-hook'\nimport { HTTPError } from 'ky'\n\nimport type { Context } from '../types'\n\nexport function createErrorHandler(ctx: Omit<Context, 'handleError'>) {\n  return async function handleError(error: any) {\n    let message: string | undefined\n    let details: Error | undefined\n\n    if (typeof error === 'string') {\n      message = error\n    } else if (error instanceof Error) {\n      details = error\n      message = error.message\n\n      if (error instanceof HTTPError) {\n        if (error.response) {\n          try {\n            message = error.response.statusText\n\n            const body = await error.response.json()\n            if (body.error && typeof body.error === 'string') {\n              message = JSON.stringify(\n                {\n                  ...body,\n                  details: error.toString()\n                },\n                null,\n                2\n              )\n              details = undefined\n            }\n          } catch {\n            // TODO\n          }\n        }\n      }\n    }\n\n    ctx.logger.error([message, details].filter(Boolean).join('\\n'))\n    gracefulExit(1)\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/lib/prompt-for-deployment-version.ts",
    "content": "import type { Deployment, Project } from '@agentic/platform-types'\nimport { select } from '@clack/prompts'\nimport { gracefulExit } from 'exit-hook'\nimport semver from 'semver'\n\nimport type { Context } from '../types'\n\nexport async function promptForDeploymentVersion({\n  deployment,\n  project,\n  logger\n}: {\n  deployment: Deployment\n  project: Project\n  logger: Context['logger']\n}): Promise<string | undefined> {\n  const initialVersion = deployment.version\n  const baseVersion =\n    initialVersion || project.lastPublishedDeploymentVersion || '0.0.0'\n\n  const options = [\n    initialVersion ? { value: initialVersion, label: initialVersion } : null,\n    {\n      value: semver.inc(baseVersion, 'patch'),\n      label: `${semver.inc(baseVersion, 'patch')} (patch)`\n    },\n    {\n      value: semver.inc(baseVersion, 'minor'),\n      label: `${semver.inc(baseVersion, 'minor')} (minor)`\n    },\n    {\n      value: semver.inc(baseVersion, 'major'),\n      label: `${semver.inc(baseVersion, 'major')} (major)`\n    }\n  ].filter(Boolean)\n\n  if (project.lastPublishedDeploymentVersion) {\n    logger.info(\n      `Project \"${project.identifier}\" latest published version is \"${project.lastPublishedDeploymentVersion}\".\\n`\n    )\n  } else {\n    logger.info(`Project \"${project.identifier}\" is not published yet.\\n`)\n  }\n\n  const version = await select({\n    message: `Select version of deployment \"${deployment.identifier}\" to publish:`,\n    options\n  })\n\n  if (!version || typeof version !== 'string') {\n    logger.error('No version selected')\n    gracefulExit(1)\n    return\n  }\n\n  return version\n}\n"
  },
  {
    "path": "packages/cli/src/lib/reset.d.ts",
    "content": "import '@fisch0920/config/ts-reset'\n"
  },
  {
    "path": "packages/cli/src/lib/resolve-deployment.ts",
    "content": "import type { AgenticApiClient } from '@agentic/platform-api-client'\nimport type { Deployment } from '@agentic/platform-types'\nimport { loadAgenticConfig } from '@agentic/platform'\n\nimport { AuthStore } from './auth-store'\n\nexport async function resolveDeployment({\n  client,\n  deploymentIdentifier,\n  fuzzyDeploymentIdentifierVersion,\n  cwd,\n  populate\n}: {\n  client: AgenticApiClient\n  deploymentIdentifier?: string\n  fuzzyDeploymentIdentifierVersion?: 'dev' | 'latest'\n  cwd?: string\n  populate?: ('user' | 'team' | 'project')[]\n}): Promise<Deployment> {\n  if (!deploymentIdentifier) {\n    const config = await loadAgenticConfig({\n      cwd\n    })\n\n    // TODO: re-add team support\n    const auth = AuthStore.getAuth()\n    const namespace = auth.user.username\n\n    // TODO: resolve deploymentIdentifier; config identifier may include namespace?\n    // TODO: this needs work...\n\n    deploymentIdentifier = `@${namespace}/${config.slug}${fuzzyDeploymentIdentifierVersion ? `@${fuzzyDeploymentIdentifierVersion}` : ''}`\n  }\n\n  const deployment = await client.getDeploymentByIdentifier({\n    deploymentIdentifier,\n    populate\n  })\n\n  return deployment\n}\n"
  },
  {
    "path": "packages/cli/src/lib/utils.ts",
    "content": "import type { Deployment } from '@agentic/platform-types'\n\nexport function pruneDeployment(\n  deployment: Deployment,\n  { verbose = false }: { verbose?: boolean }\n): Deployment {\n  if (!verbose) {\n    const d = structuredClone(deployment)\n\n    if (d.readme) {\n      d.readme = '<omitted>'\n    }\n\n    // if (d.origin?.type === 'openapi') {\n    //   d.origin.spec = '<omitted>'\n    //   d.origin.toolToOperationMap = '<omitted>' as any\n    // }\n\n    return d\n  }\n\n  return deployment\n}\n"
  },
  {
    "path": "packages/cli/src/types.ts",
    "content": "import type { AgenticApiClient } from '@agentic/platform-api-client'\nimport type { Command } from 'commander'\n\nexport type Context = {\n  client: AgenticApiClient\n  program: Command\n  logger: {\n    log: (...args: any[]) => void\n    info: (...args: any[]) => void\n    error: (...args: any[]) => void\n  }\n  handleError: (error: any) => void\n}\n"
  },
  {
    "path": "packages/cli/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/cli/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup'\n\nexport default defineConfig([\n  {\n    entry: ['src/cli.ts'],\n    outDir: 'dist',\n    target: 'node18',\n    platform: 'node',\n    format: ['esm'],\n    splitting: false,\n    sourcemap: true,\n    minify: false,\n    shims: true,\n    dts: true\n  }\n])\n"
  },
  {
    "path": "packages/emails/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-emails\",\n  \"private\": true,\n  \"version\": \"8.4.4\",\n  \"description\": \"Email templates for the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/emails\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"preview\": \"email dev --dir src/emails --port 3030\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@react-email/components\": \"catalog:\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"resend\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\",\n    \"react-email\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "packages/emails/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-emails <!-- omit from toc -->\n\n> Internal email templates for the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n> [!TIP]\n> You likely don't need this private package unless you are contributing to Agentic directly.\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/emails/src/emails/send-verify-code-email.tsx",
    "content": "import {\n  Body,\n  Container,\n  Head,\n  Heading,\n  Hr,\n  Html,\n  Img,\n  Preview,\n  Section,\n  Tailwind,\n  Text\n} from '@react-email/components'\nimport React from 'react'\n\nexport interface SendVerifyCodeEmailProps {\n  code: string\n}\n\nconst logoUrl =\n  'https://mintlify.s3.us-west-1.amazonaws.com/agentic/media/agentic-logo-light.svg'\n\nfunction SendVerifyCodeEmail({ code }: SendVerifyCodeEmailProps) {\n  const previewText = 'Verify your email address'\n\n  return (\n    <Html>\n      <Head />\n      <Tailwind>\n        <Body className='mx-auto my-auto bg-white px-2 font-sans'>\n          <Preview>{previewText}</Preview>\n\n          <Container className='mx-auto my-[40px] max-w-[465px] rounded border border-[#eaeaea] border-solid p-[20px]'>\n            <Section className='mt-[32px]'>\n              <Img\n                src={logoUrl}\n                width='203'\n                height='48'\n                alt='Agentic Logo'\n                className='mx-auto my-0'\n              />\n            </Section>\n\n            <Heading className='mx-0 my-[30px] p-0 text-center font-normal text-[24px] text-black'>\n              Verify your email address\n            </Heading>\n\n            <Section style={verificationSection}>\n              <Text style={verifyText}>Verification code</Text>\n\n              <Text style={codeText}>{code}</Text>\n            </Section>\n\n            <Hr className='mx-0 my-[26px] w-full border border-[#eaeaea] border-solid' />\n\n            <Text className='text-[#666666] text-[12px] leading-[24px]'>\n              If you didn’t sign up for Agentic, you can safely ignore this\n              email. Someone else might have typed your email address by\n              mistake.\n            </Text>\n          </Container>\n        </Body>\n      </Tailwind>\n    </Html>\n  )\n}\n\nconst text = {\n  color: '#333',\n  fontSize: '14px',\n  margin: '24px 0'\n}\n\nconst verifyText = {\n  ...text,\n  margin: 0,\n  textAlign: 'center' as const\n}\n\nconst codeText = {\n  ...text,\n  fontSize: '36px',\n  margin: '12px 0',\n  textAlign: 'center' as const\n}\n\nconst verificationSection = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center'\n}\n\nSendVerifyCodeEmail.PreviewProps = {\n  code: '123456'\n} as SendVerifyCodeEmailProps\n\nexport default SendVerifyCodeEmail\n"
  },
  {
    "path": "packages/emails/src/index.ts",
    "content": "export * from './resend-email-client'\n"
  },
  {
    "path": "packages/emails/src/resend-email-client.tsx",
    "content": "import { assert } from '@agentic/platform-core'\nimport React from 'react'\nimport { Resend as ResendClient } from 'resend'\n\nimport SendVerifyCodeEmail from './emails/send-verify-code-email'\n\nexport class ResendEmailClient {\n  protected readonly resend: ResendClient\n  protected readonly from: string\n\n  constructor({\n    apiKey,\n    from = 'Agentic <no-reply@notifications.agentic.so>'\n  }: {\n    apiKey: string\n    from?: string\n  }) {\n    assert(apiKey, 'ResendEmailClient missing required \"apiKey\"')\n    this.resend = new ResendClient(apiKey)\n    this.from = from\n  }\n\n  async sendVerifyCodeEmail({\n    code,\n    to\n  }: {\n    code: string\n    to: string\n  }): Promise<string> {\n    const result = await this.resend.emails.send({\n      from: this.from,\n      to,\n      subject: 'Verify your email address',\n      text: 'Verify your email address',\n      react: <SendVerifyCodeEmail code={code} />\n    })\n\n    if (result.error) {\n      throw new Error(result.error.message)\n    }\n\n    assert(result.data?.id, 'Failed to send verify code email')\n    return result.data.id\n  }\n}\n"
  },
  {
    "path": "packages/emails/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\", \"src/emails\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/hono/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-hono\",\n  \"private\": true,\n  \"version\": \"8.4.4\",\n  \"description\": \"Internal Hono utilities for the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/hono\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@hono/sentry\": \"catalog:\",\n    \"@sentry/core\": \"catalog:\",\n    \"dotenv\": \"catalog:\",\n    \"eventid\": \"catalog:\",\n    \"hono\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@sentry/cloudflare\": \"catalog:\",\n    \"@sentry/node\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "packages/hono/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-hono <!-- omit from toc -->\n\n> Internal Hono utilities for the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n> [!TIP]\n> You likely don't need this private package unless you are contributing to Agentic directly.\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/hono/src/env.ts",
    "content": "import 'dotenv/config'\n\nimport type { Simplify } from 'type-fest'\nimport { parseZodSchema } from '@agentic/platform-core'\nimport { z } from 'zod'\n\nimport { logLevelsSchema } from './logger'\n\nexport const envSchema = z\n  .object({\n    ENVIRONMENT: z\n      .enum(['development', 'test', 'production'])\n      .default('development'),\n\n    SERVICE: z.enum(['api', 'gateway']),\n\n    LOG_LEVEL: logLevelsSchema.default('info'),\n\n    SENTRY_DSN: z.string().url().optional()\n  })\n  .strip()\n\nexport function parseEnv(inputEnv: unknown) {\n  const env = parseZodSchema(envSchema, inputEnv, {\n    error: 'Invalid environment variables'\n  })\n\n  const isDev = env.ENVIRONMENT === 'development'\n  const isTest = env.ENVIRONMENT === 'test'\n  const isProd = env.ENVIRONMENT === 'production'\n  const isBrowser = (globalThis as any).window !== undefined\n\n  if (isProd && !env.SENTRY_DSN) {\n    throw new Error(\n      'Internal error: missing required \"SENTRY_DSN\" environment variable in production'\n    )\n  }\n\n  return {\n    ...env,\n    isDev,\n    isTest,\n    isProd,\n    isBrowser\n  }\n}\n\nexport type Env = Simplify<ReturnType<typeof parseEnv>>\n"
  },
  {
    "path": "packages/hono/src/error-handler.ts",
    "content": "import type { Context } from 'hono'\nimport type { HTTPResponseError } from 'hono/types'\nimport type { ContentfulStatusCode } from 'hono/utils/http-status'\nimport { HttpError, JsonRpcError } from '@agentic/platform-core'\nimport { captureException } from '@sentry/core'\nimport { HTTPException } from 'hono/http-exception'\nimport { HTTPError } from 'ky'\n\nimport { applyHeaders } from './header-utils'\nimport {\n  httpStatusCodeToJsonRpcErrorCode,\n  JsonRpcErrorCodes\n} from './json-rpc-errors'\n\n// Don't log 429 errors because they may happen frequently and are just noise.\n// Our access-logger should still log the 429 result, just not the whole error.\nexport const suppressedHttpStatuses = new Set([429])\n\n/**\n * Hono error handler that sanitizes all types of internal, http, json-rpc, and\n * unexpected errors and responds with an appropate HTTP Response.\n *\n * @note This function is synchronous and should never throw.\n */\nexport function errorHandler(\n  err: Error | HTTPResponseError,\n  ctx: Context\n): Response {\n  const isProd = ctx.env?.isProd ?? true\n  const logger = ctx.get('logger') ?? console\n  const requestId = ctx.get('requestId')\n  let isJsonRpcRequest = !!ctx.get('isJsonRpcRequest')\n  let jsonRpcId: string | number | null = null\n  let jsonRpcErrorCode: number | undefined\n\n  let message = 'Internal Server Error'\n  let status: ContentfulStatusCode = 500\n\n  if (err instanceof HttpError) {\n    message = err.message\n    status = err.statusCode as ContentfulStatusCode\n\n    // This is where rate-limit headers will be set, since `RateLimitError`\n    // is a subclass of `HttpError`.\n    applyHeaders({ res: ctx.res, headers: err.headers })\n  } else if (err instanceof HTTPException) {\n    message = err.message\n    status = err.status\n  } else if (err instanceof HTTPError) {\n    message = err.message\n    status = err.response.status as ContentfulStatusCode\n  } else if (err instanceof JsonRpcError) {\n    message = err.message\n    status = err.statusCode as ContentfulStatusCode\n    jsonRpcId = err.jsonRpcId\n    jsonRpcErrorCode = err.jsonRpcErrorCode\n    isJsonRpcRequest = true\n  } else if (!isProd && err.message) {\n    message = err.message\n  }\n\n  if (!Number.isSafeInteger(status)) {\n    status = 500\n  }\n\n  if (!suppressedHttpStatuses.has(status)) {\n    if (status >= 500) {\n      logger.error(status, err)\n\n      if (isProd) {\n        try {\n          captureException(err)\n        } catch (err_) {\n          // eslint-disable-next-line no-console\n          console.error('Error Sentry.captureException failed', err, err_)\n        }\n      }\n    } else if (status !== 404) {\n      logger.warn(status, err)\n    }\n  }\n\n  if (isJsonRpcRequest) {\n    if (jsonRpcErrorCode === undefined) {\n      jsonRpcErrorCode = httpStatusCodeToJsonRpcErrorCode(status)\n    }\n\n    if (!Number.isSafeInteger(jsonRpcErrorCode)) {\n      jsonRpcErrorCode = JsonRpcErrorCodes.InternalError\n    }\n\n    return ctx.json(\n      {\n        jsonrpc: '2.0',\n        error: {\n          message,\n          code: jsonRpcErrorCode\n        },\n        id: jsonRpcId\n      },\n      status\n    )\n  } else {\n    return ctx.json({ error: message, requestId }, status)\n  }\n}\n"
  },
  {
    "path": "packages/hono/src/header-utils.ts",
    "content": "import {\n  getRateLimitHeaders,\n  type RateLimitResult\n} from '@agentic/platform-core'\n\nexport function applyHeaders({\n  res,\n  headers\n}: {\n  res: Response\n  headers?: Record<string, string>\n}) {\n  if (!headers) return\n\n  for (const [key, value] of Object.entries(headers)) {\n    res.headers.set(key, value)\n  }\n}\n\nexport function applyRateLimitHeaders({\n  res,\n  rateLimitResult\n}: {\n  res: Response\n  rateLimitResult?: RateLimitResult\n}) {\n  const rateLimitHeaders = getRateLimitHeaders(rateLimitResult)\n\n  applyHeaders({ res, headers: rateLimitHeaders })\n}\n"
  },
  {
    "path": "packages/hono/src/index.ts",
    "content": "export * from './env'\nexport * from './error-handler'\nexport * from './header-utils'\nexport * from './json-rpc-errors'\nexport * from './logger'\nexport * from './middleware'\nexport type * from './types'\n"
  },
  {
    "path": "packages/hono/src/json-rpc-errors.ts",
    "content": "import type { ContentfulStatusCode } from 'hono/utils/http-status'\n\n/**\n * Error codes defined by the JSON-RPC specification.\n *\n * @see https://www.jsonrpc.org/specification\n */\nexport enum JsonRpcErrorCodes {\n  ConnectionClosed = -32_000,\n  RequestTimeout = -32_001,\n  ParseError = -32_700,\n  InvalidRequest = -32_600,\n  MethodNotFound = -32_601,\n  InvalidParams = -32_602,\n  InternalError = -32_603,\n\n  // Non-standard error codes\n  // @see https://json-rpc.dev/docs/reference/error-codes\n  RateLimitExceeded = -32_002\n}\n\nexport function httpStatusCodeToJsonRpcErrorCode(\n  statusCode: ContentfulStatusCode\n): number {\n  if (statusCode === 429) {\n    return JsonRpcErrorCodes.RateLimitExceeded\n  }\n\n  if (statusCode >= 400 && statusCode < 500) {\n    return JsonRpcErrorCodes.InvalidRequest\n  }\n\n  return JsonRpcErrorCodes.InternalError\n}\n"
  },
  {
    "path": "packages/hono/src/logger/index.ts",
    "content": "export * from './logger'\nexport * from './utils'\n"
  },
  {
    "path": "packages/hono/src/logger/logger.ts",
    "content": "import { assert, type Logger } from '@agentic/platform-core'\nimport { captureException } from '@sentry/core'\nimport { z } from 'zod'\n\nimport type { Env, Environment, Service } from '../types'\nimport { getTraceId } from './utils'\n\nconst rawLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const\nexport const logLevelsSchema = z.enum(rawLogLevels)\nexport type LogLevel = z.infer<typeof logLevelsSchema>\n\nexport const logLevelsMap = rawLogLevels.reduce(\n  (acc, level, index) => {\n    acc[level] = index\n    return acc\n  },\n  {} as Record<LogLevel, number>\n)\n\nconst globalConsole = console\n\nexport class ConsoleLogger implements Logger {\n  protected readonly env: Env\n  protected readonly environment: Environment\n  protected readonly service: Service\n  protected readonly requestId: string\n  protected readonly metadata: Record<string, unknown>\n  protected readonly console: Console\n  protected readonly logLevel: LogLevel\n\n  constructor(\n    env: Env,\n    {\n      requestId,\n      service = env.SERVICE,\n      environment = env.ENVIRONMENT,\n      logLevel = env.LOG_LEVEL,\n      metadata = {},\n      console = globalConsole\n    }: {\n      requestId: string\n      service?: Service\n      environment?: Environment\n      logLevel?: LogLevel\n      metadata?: Record<string, unknown>\n      console?: Console\n    }\n  ) {\n    assert(env, 500, '`env` is required for ConsoleLogger')\n    assert(console, 500, '`console` is required for ConsoleLogger')\n\n    this.env = env\n    this.requestId = requestId\n    this.service = service\n    this.environment = environment\n    this.metadata = metadata\n    this.console = console\n    this.logLevel = logLevel\n  }\n\n  trace(message?: any, ...detail: any[]) {\n    if (logLevelsMap[this.logLevel] > logLevelsMap.trace) {\n      return\n    }\n\n    this.console.trace(message, ...detail)\n    if (this.environment === 'production') {\n      this.console.trace(this._marshal('trace', message, ...detail))\n    }\n  }\n\n  debug(message?: any, ...detail: any[]) {\n    if (logLevelsMap[this.logLevel] > logLevelsMap.debug) {\n      return\n    }\n\n    this.console.debug(message, ...detail)\n    if (this.environment === 'production') {\n      this.console.debug(this._marshal('debug', message, ...detail))\n    }\n  }\n\n  info(message?: any, ...detail: any[]) {\n    if (logLevelsMap[this.logLevel] > logLevelsMap.info) {\n      return\n    }\n\n    this.console.info(message, ...detail)\n    if (this.environment === 'production') {\n      this.console.info(this._marshal('info', message, ...detail))\n    }\n  }\n\n  warn(message?: any, ...detail: any[]) {\n    if (logLevelsMap[this.logLevel] > logLevelsMap.warn) {\n      return\n    }\n\n    this.console.warn(message, ...detail)\n    if (this.environment === 'production') {\n      this.console.warn(this._marshal('warn', message, ...detail))\n    }\n  }\n\n  error(message?: any, ...detail: any[]) {\n    if (logLevelsMap[this.logLevel] > logLevelsMap.error) {\n      return\n    }\n\n    this.console.error(message, ...detail)\n    if (this.environment === 'production') {\n      this.console.error(this._marshal('error', message, ...detail))\n    }\n  }\n\n  protected _marshal(level: LogLevel, message?: any, ...detail: any[]): string {\n    const log = {\n      type: 'log',\n      level,\n      message,\n      detail,\n      time: Date.now(),\n      env: this.environment,\n      service: this.service,\n      requestId: this.requestId,\n      traceId: getTraceId(),\n      metadata: this.metadata\n    }\n\n    if (level === 'error') {\n      let foundError: Error | undefined\n      for (const arg of detail) {\n        if (!arg) {\n          continue\n        }\n\n        if (arg instanceof Error) {\n          foundError = arg\n          break\n        }\n\n        if (typeof arg !== 'object') {\n          continue\n        }\n\n        if ('err' in arg && arg.err instanceof Error) {\n          foundError = arg.err\n          break\n        }\n\n        if ('error' in arg && arg.error instanceof Error) {\n          foundError = arg.error\n          break\n        }\n      }\n\n      if (foundError) {\n        captureException(foundError)\n      }\n    }\n\n    return JSON.stringify(log, null, this.environment === 'development' ? 2 : 0)\n  }\n}\n"
  },
  {
    "path": "packages/hono/src/logger/utils.ts",
    "content": "import { captureException, getActiveSpan, getRootSpan } from '@sentry/core'\n\n/** Get the ID of the trace from the root span of the current span. */\nexport function getTraceId(): string | undefined {\n  try {\n    const activeSpan = getActiveSpan()\n    const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined\n    if (rootSpan) {\n      const { traceId } = rootSpan.spanContext()\n      return traceId\n    }\n    return undefined\n  } catch (err) {\n    captureException(err)\n    return undefined\n  }\n}\n\n/** Get the Sentry trace URL for the current span. */\nexport function getSentryTraceURL(): string {\n  const traceId = getTraceId()\n  return `https://agentic-platform.sentry.io/performance/trace/${traceId}`\n}\n"
  },
  {
    "path": "packages/hono/src/middleware/access-logger.ts",
    "content": "import { createMiddleware } from 'hono/factory'\nimport { logger as honoLogger } from 'hono/logger'\n\nimport type { DefaultHonoEnv } from '../types'\nimport { unless } from './unless'\n\nexport const accessLogger = unless(\n  createMiddleware<DefaultHonoEnv>(async (ctx, next) => {\n    const logger = ctx.get('logger')\n    const { isProd } = ctx.env\n\n    const logMethod = isProd\n      ? logger.trace.bind(logger)\n      : logger.info.bind(logger)\n\n    await honoLogger(logMethod)(ctx, next)\n  }),\n  // Ignore health check route\n  '/v1/health',\n  // Ignore openauth routes\n  // '/authorize',\n  '/userinfo',\n  '/token',\n  '/.well-known/jwks.json',\n  '/.well-known/oauth-authorization-server'\n)\n"
  },
  {
    "path": "packages/hono/src/middleware/index.ts",
    "content": "export * from './access-logger'\nexport * from './init'\nexport * from './response-time'\nexport * from './unless'\nexport { sentry } from '@hono/sentry'\nexport { compress } from 'hono/compress'\nexport { cors } from 'hono/cors'\n"
  },
  {
    "path": "packages/hono/src/middleware/init.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport { EventId } from 'eventid'\nimport { createMiddleware } from 'hono/factory'\n\nimport type { DefaultHonoEnv } from '../types'\nimport { ConsoleLogger } from '../logger'\n\n// Monotonically increasing request IDs for logging / tracing.\nlet eventIdGenerator: EventId | undefined\n\nexport const init = createMiddleware<DefaultHonoEnv>(\n  async function initMiddleware(ctx, next) {\n    assert(ctx.env, 'env is required')\n\n    if (!eventIdGenerator) {\n      eventIdGenerator = new EventId()\n    }\n\n    const requestId = eventIdGenerator.new()\n    ctx.set('requestId', requestId)\n    ctx.res.headers.set('X-Request-Id', requestId)\n\n    const logger = new ConsoleLogger(ctx.env, { requestId })\n    ctx.set('logger', logger)\n    ctx.set('isJsonRpcRequest', false)\n\n    const ip =\n      ctx.req.header('cf-connecting-ip') || ctx.req.header('x-forwarded-for')\n    ctx.set('ip', ip)\n\n    await next()\n  }\n)\n"
  },
  {
    "path": "packages/hono/src/middleware/response-time.ts",
    "content": "import { createMiddleware } from 'hono/factory'\n\nimport type { DefaultHonoEnv } from '../types'\n\nexport const responseTime = createMiddleware<DefaultHonoEnv>(\n  async function responseTimeMiddleware(ctx, next) {\n    const start = Date.now()\n    await next()\n\n    if (!ctx.finalized) {\n      const duration = Date.now() - start\n      ctx.res.headers.set('x-response-time', `${duration}ms`)\n    }\n  }\n)\n"
  },
  {
    "path": "packages/hono/src/middleware/unless.ts",
    "content": "import type { MiddlewareHandler } from 'hono'\n\n/**\n * Creates a hono middleware that only runs if the request path is not in the\n * excluded paths.\n */\nexport function unless(\n  middleware: MiddlewareHandler,\n  ...excluded: string[]\n): MiddlewareHandler {\n  const excludedPaths = new Set(excluded)\n\n  return async (c, next) => {\n    if (excludedPaths.has(c.req.path)) {\n      return next()\n    } else {\n      return middleware(c, next)\n    }\n  }\n}\n"
  },
  {
    "path": "packages/hono/src/sentry.test.ts",
    "content": "import * as SentryCloudflare from '@sentry/cloudflare'\nimport * as SentryNode from '@sentry/node'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { Sentry } from './sentry'\n\ntest('@sentry/node is compatible with simplified Sentry type', () => {\n  expectTypeOf(SentryNode).toExtend<Sentry>()\n  const sN: Sentry = SentryNode\n  expectTypeOf(sN).toExtend<Sentry>()\n})\n\ntest('@sentry/cloudflare is compatible with simplified Sentry type', () => {\n  expectTypeOf(SentryCloudflare).toExtend<Sentry>()\n  const sC: Sentry = SentryCloudflare\n  expectTypeOf(sC).toExtend<Sentry>()\n})\n"
  },
  {
    "path": "packages/hono/src/sentry.ts",
    "content": "import type { getActiveSpan, getRootSpan } from '@sentry/core'\nimport * as SentryCloudflare from '@sentry/cloudflare'\nimport * as SentryNode from '@sentry/node'\n\nexport type Sentry = {\n  // Simplify the type a bit because the optional second hint argument has\n  // changed between different core versions quite a bit.\n  captureException: (exception: unknown) => void | string\n  getActiveSpan: typeof getActiveSpan\n  getRootSpan: typeof getRootSpan\n}\n\nexport const sN: Sentry = SentryNode\nexport const sC: Sentry = SentryCloudflare\n"
  },
  {
    "path": "packages/hono/src/types.ts",
    "content": "import type { Logger } from '@agentic/platform-core'\nimport type { Context } from 'hono'\nimport type { Simplify } from 'type-fest'\n\nimport type { Env } from './env'\nimport type { Sentry } from './sentry'\n\nexport type { Env } from './env'\nexport type { Sentry } from './sentry'\n\nexport type Environment = Env['ENVIRONMENT']\nexport type Service = Env['SERVICE']\n\nexport type DefaultHonoVariables = {\n  sentry: Sentry\n  requestId: string\n  logger: Logger\n  isJsonRpcRequest?: boolean\n  ip?: string\n}\n\nexport type DefaultHonoBindings = Simplify<\n  Env & {\n    sentry: Sentry\n  }\n>\n\nexport type DefaultHonoEnv = {\n  Bindings: DefaultHonoBindings\n  Variables: DefaultHonoVariables\n}\n\nexport type DefaultHonoContext = Context<DefaultHonoEnv>\n"
  },
  {
    "path": "packages/hono/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\", \"../core/src/rate-limit-headers.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/json-schema/license",
    "content": "MIT License\n\nCopyright (c) 2025 Travis Fischer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "packages/json-schema/package.json",
    "content": "{\n  \"name\": \"@agentic/json-schema\",\n  \"version\": \"8.4.4\",\n  \"description\": \"A JSON schema validator that will run on Cloudflare workers. Supports drafts 4, 7, 2019-09, and 2020-12.\",\n  \"authors\": [\n    \"Jeremy Danyow <jdanyow@gmail.com>\",\n    \"Travis Fischer <travis@transitivebullsh.it>\"\n  ],\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/json-schema\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"devDependencies\": {\n    \"json-schema-test-suite\": \"github:json-schema-org/JSON-Schema-Test-Suite#76b529f\",\n    \"ky\": \"catalog:\",\n    \"p-map\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  },\n  \"keywords\": [\n    \"json-schema\",\n    \"jsonschema\",\n    \"json\",\n    \"schema\",\n    \"cloudflare\",\n    \"worker\",\n    \"workers\",\n    \"service-worker\"\n  ]\n}\n"
  },
  {
    "path": "packages/json-schema/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/json-schema\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform-api-client.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n> [!NOTE]\n> This package is a fork of [@cfworker/json-schema](https://github.com/cfworker/cfworker) which adds support for [ajv-style type coercion](https://ajv.js.org/coercion.html). Coercion is disabled by default, but can be enabled with a boolean flag.\n\n# @agentic/json-schema\n\n![](https://badgen.net/bundlephobia/minzip/@cfworker/json-schema)\n![](https://badgen.net/bundlephobia/min/@cfworker/json-schema)\n![](https://badgen.net/bundlephobia/dependency-count/@cfworker/json-schema)\n![](https://badgen.net/bundlephobia/tree-shaking/@cfworker/json-schema)\n![](https://badgen.net/npm/types/@cfworker/json-schema?icon=typescript)\n\nA JSON schema validator that will run on Cloudflare workers. Supports drafts 4, 7, 2019-09, and 2020-12.\n\nThis library is validated against the [json-schema-test-suite](https://github.com/json-schema-org/JSON-Schema-Test-Suite), a series of approximately 4,500 assertions maintained along with the json-schema specification. A small set of test cases are intentionally not supported due to performance constraints or lack of feature use. These list of unsupported features are maintained in [test/unsupported.ts](./test/unsupported.ts). While this library is not the fastest due to lack of code generation, it's consistently among the [most spec compliant](https://json-schema.org/implementations.html#benchmarks).\n\n## Background\n\n_Why another JSON schema validator?_\n\nCloudflare workers do not have APIs required by [Ajv](https://ajv.js.org/) schema compilation (`eval` or `new Function(code)`).\nIf possible use Ajv in a build step to precompile your schema. Otherwise this library could work for you.\n\n## Basic usage\n\n```js\nimport { Validator } from '@cfworker/json-schema'\n\nconst validator = new Validator({ type: 'number' })\n\nconst result = validator.validate(7)\n```\n\n## Specify meta schema draft\n\n```js\nconst validator = new Validator({ type: 'number' }, '4') // draft-4\n```\n\n## Add schemas\n\n```js\nconst validator = new Validator({\n  $id: 'https://foo.bar/baz',\n  $ref: '/beep'\n})\n\nvalidator.addSchema({ $id: 'https://foo.bar/beep', type: 'boolean' })\n```\n\n## Include all errors\n\nBy default the validator stops processing after the first error. Set the `shortCircuit` parameter to `false` to emit all errors.\n\n```js\nconst shortCircuit = false;\n\nconst draft = '2019-09';\n\nconst schema = {\n  type: 'object',\n  required: ['name', 'email', 'number', 'bool'],\n  properties: {\n    name: { type: 'string' },\n    email: { type: 'string', format: 'email' },\n    number: { type: 'number' },\n    bool: { type: 'boolean' }\n  }\n};\n\nconst validator = new Validator(schema, draft, shortCircuit);\n\nconst result = validator.validate({\n  name: 'hello',\n  email: 5, // invalid type\n  number: 'Hello' // invalid type\n  bool: 'false' // invalid type\n});\n```\n"
  },
  {
    "path": "packages/json-schema/src/coercion.ts",
    "content": "import type { InstanceType } from './types'\n\nexport function getInstanceType(\n  instance: any\n): Exclude<InstanceType, 'integer'> {\n  const rawInstanceType = typeof instance\n  switch (rawInstanceType) {\n    case 'boolean':\n    case 'number':\n    case 'string':\n      return rawInstanceType\n    case 'object':\n      if (instance === null) {\n        return 'null'\n      } else if (Array.isArray(instance)) {\n        return 'array'\n      } else {\n        return 'object'\n      }\n    default:\n      // undefined, bigint, function, symbol\n      throw new Error(\n        `Instances of \"${rawInstanceType}\" type are not supported.`\n      )\n  }\n}\n\nexport function coerceValue({\n  instanceType,\n  instance,\n  $type,\n  recur = true\n}: {\n  instanceType: Exclude<InstanceType, 'integer'>\n  instance: any\n  $type: InstanceType\n  recur?: boolean\n}): any | undefined {\n  if ($type === undefined) {\n    return instance\n  }\n\n  if (Number.isNaN(instance)) {\n    return undefined\n  }\n\n  let valid = true\n\n  if ($type === 'integer') {\n    if (instanceType !== 'number' || instance % 1 || Number.isNaN(instance)) {\n      valid = false\n    }\n  } else if (instanceType !== $type) {\n    valid = false\n  }\n\n  if (valid) {\n    return instance\n  }\n\n  if (!recur) {\n    return\n  }\n\n  switch ($type) {\n    case 'integer':\n    case 'number':\n      switch (instanceType) {\n        case 'string':\n          instance = +instance\n          break\n\n        case 'boolean':\n          instance = instance === true ? 1 : 0\n          break\n\n        case 'null':\n          instance = 0\n          break\n\n        case 'array':\n          if (instance.length === 1) {\n            instance = instance[0]\n          }\n          break\n      }\n\n      if ($type === 'integer' && typeof instance === 'number') {\n        instance = Math.floor(instance)\n      }\n      break\n\n    case 'string':\n      switch (instanceType) {\n        case 'boolean':\n          instance = instance === true ? 'true' : 'false'\n          break\n\n        case 'number':\n          instance = String(instance)\n          break\n\n        case 'null':\n          instance = ''\n          break\n\n        case 'array':\n          if (instance.length === 1) {\n            instance = instance[0]\n          }\n          break\n      }\n      break\n\n    case 'boolean':\n      switch (instanceType) {\n        case 'string':\n          if (instance === 'true') {\n            instance = true\n          } else if (instance === 'false') {\n            instance = false\n          }\n          break\n\n        case 'number':\n          if (instance === 1) {\n            instance = true\n          } else if (instance === 0) {\n            instance = false\n          }\n          break\n\n        case 'null':\n          instance = false\n          break\n\n        case 'array':\n          if (instance.length === 1) {\n            instance = instance[0]\n          }\n          break\n      }\n      break\n\n    case 'null':\n      switch (instanceType) {\n        case 'string':\n          if (instance === '') {\n            instance = null\n          }\n          break\n\n        case 'number':\n          if (instance === 0) {\n            instance = null\n          }\n          break\n\n        case 'boolean':\n          if (instance === false) {\n            instance = null\n          }\n          break\n\n        case 'array':\n          if (instance.length === 1 && instance[0] === null) {\n            instance = null\n          }\n          break\n      }\n      break\n\n    case 'array':\n      switch (instanceType) {\n        case 'string':\n          instance = [instance]\n          break\n\n        case 'number':\n          instance = [instance]\n          break\n\n        case 'boolean':\n          instance = [instance]\n          break\n\n        case 'null':\n          instance = [null]\n          break\n      }\n      break\n  }\n\n  return coerceValue({\n    instanceType: getInstanceType(instance),\n    instance,\n    $type,\n    recur: false\n  })\n}\n"
  },
  {
    "path": "packages/json-schema/src/deep-compare-strict.ts",
    "content": "export function deepCompareStrict(a: any, b: any): boolean {\n  const typeofa = typeof a\n  if (typeofa !== typeof b) {\n    return false\n  }\n  if (Array.isArray(a)) {\n    if (!Array.isArray(b)) {\n      return false\n    }\n    const length = a.length\n    if (length !== b.length) {\n      return false\n    }\n    for (let i = 0; i < length; i++) {\n      if (!deepCompareStrict(a[i], b[i])) {\n        return false\n      }\n    }\n    return true\n  }\n  if (typeofa === 'object') {\n    if (!a || !b) {\n      return a === b\n    }\n    const aKeys = Object.keys(a)\n    const bKeys = Object.keys(b)\n    const length = aKeys.length\n    if (length !== bKeys.length) {\n      return false\n    }\n    for (const k of aKeys) {\n      if (!deepCompareStrict(a[k], b[k])) {\n        return false\n      }\n    }\n    return true\n  }\n  return a === b\n}\n"
  },
  {
    "path": "packages/json-schema/src/dereference.ts",
    "content": "/* eslint-disable unicorn/no-thenable */\nimport type { Schema } from './types'\nimport { encodePointer } from './pointer'\n\nexport const schemaKeyword: Record<string, boolean> = {\n  additionalItems: true,\n  unevaluatedItems: true,\n  items: true,\n  contains: true,\n  additionalProperties: true,\n  unevaluatedProperties: true,\n  propertyNames: true,\n  not: true,\n  if: true,\n  then: true,\n  else: true\n}\n\nexport const schemaArrayKeyword: Record<string, boolean> = {\n  prefixItems: true,\n  items: true,\n  allOf: true,\n  anyOf: true,\n  oneOf: true\n}\n\nexport const schemaMapKeyword: Record<string, boolean> = {\n  $defs: true,\n  definitions: true,\n  properties: true,\n  patternProperties: true,\n  dependentSchemas: true\n}\n\nexport const ignoredKeyword: Record<string, boolean> = {\n  id: true,\n  $id: true,\n  $ref: true,\n  $schema: true,\n  $anchor: true,\n  $vocabulary: true,\n  $comment: true,\n  default: true,\n  enum: true,\n  const: true,\n  required: true,\n  type: true,\n  maximum: true,\n  minimum: true,\n  exclusiveMaximum: true,\n  exclusiveMinimum: true,\n  multipleOf: true,\n  maxLength: true,\n  minLength: true,\n  pattern: true,\n  format: true,\n  maxItems: true,\n  minItems: true,\n  uniqueItems: true,\n  maxProperties: true,\n  minProperties: true\n}\n\n/**\n * Default base URI for schemas without an $id.\n * https://json-schema.org/draft/2019-09/json-schema-core.html#initial-base\n * https://tools.ietf.org/html/rfc3986#section-5.1\n */\nexport const initialBaseURI: URL = (globalThis as any)?.self?.location?.origin\n  ? new URL(\n      (globalThis as any).self.location.origin +\n        (globalThis as any).self.location.pathname +\n        (globalThis as any).self.location.search\n    )\n  : new URL('https://github.com/transitive-bullshit/agentic')\n\nexport function dereference(\n  schema: Schema | boolean,\n  lookup: Record<string, Schema | boolean> = Object.create(null),\n  baseURI: URL = initialBaseURI,\n  basePointer = ''\n): Record<string, Schema | boolean> {\n  if (schema && typeof schema === 'object' && !Array.isArray(schema)) {\n    const id: string = schema.$id || schema.id\n    if (id) {\n      const url = new URL(id, baseURI.href)\n      if (url.hash.length > 1) {\n        lookup[url.href] = schema\n      } else {\n        url.hash = '' // normalize hash https://url.spec.whatwg.org/#dom-url-hash\n        if (basePointer === '') {\n          baseURI = url\n        } else {\n          dereference(schema, lookup, baseURI)\n        }\n      }\n    }\n  } else if (schema !== true && schema !== false) {\n    return lookup\n  }\n\n  // compute the schema's URI and add it to the mapping.\n  const schemaURI = baseURI.href + (basePointer ? '#' + basePointer : '')\n  if (lookup[schemaURI] !== undefined) {\n    throw new Error(`Duplicate schema URI \"${schemaURI}\".`)\n  }\n  lookup[schemaURI] = schema\n\n  // exit early if this is a boolean schema.\n  if (schema === true || schema === false) {\n    return lookup\n  }\n\n  // set the schema's absolute URI.\n  if (schema.__absolute_uri__ === undefined) {\n    Object.defineProperty(schema, '__absolute_uri__', {\n      enumerable: false,\n      value: schemaURI\n    })\n  }\n\n  // if a $ref is found, resolve it's absolute URI.\n  if (schema.$ref && schema.__absolute_ref__ === undefined) {\n    const url = new URL(schema.$ref, baseURI.href)\n    // eslint-disable-next-line no-self-assign\n    url.hash = url.hash // normalize hash https://url.spec.whatwg.org/#dom-url-hash\n    Object.defineProperty(schema, '__absolute_ref__', {\n      enumerable: false,\n      value: url.href\n    })\n  }\n\n  // if a $recursiveRef is found, resolve it's absolute URI.\n  if (schema.$recursiveRef && schema.__absolute_recursive_ref__ === undefined) {\n    const url = new URL(schema.$recursiveRef, baseURI.href)\n    // eslint-disable-next-line no-self-assign\n    url.hash = url.hash // normalize hash https://url.spec.whatwg.org/#dom-url-hash\n    Object.defineProperty(schema, '__absolute_recursive_ref__', {\n      enumerable: false,\n      value: url.href\n    })\n  }\n\n  // if an $anchor is found, compute it's URI and add it to the mapping.\n  if (schema.$anchor) {\n    const url = new URL('#' + schema.$anchor, baseURI.href)\n    lookup[url.href] = schema\n  }\n\n  // process subschemas.\n  for (const key in schema) {\n    if (ignoredKeyword[key]) {\n      continue\n    }\n    const keyBase = `${basePointer}/${encodePointer(key)}`\n    const subSchema = schema[key]\n    if (Array.isArray(subSchema)) {\n      if (schemaArrayKeyword[key]) {\n        const length = subSchema.length\n        for (let i = 0; i < length; i++) {\n          dereference(subSchema[i]!, lookup, baseURI, `${keyBase}/${i}`)\n        }\n      }\n    } else if (schemaMapKeyword[key]) {\n      for (const subKey in subSchema) {\n        dereference(\n          subSchema[subKey]!,\n          lookup,\n          baseURI,\n          `${keyBase}/${encodePointer(subKey)}`\n        )\n      }\n    } else {\n      dereference(subSchema, lookup, baseURI, keyBase)\n    }\n  }\n\n  return lookup\n}\n\n// schema identification examples\n// https://json-schema.org/draft/2019-09/json-schema-core.html#rfc.appendix.A\n// $ref delegation\n// https://github.com/json-schema-org/json-schema-spec/issues/514\n// output format\n// https://json-schema.org/draft/2019-09/json-schema-core.html#output\n// JSON pointer\n// https://tools.ietf.org/html/rfc6901\n// JSON relative pointer\n// https://tools.ietf.org/html/draft-handrews-relative-json-pointer-01\n"
  },
  {
    "path": "packages/json-schema/src/format.ts",
    "content": "/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable no-control-regex */\n/* eslint-disable security/detect-unsafe-regex */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n// based on https://github.com/epoberezkin/ajv/blob/master/lib/compile/formats.js\n\nconst DATE = /^(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)$/\nconst DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\nconst TIME = /^(\\d\\d):(\\d\\d):(\\d\\d)(\\.\\d+)?(z|[+-]\\d\\d(?::?\\d\\d)?)?$/i\nconst HOSTNAME =\n  /^(?=.{1,253}\\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\\.?$/i\n// const URI = /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\\?(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;\nconst URIREF =\n  /^(?:[a-z][a-z0-9+\\-.]*:)?(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'\"()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\\?(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i\n// uri-template: https://tools.ietf.org/html/rfc6570\nconst URITEMPLATE =\n  /^(?:(?:[^\\u0000-\\u0020\"'<>%\\\\^`{|}]|%[0-9a-f]{2})|\\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?)*\\})*$/i\n// For the source: https://gist.github.com/dperini/729294\n// For test cases: https://mathiasbynens.be/demo/url-regex\nconst URL_ =\n  /^(?:(?:https?|ftp):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u{00A1}-\\u{FFFF}0-9]+-?)*[a-z\\u{00A1}-\\u{FFFF}0-9]+)(?:\\.(?:[a-z\\u{00A1}-\\u{FFFF}0-9]+-?)*[a-z\\u{00A1}-\\u{FFFF}0-9]+)*(?:\\.(?:[a-z\\u{00A1}-\\u{FFFF}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?$/iu\nconst UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i\nconst JSON_POINTER = /^(?:\\/(?:[^~/]|~0|~1)*)*$/\nconst JSON_POINTER_URI_FRAGMENT =\n  /^#(?:\\/(?:[a-z0-9_\\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i\nconst RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/\n\n// // date: http://tools.ietf.org/html/rfc3339#section-5.6\n// const FASTDATE = /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/;\n// // date-time: http://tools.ietf.org/html/rfc3339#section-5.6\n// const FASTTIME =\n//   /^(?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)?$/i;\n// const FASTDATETIME =\n//   /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d[t\\s](?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)$/i;\n// // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js\n// // const FASTURI = /^(?:[a-z][a-z0-9+-.]*:)(?:\\/?\\/)?[^\\s]*$/i;\n// const FASTURIREFERENCE =\n//   /^(?:(?:[a-z][a-z0-9+-.]*:)?\\/?\\/)?(?:[^\\\\\\s#][^\\s#]*)?(?:#[^\\\\\\s]*)?$/i;\n\n// https://github.com/ExodusMovement/schemasafe/blob/master/src/formats.js\nconst EMAIL = (input: string) => {\n  if (input[0] === '\"') return false\n  const [name, host, ...rest] = input.split('@')\n  if (\n    !name ||\n    !host ||\n    rest.length !== 0 ||\n    name.length > 64 ||\n    host.length > 253\n  )\n    return false\n  if (name[0] === '.' || name.endsWith('.') || name.includes('..')) return false\n  if (\n    !/^[a-z0-9.-]+$/i.test(host) ||\n    !/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+$/i.test(name)\n  )\n    return false\n  return host\n    .split('.')\n    .every((part) => /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/i.test(part))\n}\n\n// optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\nconst IPV4 =\n  /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/\n// optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses\nconst IPV6 =\n  /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))$/i\n\n// https://github.com/ExodusMovement/schemasafe/blob/master/src/formats.js\nconst DURATION = (input: string) =>\n  input.length > 1 &&\n  input.length < 80 &&\n  (/^P\\d+([.,]\\d+)?W$/.test(input) ||\n    (/^P[\\dYMDTHS]*(\\d[.,]\\d+)?[YMDHS]$/.test(input) &&\n      /^P([.,\\d]+Y)?([.,\\d]+M)?([.,\\d]+D)?(T([.,\\d]+H)?([.,\\d]+M)?([.,\\d]+S)?)?$/.test(\n        input\n      )))\n\nfunction bind(r: RegExp) {\n  return r.test.bind(r)\n}\n\nexport const format: Record<string, (s: string) => boolean> = {\n  date,\n  time: time.bind(undefined, false),\n  'date-time': date_time,\n  duration: DURATION,\n  uri,\n  'uri-reference': bind(URIREF),\n  'uri-template': bind(URITEMPLATE),\n  url: bind(URL_),\n  email: EMAIL,\n  hostname: bind(HOSTNAME),\n  ipv4: bind(IPV4),\n  ipv6: bind(IPV6),\n  regex,\n  uuid: bind(UUID),\n  'json-pointer': bind(JSON_POINTER),\n  'json-pointer-uri-fragment': bind(JSON_POINTER_URI_FRAGMENT),\n  'relative-json-pointer': bind(RELATIVE_JSON_POINTER)\n}\n\nfunction isLeapYear(year: number) {\n  // https://tools.ietf.org/html/rfc3339#appendix-C\n  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)\n}\n\nfunction date(str: string) {\n  // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n  const matches = str.match(DATE)\n  if (!matches) return false\n\n  const year = +matches[1]\n  const month = +matches[2]\n  const day = +matches[3]\n\n  return (\n    month >= 1 &&\n    month <= 12 &&\n    day >= 1 &&\n    day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month])\n  )\n}\n\nfunction time(full: boolean, str: string) {\n  const matches = str.match(TIME)\n  if (!matches) return false\n\n  const hour = +matches[1]\n  const minute = +matches[2]\n  const second = +matches[3]\n  const timeZone = !!matches[5]\n  return (\n    ((hour <= 23 && minute <= 59 && second <= 59) ||\n      (hour === 23 && minute === 59 && second === 60)) &&\n    (!full || timeZone)\n  )\n}\n\nconst DATE_TIME_SEPARATOR = /t|\\s/i\nfunction date_time(str: string) {\n  // http://tools.ietf.org/html/rfc3339#section-5.6\n  const dateTime = str.split(DATE_TIME_SEPARATOR)\n  return dateTime.length === 2 && date(dateTime[0]) && time(true, dateTime[1])\n}\n\nconst NOT_URI_FRAGMENT = /\\/|:/\nconst URI_PATTERN =\n  /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\\?(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i\n\nfunction uri(str: string): boolean {\n  // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n  return NOT_URI_FRAGMENT.test(str) && URI_PATTERN.test(str)\n}\n\nconst Z_ANCHOR = /[^\\\\]\\\\Z/\nfunction regex(str: string) {\n  if (Z_ANCHOR.test(str)) return false\n  try {\n    // eslint-disable-next-line security/detect-non-literal-regexp\n    new RegExp(str, 'u')\n    return true\n  } catch {\n    return false\n  }\n}\n"
  },
  {
    "path": "packages/json-schema/src/index.ts",
    "content": "export * from './coercion'\nexport * from './deep-compare-strict'\nexport * from './dereference'\nexport * from './format'\nexport * from './pointer'\nexport * from './types'\nexport * from './ucs2-length'\nexport * from './validate'\nexport * from './validator'\n"
  },
  {
    "path": "packages/json-schema/src/pointer.ts",
    "content": "export function encodePointer(p: string): string {\n  return encodeURI(escapePointer(p))\n}\n\nexport function escapePointer(p: string): string {\n  return p.replaceAll('~', '~0').replaceAll('/', '~1')\n}\n"
  },
  {
    "path": "packages/json-schema/src/types.ts",
    "content": "export type SchemaDraft = '4' | '7' | '2019-09' | '2020-12'\n\nexport const enum OutputFormat {\n  Flag = 1,\n  Basic = 2,\n  Detailed = 4\n}\n\nexport type InstanceType =\n  | 'array'\n  | 'boolean'\n  | 'integer'\n  | 'null'\n  | 'number'\n  | 'object'\n  | 'string'\n\nexport interface Schema {\n  $id?: string\n  $anchor?: string\n  $recursiveAnchor?: boolean\n  $ref?: string\n  $recursiveRef?: '#'\n  $schema?: string\n  $comment?: string\n  $defs?: any\n  $vocabulary?: Record<string, boolean>\n\n  type?: InstanceType | InstanceType[]\n  const?: any\n  enum?: any[]\n  required?: string[]\n  not?: Schema\n  anyOf?: Schema[]\n  allOf?: Schema[]\n  oneOf?: Schema[]\n  if?: Schema\n  then?: Schema\n  else?: Schema\n\n  format?: string\n\n  properties?: Record<string | number, Schema | boolean>\n  patternProperties?: Record<string, Schema | boolean>\n  additionalProperties?: Schema | boolean\n  unevaluatedProperties?: Schema | boolean\n  minProperties?: number\n  maxProperties?: number\n  propertyNames?: Schema\n  dependentRequired?: Record<string, string[]>\n  dependentSchemas?: Record<string, Schema>\n  dependencies?: Record<string, Schema | string[]>\n\n  prefixItems?: Array<Schema | boolean>\n  items?: Schema | boolean | Array<Schema | boolean>\n  additionalItems?: Schema | boolean\n  unevaluatedItems?: Schema | boolean\n  contains?: Schema | boolean\n  minContains?: number\n  maxContains?: number\n  minItems?: number\n  maxItems?: number\n  uniqueItems?: boolean\n\n  minimum?: number\n  maximum?: number\n  exclusiveMinimum?: number | boolean\n  exclusiveMaximum?: number | boolean\n  multipleOf?: number\n\n  minLength?: number\n  maxLength?: number\n  pattern?: string\n\n  __absolute_ref__?: string\n  __absolute_recursive_ref__?: string\n  __absolute_uri__?: string\n\n  [key: string]: any\n}\n\nexport interface OutputUnit {\n  keyword: string\n  keywordLocation: string\n  instanceLocation: string\n  error: string\n}\n\nexport type ValidationResult = {\n  valid: boolean\n  errors: OutputUnit[]\n  instance: any\n}\n"
  },
  {
    "path": "packages/json-schema/src/ucs2-length.ts",
    "content": "/* eslint-disable eqeqeq */\n/* eslint-disable unicorn/prefer-code-point */\n\n/**\n * Get UCS-2 length of a string\n * https://mathiasbynens.be/notes/javascript-encoding\n * https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\n */\nexport function ucs2length(s: string): number {\n  const length = s.length\n  let result = 0\n  let index = 0\n  let charCode: number\n  while (index < length) {\n    result++\n    charCode = s.charCodeAt(index++)\n    if (charCode >= 0xd8_00 && charCode <= 0xdb_ff && index < length) {\n      // high surrogate, and there is a next character\n      charCode = s.charCodeAt(index)\n      if ((charCode & 0xfc_00) == 0xdc_00) {\n        // low surrogate\n        index++\n      }\n    }\n  }\n  return result\n}\n"
  },
  {
    "path": "packages/json-schema/src/validate.ts",
    "content": "/* eslint-disable security/detect-non-literal-regexp */\nimport type { OutputUnit, Schema, SchemaDraft, ValidationResult } from './types'\nimport { coerceValue, getInstanceType } from './coercion'\nimport { deepCompareStrict } from './deep-compare-strict'\nimport { dereference } from './dereference'\nimport { format } from './format'\nimport { encodePointer } from './pointer'\nimport { ucs2length } from './ucs2-length'\n\nexport type Evaluated = Record<string | number, boolean>\n\nexport function validate(\n  instance: any,\n  schema: Schema | boolean,\n  opts: {\n    draft?: SchemaDraft\n    lookup?: Record<string, Schema | boolean>\n    coerce?: boolean\n    shortCircuit?: boolean\n    recursiveAnchor?: Schema | null\n    instanceLocation?: string\n    schemaLocation?: string\n    evaluated?: Evaluated\n    strictAdditionalProperties?: boolean\n  } = {}\n): ValidationResult {\n  const {\n    draft = '2019-09',\n    lookup = dereference(schema),\n    coerce = false,\n    shortCircuit = true,\n    instanceLocation = '#',\n    schemaLocation = '#',\n    evaluated = Object.create(null),\n    strictAdditionalProperties = false\n  } = opts\n  let { recursiveAnchor = null } = opts\n\n  if (schema === true) {\n    return { valid: true, errors: [], instance }\n  }\n\n  if (schema === false) {\n    return {\n      valid: false,\n      instance,\n      errors: [\n        {\n          instanceLocation,\n          keyword: 'false',\n          keywordLocation: instanceLocation,\n          error: 'False boolean schema.'\n        }\n      ]\n    }\n  }\n\n  let instanceType = getInstanceType(instance)\n\n  const {\n    $ref,\n    $recursiveRef,\n    $recursiveAnchor,\n    type: $type,\n    const: $const,\n    enum: $enum,\n    required: $required,\n    not: $not,\n    anyOf: $anyOf,\n    allOf: $allOf,\n    oneOf: $oneOf,\n    if: $if,\n    then: $then,\n    else: $else,\n\n    format: $format,\n\n    properties: $properties,\n    patternProperties: $patternProperties,\n    additionalProperties: $additionalProperties,\n    unevaluatedProperties: $unevaluatedProperties,\n    minProperties: $minProperties,\n    maxProperties: $maxProperties,\n    propertyNames: $propertyNames,\n    dependentRequired: $dependentRequired,\n    dependentSchemas: $dependentSchemas,\n    dependencies: $dependencies,\n\n    prefixItems: $prefixItems,\n    items: $items,\n    additionalItems: $additionalItems,\n    unevaluatedItems: $unevaluatedItems,\n    contains: $contains,\n    minContains: $minContains,\n    maxContains: $maxContains,\n    minItems: $minItems,\n    maxItems: $maxItems,\n    uniqueItems: $uniqueItems,\n\n    minimum: $minimum,\n    maximum: $maximum,\n    exclusiveMinimum: $exclusiveMinimum,\n    exclusiveMaximum: $exclusiveMaximum,\n    multipleOf: $multipleOf,\n\n    minLength: $minLength,\n    maxLength: $maxLength,\n    pattern: $pattern,\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    __absolute_ref__,\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    __absolute_recursive_ref__\n  } = schema\n\n  const errors: OutputUnit[] = []\n\n  if ($recursiveAnchor === true && recursiveAnchor === null) {\n    recursiveAnchor = schema\n  }\n\n  if ($recursiveRef === '#') {\n    const refSchema =\n      recursiveAnchor === null\n        ? (lookup[__absolute_recursive_ref__!] as Schema)\n        : recursiveAnchor\n    const keywordLocation = `${schemaLocation}/$recursiveRef`\n    const result = validate(\n      instance,\n      recursiveAnchor === null ? schema : recursiveAnchor,\n      {\n        ...opts,\n        lookup,\n        recursiveAnchor: refSchema,\n        instanceLocation,\n        schemaLocation: keywordLocation,\n        evaluated\n      }\n    )\n    if (result.valid) {\n      instance = result.instance\n    } else {\n      errors.push(\n        {\n          instanceLocation,\n          keyword: '$recursiveRef',\n          keywordLocation,\n          error: 'A subschema had errors.'\n        },\n        ...result.errors\n      )\n    }\n  }\n\n  if ($ref !== undefined) {\n    const uri = __absolute_ref__ || $ref\n    const refSchema = lookup[uri]\n    if (refSchema === undefined) {\n      let message = `Unresolved $ref \"${$ref}\".`\n      if (__absolute_ref__ && __absolute_ref__ !== $ref) {\n        message += `  Absolute URI \"${__absolute_ref__}\".`\n      }\n      message += `\\nKnown schemas:\\n- ${Object.keys(lookup).join('\\n- ')}`\n      throw new Error(message)\n    }\n    const keywordLocation = `${schemaLocation}/$ref`\n    const result = validate(instance, refSchema, {\n      ...opts,\n      lookup,\n      recursiveAnchor,\n      instanceLocation,\n      schemaLocation: keywordLocation,\n      evaluated\n    })\n    if (result.valid) {\n      instance = result.instance\n    } else {\n      errors.push(\n        {\n          instanceLocation,\n          keyword: '$ref',\n          keywordLocation,\n          error: 'A subschema had errors.'\n        },\n        ...result.errors\n      )\n    }\n    if (draft === '4' || draft === '7') {\n      return { valid: errors.length === 0, instance, errors }\n    }\n  }\n\n  if (Array.isArray($type)) {\n    const length = $type.length\n    let valid = false\n    for (let i = 0; i < length; i++) {\n      if (\n        instanceType === $type[i] ||\n        ($type[i] === 'integer' &&\n          instanceType === 'number' &&\n          instance % 1 === 0 &&\n          Number.isNaN(instance))\n      ) {\n        valid = true\n        break\n      }\n    }\n    if (!valid) {\n      errors.push({\n        instanceLocation,\n        keyword: 'type',\n        keywordLocation: `${schemaLocation}/type`,\n        error: `Instance type \"${instanceType}\" is invalid. Expected \"${$type.join(\n          '\", \"'\n        )}\".`\n      })\n    }\n  } else if ($type === 'integer') {\n    if (instanceType !== 'number' || instance % 1 || Number.isNaN(instance)) {\n      const coercedInstance = coerce\n        ? coerceValue({\n            instance,\n            instanceType,\n            $type\n          })\n        : undefined\n\n      if (coercedInstance !== undefined) {\n        instance = coercedInstance\n        instanceType = getInstanceType(instance)\n      } else {\n        errors.push({\n          instanceLocation,\n          keyword: 'type',\n          keywordLocation: `${schemaLocation}/type`,\n          error: `Instance type \"${instanceType}\" is invalid. Expected \"${$type}\".`\n        })\n      }\n    }\n  } else if ($type !== undefined && instanceType !== $type) {\n    const coercedInstance = coerce\n      ? coerceValue({\n          instance,\n          instanceType,\n          $type\n        })\n      : undefined\n\n    if (coercedInstance !== undefined) {\n      instance = coercedInstance\n      instanceType = getInstanceType(instance)\n    } else {\n      errors.push({\n        instanceLocation,\n        keyword: 'type',\n        keywordLocation: `${schemaLocation}/type`,\n        error: `Instance type \"${instanceType}\" is invalid. Expected \"${$type}\".`\n      })\n    }\n  }\n\n  if ($const !== undefined) {\n    if (instanceType === 'object' || instanceType === 'array') {\n      if (!deepCompareStrict(instance, $const)) {\n        errors.push({\n          instanceLocation,\n          keyword: 'const',\n          keywordLocation: `${schemaLocation}/const`,\n          error: `Instance does not match ${JSON.stringify($const)}.`\n        })\n      }\n    } else if (instance !== $const) {\n      errors.push({\n        instanceLocation,\n        keyword: 'const',\n        keywordLocation: `${schemaLocation}/const`,\n        error: `Instance does not match ${JSON.stringify($const)}.`\n      })\n    }\n  }\n\n  if ($enum !== undefined) {\n    if (instanceType === 'object' || instanceType === 'array') {\n      if (!$enum.some((value) => deepCompareStrict(instance, value))) {\n        errors.push({\n          instanceLocation,\n          keyword: 'enum',\n          keywordLocation: `${schemaLocation}/enum`,\n          error: `Instance does not match any of ${JSON.stringify($enum)}.`\n        })\n      }\n    } else if (!$enum.includes(instance)) {\n      errors.push({\n        instanceLocation,\n        keyword: 'enum',\n        keywordLocation: `${schemaLocation}/enum`,\n        error: `Instance does not match any of ${JSON.stringify($enum)}.`\n      })\n    }\n  }\n\n  // TODO: type coercion\n  if ($not !== undefined) {\n    const keywordLocation = `${schemaLocation}/not`\n    const result = validate(instance, $not, {\n      ...opts,\n      lookup,\n      recursiveAnchor,\n      instanceLocation,\n      schemaLocation: keywordLocation\n      // evaluated\n    })\n    if (result.valid) {\n      errors.push({\n        instanceLocation,\n        keyword: 'not',\n        keywordLocation,\n        error: 'Instance matched \"not\" schema.'\n      })\n    }\n  }\n\n  const subEvaluateds: Array<Evaluated> = []\n\n  // TODO: type coercion\n  if ($anyOf !== undefined) {\n    const keywordLocation = `${schemaLocation}/anyOf`\n    const errorsLength = errors.length\n    let anyValid = false\n    for (const [i, subSchema] of $anyOf.entries()) {\n      const subEvaluated: Evaluated = Object.create(evaluated)\n      const result = validate(instance, subSchema, {\n        ...opts,\n        lookup,\n        recursiveAnchor: $recursiveAnchor === true ? recursiveAnchor : null,\n        instanceLocation,\n        schemaLocation: `${keywordLocation}/${i}`,\n        evaluated: subEvaluated\n      })\n      errors.push(...result.errors)\n      anyValid = anyValid || result.valid\n      if (result.valid) {\n        subEvaluateds.push(subEvaluated)\n      }\n    }\n    if (anyValid) {\n      errors.length = errorsLength\n    } else {\n      errors.splice(errorsLength, 0, {\n        instanceLocation,\n        keyword: 'anyOf',\n        keywordLocation,\n        error: 'Instance does not match any subschemas.'\n      })\n    }\n  }\n\n  // TODO: type coercion\n  if ($allOf !== undefined) {\n    const keywordLocation = `${schemaLocation}/allOf`\n    const errorsLength = errors.length\n    let allValid = true\n    for (const [i, subSchema] of $allOf.entries()) {\n      const subEvaluated: Evaluated = Object.create(evaluated)\n      const result = validate(instance, subSchema, {\n        ...opts,\n        lookup,\n        recursiveAnchor: $recursiveAnchor === true ? recursiveAnchor : null,\n        instanceLocation,\n        schemaLocation: `${keywordLocation}/${i}`,\n        evaluated: subEvaluated\n      })\n      errors.push(...result.errors)\n      allValid = allValid && result.valid\n      if (result.valid) {\n        subEvaluateds.push(subEvaluated)\n      }\n    }\n    if (allValid) {\n      errors.length = errorsLength\n    } else {\n      errors.splice(errorsLength, 0, {\n        instanceLocation,\n        keyword: 'allOf',\n        keywordLocation,\n        error: `Instance does not match every subschema.`\n      })\n    }\n  }\n\n  // TODO: type coercion\n  if ($oneOf !== undefined) {\n    const keywordLocation = `${schemaLocation}/oneOf`\n    const errorsLength = errors.length\n    const matches = $oneOf.filter((subSchema, i) => {\n      const subEvaluated: Evaluated = Object.create(evaluated)\n      const result = validate(instance, subSchema, {\n        ...opts,\n        lookup,\n        recursiveAnchor: $recursiveAnchor === true ? recursiveAnchor : null,\n        instanceLocation,\n        schemaLocation: `${keywordLocation}/${i}`,\n        evaluated: subEvaluated\n      })\n      errors.push(...result.errors)\n      if (result.valid) {\n        subEvaluateds.push(subEvaluated)\n      }\n      return result.valid\n    }).length\n    if (matches === 1) {\n      errors.length = errorsLength\n    } else {\n      errors.splice(errorsLength, 0, {\n        instanceLocation,\n        keyword: 'oneOf',\n        keywordLocation,\n        error: `Instance does not match exactly one subschema (${matches} matches).`\n      })\n    }\n  }\n\n  if (instanceType === 'object' || instanceType === 'array') {\n    Object.assign(evaluated, ...subEvaluateds)\n  }\n\n  if ($if !== undefined) {\n    const keywordLocation = `${schemaLocation}/if`\n    const conditionResult = validate(instance, $if, {\n      ...opts,\n      lookup,\n      recursiveAnchor,\n      instanceLocation,\n      schemaLocation: keywordLocation,\n      evaluated\n    }).valid\n    if (conditionResult) {\n      if ($then !== undefined) {\n        const thenResult = validate(instance, $then, {\n          ...opts,\n          lookup,\n          recursiveAnchor,\n          instanceLocation,\n          schemaLocation: `${schemaLocation}/then`,\n          evaluated\n        })\n        if (thenResult.valid) {\n          instance = thenResult.instance\n        } else {\n          errors.push(\n            {\n              instanceLocation,\n              keyword: 'if',\n              keywordLocation,\n              error: `Instance does not match \"then\" schema.`\n            },\n            ...thenResult.errors\n          )\n        }\n      }\n    } else if ($else !== undefined) {\n      const elseResult = validate(instance, $else, {\n        ...opts,\n        lookup,\n        recursiveAnchor,\n        instanceLocation,\n        schemaLocation: `${schemaLocation}/else`,\n        evaluated\n      })\n      if (elseResult.valid) {\n        instance = elseResult.instance\n      } else {\n        errors.push(\n          {\n            instanceLocation,\n            keyword: 'if',\n            keywordLocation,\n            error: `Instance does not match \"else\" schema.`\n          },\n          ...elseResult.errors\n        )\n      }\n    }\n  }\n\n  if (instanceType === 'object') {\n    if ($required !== undefined) {\n      for (const key of $required) {\n        if (!(key in instance)) {\n          errors.push({\n            instanceLocation,\n            keyword: 'required',\n            keywordLocation: `${schemaLocation}/required`,\n            error: `Instance does not have required property \"${key}\".`\n          })\n        }\n      }\n    }\n\n    const keys = Object.keys(instance)\n\n    if ($minProperties !== undefined && keys.length < $minProperties) {\n      errors.push({\n        instanceLocation,\n        keyword: 'minProperties',\n        keywordLocation: `${schemaLocation}/minProperties`,\n        error: `Instance does not have at least ${$minProperties} properties.`\n      })\n    }\n\n    if ($maxProperties !== undefined && keys.length > $maxProperties) {\n      errors.push({\n        instanceLocation,\n        keyword: 'maxProperties',\n        keywordLocation: `${schemaLocation}/maxProperties`,\n        error: `Instance does not have at least ${$maxProperties} properties.`\n      })\n    }\n\n    if ($propertyNames !== undefined) {\n      const keywordLocation = `${schemaLocation}/propertyNames`\n      for (const key in instance) {\n        const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`\n        const result = validate(key, $propertyNames, {\n          ...opts,\n          lookup,\n          recursiveAnchor,\n          instanceLocation: subInstancePointer,\n          schemaLocation: keywordLocation\n        })\n        if (!result.valid) {\n          errors.push(\n            {\n              instanceLocation,\n              keyword: 'propertyNames',\n              keywordLocation,\n              error: `Property name \"${key}\" does not match schema.`\n            },\n            ...result.errors\n          )\n        }\n      }\n    }\n\n    if ($dependentRequired !== undefined) {\n      const keywordLocation = `${schemaLocation}/dependantRequired`\n      for (const key in $dependentRequired) {\n        if (key in instance) {\n          const required = $dependentRequired[key] as string[]\n          for (const dependantKey of required) {\n            if (!(dependantKey in instance)) {\n              errors.push({\n                instanceLocation,\n                keyword: 'dependentRequired',\n                keywordLocation,\n                error: `Instance has \"${key}\" but does not have \"${dependantKey}\".`\n              })\n            }\n          }\n        }\n      }\n    }\n\n    if ($dependentSchemas !== undefined) {\n      for (const key in $dependentSchemas) {\n        const keywordLocation = `${schemaLocation}/dependentSchemas`\n        if (key in instance) {\n          const result = validate(instance, $dependentSchemas[key]!, {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation,\n            schemaLocation: `${keywordLocation}/${encodePointer(key)}`,\n            evaluated\n          })\n          if (!result.valid) {\n            errors.push(\n              {\n                instanceLocation,\n                keyword: 'dependentSchemas',\n                keywordLocation,\n                error: `Instance has \"${key}\" but does not match dependant schema.`\n              },\n              ...result.errors\n            )\n          }\n        }\n      }\n    }\n\n    if ($dependencies !== undefined) {\n      const keywordLocation = `${schemaLocation}/dependencies`\n      for (const key in $dependencies) {\n        if (key in instance) {\n          const propsOrSchema = $dependencies[key] as Schema | string[]\n          if (Array.isArray(propsOrSchema)) {\n            for (const dependantKey of propsOrSchema) {\n              if (!(dependantKey in instance)) {\n                errors.push({\n                  instanceLocation,\n                  keyword: 'dependencies',\n                  keywordLocation,\n                  error: `Instance has \"${key}\" but does not have \"${dependantKey}\".`\n                })\n              }\n            }\n          } else {\n            const result = validate(instance, propsOrSchema, {\n              ...opts,\n              lookup,\n              recursiveAnchor,\n              instanceLocation,\n              schemaLocation: `${keywordLocation}/${encodePointer(key)}`\n            })\n            if (!result.valid) {\n              errors.push(\n                {\n                  instanceLocation,\n                  keyword: 'dependencies',\n                  keywordLocation,\n                  error: `Instance has \"${key}\" but does not match dependant schema.`\n                },\n                ...result.errors\n              )\n            }\n          }\n        }\n      }\n    }\n\n    const thisEvaluated = Object.create(null)\n\n    let stop = false\n\n    if ($properties !== undefined) {\n      const keywordLocation = `${schemaLocation}/properties`\n      for (const key in $properties) {\n        if (!(key in instance)) {\n          continue\n        }\n        const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`\n        const result = validate(instance[key], $properties[key]!, {\n          ...opts,\n          lookup,\n          recursiveAnchor,\n          instanceLocation: subInstancePointer,\n          schemaLocation: `${keywordLocation}/${encodePointer(key)}`\n        })\n        if (result.valid) {\n          evaluated[key] = thisEvaluated[key] = true\n          instance[key] = result.instance\n        } else {\n          stop = shortCircuit\n          errors.push(\n            {\n              instanceLocation,\n              keyword: 'properties',\n              keywordLocation,\n              error: `Property \"${key}\" does not match schema.`\n            },\n            ...result.errors\n          )\n          if (stop) break\n        }\n      }\n    }\n\n    if (!stop && $patternProperties !== undefined) {\n      const keywordLocation = `${schemaLocation}/patternProperties`\n      for (const pattern in $patternProperties) {\n        const regex = new RegExp(pattern, 'u')\n        const subSchema = $patternProperties[pattern]\n        for (const key in instance) {\n          if (!regex.test(key)) {\n            continue\n          }\n          const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`\n          const result = validate(instance[key], subSchema!, {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation: subInstancePointer,\n            schemaLocation: `${keywordLocation}/${encodePointer(pattern)}`\n          })\n          if (result.valid) {\n            evaluated[key] = thisEvaluated[key] = true\n            instance[key] = result.instance\n          } else {\n            stop = shortCircuit\n            errors.push(\n              {\n                instanceLocation,\n                keyword: 'patternProperties',\n                keywordLocation,\n                error: `Property \"${key}\" matches pattern \"${pattern}\" but does not match associated schema.`\n              },\n              ...result.errors\n            )\n          }\n        }\n      }\n    }\n\n    if (\n      !stop &&\n      ($additionalProperties !== undefined || strictAdditionalProperties)\n    ) {\n      const keywordLocation = `${schemaLocation}/additionalProperties`\n      for (const key in instance) {\n        if (thisEvaluated[key]) {\n          continue\n        }\n        const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`\n        const result = validate(\n          instance[key],\n          $additionalProperties ?? !strictAdditionalProperties,\n          {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation: subInstancePointer,\n            schemaLocation: keywordLocation\n          }\n        )\n        if (result.valid) {\n          evaluated[key] = true\n          instance[key] = result.instance\n        } else {\n          stop = shortCircuit\n          errors.push(\n            {\n              instanceLocation,\n              keyword: 'additionalProperties',\n              keywordLocation,\n              error: `Property \"${key}\" does not match additional properties schema.`\n            },\n            ...result.errors\n          )\n        }\n      }\n    } else if (!stop && $unevaluatedProperties !== undefined) {\n      const keywordLocation = `${schemaLocation}/unevaluatedProperties`\n      for (const key in instance) {\n        if (!evaluated[key]) {\n          const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`\n          const result = validate(instance[key], $unevaluatedProperties, {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation: subInstancePointer,\n            schemaLocation: keywordLocation\n          })\n          if (result.valid) {\n            evaluated[key] = true\n            instance[key] = result.instance\n          } else {\n            errors.push(\n              {\n                instanceLocation,\n                keyword: 'unevaluatedProperties',\n                keywordLocation,\n                error: `Property \"${key}\" does not match unevaluated properties schema.`\n              },\n              ...result.errors\n            )\n          }\n        }\n      }\n    }\n  } else if (instanceType === 'array') {\n    if ($maxItems !== undefined && instance.length > $maxItems) {\n      errors.push({\n        instanceLocation,\n        keyword: 'maxItems',\n        keywordLocation: `${schemaLocation}/maxItems`,\n        error: `Array has too many items (${instance.length} > ${$maxItems}).`\n      })\n    }\n\n    if ($minItems !== undefined && instance.length < $minItems) {\n      errors.push({\n        instanceLocation,\n        keyword: 'minItems',\n        keywordLocation: `${schemaLocation}/minItems`,\n        error: `Array has too few items (${instance.length} < ${$minItems}).`\n      })\n    }\n\n    const length: number = instance.length\n    let i = 0\n    let stop = false\n\n    if ($prefixItems !== undefined) {\n      const keywordLocation = `${schemaLocation}/prefixItems`\n      const length2 = Math.min($prefixItems.length, length)\n      for (; i < length2; i++) {\n        const result = validate(instance[i], $prefixItems[i]!, {\n          ...opts,\n          lookup,\n          recursiveAnchor,\n          instanceLocation: `${instanceLocation}/${i}`,\n          schemaLocation: `${keywordLocation}/${i}`\n        })\n        evaluated[i] = true\n        if (!result.valid) {\n          stop = shortCircuit\n          errors.push(\n            {\n              instanceLocation,\n              keyword: 'prefixItems',\n              keywordLocation,\n              error: `Items did not match schema.`\n            },\n            ...result.errors\n          )\n          if (stop) break\n        }\n      }\n    }\n\n    if ($items !== undefined) {\n      const keywordLocation = `${schemaLocation}/items`\n      if (Array.isArray($items)) {\n        const length2 = Math.min($items.length, length)\n        for (; i < length2; i++) {\n          const result = validate(instance[i], $items[i]!, {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation: `${instanceLocation}/${i}`,\n            schemaLocation: `${keywordLocation}/${i}`\n          })\n          evaluated[i] = true\n          if (result.valid) {\n            instance[i] = result.instance\n          } else {\n            stop = shortCircuit\n            errors.push(\n              {\n                instanceLocation,\n                keyword: 'items',\n                keywordLocation,\n                error: `Items did not match schema.`\n              },\n              ...result.errors\n            )\n            if (stop) break\n          }\n        }\n      } else {\n        for (; i < length; i++) {\n          const result = validate(instance[i], $items, {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation: `${instanceLocation}/${i}`,\n            schemaLocation: keywordLocation\n          })\n          evaluated[i] = true\n          if (result.valid) {\n            instance[i] = result.instance\n          } else {\n            stop = shortCircuit\n            errors.push(\n              {\n                instanceLocation,\n                keyword: 'items',\n                keywordLocation,\n                error: `Items did not match schema.`\n              },\n              ...result.errors\n            )\n            if (stop) break\n          }\n        }\n      }\n\n      if (!stop && $additionalItems !== undefined) {\n        const keywordLocation = `${schemaLocation}/additionalItems`\n        for (; i < length; i++) {\n          const result = validate(instance[i], $additionalItems, {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation: `${instanceLocation}/${i}`,\n            schemaLocation: keywordLocation\n          })\n          evaluated[i] = true\n          if (result.valid) {\n            instance[i] = result.instance\n          } else if (!result.valid) {\n            stop = shortCircuit\n            errors.push(\n              {\n                instanceLocation,\n                keyword: 'additionalItems',\n                keywordLocation,\n                error: `Items did not match additional items schema.`\n              },\n              ...result.errors\n            )\n          }\n        }\n      }\n    }\n\n    if ($contains !== undefined) {\n      if (length === 0 && $minContains === undefined) {\n        errors.push({\n          instanceLocation,\n          keyword: 'contains',\n          keywordLocation: `${schemaLocation}/contains`,\n          error: `Array is empty. It must contain at least one item matching the schema.`\n        })\n      } else if ($minContains !== undefined && length < $minContains) {\n        errors.push({\n          instanceLocation,\n          keyword: 'minContains',\n          keywordLocation: `${schemaLocation}/minContains`,\n          error: `Array has less items (${length}) than minContains (${$minContains}).`\n        })\n      } else {\n        const keywordLocation = `${schemaLocation}/contains`\n        const errorsLength = errors.length\n        let contained = 0\n        for (let j = 0; j < length; j++) {\n          const result = validate(instance[j], $contains, {\n            ...opts,\n            lookup,\n            recursiveAnchor,\n            instanceLocation: `${instanceLocation}/${j}`,\n            schemaLocation: keywordLocation\n          })\n          if (result.valid) {\n            evaluated[j] = true\n            contained++\n          } else {\n            errors.push(...result.errors)\n          }\n        }\n\n        if (contained >= ($minContains || 0)) {\n          errors.length = errorsLength\n        }\n\n        if (\n          $minContains === undefined &&\n          $maxContains === undefined &&\n          contained === 0\n        ) {\n          errors.splice(errorsLength, 0, {\n            instanceLocation,\n            keyword: 'contains',\n            keywordLocation,\n            error: `Array does not contain item matching schema.`\n          })\n        } else if ($minContains !== undefined && contained < $minContains) {\n          errors.push({\n            instanceLocation,\n            keyword: 'minContains',\n            keywordLocation: `${schemaLocation}/minContains`,\n            error: `Array must contain at least ${$minContains} items matching schema. Only ${contained} items were found.`\n          })\n        } else if ($maxContains !== undefined && contained > $maxContains) {\n          errors.push({\n            instanceLocation,\n            keyword: 'maxContains',\n            keywordLocation: `${schemaLocation}/maxContains`,\n            error: `Array may contain at most ${$maxContains} items matching schema. ${contained} items were found.`\n          })\n        }\n      }\n    }\n\n    if (!stop && $unevaluatedItems !== undefined) {\n      const keywordLocation = `${schemaLocation}/unevaluatedItems`\n      for (i; i < length; i++) {\n        if (evaluated[i]) {\n          continue\n        }\n        const result = validate(instance[i], $unevaluatedItems, {\n          ...opts,\n          lookup,\n          recursiveAnchor,\n          instanceLocation: `${instanceLocation}/${i}`,\n          schemaLocation: keywordLocation\n        })\n        evaluated[i] = true\n        if (result.valid) {\n          instance[i] = result.instance\n        } else {\n          errors.push(\n            {\n              instanceLocation,\n              keyword: 'unevaluatedItems',\n              keywordLocation,\n              error: `Items did not match unevaluated items schema.`\n            },\n            ...result.errors\n          )\n        }\n      }\n    }\n\n    if ($uniqueItems) {\n      for (let j = 0; j < length; j++) {\n        const a = instance[j]\n        const ao = typeof a === 'object' && a !== null\n        for (let k = 0; k < length; k++) {\n          if (j === k) {\n            continue\n          }\n          const b = instance[k]\n          const bo = typeof b === 'object' && b !== null\n          if (a === b || (ao && bo && deepCompareStrict(a, b))) {\n            errors.push({\n              instanceLocation,\n              keyword: 'uniqueItems',\n              keywordLocation: `${schemaLocation}/uniqueItems`,\n              error: `Duplicate items at indexes ${j} and ${k}.`\n            })\n            j = Number.MAX_SAFE_INTEGER\n            k = Number.MAX_SAFE_INTEGER\n          }\n        }\n      }\n    }\n  } else if (instanceType === 'number') {\n    if (draft === '4') {\n      if (\n        $minimum !== undefined &&\n        (($exclusiveMinimum === true && instance <= $minimum) ||\n          instance < $minimum)\n      ) {\n        errors.push({\n          instanceLocation,\n          keyword: 'minimum',\n          keywordLocation: `${schemaLocation}/minimum`,\n          error: `${instance} is less than ${\n            $exclusiveMinimum ? 'or equal to ' : ''\n          } ${$minimum}.`\n        })\n      }\n      if (\n        $maximum !== undefined &&\n        (($exclusiveMaximum === true && instance >= $maximum) ||\n          instance > $maximum)\n      ) {\n        errors.push({\n          instanceLocation,\n          keyword: 'maximum',\n          keywordLocation: `${schemaLocation}/maximum`,\n          error: `${instance} is greater than ${\n            $exclusiveMaximum ? 'or equal to ' : ''\n          } ${$maximum}.`\n        })\n      }\n    } else {\n      if ($minimum !== undefined && instance < $minimum) {\n        errors.push({\n          instanceLocation,\n          keyword: 'minimum',\n          keywordLocation: `${schemaLocation}/minimum`,\n          error: `${instance} is less than ${$minimum}.`\n        })\n      }\n      if ($maximum !== undefined && instance > $maximum) {\n        errors.push({\n          instanceLocation,\n          keyword: 'maximum',\n          keywordLocation: `${schemaLocation}/maximum`,\n          error: `${instance} is greater than ${$maximum}.`\n        })\n      }\n      if ($exclusiveMinimum !== undefined && instance <= $exclusiveMinimum) {\n        errors.push({\n          instanceLocation,\n          keyword: 'exclusiveMinimum',\n          keywordLocation: `${schemaLocation}/exclusiveMinimum`,\n          error: `${instance} is less than ${$exclusiveMinimum}.`\n        })\n      }\n      if ($exclusiveMaximum !== undefined && instance >= $exclusiveMaximum) {\n        errors.push({\n          instanceLocation,\n          keyword: 'exclusiveMaximum',\n          keywordLocation: `${schemaLocation}/exclusiveMaximum`,\n          error: `${instance} is greater than or equal to ${$exclusiveMaximum}.`\n        })\n      }\n    }\n    if ($multipleOf !== undefined) {\n      const remainder = instance % $multipleOf\n      if (\n        Math.abs(0 - remainder) >= 1.192_092_9e-7 &&\n        Math.abs($multipleOf - remainder) >= 1.192_092_9e-7\n      ) {\n        errors.push({\n          instanceLocation,\n          keyword: 'multipleOf',\n          keywordLocation: `${schemaLocation}/multipleOf`,\n          error: `${instance} is not a multiple of ${$multipleOf}.`\n        })\n      }\n    }\n  } else if (instanceType === 'string') {\n    const length =\n      $minLength === undefined && $maxLength === undefined\n        ? 0\n        : ucs2length(instance)\n    if ($minLength !== undefined && length < $minLength) {\n      errors.push({\n        instanceLocation,\n        keyword: 'minLength',\n        keywordLocation: `${schemaLocation}/minLength`,\n        error: `String is too short (${length} < ${$minLength}).`\n      })\n    }\n    if ($maxLength !== undefined && length > $maxLength) {\n      errors.push({\n        instanceLocation,\n        keyword: 'maxLength',\n        keywordLocation: `${schemaLocation}/maxLength`,\n        error: `String is too long (${length} > ${$maxLength}).`\n      })\n    }\n    if ($pattern !== undefined && !new RegExp($pattern, 'u').test(instance)) {\n      errors.push({\n        instanceLocation,\n        keyword: 'pattern',\n        keywordLocation: `${schemaLocation}/pattern`,\n        error: `String does not match pattern.`\n      })\n    }\n    if (\n      $format !== undefined &&\n      format[$format] &&\n      !format[$format](instance)\n    ) {\n      errors.push({\n        instanceLocation,\n        keyword: 'format',\n        keywordLocation: `${schemaLocation}/format`,\n        error: `String does not match format \"${$format}\".`\n      })\n    }\n  }\n\n  return { valid: errors.length === 0, instance, errors }\n}\n"
  },
  {
    "path": "packages/json-schema/src/validator.ts",
    "content": "import type { Schema, SchemaDraft, ValidationResult } from './types'\nimport { dereference } from './dereference'\nimport { validate } from './validate'\n\nexport class Validator {\n  protected readonly lookup: ReturnType<typeof dereference>\n  protected readonly schema: Schema | boolean\n  protected readonly draft: SchemaDraft\n  protected readonly shortCircuit: boolean\n  protected readonly coerce: boolean\n  protected readonly strictAdditionalProperties: boolean\n\n  constructor({\n    schema,\n    draft = '2019-09',\n    shortCircuit = true,\n    coerce = false,\n    strictAdditionalProperties = false\n  }: {\n    schema: Schema | boolean\n    draft?: SchemaDraft\n    shortCircuit?: boolean\n    coerce?: boolean\n    strictAdditionalProperties?: boolean\n  }) {\n    this.schema = schema\n    this.draft = draft\n    this.shortCircuit = shortCircuit\n    this.coerce = coerce\n    this.strictAdditionalProperties = strictAdditionalProperties\n    this.lookup = dereference(schema)\n  }\n\n  public validate(instance: any): ValidationResult {\n    return validate(structuredClone(instance), this.schema, {\n      draft: this.draft,\n      lookup: this.lookup,\n      coerce: this.coerce,\n      shortCircuit: this.shortCircuit,\n      strictAdditionalProperties: this.strictAdditionalProperties\n    })\n  }\n\n  public addSchema(schema: Schema, id?: string): void {\n    if (id) {\n      schema = { ...schema, $id: id }\n    }\n    dereference(schema, this.lookup)\n  }\n}\n"
  },
  {
    "path": "packages/json-schema/test/coercion.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\n\nimport { validate } from '../src/index'\n\ndescribe('json-schema coercion', () => {\n  it('string => number coercion', () => {\n    const result = validate('7', { type: 'number' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal(7)\n  })\n\n  it('boolean => number coercion', () => {\n    const result = validate(true, { type: 'number' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal(1)\n  })\n\n  it('null => number coercion', () => {\n    const result = validate(null, { type: 'number' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal(0)\n  })\n\n  it('array => number coercion', () => {\n    const result = validate([1], { type: 'number' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal(1)\n  })\n\n  it('boolean => string coercion', () => {\n    const result = validate(true, { type: 'string' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal('true')\n  })\n\n  it('number => string coercion', () => {\n    const result = validate(72.3, { type: 'string' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal('72.3')\n  })\n\n  it('null => string coercion', () => {\n    const result = validate(null, { type: 'string' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal('')\n  })\n\n  it('array => string coercion', () => {\n    const result = validate(['nala'], { type: 'string' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal('nala')\n  })\n\n  it('string => boolean coercion', () => {\n    const result = validate('true', { type: 'boolean' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal(true)\n  })\n\n  it('string => null coercion', () => {\n    const result = validate('', { type: 'null' }, { coerce: true })\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.equal(null)\n  })\n\n  it('object property coercion', () => {\n    const result = validate(\n      {\n        name: null,\n        cool: 'true',\n        cool2: 0,\n        number: '5.12',\n        integer: '5.12'\n      },\n      {\n        type: 'object',\n        properties: {\n          name: { type: 'string' },\n          cool: { type: 'boolean' },\n          cool2: { type: 'boolean' },\n          number: { type: 'number' },\n          integer: { type: 'integer' }\n        }\n      },\n      { coerce: true }\n    )\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.deep.equal({\n      name: '',\n      cool: true,\n      cool2: false,\n      number: 5.12,\n      integer: 5\n    })\n  })\n\n  it('strictAdditionalProperties false', () => {\n    const result = validate(\n      {\n        name: 'nala',\n        extra: true\n      },\n      {\n        type: 'object',\n        properties: {\n          name: { type: 'string' }\n        }\n      }\n    )\n\n    expect(result.valid).to.equal(true)\n    expect(result.instance).to.deep.equal({\n      name: 'nala',\n      extra: true\n    })\n  })\n\n  it('strictAdditionalProperties true', () => {\n    const result = validate(\n      {\n        name: 'nala',\n        extra: true\n      },\n      {\n        type: 'object',\n        properties: {\n          name: { type: 'string' }\n        }\n      },\n      { strictAdditionalProperties: true }\n    )\n\n    expect(result.valid).to.equal(false)\n  })\n})\n"
  },
  {
    "path": "packages/json-schema/test/index.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\n\nimport { dereference, validate, type ValidationResult } from '../src/index.js'\nimport { remotes, suites } from './json-schema-test-suite.js'\nimport { loadMeta } from './meta-schema.js'\nimport { unsupportedTests } from './unsupported.js'\n\nconst remotesLookup = Object.create(null)\nfor (const { name, schema } of remotes) {\n  dereference(schema, remotesLookup, new URL(name))\n}\nObject.freeze(remotesLookup)\n;(globalThis as any).location = {\n  origin: 'https://example.com',\n  host: 'example.com',\n  hostname: 'example.com',\n  pathname: '/',\n  search: '',\n  hash: ''\n}\n\ndescribe('json-schema', () => {\n  const failures: Record<string, Record<string, Record<string, true>>> = {}\n  for (const { draft, name, tests: tests0 } of suites) {\n    if (name.endsWith('/unknownKeyword')) {\n      continue\n    }\n\n    describe(name, () => {\n      for (const { schema, description: description1, tests } of tests0) {\n        const schemaLookup = dereference(schema)\n\n        const supportedTests = tests.filter((test) => {\n          return !unsupportedTests[name]?.[description1]?.[test.description]\n        })\n        if (!supportedTests.length) {\n          continue\n        }\n\n        describe(description1, () => {\n          for (const {\n            data,\n            valid,\n            description: description2,\n            debug\n          } of tests) {\n            if (unsupportedTests[name]?.[description1]?.[description2]) {\n              continue\n            }\n            ;(debug ? it.only : it)(description2, async () => {\n              if (debug) {\n                // eslint-disable-next-line no-debugger\n                debugger\n              }\n              const metaLookup = await loadMeta()\n              const lookup = {\n                ...metaLookup,\n                ...remotesLookup,\n                ...schemaLookup\n              }\n              let result: ValidationResult | undefined\n              try {\n                result = validate(data, schema, { draft, lookup })\n              } catch {}\n              if (result?.valid !== valid) {\n                failures[name] = failures[name] ?? {}\n                failures[name][description1] =\n                  failures[name][description1] ?? {}\n                failures[name][description1][description2] = true\n              }\n              expect(result?.valid).to.equal(valid, description2)\n            })\n          }\n        })\n      }\n    })\n  }\n\n  // after(() => console.log(JSON.stringify(failures, null, 2)));\n})\n"
  },
  {
    "path": "packages/json-schema/test/json-schema-test-suite.ts",
    "content": "// @ts-nocheck\n\n// @ts-ignore\nimport remote_baseUriChange_folderInteger from 'json-schema-test-suite/remotes/baseUriChange/folderInteger.json'\n// @ts-ignore\nimport remote_baseUriChangeFolder_folderInteger from 'json-schema-test-suite/remotes/baseUriChangeFolder/folderInteger.json'\n// @ts-ignore\nimport remote_baseUriChangeFolderInSubschema_folderInteger from 'json-schema-test-suite/remotes/baseUriChangeFolderInSubschema/folderInteger.json'\n// @ts-ignore\nimport remote_integer from 'json-schema-test-suite/remotes/integer.json'\n// @ts-ignore\nimport remote_name from 'json-schema-test-suite/remotes/name.json'\n// @ts-ignore\nimport remote_name_defs from 'json-schema-test-suite/remotes/name-defs.json'\n// @ts-ignore\nimport remote_ref_and_definitions from 'json-schema-test-suite/remotes/ref-and-definitions.json'\n// @ts-ignore\nimport remote_ref_and_defs from 'json-schema-test-suite/remotes/ref-and-defs.json'\n// @ts-ignore\nimport remote_subSchemas from 'json-schema-test-suite/remotes/subSchemas.json'\n// @ts-ignore\nimport remote_subSchemas_defs from 'json-schema-test-suite/remotes/subSchemas-defs.json'\n// @ts-ignore\nimport draft4_additionalItems from 'json-schema-test-suite/tests/draft4/additionalItems.json'\n// @ts-ignore\nimport draft4_additionalProperties from 'json-schema-test-suite/tests/draft4/additionalProperties.json'\n// @ts-ignore\nimport draft4_allOf from 'json-schema-test-suite/tests/draft4/allOf.json'\n// @ts-ignore\nimport draft4_anyOf from 'json-schema-test-suite/tests/draft4/anyOf.json'\n// @ts-ignore\nimport draft4_default from 'json-schema-test-suite/tests/draft4/default.json'\n// @ts-ignore\nimport draft4_definitions from 'json-schema-test-suite/tests/draft4/definitions.json'\n// @ts-ignore\nimport draft4_dependencies from 'json-schema-test-suite/tests/draft4/dependencies.json'\n// @ts-ignore\nimport draft4_enum from 'json-schema-test-suite/tests/draft4/enum.json'\n// @ts-ignore\nimport draft4_format from 'json-schema-test-suite/tests/draft4/format.json'\n// @ts-ignore\nimport draft4_id from 'json-schema-test-suite/tests/draft4/id.json'\n// @ts-ignore\nimport draft4_infinite_loop_detection from 'json-schema-test-suite/tests/draft4/infinite-loop-detection.json'\n// @ts-ignore\nimport draft4_items from 'json-schema-test-suite/tests/draft4/items.json'\n// @ts-ignore\nimport draft4_maximum from 'json-schema-test-suite/tests/draft4/maximum.json'\n// @ts-ignore\nimport draft4_maxItems from 'json-schema-test-suite/tests/draft4/maxItems.json'\n// @ts-ignore\nimport draft4_maxLength from 'json-schema-test-suite/tests/draft4/maxLength.json'\n// @ts-ignore\nimport draft4_maxProperties from 'json-schema-test-suite/tests/draft4/maxProperties.json'\n// @ts-ignore\nimport draft4_minimum from 'json-schema-test-suite/tests/draft4/minimum.json'\n// @ts-ignore\nimport draft4_minItems from 'json-schema-test-suite/tests/draft4/minItems.json'\n// @ts-ignore\nimport draft4_minLength from 'json-schema-test-suite/tests/draft4/minLength.json'\n// @ts-ignore\nimport draft4_minProperties from 'json-schema-test-suite/tests/draft4/minProperties.json'\n// @ts-ignore\nimport draft4_multipleOf from 'json-schema-test-suite/tests/draft4/multipleOf.json'\n// @ts-ignore\nimport draft4_not from 'json-schema-test-suite/tests/draft4/not.json'\n// @ts-ignore\nimport draft4_oneOf from 'json-schema-test-suite/tests/draft4/oneOf.json'\n// @ts-ignore\nimport draft4_optional_bignum from 'json-schema-test-suite/tests/draft4/optional/bignum.json'\n// @ts-ignore\nimport draft4_optional_ecmascript_regex from 'json-schema-test-suite/tests/draft4/optional/ecmascript-regex.json'\n// @ts-ignore\nimport draft4_optional_float_overflow from 'json-schema-test-suite/tests/draft4/optional/float-overflow.json'\n// @ts-ignore\nimport draft4_optional_format_date_time from 'json-schema-test-suite/tests/draft4/optional/format/date-time.json'\n// @ts-ignore\nimport draft4_optional_format_email from 'json-schema-test-suite/tests/draft4/optional/format/email.json'\n// @ts-ignore\nimport draft4_optional_format_hostname from 'json-schema-test-suite/tests/draft4/optional/format/hostname.json'\n// @ts-ignore\nimport draft4_optional_format_ipv4 from 'json-schema-test-suite/tests/draft4/optional/format/ipv4.json'\n// @ts-ignore\nimport draft4_optional_format_ipv6 from 'json-schema-test-suite/tests/draft4/optional/format/ipv6.json'\n// @ts-ignore\nimport draft4_optional_format_uri from 'json-schema-test-suite/tests/draft4/optional/format/uri.json'\n// @ts-ignore\nimport draft4_optional_non_bmp_regex from 'json-schema-test-suite/tests/draft4/optional/non-bmp-regex.json'\n// @ts-ignore\nimport draft4_optional_unicode from 'json-schema-test-suite/tests/draft4/optional/unicode.json'\n// @ts-ignore\n// import draft4_optional_zeroTerminatedFloats from 'json-schema-test-suite/tests/draft4/optional/zeroTerminatedFloats.json'\n// @ts-ignore\nimport draft4_pattern from 'json-schema-test-suite/tests/draft4/pattern.json'\n// @ts-ignore\nimport draft4_patternProperties from 'json-schema-test-suite/tests/draft4/patternProperties.json'\n// @ts-ignore\nimport draft4_properties from 'json-schema-test-suite/tests/draft4/properties.json'\n// @ts-ignore\nimport draft4_ref from 'json-schema-test-suite/tests/draft4/ref.json'\n// @ts-ignore\nimport draft4_refRemote from 'json-schema-test-suite/tests/draft4/refRemote.json'\n// @ts-ignore\nimport draft4_required from 'json-schema-test-suite/tests/draft4/required.json'\n// @ts-ignore\nimport draft4_type from 'json-schema-test-suite/tests/draft4/type.json'\n// @ts-ignore\nimport draft4_uniqueItems from 'json-schema-test-suite/tests/draft4/uniqueItems.json'\n// @ts-ignore\nimport draft7_additionalItems from 'json-schema-test-suite/tests/draft7/additionalItems.json'\n// @ts-ignore\nimport draft7_additionalProperties from 'json-schema-test-suite/tests/draft7/additionalProperties.json'\n// @ts-ignore\nimport draft7_allOf from 'json-schema-test-suite/tests/draft7/allOf.json'\n// @ts-ignore\nimport draft7_anyOf from 'json-schema-test-suite/tests/draft7/anyOf.json'\n// @ts-ignore\nimport draft7_boolean_schema from 'json-schema-test-suite/tests/draft7/boolean_schema.json'\n// @ts-ignore\nimport draft7_const from 'json-schema-test-suite/tests/draft7/const.json'\n// @ts-ignore\nimport draft7_contains from 'json-schema-test-suite/tests/draft7/contains.json'\n// @ts-ignore\nimport draft7_default from 'json-schema-test-suite/tests/draft7/default.json'\n// @ts-ignore\n// import draft7_definitions from 'json-schema-test-suite/tests/draft7/definitions.json'\n// @ts-ignore\nimport draft7_dependencies from 'json-schema-test-suite/tests/draft7/dependencies.json'\n// @ts-ignore\nimport draft7_enum from 'json-schema-test-suite/tests/draft7/enum.json'\n// @ts-ignore\nimport draft7_exclusiveMaximum from 'json-schema-test-suite/tests/draft7/exclusiveMaximum.json'\n// @ts-ignore\nimport draft7_exclusiveMinimum from 'json-schema-test-suite/tests/draft7/exclusiveMinimum.json'\n// @ts-ignore\nimport draft7_format from 'json-schema-test-suite/tests/draft7/format.json'\n// @ts-ignore\nimport draft7_id from 'json-schema-test-suite/tests/draft7/id.json'\n// @ts-ignore\nimport draft7_if_then_else from 'json-schema-test-suite/tests/draft7/if-then-else.json'\n// @ts-ignore\nimport draft7_infinite_loop_detection from 'json-schema-test-suite/tests/draft7/infinite-loop-detection.json'\n// @ts-ignore\nimport draft7_items from 'json-schema-test-suite/tests/draft7/items.json'\n// @ts-ignore\nimport draft7_maximum from 'json-schema-test-suite/tests/draft7/maximum.json'\n// @ts-ignore\nimport draft7_maxItems from 'json-schema-test-suite/tests/draft7/maxItems.json'\n// @ts-ignore\nimport draft7_maxLength from 'json-schema-test-suite/tests/draft7/maxLength.json'\n// @ts-ignore\nimport draft7_maxProperties from 'json-schema-test-suite/tests/draft7/maxProperties.json'\n// @ts-ignore\nimport draft7_minimum from 'json-schema-test-suite/tests/draft7/minimum.json'\n// @ts-ignore\nimport draft7_minItems from 'json-schema-test-suite/tests/draft7/minItems.json'\n// @ts-ignore\nimport draft7_minLength from 'json-schema-test-suite/tests/draft7/minLength.json'\n// @ts-ignore\nimport draft7_minProperties from 'json-schema-test-suite/tests/draft7/minProperties.json'\n// @ts-ignore\nimport draft7_multipleOf from 'json-schema-test-suite/tests/draft7/multipleOf.json'\n// @ts-ignore\nimport draft7_not from 'json-schema-test-suite/tests/draft7/not.json'\n// @ts-ignore\nimport draft7_oneOf from 'json-schema-test-suite/tests/draft7/oneOf.json'\n// @ts-ignore\nimport draft7_optional_bignum from 'json-schema-test-suite/tests/draft7/optional/bignum.json'\n// @ts-ignore\nimport draft7_optional_content from 'json-schema-test-suite/tests/draft7/optional/content.json'\n// @ts-ignore\nimport draft7_optional_ecmascript_regex from 'json-schema-test-suite/tests/draft7/optional/ecmascript-regex.json'\n// @ts-ignore\nimport draft7_optional_float_overflow from 'json-schema-test-suite/tests/draft7/optional/float-overflow.json'\n// @ts-ignore\nimport draft7_optional_format_date from 'json-schema-test-suite/tests/draft7/optional/format/date.json'\n// @ts-ignore\nimport draft7_optional_format_date_time from 'json-schema-test-suite/tests/draft7/optional/format/date-time.json'\n// @ts-ignore\nimport draft7_optional_format_email from 'json-schema-test-suite/tests/draft7/optional/format/email.json'\n// @ts-ignore\nimport draft7_optional_format_hostname from 'json-schema-test-suite/tests/draft7/optional/format/hostname.json'\n// @ts-ignore\nimport draft7_optional_format_idn_email from 'json-schema-test-suite/tests/draft7/optional/format/idn-email.json'\n// @ts-ignore\nimport draft7_optional_format_idn_hostname from 'json-schema-test-suite/tests/draft7/optional/format/idn-hostname.json'\n// @ts-ignore\nimport draft7_optional_format_ipv4 from 'json-schema-test-suite/tests/draft7/optional/format/ipv4.json'\n// @ts-ignore\nimport draft7_optional_format_ipv6 from 'json-schema-test-suite/tests/draft7/optional/format/ipv6.json'\n// @ts-ignore\nimport draft7_optional_format_iri from 'json-schema-test-suite/tests/draft7/optional/format/iri.json'\n// @ts-ignore\nimport draft7_optional_format_iri_reference from 'json-schema-test-suite/tests/draft7/optional/format/iri-reference.json'\n// @ts-ignore\nimport draft7_optional_format_json_pointer from 'json-schema-test-suite/tests/draft7/optional/format/json-pointer.json'\n// @ts-ignore\nimport draft7_optional_format_regex from 'json-schema-test-suite/tests/draft7/optional/format/regex.json'\n// @ts-ignore\nimport draft7_optional_format_relative_json_pointer from 'json-schema-test-suite/tests/draft7/optional/format/relative-json-pointer.json'\n// @ts-ignore\nimport draft7_optional_format_time from 'json-schema-test-suite/tests/draft7/optional/format/time.json'\n// @ts-ignore\nimport draft7_optional_format_uri from 'json-schema-test-suite/tests/draft7/optional/format/uri.json'\n// @ts-ignore\nimport draft7_optional_format_uri_reference from 'json-schema-test-suite/tests/draft7/optional/format/uri-reference.json'\n// @ts-ignore\nimport draft7_optional_format_uri_template from 'json-schema-test-suite/tests/draft7/optional/format/uri-template.json'\n// @ts-ignore\nimport draft7_optional_non_bmp_regex from 'json-schema-test-suite/tests/draft7/optional/non-bmp-regex.json'\n// @ts-ignore\nimport draft7_optional_unicode from 'json-schema-test-suite/tests/draft7/optional/unicode.json'\n// @ts-ignore\nimport draft7_pattern from 'json-schema-test-suite/tests/draft7/pattern.json'\n// @ts-ignore\nimport draft7_patternProperties from 'json-schema-test-suite/tests/draft7/patternProperties.json'\n// @ts-ignore\nimport draft7_properties from 'json-schema-test-suite/tests/draft7/properties.json'\n// @ts-ignore\nimport draft7_propertyNames from 'json-schema-test-suite/tests/draft7/propertyNames.json'\n// @ts-ignore\nimport draft7_ref from 'json-schema-test-suite/tests/draft7/ref.json'\n// @ts-ignore\nimport draft7_refRemote from 'json-schema-test-suite/tests/draft7/refRemote.json'\n// @ts-ignore\nimport draft7_required from 'json-schema-test-suite/tests/draft7/required.json'\n// @ts-ignore\nimport draft7_type from 'json-schema-test-suite/tests/draft7/type.json'\n// @ts-ignore\nimport draft7_uniqueItems from 'json-schema-test-suite/tests/draft7/uniqueItems.json'\n// @ts-ignore\nimport draft7_unknownKeyword from 'json-schema-test-suite/tests/draft7/unknownKeyword.json'\n// @ts-ignore\n// import draft2019_09_additionalItems from 'json-schema-test-suite/tests/draft2019-09/additionalItems.json'\n// @ts-ignore\nimport draft2019_09_additionalProperties from 'json-schema-test-suite/tests/draft2019-09/additionalProperties.json'\n// @ts-ignore\nimport draft2019_09_allOf from 'json-schema-test-suite/tests/draft2019-09/allOf.json'\n// @ts-ignore\nimport draft2019_09_anchor from 'json-schema-test-suite/tests/draft2019-09/anchor.json'\n// @ts-ignore\nimport draft2019_09_anyOf from 'json-schema-test-suite/tests/draft2019-09/anyOf.json'\n// @ts-ignore\nimport draft2019_09_boolean_schema from 'json-schema-test-suite/tests/draft2019-09/boolean_schema.json'\n// @ts-ignore\nimport draft2019_09_const from 'json-schema-test-suite/tests/draft2019-09/const.json'\n// @ts-ignore\nimport draft2019_09_contains from 'json-schema-test-suite/tests/draft2019-09/contains.json'\n// @ts-ignore\nimport draft2019_09_content from 'json-schema-test-suite/tests/draft2019-09/content.json'\n// @ts-ignore\nimport draft2019_09_default from 'json-schema-test-suite/tests/draft2019-09/default.json'\n// @ts-ignore\nimport draft2019_09_defs from 'json-schema-test-suite/tests/draft2019-09/defs.json'\n// @ts-ignore\nimport draft2019_09_dependentRequired from 'json-schema-test-suite/tests/draft2019-09/dependentRequired.json'\n// @ts-ignore\nimport draft2019_09_dependentSchemas from 'json-schema-test-suite/tests/draft2019-09/dependentSchemas.json'\n// @ts-ignore\nimport draft2019_09_enum from 'json-schema-test-suite/tests/draft2019-09/enum.json'\n// @ts-ignore\nimport draft2019_09_exclusiveMaximum from 'json-schema-test-suite/tests/draft2019-09/exclusiveMaximum.json'\n// @ts-ignore\nimport draft2019_09_exclusiveMinimum from 'json-schema-test-suite/tests/draft2019-09/exclusiveMinimum.json'\n// @ts-ignore\nimport draft2019_09_format from 'json-schema-test-suite/tests/draft2019-09/format.json'\n// @ts-ignore\n// import draft2019_09_id from 'json-schema-test-suite/tests/draft2019-09/id.json'\n// @ts-ignore\nimport draft2019_09_if_then_else from 'json-schema-test-suite/tests/draft2019-09/if-then-else.json'\n// @ts-ignore\nimport draft2019_09_infinite_loop_detection from 'json-schema-test-suite/tests/draft2019-09/infinite-loop-detection.json'\n// @ts-ignore\nimport draft2019_09_items from 'json-schema-test-suite/tests/draft2019-09/items.json'\n// @ts-ignore\nimport draft2019_09_maxContains from 'json-schema-test-suite/tests/draft2019-09/maxContains.json'\n// @ts-ignore\nimport draft2019_09_maximum from 'json-schema-test-suite/tests/draft2019-09/maximum.json'\n// @ts-ignore\nimport draft2019_09_maxItems from 'json-schema-test-suite/tests/draft2019-09/maxItems.json'\n// @ts-ignore\nimport draft2019_09_maxLength from 'json-schema-test-suite/tests/draft2019-09/maxLength.json'\n// @ts-ignore\nimport draft2019_09_maxProperties from 'json-schema-test-suite/tests/draft2019-09/maxProperties.json'\n// @ts-ignore\nimport draft2019_09_minContains from 'json-schema-test-suite/tests/draft2019-09/minContains.json'\n// @ts-ignore\nimport draft2019_09_minimum from 'json-schema-test-suite/tests/draft2019-09/minimum.json'\n// @ts-ignore\nimport draft2019_09_minItems from 'json-schema-test-suite/tests/draft2019-09/minItems.json'\n// @ts-ignore\nimport draft2019_09_minLength from 'json-schema-test-suite/tests/draft2019-09/minLength.json'\n// @ts-ignore\nimport draft2019_09_minProperties from 'json-schema-test-suite/tests/draft2019-09/minProperties.json'\n// @ts-ignore\nimport draft2019_09_multipleOf from 'json-schema-test-suite/tests/draft2019-09/multipleOf.json'\n// @ts-ignore\nimport draft2019_09_not from 'json-schema-test-suite/tests/draft2019-09/not.json'\n// @ts-ignore\nimport draft2019_09_oneOf from 'json-schema-test-suite/tests/draft2019-09/oneOf.json'\n// @ts-ignore\nimport draft2019_09_optional_bignum from 'json-schema-test-suite/tests/draft2019-09/optional/bignum.json'\n// @ts-ignore\nimport draft2019_09_optional_ecmascript_regex from 'json-schema-test-suite/tests/draft2019-09/optional/ecmascript-regex.json'\n// @ts-ignore\nimport draft2019_09_optional_float_overflow from 'json-schema-test-suite/tests/draft2019-09/optional/float-overflow.json'\n// @ts-ignore\nimport draft2019_09_optional_format_date from 'json-schema-test-suite/tests/draft2019-09/optional/format/date.json'\n// @ts-ignore\nimport draft2019_09_optional_format_date_time from 'json-schema-test-suite/tests/draft2019-09/optional/format/date-time.json'\n// @ts-ignore\nimport draft2019_09_optional_format_duration from 'json-schema-test-suite/tests/draft2019-09/optional/format/duration.json'\n// @ts-ignore\nimport draft2019_09_optional_format_email from 'json-schema-test-suite/tests/draft2019-09/optional/format/email.json'\n// @ts-ignore\nimport draft2019_09_optional_format_hostname from 'json-schema-test-suite/tests/draft2019-09/optional/format/hostname.json'\n// @ts-ignore\nimport draft2019_09_optional_format_idn_email from 'json-schema-test-suite/tests/draft2019-09/optional/format/idn-email.json'\n// @ts-ignore\nimport draft2019_09_optional_format_idn_hostname from 'json-schema-test-suite/tests/draft2019-09/optional/format/idn-hostname.json'\n// @ts-ignore\nimport draft2019_09_optional_format_ipv4 from 'json-schema-test-suite/tests/draft2019-09/optional/format/ipv4.json'\n// @ts-ignore\nimport draft2019_09_optional_format_ipv6 from 'json-schema-test-suite/tests/draft2019-09/optional/format/ipv6.json'\n// @ts-ignore\nimport draft2019_09_optional_format_iri from 'json-schema-test-suite/tests/draft2019-09/optional/format/iri.json'\n// @ts-ignore\nimport draft2019_09_optional_format_iri_reference from 'json-schema-test-suite/tests/draft2019-09/optional/format/iri-reference.json'\n// @ts-ignore\nimport draft2019_09_optional_format_json_pointer from 'json-schema-test-suite/tests/draft2019-09/optional/format/json-pointer.json'\n// @ts-ignore\nimport draft2019_09_optional_format_regex from 'json-schema-test-suite/tests/draft2019-09/optional/format/regex.json'\n// @ts-ignore\nimport draft2019_09_optional_format_relative_json_pointer from 'json-schema-test-suite/tests/draft2019-09/optional/format/relative-json-pointer.json'\n// @ts-ignore\nimport draft2019_09_optional_format_time from 'json-schema-test-suite/tests/draft2019-09/optional/format/time.json'\n// @ts-ignore\nimport draft2019_09_optional_format_uri from 'json-schema-test-suite/tests/draft2019-09/optional/format/uri.json'\n// @ts-ignore\nimport draft2019_09_optional_format_uri_reference from 'json-schema-test-suite/tests/draft2019-09/optional/format/uri-reference.json'\n// @ts-ignore\nimport draft2019_09_optional_format_uri_template from 'json-schema-test-suite/tests/draft2019-09/optional/format/uri-template.json'\n// @ts-ignore\nimport draft2019_09_optional_format_uuid from 'json-schema-test-suite/tests/draft2019-09/optional/format/uuid.json'\n// @ts-ignore\nimport draft2019_09_optional_non_bmp_regex from 'json-schema-test-suite/tests/draft2019-09/optional/non-bmp-regex.json'\n// @ts-ignore\nimport draft2019_09_optional_refOfUnknownKeyword from 'json-schema-test-suite/tests/draft2019-09/optional/refOfUnknownKeyword.json'\n// @ts-ignore\nimport draft2019_09_optional_unicode from 'json-schema-test-suite/tests/draft2019-09/optional/unicode.json'\n// @ts-ignore\nimport draft2019_09_pattern from 'json-schema-test-suite/tests/draft2019-09/pattern.json'\n// @ts-ignore\nimport draft2019_09_patternProperties from 'json-schema-test-suite/tests/draft2019-09/patternProperties.json'\n// @ts-ignore\nimport draft2019_09_properties from 'json-schema-test-suite/tests/draft2019-09/properties.json'\n// @ts-ignore\nimport draft2019_09_propertyNames from 'json-schema-test-suite/tests/draft2019-09/propertyNames.json'\n// @ts-ignore\nimport draft2019_09_recursiveRef from 'json-schema-test-suite/tests/draft2019-09/recursiveRef.json'\n// @ts-ignore\nimport draft2019_09_ref from 'json-schema-test-suite/tests/draft2019-09/ref.json'\n// @ts-ignore\nimport draft2019_09_refRemote from 'json-schema-test-suite/tests/draft2019-09/refRemote.json'\n// @ts-ignore\nimport draft2019_09_required from 'json-schema-test-suite/tests/draft2019-09/required.json'\n// @ts-ignore\nimport draft2019_09_type from 'json-schema-test-suite/tests/draft2019-09/type.json'\n// @ts-ignore\nimport draft2019_09_unevaluatedItems from 'json-schema-test-suite/tests/draft2019-09/unevaluatedItems.json'\n// @ts-ignore\nimport draft2019_09_unevaluatedProperties from 'json-schema-test-suite/tests/draft2019-09/unevaluatedProperties.json'\n// @ts-ignore\nimport draft2019_09_uniqueItems from 'json-schema-test-suite/tests/draft2019-09/uniqueItems.json'\n// @ts-ignore\nimport draft2019_09_unknownKeyword from 'json-schema-test-suite/tests/draft2019-09/unknownKeyword.json'\n// @ts-ignore\nimport draft2020_12_additionalProperties from 'json-schema-test-suite/tests/draft2020-12/additionalProperties.json'\n// @ts-ignore\nimport draft2020_12_allOf from 'json-schema-test-suite/tests/draft2020-12/allOf.json'\n// @ts-ignore\nimport draft2020_12_anchor from 'json-schema-test-suite/tests/draft2020-12/anchor.json'\n// @ts-ignore\nimport draft2020_12_anyOf from 'json-schema-test-suite/tests/draft2020-12/anyOf.json'\n// @ts-ignore\nimport draft2020_12_boolean_schema from 'json-schema-test-suite/tests/draft2020-12/boolean_schema.json'\n// @ts-ignore\nimport draft2020_12_const from 'json-schema-test-suite/tests/draft2020-12/const.json'\n// @ts-ignore\nimport draft2020_12_contains from 'json-schema-test-suite/tests/draft2020-12/contains.json'\n// @ts-ignore\nimport draft2020_12_content from 'json-schema-test-suite/tests/draft2020-12/content.json'\n// @ts-ignore\nimport draft2020_12_default from 'json-schema-test-suite/tests/draft2020-12/default.json'\n// @ts-ignore\nimport draft2020_12_defs from 'json-schema-test-suite/tests/draft2020-12/defs.json'\n// @ts-ignore\nimport draft2020_12_dependentRequired from 'json-schema-test-suite/tests/draft2020-12/dependentRequired.json'\n// @ts-ignore\nimport draft2020_12_dependentSchemas from 'json-schema-test-suite/tests/draft2020-12/dependentSchemas.json'\n// @ts-ignore\nimport draft2020_12_dynamicRef from 'json-schema-test-suite/tests/draft2020-12/dynamicRef.json'\n// @ts-ignore\nimport draft2020_12_enum from 'json-schema-test-suite/tests/draft2020-12/enum.json'\n// @ts-ignore\nimport draft2020_12_exclusiveMaximum from 'json-schema-test-suite/tests/draft2020-12/exclusiveMaximum.json'\n// @ts-ignore\nimport draft2020_12_exclusiveMinimum from 'json-schema-test-suite/tests/draft2020-12/exclusiveMinimum.json'\n// @ts-ignore\nimport draft2020_12_format from 'json-schema-test-suite/tests/draft2020-12/format.json'\n// @ts-ignore\nimport draft2020_12_id from 'json-schema-test-suite/tests/draft2020-12/id.json'\n// @ts-ignore\nimport draft2020_12_if_then_else from 'json-schema-test-suite/tests/draft2020-12/if-then-else.json'\n// @ts-ignore\nimport draft2020_12_infinite_loop_detection from 'json-schema-test-suite/tests/draft2020-12/infinite-loop-detection.json'\n// @ts-ignore\nimport draft2020_12_items from 'json-schema-test-suite/tests/draft2020-12/items.json'\n// @ts-ignore\nimport draft2020_12_maxContains from 'json-schema-test-suite/tests/draft2020-12/maxContains.json'\n// @ts-ignore\nimport draft2020_12_maximum from 'json-schema-test-suite/tests/draft2020-12/maximum.json'\n// @ts-ignore\nimport draft2020_12_maxItems from 'json-schema-test-suite/tests/draft2020-12/maxItems.json'\n// @ts-ignore\nimport draft2020_12_maxLength from 'json-schema-test-suite/tests/draft2020-12/maxLength.json'\n// @ts-ignore\nimport draft2020_12_maxProperties from 'json-schema-test-suite/tests/draft2020-12/maxProperties.json'\n// @ts-ignore\nimport draft2020_12_minContains from 'json-schema-test-suite/tests/draft2020-12/minContains.json'\n// @ts-ignore\nimport draft2020_12_minimum from 'json-schema-test-suite/tests/draft2020-12/minimum.json'\n// @ts-ignore\nimport draft2020_12_minItems from 'json-schema-test-suite/tests/draft2020-12/minItems.json'\n// @ts-ignore\nimport draft2020_12_minLength from 'json-schema-test-suite/tests/draft2020-12/minLength.json'\n// @ts-ignore\nimport draft2020_12_minProperties from 'json-schema-test-suite/tests/draft2020-12/minProperties.json'\n// @ts-ignore\nimport draft2020_12_multipleOf from 'json-schema-test-suite/tests/draft2020-12/multipleOf.json'\n// @ts-ignore\nimport draft2020_12_not from 'json-schema-test-suite/tests/draft2020-12/not.json'\n// @ts-ignore\nimport draft2020_12_oneOf from 'json-schema-test-suite/tests/draft2020-12/oneOf.json'\n// @ts-ignore\nimport draft2020_12_optional_bignum from 'json-schema-test-suite/tests/draft2020-12/optional/bignum.json'\n// @ts-ignore\nimport draft2020_12_optional_ecmascript_regex from 'json-schema-test-suite/tests/draft2020-12/optional/ecmascript-regex.json'\n// @ts-ignore\nimport draft2020_12_optional_float_overflow from 'json-schema-test-suite/tests/draft2020-12/optional/float-overflow.json'\n// @ts-ignore\nimport draft2020_12_optional_format_date from 'json-schema-test-suite/tests/draft2020-12/optional/format/date.json'\n// @ts-ignore\nimport draft2020_12_optional_format_date_time from 'json-schema-test-suite/tests/draft2020-12/optional/format/date-time.json'\n// @ts-ignore\nimport draft2020_12_optional_format_duration from 'json-schema-test-suite/tests/draft2020-12/optional/format/duration.json'\n// @ts-ignore\nimport draft2020_12_optional_format_email from 'json-schema-test-suite/tests/draft2020-12/optional/format/email.json'\n// @ts-ignore\nimport draft2020_12_optional_format_hostname from 'json-schema-test-suite/tests/draft2020-12/optional/format/hostname.json'\n// @ts-ignore\nimport draft2020_12_optional_format_idn_email from 'json-schema-test-suite/tests/draft2020-12/optional/format/idn-email.json'\n// @ts-ignore\nimport draft2020_12_optional_format_idn_hostname from 'json-schema-test-suite/tests/draft2020-12/optional/format/idn-hostname.json'\n// @ts-ignore\nimport draft2020_12_optional_format_ipv4 from 'json-schema-test-suite/tests/draft2020-12/optional/format/ipv4.json'\n// @ts-ignore\nimport draft2020_12_optional_format_ipv6 from 'json-schema-test-suite/tests/draft2020-12/optional/format/ipv6.json'\n// @ts-ignore\nimport draft2020_12_optional_format_iri from 'json-schema-test-suite/tests/draft2020-12/optional/format/iri.json'\n// @ts-ignore\nimport draft2020_12_optional_format_iri_reference from 'json-schema-test-suite/tests/draft2020-12/optional/format/iri-reference.json'\n// @ts-ignore\nimport draft2020_12_optional_format_json_pointer from 'json-schema-test-suite/tests/draft2020-12/optional/format/json-pointer.json'\n// @ts-ignore\nimport draft2020_12_optional_format_regex from 'json-schema-test-suite/tests/draft2020-12/optional/format/regex.json'\n// @ts-ignore\nimport draft2020_12_optional_format_relative_json_pointer from 'json-schema-test-suite/tests/draft2020-12/optional/format/relative-json-pointer.json'\n// @ts-ignore\nimport draft2020_12_optional_format_time from 'json-schema-test-suite/tests/draft2020-12/optional/format/time.json'\n// @ts-ignore\nimport draft2020_12_optional_format_uri from 'json-schema-test-suite/tests/draft2020-12/optional/format/uri.json'\n// @ts-ignore\nimport draft2020_12_optional_format_uri_reference from 'json-schema-test-suite/tests/draft2020-12/optional/format/uri-reference.json'\n// @ts-ignore\nimport draft2020_12_optional_format_uri_template from 'json-schema-test-suite/tests/draft2020-12/optional/format/uri-template.json'\n// @ts-ignore\nimport draft2020_12_optional_format_uuid from 'json-schema-test-suite/tests/draft2020-12/optional/format/uuid.json'\n// @ts-ignore\nimport draft2020_12_optional_non_bmp_regex from 'json-schema-test-suite/tests/draft2020-12/optional/non-bmp-regex.json'\n// @ts-ignore\nimport draft2020_12_optional_refOfUnknownKeyword from 'json-schema-test-suite/tests/draft2020-12/optional/refOfUnknownKeyword.json'\n// @ts-ignore\nimport draft2020_12_optional_unicode from 'json-schema-test-suite/tests/draft2020-12/optional/unicode.json'\n// @ts-ignore\nimport draft2020_12_pattern from 'json-schema-test-suite/tests/draft2020-12/pattern.json'\n// @ts-ignore\nimport draft2020_12_patternProperties from 'json-schema-test-suite/tests/draft2020-12/patternProperties.json'\n// @ts-ignore\nimport draft2020_12_prefixItems from 'json-schema-test-suite/tests/draft2020-12/prefixItems.json'\n// @ts-ignore\nimport draft2020_12_properties from 'json-schema-test-suite/tests/draft2020-12/properties.json'\n// @ts-ignore\nimport draft2020_12_propertyNames from 'json-schema-test-suite/tests/draft2020-12/propertyNames.json'\n// @ts-ignore\nimport draft2020_12_ref from 'json-schema-test-suite/tests/draft2020-12/ref.json'\n// @ts-ignore\nimport draft2020_12_refRemote from 'json-schema-test-suite/tests/draft2020-12/refRemote.json'\n// @ts-ignore\nimport draft2020_12_required from 'json-schema-test-suite/tests/draft2020-12/required.json'\n// @ts-ignore\nimport draft2020_12_type from 'json-schema-test-suite/tests/draft2020-12/type.json'\n// @ts-ignore\nimport draft2020_12_unevaluatedItems from 'json-schema-test-suite/tests/draft2020-12/unevaluatedItems.json'\n// @ts-ignore\nimport draft2020_12_unevaluatedProperties from 'json-schema-test-suite/tests/draft2020-12/unevaluatedProperties.json'\n// @ts-ignore\nimport draft2020_12_uniqueItems from 'json-schema-test-suite/tests/draft2020-12/uniqueItems.json'\n// @ts-ignore\nimport draft2020_12_unknownKeyword from 'json-schema-test-suite/tests/draft2020-12/unknownKeyword.json'\n\nimport type { Remote, SchemaTestSuite } from './types'\n\nexport const suites: SchemaTestSuite[] = [\n  // {\n  //   draft: '2019-09',\n  //   name: 'draft2019-09/additionalItems',\n  //   tests: draft2019_09_additionalItems\n  // },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/additionalProperties',\n    tests: draft2019_09_additionalProperties\n  },\n  { draft: '2019-09', name: 'draft2019-09/allOf', tests: draft2019_09_allOf },\n  { draft: '2019-09', name: 'draft2019-09/anchor', tests: draft2019_09_anchor },\n  { draft: '2019-09', name: 'draft2019-09/anyOf', tests: draft2019_09_anyOf },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/boolean_schema',\n    tests: draft2019_09_boolean_schema\n  },\n  { draft: '2019-09', name: 'draft2019-09/const', tests: draft2019_09_const },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/contains',\n    tests: draft2019_09_contains\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/content',\n    tests: draft2019_09_content\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/default',\n    tests: draft2019_09_default\n  },\n  { draft: '2019-09', name: 'draft2019-09/defs', tests: draft2019_09_defs },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/dependentRequired',\n    tests: draft2019_09_dependentRequired\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/dependentSchemas',\n    tests: draft2019_09_dependentSchemas\n  },\n  { draft: '2019-09', name: 'draft2019-09/enum', tests: draft2019_09_enum },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/exclusiveMaximum',\n    tests: draft2019_09_exclusiveMaximum\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/exclusiveMinimum',\n    tests: draft2019_09_exclusiveMinimum\n  },\n  { draft: '2019-09', name: 'draft2019-09/format', tests: draft2019_09_format },\n  // { draft: '2019-09', name: 'draft2019-09/id', tests: draft2019_09_id },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/if-then-else',\n    tests: draft2019_09_if_then_else\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/infinite-loop-detection',\n    tests: draft2019_09_infinite_loop_detection\n  },\n  { draft: '2019-09', name: 'draft2019-09/items', tests: draft2019_09_items },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/maxContains',\n    tests: draft2019_09_maxContains\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/maxItems',\n    tests: draft2019_09_maxItems\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/maxLength',\n    tests: draft2019_09_maxLength\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/maxProperties',\n    tests: draft2019_09_maxProperties\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/maximum',\n    tests: draft2019_09_maximum\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/minContains',\n    tests: draft2019_09_minContains\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/minItems',\n    tests: draft2019_09_minItems\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/minLength',\n    tests: draft2019_09_minLength\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/minProperties',\n    tests: draft2019_09_minProperties\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/minimum',\n    tests: draft2019_09_minimum\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/multipleOf',\n    tests: draft2019_09_multipleOf\n  },\n  { draft: '2019-09', name: 'draft2019-09/not', tests: draft2019_09_not },\n  { draft: '2019-09', name: 'draft2019-09/oneOf', tests: draft2019_09_oneOf },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/bignum',\n    tests: draft2019_09_optional_bignum\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/ecmascript-regex',\n    tests: draft2019_09_optional_ecmascript_regex\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/float-overflow',\n    tests: draft2019_09_optional_float_overflow\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/date-time',\n    tests: draft2019_09_optional_format_date_time\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/date',\n    tests: draft2019_09_optional_format_date\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/duration',\n    tests: draft2019_09_optional_format_duration\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/email',\n    tests: draft2019_09_optional_format_email\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/hostname',\n    tests: draft2019_09_optional_format_hostname\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/idn-email',\n    tests: draft2019_09_optional_format_idn_email\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/idn-hostname',\n    tests: draft2019_09_optional_format_idn_hostname\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/ipv4',\n    tests: draft2019_09_optional_format_ipv4\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/ipv6',\n    tests: draft2019_09_optional_format_ipv6\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/iri-reference',\n    tests: draft2019_09_optional_format_iri_reference\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/iri',\n    tests: draft2019_09_optional_format_iri\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/json-pointer',\n    tests: draft2019_09_optional_format_json_pointer\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/regex',\n    tests: draft2019_09_optional_format_regex\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/relative-json-pointer',\n    tests: draft2019_09_optional_format_relative_json_pointer\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/time',\n    tests: draft2019_09_optional_format_time\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/uri-reference',\n    tests: draft2019_09_optional_format_uri_reference\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/uri-template',\n    tests: draft2019_09_optional_format_uri_template\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/uri',\n    tests: draft2019_09_optional_format_uri\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/format/uuid',\n    tests: draft2019_09_optional_format_uuid\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/non-bmp-regex',\n    tests: draft2019_09_optional_non_bmp_regex\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/refOfUnknownKeyword',\n    tests: draft2019_09_optional_refOfUnknownKeyword\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/optional/unicode',\n    tests: draft2019_09_optional_unicode\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/pattern',\n    tests: draft2019_09_pattern\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/patternProperties',\n    tests: draft2019_09_patternProperties\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/properties',\n    tests: draft2019_09_properties\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/propertyNames',\n    tests: draft2019_09_propertyNames\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/recursiveRef',\n    tests: draft2019_09_recursiveRef\n  },\n  { draft: '2019-09', name: 'draft2019-09/ref', tests: draft2019_09_ref },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/refRemote',\n    tests: draft2019_09_refRemote\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/required',\n    tests: draft2019_09_required\n  },\n  { draft: '2019-09', name: 'draft2019-09/type', tests: draft2019_09_type },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/unevaluatedItems',\n    tests: draft2019_09_unevaluatedItems\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/unevaluatedProperties',\n    tests: draft2019_09_unevaluatedProperties\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/uniqueItems',\n    tests: draft2019_09_uniqueItems\n  },\n  {\n    draft: '2019-09',\n    name: 'draft2019-09/unknownKeyword',\n    tests: draft2019_09_unknownKeyword\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/additionalProperties',\n    tests: draft2020_12_additionalProperties\n  },\n  { draft: '2020-12', name: 'draft2020-12/allOf', tests: draft2020_12_allOf },\n  { draft: '2020-12', name: 'draft2020-12/anchor', tests: draft2020_12_anchor },\n  { draft: '2020-12', name: 'draft2020-12/anyOf', tests: draft2020_12_anyOf },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/boolean_schema',\n    tests: draft2020_12_boolean_schema\n  },\n  { draft: '2020-12', name: 'draft2020-12/const', tests: draft2020_12_const },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/contains',\n    tests: draft2020_12_contains\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/content',\n    tests: draft2020_12_content\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/default',\n    tests: draft2020_12_default\n  },\n  { draft: '2020-12', name: 'draft2020-12/defs', tests: draft2020_12_defs },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/dependentRequired',\n    tests: draft2020_12_dependentRequired\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/dependentSchemas',\n    tests: draft2020_12_dependentSchemas\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/dynamicRef',\n    tests: draft2020_12_dynamicRef\n  },\n  { draft: '2020-12', name: 'draft2020-12/enum', tests: draft2020_12_enum },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/exclusiveMaximum',\n    tests: draft2020_12_exclusiveMaximum\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/exclusiveMinimum',\n    tests: draft2020_12_exclusiveMinimum\n  },\n  { draft: '2020-12', name: 'draft2020-12/format', tests: draft2020_12_format },\n  { draft: '2020-12', name: 'draft2020-12/id', tests: draft2020_12_id },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/if-then-else',\n    tests: draft2020_12_if_then_else\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/infinite-loop-detection',\n    tests: draft2020_12_infinite_loop_detection\n  },\n  { draft: '2020-12', name: 'draft2020-12/items', tests: draft2020_12_items },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/maxContains',\n    tests: draft2020_12_maxContains\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/maxItems',\n    tests: draft2020_12_maxItems\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/maxLength',\n    tests: draft2020_12_maxLength\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/maxProperties',\n    tests: draft2020_12_maxProperties\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/maximum',\n    tests: draft2020_12_maximum\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/minContains',\n    tests: draft2020_12_minContains\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/minItems',\n    tests: draft2020_12_minItems\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/minLength',\n    tests: draft2020_12_minLength\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/minProperties',\n    tests: draft2020_12_minProperties\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/minimum',\n    tests: draft2020_12_minimum\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/multipleOf',\n    tests: draft2020_12_multipleOf\n  },\n  { draft: '2020-12', name: 'draft2020-12/not', tests: draft2020_12_not },\n  { draft: '2020-12', name: 'draft2020-12/oneOf', tests: draft2020_12_oneOf },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/bignum',\n    tests: draft2020_12_optional_bignum\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/ecmascript-regex',\n    tests: draft2020_12_optional_ecmascript_regex\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/float-overflow',\n    tests: draft2020_12_optional_float_overflow\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/date-time',\n    tests: draft2020_12_optional_format_date_time\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/date',\n    tests: draft2020_12_optional_format_date\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/duration',\n    tests: draft2020_12_optional_format_duration\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/email',\n    tests: draft2020_12_optional_format_email\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/hostname',\n    tests: draft2020_12_optional_format_hostname\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/idn-email',\n    tests: draft2020_12_optional_format_idn_email\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/idn-hostname',\n    tests: draft2020_12_optional_format_idn_hostname\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/ipv4',\n    tests: draft2020_12_optional_format_ipv4\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/ipv6',\n    tests: draft2020_12_optional_format_ipv6\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/iri-reference',\n    tests: draft2020_12_optional_format_iri_reference\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/iri',\n    tests: draft2020_12_optional_format_iri\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/json-pointer',\n    tests: draft2020_12_optional_format_json_pointer\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/regex',\n    tests: draft2020_12_optional_format_regex\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/relative-json-pointer',\n    tests: draft2020_12_optional_format_relative_json_pointer\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/time',\n    tests: draft2020_12_optional_format_time\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/uri-reference',\n    tests: draft2020_12_optional_format_uri_reference\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/uri-template',\n    tests: draft2020_12_optional_format_uri_template\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/uri',\n    tests: draft2020_12_optional_format_uri\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/format/uuid',\n    tests: draft2020_12_optional_format_uuid\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/non-bmp-regex',\n    tests: draft2020_12_optional_non_bmp_regex\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/refOfUnknownKeyword',\n    tests: draft2020_12_optional_refOfUnknownKeyword\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/optional/unicode',\n    tests: draft2020_12_optional_unicode\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/pattern',\n    tests: draft2020_12_pattern\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/patternProperties',\n    tests: draft2020_12_patternProperties\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/prefixItems',\n    tests: draft2020_12_prefixItems\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/properties',\n    tests: draft2020_12_properties\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/propertyNames',\n    tests: draft2020_12_propertyNames\n  },\n  { draft: '2020-12', name: 'draft2020-12/ref', tests: draft2020_12_ref },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/refRemote',\n    tests: draft2020_12_refRemote\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/required',\n    tests: draft2020_12_required\n  },\n  { draft: '2020-12', name: 'draft2020-12/type', tests: draft2020_12_type },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/unevaluatedItems',\n    tests: draft2020_12_unevaluatedItems\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/unevaluatedProperties',\n    tests: draft2020_12_unevaluatedProperties\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/uniqueItems',\n    tests: draft2020_12_uniqueItems\n  },\n  {\n    draft: '2020-12',\n    name: 'draft2020-12/unknownKeyword',\n    tests: draft2020_12_unknownKeyword\n  },\n  { draft: '4', name: 'draft4/additionalItems', tests: draft4_additionalItems },\n  {\n    draft: '4',\n    name: 'draft4/additionalProperties',\n    tests: draft4_additionalProperties\n  },\n  { draft: '4', name: 'draft4/allOf', tests: draft4_allOf },\n  { draft: '4', name: 'draft4/anyOf', tests: draft4_anyOf },\n  { draft: '4', name: 'draft4/default', tests: draft4_default },\n  { draft: '4', name: 'draft4/definitions', tests: draft4_definitions },\n  { draft: '4', name: 'draft4/dependencies', tests: draft4_dependencies },\n  { draft: '4', name: 'draft4/enum', tests: draft4_enum },\n  { draft: '4', name: 'draft4/format', tests: draft4_format },\n  { draft: '4', name: 'draft4/id', tests: draft4_id },\n  {\n    draft: '4',\n    name: 'draft4/infinite-loop-detection',\n    tests: draft4_infinite_loop_detection\n  },\n  { draft: '4', name: 'draft4/items', tests: draft4_items },\n  { draft: '4', name: 'draft4/maxItems', tests: draft4_maxItems },\n  { draft: '4', name: 'draft4/maxLength', tests: draft4_maxLength },\n  { draft: '4', name: 'draft4/maxProperties', tests: draft4_maxProperties },\n  { draft: '4', name: 'draft4/maximum', tests: draft4_maximum },\n  { draft: '4', name: 'draft4/minItems', tests: draft4_minItems },\n  { draft: '4', name: 'draft4/minLength', tests: draft4_minLength },\n  { draft: '4', name: 'draft4/minProperties', tests: draft4_minProperties },\n  { draft: '4', name: 'draft4/minimum', tests: draft4_minimum },\n  { draft: '4', name: 'draft4/multipleOf', tests: draft4_multipleOf },\n  { draft: '4', name: 'draft4/not', tests: draft4_not },\n  { draft: '4', name: 'draft4/oneOf', tests: draft4_oneOf },\n  { draft: '4', name: 'draft4/optional/bignum', tests: draft4_optional_bignum },\n  {\n    draft: '4',\n    name: 'draft4/optional/ecmascript-regex',\n    tests: draft4_optional_ecmascript_regex\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/float-overflow',\n    tests: draft4_optional_float_overflow\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/format/date-time',\n    tests: draft4_optional_format_date_time\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/format/email',\n    tests: draft4_optional_format_email\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/format/hostname',\n    tests: draft4_optional_format_hostname\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/format/ipv4',\n    tests: draft4_optional_format_ipv4\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/format/ipv6',\n    tests: draft4_optional_format_ipv6\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/format/uri',\n    tests: draft4_optional_format_uri\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/non-bmp-regex',\n    tests: draft4_optional_non_bmp_regex\n  },\n  {\n    draft: '4',\n    name: 'draft4/optional/unicode',\n    tests: draft4_optional_unicode\n  },\n  // {\n  //   draft: '4',\n  //   name: 'draft4/optional/zeroTerminatedFloats',\n  //   tests: draft4_optional_zeroTerminatedFloats\n  // },\n  { draft: '4', name: 'draft4/pattern', tests: draft4_pattern },\n  {\n    draft: '4',\n    name: 'draft4/patternProperties',\n    tests: draft4_patternProperties\n  },\n  { draft: '4', name: 'draft4/properties', tests: draft4_properties },\n  { draft: '4', name: 'draft4/ref', tests: draft4_ref },\n  { draft: '4', name: 'draft4/refRemote', tests: draft4_refRemote },\n  { draft: '4', name: 'draft4/required', tests: draft4_required },\n  { draft: '4', name: 'draft4/type', tests: draft4_type },\n  { draft: '4', name: 'draft4/uniqueItems', tests: draft4_uniqueItems },\n  { draft: '7', name: 'draft7/additionalItems', tests: draft7_additionalItems },\n  {\n    draft: '7',\n    name: 'draft7/additionalProperties',\n    tests: draft7_additionalProperties\n  },\n  { draft: '7', name: 'draft7/allOf', tests: draft7_allOf },\n  { draft: '7', name: 'draft7/anyOf', tests: draft7_anyOf },\n  { draft: '7', name: 'draft7/boolean_schema', tests: draft7_boolean_schema },\n  { draft: '7', name: 'draft7/const', tests: draft7_const },\n  { draft: '7', name: 'draft7/contains', tests: draft7_contains },\n  { draft: '7', name: 'draft7/default', tests: draft7_default },\n  // { draft: '7', name: 'draft7/definitions', tests: draft7_definitions },\n  { draft: '7', name: 'draft7/dependencies', tests: draft7_dependencies },\n  { draft: '7', name: 'draft7/enum', tests: draft7_enum },\n  {\n    draft: '7',\n    name: 'draft7/exclusiveMaximum',\n    tests: draft7_exclusiveMaximum\n  },\n  {\n    draft: '7',\n    name: 'draft7/exclusiveMinimum',\n    tests: draft7_exclusiveMinimum\n  },\n  { draft: '7', name: 'draft7/format', tests: draft7_format },\n  { draft: '7', name: 'draft7/id', tests: draft7_id },\n  { draft: '7', name: 'draft7/if-then-else', tests: draft7_if_then_else },\n  {\n    draft: '7',\n    name: 'draft7/infinite-loop-detection',\n    tests: draft7_infinite_loop_detection\n  },\n  { draft: '7', name: 'draft7/items', tests: draft7_items },\n  { draft: '7', name: 'draft7/maxItems', tests: draft7_maxItems },\n  { draft: '7', name: 'draft7/maxLength', tests: draft7_maxLength },\n  { draft: '7', name: 'draft7/maxProperties', tests: draft7_maxProperties },\n  { draft: '7', name: 'draft7/maximum', tests: draft7_maximum },\n  { draft: '7', name: 'draft7/minItems', tests: draft7_minItems },\n  { draft: '7', name: 'draft7/minLength', tests: draft7_minLength },\n  { draft: '7', name: 'draft7/minProperties', tests: draft7_minProperties },\n  { draft: '7', name: 'draft7/minimum', tests: draft7_minimum },\n  { draft: '7', name: 'draft7/multipleOf', tests: draft7_multipleOf },\n  { draft: '7', name: 'draft7/not', tests: draft7_not },\n  { draft: '7', name: 'draft7/oneOf', tests: draft7_oneOf },\n  { draft: '7', name: 'draft7/optional/bignum', tests: draft7_optional_bignum },\n  {\n    draft: '7',\n    name: 'draft7/optional/content',\n    tests: draft7_optional_content\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/ecmascript-regex',\n    tests: draft7_optional_ecmascript_regex\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/float-overflow',\n    tests: draft7_optional_float_overflow\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/date-time',\n    tests: draft7_optional_format_date_time\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/date',\n    tests: draft7_optional_format_date\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/email',\n    tests: draft7_optional_format_email\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/hostname',\n    tests: draft7_optional_format_hostname\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/idn-email',\n    tests: draft7_optional_format_idn_email\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/idn-hostname',\n    tests: draft7_optional_format_idn_hostname\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/ipv4',\n    tests: draft7_optional_format_ipv4\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/ipv6',\n    tests: draft7_optional_format_ipv6\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/iri-reference',\n    tests: draft7_optional_format_iri_reference\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/iri',\n    tests: draft7_optional_format_iri\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/json-pointer',\n    tests: draft7_optional_format_json_pointer\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/regex',\n    tests: draft7_optional_format_regex\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/relative-json-pointer',\n    tests: draft7_optional_format_relative_json_pointer\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/time',\n    tests: draft7_optional_format_time\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/uri-reference',\n    tests: draft7_optional_format_uri_reference\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/uri-template',\n    tests: draft7_optional_format_uri_template\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/format/uri',\n    tests: draft7_optional_format_uri\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/non-bmp-regex',\n    tests: draft7_optional_non_bmp_regex\n  },\n  {\n    draft: '7',\n    name: 'draft7/optional/unicode',\n    tests: draft7_optional_unicode\n  },\n  { draft: '7', name: 'draft7/pattern', tests: draft7_pattern },\n  {\n    draft: '7',\n    name: 'draft7/patternProperties',\n    tests: draft7_patternProperties\n  },\n  { draft: '7', name: 'draft7/properties', tests: draft7_properties },\n  { draft: '7', name: 'draft7/propertyNames', tests: draft7_propertyNames },\n  { draft: '7', name: 'draft7/ref', tests: draft7_ref },\n  { draft: '7', name: 'draft7/refRemote', tests: draft7_refRemote },\n  { draft: '7', name: 'draft7/required', tests: draft7_required },\n  { draft: '7', name: 'draft7/type', tests: draft7_type },\n  { draft: '7', name: 'draft7/uniqueItems', tests: draft7_uniqueItems },\n  { draft: '7', name: 'draft7/unknownKeyword', tests: draft7_unknownKeyword }\n]\nexport const remotes: Remote[] = [\n  {\n    name: 'http://localhost:1234/baseUriChange/folderInteger.json',\n    schema: remote_baseUriChange_folderInteger\n  },\n  {\n    name: 'http://localhost:1234/baseUriChangeFolder/folderInteger.json',\n    schema: remote_baseUriChangeFolder_folderInteger\n  },\n  {\n    name: 'http://localhost:1234/baseUriChangeFolderInSubschema/folderInteger.json',\n    schema: remote_baseUriChangeFolderInSubschema_folderInteger\n  },\n  { name: 'http://localhost:1234/integer.json', schema: remote_integer },\n  { name: 'http://localhost:1234/name-defs.json', schema: remote_name_defs },\n  { name: 'http://localhost:1234/name.json', schema: remote_name },\n  {\n    name: 'http://localhost:1234/ref-and-definitions.json',\n    schema: remote_ref_and_definitions\n  },\n  {\n    name: 'http://localhost:1234/ref-and-defs.json',\n    schema: remote_ref_and_defs\n  },\n  {\n    name: 'http://localhost:1234/subSchemas-defs.json',\n    schema: remote_subSchemas_defs\n  },\n  { name: 'http://localhost:1234/subSchemas.json', schema: remote_subSchemas }\n]\n"
  },
  {
    "path": "packages/json-schema/test/meta-schema.ts",
    "content": "import ky from 'ky'\nimport pMap from 'p-map'\n\nimport { dereference, type Schema } from '../src/index'\n\nlet lookup: Record<string, Schema> | undefined\n\nexport async function loadMeta() {\n  if (lookup) {\n    return lookup\n  }\n\n  lookup = Object.create({})\n  const ids = [\n    'http://json-schema.org/draft-04/schema',\n    'http://json-schema.org/draft-07/schema',\n    'https://json-schema.org/draft/2019-09/schema',\n    'https://json-schema.org/draft/2019-09/meta/core',\n    'https://json-schema.org/draft/2019-09/meta/applicator',\n    'https://json-schema.org/draft/2019-09/meta/validation',\n    'https://json-schema.org/draft/2019-09/meta/meta-data',\n    'https://json-schema.org/draft/2019-09/meta/format',\n    'https://json-schema.org/draft/2019-09/meta/content',\n    'https://json-schema.org/draft/2020-12/schema',\n    'https://json-schema.org/draft/2020-12/meta/core',\n    'https://json-schema.org/draft/2020-12/meta/applicator',\n    'https://json-schema.org/draft/2020-12/meta/validation',\n    'https://json-schema.org/draft/2020-12/meta/meta-data',\n    'https://json-schema.org/draft/2020-12/meta/format-annotation',\n    'https://json-schema.org/draft/2020-12/meta/content',\n    'https://json-schema.org/draft/2020-12/meta/unevaluated'\n  ]\n\n  await pMap(\n    ids,\n    async (id) => {\n      const schema = await ky.get(id).json<Schema>()\n      dereference(schema, lookup)\n    },\n    {\n      concurrency: 4\n    }\n  )\n\n  Object.freeze(lookup)\n  return lookup\n}\n"
  },
  {
    "path": "packages/json-schema/test/types.ts",
    "content": "import type { Schema, SchemaDraft } from '../src/types'\n\nexport interface SchemaTestSuite {\n  draft: SchemaDraft\n  name: string\n  tests: SchemaTest[]\n}\n\nexport interface SchemaTest {\n  description: string\n  schema: any\n  tests: SchemaTestCase[]\n}\n\nexport interface SchemaTestCase {\n  description: string\n  data: any\n  valid: boolean\n  debug?: true\n}\n\nexport interface Remote {\n  name: string\n  schema: Schema\n}\n"
  },
  {
    "path": "packages/json-schema/test/unsupported.ts",
    "content": "export const unsupportedTests: Record<\n  string,\n  Record<string, Record<string, boolean>>\n> = {\n  'draft2019-09/format': {\n    'email format': {\n      'invalid email string is only an annotation by default': true\n    },\n    'regex format': {\n      'invalid regex string is only an annotation by default': true\n    },\n    'ipv4 format': {\n      'invalid ipv4 string is only an annotation by default': true\n    },\n    'ipv6 format': {\n      'invalid ipv6 string is only an annotation by default': true\n    },\n    'hostname format': {\n      'invalid hostname string is only an annotation by default': true\n    },\n    'date format': {\n      'invalid date string is only an annotation by default': true\n    },\n    'date-time format': {\n      'invalid date-time string is only an annotation by default': true\n    },\n    'time format': {\n      'invalid time string is only an annotation by default': true\n    },\n    'json-pointer format': {\n      'invalid json-pointer string is only an annotation by default': true\n    },\n    'relative-json-pointer format': {\n      'invalid relative-json-pointer string is only an annotation by default': true\n    },\n    'uri format': {\n      'invalid uri string is only an annotation by default': true\n    },\n    'uri-reference format': {\n      'invalid uri-reference string is only an annotation by default': true\n    },\n    'uri-template format': {\n      'invalid uri-template string is only an annotation by default': true\n    },\n    'uuid format': {\n      'invalid uuid string is only an annotation by default': true\n    },\n    'duration format': {\n      'invalid duration string is only an annotation by default': true\n    }\n  },\n  'draft4/type': {\n    'multiple types can be specified in an array': {\n      'an integer is valid': true\n    }\n  },\n  'draft7/type': {\n    'multiple types can be specified in an array': {\n      'an integer is valid': true\n    },\n    'not multiple types': {\n      mismatch: true\n    }\n  },\n  'draft2019-09/type': {\n    'multiple types can be specified in an array': {\n      'an integer is valid': true\n    }\n  },\n  'draft2020-12/type': {\n    'multiple types can be specified in an array': {\n      'an integer is valid': true\n    }\n  },\n  'draft4/not': {\n    'not multiple types': {\n      mismatch: true\n    }\n  },\n  'draft7/not': {\n    'not multiple types': {\n      mismatch: true\n    }\n  },\n  'draft2019-09/not': {\n    'not multiple types': {\n      mismatch: true\n    }\n  },\n  'draft2020-12/not': {\n    'not multiple types': {\n      mismatch: true\n    }\n  },\n  'draft2019-09/optional/format/date': {\n    'validation of date strings': {\n      'a invalid date string with 32 days in January': true,\n      'a invalid date string with 29 days in February (normal)': true,\n      'a invalid date string with 30 days in February (leap)': true,\n      'a invalid date string with 32 days in March': true,\n      'a invalid date string with 31 days in April': true,\n      'a invalid date string with 32 days in May': true,\n      'a invalid date string with 31 days in June': true,\n      'a invalid date string with 32 days in July': true,\n      'a invalid date string with 32 days in August': true,\n      'a invalid date string with 31 days in September': true,\n      'a invalid date string with 32 days in October': true,\n      'a invalid date string with 31 days in November': true,\n      'a invalid date string with 32 days in December': true,\n      'a invalid date string with invalid month': true,\n      'invalid month': true,\n      'invalid month-day combination': true,\n      '2021 is not a leap year': true\n    }\n  },\n  'draft2019-09/optional/format/idn-email': {\n    'validation of an internationalized e-mail addresses': {\n      'an invalid idn e-mail address': true,\n      'an invalid e-mail address': true\n    }\n  },\n  'draft2019-09/optional/format/idn-hostname': {\n    'validation of internationalized host names': {\n      'illegal first char U+302E Hangul single dot tone mark': true,\n      'contains illegal char U+302E Hangul single dot tone mark': true,\n      'a host name with a component too long': true,\n      'invalid label, correct Punycode': true,\n      'invalid Punycode': true,\n      'U-label contains \"--\" in the 3rd and 4th position': true,\n      'U-label starts with a dash': true,\n      'U-label ends with a dash': true,\n      'U-label starts and ends with a dash': true,\n      'Begins with a Spacing Combining Mark': true,\n      'Begins with a Nonspacing Mark': true,\n      'Begins with an Enclosing Mark': true,\n      'Exceptions that are DISALLOWED, right-to-left chars': true,\n      'Exceptions that are DISALLOWED, left-to-right chars': true,\n      \"MIDDLE DOT with no preceding 'l'\": true,\n      'MIDDLE DOT with nothing preceding': true,\n      \"MIDDLE DOT with no following 'l'\": true,\n      'MIDDLE DOT with nothing following': true,\n      'Greek KERAIA not followed by Greek': true,\n      'Greek KERAIA not followed by anything': true,\n      'Hebrew GERESH not preceded by Hebrew': true,\n      'Hebrew GERESH not preceded by anything': true,\n      'Hebrew GERSHAYIM not preceded by Hebrew': true,\n      'Hebrew GERSHAYIM not preceded by anything': true,\n      'KATAKANA MIDDLE DOT with no Hiragana, Katakana, or Han': true,\n      'KATAKANA MIDDLE DOT with no other characters': true,\n      'Arabic-Indic digits mixed with Extended Arabic-Indic digits': true,\n      'ZERO WIDTH JOINER not preceded by Virama': true,\n      'ZERO WIDTH JOINER not preceded by anything': true\n    }\n  },\n  'draft2019-09/optional/format/ipv4': {\n    'validation of IP addresses': {\n      'leading zeroes should be rejected, as they are treated as octals': true\n    }\n  },\n  'draft2019-09/optional/format/iri-reference': {\n    'validation of IRI References': {\n      'an invalid IRI Reference': true,\n      'an invalid IRI fragment': true\n    }\n  },\n  'draft2019-09/optional/format/iri': {\n    'validation of IRIs': {\n      'an invalid IRI based on IPv6': true,\n      'an invalid relative IRI Reference': true,\n      'an invalid IRI': true,\n      'an invalid IRI though valid IRI reference': true\n    }\n  },\n  'draft2019-09/optional/format/time': {\n    'validation of time strings': {\n      'valid leap second, positive time-offset': true,\n      'valid leap second, large positive time-offset': true,\n      'invalid leap second, positive time-offset (wrong hour)': true,\n      'invalid leap second, positive time-offset (wrong minute)': true,\n      'valid leap second, negative time-offset': true,\n      'valid leap second, large negative time-offset': true,\n      'invalid leap second, negative time-offset (wrong hour)': true,\n      'invalid leap second, negative time-offset (wrong minute)': true,\n      'an invalid time string with invalid hour': true,\n      'an invalid time string with invalid time numoffset hour': true,\n      'an invalid time string with invalid time numoffset minute': true\n    }\n  },\n  'draft2019-09/optional/non-bmp-regex': {\n    'Proper UTF-16 surrogate pair handling: pattern': {\n      'matches empty': true,\n      'matches two': true\n    },\n    'Proper UTF-16 surrogate pair handling: patternProperties': {\n      \"doesn't match two\": true\n    }\n  },\n  'draft2019-09/optional/unicode': {\n    'unicode semantics should be used for all pattern matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    },\n    'unicode digits are more than 0 through 9': {\n      'non-ascii digits (BENGALI DIGIT FOUR, BENGALI DIGIT TWO)': true\n    },\n    'unicode semantics should be used for all patternProperties matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    }\n  },\n  'draft2020-12/defs': {\n    'validate definition against metaschema': {\n      'invalid definition schema': true\n    }\n  },\n  'draft2020-12/dynamicRef': {\n    'A $dynamicRef to a $dynamicAnchor in the same schema resource should behave like a normal $ref to an $anchor':\n      {\n        'An array containing non-strings is invalid': true\n      },\n    'A $dynamicRef to an $anchor in the same schema resource should behave like a normal $ref to an $anchor':\n      {\n        'An array containing non-strings is invalid': true\n      },\n    'A $ref to a $dynamicAnchor in the same schema resource should behave like a normal $ref to an $anchor':\n      {\n        'An array of strings is valid': true,\n        'An array containing non-strings is invalid': true\n      },\n    'A $dynamicRef should resolve to the first $dynamicAnchor still in scope that is encountered when the schema is evaluated':\n      {\n        'An array containing non-strings is invalid': true\n      },\n    \"A $dynamicRef with intermediate scopes that don't include a matching $dynamicAnchor should not affect dynamic scope resolution\":\n      {\n        'An array containing non-strings is invalid': true\n      },\n    'A $dynamicRef that initially resolves to a schema with a matching $dynamicAnchor should resolve to the first $dynamicAnchor in the dynamic scope':\n      {\n        'The recursive part is not valid against the root': true\n      },\n    'multiple dynamic paths to the $dynamicRef keyword': {\n      'recurse to integerNode - floats are not allowed': true\n    },\n    'after leaving a dynamic scope, it should not be used by a $dynamicRef': {\n      'string matches /$defs/thingy, but the $dynamicRef does not stop here': true,\n      'first_scope is not in dynamic scope for the $dynamicRef': true\n    }\n  },\n  'draft2020-12/format': {\n    'email format': {\n      'invalid email string is only an annotation by default': true\n    },\n    'regex format': {\n      'invalid regex string is only an annotation by default': true\n    },\n    'ipv4 format': {\n      'invalid ipv4 string is only an annotation by default': true\n    },\n    'ipv6 format': {\n      'invalid ipv6 string is only an annotation by default': true\n    },\n    'hostname format': {\n      'invalid hostname string is only an annotation by default': true\n    },\n    'date format': {\n      'invalid date string is only an annotation by default': true\n    },\n    'date-time format': {\n      'invalid date-time string is only an annotation by default': true\n    },\n    'time format': {\n      'invalid time string is only an annotation by default': true\n    },\n    'json-pointer format': {\n      'invalid json-pointer string is only an annotation by default': true\n    },\n    'relative-json-pointer format': {\n      'invalid relative-json-pointer string is only an annotation by default': true\n    },\n    'uri format': {\n      'invalid uri string is only an annotation by default': true\n    },\n    'uri-reference format': {\n      'invalid uri-reference string is only an annotation by default': true\n    },\n    'uri-template format': {\n      'invalid uri-template string is only an annotation by default': true\n    },\n    'uuid format': {\n      'invalid uuid string is only an annotation by default': true\n    },\n    'duration format': {\n      'invalid duration string is only an annotation by default': true\n    }\n  },\n  'draft2020-12/id': {\n    'Invalid use of fragments in location-independent $id': {\n      'Identifier name': true,\n      'Identifier name and no ref': true,\n      'Identifier path': true,\n      'Identifier name with absolute URI': true,\n      'Identifier path with absolute URI': true,\n      'Identifier name with base URI change in subschema': true,\n      'Identifier path with base URI change in subschema': true\n    }\n  },\n  'draft2020-12/optional/format/date': {\n    'validation of date strings': {\n      'a invalid date string with 32 days in January': true,\n      'a invalid date string with 29 days in February (normal)': true,\n      'a invalid date string with 30 days in February (leap)': true,\n      'a invalid date string with 32 days in March': true,\n      'a invalid date string with 31 days in April': true,\n      'a invalid date string with 32 days in May': true,\n      'a invalid date string with 31 days in June': true,\n      'a invalid date string with 32 days in July': true,\n      'a invalid date string with 32 days in August': true,\n      'a invalid date string with 31 days in September': true,\n      'a invalid date string with 32 days in October': true,\n      'a invalid date string with 31 days in November': true,\n      'a invalid date string with 32 days in December': true,\n      'a invalid date string with invalid month': true,\n      'invalid month': true,\n      'invalid month-day combination': true,\n      '2021 is not a leap year': true\n    }\n  },\n  'draft2020-12/optional/format/idn-email': {\n    'validation of an internationalized e-mail addresses': {\n      'an invalid idn e-mail address': true,\n      'an invalid e-mail address': true\n    }\n  },\n  'draft2020-12/optional/format/idn-hostname': {\n    'validation of internationalized host names': {\n      'illegal first char U+302E Hangul single dot tone mark': true,\n      'contains illegal char U+302E Hangul single dot tone mark': true,\n      'a host name with a component too long': true,\n      'invalid label, correct Punycode': true,\n      'invalid Punycode': true,\n      'U-label contains \"--\" in the 3rd and 4th position': true,\n      'U-label starts with a dash': true,\n      'U-label ends with a dash': true,\n      'U-label starts and ends with a dash': true,\n      'Begins with a Spacing Combining Mark': true,\n      'Begins with a Nonspacing Mark': true,\n      'Begins with an Enclosing Mark': true,\n      'Exceptions that are DISALLOWED, right-to-left chars': true,\n      'Exceptions that are DISALLOWED, left-to-right chars': true,\n      \"MIDDLE DOT with no preceding 'l'\": true,\n      'MIDDLE DOT with nothing preceding': true,\n      \"MIDDLE DOT with no following 'l'\": true,\n      'MIDDLE DOT with nothing following': true,\n      'Greek KERAIA not followed by Greek': true,\n      'Greek KERAIA not followed by anything': true,\n      'Hebrew GERESH not preceded by Hebrew': true,\n      'Hebrew GERESH not preceded by anything': true,\n      'Hebrew GERSHAYIM not preceded by Hebrew': true,\n      'Hebrew GERSHAYIM not preceded by anything': true,\n      'KATAKANA MIDDLE DOT with no Hiragana, Katakana, or Han': true,\n      'KATAKANA MIDDLE DOT with no other characters': true,\n      'Arabic-Indic digits mixed with Extended Arabic-Indic digits': true,\n      'ZERO WIDTH JOINER not preceded by Virama': true,\n      'ZERO WIDTH JOINER not preceded by anything': true\n    }\n  },\n  'draft2020-12/optional/format/ipv4': {\n    'validation of IP addresses': {\n      'leading zeroes should be rejected, as they are treated as octals': true\n    }\n  },\n  'draft2020-12/optional/format/iri-reference': {\n    'validation of IRI References': {\n      'an invalid IRI Reference': true,\n      'an invalid IRI fragment': true\n    }\n  },\n  'draft2020-12/optional/format/iri': {\n    'validation of IRIs': {\n      'an invalid IRI based on IPv6': true,\n      'an invalid relative IRI Reference': true,\n      'an invalid IRI': true,\n      'an invalid IRI though valid IRI reference': true\n    }\n  },\n  'draft2020-12/optional/format/time': {\n    'validation of time strings': {\n      'valid leap second, positive time-offset': true,\n      'valid leap second, large positive time-offset': true,\n      'invalid leap second, positive time-offset (wrong hour)': true,\n      'invalid leap second, positive time-offset (wrong minute)': true,\n      'valid leap second, negative time-offset': true,\n      'valid leap second, large negative time-offset': true,\n      'invalid leap second, negative time-offset (wrong hour)': true,\n      'invalid leap second, negative time-offset (wrong minute)': true,\n      'an invalid time string with invalid hour': true,\n      'an invalid time string with invalid time numoffset hour': true,\n      'an invalid time string with invalid time numoffset minute': true\n    }\n  },\n  'draft2020-12/optional/non-bmp-regex': {\n    'Proper UTF-16 surrogate pair handling: pattern': {\n      'matches empty': true,\n      'matches two': true\n    },\n    'Proper UTF-16 surrogate pair handling: patternProperties': {\n      \"doesn't match two\": true\n    }\n  },\n  'draft2020-12/optional/unicode': {\n    'unicode semantics should be used for all pattern matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    },\n    'unicode digits are more than 0 through 9': {\n      'non-ascii digits (BENGALI DIGIT FOUR, BENGALI DIGIT TWO)': true\n    },\n    'unicode semantics should be used for all patternProperties matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    }\n  },\n  'draft2020-12/ref': {\n    'relative pointer ref to array': {\n      'mismatch array': true\n    }\n  },\n  'draft4/optional/format/ipv4': {\n    'validation of IP addresses': {\n      'leading zeroes should be rejected, as they are treated as octals': true\n    }\n  },\n  'draft4/optional/non-bmp-regex': {\n    'Proper UTF-16 surrogate pair handling: pattern': {\n      'matches empty': true,\n      'matches two': true\n    },\n    'Proper UTF-16 surrogate pair handling: patternProperties': {\n      \"doesn't match two\": true\n    }\n  },\n  'draft4/optional/unicode': {\n    'unicode semantics should be used for all pattern matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    },\n    'unicode digits are more than 0 through 9': {\n      'non-ascii digits (BENGALI DIGIT FOUR, BENGALI DIGIT TWO)': true\n    },\n    'unicode semantics should be used for all patternProperties matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    }\n  },\n  'draft4/optional/zeroTerminatedFloats': {\n    'some languages do not distinguish between different types of numeric value':\n      {\n        'a float is not an integer even without fractional part': true\n      }\n  },\n  'draft7/optional/content': {\n    'validation of string-encoded content based on media type': {\n      'an invalid JSON document': true\n    },\n    'validation of binary string-encoding': {\n      'an invalid base64 string (% is not a valid character)': true\n    },\n    'validation of binary-encoded media type documents': {\n      'a validly-encoded invalid JSON document': true,\n      'an invalid base64 string that is valid JSON': true\n    }\n  },\n  'draft7/optional/format/date': {\n    'validation of date strings': {\n      'a invalid date string with 32 days in January': true,\n      'a invalid date string with 29 days in February (normal)': true,\n      'a invalid date string with 30 days in February (leap)': true,\n      'a invalid date string with 32 days in March': true,\n      'a invalid date string with 31 days in April': true,\n      'a invalid date string with 32 days in May': true,\n      'a invalid date string with 31 days in June': true,\n      'a invalid date string with 32 days in July': true,\n      'a invalid date string with 32 days in August': true,\n      'a invalid date string with 31 days in September': true,\n      'a invalid date string with 32 days in October': true,\n      'a invalid date string with 31 days in November': true,\n      'a invalid date string with 32 days in December': true,\n      'a invalid date string with invalid month': true,\n      'invalid month': true,\n      'invalid month-day combination': true,\n      '2021 is not a leap year': true\n    }\n  },\n  'draft7/optional/format/idn-email': {\n    'validation of an internationalized e-mail addresses': {\n      'an invalid idn e-mail address': true,\n      'an invalid e-mail address': true\n    }\n  },\n  'draft7/optional/format/idn-hostname': {\n    'validation of internationalized host names': {\n      'illegal first char U+302E Hangul single dot tone mark': true,\n      'contains illegal char U+302E Hangul single dot tone mark': true,\n      'a host name with a component too long': true,\n      'invalid label, correct Punycode': true,\n      'invalid Punycode': true,\n      'U-label contains \"--\" in the 3rd and 4th position': true,\n      'U-label starts with a dash': true,\n      'U-label ends with a dash': true,\n      'U-label starts and ends with a dash': true,\n      'Begins with a Spacing Combining Mark': true,\n      'Begins with a Nonspacing Mark': true,\n      'Begins with an Enclosing Mark': true,\n      'Exceptions that are DISALLOWED, right-to-left chars': true,\n      'Exceptions that are DISALLOWED, left-to-right chars': true,\n      \"MIDDLE DOT with no preceding 'l'\": true,\n      'MIDDLE DOT with nothing preceding': true,\n      \"MIDDLE DOT with no following 'l'\": true,\n      'MIDDLE DOT with nothing following': true,\n      'Greek KERAIA not followed by Greek': true,\n      'Greek KERAIA not followed by anything': true,\n      'Hebrew GERESH not preceded by Hebrew': true,\n      'Hebrew GERESH not preceded by anything': true,\n      'Hebrew GERSHAYIM not preceded by Hebrew': true,\n      'Hebrew GERSHAYIM not preceded by anything': true,\n      'KATAKANA MIDDLE DOT with no Hiragana, Katakana, or Han': true,\n      'KATAKANA MIDDLE DOT with no other characters': true,\n      'Arabic-Indic digits mixed with Extended Arabic-Indic digits': true,\n      'ZERO WIDTH JOINER not preceded by Virama': true,\n      'ZERO WIDTH JOINER not preceded by anything': true\n    }\n  },\n  'draft7/optional/format/ipv4': {\n    'validation of IP addresses': {\n      'leading zeroes should be rejected, as they are treated as octals': true\n    }\n  },\n  'draft7/optional/format/iri-reference': {\n    'validation of IRI References': {\n      'an invalid IRI Reference': true,\n      'an invalid IRI fragment': true\n    }\n  },\n  'draft7/optional/format/iri': {\n    'validation of IRIs': {\n      'an invalid IRI based on IPv6': true,\n      'an invalid relative IRI Reference': true,\n      'an invalid IRI': true,\n      'an invalid IRI though valid IRI reference': true\n    }\n  },\n  'draft7/optional/format/time': {\n    'validation of time strings': {\n      'valid leap second, positive time-offset': true,\n      'valid leap second, large positive time-offset': true,\n      'invalid leap second, positive time-offset (wrong hour)': true,\n      'invalid leap second, positive time-offset (wrong minute)': true,\n      'valid leap second, negative time-offset': true,\n      'valid leap second, large negative time-offset': true,\n      'invalid leap second, negative time-offset (wrong hour)': true,\n      'invalid leap second, negative time-offset (wrong minute)': true,\n      'an invalid time string with invalid hour': true,\n      'an invalid time string with invalid time numoffset hour': true,\n      'an invalid time string with invalid time numoffset minute': true\n    }\n  },\n  'draft7/optional/non-bmp-regex': {\n    'Proper UTF-16 surrogate pair handling: pattern': {\n      'matches empty': true,\n      'matches two': true\n    },\n    'Proper UTF-16 surrogate pair handling: patternProperties': {\n      \"doesn't match two\": true\n    }\n  },\n  'draft7/optional/unicode': {\n    'unicode semantics should be used for all pattern matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    },\n    'unicode digits are more than 0 through 9': {\n      'non-ascii digits (BENGALI DIGIT FOUR, BENGALI DIGIT TWO)': true\n    },\n    'unicode semantics should be used for all patternProperties matching': {\n      'literal unicode character in json string': true,\n      'unicode character in hex format in string': true\n    }\n  }\n}\n"
  },
  {
    "path": "packages/json-schema/test/validator.spec.ts",
    "content": "import { describe, expect, it } from 'vitest'\n\nimport { Validator } from '../src/validator'\n\ndescribe('Validator', () => {\n  it('validates', () => {\n    const validator = new Validator({ schema: { type: 'number' } })\n\n    expect(validator.validate(7).valid).to.equal(true)\n    expect(validator.validate('hello world').valid).to.equal(false)\n  })\n\n  it('adds schema', () => {\n    const validator = new Validator({\n      schema: {\n        $id: 'https://foo.bar/baz',\n        $ref: '/beep'\n      }\n    })\n\n    validator.addSchema({ $id: 'https://foo.bar/beep', type: 'boolean' })\n\n    expect(validator.validate(true).valid).to.equal(true)\n    expect(validator.validate('hello world').valid).to.equal(false)\n  })\n\n  it('adds schema with specified id', () => {\n    const validator = new Validator({\n      schema: {\n        $id: 'https://foo.bar/baz',\n        $ref: '/beep'\n      }\n    })\n\n    validator.addSchema({ type: 'boolean' }, 'https://foo.bar/beep')\n\n    expect(validator.validate(true).valid).to.equal(true)\n    expect(validator.validate('hello world').valid).to.equal(false)\n  })\n\n  it('validate all array entries with nested errors', () => {\n    const validator = new Validator({\n      schema: {\n        type: 'array',\n        items: {\n          name: { type: 'string' },\n          email: { type: 'string' },\n          required: ['name', 'email']\n        }\n      },\n      draft: '2019-09',\n      shortCircuit: false\n    })\n\n    const res = validator.validate([\n      {\n        name: 'hello'\n        //missing email\n      },\n      {\n        //missing name\n        email: 'a@b.c'\n      }\n    ])\n    expect(res.valid).to.equal(false)\n    expect(res.errors.length).to.equal(4)\n  })\n\n  it('validate all object properties with nested errors', () => {\n    const validator = new Validator({\n      schema: {\n        type: 'object',\n        properties: {\n          name: { type: 'string' },\n          email: { type: 'string' },\n          number: { type: 'number' },\n          required: ['name', 'email', 'number']\n        }\n      },\n      draft: '2019-09',\n      shortCircuit: false\n    })\n\n    const res = validator.validate({\n      name: 'hello',\n      email: 5, //invalid type\n      number: 'Hello' //invalid type\n    })\n    expect(res.valid).to.equal(false)\n    expect(res.errors.length).to.equal(4)\n  })\n})\n"
  },
  {
    "path": "packages/json-schema/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"test\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/basic.json",
    "content": "{\n  \"openapi\": \"3.0.2\",\n  \"info\": {\n    \"title\": \"OpenAPI Basic Test Fixture\",\n    \"version\": \"0.1.0\"\n  },\n  \"paths\": {\n    \"/\": {\n      \"get\": {\n        \"summary\": \"Echo\",\n        \"operationId\": \"echo\",\n        \"parameters\": [\n          {\n            \"required\": false,\n            \"schema\": {\n              \"title\": \"name\",\n              \"type\": \"string\"\n            },\n            \"name\": \"name\",\n            \"in\": \"query\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {}\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://test-openapi-basic.now.sh\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/firecrawl.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"title\": \"Firecrawl API\",\n    \"version\": \"1.0.0\",\n    \"description\": \"API for interacting with Firecrawl services to perform web scraping and crawling tasks.\",\n    \"contact\": {\n      \"name\": \"Firecrawl Support\",\n      \"url\": \"https://firecrawl.dev/support\",\n      \"email\": \"support@firecrawl.dev\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://api.firecrawl.dev/v0\"\n    }\n  ],\n  \"paths\": {\n    \"/scrape\": {\n      \"post\": {\n        \"summary\": \"Scrape a single URL\",\n        \"operationId\": \"scrape\",\n        \"tags\": [\"Scraping\"],\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"The URL to scrape\"\n                  },\n                  \"formats\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"markdown\",\n                        \"html\",\n                        \"rawHtml\",\n                        \"links\",\n                        \"screenshot\",\n                        \"screenshot@fullPage\"\n                      ]\n                    },\n                    \"description\": \"Specific formats to return.\\n\\n - markdown: The page in Markdown format.\\n - html: The page's HTML, trimmed to include only meaningful content.\\n - rawHtml: The page's original HTML.\\n - links: The links on the page.\\n - screenshot: A screenshot of the top of the page.\\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\",\n                    \"default\": [\"markdown\"]\n                  },\n                  \"headers\": {\n                    \"type\": \"object\",\n                    \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\"\n                  },\n                  \"includeTags\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n                  },\n                  \"excludeTags\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\"\n                    },\n                    \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n                  },\n                  \"onlyMainContent\": {\n                    \"type\": \"boolean\",\n                    \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                    \"default\": true\n                  },\n                  \"timeout\": {\n                    \"type\": \"integer\",\n                    \"description\": \"Timeout in milliseconds for the request\",\n                    \"default\": 30000\n                  },\n                  \"waitFor\": {\n                    \"type\": \"integer\",\n                    \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                    \"default\": 0\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ScrapeResponse\"\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/crawl\": {\n      \"post\": {\n        \"summary\": \"Crawl multiple URLs based on options\",\n        \"operationId\": \"crawlUrls\",\n        \"tags\": [\"Crawling\"],\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"The base URL to start crawling from\"\n                  },\n                  \"crawlerOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"includes\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"URL patterns to include\"\n                      },\n                      \"excludes\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"URL patterns to exclude\"\n                      },\n                      \"generateImgAltText\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Generate alt text for images using LLMs (must have a paid plan)\",\n                        \"default\": false\n                      },\n                      \"returnOnlyUrls\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.\",\n                        \"default\": false\n                      },\n                      \"maxDepth\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.\"\n                      },\n                      \"mode\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"default\", \"fast\"],\n                        \"description\": \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\",\n                        \"default\": \"default\"\n                      },\n                      \"ignoreSitemap\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Ignore the website sitemap when crawling\",\n                        \"default\": false\n                      },\n                      \"limit\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Maximum number of pages to crawl\",\n                        \"default\": 10000\n                      },\n                      \"allowBackwardCrawling\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\",\n                        \"default\": false\n                      },\n                      \"allowExternalContentLinks\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Allows the crawler to follow links to external websites.\",\n                        \"default\": false\n                      }\n                    }\n                  },\n                  \"pageOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"headers\": {\n                        \"type\": \"object\",\n                        \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\"\n                      },\n                      \"includeHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"default\": false\n                      },\n                      \"includeRawHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"default\": false\n                      },\n                      \"onlyIncludeTags\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\"\n                      },\n                      \"onlyMainContent\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"default\": false\n                      },\n                      \"removeTags\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                          \"type\": \"string\"\n                        },\n                        \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\"\n                      },\n                      \"replaceAllPathsWithAbsolutePaths\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Replace all relative paths with absolute paths for images and links\",\n                        \"default\": false\n                      },\n                      \"screenshot\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include a screenshot of the top of the page that you are scraping.\",\n                        \"default\": false\n                      },\n                      \"fullPageScreenshot\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include a full page screenshot of the page that you are scraping.\",\n                        \"default\": false\n                      },\n                      \"waitFor\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                        \"default\": 0\n                      }\n                    }\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/CrawlResponse\"\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/search\": {\n      \"post\": {\n        \"summary\": \"Search for a keyword in Google, returns top page results with markdown content for each page\",\n        \"operationId\": \"searchGoogle\",\n        \"tags\": [\"Search\"],\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"query\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"The query to search for\"\n                  },\n                  \"pageOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"onlyMainContent\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"default\": false\n                      },\n                      \"fetchPageContent\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Fetch the content of each page. If false, defaults to a basic fast serp API.\",\n                        \"default\": true\n                      },\n                      \"includeHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"default\": false\n                      },\n                      \"includeRawHtml\": {\n                        \"type\": \"boolean\",\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"default\": false\n                      }\n                    }\n                  },\n                  \"searchOptions\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"limit\": {\n                        \"type\": \"integer\",\n                        \"description\": \"Maximum number of results. Max is 20 during beta.\"\n                      }\n                    }\n                  }\n                },\n                \"required\": [\"query\"]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\"\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/crawl/status/{jobId}\": {\n      \"get\": {\n        \"tags\": [\"Crawl\"],\n        \"summary\": \"Get the status of a crawl job\",\n        \"operationId\": \"getCrawlStatus\",\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"jobId\",\n            \"in\": \"path\",\n            \"description\": \"ID of the crawl job\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"status\": {\n                      \"type\": \"string\",\n                      \"description\": \"Status of the job (completed, active, failed, paused)\"\n                    },\n                    \"current\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Current page number\"\n                    },\n                    \"total\": {\n                      \"type\": \"integer\",\n                      \"description\": \"Total number of pages\"\n                    },\n                    \"data\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\"\n                      },\n                      \"description\": \"Data returned from the job (null when it is in progress)\"\n                    },\n                    \"partial_data\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\"\n                      },\n                      \"description\": \"Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in `data`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/crawl/cancel/{jobId}\": {\n      \"delete\": {\n        \"tags\": [\"Crawl\"],\n        \"summary\": \"Cancel a crawl job\",\n        \"operationId\": \"cancelCrawlJob\",\n        \"security\": [\n          {\n            \"bearerAuth\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"jobId\",\n            \"in\": \"path\",\n            \"description\": \"ID of the crawl job\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"status\": {\n                      \"type\": \"string\",\n                      \"description\": \"Returns cancelled.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"402\": {\n            \"description\": \"Payment required\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Payment required to access this resource.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"429\": {\n            \"description\": \"Too many requests\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\"\n                    }\n                  }\n                }\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"Server error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"error\": {\n                      \"type\": \"string\",\n                      \"example\": \"An unexpected error occurred on the server.\"\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"securitySchemes\": {\n      \"bearerAuth\": {\n        \"type\": \"http\",\n        \"scheme\": \"bearer\"\n      }\n    },\n    \"schemas\": {\n      \"ScrapeResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"success\": {\n            \"type\": \"boolean\"\n          },\n          \"warning\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"Warning message to let you know of any issues.\"\n          },\n          \"data\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"markdown\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Markdown content of the page if the `markdown` format was specified (default)\"\n              },\n              \"html\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"HTML version of the content on page if the `html` format was specified\"\n              },\n              \"rawHtml\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Raw HTML content of the page if the `rawHtml` format was specified\"\n              },\n              \"links\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"format\": \"uri\"\n                },\n                \"nullable\": true,\n                \"description\": \"Links on the page if the `links` format was specified\"\n              },\n              \"screenshot\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified\"\n              },\n              \"metadata\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"type\": \"string\"\n                  },\n                  \"language\": {\n                    \"type\": \"string\",\n                    \"nullable\": true\n                  },\n                  \"sourceURL\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\"\n                  },\n                  \"<any other metadata> \": {\n                    \"type\": \"string\"\n                  },\n                  \"statusCode\": {\n                    \"type\": \"integer\",\n                    \"description\": \"The status code of the page\"\n                  },\n                  \"error\": {\n                    \"type\": \"string\",\n                    \"nullable\": true,\n                    \"description\": \"The error message of the page\"\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"CrawlStatusResponseObj\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"markdown\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"Markdown content of the page if the `markdown` format was specified (default)\"\n          },\n          \"html\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"HTML version of the content on page if the `html` format was specified\"\n          },\n          \"rawHtml\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"Raw HTML content of the page if the `rawHtml` format was specified\"\n          },\n          \"links\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"format\": \"uri\"\n            },\n            \"nullable\": true,\n            \"description\": \"Links on the page if the `links` format was specified\"\n          },\n          \"screenshot\": {\n            \"type\": \"string\",\n            \"nullable\": true,\n            \"description\": \"URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified\"\n          },\n          \"metadata\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"title\": {\n                \"type\": \"string\"\n              },\n              \"description\": {\n                \"type\": \"string\"\n              },\n              \"language\": {\n                \"type\": \"string\",\n                \"nullable\": true\n              },\n              \"sourceURL\": {\n                \"type\": \"string\",\n                \"format\": \"uri\"\n              },\n              \"<any other metadata> \": {\n                \"type\": \"string\"\n              },\n              \"statusCode\": {\n                \"type\": \"integer\",\n                \"description\": \"The status code of the page\"\n              },\n              \"error\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"The error message of the page\"\n              }\n            }\n          }\n        }\n      },\n      \"SearchResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"success\": {\n            \"type\": \"boolean\"\n          },\n          \"data\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"markdown\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Markdown content of the page if the `markdown` format was specified (default)\"\n              },\n              \"html\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"HTML version of the content on page if the `html` format was specified\"\n              },\n              \"rawHtml\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"Raw HTML content of the page if the `rawHtml` format was specified\"\n              },\n              \"links\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"format\": \"uri\"\n                },\n                \"nullable\": true,\n                \"description\": \"Links on the page if the `links` format was specified\"\n              },\n              \"screenshot\": {\n                \"type\": \"string\",\n                \"nullable\": true,\n                \"description\": \"URL of the screenshot of the page if the `screenshot` or `screenshot@fullSize` format was specified\"\n              },\n              \"metadata\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  },\n                  \"description\": {\n                    \"type\": \"string\"\n                  },\n                  \"language\": {\n                    \"type\": \"string\",\n                    \"nullable\": true\n                  },\n                  \"sourceURL\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\"\n                  },\n                  \"<any other metadata> \": {\n                    \"type\": \"string\"\n                  },\n                  \"statusCode\": {\n                    \"type\": \"integer\",\n                    \"description\": \"The status code of the page\"\n                  },\n                  \"error\": {\n                    \"type\": \"string\",\n                    \"nullable\": true,\n                    \"description\": \"The error message of the page\"\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"CrawlResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"success\": {\n            \"type\": \"boolean\"\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"url\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        }\n      }\n    }\n  },\n  \"security\": [\n    {\n      \"bearerAuth\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/mixed.json",
    "content": "{\n  \"openapi\": \"3.0.2\",\n  \"info\": {\n    \"title\": \"OpenAPI Mixed Test Fixture\",\n    \"version\": \"0.1.0\"\n  },\n  \"paths\": {\n    \"/echo/{id}\": {\n      \"parameters\": [\n        {\n          \"required\": true,\n          \"schema\": {\n            \"title\": \"id\",\n            \"type\": \"string\"\n          },\n          \"name\": \"id\",\n          \"in\": \"path\"\n        }\n      ],\n      \"get\": {\n        \"summary\": \"Echo\",\n        \"operationId\": \"echo\",\n        \"parameters\": [\n          {\n            \"required\": false,\n            \"schema\": {\n              \"title\": \"x-custom-header\",\n              \"type\": \"string\"\n            },\n            \"name\": \"x-custom-header\",\n            \"in\": \"header\"\n          },\n          {\n            \"required\": false,\n            \"schema\": {\n              \"title\": \"name\",\n              \"type\": \"string\"\n            },\n            \"name\": \"name\",\n            \"in\": \"query\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {}\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://test-openapi-basic.now.sh\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/notion.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"title\": \"Notion API\",\n    \"version\": \"1.0.0\",\n    \"description\": \"API specification for Notion\"\n  },\n  \"servers\": [{ \"url\": \"https://api.notion.so\" }],\n  \"security\": [{ \"oauth2\": [] }],\n\n  \"paths\": {\n    \"/users/me\": {\n      \"get\": {\n        \"summary\": \"Get current user\",\n        \"operationId\": \"getSelf\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/users/{user_id}\": {\n      \"get\": {\n        \"summary\": \"Get user\",\n        \"operationId\": \"getUser\",\n        \"parameters\": [\n          {\n            \"name\": \"user_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/users\": {\n      \"get\": {\n        \"summary\": \"List users\",\n        \"operationId\": \"listUsers\",\n        \"parameters\": [\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListUsersResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pages\": {\n      \"post\": {\n        \"summary\": \"Create page\",\n        \"operationId\": \"createPage\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreatePageParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pages/{page_id}\": {\n      \"get\": {\n        \"summary\": \"Get page\",\n        \"operationId\": \"getPage\",\n        \"parameters\": [\n          {\n            \"name\": \"page_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"filter_properties\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Update page\",\n        \"operationId\": \"updatePage\",\n        \"parameters\": [\n          {\n            \"name\": \"page_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdatePageParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pages/{page_id}/properties/{property_id}\": {\n      \"get\": {\n        \"summary\": \"Get page property\",\n        \"operationId\": \"getPageProperty\",\n        \"parameters\": [\n          {\n            \"name\": \"page_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"property_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemListResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/blocks/{block_id}\": {\n      \"get\": {\n        \"summary\": \"Get block\",\n        \"operationId\": \"getBlock\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Update block\",\n        \"operationId\": \"updateBlock\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateBlockParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"summary\": \"Delete block\",\n        \"operationId\": \"deleteBlock\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/blocks/{block_id}/children\": {\n      \"get\": {\n        \"summary\": \"List block children\",\n        \"operationId\": \"listBlockChildren\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListBlockChildrenResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Append block children\",\n        \"operationId\": \"appendBlockChildren\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/AppendBlockChildrenParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/AppendBlockChildrenResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/databases/{database_id}\": {\n      \"get\": {\n        \"summary\": \"Get database\",\n        \"operationId\": \"getDatabase\",\n        \"parameters\": [\n          {\n            \"name\": \"database_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"summary\": \"Update database\",\n        \"operationId\": \"updateDatabase\",\n        \"parameters\": [\n          {\n            \"name\": \"database_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateDatabaseParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/databases/{database_id}/query\": {\n      \"post\": {\n        \"summary\": \"Query database\",\n        \"operationId\": \"queryDatabase\",\n        \"parameters\": [\n          {\n            \"name\": \"database_id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"filter_properties\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/QueryDatabaseParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/QueryDatabaseResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/databases\": {\n      \"get\": {\n        \"summary\": \"List databases\",\n        \"operationId\": \"listDatabases\",\n        \"parameters\": [\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListDatabasesResponse\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"summary\": \"Create database\",\n        \"operationId\": \"createDatabase\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateDatabaseParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/search\": {\n      \"post\": {\n        \"summary\": \"Search\",\n        \"operationId\": \"search\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/SearchParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/comments\": {\n      \"post\": {\n        \"summary\": \"Create comment\",\n        \"operationId\": \"createComment\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateCommentParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/CommentObjectResponse\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialCommentObjectResponse\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        }\n      },\n      \"get\": {\n        \"summary\": \"List comments\",\n        \"operationId\": \"listComments\",\n        \"parameters\": [\n          {\n            \"name\": \"block_id\",\n            \"in\": \"query\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"start_cursor\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"page_size\",\n            \"in\": \"query\",\n            \"schema\": {\n              \"type\": \"integer\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListCommentsResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/oauth/token\": {\n      \"post\": {\n        \"summary\": \"OAuth token\",\n        \"operationId\": \"oauthToken\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/OauthTokenParameters\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successful response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/OauthTokenResponse\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n\n  \"components\": {\n    \"securitySchemes\": {\n      \"oauth2\": {\n        \"type\": \"oauth2\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"scopes\": {},\n            \"authorizationUrl\": \"https://api.notion.com/v1/oauth/authorize\",\n            \"tokenUrl\": \"https://api.notion.com/v1/oauth/token\"\n          }\n        }\n      }\n    },\n    \"schemas\": {\n      \"UserObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"user\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"person\", \"bot\"]\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"avatar_url\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\", \"type\", \"name\", \"avatar_url\"]\n      },\n      \"ListUsersResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/UserObjectResponse\"\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"CreatePageParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"parent\": {\n            \"type\": \"object\",\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"database_id\"]\n                  },\n                  \"database_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"database_id\"]\n              }\n            ]\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"title\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"title\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"rich_text\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\"number\", \"null\"]\n                    }\n                  },\n                  \"required\": [\"number\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"select\": {\n                      \"type\": [\"object\", \"null\"],\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"name\"]\n                    }\n                  },\n                  \"required\": [\"select\"]\n                }\n              ]\n            }\n          }\n        },\n        \"required\": [\"parent\", \"properties\"]\n      },\n      \"PageObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"page\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          },\n          \"url\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"archived\",\n          \"url\"\n        ]\n      },\n      \"PartialPageObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"page\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"UpdatePageParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"title\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"title\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  },\n                  \"required\": [\"rich_text\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\"number\", \"null\"]\n                    }\n                  },\n                  \"required\": [\"number\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"select\": {\n                      \"type\": [\"object\", \"null\"],\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\"\n                        }\n                      },\n                      \"required\": [\"name\"]\n                    }\n                  },\n                  \"required\": [\"select\"]\n                }\n              ]\n            }\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"PropertyItemObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"type\", \"id\"]\n      },\n      \"PropertyItemListResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\"\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"PartialBlockObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"block\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"BlockObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"block\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\"\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          },\n          \"has_children\": {\n            \"type\": \"boolean\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"has_children\",\n          \"archived\"\n        ]\n      },\n      \"UpdateBlockParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"paragraph\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"heading_1\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"heading_2\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"heading_3\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"bulleted_list_item\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"numbered_list_item\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"quote\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"to_do\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"checked\": {\n                \"type\": \"boolean\"\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"toggle\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"code\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              },\n              \"language\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"embed\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"image\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"video\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"file\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"pdf\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"external\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"bookmark\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"equation\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"divider\": {\n            \"type\": \"object\"\n          },\n          \"table_of_contents\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"breadcrumb\": {\n            \"type\": \"object\"\n          },\n          \"column_list\": {\n            \"type\": \"object\"\n          },\n          \"column\": {\n            \"type\": \"object\"\n          },\n          \"link_to_page\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"page_id\", \"database_id\"]\n              },\n              \"page_id\": {\n                \"type\": \"string\"\n              },\n              \"database_id\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"table_row\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"cells\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                  }\n                }\n              }\n            }\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"ListBlockChildrenResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"AppendBlockChildrenParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"children\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/BlockObjectRequest\"\n            }\n          }\n        },\n        \"required\": [\"children\"]\n      },\n      \"AppendBlockChildrenResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"PartialDatabaseObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"database\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\"\n            }\n          }\n        },\n        \"required\": [\"object\", \"id\", \"properties\"]\n      },\n      \"DatabaseObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"database\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"emoji\"]\n                  },\n                  \"emoji\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"emoji\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n          },\n          \"title\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\"\n            }\n          },\n          \"description\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\"\n            }\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\"\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\"\n            }\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"workspace\"]\n                  },\n                  \"workspace\": {\n                    \"type\": \"boolean\",\n                    \"enum\": [true]\n                  }\n                },\n                \"required\": [\"type\", \"workspace\"]\n              }\n            ]\n          },\n          \"url\": {\n            \"type\": \"string\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"created_by\",\n          \"last_edited_time\",\n          \"last_edited_by\",\n          \"title\",\n          \"description\",\n          \"is_inline\",\n          \"properties\",\n          \"parent\",\n          \"url\",\n          \"archived\"\n        ]\n      },\n      \"UpdateDatabaseParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"description\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"emoji\"]\n                  }\n                },\n                \"required\": [\"emoji\", \"type\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  }\n                },\n                \"required\": [\"external\", \"type\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  }\n                },\n                \"required\": [\"external\", \"type\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertyUpdateSchema\"\n            }\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"QueryDatabaseParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"sorts\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"property\": {\n                      \"type\": \"string\"\n                    },\n                    \"direction\": {\n                      \"type\": \"string\",\n                      \"enum\": [\"ascending\", \"descending\"]\n                    }\n                  },\n                  \"required\": [\"property\", \"direction\"]\n                },\n                {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"timestamp\": {\n                      \"type\": \"string\",\n                      \"enum\": [\"created_time\", \"last_edited_time\"]\n                    },\n                    \"direction\": {\n                      \"type\": \"string\",\n                      \"enum\": [\"ascending\", \"descending\"]\n                    }\n                  },\n                  \"required\": [\"timestamp\", \"direction\"]\n                }\n              ]\n            }\n          },\n          \"filter\": {\n            \"oneOf\": [\n              {\n                \"$ref\": \"#/components/schemas/PropertyFilter\"\n              },\n              {\n                \"$ref\": \"#/components/schemas/CompoundFilter\"\n              }\n            ]\n          },\n          \"start_cursor\": {\n            \"type\": \"string\"\n          },\n          \"page_size\": {\n            \"type\": \"integer\"\n          },\n          \"archived\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"QueryDatabaseResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"ListDatabasesResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"CreateDatabaseParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"database_id\"]\n                  },\n                  \"database_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"database_id\"]\n              }\n            ]\n          },\n          \"properties\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertySchema\"\n            }\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"emoji\"]\n                  },\n                  \"emoji\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"emoji\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"external\"]\n                  },\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"external\"]\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"title\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"description\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n            }\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"parent\", \"properties\", \"title\"]\n      },\n      \"SearchParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"query\": {\n            \"type\": \"string\"\n          },\n          \"sort\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"direction\": {\n                \"type\": \"string\",\n                \"enum\": [\"ascending\", \"descending\"]\n              },\n              \"timestamp\": {\n                \"type\": \"string\",\n                \"enum\": [\"last_edited_time\"]\n              }\n            },\n            \"required\": [\"direction\", \"timestamp\"]\n          },\n          \"filter\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"value\": {\n                \"type\": \"string\",\n                \"enum\": [\"page\", \"database\"]\n              },\n              \"property\": {\n                \"type\": \"string\",\n                \"enum\": [\"object\"]\n              }\n            },\n            \"required\": [\"value\", \"property\"]\n          },\n          \"start_cursor\": {\n            \"type\": \"string\"\n          },\n          \"page_size\": {\n            \"type\": \"integer\"\n          }\n        }\n      },\n      \"SearchResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\"\n                }\n              ]\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"CreateCommentParameters\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"parent\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  },\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  }\n                },\n                \"required\": [\"page_id\"]\n              },\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              }\n            },\n            \"required\": [\"parent\", \"rich_text\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"discussion_id\": {\n                \"type\": \"string\"\n              },\n              \"rich_text\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                }\n              }\n            },\n            \"required\": [\"discussion_id\", \"rich_text\"]\n          }\n        ]\n      },\n      \"CommentObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"comment\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page_id\"]\n                  },\n                  \"page_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"page_id\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"block_id\"]\n                  },\n                  \"block_id\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"type\", \"block_id\"]\n              }\n            ]\n          },\n          \"discussion_id\": {\n            \"type\": \"string\"\n          },\n          \"rich_text\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\"\n            }\n          },\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n          },\n          \"created_time\": {\n            \"type\": \"string\"\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"parent\",\n          \"discussion_id\",\n          \"rich_text\",\n          \"created_by\",\n          \"created_time\",\n          \"last_edited_time\"\n        ]\n      },\n      \"PartialCommentObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"comment\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"ListCommentsResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"list\"]\n          },\n          \"results\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/CommentObjectResponse\"\n            }\n          },\n          \"next_cursor\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"has_more\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\"object\", \"results\", \"next_cursor\", \"has_more\"]\n      },\n      \"OauthTokenParameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"grant_type\": {\n            \"type\": \"string\"\n          },\n          \"code\": {\n            \"type\": \"string\"\n          },\n          \"redirect_uri\": {\n            \"type\": \"string\"\n          },\n          \"external_account\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"key\": {\n                \"type\": \"string\"\n              },\n              \"name\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"key\", \"name\"]\n          }\n        },\n        \"required\": [\"grant_type\", \"code\"]\n      },\n      \"OauthTokenResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"access_token\": {\n            \"type\": \"string\"\n          },\n          \"token_type\": {\n            \"type\": \"string\",\n            \"enum\": [\"bearer\"]\n          },\n          \"bot_id\": {\n            \"type\": \"string\"\n          },\n          \"workspace_name\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"workspace_icon\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"workspace_id\": {\n            \"type\": \"string\"\n          },\n          \"owner\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"user\"]\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\"type\", \"user\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"workspace\"]\n                  },\n                  \"workspace\": {\n                    \"type\": \"boolean\",\n                    \"enum\": [true]\n                  }\n                },\n                \"required\": [\"type\", \"workspace\"]\n              }\n            ]\n          },\n          \"duplicated_template_id\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\n          \"access_token\",\n          \"token_type\",\n          \"bot_id\",\n          \"workspace_name\",\n          \"workspace_icon\",\n          \"workspace_id\",\n          \"owner\",\n          \"duplicated_template_id\"\n        ]\n      },\n      \"RichTextItemRequest\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"text\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"content\": {\n                    \"type\": \"string\"\n                  },\n                  \"link\": {\n                    \"type\": [\"object\", \"null\"],\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"content\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"text\"]\n              },\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\"\n              }\n            },\n            \"required\": [\"text\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"mention\": {\n                \"oneOf\": [\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"user\": {\n                        \"oneOf\": [\n                          {\n                            \"type\": \"object\",\n                            \"properties\": {\n                              \"id\": {\n                                \"type\": \"string\"\n                              }\n                            },\n                            \"required\": [\"id\"]\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\"user\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"page\": {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"id\"]\n                      }\n                    },\n                    \"required\": [\"page\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"database\": {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"id\"]\n                      }\n                    },\n                    \"required\": [\"database\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"date\": {\n                        \"$ref\": \"#/components/schemas/DateRequest\"\n                      }\n                    },\n                    \"required\": [\"date\"]\n                  }\n                ]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"mention\"]\n              },\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\"\n              }\n            },\n            \"required\": [\"mention\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"equation\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"expression\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"equation\"]\n              },\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\"\n              }\n            },\n            \"required\": [\"equation\"]\n          }\n        ]\n      },\n      \"RichTextItemResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TextRichTextItemResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/MentionRichTextItemResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/EquationRichTextItemResponse\"\n          }\n        ]\n      },\n      \"AnnotationRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\"\n          },\n          \"italic\": {\n            \"type\": \"boolean\"\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\"\n          },\n          \"underline\": {\n            \"type\": \"boolean\"\n          },\n          \"code\": {\n            \"type\": \"boolean\"\n          },\n          \"color\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\"\n            ]\n          }\n        }\n      },\n      \"DateRequest\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"start\": {\n            \"type\": \"string\"\n          },\n          \"end\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"time_zone\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"start\"]\n      },\n      \"TextRichTextItemResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"text\"]\n          },\n          \"text\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"content\": {\n                \"type\": \"string\"\n              },\n              \"link\": {\n                \"type\": [\"object\", \"null\"],\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            },\n            \"required\": [\"content\", \"link\"]\n          },\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\"\n          },\n          \"plain_text\": {\n            \"type\": \"string\"\n          },\n          \"href\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\", \"text\", \"annotations\", \"plain_text\", \"href\"]\n      },\n      \"MentionRichTextItemResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"mention\"]\n          },\n          \"mention\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"user\"]\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\"\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\"type\", \"user\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"date\"]\n                  },\n                  \"date\": {\n                    \"$ref\": \"#/components/schemas/DateResponse\"\n                  }\n                },\n                \"required\": [\"type\", \"date\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"link_preview\"]\n                  },\n                  \"link_preview\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  }\n                },\n                \"required\": [\"type\", \"link_preview\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"page\"]\n                  },\n                  \"page\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"id\"]\n                  }\n                },\n                \"required\": [\"type\", \"page\"]\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"database\"]\n                  },\n                  \"database\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"id\"]\n                  }\n                },\n                \"required\": [\"type\", \"database\"]\n              }\n            ]\n          },\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\"\n          },\n          \"plain_text\": {\n            \"type\": \"string\"\n          },\n          \"href\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\", \"mention\", \"annotations\", \"plain_text\", \"href\"]\n      },\n      \"EquationRichTextItemResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"equation\"]\n          },\n          \"equation\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"expression\"]\n          },\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\"\n          },\n          \"plain_text\": {\n            \"type\": \"string\"\n          },\n          \"href\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\", \"equation\", \"annotations\", \"plain_text\", \"href\"]\n      },\n      \"AnnotationResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\"\n          },\n          \"italic\": {\n            \"type\": \"boolean\"\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\"\n          },\n          \"underline\": {\n            \"type\": \"boolean\"\n          },\n          \"code\": {\n            \"type\": \"boolean\"\n          },\n          \"color\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\"\n            ]\n          }\n        },\n        \"required\": [\n          \"bold\",\n          \"italic\",\n          \"strikethrough\",\n          \"underline\",\n          \"code\",\n          \"color\"\n        ]\n      },\n      \"DateResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"start\": {\n            \"type\": \"string\"\n          },\n          \"end\": {\n            \"type\": [\"string\", \"null\"]\n          },\n          \"time_zone\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"start\", \"end\", \"time_zone\"]\n      },\n      \"PartialUserObjectResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"object\": {\n            \"type\": \"string\",\n            \"enum\": [\"user\"]\n          },\n          \"id\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"object\", \"id\"]\n      },\n      \"DatabasePropertyConfigResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TitlePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/RichTextPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/NumberPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/SelectPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/MultiSelectPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/DatePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/PeoplePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/FilePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/CheckboxPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/URLPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/EmailPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/PhoneNumberPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/FormulaPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/RelationPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/RollupPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedTimePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedByPropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedTimePropertyResponse\"\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedByPropertyResponse\"\n          }\n        ]\n      },\n      \"TitlePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"title\"]\n          },\n          \"title\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"title\"]\n      },\n      \"RichTextPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"rich_text\"]\n          },\n          \"rich_text\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"rich_text\"]\n      },\n      \"NumberPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"number\"]\n          },\n          \"number\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"format\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"format\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"number\"]\n      },\n      \"SelectPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"select\"]\n          },\n          \"select\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"options\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\"\n                }\n              }\n            },\n            \"required\": [\"options\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"select\"]\n      },\n      \"MultiSelectPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"multi_select\"]\n          },\n          \"multi_select\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"options\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\"\n                }\n              }\n            },\n            \"required\": [\"options\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"multi_select\"]\n      },\n      \"DatePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"date\"]\n          },\n          \"date\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"date\"]\n      },\n      \"PeoplePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"people\"]\n          },\n          \"people\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"people\"]\n      },\n      \"FilePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"files\"]\n          },\n          \"files\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"files\"]\n      },\n      \"CheckboxPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"checkbox\"]\n          },\n          \"checkbox\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"checkbox\"]\n      },\n      \"URLPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"url\"]\n          },\n          \"url\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"url\"]\n      },\n      \"EmailPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"email\"]\n          },\n          \"email\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"email\"]\n      },\n      \"PhoneNumberPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"phone_number\"]\n          },\n          \"phone_number\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"phone_number\"]\n      },\n      \"FormulaPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"formula\"]\n          },\n          \"formula\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\"expression\"]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"formula\"]\n      },\n      \"RelationPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"relation\"]\n          },\n          \"relation\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\"\n              },\n              \"synced_property_name\": {\n                \"type\": \"string\"\n              },\n              \"synced_property_id\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\n              \"database_id\",\n              \"synced_property_name\",\n              \"synced_property_id\"\n            ]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"relation\"]\n      },\n      \"RollupPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"rollup\"]\n          },\n          \"rollup\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"relation_property_name\": {\n                \"type\": \"string\"\n              },\n              \"relation_property_id\": {\n                \"type\": \"string\"\n              },\n              \"rollup_property_name\": {\n                \"type\": \"string\"\n              },\n              \"rollup_property_id\": {\n                \"type\": \"string\"\n              },\n              \"function\": {\n                \"type\": \"string\"\n              }\n            },\n            \"required\": [\n              \"relation_property_name\",\n              \"relation_property_id\",\n              \"rollup_property_name\",\n\n              \"rollup_property_id\",\n              \"function\"\n            ]\n          }\n        },\n        \"required\": [\"id\", \"type\", \"rollup\"]\n      },\n      \"CreatedTimePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"created_time\"]\n          },\n          \"created_time\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"created_time\"]\n      },\n      \"CreatedByPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"created_by\"]\n          },\n          \"created_by\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"created_by\"]\n      },\n      \"LastEditedTimePropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"last_edited_time\"]\n          },\n          \"last_edited_time\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"last_edited_time\"]\n      },\n      \"LastEditedByPropertyResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"last_edited_by\"]\n          },\n          \"last_edited_by\": {\n            \"type\": \"object\"\n          }\n        },\n        \"required\": [\"id\", \"type\", \"last_edited_by\"]\n      },\n      \"SelectOption\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"color\": {\n            \"type\": \"string\"\n          }\n        },\n        \"required\": [\"id\", \"name\", \"color\"]\n      },\n      \"PropertyUpdateSchema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"type\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"PropertySchema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"type\": {\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"type\": [\"string\", \"null\"]\n          }\n        },\n        \"required\": [\"type\"]\n      },\n      \"PropertyFilter\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"title\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"title\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"rich_text\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"rich_text\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"number\": {\n                \"$ref\": \"#/components/schemas/NumberPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"number\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"checkbox\": {\n                \"$ref\": \"#/components/schemas/CheckboxPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"checkbox\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"select\": {\n                \"$ref\": \"#/components/schemas/SelectPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"select\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"multi_select\": {\n                \"$ref\": \"#/components/schemas/MultiSelectPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"multi_select\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"date\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"date\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"people\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"people\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"files\": {\n                \"$ref\": \"#/components/schemas/FilesPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"files\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"url\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"url\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"email\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"email\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"phone_number\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"phone_number\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"relation\": {\n                \"$ref\": \"#/components/schemas/RelationPropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"relation\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"created_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"created_by\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"created_time\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"last_edited_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"last_edited_by\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\"\n              },\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"property\", \"last_edited_time\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"timestamp\": {\n                \"type\": \"string\",\n                \"enum\": [\"created_time\", \"last_edited_time\"]\n              },\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"timestamp\", \"created_time\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"timestamp\": {\n                \"type\": \"string\",\n                \"enum\": [\"created_time\", \"last_edited_time\"]\n              },\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\"\n              }\n            },\n            \"required\": [\"timestamp\", \"last_edited_time\"]\n          }\n        ]\n      },\n      \"TextPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"string\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"string\"\n          },\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"starts_with\": {\n            \"type\": \"string\"\n          },\n          \"ends_with\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"NumberPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"number\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"number\"\n          },\n          \"greater_than\": {\n            \"type\": \"number\"\n          },\n          \"less_than\": {\n            \"type\": \"number\"\n          },\n          \"greater_than_or_equal_to\": {\n            \"type\": \"number\"\n          },\n          \"less_than_or_equal_to\": {\n            \"type\": \"number\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"CheckboxPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"boolean\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"SelectPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"string\"\n          },\n          \"does_not_equal\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"MultiSelectPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"DatePropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"equals\": {\n            \"type\": \"string\"\n          },\n          \"before\": {\n            \"type\": \"string\"\n          },\n          \"after\": {\n            \"type\": \"string\"\n          },\n          \"on_or_before\": {\n            \"type\": \"string\"\n          },\n          \"on_or_after\": {\n            \"type\": \"string\"\n          },\n          \"past_week\": {},\n          \"past_month\": {},\n          \"past_year\": {},\n          \"next_week\": {},\n          \"next_month\": {},\n          \"next_year\": {},\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"PeoplePropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"FilesPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"RelationPropertyFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\"\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\"\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\"\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\"\n          }\n        }\n      },\n      \"CompoundFilter\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"and\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\"\n            }\n          },\n          \"or\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\"\n            }\n          }\n        }\n      },\n      \"BlockObjectRequest\": {\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"paragraph\"]\n              },\n              \"paragraph\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"paragraph\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"heading_1\"]\n              },\n              \"heading_1\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"heading_1\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"heading_2\"]\n              },\n              \"heading_2\": {\n                \"type\": \"object\",\n\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"heading_2\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"heading_3\"]\n              },\n              \"heading_3\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"heading_3\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"bulleted_list_item\"]\n              },\n              \"bulleted_list_item\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"bulleted_list_item\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"numbered_list_item\"]\n              },\n              \"numbered_list_item\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"numbered_list_item\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"to_do\"]\n              },\n              \"to_do\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"checked\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\", \"checked\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"to_do\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"toggle\"]\n              },\n              \"toggle\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"rich_text\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"toggle\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"code\"]\n              },\n              \"code\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"rich_text\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  },\n                  \"language\": {\n                    \"type\": \"string\"\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"rich_text\", \"language\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"code\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"child_page\"]\n              },\n              \"child_page\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"title\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"child_page\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"child_database\"]\n              },\n              \"child_database\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"title\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"child_database\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"embed\"]\n              },\n              \"embed\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"embed\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"image\"]\n              },\n              \"image\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"image\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"video\"]\n              },\n              \"video\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"video\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"file\"]\n              },\n              \"file\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"file\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"pdf\"]\n              },\n              \"pdf\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"external\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"url\"]\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"external\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"pdf\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"bookmark\"]\n              },\n              \"bookmark\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\"\n                  },\n                  \"caption\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"url\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"bookmark\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"equation\"]\n              },\n              \"equation\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\"expression\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"equation\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"divider\"]\n              },\n              \"divider\": {\n                \"type\": \"object\"\n              }\n            },\n            \"required\": [\"object\", \"type\", \"divider\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"table_of_contents\"]\n              },\n              \"table_of_contents\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            },\n            \"required\": [\"object\", \"type\", \"table_of_contents\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"column_list\"]\n              },\n              \"column_list\": {\n                \"type\": \"object\"\n              }\n            },\n            \"required\": [\"object\", \"type\", \"column_list\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"column\"]\n              },\n              \"column\": {\n                \"type\": \"object\"\n              }\n            },\n            \"required\": [\"object\", \"type\", \"column\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"link_to_page\"]\n              },\n              \"link_to_page\": {\n                \"oneOf\": [\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"type\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"page_id\"]\n                      },\n                      \"page_id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\", \"page_id\"]\n                  },\n                  {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"type\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"database_id\"]\n                      },\n                      \"database_id\": {\n                        \"type\": \"string\"\n                      }\n                    },\n                    \"required\": [\"type\", \"database_id\"]\n                  }\n                ]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"link_to_page\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"table\"]\n              },\n              \"table\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"table_width\": {\n                    \"type\": \"integer\"\n                  },\n                  \"has_column_header\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"has_row_header\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\"\n                    }\n                  }\n                },\n                \"required\": [\"table_width\", \"children\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"table\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"table_row\"]\n              },\n              \"table_row\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"cells\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\"\n                      }\n                    }\n                  }\n                },\n                \"required\": [\"cells\"]\n              }\n            },\n            \"required\": [\"object\", \"type\", \"table_row\"]\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"object\": {\n                \"type\": \"string\",\n                \"enum\": [\"block\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"enum\": [\"synced_block\"]\n              },\n              \"synced_block\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"synced_from\": {\n                    \"oneOf\": [\n                      {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"type\": {\n                            \"type\": \"string\",\n                            \"enum\": [\"block_id\"]\n                          },\n                          \"block_id\": {\n                            \"type\": \"string\"\n                          }\n                        },\n                        \"required\": [\"type\", \"block_id\"]\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\"\n                    }\n                  }\n                }\n              }\n            },\n            \"required\": [\"object\", \"type\", \"synced_block\"]\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/open-meteo.yaml",
    "content": "openapi: 3.0.0\ninfo:\n  title: Open-Meteo APIs\n  description: 'Open-Meteo offers free weather forecast APIs for open-source developers and non-commercial use. No API key is required.'\n  version: '1.0'\n  contact:\n    name: Open-Meteo\n    url: https://open-meteo.com\n    email: info@open-meteo.com\n  license:\n    name: Attribution 4.0 International (CC BY 4.0)\n    url: https://creativecommons.org/licenses/by/4.0/\n  termsOfService: https://open-meteo.com/en/features#terms\npaths:\n  /v1/forecast:\n    servers:\n      - url: https://api.open-meteo.com\n    get:\n      tags:\n        - Weather Forecast APIs\n      summary: 7 day weather forecast for coordinates\n      description: 7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.\n      parameters:\n        - name: hourly\n          in: query\n          explode: false\n          schema:\n            type: array\n            items:\n              type: string\n              enum:\n                - temperature_2m\n                - relative_humidity_2m\n                - dew_point_2m\n                - apparent_temperature\n                - pressure_msl\n                - cloud_cover\n                - cloud_cover_low\n                - cloud_cover_mid\n                - cloud_cover_high\n                - wind_speed_10m\n                - wind_speed_80m\n                - wind_speed_120m\n                - wind_speed_180m\n                - wind_direction_10m\n                - wind_direction_80m\n                - wind_direction_120m\n                - wind_direction_180m\n                - wind_gusts_10m\n                - shortwave_radiation\n                - direct_radiation\n                - direct_normal_irradiance\n                - diffuse_radiation\n                - vapour_pressure_deficit\n                - evapotranspiration\n                - precipitation\n                - weather_code\n                - snow_height\n                - freezing_level_height\n                - soil_temperature_0cm\n                - soil_temperature_6cm\n                - soil_temperature_18cm\n                - soil_temperature_54cm\n                - soil_moisture_0_1cm\n                - soil_moisture_1_3cm\n                - soil_moisture_3_9cm\n                - soil_moisture_9_27cm\n                - soil_moisture_27_81cm\n        - name: daily\n          in: query\n          schema:\n            type: array\n            items:\n              type: string\n              enum:\n                - temperature_2m_max\n                - temperature_2m_min\n                - apparent_temperature_max\n                - apparent_temperature_min\n                - precipitation_sum\n                - precipitation_hours\n                - weather_code\n                - sunrise\n                - sunset\n                - wind_speed_10m_max\n                - wind_gusts_10m_max\n                - wind_direction_10m_dominant\n                - shortwave_radiation_sum\n                - uv_index_max\n                - uv_index_clear_sky_max\n                - et0_fao_evapotranspiration\n        - name: latitude\n          in: query\n          required: true\n          description: 'WGS84 coordinate'\n          schema:\n            type: number\n            format: double\n        - name: longitude\n          in: query\n          required: true\n          description: 'WGS84 coordinate'\n          schema:\n            type: number\n            format: double\n        - name: current_weather\n          in: query\n          schema:\n            type: boolean\n        - name: temperature_unit\n          in: query\n          schema:\n            type: string\n            default: celsius\n            enum:\n              - celsius\n              - fahrenheit\n        - name: wind_speed_unit\n          in: query\n          schema:\n            type: string\n            default: kmh\n            enum:\n              - kmh\n              - ms\n              - mph\n              - kn\n        - name: timeformat\n          in: query\n          description: If format `unixtime` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply `utc_offset_seconds` again to get the correct date.\n          schema:\n            type: string\n            default: iso8601\n            enum:\n              - iso8601\n              - unixtime\n        - name: timezone\n          in: query\n          description: If `timezone` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported.\n          schema:\n            type: string\n        - name: past_days\n          in: query\n          description: If `past_days` is set, yesterdays or the day before yesterdays data are also returned.\n          schema:\n            type: integer\n            enum:\n              - 1\n              - 2\n      responses:\n        '200':\n          description: OK\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  latitude:\n                    type: number\n                    example: 52.52\n                    description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\n                  longitude:\n                    type: number\n                    example: 13.419.52\n                    description: WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\n                  elevation:\n                    type: number\n                    example: 44.812\n                    description: The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.\n                  generationtime_ms:\n                    type: number\n                    example: 2.2119\n                    description: Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.\n                  utc_offset_seconds:\n                    type: integer\n                    example: 3600\n                    description: Applied timezone offset from the &timezone= parameter.\n                  hourly:\n                    $ref: '#/components/schemas/HourlyResponse'\n                  hourly_units:\n                    type: object\n                    additionalProperties:\n                      type: string\n                    description: For each selected weather variable, the unit will be listed here.\n                  daily:\n                    $ref: '#/components/schemas/DailyResponse'\n                  daily_units:\n                    type: object\n                    additionalProperties:\n                      type: string\n                    description: For each selected daily weather variable, the unit will be listed here.\n                  current_weather:\n                    $ref: '#/components/schemas/CurrentWeather'\n        '400':\n          description: Bad Request\n          content:\n            application/json:\n              schema:\n                type: object\n                properties:\n                  error:\n                    type: boolean\n                    description: Always set true for errors\n                  reason:\n                    type: string\n                    description: Description of the error\n                    example: 'Latitude must be in range of -90 to 90°. Given: 300'\ncomponents:\n  schemas:\n    HourlyResponse:\n      type: object\n      description: For each selected weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.\n      required:\n        - time\n      properties:\n        time:\n          type: array\n          items:\n            type: string\n        temperature_2m:\n          type: array\n          items:\n            type: number\n        relative_humidity_2m:\n          type: array\n          items:\n            type: number\n        dew_point_2m:\n          type: array\n          items:\n            type: number\n        apparent_temperature:\n          type: array\n          items:\n            type: number\n        pressure_msl:\n          type: array\n          items:\n            type: number\n        cloud_cover:\n          type: array\n          items:\n            type: number\n        cloud_cover_low:\n          type: array\n          items:\n            type: number\n        cloud_cover_mid:\n          type: array\n          items:\n            type: number\n        cloud_cover_high:\n          type: array\n          items:\n            type: number\n        wind_speed_10m:\n          type: array\n          items:\n            type: number\n        wind_speed_80m:\n          type: array\n          items:\n            type: number\n        wind_speed_120m:\n          type: array\n          items:\n            type: number\n        wind_speed_180m:\n          type: array\n          items:\n            type: number\n        wind_direction_10m:\n          type: array\n          items:\n            type: number\n        wind_direction_80m:\n          type: array\n          items:\n            type: number\n        wind_direction_120m:\n          type: array\n          items:\n            type: number\n        wind_direction_180m:\n          type: array\n          items:\n            type: number\n        wind_gusts_10m:\n          type: array\n          items:\n            type: number\n        shortwave_radiation:\n          type: array\n          items:\n            type: number\n        direct_radiation:\n          type: array\n          items:\n            type: number\n        direct_normal_irradiance:\n          type: array\n          items:\n            type: number\n        diffuse_radiation:\n          type: array\n          items:\n            type: number\n        vapour_pressure_deficit:\n          type: array\n          items:\n            type: number\n        evapotranspiration:\n          type: array\n          items:\n            type: number\n        precipitation:\n          type: array\n          items:\n            type: number\n        weather_code:\n          type: array\n          items:\n            type: number\n        snow_height:\n          type: array\n          items:\n            type: number\n        freezing_level_height:\n          type: array\n          items:\n            type: number\n        soil_temperature_0cm:\n          type: array\n          items:\n            type: number\n        soil_temperature_6cm:\n          type: array\n          items:\n            type: number\n        soil_temperature_18cm:\n          type: array\n          items:\n            type: number\n        soil_temperature_54cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_0_1cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_1_3cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_3_9cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_9_27cm:\n          type: array\n          items:\n            type: number\n        soil_moisture_27_81cm:\n          type: array\n          items:\n            type: number\n    DailyResponse:\n      type: object\n      description: For each selected daily weather variable, data will be returned as a floating point array. Additionally a `time` array will be returned with ISO8601 timestamps.\n      properties:\n        time:\n          type: array\n          items:\n            type: string\n        temperature_2m_max:\n          type: array\n          items:\n            type: number\n        temperature_2m_min:\n          type: array\n          items:\n            type: number\n        apparent_temperature_max:\n          type: array\n          items:\n            type: number\n        apparent_temperature_min:\n          type: array\n          items:\n            type: number\n        precipitation_sum:\n          type: array\n          items:\n            type: number\n        precipitation_hours:\n          type: array\n          items:\n            type: number\n        weather_code:\n          type: array\n          items:\n            type: number\n        sunrise:\n          type: array\n          items:\n            type: number\n        sunset:\n          type: array\n          items:\n            type: number\n        wind_speed_10m_max:\n          type: array\n          items:\n            type: number\n        wind_gusts_10m_max:\n          type: array\n          items:\n            type: number\n        wind_direction_10m_dominant:\n          type: array\n          items:\n            type: number\n        shortwave_radiation_sum:\n          type: array\n          items:\n            type: number\n        uv_index_max:\n          type: array\n          items:\n            type: number\n        uv_index_clear_sky_max:\n          type: array\n          items:\n            type: number\n        et0_fao_evapotranspiration:\n          type: array\n          items:\n            type: number\n      required:\n        - time\n    CurrentWeather:\n      type: object\n      description: 'Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code'\n      properties:\n        time:\n          type: string\n        temperature:\n          type: number\n        wind_speed:\n          type: number\n        wind_direction:\n          type: number\n        weather_code:\n          type: integer\n      required:\n        - time\n        - temperature\n        - wind_speed\n        - wind_direction\n        - weather_code\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/pet-store.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"version\": \"1.0.0\",\n    \"title\": \"Swagger Petstore\",\n    \"license\": {\n      \"name\": \"MIT\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/v1\"\n    }\n  ],\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"summary\": \"List all pets\",\n        \"operationId\": \"listPets\",\n        \"tags\": [\"pets\"],\n        \"parameters\": [\n          {\n            \"name\": \"limit\",\n            \"in\": \"query\",\n            \"description\": \"How many items to return at one time (max 100)\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"maximum\": 100,\n              \"format\": \"int32\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A paged array of pets\",\n            \"headers\": {\n              \"x-next\": {\n                \"description\": \"A link to the next page of responses\",\n                \"schema\": {\n                  \"type\": \"string\"\n                }\n              }\n            },\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pets\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"summary\": \"Create a pet\",\n        \"operationId\": \"createPets\",\n        \"tags\": [\"pets\"],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/Pet\"\n              }\n            }\n          },\n          \"required\": true\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"Null response\"\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pets/{petId}\": {\n      \"get\": {\n        \"summary\": \"Info for a specific pet\",\n        \"operationId\": \"showPetById\",\n        \"tags\": [\"pets\"],\n        \"parameters\": [\n          {\n            \"name\": \"petId\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"description\": \"The id of the pet to retrieve\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Expected response to a valid request\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"Pet\": {\n        \"type\": \"object\",\n        \"required\": [\"id\", \"name\"],\n        \"properties\": {\n          \"id\": {\n            \"type\": \"integer\",\n            \"format\": \"int64\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"tag\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"Pets\": {\n        \"type\": \"array\",\n        \"maxItems\": 100,\n        \"items\": {\n          \"$ref\": \"#/components/schemas/Pet\"\n        }\n      },\n      \"Error\": {\n        \"type\": \"object\",\n        \"required\": [\"code\", \"message\"],\n        \"properties\": {\n          \"code\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"message\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/petstore-expanded.json",
    "content": "{\n  \"openapi\": \"3.0.0\",\n  \"info\": {\n    \"version\": \"1.0.0\",\n    \"title\": \"Swagger Petstore\",\n    \"description\": \"A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification\",\n    \"termsOfService\": \"http://swagger.io/terms/\",\n    \"contact\": {\n      \"name\": \"Swagger API Team\",\n      \"email\": \"apiteam@swagger.io\",\n      \"url\": \"http://swagger.io\"\n    },\n    \"license\": {\n      \"name\": \"Apache 2.0\",\n      \"url\": \"https://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/api\"\n    }\n  ],\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"description\": \"Returns all pets from the system that the user has access to\\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\\n\\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\",\n        \"operationId\": \"findPets\",\n        \"parameters\": [\n          {\n            \"name\": \"tags\",\n            \"in\": \"query\",\n            \"description\": \"tags to filter by\",\n            \"required\": false,\n            \"style\": \"form\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          {\n            \"name\": \"limit\",\n            \"in\": \"query\",\n            \"description\": \"maximum number of results to return\",\n            \"required\": false,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"pet response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/Pet\"\n                  }\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"description\": \"Creates a new pet in the store. Duplicates are allowed\",\n        \"operationId\": \"addPet\",\n        \"requestBody\": {\n          \"description\": \"Pet to add to the store\",\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/NewPet\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"pet response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/pets/{id}\": {\n      \"get\": {\n        \"description\": \"Returns a user based on a single ID, if the user does not have access to the pet\",\n        \"operationId\": \"find pet by id\",\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of pet to fetch\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"format\": \"int64\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"pet response\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"description\": \"deletes a single pet based on the ID supplied\",\n        \"operationId\": \"deletePet\",\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of pet to delete\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"integer\",\n              \"format\": \"int64\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"pet deleted\"\n          },\n          \"default\": {\n            \"description\": \"unexpected error\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"Pet\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/NewPet\"\n          },\n          {\n            \"type\": \"object\",\n            \"required\": [\"id\"],\n            \"properties\": {\n              \"id\": {\n                \"type\": \"integer\",\n                \"format\": \"int64\"\n              }\n            }\n          }\n        ]\n      },\n      \"NewPet\": {\n        \"type\": \"object\",\n        \"required\": [\"name\"],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"tag\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"Error\": {\n        \"type\": \"object\",\n        \"required\": [\"code\", \"message\"],\n        \"properties\": {\n          \"code\": {\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          \"message\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/readme.json",
    "content": "{\n  \"openapi\": \"3.0.2\",\n  \"info\": {\n    \"description\": \"Create beautiful product and API documentation with our developer friendly platform.\",\n    \"version\": \"4.355.0\",\n    \"title\": \"ReadMe API 🦉\",\n    \"contact\": {\n      \"name\": \"API Support\",\n      \"url\": \"https://docs.readme.com/main/docs/need-more-support\",\n      \"email\": \"support@readme.io\"\n    }\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://dash.readme.com/api/v1\"\n    }\n  ],\n  \"tags\": [\n    {\n      \"name\": \"API Registry\"\n    },\n    {\n      \"name\": \"API Specification\"\n    },\n    {\n      \"name\": \"Apply to ReadMe\"\n    },\n    {\n      \"name\": \"Categories\"\n    },\n    {\n      \"name\": \"Changelog\"\n    },\n    {\n      \"name\": \"Custom Pages\"\n    },\n    {\n      \"name\": \"Docs\"\n    },\n    {\n      \"name\": \"Errors\"\n    },\n    {\n      \"name\": \"Projects\"\n    },\n    {\n      \"name\": \"Version\"\n    }\n  ],\n  \"paths\": {\n    \"/api-registry/{uuid}\": {\n      \"get\": {\n        \"operationId\": \"getAPIRegistry\",\n        \"summary\": \"Retrieve an entry from the API Registry\",\n        \"description\": \"Get an API definition file that's been uploaded to ReadMe.\",\n        \"tags\": [\"API Registry\"],\n        \"parameters\": [\n          {\n            \"name\": \"uuid\",\n            \"in\": \"path\",\n            \"description\": \"An API Registry UUID. This can be found by navigating to your API Reference page and viewing code snippets for Node with the `api` library.\",\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"required\": true\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successfully retrieved API registry entry.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\"\n                }\n              }\n            }\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_REGISTRY_NOTFOUND\"\n          }\n        }\n      }\n    },\n    \"/api-specification\": {\n      \"get\": {\n        \"operationId\": \"getAPISpecification\",\n        \"summary\": \"Get metadata\",\n        \"description\": \"Get API specification metadata.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successfully retrieved API specification metadata.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_VERSION_EMPTY\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"uploadAPISpecification\",\n        \"summary\": \"Upload specification\",\n        \"description\": \"Upload an API specification to ReadMe. Or, to use a newer solution see https://docs.readme.com/main/docs/rdme.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"multipart/form-data\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"spec\": {\n                    \"description\": \"OpenAPI/Swagger file. We accept JSON or YAML.\",\n                    \"type\": \"string\",\n                    \"format\": \"binary\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The API specification was successfully uploaded.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during upload.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_FILE_EMPTY\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID_SCHEMA\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_VERSION_NOTFOUND\"\n                    }\n                  ]\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"408\": {\n            \"$ref\": \"#/components/responses/error_SPEC_TIMEOUT\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/api-specification/{id}\": {\n      \"put\": {\n        \"operationId\": \"updateAPISpecification\",\n        \"summary\": \"Update specification\",\n        \"description\": \"Update an API specification in ReadMe.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of the API specification. The unique ID for each API can be found by navigating to your **API Definitions** page.\",\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"required\": true\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"multipart/form-data\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"spec\": {\n                    \"description\": \"OpenAPI/Swagger file. We accept JSON or YAML.\",\n                    \"type\": \"string\",\n                    \"format\": \"binary\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The API specification was updated.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during upload.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_FILE_EMPTY\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_ID_DUPLICATE\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_ID_INVALID\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_INVALID_SCHEMA\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_SPEC_VERSION_NOTFOUND\"\n                    }\n                  ]\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"description\": \"There is no API specification with that ID.\"\n          },\n          \"408\": {\n            \"$ref\": \"#/components/responses/error_SPEC_TIMEOUT\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteAPISpecification\",\n        \"summary\": \"Delete specification\",\n        \"description\": \"Delete an API specification in ReadMe.\",\n        \"tags\": [\"API Specification\"],\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"description\": \"ID of the API specification. The unique ID for each API can be found by navigating to your **API Definitions** page.\",\n            \"schema\": {\n              \"type\": \"string\"\n            },\n            \"required\": true\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The API specification was deleted.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_SPEC_ID_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_SPEC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/apply\": {\n      \"get\": {\n        \"operationId\": \"getOpenRoles\",\n        \"summary\": \"Get open roles\",\n        \"description\": \"Returns all the roles we're hiring for at ReadMe!\",\n        \"tags\": [\"Apply to ReadMe\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"All the roles that we're hiring for.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/jobOpening\"\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"operationId\": \"applyToReadMe\",\n        \"summary\": \"Submit your application!\",\n        \"description\": \"This endpoint will let you apply to a job at ReadMe programatically, without having to go through our UI!\",\n        \"tags\": [\"Apply to ReadMe\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/apply\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"You did it!\"\n          }\n        }\n      }\n    },\n    \"/categories\": {\n      \"get\": {\n        \"operationId\": \"getCategories\",\n        \"summary\": \"Get all categories\",\n        \"description\": \"Returns all the categories for a specified version.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The list of categories.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createCategory\",\n        \"summary\": \"Create category\",\n        \"description\": \"Create a new category inside of this project.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"allOf\": [\n                  {\n                    \"$ref\": \"#/components/schemas/category\"\n                  },\n                  {\n                    \"required\": [\"title\"]\n                  }\n                ]\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The category has successfully been created.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_INVALID\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/categories/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getCategory\",\n        \"summary\": \"Get category\",\n        \"description\": \"Returns the category with this slug.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The category exists and has been returned.\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateCategory\",\n        \"summary\": \"Update category\",\n        \"description\": \"Change the properties of a category.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/category\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The category was successfully updated.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_INVALID\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteCategory\",\n        \"summary\": \"Delete category\",\n        \"description\": \"Delete the category with this slug.\\n>⚠️Heads Up!\\n> This will also delete all of the docs within this category.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The category was deleted.\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/categories/{slug}/docs\": {\n      \"get\": {\n        \"operationId\": \"getCategoryDocs\",\n        \"summary\": \"Get docs for category\",\n        \"description\": \"Returns the docs and children docs within this category.\",\n        \"tags\": [\"Categories\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the category title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the category \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n            \"example\": \"getting-started\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The category exists and all of the docs have been returned.\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CATEGORY_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/changelogs\": {\n      \"get\": {\n        \"operationId\": \"getChangelogs\",\n        \"summary\": \"Get changelogs\",\n        \"description\": \"Returns a list of changelogs.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The list of changelogs.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createChangelog\",\n        \"summary\": \"Create changelog\",\n        \"description\": \"Create a new changelog entry.\",\n        \"tags\": [\"Changelog\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/changelog\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The changelog was successfully created.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during creation.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/changelogs/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getChangelog\",\n        \"summary\": \"Get changelog\",\n        \"description\": \"Returns the changelog with this slug.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the changelog title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the changelog \\\"Owlet Update\\\", enter the slug \\\"owlet-update\\\".\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The changelog exists and has been returned.\"\n          },\n          \"404\": {\n            \"description\": \"There is no changelog with that slug.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateChangelog\",\n        \"summary\": \"Update changelog\",\n        \"description\": \"Update a changelog with this slug.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the changelog title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the changelog \\\"Owlet Weekly Update\\\", enter the slug \\\"owlet-weekly-update\\\".\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/changelog\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The changelog was successfully updated.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during update.\"\n          },\n          \"404\": {\n            \"description\": \"There is no changelog with that slug.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteChangelog\",\n        \"summary\": \"Delete changelog\",\n        \"description\": \"Delete the changelog with this slug.\",\n        \"tags\": [\"Changelog\"],\n        \"parameters\": [\n          {\n            \"name\": \"slug\",\n            \"in\": \"path\",\n            \"description\": \"A URL-safe representation of the changelog title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the changelog \\\"Owlet Weekly Update\\\", enter the slug \\\"owlet-weekly-update\\\".\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The changelog was successfully updated.\"\n          },\n          \"404\": {\n            \"description\": \"There is no changelog with that slug.\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/custompages\": {\n      \"get\": {\n        \"operationId\": \"getCustomPages\",\n        \"summary\": \"Get custom pages\",\n        \"description\": \"Returns a list of custom pages.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/perPage\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/page\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The list of custom pages.\",\n            \"headers\": {\n              \"Link\": {\n                \"$ref\": \"#/components/headers/link\"\n              },\n              \"x-total-count\": {\n                \"$ref\": \"#/components/headers/x-total-count\"\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createCustomPage\",\n        \"summary\": \"Create custom page\",\n        \"description\": \"Create a new custom page inside of this project.\",\n        \"tags\": [\"Custom Pages\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/customPage\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The custom page was successfully created.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/custompages/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getCustomPage\",\n        \"summary\": \"Get custom page\",\n        \"description\": \"Returns the custom page with this slug.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The custom page exists and has been returned.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateCustomPage\",\n        \"summary\": \"Update custom page\",\n        \"description\": \"Update a custom page with this slug.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/customPage\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The custom page was successfully updated.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteCustomPage\",\n        \"summary\": \"Delete custom page\",\n        \"description\": \"Delete the custom page with this slug.\",\n        \"tags\": [\"Custom Pages\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The custom page was successfully updated.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_CUSTOMPAGE_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs/{slug}\": {\n      \"get\": {\n        \"operationId\": \"getDoc\",\n        \"summary\": \"Get doc\",\n        \"description\": \"Returns the doc with this slug.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The doc exists and has been returned.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateDoc\",\n        \"summary\": \"Update doc\",\n        \"description\": \"Update a doc with this slug.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/docSchemaPut\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The doc was successfully updated.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_DOC_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteDoc\",\n        \"summary\": \"Delete doc\",\n        \"description\": \"Delete the doc with this slug.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The doc was successfully updated.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs/{slug}/production\": {\n      \"get\": {\n        \"operationId\": \"getProductionDoc\",\n        \"summary\": \"Get production doc\",\n        \"description\": \"This is intended for use by enterprise users with staging enabled. This endpoint will return the live version of your document, whereas the standard endpoint will always return staging.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/slug\"\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The doc exists and has been returned.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_DOC_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs\": {\n      \"post\": {\n        \"operationId\": \"createDoc\",\n        \"summary\": \"Create doc\",\n        \"description\": \"Create a new doc inside of this project.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/docSchemaPost\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"The doc was successfully created.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/docSchemaResponse\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_DOC_INVALID\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/docs/search\": {\n      \"post\": {\n        \"operationId\": \"searchDocs\",\n        \"summary\": \"Search docs\",\n        \"description\": \"Returns all docs that match the search.\",\n        \"tags\": [\"Docs\"],\n        \"parameters\": [\n          {\n            \"name\": \"search\",\n            \"in\": \"query\",\n            \"description\": \"Search string to look for.\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"$ref\": \"#/components/parameters/x-readme-version\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The search was successful and results were returned.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/\": {\n      \"get\": {\n        \"operationId\": \"getProject\",\n        \"summary\": \"Get metadata about the current project\",\n        \"description\": \"Returns project data for the API key.\",\n        \"tags\": [\"Projects\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Project data\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/condensedProjectData\"\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/schema\": {\n      \"get\": {\n        \"operationId\": \"getAPISchema\",\n        \"summary\": \"Get our OpenAPI Definition\",\n        \"description\": \"Returns a copy of our OpenAPI Definition.\",\n        \"tags\": [\"API Specification\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OpenAPI Definition data\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"additionalProperties\": true\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/version\": {\n      \"get\": {\n        \"operationId\": \"getVersions\",\n        \"summary\": \"Get versions\",\n        \"description\": \"Retrieve a list of versions associated with a project API key.\",\n        \"tags\": [\"Version\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A list of versions.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"operationId\": \"createVersion\",\n        \"summary\": \"Create version\",\n        \"description\": \"Create a new version.\",\n        \"tags\": [\"Version\"],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/version\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version was successfully created.\"\n          },\n          \"400\": {\n            \"description\": \"There was a validation error during creation.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/error_VERSION_EMPTY\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_VERSION_DUPLICATE\"\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/error_VERSION_FORK_EMPTY\"\n                    }\n                  ]\n                }\n              }\n            }\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_FORK_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    },\n    \"/version/{versionId}\": {\n      \"get\": {\n        \"operationId\": \"getVersion\",\n        \"summary\": \"Get version\",\n        \"description\": \"Returns the version with this version ID.\",\n        \"tags\": [\"Version\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/versionId\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version exists and has been returned.\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"operationId\": \"updateVersion\",\n        \"summary\": \"Update version\",\n        \"description\": \"Update an existing version.\",\n        \"tags\": [\"Version\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/versionId\"\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/version\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version was successfully updated.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_VERSION_CANT_DEMOTE_STABLE\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      },\n      \"delete\": {\n        \"operationId\": \"deleteVersion\",\n        \"summary\": \"Delete version\",\n        \"description\": \"Delete a version\",\n        \"tags\": [\"Version\"],\n        \"parameters\": [\n          {\n            \"$ref\": \"#/components/parameters/versionId\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The version was successfully deleted.\"\n          },\n          \"400\": {\n            \"$ref\": \"#/components/responses/error_VERSION_CANT_REMOVE_STABLE\"\n          },\n          \"401\": {\n            \"$ref\": \"#/components/responses/authUnauthorized\"\n          },\n          \"403\": {\n            \"$ref\": \"#/components/responses/authForbidden\"\n          },\n          \"404\": {\n            \"$ref\": \"#/components/responses/error_VERSION_NOTFOUND\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey\": []\n          }\n        ]\n      }\n    }\n  },\n  \"components\": {\n    \"securitySchemes\": {\n      \"apiKey\": {\n        \"type\": \"http\",\n        \"scheme\": \"basic\"\n      }\n    },\n    \"headers\": {\n      \"link\": {\n        \"description\": \"Pagination information. See https://docs.readme.com/main/reference/pagination for more information.\",\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      },\n      \"x-total-count\": {\n        \"description\": \"The total amount of results, ignoring pagination. See https://docs.readme.com/main/reference/pagination for more information about pagination.\",\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"parameters\": {\n      \"slug\": {\n        \"name\": \"slug\",\n        \"in\": \"path\",\n        \"description\": \"A URL-safe representation of the page title. Slugs must be all lowercase, and replace spaces with hyphens. For example, for the title \\\"Getting Started\\\", enter the slug \\\"getting-started\\\".\",\n        \"required\": true,\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      },\n      \"page\": {\n        \"name\": \"page\",\n        \"in\": \"query\",\n        \"description\": \"Used to specify further pages (starts at 1).\",\n        \"schema\": {\n          \"type\": \"integer\",\n          \"default\": 1,\n          \"minimum\": 1\n        }\n      },\n      \"perPage\": {\n        \"name\": \"perPage\",\n        \"in\": \"query\",\n        \"description\": \"Number of items to include in pagination (up to 100, defaults to 10).\",\n        \"schema\": {\n          \"type\": \"integer\",\n          \"default\": 10,\n          \"minimum\": 1,\n          \"maximum\": 100\n        }\n      },\n      \"x-readme-version\": {\n        \"in\": \"header\",\n        \"name\": \"x-readme-version\",\n        \"description\": \"Version number of your docs project, for example, v3.0. By default the main project version is used. To see all valid versions for your docs project call https://docs.readme.com/main/reference/version#getversions.\",\n        \"example\": \"v3.0\",\n        \"required\": false,\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      },\n      \"versionId\": {\n        \"name\": \"versionId\",\n        \"in\": \"path\",\n        \"description\": \"Semver identifier for the project version. For best results, use the formatted `version_clean` value listed in the response from the [Get Versions endpoint](/reference/getversions).\",\n        \"example\": \"v1.0.0\",\n        \"required\": true,\n        \"schema\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"responses\": {\n      \"authForbidden\": {\n        \"description\": \"Unauthorized\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/error_APIKEY_MISMATCH\"\n                }\n              ]\n            }\n          }\n        }\n      },\n      \"authUnauthorized\": {\n        \"description\": \"Unauthorized\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/error_APIKEY_EMPTY\"\n                },\n                {\n                  \"$ref\": \"#/components/schemas/error_APIKEY_NOTFOUND\"\n                }\n              ]\n            }\n          }\n        }\n      },\n      \"error_APIKEY_EMPTY\": {\n        \"description\": \"An API key was not supplied.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APIKEY_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_APIKEY_MISMATCH\": {\n        \"description\": \"The API key doesn't match the project.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APIKEY_MISMATCH\"\n            }\n          }\n        }\n      },\n      \"error_APIKEY_NOTFOUND\": {\n        \"description\": \"The API key couldn't be located.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APIKEY_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_APPLY_INVALID_EMAIL\": {\n        \"description\": \"You need to provide a valid email.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APPLY_INVALID_EMAIL\"\n            }\n          }\n        }\n      },\n      \"error_APPLY_INVALID_JOB\": {\n        \"description\": \"You need to provide a job.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APPLY_INVALID_JOB\"\n            }\n          }\n        }\n      },\n      \"error_APPLY_INVALID_NAME\": {\n        \"description\": \"You need to provide a name.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_APPLY_INVALID_NAME\"\n            }\n          }\n        }\n      },\n      \"error_CATEGORY_INVALID\": {\n        \"description\": \"The category couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CATEGORY_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_CATEGORY_NOTFOUND\": {\n        \"description\": \"The category couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CATEGORY_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_CHANGELOG_INVALID\": {\n        \"description\": \"The changelog couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CHANGELOG_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_CHANGELOG_NOTFOUND\": {\n        \"description\": \"The changelog couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CHANGELOG_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_CUSTOMPAGE_INVALID\": {\n        \"description\": \"The page couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CUSTOMPAGE_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_CUSTOMPAGE_NOTFOUND\": {\n        \"description\": \"The custom page couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_CUSTOMPAGE_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_DOC_INVALID\": {\n        \"description\": \"The doc couldn't be saved.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_DOC_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_DOC_NOTFOUND\": {\n        \"description\": \"The doc couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_DOC_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_ENDPOINT_NOTFOUND\": {\n        \"description\": \"The endpoint doesn't exist.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_ENDPOINT_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_INTERNAL_ERROR\": {\n        \"description\": \"An unknown error has occurred.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_INTERNAL_ERROR\"\n            }\n          }\n        }\n      },\n      \"error_PROJECT_NEEDSSTAGING\": {\n        \"description\": \"The project does not have staging enabled.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_PROJECT_NEEDSSTAGING\"\n            }\n          }\n        }\n      },\n      \"error_PROJECT_NOTFOUND\": {\n        \"description\": \"The project couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_PROJECT_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_RATE_LIMITED\": {\n        \"description\": \"The request has been rate limited.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_RATE_LIMITED\"\n            }\n          }\n        }\n      },\n      \"error_REGISTRY_INVALID\": {\n        \"description\": \"The registry entry couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_REGISTRY_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_REGISTRY_NOTFOUND\": {\n        \"description\": \"The registry entry couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_REGISTRY_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_FILE_EMPTY\": {\n        \"description\": \"A spec file wasn't included.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_FILE_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_ID_DUPLICATE\": {\n        \"description\": \"The spec ID already tied to another version.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_ID_DUPLICATE\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_ID_INVALID\": {\n        \"description\": \"The spec ID isn't valid.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_ID_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_INVALID\": {\n        \"description\": \"The uploaded spec isn't valid JSON or YAML.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_INVALID_SCHEMA\": {\n        \"description\": \"The uploaded spec has OpenAPI validation errors.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_INVALID_SCHEMA\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_NOTFOUND\": {\n        \"description\": \"The spec couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_TIMEOUT\": {\n        \"description\": \"The spec upload timed out.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_TIMEOUT\"\n            }\n          }\n        }\n      },\n      \"error_SPEC_VERSION_NOTFOUND\": {\n        \"description\": \"The spec version couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_SPEC_VERSION_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_UNEXPECTED_ERROR\": {\n        \"description\": \"An unknown error has occurred.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_UNEXPECTED_ERROR\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_CANT_DEMOTE_STABLE\": {\n        \"description\": \"A stable version can't be demoted.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_CANT_DEMOTE_STABLE\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_CANT_REMOVE_STABLE\": {\n        \"description\": \"A stable version can't be removed.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_CANT_REMOVE_STABLE\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_DUPLICATE\": {\n        \"description\": \"The version already exists.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_DUPLICATE\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_EMPTY\": {\n        \"description\": \"No version was supplied.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_FORK_EMPTY\": {\n        \"description\": \"New versions need to be forked from an existing version.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_FORK_EMPTY\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_FORK_NOTFOUND\": {\n        \"description\": \"The version couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_FORK_NOTFOUND\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_INVALID\": {\n        \"description\": \"The version is invalid.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_INVALID\"\n            }\n          }\n        }\n      },\n      \"error_VERSION_NOTFOUND\": {\n        \"description\": \"The version couldn't be found.\",\n        \"content\": {\n          \"application/json\": {\n            \"schema\": {\n              \"$ref\": \"#/components/schemas/error_VERSION_NOTFOUND\"\n            }\n          }\n        }\n      }\n    },\n    \"schemas\": {\n      \"baseError\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"error\": {\n            \"type\": \"string\",\n            \"description\": \"An error code unique to the error received.\"\n          },\n          \"message\": {\n            \"type\": \"string\",\n            \"description\": \"The reason why the error occured.\"\n          },\n          \"suggestion\": {\n            \"type\": \"string\",\n            \"description\": \"A helpful suggestion for how to alleviate the error.\"\n          },\n          \"docs\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"A [ReadMe Metrics](https://readme.com/metrics/) log URL where you can see more information the request that you made. If we have metrics URLs unavailable for your request, this URL will be a URL to our API Reference.\",\n            \"example\": \"https://docs.readme.com/logs/6883d0ee-cf79-447a-826f-a48f7d5bdf5f\"\n          },\n          \"help\": {\n            \"type\": \"string\",\n            \"description\": \"Information on where you can receive additional assistance from our wonderful support team.\",\n            \"example\": \"If you need help, email support@readme.io\"\n          },\n          \"poem\": {\n            \"type\": \"array\",\n            \"description\": \"A short poem we wrote you about your error.\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"example\": [\n              \"If you're seeing this error,\",\n              \"Things didn't quite go the way we hoped.\",\n              \"When we tried to process your request,\",\n              \"Maybe trying again it'll work—who knows!\"\n            ]\n          }\n        }\n      },\n      \"apply\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"description\": \"Your full name\",\n            \"default\": \"Your Name\"\n          },\n          \"email\": {\n            \"type\": \"string\",\n            \"format\": \"email\",\n            \"description\": \"A valid email we can reach you at.\",\n            \"default\": \"you@example.com\"\n          },\n          \"job\": {\n            \"type\": \"string\",\n            \"description\": \"The job you're looking to apply for (https://readme.com/careers).\",\n            \"enum\": [\n              \"Front End Engineer\",\n              \"Full Stack Engineer\",\n              \"Head of Product\",\n              \"Head of Solutions Engineering\",\n              \"Product Designer\"\n            ],\n            \"default\": \"Front End Engineer\"\n          },\n          \"pronouns\": {\n            \"type\": \"string\",\n            \"description\": \"Learn more at https://lgbtlifecenter.org/pronouns/\"\n          },\n          \"linkedin\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"What have you been up to the past few years?\"\n          },\n          \"github\": {\n            \"type\": \"string\",\n            \"description\": \"Or Bitbucket, Gitlab or anywhere else your code is hosted!\",\n            \"format\": \"url\"\n          },\n          \"coverLetter\": {\n            \"type\": \"string\",\n            \"format\": \"blob\",\n            \"description\": \"What should we know about you?\"\n          },\n          \"dontReallyApply\": {\n            \"type\": \"boolean\",\n            \"description\": \"Want to play with the API but not actually apply? Set this to true.\",\n            \"default\": false\n          }\n        },\n        \"required\": [\"name\", \"email\", \"job\"]\n      },\n      \"category\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"A short title for the category. This is what will show in the sidebar.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\"reference\", \"guide\"],\n            \"default\": \"guide\",\n            \"description\": \"A category can be part of your reference or guide documentation, which is determined by this field.\"\n          }\n        }\n      },\n      \"changelog\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the changelog.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"default\": \"\",\n            \"enum\": [\"\", \"added\", \"fixed\", \"improved\", \"deprecated\", \"removed\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the changelog.\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the changelog.\",\n            \"default\": true\n          }\n        },\n        \"required\": [\"title\", \"body\"]\n      },\n      \"condensedProjectData\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"subdomain\": {\n            \"type\": \"string\"\n          },\n          \"jwtSecret\": {\n            \"type\": \"string\"\n          },\n          \"baseUrl\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"The base URL for the project. If the project is not running under a custom domain, it will be `https://projectSubdomain.readme.io`, otherwise it can either be or `https://example.com` or, in the case of an enterprise child project `https://example.com/projectSubdomain`.\"\n          },\n          \"plan\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"customPage\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the custom page.\"\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body formatted in Markdown (displayed by default).\"\n          },\n          \"html\": {\n            \"type\": \"string\",\n            \"description\": \"Body formatted in HTML (sanitized, only displayed if `htmlmode` is **true**).\"\n          },\n          \"htmlmode\": {\n            \"type\": \"boolean\",\n            \"description\": \"**true** if `html` should be displayed, **false** if `body` should be displayed.\",\n            \"default\": false\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the custom page.\",\n            \"default\": true\n          }\n        },\n        \"required\": [\"title\"]\n      },\n      \"docSchemaPost\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the page.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"description\": \"Type of the page. The available types all show up under the /docs/ URL path of your docs project (also known as the \\\"guides\\\" section). Can be \\\"basic\\\" (most common), \\\"error\\\" (page desribing an API error), or \\\"link\\\" (page that redirects to an external link).\",\n            \"enum\": [\"basic\", \"error\", \"link\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the page, formatted in [ReadMe-flavored Markdown](https://docs.readme.com/rdmd/docs).\"\n          },\n          \"category\": {\n            \"type\": \"string\",\n            \"description\": \"Category ID of the page, which you can get through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories).\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the page.\"\n          },\n          \"order\": {\n            \"type\": \"integer\",\n            \"description\": \"The position of the page in your project sidebar.\",\n            \"example\": 999\n          },\n          \"parentDoc\": {\n            \"type\": \"string\",\n            \"description\": \"The parent doc's ID, if the page is a subpage.\"\n          },\n          \"error\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"code\": {\n                \"type\": \"string\",\n                \"description\": \"The error code for docs with the \\\"error\\\" type.\"\n              }\n            }\n          },\n          \"categorySlug\": {\n            \"type\": \"string\",\n            \"description\": \"The slug of the category this page is associated with. You can get this through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories). This field is an alternative to the `category` field.\"\n          },\n          \"parentDocSlug\": {\n            \"type\": \"string\",\n            \"description\": \"If this page is a subpage, this field will be the slug of the parent document. You can get this through https://docs.readme.com/main/reference/docs#getdoc. This field is an alternative to the `parentDoc` field.\"\n          }\n        },\n        \"oneOf\": [\n          {\n            \"required\": [\"title\", \"category\"],\n            \"title\": \"`category` Parameter\"\n          },\n          {\n            \"required\": [\"title\", \"categorySlug\"],\n            \"title\": \"`categorySlug` Parameter\"\n          }\n        ],\n        \"additionalProperties\": true\n      },\n      \"docSchemaPut\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the page.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"description\": \"Type of the page. The available types all show up under the /docs/ URL path of your docs project (also known as the \\\"guides\\\" section). Can be \\\"basic\\\" (most common), \\\"error\\\" (page desribing an API error), or \\\"link\\\" (page that redirects to an external link).\",\n            \"enum\": [\"basic\", \"error\", \"link\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the page, formatted in [ReadMe-flavored Markdown](https://docs.readme.com/rdmd/docs).\"\n          },\n          \"category\": {\n            \"type\": \"string\",\n            \"description\": \"Category ID of the page, which you can get through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories).\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the page.\"\n          },\n          \"order\": {\n            \"type\": \"integer\",\n            \"description\": \"The position of the page in your project sidebar.\",\n            \"example\": 999\n          },\n          \"parentDoc\": {\n            \"type\": \"string\",\n            \"description\": \"The parent doc's ID, if the page is a subpage.\"\n          },\n          \"error\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"code\": {\n                \"type\": \"string\",\n                \"description\": \"The error code for docs with the \\\"error\\\" type.\"\n              }\n            }\n          },\n          \"categorySlug\": {\n            \"type\": \"string\",\n            \"description\": \"The slug of the category this page is associated with. You can get this through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories). This field is an alternative to the `category` field.\"\n          },\n          \"parentDocSlug\": {\n            \"type\": \"string\",\n            \"description\": \"If this page is a subpage, this field will be the slug of the parent document. You can get this through https://docs.readme.com/main/reference/docs#getdoc. This field is an alternative to the `parentDoc` field.\"\n          }\n        },\n        \"additionalProperties\": true\n      },\n      \"docSchemaResponse\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"Title of the page.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"description\": \"Type of the page. The available types all show up under the /docs/ URL path of your docs project (also known as the \\\"guides\\\" section). Can be \\\"basic\\\" (most common), \\\"error\\\" (page desribing an API error), or \\\"link\\\" (page that redirects to an external link).\",\n            \"enum\": [\"basic\", \"error\", \"link\"]\n          },\n          \"body\": {\n            \"type\": \"string\",\n            \"description\": \"Body content of the page, formatted in [ReadMe-flavored Markdown](https://docs.readme.com/rdmd/docs).\"\n          },\n          \"category\": {\n            \"type\": \"string\",\n            \"description\": \"Category ID of the page, which you can get through [the **Get all categories** endpoint](https://docs.readme.com/main/reference/getcategories).\"\n          },\n          \"hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Visibility of the page.\"\n          },\n          \"order\": {\n            \"type\": \"integer\",\n            \"description\": \"The position of the page in your project sidebar.\",\n            \"example\": 999\n          },\n          \"parentDoc\": {\n            \"type\": \"string\",\n            \"description\": \"The parent doc's ID, if the page is a subpage.\"\n          },\n          \"error\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"code\": {\n                \"type\": \"string\",\n                \"description\": \"The error code for docs with the \\\"error\\\" type.\"\n              }\n            }\n          }\n        },\n        \"additionalProperties\": true\n      },\n      \"version\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Semantic Version\"\n          },\n          \"codename\": {\n            \"type\": \"string\",\n            \"description\": \"Dubbed name of version.\"\n          },\n          \"from\": {\n            \"type\": \"string\",\n            \"description\": \"Semantic Version to use as the base fork.\"\n          },\n          \"is_stable\": {\n            \"type\": \"boolean\",\n            \"description\": \"Should this be the **main** version?\"\n          },\n          \"is_beta\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"is_hidden\": {\n            \"type\": \"boolean\",\n            \"description\": \"Should this be publically accessible?\"\n          },\n          \"is_deprecated\": {\n            \"type\": \"boolean\",\n            \"description\": \"Should this be deprecated? Only allowed in PUT operations.\"\n          }\n        },\n        \"required\": [\"version\", \"from\"]\n      },\n      \"jobOpening\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"slug\": {\n            \"type\": \"string\",\n            \"description\": \"A slugified version of the job opening title.\",\n            \"example\": \"api-engineer\"\n          },\n          \"title\": {\n            \"type\": \"string\",\n            \"description\": \"The job opening position.\",\n            \"example\": \"API Engineer\"\n          },\n          \"description\": {\n            \"type\": \"string\",\n            \"description\": \"The description for this open position. This content is formatted as HTML.\"\n          },\n          \"pullquote\": {\n            \"type\": \"string\",\n            \"description\": \"A short pullquote for the open position.\",\n            \"example\": \"Deeply knowledgeable of the web, HTTP, and the API space.\"\n          },\n          \"location\": {\n            \"type\": \"string\",\n            \"description\": \"Where this position is located at.\",\n            \"example\": \"Remote\"\n          },\n          \"department\": {\n            \"type\": \"string\",\n            \"description\": \"The internal organization you'll be working in.\",\n            \"example\": \"Engineering\"\n          },\n          \"url\": {\n            \"type\": \"string\",\n            \"format\": \"url\",\n            \"description\": \"The place where you can apply for the position!\"\n          }\n        }\n      },\n      \"error_APIKEY_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APIKEY_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APIKEY_MISMATCH\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APIKEY_MISMATCH\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APIKEY_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APIKEY_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APPLY_INVALID_EMAIL\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APPLY_INVALID_EMAIL\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APPLY_INVALID_JOB\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APPLY_INVALID_JOB\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_APPLY_INVALID_NAME\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"APPLY_INVALID_NAME\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CATEGORY_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CATEGORY_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CATEGORY_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CATEGORY_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CHANGELOG_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CHANGELOG_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CHANGELOG_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CHANGELOG_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CUSTOMPAGE_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CUSTOMPAGE_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_CUSTOMPAGE_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"CUSTOMPAGE_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_DOC_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"DOC_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_DOC_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"DOC_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_ENDPOINT_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"ENDPOINT_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_INTERNAL_ERROR\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"INTERNAL_ERROR\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_PROJECT_NEEDSSTAGING\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"PROJECT_NEEDSSTAGING\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_PROJECT_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"PROJECT_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_RATE_LIMITED\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"RATE_LIMITED\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_REGISTRY_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"REGISTRY_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_REGISTRY_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"REGISTRY_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_FILE_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_FILE_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_ID_DUPLICATE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_ID_DUPLICATE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_ID_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_ID_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_INVALID_SCHEMA\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_INVALID_SCHEMA\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_TIMEOUT\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_TIMEOUT\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_SPEC_VERSION_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"SPEC_VERSION_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_UNEXPECTED_ERROR\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"UNEXPECTED_ERROR\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_CANT_DEMOTE_STABLE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_CANT_DEMOTE_STABLE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_CANT_REMOVE_STABLE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_CANT_REMOVE_STABLE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_DUPLICATE\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_DUPLICATE\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_FORK_EMPTY\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_FORK_EMPTY\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_FORK_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_FORK_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_INVALID\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_INVALID\"\n              }\n            }\n          }\n        ]\n      },\n      \"error_VERSION_NOTFOUND\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/baseError\"\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"error\": {\n                \"type\": \"string\",\n                \"default\": \"VERSION_NOTFOUND\"\n              }\n            }\n          }\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/security.json",
    "content": "{\n  \"openapi\": \"3.0.3\",\n  \"info\": {\n    \"version\": \"1.0.0\",\n    \"title\": \"Support for different security types\",\n    \"description\": \"https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#securitySchemeObject\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://httpbin.org\"\n    }\n  ],\n  \"tags\": [\n    {\n      \"name\": \"API Key\"\n    },\n    {\n      \"name\": \"HTTP\"\n    },\n    {\n      \"name\": \"OAuth 2\"\n    },\n    {\n      \"name\": \"OpenID Connect\"\n    },\n    {\n      \"name\": \"Other\"\n    }\n  ],\n  \"paths\": {\n    \"/anything/apiKey\": {\n      \"get\": {\n        \"summary\": \"Query parameter\",\n        \"description\": \"`apiKey` auth will be supplied within an `apiKey` query parameter.\",\n        \"tags\": [\"API Key\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": []\n          }\n        ]\n      },\n      \"post\": {\n        \"summary\": \"Cookie\",\n        \"description\": \"`apiKey` auth will be supplied within an `api_key` cookie.\",\n        \"tags\": [\"API Key\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_cookie\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"Header\",\n        \"description\": \"`apiKey` auth will be supplied within an `X-API-KEY` header.\",\n        \"tags\": [\"API Key\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": []\n          }\n        ]\n      }\n    },\n    \"/anything/basic\": {\n      \"post\": {\n        \"summary\": \"Basic\",\n        \"description\": \"Authentication credentials will be supplied within a `Basic` `Authorization` header.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"tags\": [\"HTTP\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"basic\": []\n          }\n        ]\n      }\n    },\n    \"/anything/bearer\": {\n      \"post\": {\n        \"summary\": \"Bearer\",\n        \"description\": \"Authentication credentials will be supplied within a `Bearer` `Authorization` header.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"tags\": [\"HTTP\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"bearer\": []\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"Bearer (`jwt` format)\",\n        \"description\": \"Authentication credentials will be supplied within a `Bearer` `Authorization` header, but its data should be controlled as a JWT.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\\n\\n> ℹ️\\n> We currently do not support any special handling for this so they're handled as a standard `Bearer` authentication token.\",\n        \"tags\": [\"HTTP\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"bearer_jwt\": []\n          }\n        ]\n      }\n    },\n    \"/anything/oauth2\": {\n      \"post\": {\n        \"summary\": \"General support (all flow types)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2\": [\"write:things\"]\n          }\n        ]\n      },\n      \"get\": {\n        \"summary\": \"General support (authorizationCode flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_authorizationCode\": [\"write:things\"]\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"General support (clientCredentials flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_clientCredentials\": [\"write:things\"]\n          }\n        ]\n      },\n      \"patch\": {\n        \"summary\": \"General support (implicit flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_implicit\": [\"write:things\"]\n          }\n        ]\n      },\n      \"delete\": {\n        \"summary\": \"General support (password flow type)\",\n        \"description\": \"> ℹ️\\n> We currently do not handle OAuth 2 authentication flows so if an operation has an `oauth2` requirement we assume that the user, or the projects JWT, has a qualified `bearer` token and will use that.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"tags\": [\"OAuth 2\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"oauth2_password\": [\"write:things\"]\n          }\n        ]\n      }\n    },\n    \"/anything/openIdConnect\": {\n      \"post\": {\n        \"summary\": \"General support\",\n        \"description\": \"🚧 This is not supported.\",\n        \"tags\": [\"OpenID Connect\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"openIdConnect\": []\n          }\n        ]\n      }\n    },\n    \"/anything/no-auth\": {\n      \"post\": {\n        \"summary\": \"No auth requirements\",\n        \"description\": \"This operation does not have any authentication requirements.\",\n        \"tags\": [\"Other\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        }\n      }\n    },\n    \"/anything/optional-auth\": {\n      \"get\": {\n        \"summary\": \"Optional auth\",\n        \"description\": \"The `apiKey` query parameter auth on this operation is optional.\\n\\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object\",\n        \"tags\": [\"Other\"],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": []\n          },\n          {}\n        ]\n      }\n    },\n    \"/status/401\": {\n      \"post\": {\n        \"summary\": \"Forced invalid authentication\",\n        \"description\": \"This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\",\n        \"tags\": [\"Other\"],\n        \"responses\": {\n          \"401\": {\n            \"description\": \"Unauthorized\"\n          }\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": []\n          }\n        ]\n      }\n    }\n  },\n  \"components\": {\n    \"securitySchemes\": {\n      \"apiKey_cookie\": {\n        \"type\": \"apiKey\",\n        \"in\": \"cookie\",\n        \"name\": \"api_key\",\n        \"description\": \"An API key that will be supplied in a named cookie. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\"\n      },\n      \"apiKey_header\": {\n        \"type\": \"apiKey\",\n        \"in\": \"header\",\n        \"name\": \"X-API-KEY\",\n        \"description\": \"An API key that will be supplied in a named header. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\"\n      },\n      \"apiKey_query\": {\n        \"type\": \"apiKey\",\n        \"in\": \"query\",\n        \"name\": \"apiKey\",\n        \"description\": \"An API key that will be supplied in a named query parameter. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\"\n      },\n      \"basic\": {\n        \"type\": \"http\",\n        \"scheme\": \"basic\",\n        \"description\": \"Basic auth that takes a base64'd combination of `user:password`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\"\n      },\n      \"bearer\": {\n        \"type\": \"http\",\n        \"scheme\": \"bearer\",\n        \"description\": \"A bearer token that will be supplied within an `Authentication` header as `bearer <token>`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\"\n      },\n      \"bearer_jwt\": {\n        \"type\": \"http\",\n        \"scheme\": \"bearer\",\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"A bearer token that will be supplied within an `Authentication` header as `bearer <token>`. In this case, the format of the token is specified as JWT. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#jwt-bearer-sample\"\n      },\n      \"oauth2\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          },\n          \"clientCredentials\": {\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          },\n          \"implicit\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          },\n          \"password\": {\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_authorizationCode\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `authorizationCode` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_clientCredentials\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `clientCredentials` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_implicit\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `implicit` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"implicit\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"oauth2_password\": {\n        \"type\": \"oauth2\",\n        \"description\": \"An OAuth 2 security flow that only supports the `password` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"password\": {\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\"\n            }\n          }\n        }\n      },\n      \"openIdConnect\": {\n        \"type\": \"openIdConnect\",\n        \"openIdConnectUrl\": \"https://example.com/.well-known/openid-configuration\",\n        \"description\": \"OpenAPI authentication. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/fixtures/tic-tac-toe.json",
    "content": "{\n  \"openapi\": \"3.1.0\",\n  \"info\": {\n    \"title\": \"Tic Tac Toe\",\n    \"description\": \"This API allows writing down marks on a Tic Tac Toe board\\nand requesting the state of the board or of individual squares.\\n\",\n    \"version\": \"1.0.0\"\n  },\n  \"tags\": [\n    {\n      \"name\": \"Gameplay\"\n    }\n  ],\n  \"paths\": {\n    \"/board\": {\n      \"get\": {\n        \"summary\": \"Get the whole board\",\n        \"description\": \"Retrieves the current state of the board and the winner.\",\n        \"tags\": [\"Gameplay\"],\n        \"operationId\": \"get-board\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\"\n                }\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"defaultApiKey\": []\n          },\n          {\n            \"app2AppOauth\": [\"board:read\"]\n          }\n        ]\n      }\n    },\n    \"/board/{row}/{column}\": {\n      \"parameters\": [\n        {\n          \"$ref\": \"#/components/parameters/rowParam\"\n        },\n        {\n          \"$ref\": \"#/components/parameters/columnParam\"\n        }\n      ],\n      \"get\": {\n        \"summary\": \"Get a single board square\",\n        \"description\": \"Retrieves the requested square.\",\n        \"tags\": [\"Gameplay\"],\n        \"operationId\": \"get-square\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/mark\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"The provided parameters are incorrect\",\n            \"content\": {\n              \"text/html\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\"\n                },\n                \"example\": \"Illegal coordinates\"\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": []\n          },\n          {\n            \"user2AppOauth\": [\"board:read\"]\n          }\n        ]\n      },\n      \"put\": {\n        \"summary\": \"Set a single board square\",\n        \"description\": \"Places a mark on the board and retrieves the whole board and the winner (if any).\",\n        \"tags\": [\"Gameplay\"],\n        \"operationId\": \"put-square\",\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/mark\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\"\n                }\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"The provided parameters are incorrect\",\n            \"content\": {\n              \"text/html\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\"\n                },\n                \"examples\": {\n                  \"illegalCoordinates\": {\n                    \"value\": \"Illegal coordinates.\"\n                  },\n                  \"notEmpty\": {\n                    \"value\": \"Square is not empty.\"\n                  },\n                  \"invalidMark\": {\n                    \"value\": \"Invalid Mark (X or O).\"\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": []\n          },\n          {\n            \"user2AppOauth\": [\"board:write\"]\n          }\n        ]\n      }\n    }\n  },\n  \"components\": {\n    \"parameters\": {\n      \"rowParam\": {\n        \"description\": \"Board row (vertical coordinate)\",\n        \"name\": \"row\",\n        \"in\": \"path\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\"\n        }\n      },\n      \"columnParam\": {\n        \"description\": \"Board column (horizontal coordinate)\",\n        \"name\": \"column\",\n        \"in\": \"path\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\"\n        }\n      }\n    },\n    \"schemas\": {\n      \"errorMessage\": {\n        \"type\": \"string\",\n        \"maxLength\": 256,\n        \"description\": \"A text message describing an error\"\n      },\n      \"coordinate\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 3,\n        \"example\": 1\n      },\n      \"mark\": {\n        \"type\": \"string\",\n        \"enum\": [\".\", \"X\", \"O\"],\n        \"description\": \"Possible values for a board square. `.` means empty square.\",\n        \"example\": \".\"\n      },\n      \"board\": {\n        \"type\": \"array\",\n        \"maxItems\": 3,\n        \"minItems\": 3,\n        \"items\": {\n          \"type\": \"array\",\n          \"maxItems\": 3,\n          \"minItems\": 3,\n          \"items\": {\n            \"$ref\": \"#/components/schemas/mark\"\n          }\n        }\n      },\n      \"winner\": {\n        \"type\": \"string\",\n        \"enum\": [\".\", \"X\", \"O\"],\n        \"description\": \"Winner of the game. `.` means nobody has won yet.\",\n        \"example\": \".\"\n      },\n      \"status\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"winner\": {\n            \"$ref\": \"#/components/schemas/winner\"\n          },\n          \"board\": {\n            \"$ref\": \"#/components/schemas/board\"\n          }\n        }\n      }\n    },\n    \"securitySchemes\": {\n      \"defaultApiKey\": {\n        \"description\": \"API key provided in console\",\n        \"type\": \"apiKey\",\n        \"name\": \"api-key\",\n        \"in\": \"header\"\n      },\n      \"basicHttpAuthentication\": {\n        \"description\": \"Basic HTTP Authentication\",\n        \"type\": \"http\",\n        \"scheme\": \"Basic\"\n      },\n      \"bearerHttpAuthentication\": {\n        \"description\": \"Bearer token using a JWT\",\n        \"type\": \"http\",\n        \"scheme\": \"Bearer\",\n        \"bearerFormat\": \"JWT\"\n      },\n      \"app2AppOauth\": {\n        \"type\": \"oauth2\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n            \"scopes\": {\n              \"board:read\": \"Read the board\"\n            }\n          }\n        }\n      },\n      \"user2AppOauth\": {\n        \"type\": \"oauth2\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://learn.openapis.org/oauth/2.0/auth\",\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n              \"board:write\": \"Write to the board\"\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-openapi-utils\",\n  \"version\": \"8.4.4\",\n  \"description\": \"OpenAPI utilities used by the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/openapi-utils\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@apideck/better-ajv-errors\": \"catalog:\",\n    \"@redocly/openapi-core\": \"catalog:\",\n    \"ajv\": \"catalog:\",\n    \"ajv-formats\": \"catalog:\",\n    \"camelcase\": \"catalog:\",\n    \"decamelize\": \"catalog:\",\n    \"fast-uri\": \"catalog:\",\n    \"plur\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@hono/node-server\": \"catalog:\",\n    \"hono\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/platform-openapi-utils\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform-openapi-utils.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-openapi-utils <!-- omit from toc -->\n\n> OpenAPI utilities used by the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n> [!TIP]\n> You likely don't need this package directly. See [@agentic/cli](https://github.com/transitive-bullshit/agentic/tree/main/packages/cli), [@agentic/platform](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform), and [@agentic/platform-tool-client](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform-tool-client) for more public-facing packages.\n\n## Install\n\n```bash\nnpm i @agentic/platform-openapi-utils\n```\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/openapi-utils/src/__snapshots__/get-tools-from-openapi-spec.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`getToolsFromOpenAPISpec > basic.json 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"echo\": {\n      \"method\": \"get\",\n      \"operationId\": \"echo\",\n      \"parameterSources\": {\n        \"name\": \"query\",\n      },\n      \"path\": \"/\",\n      \"tags\": undefined,\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"Echo\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"name\": {\n            \"title\": \"name\",\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"echo\",\n      \"outputSchema\": undefined,\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > firecrawl.json 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"cancel_crawl_job\": {\n      \"method\": \"delete\",\n      \"operationId\": \"cancelCrawlJob\",\n      \"parameterSources\": {\n        \"jobId\": \"path\",\n      },\n      \"path\": \"/crawl/cancel/{jobId}\",\n      \"tags\": [\n        \"Crawl\",\n      ],\n    },\n    \"crawl_urls\": {\n      \"method\": \"post\",\n      \"operationId\": \"crawlUrls\",\n      \"parameterSources\": {\n        \"crawlerOptions\": \"body\",\n        \"pageOptions\": \"body\",\n        \"url\": \"body\",\n      },\n      \"path\": \"/crawl\",\n      \"tags\": [\n        \"Crawling\",\n      ],\n    },\n    \"get_crawl_status\": {\n      \"method\": \"get\",\n      \"operationId\": \"getCrawlStatus\",\n      \"parameterSources\": {\n        \"jobId\": \"path\",\n      },\n      \"path\": \"/crawl/status/{jobId}\",\n      \"tags\": [\n        \"Crawl\",\n      ],\n    },\n    \"scrape\": {\n      \"method\": \"post\",\n      \"operationId\": \"scrape\",\n      \"parameterSources\": {\n        \"excludeTags\": \"body\",\n        \"formats\": \"body\",\n        \"headers\": \"body\",\n        \"includeTags\": \"body\",\n        \"onlyMainContent\": \"body\",\n        \"timeout\": \"body\",\n        \"url\": \"body\",\n        \"waitFor\": \"body\",\n      },\n      \"path\": \"/scrape\",\n      \"tags\": [\n        \"Scraping\",\n      ],\n    },\n    \"search_google\": {\n      \"method\": \"post\",\n      \"operationId\": \"searchGoogle\",\n      \"parameterSources\": {\n        \"pageOptions\": \"body\",\n        \"query\": \"body\",\n        \"searchOptions\": \"body\",\n      },\n      \"path\": \"/search\",\n      \"tags\": [\n        \"Search\",\n      ],\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"Scrape a single URL\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"excludeTags\": {\n            \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"formats\": {\n            \"default\": [\n              \"markdown\",\n            ],\n            \"description\": \"Specific formats to return.\n\n - markdown: The page in Markdown format.\n - html: The page's HTML, trimmed to include only meaningful content.\n - rawHtml: The page's original HTML.\n - links: The links on the page.\n - screenshot: A screenshot of the top of the page.\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\",\n            \"items\": {\n              \"enum\": [\n                \"markdown\",\n                \"html\",\n                \"rawHtml\",\n                \"links\",\n                \"screenshot\",\n                \"screenshot@fullPage\",\n              ],\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"headers\": {\n            \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n            \"type\": \"object\",\n          },\n          \"includeTags\": {\n            \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"onlyMainContent\": {\n            \"default\": true,\n            \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n            \"type\": \"boolean\",\n          },\n          \"timeout\": {\n            \"default\": 30000,\n            \"description\": \"Timeout in milliseconds for the request\",\n            \"type\": \"integer\",\n          },\n          \"url\": {\n            \"description\": \"The URL to scrape\",\n            \"format\": \"uri\",\n            \"type\": \"string\",\n          },\n          \"waitFor\": {\n            \"default\": 0,\n            \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n            \"type\": \"integer\",\n          },\n        },\n        \"required\": [\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"scrape\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"data\": {\n            \"properties\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"warning\": {\n            \"description\": \"Warning message to let you know of any issues.\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Crawl multiple URLs based on options\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"crawlerOptions\": {\n            \"properties\": {\n              \"allowBackwardCrawling\": {\n                \"default\": false,\n                \"description\": \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\",\n                \"type\": \"boolean\",\n              },\n              \"allowExternalContentLinks\": {\n                \"default\": false,\n                \"description\": \"Allows the crawler to follow links to external websites.\",\n                \"type\": \"boolean\",\n              },\n              \"excludes\": {\n                \"description\": \"URL patterns to exclude\",\n                \"items\": {\n                  \"type\": \"string\",\n                },\n                \"type\": \"array\",\n              },\n              \"generateImgAltText\": {\n                \"default\": false,\n                \"description\": \"Generate alt text for images using LLMs (must have a paid plan)\",\n                \"type\": \"boolean\",\n              },\n              \"ignoreSitemap\": {\n                \"default\": false,\n                \"description\": \"Ignore the website sitemap when crawling\",\n                \"type\": \"boolean\",\n              },\n              \"includes\": {\n                \"description\": \"URL patterns to include\",\n                \"items\": {\n                  \"type\": \"string\",\n                },\n                \"type\": \"array\",\n              },\n              \"limit\": {\n                \"default\": 10000,\n                \"description\": \"Maximum number of pages to crawl\",\n                \"type\": \"integer\",\n              },\n              \"maxDepth\": {\n                \"description\": \"Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.\",\n                \"type\": \"integer\",\n              },\n              \"mode\": {\n                \"default\": \"default\",\n                \"description\": \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\",\n                \"enum\": [\n                  \"default\",\n                  \"fast\",\n                ],\n                \"type\": \"string\",\n              },\n              \"returnOnlyUrls\": {\n                \"default\": false,\n                \"description\": \"If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.\",\n                \"type\": \"boolean\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"pageOptions\": {\n            \"properties\": {\n              \"fullPageScreenshot\": {\n                \"default\": false,\n                \"description\": \"Include a full page screenshot of the page that you are scraping.\",\n                \"type\": \"boolean\",\n              },\n              \"headers\": {\n                \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n                \"type\": \"object\",\n              },\n              \"includeHtml\": {\n                \"default\": false,\n                \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                \"type\": \"boolean\",\n              },\n              \"includeRawHtml\": {\n                \"default\": false,\n                \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                \"type\": \"boolean\",\n              },\n              \"onlyIncludeTags\": {\n                \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n                \"items\": {\n                  \"type\": \"string\",\n                },\n                \"type\": \"array\",\n              },\n              \"onlyMainContent\": {\n                \"default\": false,\n                \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                \"type\": \"boolean\",\n              },\n              \"removeTags\": {\n                \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n                \"items\": {\n                  \"type\": \"string\",\n                },\n                \"type\": \"array\",\n              },\n              \"replaceAllPathsWithAbsolutePaths\": {\n                \"default\": false,\n                \"description\": \"Replace all relative paths with absolute paths for images and links\",\n                \"type\": \"boolean\",\n              },\n              \"screenshot\": {\n                \"default\": false,\n                \"description\": \"Include a screenshot of the top of the page that you are scraping.\",\n                \"type\": \"boolean\",\n              },\n              \"waitFor\": {\n                \"default\": 0,\n                \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                \"type\": \"integer\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"url\": {\n            \"description\": \"The base URL to start crawling from\",\n            \"format\": \"uri\",\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"crawl_urls\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"url\": {\n            \"format\": \"uri\",\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Search for a keyword in Google, returns top page results with markdown content for each page\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"pageOptions\": {\n            \"properties\": {\n              \"fetchPageContent\": {\n                \"default\": true,\n                \"description\": \"Fetch the content of each page. If false, defaults to a basic fast serp API.\",\n                \"type\": \"boolean\",\n              },\n              \"includeHtml\": {\n                \"default\": false,\n                \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                \"type\": \"boolean\",\n              },\n              \"includeRawHtml\": {\n                \"default\": false,\n                \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                \"type\": \"boolean\",\n              },\n              \"onlyMainContent\": {\n                \"default\": false,\n                \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                \"type\": \"boolean\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"query\": {\n            \"description\": \"The query to search for\",\n            \"format\": \"uri\",\n            \"type\": \"string\",\n          },\n          \"searchOptions\": {\n            \"properties\": {\n              \"limit\": {\n                \"description\": \"Maximum number of results. Max is 20 during beta.\",\n                \"type\": \"integer\",\n              },\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"query\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"search_google\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"data\": {\n            \"items\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"array\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Get the status of a crawl job\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"jobId\": {\n            \"description\": \"ID of the crawl job\",\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"jobId\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_crawl_status\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"current\": {\n            \"description\": \"Current page number\",\n            \"type\": \"integer\",\n          },\n          \"data\": {\n            \"description\": \"Data returned from the job (null when it is in progress)\",\n            \"items\": {\n              \"properties\": {\n                \"html\": {\n                  \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n                \"links\": {\n                  \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                  \"items\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"nullable\": true,\n                  \"type\": \"array\",\n                },\n                \"markdown\": {\n                  \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n                \"metadata\": {\n                  \"properties\": {\n                    \"<any other metadata> \": {\n                      \"type\": \"string\",\n                    },\n                    \"description\": {\n                      \"type\": \"string\",\n                    },\n                    \"error\": {\n                      \"description\": \"The error message of the page\",\n                      \"nullable\": true,\n                      \"type\": \"string\",\n                    },\n                    \"language\": {\n                      \"nullable\": true,\n                      \"type\": \"string\",\n                    },\n                    \"sourceURL\": {\n                      \"format\": \"uri\",\n                      \"type\": \"string\",\n                    },\n                    \"statusCode\": {\n                      \"description\": \"The status code of the page\",\n                      \"type\": \"integer\",\n                    },\n                    \"title\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n                \"rawHtml\": {\n                  \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n                \"screenshot\": {\n                  \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n              },\n              \"type\": \"object\",\n            },\n            \"type\": \"array\",\n          },\n          \"partial_data\": {\n            \"description\": \"Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in \\`data\\`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.\",\n            \"items\": {\n              \"properties\": {\n                \"html\": {\n                  \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n                \"links\": {\n                  \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                  \"items\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"nullable\": true,\n                  \"type\": \"array\",\n                },\n                \"markdown\": {\n                  \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n                \"metadata\": {\n                  \"properties\": {\n                    \"<any other metadata> \": {\n                      \"type\": \"string\",\n                    },\n                    \"description\": {\n                      \"type\": \"string\",\n                    },\n                    \"error\": {\n                      \"description\": \"The error message of the page\",\n                      \"nullable\": true,\n                      \"type\": \"string\",\n                    },\n                    \"language\": {\n                      \"nullable\": true,\n                      \"type\": \"string\",\n                    },\n                    \"sourceURL\": {\n                      \"format\": \"uri\",\n                      \"type\": \"string\",\n                    },\n                    \"statusCode\": {\n                      \"description\": \"The status code of the page\",\n                      \"type\": \"integer\",\n                    },\n                    \"title\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n                \"rawHtml\": {\n                  \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n                \"screenshot\": {\n                  \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                  \"nullable\": true,\n                  \"type\": \"string\",\n                },\n              },\n              \"type\": \"object\",\n            },\n            \"type\": \"array\",\n          },\n          \"status\": {\n            \"description\": \"Status of the job (completed, active, failed, paused)\",\n            \"type\": \"string\",\n          },\n          \"total\": {\n            \"description\": \"Total number of pages\",\n            \"type\": \"integer\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Cancel a crawl job\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"jobId\": {\n            \"description\": \"ID of the crawl job\",\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"jobId\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"cancel_crawl_job\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"status\": {\n            \"description\": \"Returns cancelled.\",\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > mixed.json 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"echo\": {\n      \"method\": \"get\",\n      \"operationId\": \"echo\",\n      \"parameterSources\": {\n        \"id\": \"path\",\n        \"name\": \"query\",\n        \"x-custom-header\": \"header\",\n      },\n      \"path\": \"/echo/{id}\",\n      \"tags\": undefined,\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"Echo\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"id\": {\n            \"title\": \"id\",\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"title\": \"name\",\n            \"type\": \"string\",\n          },\n          \"x-custom-header\": {\n            \"title\": \"x-custom-header\",\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"echo\",\n      \"outputSchema\": undefined,\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > open-meteo.yaml 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"get_v1_forecast\": {\n      \"method\": \"get\",\n      \"operationId\": \"get_v1_forecast\",\n      \"parameterSources\": {\n        \"current_weather\": \"query\",\n        \"daily\": \"query\",\n        \"hourly\": \"query\",\n        \"latitude\": \"query\",\n        \"longitude\": \"query\",\n        \"past_days\": \"query\",\n        \"temperature_unit\": \"query\",\n        \"timeformat\": \"query\",\n        \"timezone\": \"query\",\n        \"wind_speed_unit\": \"query\",\n      },\n      \"path\": \"/v1/forecast\",\n      \"tags\": [\n        \"Weather Forecast APIs\",\n      ],\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"current_weather\": {\n            \"type\": \"boolean\",\n          },\n          \"daily\": {\n            \"items\": {\n              \"enum\": [\n                \"temperature_2m_max\",\n                \"temperature_2m_min\",\n                \"apparent_temperature_max\",\n                \"apparent_temperature_min\",\n                \"precipitation_sum\",\n                \"precipitation_hours\",\n                \"weather_code\",\n                \"sunrise\",\n                \"sunset\",\n                \"wind_speed_10m_max\",\n                \"wind_gusts_10m_max\",\n                \"wind_direction_10m_dominant\",\n                \"shortwave_radiation_sum\",\n                \"uv_index_max\",\n                \"uv_index_clear_sky_max\",\n                \"et0_fao_evapotranspiration\",\n              ],\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"hourly\": {\n            \"items\": {\n              \"enum\": [\n                \"temperature_2m\",\n                \"relative_humidity_2m\",\n                \"dew_point_2m\",\n                \"apparent_temperature\",\n                \"pressure_msl\",\n                \"cloud_cover\",\n                \"cloud_cover_low\",\n                \"cloud_cover_mid\",\n                \"cloud_cover_high\",\n                \"wind_speed_10m\",\n                \"wind_speed_80m\",\n                \"wind_speed_120m\",\n                \"wind_speed_180m\",\n                \"wind_direction_10m\",\n                \"wind_direction_80m\",\n                \"wind_direction_120m\",\n                \"wind_direction_180m\",\n                \"wind_gusts_10m\",\n                \"shortwave_radiation\",\n                \"direct_radiation\",\n                \"direct_normal_irradiance\",\n                \"diffuse_radiation\",\n                \"vapour_pressure_deficit\",\n                \"evapotranspiration\",\n                \"precipitation\",\n                \"weather_code\",\n                \"snow_height\",\n                \"freezing_level_height\",\n                \"soil_temperature_0cm\",\n                \"soil_temperature_6cm\",\n                \"soil_temperature_18cm\",\n                \"soil_temperature_54cm\",\n                \"soil_moisture_0_1cm\",\n                \"soil_moisture_1_3cm\",\n                \"soil_moisture_3_9cm\",\n                \"soil_moisture_9_27cm\",\n                \"soil_moisture_27_81cm\",\n              ],\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"latitude\": {\n            \"description\": \"WGS84 coordinate\",\n            \"format\": \"double\",\n            \"type\": \"number\",\n          },\n          \"longitude\": {\n            \"description\": \"WGS84 coordinate\",\n            \"format\": \"double\",\n            \"type\": \"number\",\n          },\n          \"past_days\": {\n            \"description\": \"If \\`past_days\\` is set, yesterdays or the day before yesterdays data are also returned.\",\n            \"enum\": [\n              1,\n              2,\n            ],\n            \"type\": \"integer\",\n          },\n          \"temperature_unit\": {\n            \"default\": \"celsius\",\n            \"enum\": [\n              \"celsius\",\n              \"fahrenheit\",\n            ],\n            \"type\": \"string\",\n          },\n          \"timeformat\": {\n            \"default\": \"iso8601\",\n            \"description\": \"If format \\`unixtime\\` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply \\`utc_offset_seconds\\` again to get the correct date.\",\n            \"enum\": [\n              \"iso8601\",\n              \"unixtime\",\n            ],\n            \"type\": \"string\",\n          },\n          \"timezone\": {\n            \"description\": \"If \\`timezone\\` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported.\",\n            \"type\": \"string\",\n          },\n          \"wind_speed_unit\": {\n            \"default\": \"kmh\",\n            \"enum\": [\n              \"kmh\",\n              \"ms\",\n              \"mph\",\n              \"kn\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"latitude\",\n          \"longitude\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_v1_forecast\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"current_weather\": {\n            \"description\": \"Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code\",\n            \"properties\": {\n              \"temperature\": {\n                \"type\": \"number\",\n              },\n              \"time\": {\n                \"type\": \"string\",\n              },\n              \"weather_code\": {\n                \"type\": \"integer\",\n              },\n              \"wind_direction\": {\n                \"type\": \"number\",\n              },\n              \"wind_speed\": {\n                \"type\": \"number\",\n              },\n            },\n            \"required\": [\n              \"time\",\n              \"temperature\",\n              \"wind_speed\",\n              \"wind_direction\",\n              \"weather_code\",\n            ],\n            \"type\": \"object\",\n          },\n          \"daily\": {\n            \"description\": \"For each selected daily weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n            \"properties\": {\n              \"apparent_temperature_max\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"apparent_temperature_min\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"et0_fao_evapotranspiration\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"precipitation_hours\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"precipitation_sum\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"shortwave_radiation_sum\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"sunrise\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"sunset\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"temperature_2m_max\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"temperature_2m_min\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"time\": {\n                \"items\": {\n                  \"type\": \"string\",\n                },\n                \"type\": \"array\",\n              },\n              \"uv_index_clear_sky_max\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"uv_index_max\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"weather_code\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_direction_10m_dominant\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_gusts_10m_max\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_speed_10m_max\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"time\",\n            ],\n            \"type\": \"object\",\n          },\n          \"daily_units\": {\n            \"additionalProperties\": {\n              \"type\": \"string\",\n            },\n            \"description\": \"For each selected daily weather variable, the unit will be listed here.\",\n            \"type\": \"object\",\n          },\n          \"elevation\": {\n            \"description\": \"The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.\",\n            \"example\": 44.812,\n            \"type\": \"number\",\n          },\n          \"generationtime_ms\": {\n            \"description\": \"Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.\",\n            \"example\": 2.2119,\n            \"type\": \"number\",\n          },\n          \"hourly\": {\n            \"description\": \"For each selected weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n            \"properties\": {\n              \"apparent_temperature\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"cloud_cover\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"cloud_cover_high\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"cloud_cover_low\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"cloud_cover_mid\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"dew_point_2m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"diffuse_radiation\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"direct_normal_irradiance\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"direct_radiation\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"evapotranspiration\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"freezing_level_height\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"precipitation\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"pressure_msl\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"relative_humidity_2m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"shortwave_radiation\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"snow_height\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_moisture_0_1cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_moisture_1_3cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_moisture_27_81cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_moisture_3_9cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_moisture_9_27cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_temperature_0cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_temperature_18cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_temperature_54cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"soil_temperature_6cm\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"temperature_2m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"time\": {\n                \"items\": {\n                  \"type\": \"string\",\n                },\n                \"type\": \"array\",\n              },\n              \"vapour_pressure_deficit\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"weather_code\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_direction_10m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_direction_120m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_direction_180m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_direction_80m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_gusts_10m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_speed_10m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_speed_120m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_speed_180m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n              \"wind_speed_80m\": {\n                \"items\": {\n                  \"type\": \"number\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"time\",\n            ],\n            \"type\": \"object\",\n          },\n          \"hourly_units\": {\n            \"additionalProperties\": {\n              \"type\": \"string\",\n            },\n            \"description\": \"For each selected weather variable, the unit will be listed here.\",\n            \"type\": \"object\",\n          },\n          \"latitude\": {\n            \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n            \"example\": 52.52,\n            \"type\": \"number\",\n          },\n          \"longitude\": {\n            \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n            \"example\": \"13.419.52\",\n            \"type\": \"number\",\n          },\n          \"utc_offset_seconds\": {\n            \"description\": \"Applied timezone offset from the &timezone= parameter.\",\n            \"example\": 3600,\n            \"type\": \"integer\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > pet-store.json 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"create_pets\": {\n      \"method\": \"post\",\n      \"operationId\": \"createPets\",\n      \"parameterSources\": {\n        \"id\": \"body\",\n        \"name\": \"body\",\n        \"tag\": \"body\",\n      },\n      \"path\": \"/pets\",\n      \"tags\": [\n        \"pets\",\n      ],\n    },\n    \"list_pets\": {\n      \"method\": \"get\",\n      \"operationId\": \"listPets\",\n      \"parameterSources\": {\n        \"limit\": \"query\",\n      },\n      \"path\": \"/pets\",\n      \"tags\": [\n        \"pets\",\n      ],\n    },\n    \"show_pet_by_id\": {\n      \"method\": \"get\",\n      \"operationId\": \"showPetById\",\n      \"parameterSources\": {\n        \"petId\": \"path\",\n      },\n      \"path\": \"/pets/{petId}\",\n      \"tags\": [\n        \"pets\",\n      ],\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"List all pets\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"limit\": {\n            \"description\": \"How many items to return at one time (max 100)\",\n            \"format\": \"int32\",\n            \"maximum\": 100,\n            \"type\": \"integer\",\n          },\n        },\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"list_pets\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Create a pet\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"id\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"create_pets\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Info for a specific pet\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"petId\": {\n            \"description\": \"The id of the pet to retrieve\",\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"petId\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"show_pet_by_id\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"id\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > petstore-expanded.json 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"add_pet\": {\n      \"method\": \"post\",\n      \"operationId\": \"addPet\",\n      \"parameterSources\": {\n        \"name\": \"body\",\n        \"tag\": \"body\",\n      },\n      \"path\": \"/pets\",\n      \"tags\": undefined,\n    },\n    \"delete_pet\": {\n      \"method\": \"delete\",\n      \"operationId\": \"deletePet\",\n      \"parameterSources\": {\n        \"id\": \"path\",\n      },\n      \"path\": \"/pets/{id}\",\n      \"tags\": undefined,\n    },\n    \"find_pet_by_id\": {\n      \"method\": \"get\",\n      \"operationId\": \"find pet by id\",\n      \"parameterSources\": {\n        \"id\": \"path\",\n      },\n      \"path\": \"/pets/{id}\",\n      \"tags\": undefined,\n    },\n    \"find_pets\": {\n      \"method\": \"get\",\n      \"operationId\": \"findPets\",\n      \"parameterSources\": {\n        \"limit\": \"query\",\n        \"tags\": \"query\",\n      },\n      \"path\": \"/pets\",\n      \"tags\": undefined,\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"limit\": {\n            \"description\": \"maximum number of results to return\",\n            \"format\": \"int32\",\n            \"type\": \"integer\",\n          },\n          \"tags\": {\n            \"description\": \"tags to filter by\",\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"find_pets\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Creates a new pet in the store. Duplicates are allowed\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"add_pet\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Returns a user based on a single ID, if the user does not have access to the pet\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"id\": {\n            \"description\": \"ID of pet to fetch\",\n            \"format\": \"int64\",\n            \"type\": \"integer\",\n          },\n        },\n        \"required\": [\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"find_pet_by_id\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"deletes a single pet based on the ID supplied\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"id\": {\n            \"description\": \"ID of pet to delete\",\n            \"format\": \"int64\",\n            \"type\": \"integer\",\n          },\n        },\n        \"required\": [\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"delete_pet\",\n      \"outputSchema\": undefined,\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > remote spec https://agentic-platform-fixtures-everything.onrender.com/docs 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"custom_cache_control_tool\": {\n      \"method\": \"post\",\n      \"operationId\": \"customCacheControlTool\",\n      \"parameterSources\": {},\n      \"path\": \"/custom-cache-control-tool\",\n      \"tags\": undefined,\n    },\n    \"custom_rate_limit_approximate_tool\": {\n      \"method\": \"post\",\n      \"operationId\": \"customRateLimitApproximateTool\",\n      \"parameterSources\": {},\n      \"path\": \"/custom-rate-limit-approximate-tool\",\n      \"tags\": undefined,\n    },\n    \"custom_rate_limit_tool\": {\n      \"method\": \"post\",\n      \"operationId\": \"customRateLimitTool\",\n      \"parameterSources\": {},\n      \"path\": \"/custom-rate-limit-tool\",\n      \"tags\": undefined,\n    },\n    \"disabled_for_free_plan_tool\": {\n      \"method\": \"get\",\n      \"operationId\": \"disabledForFreePlanTool\",\n      \"parameterSources\": {},\n      \"path\": \"/disabled-for-free-plan-tool\",\n      \"tags\": undefined,\n    },\n    \"disabled_rate_limit_tool\": {\n      \"method\": \"post\",\n      \"operationId\": \"disabledRateLimitTool\",\n      \"parameterSources\": {},\n      \"path\": \"/disabled-rate-limit-tool\",\n      \"tags\": undefined,\n    },\n    \"disabled_tool\": {\n      \"method\": \"get\",\n      \"operationId\": \"disabledTool\",\n      \"parameterSources\": {},\n      \"path\": \"/disabled-tool\",\n      \"tags\": undefined,\n    },\n    \"echo\": {\n      \"method\": \"post\",\n      \"operationId\": \"echo\",\n      \"parameterSources\": {},\n      \"path\": \"/echo\",\n      \"tags\": undefined,\n    },\n    \"echo_headers\": {\n      \"method\": \"get\",\n      \"operationId\": \"echoHeaders\",\n      \"parameterSources\": {},\n      \"path\": \"/echo-headers\",\n      \"tags\": undefined,\n    },\n    \"get_user\": {\n      \"method\": \"get\",\n      \"operationId\": \"getUser\",\n      \"parameterSources\": {\n        \"userId\": \"path\",\n      },\n      \"path\": \"/users/{userId}\",\n      \"tags\": [\n        \"users\",\n      ],\n    },\n    \"health_check\": {\n      \"method\": \"get\",\n      \"operationId\": \"healthCheck\",\n      \"parameterSources\": {},\n      \"path\": \"/health\",\n      \"tags\": undefined,\n    },\n    \"no_cache_cache_control_tool\": {\n      \"method\": \"post\",\n      \"operationId\": \"noCacheCacheControlTool\",\n      \"parameterSources\": {},\n      \"path\": \"/no-cache-cache-control-tool\",\n      \"tags\": undefined,\n    },\n    \"no_store_cache_control_tool\": {\n      \"method\": \"post\",\n      \"operationId\": \"noStoreCacheControlTool\",\n      \"parameterSources\": {},\n      \"path\": \"/no-store-cache-control-tool\",\n      \"tags\": undefined,\n    },\n    \"pure\": {\n      \"method\": \"post\",\n      \"operationId\": \"pure\",\n      \"parameterSources\": {},\n      \"path\": \"/pure\",\n      \"tags\": undefined,\n    },\n    \"strict_additional_properties\": {\n      \"method\": \"post\",\n      \"operationId\": \"strictAdditionalProperties\",\n      \"parameterSources\": {\n        \"foo\": \"body\",\n      },\n      \"path\": \"/strict-additional-properties\",\n      \"tags\": undefined,\n    },\n    \"unpure_marked_pure\": {\n      \"method\": \"post\",\n      \"operationId\": \"unpure_marked_pure\",\n      \"parameterSources\": {},\n      \"path\": \"/unpure-marked-pure\",\n      \"tags\": undefined,\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"Check if the server is healthy\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"health_check\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"status\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Gets a user\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"userId\": {\n            \"description\": \"User ID\",\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"userId\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_user\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"email\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n          \"email\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Disabled tool\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"disabled_tool\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"status\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Disabled for free plan tool\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"disabled_for_free_plan_tool\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"status\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Echoes the request body\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"echo\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Echoes the request headers\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"echo_headers\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Pure tool\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"pure\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Unpure tool marked pure\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"unpure_marked_pure\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"now\": {\n            \"type\": \"number\",\n          },\n        },\n        \"required\": [\n          \"now\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Custom cache control tool\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"custom_cache_control_tool\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Custom rate limit tool (approximate mode)\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"custom_rate_limit_approximate_tool\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"No store cache control tool\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"no_store_cache_control_tool\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"No cache cache control tool\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"no_cache_cache_control_tool\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Custom rate limit tool (strict mode)\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"custom_rate_limit_tool\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Disabled rate limit tool\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"disabled_rate_limit_tool\",\n      \"outputSchema\": {\n        \"properties\": {},\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Echoes the request body only allowing a single \"foo\" field.\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"foo\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"foo\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"strict_additional_properties\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"foo\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"foo\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > security.json 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"delete_anything_oauth2\": {\n      \"method\": \"delete\",\n      \"operationId\": \"delete_anything_oauth2\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/oauth2\",\n      \"tags\": [\n        \"OAuth 2\",\n      ],\n    },\n    \"get_anything_api_key\": {\n      \"method\": \"get\",\n      \"operationId\": \"get_anything_apiKey\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/apiKey\",\n      \"tags\": [\n        \"API Key\",\n      ],\n    },\n    \"get_anything_oauth2\": {\n      \"method\": \"get\",\n      \"operationId\": \"get_anything_oauth2\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/oauth2\",\n      \"tags\": [\n        \"OAuth 2\",\n      ],\n    },\n    \"get_anything_optional_auth\": {\n      \"method\": \"get\",\n      \"operationId\": \"get_anything_optional_auth\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/optional-auth\",\n      \"tags\": [\n        \"Other\",\n      ],\n    },\n    \"patch_anything_oauth2\": {\n      \"method\": \"patch\",\n      \"operationId\": \"patch_anything_oauth2\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/oauth2\",\n      \"tags\": [\n        \"OAuth 2\",\n      ],\n    },\n    \"post_anything_api_key\": {\n      \"method\": \"post\",\n      \"operationId\": \"post_anything_apiKey\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/apiKey\",\n      \"tags\": [\n        \"API Key\",\n      ],\n    },\n    \"post_anything_basic\": {\n      \"method\": \"post\",\n      \"operationId\": \"post_anything_basic\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/basic\",\n      \"tags\": [\n        \"HTTP\",\n      ],\n    },\n    \"post_anything_bearer\": {\n      \"method\": \"post\",\n      \"operationId\": \"post_anything_bearer\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/bearer\",\n      \"tags\": [\n        \"HTTP\",\n      ],\n    },\n    \"post_anything_no_auth\": {\n      \"method\": \"post\",\n      \"operationId\": \"post_anything_no_auth\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/no-auth\",\n      \"tags\": [\n        \"Other\",\n      ],\n    },\n    \"post_anything_oauth2\": {\n      \"method\": \"post\",\n      \"operationId\": \"post_anything_oauth2\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/oauth2\",\n      \"tags\": [\n        \"OAuth 2\",\n      ],\n    },\n    \"post_anything_open_id_connect\": {\n      \"method\": \"post\",\n      \"operationId\": \"post_anything_openIdConnect\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/openIdConnect\",\n      \"tags\": [\n        \"OpenID Connect\",\n      ],\n    },\n    \"post_status401\": {\n      \"method\": \"post\",\n      \"operationId\": \"post_status_401\",\n      \"parameterSources\": {},\n      \"path\": \"/status/401\",\n      \"tags\": [\n        \"Other\",\n      ],\n    },\n    \"put_anything_api_key\": {\n      \"method\": \"put\",\n      \"operationId\": \"put_anything_apiKey\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/apiKey\",\n      \"tags\": [\n        \"API Key\",\n      ],\n    },\n    \"put_anything_bearer\": {\n      \"method\": \"put\",\n      \"operationId\": \"put_anything_bearer\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/bearer\",\n      \"tags\": [\n        \"HTTP\",\n      ],\n    },\n    \"put_anything_oauth2\": {\n      \"method\": \"put\",\n      \"operationId\": \"put_anything_oauth2\",\n      \"parameterSources\": {},\n      \"path\": \"/anything/oauth2\",\n      \"tags\": [\n        \"OAuth 2\",\n      ],\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"\\`apiKey\\` auth will be supplied within an \\`apiKey\\` query parameter.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_anything_api_key\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"\\`apiKey\\` auth will be supplied within an \\`api_key\\` cookie.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"post_anything_api_key\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"\\`apiKey\\` auth will be supplied within an \\`X-API-KEY\\` header.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"put_anything_api_key\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Authentication credentials will be supplied within a \\`Basic\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"post_anything_basic\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"post_anything_bearer\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard \\`Bearer\\` authentication token.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"put_anything_bearer\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_anything_oauth2\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"post_anything_oauth2\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"put_anything_oauth2\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"delete_anything_oauth2\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"patch_anything_oauth2\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"🚧 This is not supported.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"post_anything_open_id_connect\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"This operation does not have any authentication requirements.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"post_anything_no_auth\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"The \\`apiKey\\` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_anything_optional_auth\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"post_status401\",\n      \"outputSchema\": undefined,\n    },\n  ],\n}\n`;\n\nexports[`getToolsFromOpenAPISpec > tic-tac-toe.json 1`] = `\n{\n  \"toolToOperationMap\": {\n    \"get_board\": {\n      \"method\": \"get\",\n      \"operationId\": \"get-board\",\n      \"parameterSources\": {},\n      \"path\": \"/board\",\n      \"tags\": [\n        \"Gameplay\",\n      ],\n    },\n    \"get_square\": {\n      \"method\": \"get\",\n      \"operationId\": \"get-square\",\n      \"parameterSources\": {\n        \"column\": \"path\",\n        \"row\": \"path\",\n      },\n      \"path\": \"/board/{row}/{column}\",\n      \"tags\": [\n        \"Gameplay\",\n      ],\n    },\n    \"put_square\": {\n      \"method\": \"put\",\n      \"operationId\": \"put-square\",\n      \"parameterSources\": {\n        \"column\": \"path\",\n        \"row\": \"path\",\n      },\n      \"path\": \"/board/{row}/{column}\",\n      \"tags\": [\n        \"Gameplay\",\n      ],\n    },\n  },\n  \"tools\": [\n    {\n      \"description\": \"Retrieves the current state of the board and the winner.\",\n      \"inputSchema\": {\n        \"properties\": {},\n        \"required\": [],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_board\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"board\": {\n            \"items\": {\n              \"items\": {\n                \"description\": \"Possible values for a board square. \\`.\\` means empty square.\",\n                \"enum\": [\n                  \".\",\n                  \"X\",\n                  \"O\",\n                ],\n                \"example\": \".\",\n                \"type\": \"string\",\n              },\n              \"maxItems\": 3,\n              \"minItems\": 3,\n              \"type\": \"array\",\n            },\n            \"maxItems\": 3,\n            \"minItems\": 3,\n            \"type\": \"array\",\n          },\n          \"winner\": {\n            \"description\": \"Winner of the game. \\`.\\` means nobody has won yet.\",\n            \"enum\": [\n              \".\",\n              \"X\",\n              \"O\",\n            ],\n            \"example\": \".\",\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    {\n      \"description\": \"Retrieves the requested square.\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"column\": {\n            \"description\": \"Board column (horizontal coordinate)\",\n            \"example\": 1,\n            \"maximum\": 3,\n            \"minimum\": 1,\n            \"type\": \"integer\",\n          },\n          \"row\": {\n            \"description\": \"Board row (vertical coordinate)\",\n            \"example\": 1,\n            \"maximum\": 3,\n            \"minimum\": 1,\n            \"type\": \"integer\",\n          },\n        },\n        \"required\": [\n          \"row\",\n          \"column\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"get_square\",\n      \"outputSchema\": undefined,\n    },\n    {\n      \"description\": \"Places a mark on the board and retrieves the whole board and the winner (if any).\",\n      \"inputSchema\": {\n        \"properties\": {\n          \"column\": {\n            \"description\": \"Board column (horizontal coordinate)\",\n            \"example\": 1,\n            \"maximum\": 3,\n            \"minimum\": 1,\n            \"type\": \"integer\",\n          },\n          \"row\": {\n            \"description\": \"Board row (vertical coordinate)\",\n            \"example\": 1,\n            \"maximum\": 3,\n            \"minimum\": 1,\n            \"type\": \"integer\",\n          },\n        },\n        \"required\": [\n          \"row\",\n          \"column\",\n        ],\n        \"type\": \"object\",\n      },\n      \"name\": \"put_square\",\n      \"outputSchema\": {\n        \"properties\": {\n          \"board\": {\n            \"items\": {\n              \"items\": {\n                \"description\": \"Possible values for a board square. \\`.\\` means empty square.\",\n                \"enum\": [\n                  \".\",\n                  \"X\",\n                  \"O\",\n                ],\n                \"example\": \".\",\n                \"type\": \"string\",\n              },\n              \"maxItems\": 3,\n              \"minItems\": 3,\n              \"type\": \"array\",\n            },\n            \"maxItems\": 3,\n            \"minItems\": 3,\n            \"type\": \"array\",\n          },\n          \"winner\": {\n            \"description\": \"Winner of the game. \\`.\\` means nobody has won yet.\",\n            \"enum\": [\n              \".\",\n              \"X\",\n              \"O\",\n            ],\n            \"example\": \".\",\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n  ],\n}\n`;\n"
  },
  {
    "path": "packages/openapi-utils/src/__snapshots__/validate-openapi-spec.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`validateOpenAPISpec > basic.json (file url) 1`] = `\n{\n  \"info\": {\n    \"title\": \"OpenAPI Basic Test Fixture\",\n    \"version\": \"0.1.0\",\n  },\n  \"openapi\": \"3.0.2\",\n  \"paths\": {\n    \"/\": {\n      \"get\": {\n        \"operationId\": \"echo\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"name\",\n            \"required\": false,\n            \"schema\": {\n              \"title\": \"name\",\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {},\n              },\n            },\n            \"description\": \"Success\",\n          },\n        },\n        \"summary\": \"Echo\",\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://test-openapi-basic.now.sh\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > basic.json (http url) 1`] = `\n{\n  \"info\": {\n    \"title\": \"OpenAPI Basic Test Fixture\",\n    \"version\": \"0.1.0\",\n  },\n  \"openapi\": \"3.0.2\",\n  \"paths\": {\n    \"/\": {\n      \"get\": {\n        \"operationId\": \"echo\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"name\",\n            \"required\": false,\n            \"schema\": {\n              \"title\": \"name\",\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {},\n              },\n            },\n            \"description\": \"Success\",\n          },\n        },\n        \"summary\": \"Echo\",\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://test-openapi-basic.now.sh\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > basic.json (string) 1`] = `\n{\n  \"info\": {\n    \"title\": \"OpenAPI Basic Test Fixture\",\n    \"version\": \"0.1.0\",\n  },\n  \"openapi\": \"3.0.2\",\n  \"paths\": {\n    \"/\": {\n      \"get\": {\n        \"operationId\": \"echo\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"name\",\n            \"required\": false,\n            \"schema\": {\n              \"title\": \"name\",\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {},\n              },\n            },\n            \"description\": \"Success\",\n          },\n        },\n        \"summary\": \"Echo\",\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://test-openapi-basic.now.sh\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > firecrawl.json (file url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"CrawlResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"url\": {\n            \"format\": \"uri\",\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CrawlStatusResponseObj\": {\n        \"properties\": {\n          \"html\": {\n            \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"links\": {\n            \"description\": \"Links on the page if the \\`links\\` format was specified\",\n            \"items\": {\n              \"format\": \"uri\",\n              \"type\": \"string\",\n            },\n            \"nullable\": true,\n            \"type\": \"array\",\n          },\n          \"markdown\": {\n            \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"metadata\": {\n            \"properties\": {\n              \"<any other metadata> \": {\n                \"type\": \"string\",\n              },\n              \"description\": {\n                \"type\": \"string\",\n              },\n              \"error\": {\n                \"description\": \"The error message of the page\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"language\": {\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"sourceURL\": {\n                \"format\": \"uri\",\n                \"type\": \"string\",\n              },\n              \"statusCode\": {\n                \"description\": \"The status code of the page\",\n                \"type\": \"integer\",\n              },\n              \"title\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"rawHtml\": {\n            \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"screenshot\": {\n            \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"ScrapeResponse\": {\n        \"properties\": {\n          \"data\": {\n            \"properties\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"warning\": {\n            \"description\": \"Warning message to let you know of any issues.\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SearchResponse\": {\n        \"properties\": {\n          \"data\": {\n            \"items\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"array\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    \"securitySchemes\": {\n      \"bearerAuth\": {\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"support@firecrawl.dev\",\n      \"name\": \"Firecrawl Support\",\n      \"url\": \"https://firecrawl.dev/support\",\n    },\n    \"description\": \"API for interacting with Firecrawl services to perform web scraping and crawling tasks.\",\n    \"title\": \"Firecrawl API\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/crawl\": {\n      \"post\": {\n        \"operationId\": \"crawlUrls\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"crawlerOptions\": {\n                    \"properties\": {\n                      \"allowBackwardCrawling\": {\n                        \"default\": false,\n                        \"description\": \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\",\n                        \"type\": \"boolean\",\n                      },\n                      \"allowExternalContentLinks\": {\n                        \"default\": false,\n                        \"description\": \"Allows the crawler to follow links to external websites.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"excludes\": {\n                        \"description\": \"URL patterns to exclude\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"generateImgAltText\": {\n                        \"default\": false,\n                        \"description\": \"Generate alt text for images using LLMs (must have a paid plan)\",\n                        \"type\": \"boolean\",\n                      },\n                      \"ignoreSitemap\": {\n                        \"default\": false,\n                        \"description\": \"Ignore the website sitemap when crawling\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includes\": {\n                        \"description\": \"URL patterns to include\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"limit\": {\n                        \"default\": 10000,\n                        \"description\": \"Maximum number of pages to crawl\",\n                        \"type\": \"integer\",\n                      },\n                      \"maxDepth\": {\n                        \"description\": \"Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.\",\n                        \"type\": \"integer\",\n                      },\n                      \"mode\": {\n                        \"default\": \"default\",\n                        \"description\": \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\",\n                        \"enum\": [\n                          \"default\",\n                          \"fast\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                      \"returnOnlyUrls\": {\n                        \"default\": false,\n                        \"description\": \"If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.\",\n                        \"type\": \"boolean\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"pageOptions\": {\n                    \"properties\": {\n                      \"fullPageScreenshot\": {\n                        \"default\": false,\n                        \"description\": \"Include a full page screenshot of the page that you are scraping.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"headers\": {\n                        \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n                        \"type\": \"object\",\n                      },\n                      \"includeHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeRawHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"onlyIncludeTags\": {\n                        \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"onlyMainContent\": {\n                        \"default\": false,\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"removeTags\": {\n                        \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"replaceAllPathsWithAbsolutePaths\": {\n                        \"default\": false,\n                        \"description\": \"Replace all relative paths with absolute paths for images and links\",\n                        \"type\": \"boolean\",\n                      },\n                      \"screenshot\": {\n                        \"default\": false,\n                        \"description\": \"Include a screenshot of the top of the page that you are scraping.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"waitFor\": {\n                        \"default\": 0,\n                        \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                        \"type\": \"integer\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"url\": {\n                    \"description\": \"The base URL to start crawling from\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/CrawlResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Crawl multiple URLs based on options\",\n        \"tags\": [\n          \"Crawling\",\n        ],\n      },\n    },\n    \"/crawl/cancel/{jobId}\": {\n      \"delete\": {\n        \"operationId\": \"cancelCrawlJob\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of the crawl job\",\n            \"in\": \"path\",\n            \"name\": \"jobId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"status\": {\n                      \"description\": \"Returns cancelled.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Cancel a crawl job\",\n        \"tags\": [\n          \"Crawl\",\n        ],\n      },\n    },\n    \"/crawl/status/{jobId}\": {\n      \"get\": {\n        \"operationId\": \"getCrawlStatus\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of the crawl job\",\n            \"in\": \"path\",\n            \"name\": \"jobId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"current\": {\n                      \"description\": \"Current page number\",\n                      \"type\": \"integer\",\n                    },\n                    \"data\": {\n                      \"description\": \"Data returned from the job (null when it is in progress)\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"partial_data\": {\n                      \"description\": \"Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in \\`data\\`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"status\": {\n                      \"description\": \"Status of the job (completed, active, failed, paused)\",\n                      \"type\": \"string\",\n                    },\n                    \"total\": {\n                      \"description\": \"Total number of pages\",\n                      \"type\": \"integer\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Get the status of a crawl job\",\n        \"tags\": [\n          \"Crawl\",\n        ],\n      },\n    },\n    \"/scrape\": {\n      \"post\": {\n        \"operationId\": \"scrape\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"excludeTags\": {\n                    \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n                    \"items\": {\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"formats\": {\n                    \"default\": [\n                      \"markdown\",\n                    ],\n                    \"description\": \"Specific formats to return.\n\n - markdown: The page in Markdown format.\n - html: The page's HTML, trimmed to include only meaningful content.\n - rawHtml: The page's original HTML.\n - links: The links on the page.\n - screenshot: A screenshot of the top of the page.\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\",\n                    \"items\": {\n                      \"enum\": [\n                        \"markdown\",\n                        \"html\",\n                        \"rawHtml\",\n                        \"links\",\n                        \"screenshot\",\n                        \"screenshot@fullPage\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"headers\": {\n                    \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n                    \"type\": \"object\",\n                  },\n                  \"includeTags\": {\n                    \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n                    \"items\": {\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"onlyMainContent\": {\n                    \"default\": true,\n                    \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                    \"type\": \"boolean\",\n                  },\n                  \"timeout\": {\n                    \"default\": 30000,\n                    \"description\": \"Timeout in milliseconds for the request\",\n                    \"type\": \"integer\",\n                  },\n                  \"url\": {\n                    \"description\": \"The URL to scrape\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"waitFor\": {\n                    \"default\": 0,\n                    \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                    \"type\": \"integer\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ScrapeResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Scrape a single URL\",\n        \"tags\": [\n          \"Scraping\",\n        ],\n      },\n    },\n    \"/search\": {\n      \"post\": {\n        \"operationId\": \"searchGoogle\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"pageOptions\": {\n                    \"properties\": {\n                      \"fetchPageContent\": {\n                        \"default\": true,\n                        \"description\": \"Fetch the content of each page. If false, defaults to a basic fast serp API.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeRawHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"onlyMainContent\": {\n                        \"default\": false,\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"type\": \"boolean\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"query\": {\n                    \"description\": \"The query to search for\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"searchOptions\": {\n                    \"properties\": {\n                      \"limit\": {\n                        \"description\": \"Maximum number of results. Max is 20 during beta.\",\n                        \"type\": \"integer\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"query\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Search for a keyword in Google, returns top page results with markdown content for each page\",\n        \"tags\": [\n          \"Search\",\n        ],\n      },\n    },\n  },\n  \"security\": [\n    {\n      \"bearerAuth\": [],\n    },\n  ],\n  \"servers\": [\n    {\n      \"url\": \"https://api.firecrawl.dev/v0\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > firecrawl.json (http url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"CrawlResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"url\": {\n            \"format\": \"uri\",\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CrawlStatusResponseObj\": {\n        \"properties\": {\n          \"html\": {\n            \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"links\": {\n            \"description\": \"Links on the page if the \\`links\\` format was specified\",\n            \"items\": {\n              \"format\": \"uri\",\n              \"type\": \"string\",\n            },\n            \"nullable\": true,\n            \"type\": \"array\",\n          },\n          \"markdown\": {\n            \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"metadata\": {\n            \"properties\": {\n              \"<any other metadata> \": {\n                \"type\": \"string\",\n              },\n              \"description\": {\n                \"type\": \"string\",\n              },\n              \"error\": {\n                \"description\": \"The error message of the page\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"language\": {\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"sourceURL\": {\n                \"format\": \"uri\",\n                \"type\": \"string\",\n              },\n              \"statusCode\": {\n                \"description\": \"The status code of the page\",\n                \"type\": \"integer\",\n              },\n              \"title\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"rawHtml\": {\n            \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"screenshot\": {\n            \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"ScrapeResponse\": {\n        \"properties\": {\n          \"data\": {\n            \"properties\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"warning\": {\n            \"description\": \"Warning message to let you know of any issues.\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SearchResponse\": {\n        \"properties\": {\n          \"data\": {\n            \"items\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"array\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    \"securitySchemes\": {\n      \"bearerAuth\": {\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"support@firecrawl.dev\",\n      \"name\": \"Firecrawl Support\",\n      \"url\": \"https://firecrawl.dev/support\",\n    },\n    \"description\": \"API for interacting with Firecrawl services to perform web scraping and crawling tasks.\",\n    \"title\": \"Firecrawl API\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/crawl\": {\n      \"post\": {\n        \"operationId\": \"crawlUrls\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"crawlerOptions\": {\n                    \"properties\": {\n                      \"allowBackwardCrawling\": {\n                        \"default\": false,\n                        \"description\": \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\",\n                        \"type\": \"boolean\",\n                      },\n                      \"allowExternalContentLinks\": {\n                        \"default\": false,\n                        \"description\": \"Allows the crawler to follow links to external websites.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"excludes\": {\n                        \"description\": \"URL patterns to exclude\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"generateImgAltText\": {\n                        \"default\": false,\n                        \"description\": \"Generate alt text for images using LLMs (must have a paid plan)\",\n                        \"type\": \"boolean\",\n                      },\n                      \"ignoreSitemap\": {\n                        \"default\": false,\n                        \"description\": \"Ignore the website sitemap when crawling\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includes\": {\n                        \"description\": \"URL patterns to include\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"limit\": {\n                        \"default\": 10000,\n                        \"description\": \"Maximum number of pages to crawl\",\n                        \"type\": \"integer\",\n                      },\n                      \"maxDepth\": {\n                        \"description\": \"Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.\",\n                        \"type\": \"integer\",\n                      },\n                      \"mode\": {\n                        \"default\": \"default\",\n                        \"description\": \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\",\n                        \"enum\": [\n                          \"default\",\n                          \"fast\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                      \"returnOnlyUrls\": {\n                        \"default\": false,\n                        \"description\": \"If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.\",\n                        \"type\": \"boolean\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"pageOptions\": {\n                    \"properties\": {\n                      \"fullPageScreenshot\": {\n                        \"default\": false,\n                        \"description\": \"Include a full page screenshot of the page that you are scraping.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"headers\": {\n                        \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n                        \"type\": \"object\",\n                      },\n                      \"includeHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeRawHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"onlyIncludeTags\": {\n                        \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"onlyMainContent\": {\n                        \"default\": false,\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"removeTags\": {\n                        \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"replaceAllPathsWithAbsolutePaths\": {\n                        \"default\": false,\n                        \"description\": \"Replace all relative paths with absolute paths for images and links\",\n                        \"type\": \"boolean\",\n                      },\n                      \"screenshot\": {\n                        \"default\": false,\n                        \"description\": \"Include a screenshot of the top of the page that you are scraping.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"waitFor\": {\n                        \"default\": 0,\n                        \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                        \"type\": \"integer\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"url\": {\n                    \"description\": \"The base URL to start crawling from\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/CrawlResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Crawl multiple URLs based on options\",\n        \"tags\": [\n          \"Crawling\",\n        ],\n      },\n    },\n    \"/crawl/cancel/{jobId}\": {\n      \"delete\": {\n        \"operationId\": \"cancelCrawlJob\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of the crawl job\",\n            \"in\": \"path\",\n            \"name\": \"jobId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"status\": {\n                      \"description\": \"Returns cancelled.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Cancel a crawl job\",\n        \"tags\": [\n          \"Crawl\",\n        ],\n      },\n    },\n    \"/crawl/status/{jobId}\": {\n      \"get\": {\n        \"operationId\": \"getCrawlStatus\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of the crawl job\",\n            \"in\": \"path\",\n            \"name\": \"jobId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"current\": {\n                      \"description\": \"Current page number\",\n                      \"type\": \"integer\",\n                    },\n                    \"data\": {\n                      \"description\": \"Data returned from the job (null when it is in progress)\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"partial_data\": {\n                      \"description\": \"Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in \\`data\\`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"status\": {\n                      \"description\": \"Status of the job (completed, active, failed, paused)\",\n                      \"type\": \"string\",\n                    },\n                    \"total\": {\n                      \"description\": \"Total number of pages\",\n                      \"type\": \"integer\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Get the status of a crawl job\",\n        \"tags\": [\n          \"Crawl\",\n        ],\n      },\n    },\n    \"/scrape\": {\n      \"post\": {\n        \"operationId\": \"scrape\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"excludeTags\": {\n                    \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n                    \"items\": {\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"formats\": {\n                    \"default\": [\n                      \"markdown\",\n                    ],\n                    \"description\": \"Specific formats to return.\n\n - markdown: The page in Markdown format.\n - html: The page's HTML, trimmed to include only meaningful content.\n - rawHtml: The page's original HTML.\n - links: The links on the page.\n - screenshot: A screenshot of the top of the page.\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\",\n                    \"items\": {\n                      \"enum\": [\n                        \"markdown\",\n                        \"html\",\n                        \"rawHtml\",\n                        \"links\",\n                        \"screenshot\",\n                        \"screenshot@fullPage\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"headers\": {\n                    \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n                    \"type\": \"object\",\n                  },\n                  \"includeTags\": {\n                    \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n                    \"items\": {\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"onlyMainContent\": {\n                    \"default\": true,\n                    \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                    \"type\": \"boolean\",\n                  },\n                  \"timeout\": {\n                    \"default\": 30000,\n                    \"description\": \"Timeout in milliseconds for the request\",\n                    \"type\": \"integer\",\n                  },\n                  \"url\": {\n                    \"description\": \"The URL to scrape\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"waitFor\": {\n                    \"default\": 0,\n                    \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                    \"type\": \"integer\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ScrapeResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Scrape a single URL\",\n        \"tags\": [\n          \"Scraping\",\n        ],\n      },\n    },\n    \"/search\": {\n      \"post\": {\n        \"operationId\": \"searchGoogle\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"pageOptions\": {\n                    \"properties\": {\n                      \"fetchPageContent\": {\n                        \"default\": true,\n                        \"description\": \"Fetch the content of each page. If false, defaults to a basic fast serp API.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeRawHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"onlyMainContent\": {\n                        \"default\": false,\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"type\": \"boolean\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"query\": {\n                    \"description\": \"The query to search for\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"searchOptions\": {\n                    \"properties\": {\n                      \"limit\": {\n                        \"description\": \"Maximum number of results. Max is 20 during beta.\",\n                        \"type\": \"integer\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"query\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Search for a keyword in Google, returns top page results with markdown content for each page\",\n        \"tags\": [\n          \"Search\",\n        ],\n      },\n    },\n  },\n  \"security\": [\n    {\n      \"bearerAuth\": [],\n    },\n  ],\n  \"servers\": [\n    {\n      \"url\": \"https://api.firecrawl.dev/v0\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > firecrawl.json (string) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"CrawlResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"url\": {\n            \"format\": \"uri\",\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CrawlStatusResponseObj\": {\n        \"properties\": {\n          \"html\": {\n            \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"links\": {\n            \"description\": \"Links on the page if the \\`links\\` format was specified\",\n            \"items\": {\n              \"format\": \"uri\",\n              \"type\": \"string\",\n            },\n            \"nullable\": true,\n            \"type\": \"array\",\n          },\n          \"markdown\": {\n            \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"metadata\": {\n            \"properties\": {\n              \"<any other metadata> \": {\n                \"type\": \"string\",\n              },\n              \"description\": {\n                \"type\": \"string\",\n              },\n              \"error\": {\n                \"description\": \"The error message of the page\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"language\": {\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"sourceURL\": {\n                \"format\": \"uri\",\n                \"type\": \"string\",\n              },\n              \"statusCode\": {\n                \"description\": \"The status code of the page\",\n                \"type\": \"integer\",\n              },\n              \"title\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"rawHtml\": {\n            \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n          \"screenshot\": {\n            \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"ScrapeResponse\": {\n        \"properties\": {\n          \"data\": {\n            \"properties\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n          \"warning\": {\n            \"description\": \"Warning message to let you know of any issues.\",\n            \"nullable\": true,\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SearchResponse\": {\n        \"properties\": {\n          \"data\": {\n            \"items\": {\n              \"html\": {\n                \"description\": \"HTML version of the content on page if the \\`html\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"links\": {\n                \"description\": \"Links on the page if the \\`links\\` format was specified\",\n                \"items\": {\n                  \"format\": \"uri\",\n                  \"type\": \"string\",\n                },\n                \"nullable\": true,\n                \"type\": \"array\",\n              },\n              \"markdown\": {\n                \"description\": \"Markdown content of the page if the \\`markdown\\` format was specified (default)\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"metadata\": {\n                \"properties\": {\n                  \"<any other metadata> \": {\n                    \"type\": \"string\",\n                  },\n                  \"description\": {\n                    \"type\": \"string\",\n                  },\n                  \"error\": {\n                    \"description\": \"The error message of the page\",\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"language\": {\n                    \"nullable\": true,\n                    \"type\": \"string\",\n                  },\n                  \"sourceURL\": {\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"statusCode\": {\n                    \"description\": \"The status code of the page\",\n                    \"type\": \"integer\",\n                  },\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"rawHtml\": {\n                \"description\": \"Raw HTML content of the page if the \\`rawHtml\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n              \"screenshot\": {\n                \"description\": \"URL of the screenshot of the page if the \\`screenshot\\` or \\`screenshot@fullSize\\` format was specified\",\n                \"nullable\": true,\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"array\",\n          },\n          \"success\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n    },\n    \"securitySchemes\": {\n      \"bearerAuth\": {\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"support@firecrawl.dev\",\n      \"name\": \"Firecrawl Support\",\n      \"url\": \"https://firecrawl.dev/support\",\n    },\n    \"description\": \"API for interacting with Firecrawl services to perform web scraping and crawling tasks.\",\n    \"title\": \"Firecrawl API\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/crawl\": {\n      \"post\": {\n        \"operationId\": \"crawlUrls\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"crawlerOptions\": {\n                    \"properties\": {\n                      \"allowBackwardCrawling\": {\n                        \"default\": false,\n                        \"description\": \"Enables the crawler to navigate from a specific URL to previously linked pages. For instance, from 'example.com/product/123' back to 'example.com/product'\",\n                        \"type\": \"boolean\",\n                      },\n                      \"allowExternalContentLinks\": {\n                        \"default\": false,\n                        \"description\": \"Allows the crawler to follow links to external websites.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"excludes\": {\n                        \"description\": \"URL patterns to exclude\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"generateImgAltText\": {\n                        \"default\": false,\n                        \"description\": \"Generate alt text for images using LLMs (must have a paid plan)\",\n                        \"type\": \"boolean\",\n                      },\n                      \"ignoreSitemap\": {\n                        \"default\": false,\n                        \"description\": \"Ignore the website sitemap when crawling\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includes\": {\n                        \"description\": \"URL patterns to include\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"limit\": {\n                        \"default\": 10000,\n                        \"description\": \"Maximum number of pages to crawl\",\n                        \"type\": \"integer\",\n                      },\n                      \"maxDepth\": {\n                        \"description\": \"Maximum depth to crawl relative to the entered URL. A maxDepth of 0 scrapes only the entered URL. A maxDepth of 1 scrapes the entered URL and all pages one level deep. A maxDepth of 2 scrapes the entered URL and all pages up to two levels deep. Higher values follow the same pattern.\",\n                        \"type\": \"integer\",\n                      },\n                      \"mode\": {\n                        \"default\": \"default\",\n                        \"description\": \"The crawling mode to use. Fast mode crawls 4x faster websites without sitemap, but may not be as accurate and shouldn't be used in heavy js-rendered websites.\",\n                        \"enum\": [\n                          \"default\",\n                          \"fast\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                      \"returnOnlyUrls\": {\n                        \"default\": false,\n                        \"description\": \"If true, returns only the URLs as a list on the crawl status. Attention: the return response will be a list of URLs inside the data, not a list of documents.\",\n                        \"type\": \"boolean\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"pageOptions\": {\n                    \"properties\": {\n                      \"fullPageScreenshot\": {\n                        \"default\": false,\n                        \"description\": \"Include a full page screenshot of the page that you are scraping.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"headers\": {\n                        \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n                        \"type\": \"object\",\n                      },\n                      \"includeHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeRawHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"onlyIncludeTags\": {\n                        \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"onlyMainContent\": {\n                        \"default\": false,\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"removeTags\": {\n                        \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n                        \"items\": {\n                          \"type\": \"string\",\n                        },\n                        \"type\": \"array\",\n                      },\n                      \"replaceAllPathsWithAbsolutePaths\": {\n                        \"default\": false,\n                        \"description\": \"Replace all relative paths with absolute paths for images and links\",\n                        \"type\": \"boolean\",\n                      },\n                      \"screenshot\": {\n                        \"default\": false,\n                        \"description\": \"Include a screenshot of the top of the page that you are scraping.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"waitFor\": {\n                        \"default\": 0,\n                        \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                        \"type\": \"integer\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"url\": {\n                    \"description\": \"The base URL to start crawling from\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/CrawlResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Crawl multiple URLs based on options\",\n        \"tags\": [\n          \"Crawling\",\n        ],\n      },\n    },\n    \"/crawl/cancel/{jobId}\": {\n      \"delete\": {\n        \"operationId\": \"cancelCrawlJob\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of the crawl job\",\n            \"in\": \"path\",\n            \"name\": \"jobId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"status\": {\n                      \"description\": \"Returns cancelled.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Cancel a crawl job\",\n        \"tags\": [\n          \"Crawl\",\n        ],\n      },\n    },\n    \"/crawl/status/{jobId}\": {\n      \"get\": {\n        \"operationId\": \"getCrawlStatus\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of the crawl job\",\n            \"in\": \"path\",\n            \"name\": \"jobId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"current\": {\n                      \"description\": \"Current page number\",\n                      \"type\": \"integer\",\n                    },\n                    \"data\": {\n                      \"description\": \"Data returned from the job (null when it is in progress)\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"partial_data\": {\n                      \"description\": \"Partial documents returned as it is being crawled (streaming). **This feature is currently in alpha - expect breaking changes** When a page is ready, it will append to the partial_data array, so there is no need to wait for the entire website to be crawled. When the crawl is done, partial_data will become empty and the result will be available in \\`data\\`. There is a max of 50 items in the array response. The oldest item (top of the array) will be removed when the new item is added to the array.\",\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/CrawlStatusResponseObj\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"status\": {\n                      \"description\": \"Status of the job (completed, active, failed, paused)\",\n                      \"type\": \"string\",\n                    },\n                    \"total\": {\n                      \"description\": \"Total number of pages\",\n                      \"type\": \"integer\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Get the status of a crawl job\",\n        \"tags\": [\n          \"Crawl\",\n        ],\n      },\n    },\n    \"/scrape\": {\n      \"post\": {\n        \"operationId\": \"scrape\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"excludeTags\": {\n                    \"description\": \"Tags, classes and ids to remove from the page. Use comma separated values. Example: 'script, .ad, #footer'\",\n                    \"items\": {\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"formats\": {\n                    \"default\": [\n                      \"markdown\",\n                    ],\n                    \"description\": \"Specific formats to return.\n\n - markdown: The page in Markdown format.\n - html: The page's HTML, trimmed to include only meaningful content.\n - rawHtml: The page's original HTML.\n - links: The links on the page.\n - screenshot: A screenshot of the top of the page.\n - screenshot@fullPage: A screenshot of the full page. (overridden by screenshot if present)\",\n                    \"items\": {\n                      \"enum\": [\n                        \"markdown\",\n                        \"html\",\n                        \"rawHtml\",\n                        \"links\",\n                        \"screenshot\",\n                        \"screenshot@fullPage\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"headers\": {\n                    \"description\": \"Headers to send with the request. Can be used to send cookies, user-agent, etc.\",\n                    \"type\": \"object\",\n                  },\n                  \"includeTags\": {\n                    \"description\": \"Only include tags, classes and ids from the page in the final output. Use comma separated values. Example: 'script, .ad, #footer'\",\n                    \"items\": {\n                      \"type\": \"string\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"onlyMainContent\": {\n                    \"default\": true,\n                    \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                    \"type\": \"boolean\",\n                  },\n                  \"timeout\": {\n                    \"default\": 30000,\n                    \"description\": \"Timeout in milliseconds for the request\",\n                    \"type\": \"integer\",\n                  },\n                  \"url\": {\n                    \"description\": \"The URL to scrape\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"waitFor\": {\n                    \"default\": 0,\n                    \"description\": \"Wait x amount of milliseconds for the page to load to fetch content\",\n                    \"type\": \"integer\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ScrapeResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Scrape a single URL\",\n        \"tags\": [\n          \"Scraping\",\n        ],\n      },\n    },\n    \"/search\": {\n      \"post\": {\n        \"operationId\": \"searchGoogle\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"pageOptions\": {\n                    \"properties\": {\n                      \"fetchPageContent\": {\n                        \"default\": true,\n                        \"description\": \"Fetch the content of each page. If false, defaults to a basic fast serp API.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the HTML version of the content on page. Will output a html key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"includeRawHtml\": {\n                        \"default\": false,\n                        \"description\": \"Include the raw HTML content of the page. Will output a rawHtml key in the response.\",\n                        \"type\": \"boolean\",\n                      },\n                      \"onlyMainContent\": {\n                        \"default\": false,\n                        \"description\": \"Only return the main content of the page excluding headers, navs, footers, etc.\",\n                        \"type\": \"boolean\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                  \"query\": {\n                    \"description\": \"The query to search for\",\n                    \"format\": \"uri\",\n                    \"type\": \"string\",\n                  },\n                  \"searchOptions\": {\n                    \"properties\": {\n                      \"limit\": {\n                        \"description\": \"Maximum number of results. Max is 20 during beta.\",\n                        \"type\": \"integer\",\n                      },\n                    },\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"query\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n          \"402\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Payment required to access this resource.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Payment required\",\n          },\n          \"429\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"Request rate limit exceeded. Please wait and try again later.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Too many requests\",\n          },\n          \"500\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"example\": \"An unexpected error occurred on the server.\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Server error\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerAuth\": [],\n          },\n        ],\n        \"summary\": \"Search for a keyword in Google, returns top page results with markdown content for each page\",\n        \"tags\": [\n          \"Search\",\n        ],\n      },\n    },\n  },\n  \"security\": [\n    {\n      \"bearerAuth\": [],\n    },\n  ],\n  \"servers\": [\n    {\n      \"url\": \"https://api.firecrawl.dev/v0\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > notion.json (file url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"AnnotationRequest\": {\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\",\n          },\n          \"code\": {\n            \"type\": \"boolean\",\n          },\n          \"color\": {\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\",\n            ],\n            \"type\": \"string\",\n          },\n          \"italic\": {\n            \"type\": \"boolean\",\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\",\n          },\n          \"underline\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"AnnotationResponse\": {\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\",\n          },\n          \"code\": {\n            \"type\": \"boolean\",\n          },\n          \"color\": {\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\",\n            ],\n            \"type\": \"string\",\n          },\n          \"italic\": {\n            \"type\": \"boolean\",\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\",\n          },\n          \"underline\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"required\": [\n          \"bold\",\n          \"italic\",\n          \"strikethrough\",\n          \"underline\",\n          \"code\",\n          \"color\",\n        ],\n        \"type\": \"object\",\n      },\n      \"AppendBlockChildrenParameters\": {\n        \"properties\": {\n          \"children\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"children\",\n        ],\n        \"type\": \"object\",\n      },\n      \"AppendBlockChildrenResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"BlockObjectRequest\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"paragraph\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"paragraph\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"paragraph\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_1\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_1\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_1\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_2\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_2\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_2\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_3\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_3\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_3\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"bulleted_list_item\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"bulleted_list_item\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"bulleted_list_item\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"numbered_list_item\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"numbered_list_item\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"numbered_list_item\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"to_do\": {\n                \"properties\": {\n                  \"checked\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                  \"checked\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"to_do\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"to_do\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"toggle\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"toggle\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"toggle\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"code\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"language\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                  \"language\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"code\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"code\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"child_page\": {\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"title\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"child_page\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"child_page\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"child_database\": {\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"title\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"child_database\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"child_database\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"embed\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"embed\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"embed\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"image\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"image\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"image\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"video\",\n                ],\n                \"type\": \"string\",\n              },\n              \"video\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"video\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"file\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"file\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"file\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"pdf\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"pdf\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"pdf\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"bookmark\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"bookmark\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"bookmark\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"equation\": {\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"expression\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"equation\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"equation\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"divider\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"divider\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"divider\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table_of_contents\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table_of_contents\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table_of_contents\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"column_list\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"column_list\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"column_list\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"column\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"column\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"column\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"link_to_page\": {\n                \"oneOf\": [\n                  {\n                    \"properties\": {\n                      \"page_id\": {\n                        \"type\": \"string\",\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"page_id\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"type\",\n                      \"page_id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"database_id\": {\n                        \"type\": \"string\",\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"database_id\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"type\",\n                      \"database_id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                ],\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"link_to_page\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"link_to_page\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table\": {\n                \"properties\": {\n                  \"children\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"has_column_header\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"has_row_header\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"table_width\": {\n                    \"type\": \"integer\",\n                  },\n                },\n                \"required\": [\n                  \"table_width\",\n                  \"children\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table_row\": {\n                \"properties\": {\n                  \"cells\": {\n                    \"items\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"cells\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table_row\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table_row\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"synced_block\": {\n                \"properties\": {\n                  \"children\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"synced_from\": {\n                    \"oneOf\": [\n                      {\n                        \"properties\": {\n                          \"block_id\": {\n                            \"type\": \"string\",\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"block_id\",\n                            ],\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"type\",\n                          \"block_id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                      {\n                        \"type\": \"null\",\n                      },\n                    ],\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"synced_block\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"synced_block\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"BlockObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"has_children\": {\n            \"type\": \"boolean\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"block\",\n            ],\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"has_children\",\n          \"archived\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CheckboxPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"boolean\",\n          },\n          \"equals\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CheckboxPropertyResponse\": {\n        \"properties\": {\n          \"checkbox\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"checkbox\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"checkbox\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CommentObjectResponse\": {\n        \"properties\": {\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"discussion_id\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"comment\",\n            ],\n            \"type\": \"string\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"block_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"block_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"block_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"rich_text\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"parent\",\n          \"discussion_id\",\n          \"rich_text\",\n          \"created_by\",\n          \"created_time\",\n          \"last_edited_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CompoundFilter\": {\n        \"properties\": {\n          \"and\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\",\n            },\n            \"type\": \"array\",\n          },\n          \"or\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CreateCommentParameters\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"parent\": {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"parent\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"discussion_id\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"discussion_id\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"CreateDatabaseParameters\": {\n        \"properties\": {\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"emoji\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertySchema\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"parent\",\n          \"properties\",\n          \"title\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatePageParameters\": {\n        \"properties\": {\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n            \"type\": \"object\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"title\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"title\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"rich_text\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\n                        \"number\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"number\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"select\": {\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\",\n                        },\n                      },\n                      \"required\": [\n                        \"name\",\n                      ],\n                      \"type\": [\n                        \"object\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"select\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"parent\",\n          \"properties\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatedByPropertyResponse\": {\n        \"properties\": {\n          \"created_by\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"created_by\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"created_by\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatedTimePropertyResponse\": {\n        \"properties\": {\n          \"created_time\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"created_time\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"created_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DatabaseObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"emoji\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"last_edited_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"database\",\n            ],\n            \"type\": \"string\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"workspace\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"workspace\": {\n                    \"enum\": [\n                      true,\n                    ],\n                    \"type\": \"boolean\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"workspace\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n          \"url\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"created_by\",\n          \"last_edited_time\",\n          \"last_edited_by\",\n          \"title\",\n          \"description\",\n          \"is_inline\",\n          \"properties\",\n          \"parent\",\n          \"url\",\n          \"archived\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DatabasePropertyConfigResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TitlePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RichTextPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/NumberPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/SelectPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/MultiSelectPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/DatePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/PeoplePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/FilePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CheckboxPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/URLPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/EmailPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/PhoneNumberPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/FormulaPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RelationPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RollupPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedTimePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedByPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedTimePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedByPropertyResponse\",\n          },\n        ],\n      },\n      \"DatePropertyFilter\": {\n        \"properties\": {\n          \"after\": {\n            \"type\": \"string\",\n          },\n          \"before\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"next_month\": {},\n          \"next_week\": {},\n          \"next_year\": {},\n          \"on_or_after\": {\n            \"type\": \"string\",\n          },\n          \"on_or_before\": {\n            \"type\": \"string\",\n          },\n          \"past_month\": {},\n          \"past_week\": {},\n          \"past_year\": {},\n        },\n        \"type\": \"object\",\n      },\n      \"DatePropertyResponse\": {\n        \"properties\": {\n          \"date\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"date\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"date\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DateRequest\": {\n        \"properties\": {\n          \"end\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"start\": {\n            \"type\": \"string\",\n          },\n          \"time_zone\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"start\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DateResponse\": {\n        \"properties\": {\n          \"end\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"start\": {\n            \"type\": \"string\",\n          },\n          \"time_zone\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"start\",\n          \"end\",\n          \"time_zone\",\n        ],\n        \"type\": \"object\",\n      },\n      \"EmailPropertyResponse\": {\n        \"properties\": {\n          \"email\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"email\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"email\",\n        ],\n        \"type\": \"object\",\n      },\n      \"EquationRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"equation\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"expression\",\n            ],\n            \"type\": \"object\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"equation\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"equation\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"FilePropertyResponse\": {\n        \"properties\": {\n          \"files\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"files\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"files\",\n        ],\n        \"type\": \"object\",\n      },\n      \"FilesPropertyFilter\": {\n        \"properties\": {\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"FormulaPropertyResponse\": {\n        \"properties\": {\n          \"formula\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"expression\",\n            ],\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"formula\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"formula\",\n        ],\n        \"type\": \"object\",\n      },\n      \"LastEditedByPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_by\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"last_edited_by\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"last_edited_by\",\n        ],\n        \"type\": \"object\",\n      },\n      \"LastEditedTimePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"last_edited_time\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"last_edited_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListBlockChildrenResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListCommentsResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/CommentObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListDatabasesResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListUsersResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/UserObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"MentionRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"mention\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"user\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                      },\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"user\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"date\": {\n                    \"$ref\": \"#/components/schemas/DateResponse\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"date\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"date\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"link_preview\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"link_preview\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"link_preview\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"page\": {\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database\": {\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"mention\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"mention\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"MultiSelectPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"MultiSelectPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"multi_select\": {\n            \"properties\": {\n              \"options\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"options\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"multi_select\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"multi_select\",\n        ],\n        \"type\": \"object\",\n      },\n      \"NumberPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"number\",\n          },\n          \"equals\": {\n            \"type\": \"number\",\n          },\n          \"greater_than\": {\n            \"type\": \"number\",\n          },\n          \"greater_than_or_equal_to\": {\n            \"type\": \"number\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"less_than\": {\n            \"type\": \"number\",\n          },\n          \"less_than_or_equal_to\": {\n            \"type\": \"number\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"NumberPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"number\": {\n            \"properties\": {\n              \"format\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"format\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"number\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"number\",\n        ],\n        \"type\": \"object\",\n      },\n      \"OauthTokenParameters\": {\n        \"properties\": {\n          \"code\": {\n            \"type\": \"string\",\n          },\n          \"external_account\": {\n            \"properties\": {\n              \"key\": {\n                \"type\": \"string\",\n              },\n              \"name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"key\",\n              \"name\",\n            ],\n            \"type\": \"object\",\n          },\n          \"grant_type\": {\n            \"type\": \"string\",\n          },\n          \"redirect_uri\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"grant_type\",\n          \"code\",\n        ],\n        \"type\": \"object\",\n      },\n      \"OauthTokenResponse\": {\n        \"properties\": {\n          \"access_token\": {\n            \"type\": \"string\",\n          },\n          \"bot_id\": {\n            \"type\": \"string\",\n          },\n          \"duplicated_template_id\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"owner\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"user\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n                      },\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"user\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"workspace\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"workspace\": {\n                    \"enum\": [\n                      true,\n                    ],\n                    \"type\": \"boolean\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"workspace\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"token_type\": {\n            \"enum\": [\n              \"bearer\",\n            ],\n            \"type\": \"string\",\n          },\n          \"workspace_icon\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"workspace_id\": {\n            \"type\": \"string\",\n          },\n          \"workspace_name\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"access_token\",\n          \"token_type\",\n          \"bot_id\",\n          \"workspace_name\",\n          \"workspace_icon\",\n          \"workspace_id\",\n          \"owner\",\n          \"duplicated_template_id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PageObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"page\",\n            ],\n            \"type\": \"string\",\n          },\n          \"url\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"archived\",\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialBlockObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"block\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialCommentObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"comment\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialDatabaseObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"database\",\n            ],\n            \"type\": \"string\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\",\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"properties\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialPageObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"page\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialUserObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"user\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PeoplePropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"PeoplePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"people\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"people\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"people\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PhoneNumberPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"phone_number\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"phone_number\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"phone_number\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyFilter\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"title\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"title\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"number\": {\n                \"$ref\": \"#/components/schemas/NumberPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"number\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"checkbox\": {\n                \"$ref\": \"#/components/schemas/CheckboxPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"checkbox\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"select\": {\n                \"$ref\": \"#/components/schemas/SelectPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"select\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"multi_select\": {\n                \"$ref\": \"#/components/schemas/MultiSelectPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"multi_select\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"date\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"date\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"people\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"people\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"files\": {\n                \"$ref\": \"#/components/schemas/FilesPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"files\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"url\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"url\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"email\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"email\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"phone_number\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"phone_number\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"relation\": {\n                \"$ref\": \"#/components/schemas/RelationPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"relation\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"created_by\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"created_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"last_edited_by\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"last_edited_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"created_time\",\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"timestamp\",\n              \"created_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"created_time\",\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"timestamp\",\n              \"last_edited_time\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"PropertyItemListResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyItemObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertySchema\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyUpdateSchema\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"QueryDatabaseParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"filter\": {\n            \"oneOf\": [\n              {\n                \"$ref\": \"#/components/schemas/PropertyFilter\",\n              },\n              {\n                \"$ref\": \"#/components/schemas/CompoundFilter\",\n              },\n            ],\n          },\n          \"page_size\": {\n            \"type\": \"integer\",\n          },\n          \"sorts\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"direction\": {\n                      \"enum\": [\n                        \"ascending\",\n                        \"descending\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"property\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"property\",\n                    \"direction\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"direction\": {\n                      \"enum\": [\n                        \"ascending\",\n                        \"descending\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"timestamp\": {\n                      \"enum\": [\n                        \"created_time\",\n                        \"last_edited_time\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"timestamp\",\n                    \"direction\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n          \"start_cursor\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"QueryDatabaseResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RelationPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"RelationPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"relation\": {\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\",\n              },\n              \"synced_property_id\": {\n                \"type\": \"string\",\n              },\n              \"synced_property_name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"database_id\",\n              \"synced_property_name\",\n              \"synced_property_id\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"relation\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"relation\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RichTextItemRequest\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"text\": {\n                \"properties\": {\n                  \"content\": {\n                    \"type\": \"string\",\n                  },\n                  \"link\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": [\n                      \"object\",\n                      \"null\",\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"content\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"text\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"mention\": {\n                \"oneOf\": [\n                  {\n                    \"properties\": {\n                      \"user\": {\n                        \"oneOf\": [\n                          {\n                            \"properties\": {\n                              \"id\": {\n                                \"type\": \"string\",\n                              },\n                            },\n                            \"required\": [\n                              \"id\",\n                            ],\n                            \"type\": \"object\",\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                          },\n                        ],\n                      },\n                    },\n                    \"required\": [\n                      \"user\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"page\": {\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                    },\n                    \"required\": [\n                      \"page\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"database\": {\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                    },\n                    \"required\": [\n                      \"database\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"date\": {\n                        \"$ref\": \"#/components/schemas/DateRequest\",\n                      },\n                    },\n                    \"required\": [\n                      \"date\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                ],\n              },\n              \"type\": {\n                \"enum\": [\n                  \"mention\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"mention\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"equation\": {\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"expression\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"equation\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"equation\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"RichTextItemResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TextRichTextItemResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/MentionRichTextItemResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/EquationRichTextItemResponse\",\n          },\n        ],\n      },\n      \"RichTextPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"rich_text\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"rich_text\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"rich_text\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RollupPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"rollup\": {\n            \"properties\": {\n              \"function\": {\n                \"type\": \"string\",\n              },\n              \"relation_property_id\": {\n                \"type\": \"string\",\n              },\n              \"relation_property_name\": {\n                \"type\": \"string\",\n              },\n              \"rollup_property_id\": {\n                \"type\": \"string\",\n              },\n              \"rollup_property_name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"relation_property_name\",\n              \"relation_property_id\",\n              \"rollup_property_name\",\n              \"rollup_property_id\",\n              \"function\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"rollup\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"rollup\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SearchParameters\": {\n        \"properties\": {\n          \"filter\": {\n            \"properties\": {\n              \"property\": {\n                \"enum\": [\n                  \"object\",\n                ],\n                \"type\": \"string\",\n              },\n              \"value\": {\n                \"enum\": [\n                  \"page\",\n                  \"database\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"value\",\n              \"property\",\n            ],\n            \"type\": \"object\",\n          },\n          \"page_size\": {\n            \"type\": \"integer\",\n          },\n          \"query\": {\n            \"type\": \"string\",\n          },\n          \"sort\": {\n            \"properties\": {\n              \"direction\": {\n                \"enum\": [\n                  \"ascending\",\n                  \"descending\",\n                ],\n                \"type\": \"string\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"direction\",\n              \"timestamp\",\n            ],\n            \"type\": \"object\",\n          },\n          \"start_cursor\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SearchResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SelectOption\": {\n        \"properties\": {\n          \"color\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n          \"color\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SelectPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SelectPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"select\": {\n            \"properties\": {\n              \"options\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"options\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"select\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"select\",\n        ],\n        \"type\": \"object\",\n      },\n      \"TextPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"does_not_equal\": {\n            \"type\": \"string\",\n          },\n          \"ends_with\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"starts_with\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"TextRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"text\": {\n            \"properties\": {\n              \"content\": {\n                \"type\": \"string\",\n              },\n              \"link\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": [\n                  \"object\",\n                  \"null\",\n                ],\n              },\n            },\n            \"required\": [\n              \"content\",\n              \"link\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"text\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"text\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"TitlePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"title\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"title\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"title\",\n        ],\n        \"type\": \"object\",\n      },\n      \"URLPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"url\",\n            ],\n            \"type\": \"string\",\n          },\n          \"url\": {\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"UpdateBlockParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"bookmark\": {\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"breadcrumb\": {\n            \"type\": \"object\",\n          },\n          \"bulleted_list_item\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"code\": {\n            \"properties\": {\n              \"language\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"column\": {\n            \"type\": \"object\",\n          },\n          \"column_list\": {\n            \"type\": \"object\",\n          },\n          \"divider\": {\n            \"type\": \"object\",\n          },\n          \"embed\": {\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"equation\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"file\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_1\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_2\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_3\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"image\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"link_to_page\": {\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\",\n              },\n              \"page_id\": {\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"page_id\",\n                  \"database_id\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"numbered_list_item\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"paragraph\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"pdf\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"quote\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"table_of_contents\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"table_row\": {\n            \"properties\": {\n              \"cells\": {\n                \"items\": {\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                  },\n                  \"type\": \"array\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"to_do\": {\n            \"properties\": {\n              \"checked\": {\n                \"type\": \"boolean\",\n              },\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"toggle\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"video\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UpdateDatabaseParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"emoji\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertyUpdateSchema\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UpdatePageParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"title\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"title\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"rich_text\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\n                        \"number\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"number\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"select\": {\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\",\n                        },\n                      },\n                      \"required\": [\n                        \"name\",\n                      ],\n                      \"type\": [\n                        \"object\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"select\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UserObjectResponse\": {\n        \"properties\": {\n          \"avatar_url\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"user\",\n            ],\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"person\",\n              \"bot\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"name\",\n          \"avatar_url\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    \"securitySchemes\": {\n      \"oauth2\": {\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://api.notion.com/v1/oauth/authorize\",\n            \"scopes\": {},\n            \"tokenUrl\": \"https://api.notion.com/v1/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"API specification for Notion\",\n    \"title\": \"Notion API\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/blocks/{block_id}\": {\n      \"delete\": {\n        \"operationId\": \"deleteBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Delete block\",\n      },\n      \"get\": {\n        \"operationId\": \"getBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get block\",\n      },\n      \"patch\": {\n        \"operationId\": \"updateBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateBlockParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update block\",\n      },\n    },\n    \"/blocks/{block_id}/children\": {\n      \"get\": {\n        \"operationId\": \"listBlockChildren\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListBlockChildrenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List block children\",\n      },\n      \"patch\": {\n        \"operationId\": \"appendBlockChildren\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/AppendBlockChildrenParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/AppendBlockChildrenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Append block children\",\n      },\n    },\n    \"/comments\": {\n      \"get\": {\n        \"operationId\": \"listComments\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListCommentsResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List comments\",\n      },\n      \"post\": {\n        \"operationId\": \"createComment\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateCommentParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/CommentObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialCommentObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create comment\",\n      },\n    },\n    \"/databases\": {\n      \"get\": {\n        \"operationId\": \"listDatabases\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListDatabasesResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List databases\",\n      },\n      \"post\": {\n        \"operationId\": \"createDatabase\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create database\",\n      },\n    },\n    \"/databases/{database_id}\": {\n      \"get\": {\n        \"operationId\": \"getDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get database\",\n      },\n      \"patch\": {\n        \"operationId\": \"updateDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update database\",\n      },\n    },\n    \"/databases/{database_id}/query\": {\n      \"post\": {\n        \"operationId\": \"queryDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"filter_properties\",\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/QueryDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/QueryDatabaseResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Query database\",\n      },\n    },\n    \"/oauth/token\": {\n      \"post\": {\n        \"operationId\": \"oauthToken\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/OauthTokenParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/OauthTokenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"OAuth token\",\n      },\n    },\n    \"/pages\": {\n      \"post\": {\n        \"operationId\": \"createPage\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreatePageParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create page\",\n      },\n    },\n    \"/pages/{page_id}\": {\n      \"get\": {\n        \"operationId\": \"getPage\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"filter_properties\",\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get page\",\n      },\n      \"patch\": {\n        \"operationId\": \"updatePage\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdatePageParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update page\",\n      },\n    },\n    \"/pages/{page_id}/properties/{property_id}\": {\n      \"get\": {\n        \"operationId\": \"getPageProperty\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"property_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemListResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get page property\",\n      },\n    },\n    \"/search\": {\n      \"post\": {\n        \"operationId\": \"search\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/SearchParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Search\",\n      },\n    },\n    \"/users\": {\n      \"get\": {\n        \"operationId\": \"listUsers\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListUsersResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List users\",\n      },\n    },\n    \"/users/me\": {\n      \"get\": {\n        \"operationId\": \"getSelf\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get current user\",\n      },\n    },\n    \"/users/{user_id}\": {\n      \"get\": {\n        \"operationId\": \"getUser\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"user_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get user\",\n      },\n    },\n  },\n  \"security\": [\n    {\n      \"oauth2\": [],\n    },\n  ],\n  \"servers\": [\n    {\n      \"url\": \"https://api.notion.so\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > notion.json (http url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"AnnotationRequest\": {\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\",\n          },\n          \"code\": {\n            \"type\": \"boolean\",\n          },\n          \"color\": {\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\",\n            ],\n            \"type\": \"string\",\n          },\n          \"italic\": {\n            \"type\": \"boolean\",\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\",\n          },\n          \"underline\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"AnnotationResponse\": {\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\",\n          },\n          \"code\": {\n            \"type\": \"boolean\",\n          },\n          \"color\": {\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\",\n            ],\n            \"type\": \"string\",\n          },\n          \"italic\": {\n            \"type\": \"boolean\",\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\",\n          },\n          \"underline\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"required\": [\n          \"bold\",\n          \"italic\",\n          \"strikethrough\",\n          \"underline\",\n          \"code\",\n          \"color\",\n        ],\n        \"type\": \"object\",\n      },\n      \"AppendBlockChildrenParameters\": {\n        \"properties\": {\n          \"children\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"children\",\n        ],\n        \"type\": \"object\",\n      },\n      \"AppendBlockChildrenResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"BlockObjectRequest\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"paragraph\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"paragraph\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"paragraph\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_1\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_1\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_1\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_2\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_2\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_2\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_3\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_3\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_3\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"bulleted_list_item\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"bulleted_list_item\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"bulleted_list_item\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"numbered_list_item\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"numbered_list_item\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"numbered_list_item\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"to_do\": {\n                \"properties\": {\n                  \"checked\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                  \"checked\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"to_do\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"to_do\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"toggle\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"toggle\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"toggle\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"code\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"language\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                  \"language\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"code\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"code\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"child_page\": {\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"title\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"child_page\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"child_page\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"child_database\": {\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"title\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"child_database\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"child_database\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"embed\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"embed\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"embed\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"image\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"image\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"image\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"video\",\n                ],\n                \"type\": \"string\",\n              },\n              \"video\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"video\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"file\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"file\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"file\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"pdf\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"pdf\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"pdf\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"bookmark\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"bookmark\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"bookmark\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"equation\": {\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"expression\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"equation\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"equation\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"divider\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"divider\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"divider\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table_of_contents\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table_of_contents\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table_of_contents\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"column_list\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"column_list\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"column_list\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"column\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"column\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"column\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"link_to_page\": {\n                \"oneOf\": [\n                  {\n                    \"properties\": {\n                      \"page_id\": {\n                        \"type\": \"string\",\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"page_id\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"type\",\n                      \"page_id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"database_id\": {\n                        \"type\": \"string\",\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"database_id\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"type\",\n                      \"database_id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                ],\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"link_to_page\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"link_to_page\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table\": {\n                \"properties\": {\n                  \"children\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"has_column_header\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"has_row_header\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"table_width\": {\n                    \"type\": \"integer\",\n                  },\n                },\n                \"required\": [\n                  \"table_width\",\n                  \"children\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table_row\": {\n                \"properties\": {\n                  \"cells\": {\n                    \"items\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"cells\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table_row\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table_row\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"synced_block\": {\n                \"properties\": {\n                  \"children\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"synced_from\": {\n                    \"oneOf\": [\n                      {\n                        \"properties\": {\n                          \"block_id\": {\n                            \"type\": \"string\",\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"block_id\",\n                            ],\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"type\",\n                          \"block_id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                      {\n                        \"type\": \"null\",\n                      },\n                    ],\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"synced_block\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"synced_block\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"BlockObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"has_children\": {\n            \"type\": \"boolean\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"block\",\n            ],\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"has_children\",\n          \"archived\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CheckboxPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"boolean\",\n          },\n          \"equals\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CheckboxPropertyResponse\": {\n        \"properties\": {\n          \"checkbox\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"checkbox\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"checkbox\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CommentObjectResponse\": {\n        \"properties\": {\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"discussion_id\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"comment\",\n            ],\n            \"type\": \"string\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"block_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"block_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"block_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"rich_text\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"parent\",\n          \"discussion_id\",\n          \"rich_text\",\n          \"created_by\",\n          \"created_time\",\n          \"last_edited_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CompoundFilter\": {\n        \"properties\": {\n          \"and\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\",\n            },\n            \"type\": \"array\",\n          },\n          \"or\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CreateCommentParameters\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"parent\": {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"parent\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"discussion_id\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"discussion_id\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"CreateDatabaseParameters\": {\n        \"properties\": {\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"emoji\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertySchema\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"parent\",\n          \"properties\",\n          \"title\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatePageParameters\": {\n        \"properties\": {\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n            \"type\": \"object\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"title\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"title\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"rich_text\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\n                        \"number\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"number\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"select\": {\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\",\n                        },\n                      },\n                      \"required\": [\n                        \"name\",\n                      ],\n                      \"type\": [\n                        \"object\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"select\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"parent\",\n          \"properties\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatedByPropertyResponse\": {\n        \"properties\": {\n          \"created_by\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"created_by\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"created_by\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatedTimePropertyResponse\": {\n        \"properties\": {\n          \"created_time\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"created_time\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"created_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DatabaseObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"emoji\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"last_edited_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"database\",\n            ],\n            \"type\": \"string\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"workspace\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"workspace\": {\n                    \"enum\": [\n                      true,\n                    ],\n                    \"type\": \"boolean\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"workspace\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n          \"url\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"created_by\",\n          \"last_edited_time\",\n          \"last_edited_by\",\n          \"title\",\n          \"description\",\n          \"is_inline\",\n          \"properties\",\n          \"parent\",\n          \"url\",\n          \"archived\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DatabasePropertyConfigResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TitlePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RichTextPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/NumberPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/SelectPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/MultiSelectPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/DatePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/PeoplePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/FilePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CheckboxPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/URLPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/EmailPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/PhoneNumberPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/FormulaPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RelationPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RollupPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedTimePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedByPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedTimePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedByPropertyResponse\",\n          },\n        ],\n      },\n      \"DatePropertyFilter\": {\n        \"properties\": {\n          \"after\": {\n            \"type\": \"string\",\n          },\n          \"before\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"next_month\": {},\n          \"next_week\": {},\n          \"next_year\": {},\n          \"on_or_after\": {\n            \"type\": \"string\",\n          },\n          \"on_or_before\": {\n            \"type\": \"string\",\n          },\n          \"past_month\": {},\n          \"past_week\": {},\n          \"past_year\": {},\n        },\n        \"type\": \"object\",\n      },\n      \"DatePropertyResponse\": {\n        \"properties\": {\n          \"date\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"date\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"date\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DateRequest\": {\n        \"properties\": {\n          \"end\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"start\": {\n            \"type\": \"string\",\n          },\n          \"time_zone\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"start\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DateResponse\": {\n        \"properties\": {\n          \"end\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"start\": {\n            \"type\": \"string\",\n          },\n          \"time_zone\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"start\",\n          \"end\",\n          \"time_zone\",\n        ],\n        \"type\": \"object\",\n      },\n      \"EmailPropertyResponse\": {\n        \"properties\": {\n          \"email\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"email\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"email\",\n        ],\n        \"type\": \"object\",\n      },\n      \"EquationRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"equation\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"expression\",\n            ],\n            \"type\": \"object\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"equation\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"equation\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"FilePropertyResponse\": {\n        \"properties\": {\n          \"files\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"files\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"files\",\n        ],\n        \"type\": \"object\",\n      },\n      \"FilesPropertyFilter\": {\n        \"properties\": {\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"FormulaPropertyResponse\": {\n        \"properties\": {\n          \"formula\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"expression\",\n            ],\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"formula\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"formula\",\n        ],\n        \"type\": \"object\",\n      },\n      \"LastEditedByPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_by\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"last_edited_by\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"last_edited_by\",\n        ],\n        \"type\": \"object\",\n      },\n      \"LastEditedTimePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"last_edited_time\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"last_edited_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListBlockChildrenResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListCommentsResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/CommentObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListDatabasesResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListUsersResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/UserObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"MentionRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"mention\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"user\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                      },\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"user\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"date\": {\n                    \"$ref\": \"#/components/schemas/DateResponse\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"date\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"date\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"link_preview\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"link_preview\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"link_preview\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"page\": {\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database\": {\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"mention\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"mention\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"MultiSelectPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"MultiSelectPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"multi_select\": {\n            \"properties\": {\n              \"options\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"options\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"multi_select\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"multi_select\",\n        ],\n        \"type\": \"object\",\n      },\n      \"NumberPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"number\",\n          },\n          \"equals\": {\n            \"type\": \"number\",\n          },\n          \"greater_than\": {\n            \"type\": \"number\",\n          },\n          \"greater_than_or_equal_to\": {\n            \"type\": \"number\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"less_than\": {\n            \"type\": \"number\",\n          },\n          \"less_than_or_equal_to\": {\n            \"type\": \"number\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"NumberPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"number\": {\n            \"properties\": {\n              \"format\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"format\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"number\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"number\",\n        ],\n        \"type\": \"object\",\n      },\n      \"OauthTokenParameters\": {\n        \"properties\": {\n          \"code\": {\n            \"type\": \"string\",\n          },\n          \"external_account\": {\n            \"properties\": {\n              \"key\": {\n                \"type\": \"string\",\n              },\n              \"name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"key\",\n              \"name\",\n            ],\n            \"type\": \"object\",\n          },\n          \"grant_type\": {\n            \"type\": \"string\",\n          },\n          \"redirect_uri\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"grant_type\",\n          \"code\",\n        ],\n        \"type\": \"object\",\n      },\n      \"OauthTokenResponse\": {\n        \"properties\": {\n          \"access_token\": {\n            \"type\": \"string\",\n          },\n          \"bot_id\": {\n            \"type\": \"string\",\n          },\n          \"duplicated_template_id\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"owner\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"user\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n                      },\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"user\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"workspace\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"workspace\": {\n                    \"enum\": [\n                      true,\n                    ],\n                    \"type\": \"boolean\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"workspace\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"token_type\": {\n            \"enum\": [\n              \"bearer\",\n            ],\n            \"type\": \"string\",\n          },\n          \"workspace_icon\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"workspace_id\": {\n            \"type\": \"string\",\n          },\n          \"workspace_name\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"access_token\",\n          \"token_type\",\n          \"bot_id\",\n          \"workspace_name\",\n          \"workspace_icon\",\n          \"workspace_id\",\n          \"owner\",\n          \"duplicated_template_id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PageObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"page\",\n            ],\n            \"type\": \"string\",\n          },\n          \"url\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"archived\",\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialBlockObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"block\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialCommentObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"comment\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialDatabaseObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"database\",\n            ],\n            \"type\": \"string\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\",\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"properties\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialPageObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"page\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialUserObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"user\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PeoplePropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"PeoplePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"people\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"people\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"people\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PhoneNumberPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"phone_number\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"phone_number\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"phone_number\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyFilter\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"title\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"title\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"number\": {\n                \"$ref\": \"#/components/schemas/NumberPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"number\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"checkbox\": {\n                \"$ref\": \"#/components/schemas/CheckboxPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"checkbox\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"select\": {\n                \"$ref\": \"#/components/schemas/SelectPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"select\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"multi_select\": {\n                \"$ref\": \"#/components/schemas/MultiSelectPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"multi_select\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"date\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"date\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"people\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"people\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"files\": {\n                \"$ref\": \"#/components/schemas/FilesPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"files\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"url\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"url\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"email\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"email\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"phone_number\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"phone_number\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"relation\": {\n                \"$ref\": \"#/components/schemas/RelationPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"relation\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"created_by\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"created_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"last_edited_by\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"last_edited_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"created_time\",\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"timestamp\",\n              \"created_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"created_time\",\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"timestamp\",\n              \"last_edited_time\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"PropertyItemListResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyItemObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertySchema\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyUpdateSchema\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"QueryDatabaseParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"filter\": {\n            \"oneOf\": [\n              {\n                \"$ref\": \"#/components/schemas/PropertyFilter\",\n              },\n              {\n                \"$ref\": \"#/components/schemas/CompoundFilter\",\n              },\n            ],\n          },\n          \"page_size\": {\n            \"type\": \"integer\",\n          },\n          \"sorts\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"direction\": {\n                      \"enum\": [\n                        \"ascending\",\n                        \"descending\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"property\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"property\",\n                    \"direction\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"direction\": {\n                      \"enum\": [\n                        \"ascending\",\n                        \"descending\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"timestamp\": {\n                      \"enum\": [\n                        \"created_time\",\n                        \"last_edited_time\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"timestamp\",\n                    \"direction\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n          \"start_cursor\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"QueryDatabaseResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RelationPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"RelationPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"relation\": {\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\",\n              },\n              \"synced_property_id\": {\n                \"type\": \"string\",\n              },\n              \"synced_property_name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"database_id\",\n              \"synced_property_name\",\n              \"synced_property_id\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"relation\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"relation\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RichTextItemRequest\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"text\": {\n                \"properties\": {\n                  \"content\": {\n                    \"type\": \"string\",\n                  },\n                  \"link\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": [\n                      \"object\",\n                      \"null\",\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"content\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"text\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"mention\": {\n                \"oneOf\": [\n                  {\n                    \"properties\": {\n                      \"user\": {\n                        \"oneOf\": [\n                          {\n                            \"properties\": {\n                              \"id\": {\n                                \"type\": \"string\",\n                              },\n                            },\n                            \"required\": [\n                              \"id\",\n                            ],\n                            \"type\": \"object\",\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                          },\n                        ],\n                      },\n                    },\n                    \"required\": [\n                      \"user\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"page\": {\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                    },\n                    \"required\": [\n                      \"page\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"database\": {\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                    },\n                    \"required\": [\n                      \"database\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"date\": {\n                        \"$ref\": \"#/components/schemas/DateRequest\",\n                      },\n                    },\n                    \"required\": [\n                      \"date\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                ],\n              },\n              \"type\": {\n                \"enum\": [\n                  \"mention\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"mention\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"equation\": {\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"expression\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"equation\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"equation\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"RichTextItemResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TextRichTextItemResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/MentionRichTextItemResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/EquationRichTextItemResponse\",\n          },\n        ],\n      },\n      \"RichTextPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"rich_text\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"rich_text\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"rich_text\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RollupPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"rollup\": {\n            \"properties\": {\n              \"function\": {\n                \"type\": \"string\",\n              },\n              \"relation_property_id\": {\n                \"type\": \"string\",\n              },\n              \"relation_property_name\": {\n                \"type\": \"string\",\n              },\n              \"rollup_property_id\": {\n                \"type\": \"string\",\n              },\n              \"rollup_property_name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"relation_property_name\",\n              \"relation_property_id\",\n              \"rollup_property_name\",\n              \"rollup_property_id\",\n              \"function\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"rollup\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"rollup\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SearchParameters\": {\n        \"properties\": {\n          \"filter\": {\n            \"properties\": {\n              \"property\": {\n                \"enum\": [\n                  \"object\",\n                ],\n                \"type\": \"string\",\n              },\n              \"value\": {\n                \"enum\": [\n                  \"page\",\n                  \"database\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"value\",\n              \"property\",\n            ],\n            \"type\": \"object\",\n          },\n          \"page_size\": {\n            \"type\": \"integer\",\n          },\n          \"query\": {\n            \"type\": \"string\",\n          },\n          \"sort\": {\n            \"properties\": {\n              \"direction\": {\n                \"enum\": [\n                  \"ascending\",\n                  \"descending\",\n                ],\n                \"type\": \"string\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"direction\",\n              \"timestamp\",\n            ],\n            \"type\": \"object\",\n          },\n          \"start_cursor\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SearchResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SelectOption\": {\n        \"properties\": {\n          \"color\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n          \"color\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SelectPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SelectPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"select\": {\n            \"properties\": {\n              \"options\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"options\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"select\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"select\",\n        ],\n        \"type\": \"object\",\n      },\n      \"TextPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"does_not_equal\": {\n            \"type\": \"string\",\n          },\n          \"ends_with\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"starts_with\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"TextRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"text\": {\n            \"properties\": {\n              \"content\": {\n                \"type\": \"string\",\n              },\n              \"link\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": [\n                  \"object\",\n                  \"null\",\n                ],\n              },\n            },\n            \"required\": [\n              \"content\",\n              \"link\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"text\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"text\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"TitlePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"title\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"title\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"title\",\n        ],\n        \"type\": \"object\",\n      },\n      \"URLPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"url\",\n            ],\n            \"type\": \"string\",\n          },\n          \"url\": {\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"UpdateBlockParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"bookmark\": {\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"breadcrumb\": {\n            \"type\": \"object\",\n          },\n          \"bulleted_list_item\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"code\": {\n            \"properties\": {\n              \"language\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"column\": {\n            \"type\": \"object\",\n          },\n          \"column_list\": {\n            \"type\": \"object\",\n          },\n          \"divider\": {\n            \"type\": \"object\",\n          },\n          \"embed\": {\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"equation\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"file\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_1\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_2\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_3\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"image\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"link_to_page\": {\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\",\n              },\n              \"page_id\": {\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"page_id\",\n                  \"database_id\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"numbered_list_item\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"paragraph\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"pdf\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"quote\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"table_of_contents\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"table_row\": {\n            \"properties\": {\n              \"cells\": {\n                \"items\": {\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                  },\n                  \"type\": \"array\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"to_do\": {\n            \"properties\": {\n              \"checked\": {\n                \"type\": \"boolean\",\n              },\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"toggle\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"video\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UpdateDatabaseParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"emoji\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertyUpdateSchema\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UpdatePageParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"title\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"title\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"rich_text\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\n                        \"number\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"number\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"select\": {\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\",\n                        },\n                      },\n                      \"required\": [\n                        \"name\",\n                      ],\n                      \"type\": [\n                        \"object\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"select\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UserObjectResponse\": {\n        \"properties\": {\n          \"avatar_url\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"user\",\n            ],\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"person\",\n              \"bot\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"name\",\n          \"avatar_url\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    \"securitySchemes\": {\n      \"oauth2\": {\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://api.notion.com/v1/oauth/authorize\",\n            \"scopes\": {},\n            \"tokenUrl\": \"https://api.notion.com/v1/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"API specification for Notion\",\n    \"title\": \"Notion API\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/blocks/{block_id}\": {\n      \"delete\": {\n        \"operationId\": \"deleteBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Delete block\",\n      },\n      \"get\": {\n        \"operationId\": \"getBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get block\",\n      },\n      \"patch\": {\n        \"operationId\": \"updateBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateBlockParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update block\",\n      },\n    },\n    \"/blocks/{block_id}/children\": {\n      \"get\": {\n        \"operationId\": \"listBlockChildren\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListBlockChildrenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List block children\",\n      },\n      \"patch\": {\n        \"operationId\": \"appendBlockChildren\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/AppendBlockChildrenParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/AppendBlockChildrenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Append block children\",\n      },\n    },\n    \"/comments\": {\n      \"get\": {\n        \"operationId\": \"listComments\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListCommentsResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List comments\",\n      },\n      \"post\": {\n        \"operationId\": \"createComment\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateCommentParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/CommentObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialCommentObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create comment\",\n      },\n    },\n    \"/databases\": {\n      \"get\": {\n        \"operationId\": \"listDatabases\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListDatabasesResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List databases\",\n      },\n      \"post\": {\n        \"operationId\": \"createDatabase\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create database\",\n      },\n    },\n    \"/databases/{database_id}\": {\n      \"get\": {\n        \"operationId\": \"getDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get database\",\n      },\n      \"patch\": {\n        \"operationId\": \"updateDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update database\",\n      },\n    },\n    \"/databases/{database_id}/query\": {\n      \"post\": {\n        \"operationId\": \"queryDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"filter_properties\",\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/QueryDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/QueryDatabaseResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Query database\",\n      },\n    },\n    \"/oauth/token\": {\n      \"post\": {\n        \"operationId\": \"oauthToken\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/OauthTokenParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/OauthTokenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"OAuth token\",\n      },\n    },\n    \"/pages\": {\n      \"post\": {\n        \"operationId\": \"createPage\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreatePageParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create page\",\n      },\n    },\n    \"/pages/{page_id}\": {\n      \"get\": {\n        \"operationId\": \"getPage\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"filter_properties\",\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get page\",\n      },\n      \"patch\": {\n        \"operationId\": \"updatePage\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdatePageParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update page\",\n      },\n    },\n    \"/pages/{page_id}/properties/{property_id}\": {\n      \"get\": {\n        \"operationId\": \"getPageProperty\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"property_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemListResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get page property\",\n      },\n    },\n    \"/search\": {\n      \"post\": {\n        \"operationId\": \"search\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/SearchParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Search\",\n      },\n    },\n    \"/users\": {\n      \"get\": {\n        \"operationId\": \"listUsers\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListUsersResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List users\",\n      },\n    },\n    \"/users/me\": {\n      \"get\": {\n        \"operationId\": \"getSelf\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get current user\",\n      },\n    },\n    \"/users/{user_id}\": {\n      \"get\": {\n        \"operationId\": \"getUser\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"user_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get user\",\n      },\n    },\n  },\n  \"security\": [\n    {\n      \"oauth2\": [],\n    },\n  ],\n  \"servers\": [\n    {\n      \"url\": \"https://api.notion.so\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > notion.json (string) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"AnnotationRequest\": {\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\",\n          },\n          \"code\": {\n            \"type\": \"boolean\",\n          },\n          \"color\": {\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\",\n            ],\n            \"type\": \"string\",\n          },\n          \"italic\": {\n            \"type\": \"boolean\",\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\",\n          },\n          \"underline\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"AnnotationResponse\": {\n        \"properties\": {\n          \"bold\": {\n            \"type\": \"boolean\",\n          },\n          \"code\": {\n            \"type\": \"boolean\",\n          },\n          \"color\": {\n            \"enum\": [\n              \"default\",\n              \"gray\",\n              \"brown\",\n              \"orange\",\n              \"yellow\",\n              \"green\",\n              \"blue\",\n              \"purple\",\n              \"pink\",\n              \"red\",\n              \"gray_background\",\n              \"brown_background\",\n              \"orange_background\",\n              \"yellow_background\",\n              \"green_background\",\n              \"blue_background\",\n              \"purple_background\",\n              \"pink_background\",\n              \"red_background\",\n            ],\n            \"type\": \"string\",\n          },\n          \"italic\": {\n            \"type\": \"boolean\",\n          },\n          \"strikethrough\": {\n            \"type\": \"boolean\",\n          },\n          \"underline\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"required\": [\n          \"bold\",\n          \"italic\",\n          \"strikethrough\",\n          \"underline\",\n          \"code\",\n          \"color\",\n        ],\n        \"type\": \"object\",\n      },\n      \"AppendBlockChildrenParameters\": {\n        \"properties\": {\n          \"children\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"children\",\n        ],\n        \"type\": \"object\",\n      },\n      \"AppendBlockChildrenResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"BlockObjectRequest\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"paragraph\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"paragraph\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"paragraph\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_1\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_1\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_1\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_2\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_2\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_2\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"heading_3\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"heading_3\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"heading_3\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"bulleted_list_item\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"bulleted_list_item\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"bulleted_list_item\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"numbered_list_item\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"numbered_list_item\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"numbered_list_item\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"to_do\": {\n                \"properties\": {\n                  \"checked\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                  \"checked\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"to_do\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"to_do\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"toggle\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"toggle\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"toggle\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"code\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"language\": {\n                    \"type\": \"string\",\n                  },\n                  \"rich_text\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"rich_text\",\n                  \"language\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"code\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"code\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"child_page\": {\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"title\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"child_page\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"child_page\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"child_database\": {\n                \"properties\": {\n                  \"title\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"title\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"child_database\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"child_database\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"embed\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"embed\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"embed\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"image\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"image\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"image\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"video\",\n                ],\n                \"type\": \"string\",\n              },\n              \"video\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"video\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"file\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"file\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"file\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"pdf\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"pdf\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"pdf\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"bookmark\": {\n                \"properties\": {\n                  \"caption\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"bookmark\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"bookmark\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"equation\": {\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"expression\",\n                ],\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"equation\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"equation\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"divider\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"divider\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"divider\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table_of_contents\": {\n                \"properties\": {\n                  \"color\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table_of_contents\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table_of_contents\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"column_list\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"column_list\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"column_list\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"column\": {\n                \"type\": \"object\",\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"column\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"column\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"link_to_page\": {\n                \"oneOf\": [\n                  {\n                    \"properties\": {\n                      \"page_id\": {\n                        \"type\": \"string\",\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"page_id\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"type\",\n                      \"page_id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"database_id\": {\n                        \"type\": \"string\",\n                      },\n                      \"type\": {\n                        \"enum\": [\n                          \"database_id\",\n                        ],\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"type\",\n                      \"database_id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                ],\n              },\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"link_to_page\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"link_to_page\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table\": {\n                \"properties\": {\n                  \"children\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"has_column_header\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"has_row_header\": {\n                    \"type\": \"boolean\",\n                  },\n                  \"table_width\": {\n                    \"type\": \"integer\",\n                  },\n                },\n                \"required\": [\n                  \"table_width\",\n                  \"children\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"table_row\": {\n                \"properties\": {\n                  \"cells\": {\n                    \"items\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                    \"type\": \"array\",\n                  },\n                },\n                \"required\": [\n                  \"cells\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"table_row\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"table_row\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"object\": {\n                \"enum\": [\n                  \"block\",\n                ],\n                \"type\": \"string\",\n              },\n              \"synced_block\": {\n                \"properties\": {\n                  \"children\": {\n                    \"items\": {\n                      \"$ref\": \"#/components/schemas/BlockObjectRequest\",\n                    },\n                    \"type\": \"array\",\n                  },\n                  \"synced_from\": {\n                    \"oneOf\": [\n                      {\n                        \"properties\": {\n                          \"block_id\": {\n                            \"type\": \"string\",\n                          },\n                          \"type\": {\n                            \"enum\": [\n                              \"block_id\",\n                            ],\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"type\",\n                          \"block_id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                      {\n                        \"type\": \"null\",\n                      },\n                    ],\n                  },\n                },\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"synced_block\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"object\",\n              \"type\",\n              \"synced_block\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"BlockObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"has_children\": {\n            \"type\": \"boolean\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"block\",\n            ],\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"has_children\",\n          \"archived\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CheckboxPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"boolean\",\n          },\n          \"equals\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CheckboxPropertyResponse\": {\n        \"properties\": {\n          \"checkbox\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"checkbox\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"checkbox\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CommentObjectResponse\": {\n        \"properties\": {\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"discussion_id\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"comment\",\n            ],\n            \"type\": \"string\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"block_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"block_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"block_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"rich_text\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"parent\",\n          \"discussion_id\",\n          \"rich_text\",\n          \"created_by\",\n          \"created_time\",\n          \"last_edited_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CompoundFilter\": {\n        \"properties\": {\n          \"and\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\",\n            },\n            \"type\": \"array\",\n          },\n          \"or\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyFilter\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"CreateCommentParameters\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"parent\": {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"parent\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"discussion_id\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"discussion_id\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"CreateDatabaseParameters\": {\n        \"properties\": {\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"emoji\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertySchema\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"parent\",\n          \"properties\",\n          \"title\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatePageParameters\": {\n        \"properties\": {\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database_id\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n            \"type\": \"object\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"title\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"title\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"rich_text\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\n                        \"number\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"number\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"select\": {\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\",\n                        },\n                      },\n                      \"required\": [\n                        \"name\",\n                      ],\n                      \"type\": [\n                        \"object\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"select\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"parent\",\n          \"properties\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatedByPropertyResponse\": {\n        \"properties\": {\n          \"created_by\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"created_by\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"created_by\",\n        ],\n        \"type\": \"object\",\n      },\n      \"CreatedTimePropertyResponse\": {\n        \"properties\": {\n          \"created_time\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"created_time\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"created_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DatabaseObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"created_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"emoji\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"external\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"last_edited_by\": {\n            \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"database\",\n            ],\n            \"type\": \"string\",\n          },\n          \"parent\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"page_id\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page_id\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page_id\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"workspace\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"workspace\": {\n                    \"enum\": [\n                      true,\n                    ],\n                    \"type\": \"boolean\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"workspace\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemResponse\",\n            },\n            \"type\": \"array\",\n          },\n          \"url\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"created_by\",\n          \"last_edited_time\",\n          \"last_edited_by\",\n          \"title\",\n          \"description\",\n          \"is_inline\",\n          \"properties\",\n          \"parent\",\n          \"url\",\n          \"archived\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DatabasePropertyConfigResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TitlePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RichTextPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/NumberPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/SelectPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/MultiSelectPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/DatePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/PeoplePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/FilePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CheckboxPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/URLPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/EmailPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/PhoneNumberPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/FormulaPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RelationPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/RollupPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedTimePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/CreatedByPropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedTimePropertyResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/LastEditedByPropertyResponse\",\n          },\n        ],\n      },\n      \"DatePropertyFilter\": {\n        \"properties\": {\n          \"after\": {\n            \"type\": \"string\",\n          },\n          \"before\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"next_month\": {},\n          \"next_week\": {},\n          \"next_year\": {},\n          \"on_or_after\": {\n            \"type\": \"string\",\n          },\n          \"on_or_before\": {\n            \"type\": \"string\",\n          },\n          \"past_month\": {},\n          \"past_week\": {},\n          \"past_year\": {},\n        },\n        \"type\": \"object\",\n      },\n      \"DatePropertyResponse\": {\n        \"properties\": {\n          \"date\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"date\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"date\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DateRequest\": {\n        \"properties\": {\n          \"end\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"start\": {\n            \"type\": \"string\",\n          },\n          \"time_zone\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"start\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DateResponse\": {\n        \"properties\": {\n          \"end\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"start\": {\n            \"type\": \"string\",\n          },\n          \"time_zone\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"start\",\n          \"end\",\n          \"time_zone\",\n        ],\n        \"type\": \"object\",\n      },\n      \"EmailPropertyResponse\": {\n        \"properties\": {\n          \"email\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"email\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"email\",\n        ],\n        \"type\": \"object\",\n      },\n      \"EquationRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"equation\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"expression\",\n            ],\n            \"type\": \"object\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"equation\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"equation\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"FilePropertyResponse\": {\n        \"properties\": {\n          \"files\": {\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"files\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"files\",\n        ],\n        \"type\": \"object\",\n      },\n      \"FilesPropertyFilter\": {\n        \"properties\": {\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"FormulaPropertyResponse\": {\n        \"properties\": {\n          \"formula\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"expression\",\n            ],\n            \"type\": \"object\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"formula\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"formula\",\n        ],\n        \"type\": \"object\",\n      },\n      \"LastEditedByPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_by\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"last_edited_by\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"last_edited_by\",\n        ],\n        \"type\": \"object\",\n      },\n      \"LastEditedTimePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"last_edited_time\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"last_edited_time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListBlockChildrenResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListCommentsResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/CommentObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListDatabasesResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"ListUsersResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/UserObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"MentionRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"mention\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"user\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                      },\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"user\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"date\": {\n                    \"$ref\": \"#/components/schemas/DateResponse\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"date\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"date\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"link_preview\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"link_preview\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"link_preview\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"page\": {\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"page\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"page\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"database\": {\n                    \"properties\": {\n                      \"id\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"id\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"database\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"database\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"mention\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"mention\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"MultiSelectPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"MultiSelectPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"multi_select\": {\n            \"properties\": {\n              \"options\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"options\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"multi_select\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"multi_select\",\n        ],\n        \"type\": \"object\",\n      },\n      \"NumberPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"number\",\n          },\n          \"equals\": {\n            \"type\": \"number\",\n          },\n          \"greater_than\": {\n            \"type\": \"number\",\n          },\n          \"greater_than_or_equal_to\": {\n            \"type\": \"number\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"less_than\": {\n            \"type\": \"number\",\n          },\n          \"less_than_or_equal_to\": {\n            \"type\": \"number\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"NumberPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"number\": {\n            \"properties\": {\n              \"format\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"format\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"number\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"number\",\n        ],\n        \"type\": \"object\",\n      },\n      \"OauthTokenParameters\": {\n        \"properties\": {\n          \"code\": {\n            \"type\": \"string\",\n          },\n          \"external_account\": {\n            \"properties\": {\n              \"key\": {\n                \"type\": \"string\",\n              },\n              \"name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"key\",\n              \"name\",\n            ],\n            \"type\": \"object\",\n          },\n          \"grant_type\": {\n            \"type\": \"string\",\n          },\n          \"redirect_uri\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"grant_type\",\n          \"code\",\n        ],\n        \"type\": \"object\",\n      },\n      \"OauthTokenResponse\": {\n        \"properties\": {\n          \"access_token\": {\n            \"type\": \"string\",\n          },\n          \"bot_id\": {\n            \"type\": \"string\",\n          },\n          \"duplicated_template_id\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"owner\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"user\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"user\": {\n                    \"oneOf\": [\n                      {\n                        \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                      },\n                      {\n                        \"$ref\": \"#/components/schemas/PartialUserObjectResponse\",\n                      },\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"user\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"type\": {\n                    \"enum\": [\n                      \"workspace\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                  \"workspace\": {\n                    \"enum\": [\n                      true,\n                    ],\n                    \"type\": \"boolean\",\n                  },\n                },\n                \"required\": [\n                  \"type\",\n                  \"workspace\",\n                ],\n                \"type\": \"object\",\n              },\n            ],\n          },\n          \"token_type\": {\n            \"enum\": [\n              \"bearer\",\n            ],\n            \"type\": \"string\",\n          },\n          \"workspace_icon\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"workspace_id\": {\n            \"type\": \"string\",\n          },\n          \"workspace_name\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n        },\n        \"required\": [\n          \"access_token\",\n          \"token_type\",\n          \"bot_id\",\n          \"workspace_name\",\n          \"workspace_icon\",\n          \"workspace_id\",\n          \"owner\",\n          \"duplicated_template_id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PageObjectResponse\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"created_time\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"last_edited_time\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"page\",\n            ],\n            \"type\": \"string\",\n          },\n          \"url\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"created_time\",\n          \"last_edited_time\",\n          \"archived\",\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialBlockObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"block\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialCommentObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"comment\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialDatabaseObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"database\",\n            ],\n            \"type\": \"string\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/DatabasePropertyConfigResponse\",\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"properties\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialPageObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"page\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PartialUserObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"user\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PeoplePropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"PeoplePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"people\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"people\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"people\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PhoneNumberPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"phone_number\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"phone_number\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"phone_number\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyFilter\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"title\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"title\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"rich_text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"number\": {\n                \"$ref\": \"#/components/schemas/NumberPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"number\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"checkbox\": {\n                \"$ref\": \"#/components/schemas/CheckboxPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"checkbox\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"select\": {\n                \"$ref\": \"#/components/schemas/SelectPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"select\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"multi_select\": {\n                \"$ref\": \"#/components/schemas/MultiSelectPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"multi_select\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"date\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"date\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"people\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"people\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"files\": {\n                \"$ref\": \"#/components/schemas/FilesPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"files\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"url\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"url\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"email\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"email\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"phone_number\": {\n                \"$ref\": \"#/components/schemas/TextPropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"phone_number\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"property\": {\n                \"type\": \"string\",\n              },\n              \"relation\": {\n                \"$ref\": \"#/components/schemas/RelationPropertyFilter\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"relation\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"created_by\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"created_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_by\": {\n                \"$ref\": \"#/components/schemas/PeoplePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"last_edited_by\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"property\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"property\",\n              \"last_edited_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"created_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"created_time\",\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"timestamp\",\n              \"created_time\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"last_edited_time\": {\n                \"$ref\": \"#/components/schemas/DatePropertyFilter\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"created_time\",\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"timestamp\",\n              \"last_edited_time\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"PropertyItemListResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"results\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyItemObjectResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"id\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertySchema\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n        ],\n        \"type\": \"object\",\n      },\n      \"PropertyUpdateSchema\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"QueryDatabaseParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"filter\": {\n            \"oneOf\": [\n              {\n                \"$ref\": \"#/components/schemas/PropertyFilter\",\n              },\n              {\n                \"$ref\": \"#/components/schemas/CompoundFilter\",\n              },\n            ],\n          },\n          \"page_size\": {\n            \"type\": \"integer\",\n          },\n          \"sorts\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"direction\": {\n                      \"enum\": [\n                        \"ascending\",\n                        \"descending\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"property\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"property\",\n                    \"direction\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"direction\": {\n                      \"enum\": [\n                        \"ascending\",\n                        \"descending\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                    \"timestamp\": {\n                      \"enum\": [\n                        \"created_time\",\n                        \"last_edited_time\",\n                      ],\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"timestamp\",\n                    \"direction\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n          \"start_cursor\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"QueryDatabaseResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RelationPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"RelationPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"relation\": {\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\",\n              },\n              \"synced_property_id\": {\n                \"type\": \"string\",\n              },\n              \"synced_property_name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"database_id\",\n              \"synced_property_name\",\n              \"synced_property_id\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"relation\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"relation\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RichTextItemRequest\": {\n        \"oneOf\": [\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"text\": {\n                \"properties\": {\n                  \"content\": {\n                    \"type\": \"string\",\n                  },\n                  \"link\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": [\n                      \"object\",\n                      \"null\",\n                    ],\n                  },\n                },\n                \"required\": [\n                  \"content\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"text\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"text\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"mention\": {\n                \"oneOf\": [\n                  {\n                    \"properties\": {\n                      \"user\": {\n                        \"oneOf\": [\n                          {\n                            \"properties\": {\n                              \"id\": {\n                                \"type\": \"string\",\n                              },\n                            },\n                            \"required\": [\n                              \"id\",\n                            ],\n                            \"type\": \"object\",\n                          },\n                          {\n                            \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                          },\n                        ],\n                      },\n                    },\n                    \"required\": [\n                      \"user\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"page\": {\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                    },\n                    \"required\": [\n                      \"page\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"database\": {\n                        \"properties\": {\n                          \"id\": {\n                            \"type\": \"string\",\n                          },\n                        },\n                        \"required\": [\n                          \"id\",\n                        ],\n                        \"type\": \"object\",\n                      },\n                    },\n                    \"required\": [\n                      \"database\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  {\n                    \"properties\": {\n                      \"date\": {\n                        \"$ref\": \"#/components/schemas/DateRequest\",\n                      },\n                    },\n                    \"required\": [\n                      \"date\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                ],\n              },\n              \"type\": {\n                \"enum\": [\n                  \"mention\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"mention\",\n            ],\n            \"type\": \"object\",\n          },\n          {\n            \"properties\": {\n              \"annotations\": {\n                \"$ref\": \"#/components/schemas/AnnotationRequest\",\n              },\n              \"equation\": {\n                \"properties\": {\n                  \"expression\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"expression\",\n                ],\n                \"type\": \"object\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"equation\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"equation\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n      \"RichTextItemResponse\": {\n        \"oneOf\": [\n          {\n            \"$ref\": \"#/components/schemas/TextRichTextItemResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/MentionRichTextItemResponse\",\n          },\n          {\n            \"$ref\": \"#/components/schemas/EquationRichTextItemResponse\",\n          },\n        ],\n      },\n      \"RichTextPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"rich_text\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"rich_text\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"rich_text\",\n        ],\n        \"type\": \"object\",\n      },\n      \"RollupPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"rollup\": {\n            \"properties\": {\n              \"function\": {\n                \"type\": \"string\",\n              },\n              \"relation_property_id\": {\n                \"type\": \"string\",\n              },\n              \"relation_property_name\": {\n                \"type\": \"string\",\n              },\n              \"rollup_property_id\": {\n                \"type\": \"string\",\n              },\n              \"rollup_property_name\": {\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"relation_property_name\",\n              \"relation_property_id\",\n              \"rollup_property_name\",\n              \"rollup_property_id\",\n              \"function\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"rollup\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"rollup\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SearchParameters\": {\n        \"properties\": {\n          \"filter\": {\n            \"properties\": {\n              \"property\": {\n                \"enum\": [\n                  \"object\",\n                ],\n                \"type\": \"string\",\n              },\n              \"value\": {\n                \"enum\": [\n                  \"page\",\n                  \"database\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"value\",\n              \"property\",\n            ],\n            \"type\": \"object\",\n          },\n          \"page_size\": {\n            \"type\": \"integer\",\n          },\n          \"query\": {\n            \"type\": \"string\",\n          },\n          \"sort\": {\n            \"properties\": {\n              \"direction\": {\n                \"enum\": [\n                  \"ascending\",\n                  \"descending\",\n                ],\n                \"type\": \"string\",\n              },\n              \"timestamp\": {\n                \"enum\": [\n                  \"last_edited_time\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"required\": [\n              \"direction\",\n              \"timestamp\",\n            ],\n            \"type\": \"object\",\n          },\n          \"start_cursor\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SearchResponse\": {\n        \"properties\": {\n          \"has_more\": {\n            \"type\": \"boolean\",\n          },\n          \"next_cursor\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"object\": {\n            \"enum\": [\n              \"list\",\n            ],\n            \"type\": \"string\",\n          },\n          \"results\": {\n            \"items\": {\n              \"oneOf\": [\n                {\n                  \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                },\n                {\n                  \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                },\n              ],\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"results\",\n          \"next_cursor\",\n          \"has_more\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SelectOption\": {\n        \"properties\": {\n          \"color\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n          \"color\",\n        ],\n        \"type\": \"object\",\n      },\n      \"SelectPropertyFilter\": {\n        \"properties\": {\n          \"does_not_equal\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"SelectPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"select\": {\n            \"properties\": {\n              \"options\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/SelectOption\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"required\": [\n              \"options\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"select\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"select\",\n        ],\n        \"type\": \"object\",\n      },\n      \"TextPropertyFilter\": {\n        \"properties\": {\n          \"contains\": {\n            \"type\": \"string\",\n          },\n          \"does_not_contain\": {\n            \"type\": \"string\",\n          },\n          \"does_not_equal\": {\n            \"type\": \"string\",\n          },\n          \"ends_with\": {\n            \"type\": \"string\",\n          },\n          \"equals\": {\n            \"type\": \"string\",\n          },\n          \"is_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"is_not_empty\": {\n            \"type\": \"boolean\",\n          },\n          \"starts_with\": {\n            \"type\": \"string\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"TextRichTextItemResponse\": {\n        \"properties\": {\n          \"annotations\": {\n            \"$ref\": \"#/components/schemas/AnnotationResponse\",\n          },\n          \"href\": {\n            \"type\": [\n              \"string\",\n              \"null\",\n            ],\n          },\n          \"plain_text\": {\n            \"type\": \"string\",\n          },\n          \"text\": {\n            \"properties\": {\n              \"content\": {\n                \"type\": \"string\",\n              },\n              \"link\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"url\",\n                ],\n                \"type\": [\n                  \"object\",\n                  \"null\",\n                ],\n              },\n            },\n            \"required\": [\n              \"content\",\n              \"link\",\n            ],\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"text\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"type\",\n          \"text\",\n          \"annotations\",\n          \"plain_text\",\n          \"href\",\n        ],\n        \"type\": \"object\",\n      },\n      \"TitlePropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"title\": {\n            \"type\": \"object\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"title\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"title\",\n        ],\n        \"type\": \"object\",\n      },\n      \"URLPropertyResponse\": {\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"url\",\n            ],\n            \"type\": \"string\",\n          },\n          \"url\": {\n            \"type\": \"object\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"type\",\n          \"url\",\n        ],\n        \"type\": \"object\",\n      },\n      \"UpdateBlockParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"bookmark\": {\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"breadcrumb\": {\n            \"type\": \"object\",\n          },\n          \"bulleted_list_item\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"code\": {\n            \"properties\": {\n              \"language\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"column\": {\n            \"type\": \"object\",\n          },\n          \"column_list\": {\n            \"type\": \"object\",\n          },\n          \"divider\": {\n            \"type\": \"object\",\n          },\n          \"embed\": {\n            \"properties\": {\n              \"url\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"equation\": {\n            \"properties\": {\n              \"expression\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"file\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_1\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_2\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"heading_3\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"image\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"link_to_page\": {\n            \"properties\": {\n              \"database_id\": {\n                \"type\": \"string\",\n              },\n              \"page_id\": {\n                \"type\": \"string\",\n              },\n              \"type\": {\n                \"enum\": [\n                  \"page_id\",\n                  \"database_id\",\n                ],\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"numbered_list_item\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"paragraph\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"pdf\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"quote\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"table_of_contents\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"table_row\": {\n            \"properties\": {\n              \"cells\": {\n                \"items\": {\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                  },\n                  \"type\": \"array\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"to_do\": {\n            \"properties\": {\n              \"checked\": {\n                \"type\": \"boolean\",\n              },\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"toggle\": {\n            \"properties\": {\n              \"color\": {\n                \"type\": \"string\",\n              },\n              \"rich_text\": {\n                \"items\": {\n                  \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                },\n                \"type\": \"array\",\n              },\n            },\n            \"type\": \"object\",\n          },\n          \"video\": {\n            \"properties\": {\n              \"external\": {\n                \"properties\": {\n                  \"url\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"type\": \"object\",\n              },\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UpdateDatabaseParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"cover\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"description\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n          \"icon\": {\n            \"oneOf\": [\n              {\n                \"properties\": {\n                  \"emoji\": {\n                    \"type\": \"string\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"emoji\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"emoji\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"properties\": {\n                  \"external\": {\n                    \"properties\": {\n                      \"url\": {\n                        \"type\": \"string\",\n                      },\n                    },\n                    \"required\": [\n                      \"url\",\n                    ],\n                    \"type\": \"object\",\n                  },\n                  \"type\": {\n                    \"enum\": [\n                      \"external\",\n                    ],\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"external\",\n                  \"type\",\n                ],\n                \"type\": \"object\",\n              },\n              {\n                \"type\": \"null\",\n              },\n            ],\n          },\n          \"is_inline\": {\n            \"type\": \"boolean\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"$ref\": \"#/components/schemas/PropertyUpdateSchema\",\n            },\n            \"type\": \"object\",\n          },\n          \"title\": {\n            \"items\": {\n              \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UpdatePageParameters\": {\n        \"properties\": {\n          \"archived\": {\n            \"type\": \"boolean\",\n          },\n          \"properties\": {\n            \"additionalProperties\": {\n              \"oneOf\": [\n                {\n                  \"properties\": {\n                    \"title\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"title\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"rich_text\": {\n                      \"items\": {\n                        \"$ref\": \"#/components/schemas/RichTextItemRequest\",\n                      },\n                      \"type\": \"array\",\n                    },\n                  },\n                  \"required\": [\n                    \"rich_text\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"number\": {\n                      \"type\": [\n                        \"number\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"number\",\n                  ],\n                  \"type\": \"object\",\n                },\n                {\n                  \"properties\": {\n                    \"select\": {\n                      \"properties\": {\n                        \"name\": {\n                          \"type\": \"string\",\n                        },\n                      },\n                      \"required\": [\n                        \"name\",\n                      ],\n                      \"type\": [\n                        \"object\",\n                        \"null\",\n                      ],\n                    },\n                  },\n                  \"required\": [\n                    \"select\",\n                  ],\n                  \"type\": \"object\",\n                },\n              ],\n            },\n            \"type\": \"object\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"UserObjectResponse\": {\n        \"properties\": {\n          \"avatar_url\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"object\": {\n            \"enum\": [\n              \"user\",\n            ],\n            \"type\": \"string\",\n          },\n          \"type\": {\n            \"enum\": [\n              \"person\",\n              \"bot\",\n            ],\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"object\",\n          \"id\",\n          \"type\",\n          \"name\",\n          \"avatar_url\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n    \"securitySchemes\": {\n      \"oauth2\": {\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://api.notion.com/v1/oauth/authorize\",\n            \"scopes\": {},\n            \"tokenUrl\": \"https://api.notion.com/v1/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"API specification for Notion\",\n    \"title\": \"Notion API\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/blocks/{block_id}\": {\n      \"delete\": {\n        \"operationId\": \"deleteBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Delete block\",\n      },\n      \"get\": {\n        \"operationId\": \"getBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get block\",\n      },\n      \"patch\": {\n        \"operationId\": \"updateBlock\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateBlockParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialBlockObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/BlockObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update block\",\n      },\n    },\n    \"/blocks/{block_id}/children\": {\n      \"get\": {\n        \"operationId\": \"listBlockChildren\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListBlockChildrenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List block children\",\n      },\n      \"patch\": {\n        \"operationId\": \"appendBlockChildren\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/AppendBlockChildrenParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/AppendBlockChildrenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Append block children\",\n      },\n    },\n    \"/comments\": {\n      \"get\": {\n        \"operationId\": \"listComments\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"block_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListCommentsResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List comments\",\n      },\n      \"post\": {\n        \"operationId\": \"createComment\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateCommentParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/CommentObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialCommentObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create comment\",\n      },\n    },\n    \"/databases\": {\n      \"get\": {\n        \"operationId\": \"listDatabases\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListDatabasesResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List databases\",\n      },\n      \"post\": {\n        \"operationId\": \"createDatabase\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreateDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create database\",\n      },\n    },\n    \"/databases/{database_id}\": {\n      \"get\": {\n        \"operationId\": \"getDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get database\",\n      },\n      \"patch\": {\n        \"operationId\": \"updateDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdateDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PartialDatabaseObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/DatabaseObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update database\",\n      },\n    },\n    \"/databases/{database_id}/query\": {\n      \"post\": {\n        \"operationId\": \"queryDatabase\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"database_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"filter_properties\",\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/QueryDatabaseParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/QueryDatabaseResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Query database\",\n      },\n    },\n    \"/oauth/token\": {\n      \"post\": {\n        \"operationId\": \"oauthToken\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/OauthTokenParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/OauthTokenResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"OAuth token\",\n      },\n    },\n    \"/pages\": {\n      \"post\": {\n        \"operationId\": \"createPage\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/CreatePageParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Create page\",\n      },\n    },\n    \"/pages/{page_id}\": {\n      \"get\": {\n        \"operationId\": \"getPage\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"filter_properties\",\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get page\",\n      },\n      \"patch\": {\n        \"operationId\": \"updatePage\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/UpdatePageParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PageObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PartialPageObjectResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Update page\",\n      },\n    },\n    \"/pages/{page_id}/properties/{property_id}\": {\n      \"get\": {\n        \"operationId\": \"getPageProperty\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"page_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"property_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"oneOf\": [\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemObjectResponse\",\n                    },\n                    {\n                      \"$ref\": \"#/components/schemas/PropertyItemListResponse\",\n                    },\n                  ],\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get page property\",\n      },\n    },\n    \"/search\": {\n      \"post\": {\n        \"operationId\": \"search\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/SearchParameters\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/SearchResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Search\",\n      },\n    },\n    \"/users\": {\n      \"get\": {\n        \"operationId\": \"listUsers\",\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"start_cursor\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"page_size\",\n            \"schema\": {\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/ListUsersResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"List users\",\n      },\n    },\n    \"/users/me\": {\n      \"get\": {\n        \"operationId\": \"getSelf\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get current user\",\n      },\n    },\n    \"/users/{user_id}\": {\n      \"get\": {\n        \"operationId\": \"getUser\",\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"user_id\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/UserObjectResponse\",\n                },\n              },\n            },\n            \"description\": \"Successful response\",\n          },\n        },\n        \"summary\": \"Get user\",\n      },\n    },\n  },\n  \"security\": [\n    {\n      \"oauth2\": [],\n    },\n  ],\n  \"servers\": [\n    {\n      \"url\": \"https://api.notion.so\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > open-meteo.yaml (file url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"CurrentWeather\": {\n        \"description\": \"Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code\",\n        \"properties\": {\n          \"temperature\": {\n            \"type\": \"number\",\n          },\n          \"time\": {\n            \"type\": \"string\",\n          },\n          \"weather_code\": {\n            \"type\": \"integer\",\n          },\n          \"wind_direction\": {\n            \"type\": \"number\",\n          },\n          \"wind_speed\": {\n            \"type\": \"number\",\n          },\n        },\n        \"required\": [\n          \"time\",\n          \"temperature\",\n          \"wind_speed\",\n          \"wind_direction\",\n          \"weather_code\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DailyResponse\": {\n        \"description\": \"For each selected daily weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n        \"properties\": {\n          \"apparent_temperature_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"apparent_temperature_min\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"et0_fao_evapotranspiration\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation_hours\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation_sum\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"shortwave_radiation_sum\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"sunrise\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"sunset\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m_min\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"time\": {\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"uv_index_clear_sky_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"uv_index_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"weather_code\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_10m_dominant\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_gusts_10m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_10m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"HourlyResponse\": {\n        \"description\": \"For each selected weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n        \"properties\": {\n          \"apparent_temperature\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_high\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_low\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_mid\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"dew_point_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"diffuse_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"direct_normal_irradiance\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"direct_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"evapotranspiration\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"freezing_level_height\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"pressure_msl\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"relative_humidity_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"shortwave_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"snow_height\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_0_1cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_1_3cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_27_81cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_3_9cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_9_27cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_0cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_18cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_54cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_6cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"time\": {\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"vapour_pressure_deficit\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"weather_code\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_120m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_180m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_80m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_gusts_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_120m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_180m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_80m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"time\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"info@open-meteo.com\",\n      \"name\": \"Open-Meteo\",\n      \"url\": \"https://open-meteo.com\",\n    },\n    \"description\": \"Open-Meteo offers free weather forecast APIs for open-source developers and non-commercial use. No API key is required.\",\n    \"license\": {\n      \"name\": \"Attribution 4.0 International (CC BY 4.0)\",\n      \"url\": \"https://creativecommons.org/licenses/by/4.0/\",\n    },\n    \"termsOfService\": \"https://open-meteo.com/en/features#terms\",\n    \"title\": \"Open-Meteo APIs\",\n    \"version\": \"1.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/v1/forecast\": {\n      \"get\": {\n        \"description\": \"7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.\",\n        \"parameters\": [\n          {\n            \"explode\": false,\n            \"in\": \"query\",\n            \"name\": \"hourly\",\n            \"schema\": {\n              \"items\": {\n                \"enum\": [\n                  \"temperature_2m\",\n                  \"relative_humidity_2m\",\n                  \"dew_point_2m\",\n                  \"apparent_temperature\",\n                  \"pressure_msl\",\n                  \"cloud_cover\",\n                  \"cloud_cover_low\",\n                  \"cloud_cover_mid\",\n                  \"cloud_cover_high\",\n                  \"wind_speed_10m\",\n                  \"wind_speed_80m\",\n                  \"wind_speed_120m\",\n                  \"wind_speed_180m\",\n                  \"wind_direction_10m\",\n                  \"wind_direction_80m\",\n                  \"wind_direction_120m\",\n                  \"wind_direction_180m\",\n                  \"wind_gusts_10m\",\n                  \"shortwave_radiation\",\n                  \"direct_radiation\",\n                  \"direct_normal_irradiance\",\n                  \"diffuse_radiation\",\n                  \"vapour_pressure_deficit\",\n                  \"evapotranspiration\",\n                  \"precipitation\",\n                  \"weather_code\",\n                  \"snow_height\",\n                  \"freezing_level_height\",\n                  \"soil_temperature_0cm\",\n                  \"soil_temperature_6cm\",\n                  \"soil_temperature_18cm\",\n                  \"soil_temperature_54cm\",\n                  \"soil_moisture_0_1cm\",\n                  \"soil_moisture_1_3cm\",\n                  \"soil_moisture_3_9cm\",\n                  \"soil_moisture_9_27cm\",\n                  \"soil_moisture_27_81cm\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"daily\",\n            \"schema\": {\n              \"items\": {\n                \"enum\": [\n                  \"temperature_2m_max\",\n                  \"temperature_2m_min\",\n                  \"apparent_temperature_max\",\n                  \"apparent_temperature_min\",\n                  \"precipitation_sum\",\n                  \"precipitation_hours\",\n                  \"weather_code\",\n                  \"sunrise\",\n                  \"sunset\",\n                  \"wind_speed_10m_max\",\n                  \"wind_gusts_10m_max\",\n                  \"wind_direction_10m_dominant\",\n                  \"shortwave_radiation_sum\",\n                  \"uv_index_max\",\n                  \"uv_index_clear_sky_max\",\n                  \"et0_fao_evapotranspiration\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n          {\n            \"description\": \"WGS84 coordinate\",\n            \"in\": \"query\",\n            \"name\": \"latitude\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"double\",\n              \"type\": \"number\",\n            },\n          },\n          {\n            \"description\": \"WGS84 coordinate\",\n            \"in\": \"query\",\n            \"name\": \"longitude\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"double\",\n              \"type\": \"number\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"current_weather\",\n            \"schema\": {\n              \"type\": \"boolean\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"temperature_unit\",\n            \"schema\": {\n              \"default\": \"celsius\",\n              \"enum\": [\n                \"celsius\",\n                \"fahrenheit\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"wind_speed_unit\",\n            \"schema\": {\n              \"default\": \"kmh\",\n              \"enum\": [\n                \"kmh\",\n                \"ms\",\n                \"mph\",\n                \"kn\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If format \\`unixtime\\` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply \\`utc_offset_seconds\\` again to get the correct date.\",\n            \"in\": \"query\",\n            \"name\": \"timeformat\",\n            \"schema\": {\n              \"default\": \"iso8601\",\n              \"enum\": [\n                \"iso8601\",\n                \"unixtime\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If \\`timezone\\` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported.\",\n            \"in\": \"query\",\n            \"name\": \"timezone\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If \\`past_days\\` is set, yesterdays or the day before yesterdays data are also returned.\",\n            \"in\": \"query\",\n            \"name\": \"past_days\",\n            \"schema\": {\n              \"enum\": [\n                1,\n                2,\n              ],\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"current_weather\": {\n                      \"$ref\": \"#/components/schemas/CurrentWeather\",\n                    },\n                    \"daily\": {\n                      \"$ref\": \"#/components/schemas/DailyResponse\",\n                    },\n                    \"daily_units\": {\n                      \"additionalProperties\": {\n                        \"type\": \"string\",\n                      },\n                      \"description\": \"For each selected daily weather variable, the unit will be listed here.\",\n                      \"type\": \"object\",\n                    },\n                    \"elevation\": {\n                      \"description\": \"The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.\",\n                      \"example\": 44.812,\n                      \"type\": \"number\",\n                    },\n                    \"generationtime_ms\": {\n                      \"description\": \"Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.\",\n                      \"example\": 2.2119,\n                      \"type\": \"number\",\n                    },\n                    \"hourly\": {\n                      \"$ref\": \"#/components/schemas/HourlyResponse\",\n                    },\n                    \"hourly_units\": {\n                      \"additionalProperties\": {\n                        \"type\": \"string\",\n                      },\n                      \"description\": \"For each selected weather variable, the unit will be listed here.\",\n                      \"type\": \"object\",\n                    },\n                    \"latitude\": {\n                      \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n                      \"example\": 52.52,\n                      \"type\": \"number\",\n                    },\n                    \"longitude\": {\n                      \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n                      \"example\": \"13.419.52\",\n                      \"type\": \"number\",\n                    },\n                    \"utc_offset_seconds\": {\n                      \"description\": \"Applied timezone offset from the &timezone= parameter.\",\n                      \"example\": 3600,\n                      \"type\": \"integer\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"description\": \"Always set true for errors\",\n                      \"type\": \"boolean\",\n                    },\n                    \"reason\": {\n                      \"description\": \"Description of the error\",\n                      \"example\": \"Latitude must be in range of -90 to 90°. Given: 300\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Bad Request\",\n          },\n        },\n        \"summary\": \"7 day weather forecast for coordinates\",\n        \"tags\": [\n          \"Weather Forecast APIs\",\n        ],\n      },\n      \"servers\": [\n        {\n          \"url\": \"https://api.open-meteo.com\",\n        },\n      ],\n    },\n  },\n}\n`;\n\nexports[`validateOpenAPISpec > open-meteo.yaml (http url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"CurrentWeather\": {\n        \"description\": \"Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code\",\n        \"properties\": {\n          \"temperature\": {\n            \"type\": \"number\",\n          },\n          \"time\": {\n            \"type\": \"string\",\n          },\n          \"weather_code\": {\n            \"type\": \"integer\",\n          },\n          \"wind_direction\": {\n            \"type\": \"number\",\n          },\n          \"wind_speed\": {\n            \"type\": \"number\",\n          },\n        },\n        \"required\": [\n          \"time\",\n          \"temperature\",\n          \"wind_speed\",\n          \"wind_direction\",\n          \"weather_code\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DailyResponse\": {\n        \"description\": \"For each selected daily weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n        \"properties\": {\n          \"apparent_temperature_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"apparent_temperature_min\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"et0_fao_evapotranspiration\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation_hours\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation_sum\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"shortwave_radiation_sum\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"sunrise\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"sunset\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m_min\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"time\": {\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"uv_index_clear_sky_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"uv_index_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"weather_code\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_10m_dominant\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_gusts_10m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_10m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"HourlyResponse\": {\n        \"description\": \"For each selected weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n        \"properties\": {\n          \"apparent_temperature\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_high\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_low\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_mid\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"dew_point_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"diffuse_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"direct_normal_irradiance\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"direct_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"evapotranspiration\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"freezing_level_height\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"pressure_msl\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"relative_humidity_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"shortwave_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"snow_height\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_0_1cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_1_3cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_27_81cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_3_9cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_9_27cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_0cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_18cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_54cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_6cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"time\": {\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"vapour_pressure_deficit\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"weather_code\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_120m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_180m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_80m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_gusts_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_120m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_180m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_80m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"time\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"info@open-meteo.com\",\n      \"name\": \"Open-Meteo\",\n      \"url\": \"https://open-meteo.com\",\n    },\n    \"description\": \"Open-Meteo offers free weather forecast APIs for open-source developers and non-commercial use. No API key is required.\",\n    \"license\": {\n      \"name\": \"Attribution 4.0 International (CC BY 4.0)\",\n      \"url\": \"https://creativecommons.org/licenses/by/4.0/\",\n    },\n    \"termsOfService\": \"https://open-meteo.com/en/features#terms\",\n    \"title\": \"Open-Meteo APIs\",\n    \"version\": \"1.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/v1/forecast\": {\n      \"get\": {\n        \"description\": \"7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.\",\n        \"parameters\": [\n          {\n            \"explode\": false,\n            \"in\": \"query\",\n            \"name\": \"hourly\",\n            \"schema\": {\n              \"items\": {\n                \"enum\": [\n                  \"temperature_2m\",\n                  \"relative_humidity_2m\",\n                  \"dew_point_2m\",\n                  \"apparent_temperature\",\n                  \"pressure_msl\",\n                  \"cloud_cover\",\n                  \"cloud_cover_low\",\n                  \"cloud_cover_mid\",\n                  \"cloud_cover_high\",\n                  \"wind_speed_10m\",\n                  \"wind_speed_80m\",\n                  \"wind_speed_120m\",\n                  \"wind_speed_180m\",\n                  \"wind_direction_10m\",\n                  \"wind_direction_80m\",\n                  \"wind_direction_120m\",\n                  \"wind_direction_180m\",\n                  \"wind_gusts_10m\",\n                  \"shortwave_radiation\",\n                  \"direct_radiation\",\n                  \"direct_normal_irradiance\",\n                  \"diffuse_radiation\",\n                  \"vapour_pressure_deficit\",\n                  \"evapotranspiration\",\n                  \"precipitation\",\n                  \"weather_code\",\n                  \"snow_height\",\n                  \"freezing_level_height\",\n                  \"soil_temperature_0cm\",\n                  \"soil_temperature_6cm\",\n                  \"soil_temperature_18cm\",\n                  \"soil_temperature_54cm\",\n                  \"soil_moisture_0_1cm\",\n                  \"soil_moisture_1_3cm\",\n                  \"soil_moisture_3_9cm\",\n                  \"soil_moisture_9_27cm\",\n                  \"soil_moisture_27_81cm\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"daily\",\n            \"schema\": {\n              \"items\": {\n                \"enum\": [\n                  \"temperature_2m_max\",\n                  \"temperature_2m_min\",\n                  \"apparent_temperature_max\",\n                  \"apparent_temperature_min\",\n                  \"precipitation_sum\",\n                  \"precipitation_hours\",\n                  \"weather_code\",\n                  \"sunrise\",\n                  \"sunset\",\n                  \"wind_speed_10m_max\",\n                  \"wind_gusts_10m_max\",\n                  \"wind_direction_10m_dominant\",\n                  \"shortwave_radiation_sum\",\n                  \"uv_index_max\",\n                  \"uv_index_clear_sky_max\",\n                  \"et0_fao_evapotranspiration\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n          {\n            \"description\": \"WGS84 coordinate\",\n            \"in\": \"query\",\n            \"name\": \"latitude\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"double\",\n              \"type\": \"number\",\n            },\n          },\n          {\n            \"description\": \"WGS84 coordinate\",\n            \"in\": \"query\",\n            \"name\": \"longitude\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"double\",\n              \"type\": \"number\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"current_weather\",\n            \"schema\": {\n              \"type\": \"boolean\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"temperature_unit\",\n            \"schema\": {\n              \"default\": \"celsius\",\n              \"enum\": [\n                \"celsius\",\n                \"fahrenheit\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"wind_speed_unit\",\n            \"schema\": {\n              \"default\": \"kmh\",\n              \"enum\": [\n                \"kmh\",\n                \"ms\",\n                \"mph\",\n                \"kn\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If format \\`unixtime\\` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply \\`utc_offset_seconds\\` again to get the correct date.\",\n            \"in\": \"query\",\n            \"name\": \"timeformat\",\n            \"schema\": {\n              \"default\": \"iso8601\",\n              \"enum\": [\n                \"iso8601\",\n                \"unixtime\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If \\`timezone\\` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported.\",\n            \"in\": \"query\",\n            \"name\": \"timezone\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If \\`past_days\\` is set, yesterdays or the day before yesterdays data are also returned.\",\n            \"in\": \"query\",\n            \"name\": \"past_days\",\n            \"schema\": {\n              \"enum\": [\n                1,\n                2,\n              ],\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"current_weather\": {\n                      \"$ref\": \"#/components/schemas/CurrentWeather\",\n                    },\n                    \"daily\": {\n                      \"$ref\": \"#/components/schemas/DailyResponse\",\n                    },\n                    \"daily_units\": {\n                      \"additionalProperties\": {\n                        \"type\": \"string\",\n                      },\n                      \"description\": \"For each selected daily weather variable, the unit will be listed here.\",\n                      \"type\": \"object\",\n                    },\n                    \"elevation\": {\n                      \"description\": \"The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.\",\n                      \"example\": 44.812,\n                      \"type\": \"number\",\n                    },\n                    \"generationtime_ms\": {\n                      \"description\": \"Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.\",\n                      \"example\": 2.2119,\n                      \"type\": \"number\",\n                    },\n                    \"hourly\": {\n                      \"$ref\": \"#/components/schemas/HourlyResponse\",\n                    },\n                    \"hourly_units\": {\n                      \"additionalProperties\": {\n                        \"type\": \"string\",\n                      },\n                      \"description\": \"For each selected weather variable, the unit will be listed here.\",\n                      \"type\": \"object\",\n                    },\n                    \"latitude\": {\n                      \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n                      \"example\": 52.52,\n                      \"type\": \"number\",\n                    },\n                    \"longitude\": {\n                      \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n                      \"example\": \"13.419.52\",\n                      \"type\": \"number\",\n                    },\n                    \"utc_offset_seconds\": {\n                      \"description\": \"Applied timezone offset from the &timezone= parameter.\",\n                      \"example\": 3600,\n                      \"type\": \"integer\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"description\": \"Always set true for errors\",\n                      \"type\": \"boolean\",\n                    },\n                    \"reason\": {\n                      \"description\": \"Description of the error\",\n                      \"example\": \"Latitude must be in range of -90 to 90°. Given: 300\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Bad Request\",\n          },\n        },\n        \"summary\": \"7 day weather forecast for coordinates\",\n        \"tags\": [\n          \"Weather Forecast APIs\",\n        ],\n      },\n      \"servers\": [\n        {\n          \"url\": \"https://api.open-meteo.com\",\n        },\n      ],\n    },\n  },\n}\n`;\n\nexports[`validateOpenAPISpec > open-meteo.yaml (string) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"CurrentWeather\": {\n        \"description\": \"Current weather conditions with the attributes: time, temperature, wind_speed, wind_direction and weather_code\",\n        \"properties\": {\n          \"temperature\": {\n            \"type\": \"number\",\n          },\n          \"time\": {\n            \"type\": \"string\",\n          },\n          \"weather_code\": {\n            \"type\": \"integer\",\n          },\n          \"wind_direction\": {\n            \"type\": \"number\",\n          },\n          \"wind_speed\": {\n            \"type\": \"number\",\n          },\n        },\n        \"required\": [\n          \"time\",\n          \"temperature\",\n          \"wind_speed\",\n          \"wind_direction\",\n          \"weather_code\",\n        ],\n        \"type\": \"object\",\n      },\n      \"DailyResponse\": {\n        \"description\": \"For each selected daily weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n        \"properties\": {\n          \"apparent_temperature_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"apparent_temperature_min\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"et0_fao_evapotranspiration\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation_hours\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation_sum\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"shortwave_radiation_sum\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"sunrise\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"sunset\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m_min\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"time\": {\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"uv_index_clear_sky_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"uv_index_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"weather_code\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_10m_dominant\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_gusts_10m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_10m_max\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"time\",\n        ],\n        \"type\": \"object\",\n      },\n      \"HourlyResponse\": {\n        \"description\": \"For each selected weather variable, data will be returned as a floating point array. Additionally a \\`time\\` array will be returned with ISO8601 timestamps.\",\n        \"properties\": {\n          \"apparent_temperature\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_high\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_low\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"cloud_cover_mid\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"dew_point_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"diffuse_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"direct_normal_irradiance\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"direct_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"evapotranspiration\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"freezing_level_height\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"precipitation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"pressure_msl\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"relative_humidity_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"shortwave_radiation\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"snow_height\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_0_1cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_1_3cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_27_81cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_3_9cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_moisture_9_27cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_0cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_18cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_54cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"soil_temperature_6cm\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"temperature_2m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"time\": {\n            \"items\": {\n              \"type\": \"string\",\n            },\n            \"type\": \"array\",\n          },\n          \"vapour_pressure_deficit\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"weather_code\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_120m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_180m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_direction_80m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_gusts_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_10m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_120m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_180m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n          \"wind_speed_80m\": {\n            \"items\": {\n              \"type\": \"number\",\n            },\n            \"type\": \"array\",\n          },\n        },\n        \"required\": [\n          \"time\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"info@open-meteo.com\",\n      \"name\": \"Open-Meteo\",\n      \"url\": \"https://open-meteo.com\",\n    },\n    \"description\": \"Open-Meteo offers free weather forecast APIs for open-source developers and non-commercial use. No API key is required.\",\n    \"license\": {\n      \"name\": \"Attribution 4.0 International (CC BY 4.0)\",\n      \"url\": \"https://creativecommons.org/licenses/by/4.0/\",\n    },\n    \"termsOfService\": \"https://open-meteo.com/en/features#terms\",\n    \"title\": \"Open-Meteo APIs\",\n    \"version\": \"1.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/v1/forecast\": {\n      \"get\": {\n        \"description\": \"7 day weather variables in hourly and daily resolution for given WGS84 latitude and longitude coordinates. Available worldwide.\",\n        \"parameters\": [\n          {\n            \"explode\": false,\n            \"in\": \"query\",\n            \"name\": \"hourly\",\n            \"schema\": {\n              \"items\": {\n                \"enum\": [\n                  \"temperature_2m\",\n                  \"relative_humidity_2m\",\n                  \"dew_point_2m\",\n                  \"apparent_temperature\",\n                  \"pressure_msl\",\n                  \"cloud_cover\",\n                  \"cloud_cover_low\",\n                  \"cloud_cover_mid\",\n                  \"cloud_cover_high\",\n                  \"wind_speed_10m\",\n                  \"wind_speed_80m\",\n                  \"wind_speed_120m\",\n                  \"wind_speed_180m\",\n                  \"wind_direction_10m\",\n                  \"wind_direction_80m\",\n                  \"wind_direction_120m\",\n                  \"wind_direction_180m\",\n                  \"wind_gusts_10m\",\n                  \"shortwave_radiation\",\n                  \"direct_radiation\",\n                  \"direct_normal_irradiance\",\n                  \"diffuse_radiation\",\n                  \"vapour_pressure_deficit\",\n                  \"evapotranspiration\",\n                  \"precipitation\",\n                  \"weather_code\",\n                  \"snow_height\",\n                  \"freezing_level_height\",\n                  \"soil_temperature_0cm\",\n                  \"soil_temperature_6cm\",\n                  \"soil_temperature_18cm\",\n                  \"soil_temperature_54cm\",\n                  \"soil_moisture_0_1cm\",\n                  \"soil_moisture_1_3cm\",\n                  \"soil_moisture_3_9cm\",\n                  \"soil_moisture_9_27cm\",\n                  \"soil_moisture_27_81cm\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"daily\",\n            \"schema\": {\n              \"items\": {\n                \"enum\": [\n                  \"temperature_2m_max\",\n                  \"temperature_2m_min\",\n                  \"apparent_temperature_max\",\n                  \"apparent_temperature_min\",\n                  \"precipitation_sum\",\n                  \"precipitation_hours\",\n                  \"weather_code\",\n                  \"sunrise\",\n                  \"sunset\",\n                  \"wind_speed_10m_max\",\n                  \"wind_gusts_10m_max\",\n                  \"wind_direction_10m_dominant\",\n                  \"shortwave_radiation_sum\",\n                  \"uv_index_max\",\n                  \"uv_index_clear_sky_max\",\n                  \"et0_fao_evapotranspiration\",\n                ],\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n          },\n          {\n            \"description\": \"WGS84 coordinate\",\n            \"in\": \"query\",\n            \"name\": \"latitude\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"double\",\n              \"type\": \"number\",\n            },\n          },\n          {\n            \"description\": \"WGS84 coordinate\",\n            \"in\": \"query\",\n            \"name\": \"longitude\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"double\",\n              \"type\": \"number\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"current_weather\",\n            \"schema\": {\n              \"type\": \"boolean\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"temperature_unit\",\n            \"schema\": {\n              \"default\": \"celsius\",\n              \"enum\": [\n                \"celsius\",\n                \"fahrenheit\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"wind_speed_unit\",\n            \"schema\": {\n              \"default\": \"kmh\",\n              \"enum\": [\n                \"kmh\",\n                \"ms\",\n                \"mph\",\n                \"kn\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If format \\`unixtime\\` is selected, all time values are returned in UNIX epoch time in seconds. Please not that all time is then in GMT+0! For daily values with unix timestamp, please apply \\`utc_offset_seconds\\` again to get the correct date.\",\n            \"in\": \"query\",\n            \"name\": \"timeformat\",\n            \"schema\": {\n              \"default\": \"iso8601\",\n              \"enum\": [\n                \"iso8601\",\n                \"unixtime\",\n              ],\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If \\`timezone\\` is set, all timestamps are returned as local-time and data is returned starting at 0:00 local-time. Any time zone name from the [time zone database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported.\",\n            \"in\": \"query\",\n            \"name\": \"timezone\",\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n          {\n            \"description\": \"If \\`past_days\\` is set, yesterdays or the day before yesterdays data are also returned.\",\n            \"in\": \"query\",\n            \"name\": \"past_days\",\n            \"schema\": {\n              \"enum\": [\n                1,\n                2,\n              ],\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"current_weather\": {\n                      \"$ref\": \"#/components/schemas/CurrentWeather\",\n                    },\n                    \"daily\": {\n                      \"$ref\": \"#/components/schemas/DailyResponse\",\n                    },\n                    \"daily_units\": {\n                      \"additionalProperties\": {\n                        \"type\": \"string\",\n                      },\n                      \"description\": \"For each selected daily weather variable, the unit will be listed here.\",\n                      \"type\": \"object\",\n                    },\n                    \"elevation\": {\n                      \"description\": \"The elevation in meters of the selected weather grid-cell. In mountain terrain it might differ from the location you would expect.\",\n                      \"example\": 44.812,\n                      \"type\": \"number\",\n                    },\n                    \"generationtime_ms\": {\n                      \"description\": \"Generation time of the weather forecast in milli seconds. This is mainly used for performance monitoring and improvements.\",\n                      \"example\": 2.2119,\n                      \"type\": \"number\",\n                    },\n                    \"hourly\": {\n                      \"$ref\": \"#/components/schemas/HourlyResponse\",\n                    },\n                    \"hourly_units\": {\n                      \"additionalProperties\": {\n                        \"type\": \"string\",\n                      },\n                      \"description\": \"For each selected weather variable, the unit will be listed here.\",\n                      \"type\": \"object\",\n                    },\n                    \"latitude\": {\n                      \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n                      \"example\": 52.52,\n                      \"type\": \"number\",\n                    },\n                    \"longitude\": {\n                      \"description\": \"WGS84 of the center of the weather grid-cell which was used to generate this forecast. This coordinate might be up to 5 km away.\",\n                      \"example\": \"13.419.52\",\n                      \"type\": \"number\",\n                    },\n                    \"utc_offset_seconds\": {\n                      \"description\": \"Applied timezone offset from the &timezone= parameter.\",\n                      \"example\": 3600,\n                      \"type\": \"integer\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"error\": {\n                      \"description\": \"Always set true for errors\",\n                      \"type\": \"boolean\",\n                    },\n                    \"reason\": {\n                      \"description\": \"Description of the error\",\n                      \"example\": \"Latitude must be in range of -90 to 90°. Given: 300\",\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Bad Request\",\n          },\n        },\n        \"summary\": \"7 day weather forecast for coordinates\",\n        \"tags\": [\n          \"Weather Forecast APIs\",\n        ],\n      },\n      \"servers\": [\n        {\n          \"url\": \"https://api.open-meteo.com\",\n        },\n      ],\n    },\n  },\n}\n`;\n\nexports[`validateOpenAPISpec > pet-store.json (file url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"Error\": {\n        \"properties\": {\n          \"code\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\",\n          },\n          \"message\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"code\",\n          \"message\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pet\": {\n        \"properties\": {\n          \"id\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pets\": {\n        \"items\": {\n          \"$ref\": \"#/components/schemas/Pet\",\n        },\n        \"maxItems\": 100,\n        \"type\": \"array\",\n      },\n    },\n  },\n  \"info\": {\n    \"license\": {\n      \"name\": \"MIT\",\n    },\n    \"title\": \"Swagger Petstore\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"operationId\": \"listPets\",\n        \"parameters\": [\n          {\n            \"description\": \"How many items to return at one time (max 100)\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"int32\",\n              \"maximum\": 100,\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pets\",\n                },\n              },\n            },\n            \"description\": \"A paged array of pets\",\n            \"headers\": {\n              \"x-next\": {\n                \"description\": \"A link to the next page of responses\",\n                \"schema\": {\n                  \"type\": \"string\",\n                },\n              },\n            },\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"List all pets\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n      \"post\": {\n        \"operationId\": \"createPets\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/Pet\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"Null response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"Create a pet\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n    },\n    \"/pets/{petId}\": {\n      \"get\": {\n        \"operationId\": \"showPetById\",\n        \"parameters\": [\n          {\n            \"description\": \"The id of the pet to retrieve\",\n            \"in\": \"path\",\n            \"name\": \"petId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"Expected response to a valid request\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"Info for a specific pet\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/v1\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > pet-store.json (http url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"Error\": {\n        \"properties\": {\n          \"code\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\",\n          },\n          \"message\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"code\",\n          \"message\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pet\": {\n        \"properties\": {\n          \"id\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pets\": {\n        \"items\": {\n          \"$ref\": \"#/components/schemas/Pet\",\n        },\n        \"maxItems\": 100,\n        \"type\": \"array\",\n      },\n    },\n  },\n  \"info\": {\n    \"license\": {\n      \"name\": \"MIT\",\n    },\n    \"title\": \"Swagger Petstore\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"operationId\": \"listPets\",\n        \"parameters\": [\n          {\n            \"description\": \"How many items to return at one time (max 100)\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"int32\",\n              \"maximum\": 100,\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pets\",\n                },\n              },\n            },\n            \"description\": \"A paged array of pets\",\n            \"headers\": {\n              \"x-next\": {\n                \"description\": \"A link to the next page of responses\",\n                \"schema\": {\n                  \"type\": \"string\",\n                },\n              },\n            },\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"List all pets\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n      \"post\": {\n        \"operationId\": \"createPets\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/Pet\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"Null response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"Create a pet\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n    },\n    \"/pets/{petId}\": {\n      \"get\": {\n        \"operationId\": \"showPetById\",\n        \"parameters\": [\n          {\n            \"description\": \"The id of the pet to retrieve\",\n            \"in\": \"path\",\n            \"name\": \"petId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"Expected response to a valid request\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"Info for a specific pet\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/v1\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > pet-store.json (string) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"Error\": {\n        \"properties\": {\n          \"code\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\",\n          },\n          \"message\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"code\",\n          \"message\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pet\": {\n        \"properties\": {\n          \"id\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pets\": {\n        \"items\": {\n          \"$ref\": \"#/components/schemas/Pet\",\n        },\n        \"maxItems\": 100,\n        \"type\": \"array\",\n      },\n    },\n  },\n  \"info\": {\n    \"license\": {\n      \"name\": \"MIT\",\n    },\n    \"title\": \"Swagger Petstore\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"operationId\": \"listPets\",\n        \"parameters\": [\n          {\n            \"description\": \"How many items to return at one time (max 100)\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"int32\",\n              \"maximum\": 100,\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pets\",\n                },\n              },\n            },\n            \"description\": \"A paged array of pets\",\n            \"headers\": {\n              \"x-next\": {\n                \"description\": \"A link to the next page of responses\",\n                \"schema\": {\n                  \"type\": \"string\",\n                },\n              },\n            },\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"List all pets\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n      \"post\": {\n        \"operationId\": \"createPets\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/Pet\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"201\": {\n            \"description\": \"Null response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"Create a pet\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n    },\n    \"/pets/{petId}\": {\n      \"get\": {\n        \"operationId\": \"showPetById\",\n        \"parameters\": [\n          {\n            \"description\": \"The id of the pet to retrieve\",\n            \"in\": \"path\",\n            \"name\": \"petId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"Expected response to a valid request\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n        \"summary\": \"Info for a specific pet\",\n        \"tags\": [\n          \"pets\",\n        ],\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/v1\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > petstore-expanded.json (file url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"Error\": {\n        \"properties\": {\n          \"code\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\",\n          },\n          \"message\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"code\",\n          \"message\",\n        ],\n        \"type\": \"object\",\n      },\n      \"NewPet\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pet\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/NewPet\",\n          },\n          {\n            \"properties\": {\n              \"id\": {\n                \"format\": \"int64\",\n                \"type\": \"integer\",\n              },\n            },\n            \"required\": [\n              \"id\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"apiteam@swagger.io\",\n      \"name\": \"Swagger API Team\",\n      \"url\": \"http://swagger.io\",\n    },\n    \"description\": \"A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification\",\n    \"license\": {\n      \"name\": \"Apache 2.0\",\n      \"url\": \"https://www.apache.org/licenses/LICENSE-2.0.html\",\n    },\n    \"termsOfService\": \"http://swagger.io/terms/\",\n    \"title\": \"Swagger Petstore\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"description\": \"Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\",\n        \"operationId\": \"findPets\",\n        \"parameters\": [\n          {\n            \"description\": \"tags to filter by\",\n            \"in\": \"query\",\n            \"name\": \"tags\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n            \"style\": \"form\",\n          },\n          {\n            \"description\": \"maximum number of results to return\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"int32\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/Pet\",\n                  },\n                  \"type\": \"array\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n      \"post\": {\n        \"description\": \"Creates a new pet in the store. Duplicates are allowed\",\n        \"operationId\": \"addPet\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/NewPet\",\n              },\n            },\n          },\n          \"description\": \"Pet to add to the store\",\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n    },\n    \"/pets/{id}\": {\n      \"delete\": {\n        \"description\": \"deletes a single pet based on the ID supplied\",\n        \"operationId\": \"deletePet\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of pet to delete\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"int64\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"pet deleted\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n      \"get\": {\n        \"description\": \"Returns a user based on a single ID, if the user does not have access to the pet\",\n        \"operationId\": \"find pet by id\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of pet to fetch\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"int64\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/api\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > petstore-expanded.json (http url) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"Error\": {\n        \"properties\": {\n          \"code\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\",\n          },\n          \"message\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"code\",\n          \"message\",\n        ],\n        \"type\": \"object\",\n      },\n      \"NewPet\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pet\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/NewPet\",\n          },\n          {\n            \"properties\": {\n              \"id\": {\n                \"format\": \"int64\",\n                \"type\": \"integer\",\n              },\n            },\n            \"required\": [\n              \"id\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"apiteam@swagger.io\",\n      \"name\": \"Swagger API Team\",\n      \"url\": \"http://swagger.io\",\n    },\n    \"description\": \"A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification\",\n    \"license\": {\n      \"name\": \"Apache 2.0\",\n      \"url\": \"https://www.apache.org/licenses/LICENSE-2.0.html\",\n    },\n    \"termsOfService\": \"http://swagger.io/terms/\",\n    \"title\": \"Swagger Petstore\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"description\": \"Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\",\n        \"operationId\": \"findPets\",\n        \"parameters\": [\n          {\n            \"description\": \"tags to filter by\",\n            \"in\": \"query\",\n            \"name\": \"tags\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n            \"style\": \"form\",\n          },\n          {\n            \"description\": \"maximum number of results to return\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"int32\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/Pet\",\n                  },\n                  \"type\": \"array\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n      \"post\": {\n        \"description\": \"Creates a new pet in the store. Duplicates are allowed\",\n        \"operationId\": \"addPet\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/NewPet\",\n              },\n            },\n          },\n          \"description\": \"Pet to add to the store\",\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n    },\n    \"/pets/{id}\": {\n      \"delete\": {\n        \"description\": \"deletes a single pet based on the ID supplied\",\n        \"operationId\": \"deletePet\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of pet to delete\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"int64\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"pet deleted\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n      \"get\": {\n        \"description\": \"Returns a user based on a single ID, if the user does not have access to the pet\",\n        \"operationId\": \"find pet by id\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of pet to fetch\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"int64\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/api\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > petstore-expanded.json (string) 1`] = `\n{\n  \"components\": {\n    \"schemas\": {\n      \"Error\": {\n        \"properties\": {\n          \"code\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\",\n          },\n          \"message\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"code\",\n          \"message\",\n        ],\n        \"type\": \"object\",\n      },\n      \"NewPet\": {\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n          },\n          \"tag\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"name\",\n        ],\n        \"type\": \"object\",\n      },\n      \"Pet\": {\n        \"allOf\": [\n          {\n            \"$ref\": \"#/components/schemas/NewPet\",\n          },\n          {\n            \"properties\": {\n              \"id\": {\n                \"format\": \"int64\",\n                \"type\": \"integer\",\n              },\n            },\n            \"required\": [\n              \"id\",\n            ],\n            \"type\": \"object\",\n          },\n        ],\n      },\n    },\n  },\n  \"info\": {\n    \"contact\": {\n      \"email\": \"apiteam@swagger.io\",\n      \"name\": \"Swagger API Team\",\n      \"url\": \"http://swagger.io\",\n    },\n    \"description\": \"A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification\",\n    \"license\": {\n      \"name\": \"Apache 2.0\",\n      \"url\": \"https://www.apache.org/licenses/LICENSE-2.0.html\",\n    },\n    \"termsOfService\": \"http://swagger.io/terms/\",\n    \"title\": \"Swagger Petstore\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.0\",\n  \"paths\": {\n    \"/pets\": {\n      \"get\": {\n        \"description\": \"Returns all pets from the system that the user has access to\nNam sed condimentum est. Maecenas tempor sagittis sapien, nec rhoncus sem sagittis sit amet. Aenean at gravida augue, ac iaculis sem. Curabitur odio lorem, ornare eget elementum nec, cursus id lectus. Duis mi turpis, pulvinar ac eros ac, tincidunt varius justo. In hac habitasse platea dictumst. Integer at adipiscing ante, a sagittis ligula. Aenean pharetra tempor ante molestie imperdiet. Vivamus id aliquam diam. Cras quis velit non tortor eleifend sagittis. Praesent at enim pharetra urna volutpat venenatis eget eget mauris. In eleifend fermentum facilisis. Praesent enim enim, gravida ac sodales sed, placerat id erat. Suspendisse lacus dolor, consectetur non augue vel, vehicula interdum libero. Morbi euismod sagittis libero sed lacinia.\n\nSed tempus felis lobortis leo pulvinar rutrum. Nam mattis velit nisl, eu condimentum ligula luctus nec. Phasellus semper velit eget aliquet faucibus. In a mattis elit. Phasellus vel urna viverra, condimentum lorem id, rhoncus nibh. Ut pellentesque posuere elementum. Sed a varius odio. Morbi rhoncus ligula libero, vel eleifend nunc tristique vitae. Fusce et sem dui. Aenean nec scelerisque tortor. Fusce malesuada accumsan magna vel tempus. Quisque mollis felis eu dolor tristique, sit amet auctor felis gravida. Sed libero lorem, molestie sed nisl in, accumsan tempor nisi. Fusce sollicitudin massa ut lacinia mattis. Sed vel eleifend lorem. Pellentesque vitae felis pretium, pulvinar elit eu, euismod sapien.\",\n        \"operationId\": \"findPets\",\n        \"parameters\": [\n          {\n            \"description\": \"tags to filter by\",\n            \"in\": \"query\",\n            \"name\": \"tags\",\n            \"required\": false,\n            \"schema\": {\n              \"items\": {\n                \"type\": \"string\",\n              },\n              \"type\": \"array\",\n            },\n            \"style\": \"form\",\n          },\n          {\n            \"description\": \"maximum number of results to return\",\n            \"in\": \"query\",\n            \"name\": \"limit\",\n            \"required\": false,\n            \"schema\": {\n              \"format\": \"int32\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"items\": {\n                    \"$ref\": \"#/components/schemas/Pet\",\n                  },\n                  \"type\": \"array\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n      \"post\": {\n        \"description\": \"Creates a new pet in the store. Duplicates are allowed\",\n        \"operationId\": \"addPet\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/NewPet\",\n              },\n            },\n          },\n          \"description\": \"Pet to add to the store\",\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n    },\n    \"/pets/{id}\": {\n      \"delete\": {\n        \"description\": \"deletes a single pet based on the ID supplied\",\n        \"operationId\": \"deletePet\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of pet to delete\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"int64\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"pet deleted\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n      \"get\": {\n        \"description\": \"Returns a user based on a single ID, if the user does not have access to the pet\",\n        \"operationId\": \"find pet by id\",\n        \"parameters\": [\n          {\n            \"description\": \"ID of pet to fetch\",\n            \"in\": \"path\",\n            \"name\": \"id\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"int64\",\n              \"type\": \"integer\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Pet\",\n                },\n              },\n            },\n            \"description\": \"pet response\",\n          },\n          \"default\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/Error\",\n                },\n              },\n            },\n            \"description\": \"unexpected error\",\n          },\n        },\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"http://petstore.swagger.io/api\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > remote spec https://agentic-platform-fixtures-everything.onrender.com/docs 1`] = `\n{\n  \"components\": {\n    \"parameters\": {},\n    \"schemas\": {\n      \"User\": {\n        \"properties\": {\n          \"email\": {\n            \"type\": \"string\",\n          },\n          \"id\": {\n            \"type\": \"string\",\n          },\n          \"name\": {\n            \"type\": \"string\",\n          },\n        },\n        \"required\": [\n          \"id\",\n          \"name\",\n          \"email\",\n        ],\n        \"type\": \"object\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"OpenAPI kitchen sink server meant for testing Agentic's origin OpenAPI adapter and ToolConfig features.\",\n    \"title\": \"OpenAPI server everything\",\n    \"version\": \"0.1.0\",\n  },\n  \"openapi\": \"3.1.0\",\n  \"paths\": {\n    \"/custom-cache-control-tool\": {\n      \"post\": {\n        \"description\": \"Custom cache control tool\",\n        \"operationId\": \"customCacheControlTool\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/custom-rate-limit-approximate-tool\": {\n      \"post\": {\n        \"description\": \"Custom rate limit tool (approximate mode)\",\n        \"operationId\": \"customRateLimitApproximateTool\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/custom-rate-limit-tool\": {\n      \"post\": {\n        \"description\": \"Custom rate limit tool (strict mode)\",\n        \"operationId\": \"customRateLimitTool\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/disabled-for-free-plan-tool\": {\n      \"get\": {\n        \"description\": \"Disabled for free plan tool\",\n        \"operationId\": \"disabledForFreePlanTool\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"status\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"status\",\n                  ],\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n        },\n      },\n    },\n    \"/disabled-rate-limit-tool\": {\n      \"post\": {\n        \"description\": \"Disabled rate limit tool\",\n        \"operationId\": \"disabledRateLimitTool\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/disabled-tool\": {\n      \"get\": {\n        \"description\": \"Disabled tool\",\n        \"operationId\": \"disabledTool\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"status\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"status\",\n                  ],\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n        },\n      },\n    },\n    \"/echo\": {\n      \"post\": {\n        \"description\": \"Echoes the request body\",\n        \"operationId\": \"echo\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/echo-headers\": {\n      \"get\": {\n        \"description\": \"Echoes the request headers\",\n        \"operationId\": \"echoHeaders\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request headers\",\n          },\n        },\n      },\n    },\n    \"/health\": {\n      \"get\": {\n        \"description\": \"Check if the server is healthy\",\n        \"operationId\": \"healthCheck\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"status\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"status\",\n                  ],\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n        },\n      },\n    },\n    \"/no-cache-cache-control-tool\": {\n      \"post\": {\n        \"description\": \"No cache cache control tool\",\n        \"operationId\": \"noCacheCacheControlTool\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/no-store-cache-control-tool\": {\n      \"post\": {\n        \"description\": \"No store cache control tool\",\n        \"operationId\": \"noStoreCacheControlTool\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/pure\": {\n      \"post\": {\n        \"description\": \"Pure tool\",\n        \"operationId\": \"pure\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {},\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/strict-additional-properties\": {\n      \"post\": {\n        \"description\": \"Echoes the request body only allowing a single \"foo\" field.\",\n        \"operationId\": \"strictAdditionalProperties\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {\n                  \"foo\": {\n                    \"type\": \"string\",\n                  },\n                },\n                \"required\": [\n                  \"foo\",\n                ],\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"foo\": {\n                      \"type\": \"string\",\n                    },\n                  },\n                  \"required\": [\n                    \"foo\",\n                  ],\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body\",\n          },\n        },\n      },\n    },\n    \"/unpure-marked-pure\": {\n      \"post\": {\n        \"description\": \"Unpure tool marked pure\",\n        \"operationId\": \"unpure_marked_pure\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"properties\": {},\n                \"type\": \"object\",\n              },\n            },\n          },\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"properties\": {\n                    \"now\": {\n                      \"type\": \"number\",\n                    },\n                  },\n                  \"required\": [\n                    \"now\",\n                  ],\n                  \"type\": \"object\",\n                },\n              },\n            },\n            \"description\": \"Echoed request body with current timestamp to not be pure\",\n          },\n        },\n      },\n    },\n    \"/users/{userId}\": {\n      \"get\": {\n        \"description\": \"Gets a user\",\n        \"operationId\": \"getUser\",\n        \"parameters\": [\n          {\n            \"description\": \"User ID\",\n            \"in\": \"path\",\n            \"name\": \"userId\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\",\n            },\n          },\n        ],\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/User\",\n                },\n              },\n            },\n            \"description\": \"A user object\",\n          },\n        },\n        \"tags\": [\n          \"users\",\n        ],\n      },\n    },\n  },\n  \"webhooks\": {},\n}\n`;\n\nexports[`validateOpenAPISpec > security.json (file url) 1`] = `\n{\n  \"components\": {\n    \"securitySchemes\": {\n      \"apiKey_cookie\": {\n        \"description\": \"An API key that will be supplied in a named cookie. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"cookie\",\n        \"name\": \"api_key\",\n        \"type\": \"apiKey\",\n      },\n      \"apiKey_header\": {\n        \"description\": \"An API key that will be supplied in a named header. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"header\",\n        \"name\": \"X-API-KEY\",\n        \"type\": \"apiKey\",\n      },\n      \"apiKey_query\": {\n        \"description\": \"An API key that will be supplied in a named query parameter. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"query\",\n        \"name\": \"apiKey\",\n        \"type\": \"apiKey\",\n      },\n      \"basic\": {\n        \"description\": \"Basic auth that takes a base64'd combination of \\`user:password\\`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"scheme\": \"basic\",\n        \"type\": \"http\",\n      },\n      \"bearer\": {\n        \"description\": \"A bearer token that will be supplied within an \\`Authentication\\` header as \\`bearer <token>\\`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n      \"bearer_jwt\": {\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"A bearer token that will be supplied within an \\`Authentication\\` header as \\`bearer <token>\\`. In this case, the format of the token is specified as JWT. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#jwt-bearer-sample\",\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n      \"oauth2\": {\n        \"description\": \"An OAuth 2 security flow. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n          \"implicit\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n          },\n          \"password\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_authorizationCode\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`authorizationCode\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_clientCredentials\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`clientCredentials\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_implicit\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`implicit\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"implicit\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_password\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`password\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"password\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"openIdConnect\": {\n        \"description\": \"OpenAPI authentication. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"openIdConnectUrl\": \"https://example.com/.well-known/openid-configuration\",\n        \"type\": \"openIdConnect\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#securitySchemeObject\",\n    \"title\": \"Support for different security types\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.3\",\n  \"paths\": {\n    \"/anything/apiKey\": {\n      \"get\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`apiKey\\` query parameter.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": [],\n          },\n        ],\n        \"summary\": \"Query parameter\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n      \"post\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`api_key\\` cookie.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_cookie\": [],\n          },\n        ],\n        \"summary\": \"Cookie\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`X-API-KEY\\` header.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": [],\n          },\n        ],\n        \"summary\": \"Header\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n    },\n    \"/anything/basic\": {\n      \"post\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Basic\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"basic\": [],\n          },\n        ],\n        \"summary\": \"Basic\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n    },\n    \"/anything/bearer\": {\n      \"post\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearer\": [],\n          },\n        ],\n        \"summary\": \"Bearer\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard \\`Bearer\\` authentication token.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearer_jwt\": [],\n          },\n        ],\n        \"summary\": \"Bearer (\\`jwt\\` format)\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n    },\n    \"/anything/no-auth\": {\n      \"post\": {\n        \"description\": \"This operation does not have any authentication requirements.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"summary\": \"No auth requirements\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n    \"/anything/oauth2\": {\n      \"delete\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_password\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (password flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"get\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_authorizationCode\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (authorizationCode flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"patch\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_implicit\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (implicit flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"post\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (all flow types)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_clientCredentials\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (clientCredentials flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n    },\n    \"/anything/openIdConnect\": {\n      \"post\": {\n        \"description\": \"🚧 This is not supported.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"openIdConnect\": [],\n          },\n        ],\n        \"summary\": \"General support\",\n        \"tags\": [\n          \"OpenID Connect\",\n        ],\n      },\n    },\n    \"/anything/optional-auth\": {\n      \"get\": {\n        \"description\": \"The \\`apiKey\\` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": [],\n          },\n          {},\n        ],\n        \"summary\": \"Optional auth\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n    \"/status/401\": {\n      \"post\": {\n        \"description\": \"This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\",\n        \"responses\": {\n          \"401\": {\n            \"description\": \"Unauthorized\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": [],\n          },\n        ],\n        \"summary\": \"Forced invalid authentication\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://httpbin.org\",\n    },\n  ],\n  \"tags\": [\n    {\n      \"name\": \"API Key\",\n    },\n    {\n      \"name\": \"HTTP\",\n    },\n    {\n      \"name\": \"OAuth 2\",\n    },\n    {\n      \"name\": \"OpenID Connect\",\n    },\n    {\n      \"name\": \"Other\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > security.json (http url) 1`] = `\n{\n  \"components\": {\n    \"securitySchemes\": {\n      \"apiKey_cookie\": {\n        \"description\": \"An API key that will be supplied in a named cookie. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"cookie\",\n        \"name\": \"api_key\",\n        \"type\": \"apiKey\",\n      },\n      \"apiKey_header\": {\n        \"description\": \"An API key that will be supplied in a named header. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"header\",\n        \"name\": \"X-API-KEY\",\n        \"type\": \"apiKey\",\n      },\n      \"apiKey_query\": {\n        \"description\": \"An API key that will be supplied in a named query parameter. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"query\",\n        \"name\": \"apiKey\",\n        \"type\": \"apiKey\",\n      },\n      \"basic\": {\n        \"description\": \"Basic auth that takes a base64'd combination of \\`user:password\\`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"scheme\": \"basic\",\n        \"type\": \"http\",\n      },\n      \"bearer\": {\n        \"description\": \"A bearer token that will be supplied within an \\`Authentication\\` header as \\`bearer <token>\\`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n      \"bearer_jwt\": {\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"A bearer token that will be supplied within an \\`Authentication\\` header as \\`bearer <token>\\`. In this case, the format of the token is specified as JWT. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#jwt-bearer-sample\",\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n      \"oauth2\": {\n        \"description\": \"An OAuth 2 security flow. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n          \"implicit\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n          },\n          \"password\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_authorizationCode\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`authorizationCode\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_clientCredentials\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`clientCredentials\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_implicit\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`implicit\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"implicit\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_password\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`password\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"password\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"openIdConnect\": {\n        \"description\": \"OpenAPI authentication. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"openIdConnectUrl\": \"https://example.com/.well-known/openid-configuration\",\n        \"type\": \"openIdConnect\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#securitySchemeObject\",\n    \"title\": \"Support for different security types\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.3\",\n  \"paths\": {\n    \"/anything/apiKey\": {\n      \"get\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`apiKey\\` query parameter.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": [],\n          },\n        ],\n        \"summary\": \"Query parameter\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n      \"post\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`api_key\\` cookie.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_cookie\": [],\n          },\n        ],\n        \"summary\": \"Cookie\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`X-API-KEY\\` header.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": [],\n          },\n        ],\n        \"summary\": \"Header\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n    },\n    \"/anything/basic\": {\n      \"post\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Basic\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"basic\": [],\n          },\n        ],\n        \"summary\": \"Basic\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n    },\n    \"/anything/bearer\": {\n      \"post\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearer\": [],\n          },\n        ],\n        \"summary\": \"Bearer\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard \\`Bearer\\` authentication token.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearer_jwt\": [],\n          },\n        ],\n        \"summary\": \"Bearer (\\`jwt\\` format)\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n    },\n    \"/anything/no-auth\": {\n      \"post\": {\n        \"description\": \"This operation does not have any authentication requirements.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"summary\": \"No auth requirements\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n    \"/anything/oauth2\": {\n      \"delete\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_password\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (password flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"get\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_authorizationCode\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (authorizationCode flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"patch\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_implicit\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (implicit flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"post\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (all flow types)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_clientCredentials\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (clientCredentials flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n    },\n    \"/anything/openIdConnect\": {\n      \"post\": {\n        \"description\": \"🚧 This is not supported.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"openIdConnect\": [],\n          },\n        ],\n        \"summary\": \"General support\",\n        \"tags\": [\n          \"OpenID Connect\",\n        ],\n      },\n    },\n    \"/anything/optional-auth\": {\n      \"get\": {\n        \"description\": \"The \\`apiKey\\` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": [],\n          },\n          {},\n        ],\n        \"summary\": \"Optional auth\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n    \"/status/401\": {\n      \"post\": {\n        \"description\": \"This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\",\n        \"responses\": {\n          \"401\": {\n            \"description\": \"Unauthorized\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": [],\n          },\n        ],\n        \"summary\": \"Forced invalid authentication\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://httpbin.org\",\n    },\n  ],\n  \"tags\": [\n    {\n      \"name\": \"API Key\",\n    },\n    {\n      \"name\": \"HTTP\",\n    },\n    {\n      \"name\": \"OAuth 2\",\n    },\n    {\n      \"name\": \"OpenID Connect\",\n    },\n    {\n      \"name\": \"Other\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > security.json (string) 1`] = `\n{\n  \"components\": {\n    \"securitySchemes\": {\n      \"apiKey_cookie\": {\n        \"description\": \"An API key that will be supplied in a named cookie. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"cookie\",\n        \"name\": \"api_key\",\n        \"type\": \"apiKey\",\n      },\n      \"apiKey_header\": {\n        \"description\": \"An API key that will be supplied in a named header. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"header\",\n        \"name\": \"X-API-KEY\",\n        \"type\": \"apiKey\",\n      },\n      \"apiKey_query\": {\n        \"description\": \"An API key that will be supplied in a named query parameter. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object\",\n        \"in\": \"query\",\n        \"name\": \"apiKey\",\n        \"type\": \"apiKey\",\n      },\n      \"basic\": {\n        \"description\": \"Basic auth that takes a base64'd combination of \\`user:password\\`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"scheme\": \"basic\",\n        \"type\": \"http\",\n      },\n      \"bearer\": {\n        \"description\": \"A bearer token that will be supplied within an \\`Authentication\\` header as \\`bearer <token>\\`. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n      \"bearer_jwt\": {\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"A bearer token that will be supplied within an \\`Authentication\\` header as \\`bearer <token>\\`. In this case, the format of the token is specified as JWT. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#jwt-bearer-sample\",\n        \"scheme\": \"bearer\",\n        \"type\": \"http\",\n      },\n      \"oauth2\": {\n        \"description\": \"An OAuth 2 security flow. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n          \"implicit\": {\n            \"authorizationUrl\": \"http://example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n          },\n          \"password\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_authorizationCode\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`authorizationCode\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_clientCredentials\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`clientCredentials\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_implicit\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`implicit\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"implicit\": {\n            \"authorizationUrl\": \"http://alt.example.com/oauth/dialog\",\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"oauth2_password\": {\n        \"description\": \"An OAuth 2 security flow that only supports the \\`password\\` flow type. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#oauth-flows-object\",\n        \"flows\": {\n          \"password\": {\n            \"scopes\": {\n              \"write:things\": \"Add things to your account\",\n            },\n            \"tokenUrl\": \"http://alt.example.com/oauth/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"openIdConnect\": {\n        \"description\": \"OpenAPI authentication. https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"openIdConnectUrl\": \"https://example.com/.well-known/openid-configuration\",\n        \"type\": \"openIdConnect\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#securitySchemeObject\",\n    \"title\": \"Support for different security types\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.0.3\",\n  \"paths\": {\n    \"/anything/apiKey\": {\n      \"get\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`apiKey\\` query parameter.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": [],\n          },\n        ],\n        \"summary\": \"Query parameter\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n      \"post\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`api_key\\` cookie.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_cookie\": [],\n          },\n        ],\n        \"summary\": \"Cookie\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"\\`apiKey\\` auth will be supplied within an \\`X-API-KEY\\` header.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": [],\n          },\n        ],\n        \"summary\": \"Header\",\n        \"tags\": [\n          \"API Key\",\n        ],\n      },\n    },\n    \"/anything/basic\": {\n      \"post\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Basic\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"basic\": [],\n          },\n        ],\n        \"summary\": \"Basic\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n    },\n    \"/anything/bearer\": {\n      \"post\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearer\": [],\n          },\n        ],\n        \"summary\": \"Bearer\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"Authentication credentials will be supplied within a \\`Bearer\\` \\`Authorization\\` header, but its data should be controlled as a JWT.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#basic-authentication-sample\n\n> ℹ️\n> We currently do not support any special handling for this so they're handled as a standard \\`Bearer\\` authentication token.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearer_jwt\": [],\n          },\n        ],\n        \"summary\": \"Bearer (\\`jwt\\` format)\",\n        \"tags\": [\n          \"HTTP\",\n        ],\n      },\n    },\n    \"/anything/no-auth\": {\n      \"post\": {\n        \"description\": \"This operation does not have any authentication requirements.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"summary\": \"No auth requirements\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n    \"/anything/oauth2\": {\n      \"delete\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_password\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (password flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"get\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_authorizationCode\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (authorizationCode flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"patch\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_implicit\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (implicit flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"post\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (all flow types)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n      \"put\": {\n        \"description\": \"> ℹ️\n> We currently do not handle OAuth 2 authentication flows so if an operation has an \\`oauth2\\` requirement we assume that the user, or the projects JWT, has a qualified \\`bearer\\` token and will use that.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#fixed-fields-23\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"oauth2_clientCredentials\": [\n              \"write:things\",\n            ],\n          },\n        ],\n        \"summary\": \"General support (clientCredentials flow type)\",\n        \"tags\": [\n          \"OAuth 2\",\n        ],\n      },\n    },\n    \"/anything/openIdConnect\": {\n      \"post\": {\n        \"description\": \"🚧 This is not supported.\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"openIdConnect\": [],\n          },\n        ],\n        \"summary\": \"General support\",\n        \"tags\": [\n          \"OpenID Connect\",\n        ],\n      },\n    },\n    \"/anything/optional-auth\": {\n      \"get\": {\n        \"description\": \"The \\`apiKey\\` query parameter auth on this operation is optional.\n\nhttps://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object\",\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_query\": [],\n          },\n          {},\n        ],\n        \"summary\": \"Optional auth\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n    \"/status/401\": {\n      \"post\": {\n        \"description\": \"This endpoint requires an authentication header but making any request to it will forcefully return a 401 status code for invalid auth.\",\n        \"responses\": {\n          \"401\": {\n            \"description\": \"Unauthorized\",\n          },\n        },\n        \"security\": [\n          {\n            \"apiKey_header\": [],\n          },\n        ],\n        \"summary\": \"Forced invalid authentication\",\n        \"tags\": [\n          \"Other\",\n        ],\n      },\n    },\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://httpbin.org\",\n    },\n  ],\n  \"tags\": [\n    {\n      \"name\": \"API Key\",\n    },\n    {\n      \"name\": \"HTTP\",\n    },\n    {\n      \"name\": \"OAuth 2\",\n    },\n    {\n      \"name\": \"OpenID Connect\",\n    },\n    {\n      \"name\": \"Other\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > tic-tac-toe.json (file url) 1`] = `\n{\n  \"components\": {\n    \"parameters\": {\n      \"columnParam\": {\n        \"description\": \"Board column (horizontal coordinate)\",\n        \"in\": \"path\",\n        \"name\": \"column\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\",\n        },\n      },\n      \"rowParam\": {\n        \"description\": \"Board row (vertical coordinate)\",\n        \"in\": \"path\",\n        \"name\": \"row\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\",\n        },\n      },\n    },\n    \"schemas\": {\n      \"board\": {\n        \"items\": {\n          \"items\": {\n            \"$ref\": \"#/components/schemas/mark\",\n          },\n          \"maxItems\": 3,\n          \"minItems\": 3,\n          \"type\": \"array\",\n        },\n        \"maxItems\": 3,\n        \"minItems\": 3,\n        \"type\": \"array\",\n      },\n      \"coordinate\": {\n        \"example\": 1,\n        \"maximum\": 3,\n        \"minimum\": 1,\n        \"type\": \"integer\",\n      },\n      \"errorMessage\": {\n        \"description\": \"A text message describing an error\",\n        \"maxLength\": 256,\n        \"type\": \"string\",\n      },\n      \"mark\": {\n        \"description\": \"Possible values for a board square. \\`.\\` means empty square.\",\n        \"enum\": [\n          \".\",\n          \"X\",\n          \"O\",\n        ],\n        \"example\": \".\",\n        \"type\": \"string\",\n      },\n      \"status\": {\n        \"properties\": {\n          \"board\": {\n            \"$ref\": \"#/components/schemas/board\",\n          },\n          \"winner\": {\n            \"$ref\": \"#/components/schemas/winner\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"winner\": {\n        \"description\": \"Winner of the game. \\`.\\` means nobody has won yet.\",\n        \"enum\": [\n          \".\",\n          \"X\",\n          \"O\",\n        ],\n        \"example\": \".\",\n        \"type\": \"string\",\n      },\n    },\n    \"securitySchemes\": {\n      \"app2AppOauth\": {\n        \"flows\": {\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n            },\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"basicHttpAuthentication\": {\n        \"description\": \"Basic HTTP Authentication\",\n        \"scheme\": \"Basic\",\n        \"type\": \"http\",\n      },\n      \"bearerHttpAuthentication\": {\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"Bearer token using a JWT\",\n        \"scheme\": \"Bearer\",\n        \"type\": \"http\",\n      },\n      \"defaultApiKey\": {\n        \"description\": \"API key provided in console\",\n        \"in\": \"header\",\n        \"name\": \"api-key\",\n        \"type\": \"apiKey\",\n      },\n      \"user2AppOauth\": {\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://learn.openapis.org/oauth/2.0/auth\",\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n              \"board:write\": \"Write to the board\",\n            },\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"This API allows writing down marks on a Tic Tac Toe board\nand requesting the state of the board or of individual squares.\n\",\n    \"title\": \"Tic Tac Toe\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.1.0\",\n  \"paths\": {\n    \"/board\": {\n      \"get\": {\n        \"description\": \"Retrieves the current state of the board and the winner.\",\n        \"operationId\": \"get-board\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"defaultApiKey\": [],\n          },\n          {\n            \"app2AppOauth\": [\n              \"board:read\",\n            ],\n          },\n        ],\n        \"summary\": \"Get the whole board\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n    },\n    \"/board/{row}/{column}\": {\n      \"get\": {\n        \"description\": \"Retrieves the requested square.\",\n        \"operationId\": \"get-square\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/mark\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"text/html\": {\n                \"example\": \"Illegal coordinates\",\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\",\n                },\n              },\n            },\n            \"description\": \"The provided parameters are incorrect\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": [],\n          },\n          {\n            \"user2AppOauth\": [\n              \"board:read\",\n            ],\n          },\n        ],\n        \"summary\": \"Get a single board square\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n      \"parameters\": [\n        {\n          \"$ref\": \"#/components/parameters/rowParam\",\n        },\n        {\n          \"$ref\": \"#/components/parameters/columnParam\",\n        },\n      ],\n      \"put\": {\n        \"description\": \"Places a mark on the board and retrieves the whole board and the winner (if any).\",\n        \"operationId\": \"put-square\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/mark\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"text/html\": {\n                \"examples\": {\n                  \"illegalCoordinates\": {\n                    \"value\": \"Illegal coordinates.\",\n                  },\n                  \"invalidMark\": {\n                    \"value\": \"Invalid Mark (X or O).\",\n                  },\n                  \"notEmpty\": {\n                    \"value\": \"Square is not empty.\",\n                  },\n                },\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\",\n                },\n              },\n            },\n            \"description\": \"The provided parameters are incorrect\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": [],\n          },\n          {\n            \"user2AppOauth\": [\n              \"board:write\",\n            ],\n          },\n        ],\n        \"summary\": \"Set a single board square\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n    },\n  },\n  \"tags\": [\n    {\n      \"name\": \"Gameplay\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > tic-tac-toe.json (http url) 1`] = `\n{\n  \"components\": {\n    \"parameters\": {\n      \"columnParam\": {\n        \"description\": \"Board column (horizontal coordinate)\",\n        \"in\": \"path\",\n        \"name\": \"column\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\",\n        },\n      },\n      \"rowParam\": {\n        \"description\": \"Board row (vertical coordinate)\",\n        \"in\": \"path\",\n        \"name\": \"row\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\",\n        },\n      },\n    },\n    \"schemas\": {\n      \"board\": {\n        \"items\": {\n          \"items\": {\n            \"$ref\": \"#/components/schemas/mark\",\n          },\n          \"maxItems\": 3,\n          \"minItems\": 3,\n          \"type\": \"array\",\n        },\n        \"maxItems\": 3,\n        \"minItems\": 3,\n        \"type\": \"array\",\n      },\n      \"coordinate\": {\n        \"example\": 1,\n        \"maximum\": 3,\n        \"minimum\": 1,\n        \"type\": \"integer\",\n      },\n      \"errorMessage\": {\n        \"description\": \"A text message describing an error\",\n        \"maxLength\": 256,\n        \"type\": \"string\",\n      },\n      \"mark\": {\n        \"description\": \"Possible values for a board square. \\`.\\` means empty square.\",\n        \"enum\": [\n          \".\",\n          \"X\",\n          \"O\",\n        ],\n        \"example\": \".\",\n        \"type\": \"string\",\n      },\n      \"status\": {\n        \"properties\": {\n          \"board\": {\n            \"$ref\": \"#/components/schemas/board\",\n          },\n          \"winner\": {\n            \"$ref\": \"#/components/schemas/winner\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"winner\": {\n        \"description\": \"Winner of the game. \\`.\\` means nobody has won yet.\",\n        \"enum\": [\n          \".\",\n          \"X\",\n          \"O\",\n        ],\n        \"example\": \".\",\n        \"type\": \"string\",\n      },\n    },\n    \"securitySchemes\": {\n      \"app2AppOauth\": {\n        \"flows\": {\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n            },\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"basicHttpAuthentication\": {\n        \"description\": \"Basic HTTP Authentication\",\n        \"scheme\": \"Basic\",\n        \"type\": \"http\",\n      },\n      \"bearerHttpAuthentication\": {\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"Bearer token using a JWT\",\n        \"scheme\": \"Bearer\",\n        \"type\": \"http\",\n      },\n      \"defaultApiKey\": {\n        \"description\": \"API key provided in console\",\n        \"in\": \"header\",\n        \"name\": \"api-key\",\n        \"type\": \"apiKey\",\n      },\n      \"user2AppOauth\": {\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://learn.openapis.org/oauth/2.0/auth\",\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n              \"board:write\": \"Write to the board\",\n            },\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"This API allows writing down marks on a Tic Tac Toe board\nand requesting the state of the board or of individual squares.\n\",\n    \"title\": \"Tic Tac Toe\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.1.0\",\n  \"paths\": {\n    \"/board\": {\n      \"get\": {\n        \"description\": \"Retrieves the current state of the board and the winner.\",\n        \"operationId\": \"get-board\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"defaultApiKey\": [],\n          },\n          {\n            \"app2AppOauth\": [\n              \"board:read\",\n            ],\n          },\n        ],\n        \"summary\": \"Get the whole board\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n    },\n    \"/board/{row}/{column}\": {\n      \"get\": {\n        \"description\": \"Retrieves the requested square.\",\n        \"operationId\": \"get-square\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/mark\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"text/html\": {\n                \"example\": \"Illegal coordinates\",\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\",\n                },\n              },\n            },\n            \"description\": \"The provided parameters are incorrect\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": [],\n          },\n          {\n            \"user2AppOauth\": [\n              \"board:read\",\n            ],\n          },\n        ],\n        \"summary\": \"Get a single board square\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n      \"parameters\": [\n        {\n          \"$ref\": \"#/components/parameters/rowParam\",\n        },\n        {\n          \"$ref\": \"#/components/parameters/columnParam\",\n        },\n      ],\n      \"put\": {\n        \"description\": \"Places a mark on the board and retrieves the whole board and the winner (if any).\",\n        \"operationId\": \"put-square\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/mark\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"text/html\": {\n                \"examples\": {\n                  \"illegalCoordinates\": {\n                    \"value\": \"Illegal coordinates.\",\n                  },\n                  \"invalidMark\": {\n                    \"value\": \"Invalid Mark (X or O).\",\n                  },\n                  \"notEmpty\": {\n                    \"value\": \"Square is not empty.\",\n                  },\n                },\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\",\n                },\n              },\n            },\n            \"description\": \"The provided parameters are incorrect\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": [],\n          },\n          {\n            \"user2AppOauth\": [\n              \"board:write\",\n            ],\n          },\n        ],\n        \"summary\": \"Set a single board square\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n    },\n  },\n  \"tags\": [\n    {\n      \"name\": \"Gameplay\",\n    },\n  ],\n}\n`;\n\nexports[`validateOpenAPISpec > tic-tac-toe.json (string) 1`] = `\n{\n  \"components\": {\n    \"parameters\": {\n      \"columnParam\": {\n        \"description\": \"Board column (horizontal coordinate)\",\n        \"in\": \"path\",\n        \"name\": \"column\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\",\n        },\n      },\n      \"rowParam\": {\n        \"description\": \"Board row (vertical coordinate)\",\n        \"in\": \"path\",\n        \"name\": \"row\",\n        \"required\": true,\n        \"schema\": {\n          \"$ref\": \"#/components/schemas/coordinate\",\n        },\n      },\n    },\n    \"schemas\": {\n      \"board\": {\n        \"items\": {\n          \"items\": {\n            \"$ref\": \"#/components/schemas/mark\",\n          },\n          \"maxItems\": 3,\n          \"minItems\": 3,\n          \"type\": \"array\",\n        },\n        \"maxItems\": 3,\n        \"minItems\": 3,\n        \"type\": \"array\",\n      },\n      \"coordinate\": {\n        \"example\": 1,\n        \"maximum\": 3,\n        \"minimum\": 1,\n        \"type\": \"integer\",\n      },\n      \"errorMessage\": {\n        \"description\": \"A text message describing an error\",\n        \"maxLength\": 256,\n        \"type\": \"string\",\n      },\n      \"mark\": {\n        \"description\": \"Possible values for a board square. \\`.\\` means empty square.\",\n        \"enum\": [\n          \".\",\n          \"X\",\n          \"O\",\n        ],\n        \"example\": \".\",\n        \"type\": \"string\",\n      },\n      \"status\": {\n        \"properties\": {\n          \"board\": {\n            \"$ref\": \"#/components/schemas/board\",\n          },\n          \"winner\": {\n            \"$ref\": \"#/components/schemas/winner\",\n          },\n        },\n        \"type\": \"object\",\n      },\n      \"winner\": {\n        \"description\": \"Winner of the game. \\`.\\` means nobody has won yet.\",\n        \"enum\": [\n          \".\",\n          \"X\",\n          \"O\",\n        ],\n        \"example\": \".\",\n        \"type\": \"string\",\n      },\n    },\n    \"securitySchemes\": {\n      \"app2AppOauth\": {\n        \"flows\": {\n          \"clientCredentials\": {\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n            },\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n      \"basicHttpAuthentication\": {\n        \"description\": \"Basic HTTP Authentication\",\n        \"scheme\": \"Basic\",\n        \"type\": \"http\",\n      },\n      \"bearerHttpAuthentication\": {\n        \"bearerFormat\": \"JWT\",\n        \"description\": \"Bearer token using a JWT\",\n        \"scheme\": \"Bearer\",\n        \"type\": \"http\",\n      },\n      \"defaultApiKey\": {\n        \"description\": \"API key provided in console\",\n        \"in\": \"header\",\n        \"name\": \"api-key\",\n        \"type\": \"apiKey\",\n      },\n      \"user2AppOauth\": {\n        \"flows\": {\n          \"authorizationCode\": {\n            \"authorizationUrl\": \"https://learn.openapis.org/oauth/2.0/auth\",\n            \"scopes\": {\n              \"board:read\": \"Read the board\",\n              \"board:write\": \"Write to the board\",\n            },\n            \"tokenUrl\": \"https://learn.openapis.org/oauth/2.0/token\",\n          },\n        },\n        \"type\": \"oauth2\",\n      },\n    },\n  },\n  \"info\": {\n    \"description\": \"This API allows writing down marks on a Tic Tac Toe board\nand requesting the state of the board or of individual squares.\n\",\n    \"title\": \"Tic Tac Toe\",\n    \"version\": \"1.0.0\",\n  },\n  \"openapi\": \"3.1.0\",\n  \"paths\": {\n    \"/board\": {\n      \"get\": {\n        \"description\": \"Retrieves the current state of the board and the winner.\",\n        \"operationId\": \"get-board\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n        },\n        \"security\": [\n          {\n            \"defaultApiKey\": [],\n          },\n          {\n            \"app2AppOauth\": [\n              \"board:read\",\n            ],\n          },\n        ],\n        \"summary\": \"Get the whole board\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n    },\n    \"/board/{row}/{column}\": {\n      \"get\": {\n        \"description\": \"Retrieves the requested square.\",\n        \"operationId\": \"get-square\",\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/mark\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"text/html\": {\n                \"example\": \"Illegal coordinates\",\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\",\n                },\n              },\n            },\n            \"description\": \"The provided parameters are incorrect\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": [],\n          },\n          {\n            \"user2AppOauth\": [\n              \"board:read\",\n            ],\n          },\n        ],\n        \"summary\": \"Get a single board square\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n      \"parameters\": [\n        {\n          \"$ref\": \"#/components/parameters/rowParam\",\n        },\n        {\n          \"$ref\": \"#/components/parameters/columnParam\",\n        },\n      ],\n      \"put\": {\n        \"description\": \"Places a mark on the board and retrieves the whole board and the winner (if any).\",\n        \"operationId\": \"put-square\",\n        \"requestBody\": {\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/mark\",\n              },\n            },\n          },\n          \"required\": true,\n        },\n        \"responses\": {\n          \"200\": {\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/status\",\n                },\n              },\n            },\n            \"description\": \"OK\",\n          },\n          \"400\": {\n            \"content\": {\n              \"text/html\": {\n                \"examples\": {\n                  \"illegalCoordinates\": {\n                    \"value\": \"Illegal coordinates.\",\n                  },\n                  \"invalidMark\": {\n                    \"value\": \"Invalid Mark (X or O).\",\n                  },\n                  \"notEmpty\": {\n                    \"value\": \"Square is not empty.\",\n                  },\n                },\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/errorMessage\",\n                },\n              },\n            },\n            \"description\": \"The provided parameters are incorrect\",\n          },\n        },\n        \"security\": [\n          {\n            \"bearerHttpAuthentication\": [],\n          },\n          {\n            \"user2AppOauth\": [\n              \"board:write\",\n            ],\n          },\n        ],\n        \"summary\": \"Set a single board square\",\n        \"tags\": [\n          \"Gameplay\",\n        ],\n      },\n    },\n  },\n  \"tags\": [\n    {\n      \"name\": \"Gameplay\",\n    },\n  ],\n}\n`;\n"
  },
  {
    "path": "packages/openapi-utils/src/get-tools-from-openapi-spec.test.ts",
    "content": "import { readFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { describe, expect, test } from 'vitest'\n\nimport { getToolsFromOpenAPISpec } from './get-tools-from-openapi-spec'\nimport { validateOpenAPISpec } from './validate-openapi-spec'\n\nconst validFixtures = [\n  'basic.json',\n  'mixed.json',\n  'firecrawl.json',\n  'open-meteo.yaml',\n  'pet-store.json',\n  'petstore-expanded.json',\n  'security.json',\n  'tic-tac-toe.json'\n]\n\nconst invalidFixtures = ['notion.json']\n\nconst fixturesDir = path.join(\n  fileURLToPath(import.meta.url),\n  '..',\n  '..',\n  'fixtures'\n)\n\ndescribe('getToolsFromOpenAPISpec', () => {\n  test('remote spec https://agentic-platform-fixtures-everything.onrender.com/docs', async () => {\n    const source =\n      'https://agentic-platform-fixtures-everything.onrender.com/docs'\n    const spec = await validateOpenAPISpec(source, {\n      dereference: true\n    })\n    const result = await getToolsFromOpenAPISpec(spec)\n    expect(result).toMatchSnapshot()\n  })\n\n  for (const fixture of validFixtures) {\n    test(\n      fixture,\n      {\n        timeout: 60_000\n      },\n      async () => {\n        const fixturePath = path.join(fixturesDir, fixture)\n        const source = await readFile(fixturePath, 'utf8')\n\n        const spec = await validateOpenAPISpec(source, {\n          dereference: true\n        })\n        const result = await getToolsFromOpenAPISpec(spec)\n\n        expect(result).toMatchSnapshot()\n      }\n    )\n  }\n\n  for (const fixture of invalidFixtures) {\n    test(\n      `${fixture} (invalid)`,\n      {\n        timeout: 60_000\n      },\n      async () => {\n        const fixturePath = path.join(fixturesDir, fixture)\n        const source = await readFile(fixturePath, 'utf8')\n\n        const spec = await validateOpenAPISpec(source, {\n          dereference: true\n        })\n\n        await expect(async () =>\n          getToolsFromOpenAPISpec(spec)\n        ).rejects.toThrowError()\n      }\n    )\n  }\n})\n"
  },
  {
    "path": "packages/openapi-utils/src/get-tools-from-openapi-spec.ts",
    "content": "import { assert, parseZodSchema } from '@agentic/platform-core'\nimport {\n  type OpenAPIOperationHttpMethod,\n  type OpenAPIOperationParameterSource,\n  type OpenAPIToolOperation,\n  openapiToolOperationSchema,\n  type Tool,\n  toolSchema\n} from '@agentic/platform-types'\nimport decamelize from 'decamelize'\n\nimport type {\n  DereferencedLooseOpenAPI3Spec,\n  OperationObject,\n  ParameterObject,\n  SchemaObject\n} from './types'\nimport { convertParametersToJsonSchema } from './openapi-parameters-to-json-schema'\nimport { camelCase, mergeJsonSchemaObjects } from './utils'\n\nconst jsonContentType = 'application/json'\nconst multipartFormData = 'multipart/form-data'\n// const applicationFormUrlEncoded = 'application/x-www-form-urlencoded'\n\nconst httpMethods = ['get', 'post', 'put', 'delete', 'patch', 'trace'] as const\nconst paramSources = ['body', 'formData', 'header', 'path', 'query'] as const\n\n/**\n * Converts a fully dereferenced and validated OpenAPI spec into an array of\n * MCP-compatible tools, with a map of tool names to their corresponding OpenAPI\n * operations.\n *\n * This allows us to expose OpenAPI HTTP operations as MCP tools and convert\n * MCP tool calls to corresponding HTTP requests.\n */\nexport async function getToolsFromOpenAPISpec(\n  spec: DereferencedLooseOpenAPI3Spec\n): Promise<{\n  tools: Tool[]\n  toolToOperationMap: Record<string, OpenAPIToolOperation>\n}> {\n  const tools: Tool[] = []\n  const toolToOperationMap: Record<string, OpenAPIToolOperation> = {}\n\n  const operationResponsePaths = [\n    ['responses', '200', 'content', jsonContentType, 'schema'],\n    ['responses', '201', 'content', jsonContentType, 'schema']\n    // ['responses', 'default', 'content', jsonContentType, 'schema']\n  ]\n\n  const operationRequestPaths = [\n    ['requestBody', 'content', jsonContentType, 'schema'],\n    ['requestBody', 'content', multipartFormData, 'schema']\n    // TODO: Support application/x-www-form-urlencoded bodies\n    // ['requestBody', 'content', applicationFormUrlEncoded, 'schema']\n  ]\n\n  const operationNames = new Set<string>()\n\n  for (const path in spec.paths) {\n    const pathItem = spec.paths[path]\n    assert(pathItem)\n    // console.log(JSON.stringify(pathItem, null, 2))\n\n    const pathParamsJsonSchema = {\n      type: 'object',\n      properties: {} as Record<string, SchemaObject>,\n      required: [] as string[]\n    } satisfies SchemaObject\n    const pathParamsSources: Record<string, OpenAPIOperationParameterSource> =\n      {}\n\n    if (pathItem.parameters) {\n      const params = convertParametersToJsonSchema(\n        pathItem.parameters as ParameterObject[]\n      )\n\n      for (const source of paramSources) {\n        if (params[source]) {\n          mergeJsonSchemaObjects(pathParamsJsonSchema, params[source], {\n            source,\n            sources: pathParamsSources,\n            label: `path \"${path}\"`\n          })\n        }\n      }\n    }\n\n    for (const method of httpMethods) {\n      const operation = pathItem[method] as OperationObject\n      if (!operation) {\n        continue\n      }\n\n      const operationId =\n        operation.operationId || `${method}${path.replaceAll(/\\W+/g, '_')}`\n      assert(\n        operationId,\n        `Invalid operation id \"${operationId}\" for OpenAPI path \"${method} ${path}\"`\n      )\n\n      const operationName = camelCase(operationId.replaceAll('/', '_'))\n      const operationNameSnakeCase = decamelize(operationName)\n      assert(\n        !operationNames.has(operationName),\n        `Duplicate operation name \"${operationName}\"`\n      )\n      operationNames.add(operationName)\n\n      const operationParamsJsonSchema = structuredClone(pathParamsJsonSchema)\n      const operationParamsSources: Record<\n        string,\n        OpenAPIOperationParameterSource\n      > = structuredClone(pathParamsSources)\n      const operationResponseJsonSchemas: Record<string, SchemaObject> = {}\n\n      for (const schemaPath of operationRequestPaths) {\n        let current: any = operation\n        for (const key of schemaPath) {\n          current = current[key]\n          if (!current) break\n        }\n\n        if (current) {\n          mergeJsonSchemaObjects(operationParamsJsonSchema, current, {\n            source: schemaPath[2] === jsonContentType ? 'body' : 'formData',\n            sources: operationParamsSources,\n            label: `operation \"${operationId}\"`\n          })\n          break\n        }\n      }\n\n      for (const schemaPath of operationResponsePaths) {\n        let current: any = operation\n        for (const key of schemaPath) {\n          current = current[key]\n          if (!current) break\n        }\n\n        if (current) {\n          const status = schemaPath[1]!\n          assert(\n            status,\n            `Invalid status ${status} for operation ${operationName}`\n          )\n\n          if (current.type !== 'object') {\n            // console.warn(\n            //   `Invalid OpenAPI response type \"${current.type}\" for operation \"${operationName}\"`\n            // )\n            break\n          }\n\n          operationResponseJsonSchemas[status] = current\n          break\n        }\n      }\n\n      if (operation.parameters) {\n        const params = convertParametersToJsonSchema(\n          operation.parameters as ParameterObject[]\n        )\n\n        for (const source of paramSources) {\n          if (params[source]) {\n            mergeJsonSchemaObjects(operationParamsJsonSchema, params[source], {\n              source,\n              sources: operationParamsSources,\n              label: `operation \"${operationId}\"`\n            })\n          }\n        }\n      }\n\n      const operationResponseJsonSchema =\n        operationResponseJsonSchemas['200'] ||\n        operationResponseJsonSchemas['201']\n      const description = operation.description || operation.summary\n      const { tags } = operation\n\n      tools.push(\n        parseZodSchema(\n          toolSchema,\n          {\n            name: operationNameSnakeCase,\n            description,\n            inputSchema: operationParamsJsonSchema,\n            outputSchema: operationResponseJsonSchema\n          },\n          {\n            statusCode: 400\n          }\n        )\n      )\n\n      toolToOperationMap[operationNameSnakeCase] = parseZodSchema(\n        openapiToolOperationSchema,\n        {\n          operationId,\n          method: method.toLowerCase() as OpenAPIOperationHttpMethod,\n          path,\n          parameterSources: operationParamsSources,\n          tags\n        },\n        {\n          statusCode: 400\n        }\n      )\n    }\n  }\n\n  return {\n    tools,\n    toolToOperationMap\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/src/index.ts",
    "content": "export * from './get-tools-from-openapi-spec'\nexport * from './redocly-config'\nexport type * from './types'\nexport * from './validate-json-schema-object'\nexport * from './validate-openapi-spec'\n"
  },
  {
    "path": "packages/openapi-utils/src/openapi-parameters-to-json-schema.ts",
    "content": "/**\n * This file is forked from: https://github.com/kogosoftwarellc/open-api/tree/main/packages/openapi-jsonschema-parameters\n *\n * Several fixes have been applied.\n *\n * The original code is licensed under the MIT license.\n */\n\nimport type { ParameterObject, SchemaObject } from './types'\n\nexport interface OpenAPIParametersAsJsonSchema {\n  body?: SchemaObject\n  formData?: SchemaObject\n  header?: SchemaObject\n  path?: SchemaObject\n  query?: SchemaObject\n  cookie?: SchemaObject\n}\n\nconst VALIDATION_KEYWORDS = new Set([\n  'additionalItems',\n  'default',\n  'example',\n  'description',\n  'enum',\n  'examples',\n  'exclusiveMaximum',\n  'exclusiveMinimum',\n  'format',\n  'items',\n  'maxItems',\n  'maxLength',\n  'maximum',\n  'minItems',\n  'minLength',\n  'minimum',\n  'multipleOf',\n  'pattern',\n  'title',\n  'type',\n  'uniqueItems'\n])\n\nconst SUBSCHEMA_KEYWORDS = [\n  'additionalItems',\n  'items',\n  'contains',\n  'additionalProperties',\n  'propertyNames',\n  'not'\n]\n\nconst SUBSCHEMA_ARRAY_KEYWORDS = ['items', 'allOf', 'anyOf', 'oneOf']\n\nconst SUBSCHEMA_OBJECT_KEYWORDS = [\n  'definitions',\n  'properties',\n  'patternProperties',\n  'dependencies'\n]\n\nexport function convertParametersToJsonSchema(\n  parameters: ParameterObject[]\n): OpenAPIParametersAsJsonSchema {\n  const parametersSchema: OpenAPIParametersAsJsonSchema = {}\n  const bodySchema = getBodySchema(parameters)\n  const formDataSchema = getSchema(parameters, 'formData')\n  const headerSchema = getSchema(parameters, 'header')\n  const pathSchema = getSchema(parameters, 'path')\n  const querySchema = getSchema(parameters, 'query')\n  const cookieSchema = getSchema(parameters, 'cookie')\n\n  if (bodySchema) {\n    parametersSchema.body = bodySchema\n  }\n\n  if (formDataSchema) {\n    parametersSchema.formData = formDataSchema\n  }\n\n  if (headerSchema) {\n    parametersSchema.header = headerSchema\n  }\n\n  if (pathSchema) {\n    parametersSchema.path = pathSchema\n  }\n\n  if (querySchema) {\n    parametersSchema.query = querySchema\n  }\n\n  if (cookieSchema) {\n    parametersSchema.cookie = cookieSchema\n  }\n\n  return parametersSchema\n}\n\nfunction copyValidationKeywords(src: any) {\n  const dst: any = {}\n  for (let i = 0, keys = Object.keys(src), len = keys.length; i < len; i++) {\n    const keyword = keys[i]\n    if (!keyword) continue\n\n    if (VALIDATION_KEYWORDS.has(keyword) || keyword.slice(0, 2) === 'x-') {\n      dst[keyword] = src[keyword]\n    }\n  }\n  return dst\n}\n\nfunction handleNullable(schema: SchemaObject) {\n  return { anyOf: [schema, { type: 'null' }] }\n}\n\nfunction handleNullableSchema(schema: any) {\n  if (typeof schema !== 'object' || schema === null) {\n    return schema\n  }\n\n  const newSchema = { ...schema }\n\n  for (const keyword of SUBSCHEMA_KEYWORDS) {\n    if (\n      typeof schema[keyword] === 'object' &&\n      schema[keyword] !== null &&\n      !Array.isArray(schema[keyword])\n    ) {\n      newSchema[keyword] = handleNullableSchema(schema[keyword])\n    }\n  }\n\n  for (const keyword of SUBSCHEMA_ARRAY_KEYWORDS) {\n    if (Array.isArray(schema[keyword])) {\n      newSchema[keyword] = schema[keyword].map(handleNullableSchema)\n    }\n  }\n\n  for (const keyword of SUBSCHEMA_OBJECT_KEYWORDS) {\n    if (typeof schema[keyword] === 'object' && schema[keyword] !== null) {\n      newSchema[keyword] = { ...schema[keyword] }\n      for (const prop of Object.keys(schema[keyword])) {\n        newSchema[keyword][prop] = handleNullableSchema(schema[keyword][prop])\n      }\n    }\n  }\n\n  delete newSchema.$ref\n\n  if (schema.nullable) {\n    delete newSchema.nullable\n    return handleNullable(newSchema)\n  }\n\n  return newSchema\n}\n\nfunction getBodySchema(parameters: any[]) {\n  let bodySchema = parameters.find((param) => {\n    return param.in === 'body' && param.schema\n  })\n\n  if (bodySchema) {\n    bodySchema = bodySchema.schema\n  }\n\n  return bodySchema\n}\n\nfunction getSchema(parameters: any[], type: string) {\n  const params = parameters.filter(byIn(type))\n  let schema: any\n\n  if (params.length) {\n    schema = { type: 'object', properties: {} }\n\n    for (const param of params) {\n      let paramSchema = copyValidationKeywords(param)\n\n      if ('schema' in param) {\n        paramSchema = {\n          ...paramSchema,\n          ...handleNullableSchema(param.schema)\n        }\n\n        if ('examples' in param) {\n          paramSchema.examples = getExamples(param.examples)\n        }\n\n        schema.properties[param.name] = paramSchema\n      } else {\n        if ('examples' in paramSchema) {\n          paramSchema.examples = getExamples(paramSchema.examples)\n        }\n\n        schema.properties[param.name] = param.nullable\n          ? handleNullable(paramSchema)\n          : paramSchema\n      }\n    }\n\n    // TODO: support openai strict mode by default (all params must be required,\n    // and optional params without defaults must be nullable)\n\n    schema.required = getRequiredParams(params)\n  }\n\n  return schema\n}\n\nfunction getRequiredParams(parameters: any[]) {\n  return parameters.filter(byRequired).map(toName)\n}\n\nfunction getExamples(exampleSchema: any) {\n  return Object.keys(exampleSchema).map((k) => exampleSchema[k].value)\n}\n\nfunction byIn(str: string) {\n  return (param: any) => param.in === str && param.type !== 'file'\n}\n\nfunction byRequired(param: any) {\n  return !!param.required\n}\n\nfunction toName(param: any) {\n  return param.name\n}\n"
  },
  {
    "path": "packages/openapi-utils/src/redocly-config.ts",
    "content": "import {\n  type Config as RedoclyConfig,\n  createConfig\n} from '@redocly/openapi-core'\n\n// Cache the default Redocly config to avoid re-creating it on every call\nlet _defaultRedoclyConfig: RedoclyConfig | undefined\n\nexport async function getDefaultRedoclyConfig(): Promise<RedoclyConfig> {\n  if (!_defaultRedoclyConfig) {\n    _defaultRedoclyConfig = await createConfig(\n      {\n        rules: {\n          // throw error on duplicate operationIds\n          'operation-operationId-unique': { severity: 'error' }\n        }\n      },\n      { extends: ['minimal'] }\n    )\n  }\n\n  return _defaultRedoclyConfig\n}\n"
  },
  {
    "path": "packages/openapi-utils/src/types.ts",
    "content": "// These loose OpenAPI types are taken from https://github.com/openapi-ts/openapi-typescript/blob/main/packages/openapi-typescript/src/types.ts\n\n// Note: these OpenAPI types are meant only for internal use, not external\n// consumption. Some formatting may be better in other libraries meant for\n// consumption. Some typing may be “loose” or “incorrect” in order to guarantee\n// that all logical paths are handled. In other words, these are built more\n// for ways schemas _can_ be written, not necessarily how they _should_ be.\n\nexport interface Extensible {\n  [key: `x-${string}`]: any\n}\n\n/**\n * [4.8] Schema\n * @see https://spec.openapis.org/oas/v3.1.0#schema\n */\nexport interface LooseOpenAPI3Spec extends Extensible {\n  /** REQUIRED. This string MUST be the version number of the OpenAPI Specification that the OpenAPI document uses. The openapi field SHOULD be used by tooling to interpret the OpenAPI document. This is not related to the API info.version string. */\n  openapi: string\n  /** REQUIRED. Provides metadata about the API. The metadata MAY be used by tooling as required. */\n  info: InfoObject // required\n  /** The default value for the $schema keyword within Schema Objects contained within this OAS document. This MUST be in the form of a URI. */\n  jsonSchemaDialect?: string\n  /** An array of Server Objects, which provide connectivity information to a target server. If the servers property is not provided, or is an empty array, the default value would be a Server Object with a url value of /. */\n  servers?: ServerObject[]\n  /** The available paths and operations for the API. */\n  paths?: PathsObject\n  /** The incoming webhooks that MAY be received as part of this API and that the API consumer MAY choose to implement. Closely related to the callbacks feature, this section describes requests initiated other than by an API call, for example by an out of band registration. The key name is a unique string to refer to each webhook, while the (optionally referenced) Path Item Object describes a request that may be initiated by the API provider and the expected responses. An example is available. */\n  webhooks?: { [id: string]: PathItemObject | ReferenceObject }\n  /** An element to hold various schemas for the document. */\n  components?: ComponentsObject\n  /** A declaration of which security mechanisms can be used across the API. The list of values includes alternative security requirement objects that can be used. Only one of the security requirement objects need to be satisfied to authorize a request. Individual operations can override this definition. To make security optional, an empty security requirement ({}) can be included in the array. */\n  security?: SecurityRequirementObject[]\n  /** A list of tags used by the document with additional metadata. The order of the tags can be used to reflect on their order by the parsing tools. Not all tags that are used by the Operation Object must be declared. The tags that are not declared MAY be organized randomly or based on the tools’ logic. Each tag name in the list MUST be unique. */\n  tags?: TagObject[]\n  /** Additional external documentation. */\n  externalDocs?: ExternalDocumentationObject\n  $defs?: $defs\n}\n\n/**\n * [4.8.2] Info Object\n * The object provides metadata about the API.\n */\nexport interface InfoObject extends Extensible {\n  /** REQUIRED. The title of the API. */\n  title: string\n  /** A short summary of the API. */\n  summary?: string\n  /** A description of the API. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** A URL to the Terms of Service for the API. This MUST be in the form of a URL. */\n  termsOfService?: string\n  /** The contact information for the exposed API. */\n  contact?: ContactObject\n  /** The license information for the exposed API. */\n  license?: LicenseObject\n  /** REQUIRED. The version of the OpenAPI document (which is distinct from the OpenAPI Specification version or the API implementation version). */\n  version: string\n}\n\n/**\n * [4.8.3] Contact Object\n * Contact information for the exposed API.\n */\nexport interface ContactObject extends Extensible {\n  /** The identifying name of the contact person/organization. */\n  name?: string\n  /** The URL pointing to the contact information. This MUST be in the form of a URL. */\n  url?: string\n  /** The email address of the contact person/organization. This MUST be in the form of an email address. */\n  email?: string\n}\n\n/**\n * [4.8.4] License object\n * License information for the exposed API.\n */\nexport interface LicenseObject extends Extensible {\n  /** REQUIRED. The license name used for the API. */\n  name: string\n  /** An SPDX license expression for the API. The identifier field is mutually exclusive of the url field. */\n  identifier: string\n  /** A URL to the license used for the API. This MUST be in the form of a URL. The url field is mutually exclusive of the identifier field. */\n  url: string\n}\n\n/**\n * [4.8.5] Server Object\n * An object representing a Server.\n */\nexport interface ServerObject extends Extensible {\n  /** REQUIRED. A URL to the target host. This URL supports Server Variables and MAY be relative, to indicate that the host location is relative to the location where the OpenAPI document is being served. Variable substitutions will be made when a variable is named in {brackets}. */\n  url: string\n  /** An optional string describing the host designated by the URL. CommonMark syntax MAY be used for rich text representation. */\n  description: string\n  /** A map between a variable name and its value. The value is used for substitution in the server’s URL template. */\n  variables: { [name: string]: ServerVariableObject }\n}\n\n/**\n * [4.8.6] Server Variable Object\n * An object representing a Server Variable for server URL template substitution.\n */\nexport interface ServerVariableObject extends Extensible {\n  /** An enumeration of string values to be used if the substitution options are from a limited set. The array MUST NOT be empty. */\n  enum?: string[]\n  /** REQUIRED. The default value to use for substitution, which SHALL be sent if an alternate value is not supplied. Note this behavior is different than the Schema Object’s treatment of default values, because in those cases parameter values are optional. If the enum is defined, the value MUST exist in the enum’s values. */\n  default: string\n  /** An optional description for the server variable. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n}\n\n/**\n * [4.8.7] Components Object\n * Holds a set of reusable objects for different aspects of the OAS.\n */\nexport interface ComponentsObject extends Extensible {\n  /** An object to hold reusable Schema Objects.*/\n  schemas?: Record<string, SchemaObject>\n  /** An object to hold reusable Response Objects. */\n  responses?: Record<string, ResponseObject | ReferenceObject>\n  /** An object to hold reusable Parameter Objects. */\n  parameters?: Record<string, ParameterObject | ReferenceObject>\n  /** An object to hold reusable Example Objects. */\n  examples?: Record<string, ExampleObject | ReferenceObject>\n  /** An object to hold reusable Request Body Objects. */\n  requestBodies?: Record<string, RequestBodyObject | ReferenceObject>\n  /** An object to hold reusable Header Objects. */\n  headers?: Record<string, HeaderObject | ReferenceObject>\n  /** An object to hold reusable Security Scheme Objects. */\n  securitySchemes?: Record<string, SecuritySchemeObject | ReferenceObject>\n  /** An object to hold reusable Link Objects. */\n  links?: Record<string, LinkObject | ReferenceObject>\n  /** An object to hold reusable Callback Objects. */\n  callbacks?: Record<string, CallbackObject | ReferenceObject>\n  /** An object to hold reusable Path Item Objects. */\n  pathItems?: Record<string, PathItemObject | ReferenceObject>\n}\n\n/**\n * [4.8.8] Paths Object\n * Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the Server Object in order to construct the full URL. The Paths MAY be empty, due to Access Control List (ACL) constraints.\n */\nexport interface PathsObject {\n  [pathname: string]: PathItemObject | ReferenceObject // note: paths object does support $refs; the schema just defines it in a weird way\n}\n\n/**\n * [x.x.x] Webhooks Object\n * Holds the webhooks definitions, indexed by their names. A webhook is defined by a Path Item Object; the only difference is that the request is initiated by the API provider.\n */\nexport interface WebhooksObject {\n  [name: string]: PathItemObject\n}\n\n/**\n * [4.8.9] Path Item Object\n * Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.\n */\nexport interface PathItemObject extends Extensible {\n  /** A definition of a GET operation on this path. */\n  get?: OperationObject | ReferenceObject\n  /** A definition of a PUT operation on this path. */\n  put?: OperationObject | ReferenceObject\n  /** A definition of a POST operation on this path. */\n  post?: OperationObject | ReferenceObject\n  /** A definition of a DELETE operation on this path. */\n  delete?: OperationObject | ReferenceObject\n  /** A definition of a OPTIONS operation on this path. */\n  options?: OperationObject | ReferenceObject\n  /** A definition of a HEAD operation on this path. */\n  head?: OperationObject | ReferenceObject\n  /** A definition of a PATCH operation on this path. */\n  patch?: OperationObject | ReferenceObject\n  /** A definition of a TRACE operation on this path. */\n  trace?: OperationObject | ReferenceObject\n  /** An alternative server array to service all operations in this path. */\n  servers?: ServerObject[]\n  /** A list of parameters that are applicable for all the operations described under this path. These parameters can be overridden at the operation level, but cannot be removed there. The list MUST NOT include duplicated parameters. A unique parameter is defined by a combination of a name and location. The list can use the Reference Object to link to parameters that are defined at the OpenAPI Object’s components/parameters. */\n  parameters?: (ParameterObject | ReferenceObject)[]\n}\n\n/**\n * [4.8.10] Operation Object\n * Describes a single API operation on a path.\n */\nexport interface OperationObject extends Extensible {\n  /** A list of tags for API documentation control. Tags can be used for logical grouping of operations by resources or any other qualifier. */\n  tags?: string[]\n  /** A short summary of what the operation does. */\n  summary?: string\n  /** A verbose explanation of the operation behavior. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** Additional external documentation for this operation. */\n  externalDocs?: ExternalDocumentationObject\n  /** Unique string used to identify the operation. The id MUST be unique among all operations described in the API. The operationId value is case-sensitive. Tools and libraries MAY use the operationId to uniquely identify an operation, therefore, it is RECOMMENDED to follow common programming naming conventions. */\n  operationId?: string\n  /** A list of parameters that are applicable for this operation. If a parameter is already defined at the Path Item, the new definition will override it but can never remove it. The list MUST NOT include duplicated parameters. A unique parameter is defined by a combination of a name and location. The list can use the Reference Object to link to parameters that are defined at the OpenAPI Object’s components/parameters. */\n  parameters?: (ParameterObject | ReferenceObject)[]\n  /** The request body applicable for this operation. The requestBody is fully supported in HTTP methods where the HTTP 1.1 specification [RFC7231] has explicitly defined semantics for request bodies. In other cases where the HTTP spec is vague (such as GET, HEAD and DELETE), requestBody is permitted but does not have well-defined semantics and SHOULD be avoided if possible. */\n  requestBody?: RequestBodyObject | ReferenceObject\n  /** The list of possible responses as they are returned from executing this operation. */\n  responses?: ResponsesObject\n  /** A map of possible out-of band callbacks related to the parent operation. The key is a unique identifier for the Callback Object. Each value in the map is a Callback Object that describes a request that may be initiated by the API provider and the expected responses. */\n  callbacks?: Record<string, CallbackObject | ReferenceObject>\n  /** Declares this operation to be deprecated. Consumers SHOULD refrain from usage of the declared operation. Default value is false. */\n  deprecated?: boolean\n  /** A declaration of which security mechanisms can be used for this operation. The list of values includes alternative security requirement objects that can be used. Only one of the security requirement objects need to be satisfied to authorize a request. To make security optional, an empty security requirement ({}) can be included in the array. This definition overrides any declared top-level security. To remove a top-level security declaration, an empty array can be used. */\n  security?: SecurityRequirementObject[]\n  /** An alternative server array to service this operation. If an alternative server object is specified at the Path Item Object or Root level, it will be overridden by this value. */\n  servers?: ServerObject[]\n}\n\n/**\n * [4.8.11] External Documentation Object\n * Allows referencing an external resource for extended documentation.\n */\nexport interface ExternalDocumentationObject extends Extensible {\n  /** A description of the target documentation. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** REQUIRED. The URL for the target documentation. This MUST be in the form of a URL. */\n  url: string\n}\n\n/**\n * [4.8.12] Parameter Object\n * Describes a single operation parameter.\n * A unique parameter is defined by a combination of a name and location.\n */\nexport interface ParameterObject extends Extensible {\n  /**\n   * REQUIRED. The name of the parameter. Parameter names are case sensitive.\n   *\n   * - If `in` is `\"path\"`, the `name` field MUST correspond to a template expression occurring within the path field in the Paths Object. See Path Templating for further information.\n   * - If `in` is `\"header\"` and the `name` field is `\"Accept\"`, `\"Content-Type\"` or `\"Authorization\"`, the parameter definition SHALL be ignored.\n   * - For all other cases, the `name` corresponds to the parameter name used by the `in` property.\n   */\n  name: string\n  /** REQUIRED. The location of the parameter. Possible values are \"query\", \"header\", \"path\" or \"cookie\".*/\n  in: 'query' | 'header' | 'path' | 'cookie'\n  /** A brief description of the parameter. This could contain examples of use. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** Determines whether this parameter is mandatory. If the parameter location is \"path\", this property is REQUIRED and its value MUST be true. Otherwise, the property MAY be included and its default value is false. */\n  required?: boolean\n  /** Specifies that a parameter is deprecated and SHOULD be transitioned out of usage. Default value is false. */\n  deprecated?: boolean\n  /** Sets the ability to pass empty-valued parameters. This is valid only for query parameters and allows sending a parameter with an empty value. Default value is false. If style is used, and if behavior is n/a (cannot be serialized), the value of allowEmptyValue SHALL be ignored. Use of this property is NOT RECOMMENDED, as it is likely to be removed in a later revision. */\n  allowEmptyValue?: boolean\n  /** Describes how the parameter value will be serialized depending on the type of the parameter value. Default values (based on value of in): for query - form; for path - simple; for header - simple; for cookie - form. */\n  style?: string\n  /** When this is true, parameter values of type `array` or `object` generate separate parameters for each value of the array or key-value pair of the map. For other types of parameters this property has no effect. When `style` is `form`, the default value is `true`. For all other styles, the default value is `false`. */\n  explode?: boolean\n  /** Determines whether the parameter value SHOULD allow reserved characters, as defined by [RFC3986] `:/?#[]@!$&'()*+,;=` to be included without percent-encoding. This property only applies to parameters with an `in` value of `query`. The default value is `false`. */\n  allowReserved?: boolean\n  /** The schema defining the type used for the parameter. */\n  schema?: SchemaObject\n  /** Example of the parameter’s potential value. */\n  example?: any\n  /** Examples of the parameter’s potential value. */\n  examples?: { [name: string]: ExampleObject | ReferenceObject }\n  /** A map containing the representations for the parameter. */\n  content?: { [contentType: string]: MediaTypeObject | ReferenceObject }\n}\n\n/**\n * [4.8.13] Request Body Object\n * Describes a single request body.\n */\nexport interface RequestBodyObject extends Extensible {\n  /** A brief description of the request body. This could contain examples of use. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** REQUIRED. The content of the request body. The key is a media type or media type range and the value describes it. For requests that match multiple keys, only the most specific key is applicable. e.g. text/plain overrides text */\n  content: { [contentType: string]: MediaTypeObject | ReferenceObject }\n  /** Determines if the request body is required in the request. Defaults to false. */\n  required?: boolean\n}\n\n/**\n * [4.8.14] Media Type Object\n */\nexport interface MediaTypeObject extends Extensible {\n  /** The schema defining the content of the request, response, or parameter. */\n  schema?: SchemaObject | ReferenceObject\n  /** Example of the media type. The example object SHOULD be in the correct format as specified by the media type. The example field is mutually exclusive of the examples field. Furthermore, if referencing a schema which contains an example, the example value SHALL override the example provided by the schema. */\n  example?: any\n  /** Examples of the media type. Each example object SHOULD match the media type and specified schema if present. The examples field is mutually exclusive of the example field. Furthermore, if referencing a schema which contains an example, the examples value SHALL override the example provided by the schema. */\n  examples?: { [name: string]: ExampleObject | ReferenceObject }\n  /** A map between a property name and its encoding information. The key, being the property name, MUST exist in the schema as a property. The encoding object SHALL only apply to requestBody objects when the media type is multipart or application/x-www-form-urlencoded. */\n  encoding?: { [propertyName: string]: EncodingObject }\n}\n\n/**\n * [4.8.15] Encoding Object\n * A single encoding definition applied to a single schema property.\n */\nexport interface EncodingObject extends Extensible {\n  /** The Content-Type for encoding a specific property. Default value depends on the property type: for object - application/json; for array – the default is defined based on the inner type; for all other cases the default is application/octet-stream. The value can be a specific media type (e.g. application/json), a wildcard media type (e.g. image/*), or a comma-separated list of the two types. */\n  contentType?: string\n  /** A map allowing additional information to be provided as headers, for example Content-Disposition. Content-Type is described separately and SHALL be ignored in this section. This property SHALL be ignored if the request body media type is not a multipart. */\n  headers?: { [name: string]: HeaderObject | ReferenceObject }\n  /** Describes how a specific property value will be serialized depending on its type. See Parameter Object for details on the style property. The behavior follows the same values as query parameters, including default values. This property SHALL be ignored if the request body media type is not application/x-www-form-urlencoded or multipart/form-data. If a value is explicitly defined, then the value of contentType (implicit or explicit) SHALL be ignored. */\n  style?: string\n  /** When this is true, property values of type array or object generate separate parameters for each value of the array, or key-value-pair of the map. For other types of properties this property has no effect. When style is form, the default value is true. For all other styles, the default value is false. This property SHALL be ignored if the request body media type is not application/x-www-form-urlencoded or multipart/form-data. If a value is explicitly defined, then the value of contentType (implicit or explicit) SHALL be ignored. */\n  explode?: string\n  /** Determines whether the parameter value SHOULD allow reserved characters, as defined by [RFC3986] :/?#[]@!$&'()*+,;= to be included without percent-encoding. The default value is false. This property SHALL be ignored if the request body media type is not application/x-www-form-urlencoded or multipart/form-data. If a value is explicitly defined, then the value of contentType (implicit or explicit) SHALL be ignored. */\n  allowReserved?: string\n}\n\n/**\n * [4.8.16] Responses Object\n * A container for the expected responses of an operation. The container maps a HTTP response code to the expected response.\n */\nexport type ResponsesObject = {\n  [responseCode: string]: ResponseObject | ReferenceObject\n} & {\n  /** The documentation of responses other than the ones declared for specific HTTP response codes. Use this field to cover undeclared responses. */\n  default?: ResponseObject | ReferenceObject\n}\n\n/**\n * [4.8.17] Response Object\n * Describes a single response from an API Operation, including design-time, static links to operations based on the response.\n */\nexport interface ResponseObject extends Extensible {\n  /** REQUIRED. A description of the response. CommonMark syntax MAY be used for rich text representation. */\n  description: string\n  /** Maps a header name to its definition. [RFC7230] states header names are case insensitive. If a response header is defined with the name \"Content-Type\", it SHALL be ignored. */\n  headers?: { [name: string]: HeaderObject | ReferenceObject }\n  /** A map containing descriptions of potential response payloads. The key is a media type or media type range and the value describes it. For responses that match multiple keys, only the most specific key is applicable. e.g. text/plain overrides text */\n  content?: { [contentType: string]: MediaTypeObject }\n  /** A map of operations links that can be followed from the response. The key of the map is a short name for the link, following the naming constraints of the names for Component Objects. */\n  links?: { [name: string]: LinkObject | ReferenceObject }\n}\n\n/**\n * [4.8.18] Callback Object\n * A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the path item object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.\n */\nexport type CallbackObject = Record<string, PathItemObject>\n\n/**\n * [4.8.19[ Example Object\n */\nexport interface ExampleObject extends Extensible {\n  /** Short description for the example. */\n  summary?: string\n  /** Long description for the example. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** Embedded literal example. The value field and externalValue field are mutually exclusive. To represent examples of media types that cannot naturally represented in JSON or YAML, use a string value to contain the example, escaping where necessary. */\n  value?: any\n  /** A URI that points to the literal example. This provides the capability to reference examples that cannot easily be included in JSON or YAML documents. The value field and externalValue field are mutually exclusive. See the rules for resolving Relative References. */\n  externalValue?: string\n}\n\n/**\n * [4.8.20] Link Object\n * The Link object represents a possible design-time link for a response. The presence of a link does not guarantee the caller’s ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations.\n */\nexport interface LinkObject extends Extensible {\n  /** A relative or absolute URI reference to an OAS operation. This field is mutually exclusive of the operationId field, and MUST point to an Operation Object. Relative operationRef values MAY be used to locate an existing Operation Object in the OpenAPI definition. See the rules for resolving Relative References. */\n  operationRef?: string\n  /** The name of an existing, resolvable OAS operation, as defined with a unique operationId. This field is mutually exclusive of the operationRef field. */\n  operationId?: string\n  /** A map representing parameters to pass to an operation as specified with operationId or identified via operationRef. The key is the parameter name to be used, whereas the value can be a constant or an expression to be evaluated and passed to the linked operation. The parameter name can be qualified using the parameter location [{in}.]{name} for operations that use the same parameter name in different locations (e.g. path.id). */\n  parameters?: { [name: string]: `$${string}` }\n  /** A literal value or {expression} to use as a request body when calling the target operation. */\n  requestBody?: `$${string}`\n  /** A description of the link. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** A server object to be used by the target operation. */\n  server?: ServerObject\n}\n\n/**\n * [4.8.21] Header Object\n * The Header Object follows the structure of the Parameter Object with the following changes:\n *\n * 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map.\n * 2. `in` MUST NOT be specified, it is implicitly in `header`.\n * 3. All traits that are affected by the location MUST be applicable to a location of `heade`r (for example, `style`).\n */\nexport type HeaderObject = Omit<ParameterObject, 'name' | 'in'>\n\n/**\n * [4.8.22] Tag Object\n * Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.\n */\nexport interface TagObject extends Extensible {\n  /** REQUIRED. The name of the tag. */\n  name: string\n  /** A description for the tag. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  /** Additional external documentation for this tag. */\n  externalDocs?: ExternalDocumentationObject\n}\n\n/**\n * [4.8.23] Reference Object\n * A simple object to allow referencing other components in the OpenAPI document, internally and externally. The $ref string value contains a URI [RFC3986], which identifies the location of the value being referenced. See the rules for resolving Relative References.\n */\nexport interface ReferenceObject extends Extensible {\n  /** REQUIRED. The reference identifier. This MUST be in the form of a URI. */\n  $ref: string\n  /** A short summary which by default SHOULD override that of the referenced component. If the referenced object-type does not allow a summary field, then this field has no effect. */\n  summary?: string\n  /** A description which by default SHOULD override that of the referenced component. CommonMark syntax MAY be used for rich text representation. If the referenced object-type does not allow a description field, then this field has no effect. */\n  description?: string\n}\n\n/**\n * [4.8.24] Schema Object\n * The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is a superset of the JSON Schema Specification Draft 2020-12.\n */\nexport type SchemaObject = {\n  /** The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is a superset of the JSON Schema Specification Draft 2020-12. */\n  discriminator?: DiscriminatorObject\n  /** MAY be used only on properties schemas. It has no effect on root schemas. Adds additional metadata to describe the XML representation of this property. */\n  xml?: XMLObject\n  /** Additional external documentation for this schema. */\n  externalDocs?: ExternalDocumentationObject\n  /** @deprecated */\n  example?: any\n  title?: string\n  description?: string\n  $comment?: string\n  deprecated?: boolean\n  readOnly?: boolean\n  writeOnly?: boolean\n  enum?: unknown[]\n  /** Use of this keyword is functionally equivalent to an \"enum\" (Section 6.1.2) with a single value. */\n  const?: unknown\n  default?: unknown\n  format?: string\n  /** @deprecated in 3.1 (still valid for 3.0) */\n  nullable?: boolean\n  oneOf?: (SchemaObject | ReferenceObject)[]\n  allOf?: (SchemaObject | ReferenceObject)[]\n  anyOf?: (SchemaObject | ReferenceObject)[]\n  required?: string[]\n  [key: `x-${string}`]: any\n} & (\n  | StringSubtype\n  | NumberSubtype\n  | IntegerSubtype\n  | ArraySubtype\n  | BooleanSubtype\n  | NullSubtype\n  | ObjectSubtype\n  | {\n      type: (\n        | 'string'\n        | 'number'\n        | 'integer'\n        | 'array'\n        | 'boolean'\n        | 'null'\n        | 'object'\n      )[]\n    }\n)\n\nexport interface StringSubtype {\n  type: 'string' | ['string', 'null']\n  enum?: (string | ReferenceObject)[]\n}\n\nexport interface NumberSubtype {\n  type: 'number' | ['number', 'null']\n  minimum?: number\n  maximum?: number\n  enum?: (number | ReferenceObject)[]\n}\n\nexport interface IntegerSubtype {\n  type: 'integer' | ['integer', 'null']\n  minimum?: number\n  maximum?: number\n  enum?: (number | ReferenceObject)[]\n}\n\nexport interface ArraySubtype {\n  type: 'array' | ['array', 'null']\n  prefixItems?: (SchemaObject | ReferenceObject)[]\n  items?: SchemaObject | ReferenceObject | (SchemaObject | ReferenceObject)[]\n  minItems?: number\n  maxItems?: number\n  enum?: (SchemaObject | ReferenceObject)[]\n}\n\nexport interface BooleanSubtype {\n  type: 'boolean' | ['boolean', 'null']\n  enum?: (boolean | ReferenceObject)[]\n}\n\nexport interface NullSubtype {\n  type: 'null'\n}\n\nexport interface ObjectSubtype {\n  type: 'object' | ['object', 'null']\n  properties?: { [name: string]: SchemaObject | ReferenceObject }\n  additionalProperties?:\n    | boolean\n    | Record<string, never>\n    | SchemaObject\n    | ReferenceObject\n  required?: string[]\n  allOf?: (SchemaObject | ReferenceObject)[]\n  anyOf?: (SchemaObject | ReferenceObject)[]\n  enum?: (SchemaObject | ReferenceObject)[]\n  $defs?: $defs\n}\n\n/**\n * [4.8.25] Discriminator Object\n * When request bodies or response payloads may be one of a number of different schemas, a discriminator object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the document of an alternative schema based on the value associated with it.\n */\nexport interface DiscriminatorObject {\n  /** REQUIRED. The name of the property in the payload that will hold the discriminator value. */\n  propertyName: string\n  /** An object to hold mappings between payload values and schema names or references. */\n  mapping?: Record<string, string>\n  /** If this exists, then a discriminator type should be added to objects matching this path */\n  oneOf?: string[]\n}\n\n/**\n * [4.8.26] XML Object\n * A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are not inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.\n */\nexport interface XMLObject extends Extensible {\n  /** Replaces the name of the element/attribute used for the described schema property. When defined within `items`, it will affect the name of the individual XML elements within the list. When defined alongside `type` being `array` (outside the `items`), it will affect the wrapping element and only if `wrapped` is `true`. If `wrapped` is `false`, it will be ignored. */\n  name?: string\n  /** The URI of the namespace definition. This MUST be in the form of an absolute URI. */\n  namespace?: string\n  /** The prefix to be used for the name. */\n  prefix?: string\n  /** Declares whether the property definition translates to an attribute instead of an element. Default value is `false`. */\n  attribute?: boolean\n  /** MAY be used only for an array definition. Signifies whether the array is wrapped (for example, `<books><book/><book/></books>`) or unwrapped (`<book/><book/>`). Default value is `false`. The definition takes effect only when defined alongside `type` being `array` (outside the `items`). */\n  wrapped?: boolean\n}\n\n/**\n * [4.8.27] Security Scheme Object\n * Defines a security scheme that can be used by the operations.\n */\nexport type SecuritySchemeObject = {\n  /** A description for security scheme. CommonMark syntax MAY be used for rich text representation. */\n  description?: string\n  [key: `x-${string}`]: any\n} & (\n  | {\n      /** REQUIRED. The type of the security scheme. */\n      type: 'apiKey'\n      /** REQUIRED. The name of the header, query or cookie parameter to be used. */\n      name: string\n      /** REQUIRED. The location of the API key. */\n      in: 'query' | 'header' | 'cookie'\n    }\n  | {\n      /** REQUIRED. The type of the security scheme. */\n      type: 'http'\n      /** REQUIRED. The name of the HTTP Authorization scheme to be used in the Authorization header as defined in [RFC7235]. The values used SHOULD be registered in the IANA Authentication Scheme registry. */\n      scheme: string\n      /** A hint to the client to identify how the bearer token is formatted. Bearer tokens are usually generated by an authorization server, so this information is primarily for documentation purposes. */\n      bearer?: string\n    }\n  | {\n      /** REQUIRED. The type of the security scheme. */\n      type: 'mutualTLS'\n    }\n  | {\n      /** REQUIRED. Tye type of the security scheme. */\n      type: 'oauth2'\n      /** REQUIRED. An object containing configuration information for the flow types supported. */\n      flows: OAuthFlowsObject\n    }\n  | {\n      /** REQUIRED. Tye type of the security scheme. */\n      type: 'openIdConnect'\n      /** REQUIRED. OpenId Connect URL to discover OAuth2 configuration values. This MUST be in the form of a URL. The OpenID Connect standard requires the use of TLS. */\n      openIdConnectUrl: string\n    }\n)\n\n/**\n * [4.8.26] OAuth Flows Object\n * Allows configuration of the supported OAuth Flows.\n */\nexport interface OAuthFlowsObject extends Extensible {\n  /** Configuration for the OAuth Implicit flow */\n  implicit?: OAuthFlowObject\n  /** Configuration for the OAuth Resource Owner Password flow */\n  password?: OAuthFlowObject\n  /** Configuration for the OAuth Client Credentials flow. Previously called `application` in OpenAPI 2.0. */\n  clientCredentials?: OAuthFlowObject\n  /** Configuration for the OAuth Authorization Code flow. Previously called `accessCode` in OpenAPI 2.0. */\n  authorizationCode?: OAuthFlowObject\n}\n\n/**\n * [4.8.29] OAuth Flow Object\n * Configuration details for a supported OAuth Flow\n */\nexport interface OAuthFlowObject extends Extensible {\n  /** REQUIRED. The authorization URL to be used for this flow. This MUST be in the form of a URL. The OAuth2 standard requires the use of TLS. */\n  authorizationUrl: string\n  /** REQUIRED. The token URL to be used for this flow. This MUST be in the form of a URL. The OAuth2 standard requires the use of TLS. */\n  tokenUrl: string\n  /** The URL to be used for obtaining refresh tokens. This MUST be in the form of a URL. The OAuth2 standard requires the use of TLS. */\n  refreshUrl: string\n  /** REQUIRED. The available scopes for the OAuth2 security scheme. A map between the scope name and a short description for it. The map MAY be empty. */\n  scopes: { [name: string]: string }\n}\n\n/**\n * [4.8.30] Security Requirements Object\n * Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object.\n */\nexport type SecurityRequirementObject = {\n  [P in keyof ComponentsObject['securitySchemes']]?: string[]\n}\n\nexport type $defs = Record<string, SchemaObject>\n\ntype Deref<T> =\n  // 1. Remove any direct ReferenceObject\n  T extends ReferenceObject\n    ? never\n    : // 2. Recurse into arrays/tuples\n      T extends readonly (infer U)[]\n      ? readonly Deref<U>[]\n      : // 3. Recurse into object properties\n        T extends object\n        ? { [K in keyof T]: Deref<T[K]> }\n        : // 4. Primitives, functions, etc. stay unchanged\n          T\n\n/** LooseOpenAPI3Spec with every `$ref` wiped out */\nexport type DereferencedLooseOpenAPI3Spec = Deref<LooseOpenAPI3Spec>\n"
  },
  {
    "path": "packages/openapi-utils/src/utils.ts",
    "content": "import type { OpenAPIOperationParameterSource } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\nimport camelCaseImpl from 'camelcase'\n\nimport type { ObjectSubtype, SchemaObject } from './types'\n\nexport function camelCase(identifier: string): string {\n  return camelCaseImpl(identifier)\n}\n\nexport function mergeJsonSchemaObjects(\n  schema0: SchemaObject & ObjectSubtype,\n  schema1: SchemaObject,\n  {\n    source,\n    sources,\n    label\n  }: {\n    source: OpenAPIOperationParameterSource\n    sources: Record<string, OpenAPIOperationParameterSource>\n    label: string\n  }\n) {\n  // TODO: Support cookie parameters\n  assert(\n    source !== 'cookie',\n    'Cookie parameters for OpenAPI operations are not yet supported. If you need cookie parameter support, please contact support@agentic.so.'\n  )\n\n  if (schema1.type === 'object' && schema1.properties) {\n    schema0.properties = {\n      ...schema0.properties,\n      ...schema1.properties\n    }\n\n    for (const key of Object.keys(schema1.properties)) {\n      assert(\n        !sources[key],\n        `Duplicate parameter \"${key}\" in OpenAPI spec ${label}`\n      )\n\n      sources[key] = source\n    }\n  }\n\n  if (schema1.required) {\n    schema0.required = Array.from(\n      new Set([...(schema0.required || []), ...schema1.required])\n    )\n  }\n\n  // https://community.openai.com/t/official-documentation-for-supported-schemas-for-response-format-parameter-in-calls-to-client-beta-chats-completions-parse/932422/3\n  // https://platform.openai.com/docs/guides/structured-outputs\n  // https://json-schema.org/understanding-json-schema/reference/combining\n  assert(\n    !schema1.oneOf,\n    `JSON schema \"oneOf\" is not supported in OpenAPI spec ${label}`\n  )\n  assert(\n    !schema1.allOf,\n    `JSON schema \"oneOf\" is not supported in OpenAPI spec ${label}`\n  )\n  // TODO: Support \"anyOf\" which should be supported by OpenAI function calling\n  assert(\n    !schema1.anyOf,\n    `JSON schema \"anyOf\" is not supported in OpenAPI spec ${label}`\n  )\n}\n"
  },
  {
    "path": "packages/openapi-utils/src/validate-json-schema-object.ts",
    "content": "import { assert, hashObject, HttpError } from '@agentic/platform-core'\nimport { betterAjvErrors } from '@apideck/better-ajv-errors'\nimport Ajv, { type ValidateFunction } from 'ajv'\nimport addFormats from 'ajv-formats'\nimport fastUri from 'fast-uri'\nimport plur from 'plur'\n\nconst globalAjv = new Ajv({\n  coerceTypes: true,\n  useDefaults: true,\n  removeAdditional: true,\n  uriResolver: fastUri,\n  // Explicitly set allErrors to `false`.\n  // When set to `true`, a DoS attack is possible.\n  allErrors: false\n})\n\n// https://github.com/ajv-validator/ajv-formats\naddFormats(globalAjv)\n\n/**\n * Validates `data` against the provided JSON schema.\n *\n * This method uses `ajv` and is therefore not compatible with CF workers due\n * to its use of code generation and evaluation.\n *\n * The API gateway uses `cfValidateJsonSchemaObject`, which is looser but\n * special-cased for CF workers.\n *\n * @see https://github.com/ajv-validator/ajv/issues/2318\n */\nexport async function validateJsonSchema<T = unknown>({\n  schema,\n  data,\n  ajv = globalAjv,\n  errorMessage\n}: {\n  schema: any\n  data: unknown\n  ajv?: Ajv\n  errorMessage?: string\n}): Promise<T> {\n  assert(schema, 400, '`schema` is required')\n  const isSchemaObject =\n    typeof schema === 'object' &&\n    !Array.isArray(schema) &&\n    schema.type === 'object'\n  const isDataObject = typeof data === 'object' && !Array.isArray(data)\n  if (isSchemaObject && !isDataObject) {\n    throw new HttpError({\n      statusCode: 400,\n      message: `${errorMessage ? errorMessage + ': ' : ''}Data must be an object according to its schema.`\n    })\n  }\n\n  // Special-case check for required fields to give better error messages\n  if (isSchemaObject && Array.isArray(schema.required)) {\n    const missingRequiredFields: string[] = schema.required.filter(\n      (field: string) => (data as Record<string, unknown>)[field] === undefined\n    )\n\n    if (missingRequiredFields.length > 0) {\n      throw new HttpError({\n        statusCode: 400,\n        message: `${errorMessage ? errorMessage + ': ' : ''}Missing required ${plur('field', missingRequiredFields.length)}: ${missingRequiredFields.map((field) => `\"${field}\"`).join(', ')}`\n      })\n    }\n  }\n\n  const schemaHashKey = await hashObject(schema)\n  let validate = ajv.getSchema(schemaHashKey) as ValidateFunction<T>\n  if (!validate) {\n    validate = ajv.compile<T>(schema)\n    ajv.addSchema(schema, schemaHashKey)\n  }\n\n  if (ajv.validate(schema, data)) {\n    return data as T\n  }\n\n  // TODO: Add better error messages\n  const errors = betterAjvErrors({ schema, data, errors: ajv.errors })\n  const finalErrorMessage = [\n    errorMessage ? `${errorMessage}: ` : undefined,\n    ...errors.map((error) => JSON.stringify(error, null, 2))\n  ]\n    .filter(Boolean)\n    .join('\\n')\n\n  throw new HttpError({\n    statusCode: 400,\n    message: finalErrorMessage\n  })\n}\n"
  },
  {
    "path": "packages/openapi-utils/src/validate-openapi-spec.test.ts",
    "content": "import { readFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\nimport { afterAll, assert, beforeAll, describe, expect, test } from 'vitest'\n\nimport { validateOpenAPISpec } from './validate-openapi-spec'\n\nconst fixtures = [\n  'basic.json',\n  'firecrawl.json',\n  'notion.json',\n  'open-meteo.yaml',\n  'pet-store.json',\n  'petstore-expanded.json',\n  'security.json',\n  'tic-tac-toe.json'\n]\n\nconst fixturesDir = path.join(\n  fileURLToPath(import.meta.url),\n  '..',\n  '..',\n  'fixtures'\n)\n\nlet server: ReturnType<typeof serve> | undefined\nlet port: number | undefined\n\n// Setup a simple HTTP server to test loading remote versions of the fixtures\nbeforeAll(async () => {\n  const app = new Hono()\n\n  app.get('/fixtures/*', async (c) => {\n    const fixtureFile = c.req.path.split('/').at(-1)!\n    assert(fixtureFile, `Missing fixture file: ${c.req.path}`)\n\n    const fixturePath = path.join(fixturesDir, fixtureFile)\n    const spec = await readFile(fixturePath, 'utf8')\n\n    return c.json(spec)\n  })\n\n  await new Promise((resolve) => {\n    port = 6039\n    server = serve(\n      {\n        fetch: app.fetch,\n        port\n      },\n      resolve\n    )\n  })\n})\n\n// Close the HTTP server\nafterAll(async () => {\n  await new Promise<void>((resolve, reject) => {\n    if (server) {\n      server.close((err) => (err ? reject(err) : resolve()))\n    } else {\n      resolve()\n    }\n  })\n})\n\ndescribe('validateOpenAPISpec', () => {\n  test('remote spec https://agentic-platform-fixtures-everything.onrender.com/docs', async () => {\n    const source =\n      'https://agentic-platform-fixtures-everything.onrender.com/docs'\n    const result = await validateOpenAPISpec(source)\n    expect(result).toMatchSnapshot()\n  })\n\n  for (const fixture of fixtures) {\n    test(\n      `${fixture} (string)`,\n      {\n        timeout: 60_000\n      },\n      async () => {\n        const fixturePath = path.join(fixturesDir, fixture)\n        const source = await readFile(fixturePath, 'utf8')\n\n        const result = await validateOpenAPISpec(source)\n        expect(result).toMatchSnapshot()\n      }\n    )\n\n    test(\n      `${fixture} (file url)`,\n      {\n        timeout: 60_000\n      },\n      async () => {\n        const source = new URL(`file://${path.join(fixturesDir, fixture)}`)\n\n        const result = await validateOpenAPISpec(source)\n        expect(result).toMatchSnapshot()\n      }\n    )\n\n    test(\n      `${fixture} (http url)`,\n      {\n        timeout: 60_000\n      },\n      // eslint-disable-next-line no-loop-func\n      async () => {\n        assert(server)\n        assert(port)\n\n        const source = new URL(`http://localhost:${port}/fixtures/${fixture}`)\n\n        const result = await validateOpenAPISpec(source)\n        expect(result).toMatchSnapshot()\n      }\n    )\n  }\n})\n"
  },
  {
    "path": "packages/openapi-utils/src/validate-openapi-spec.ts",
    "content": "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { assert, type Logger, parseJson } from '@agentic/platform-core'\nimport {\n  BaseResolver,\n  bundle,\n  type Config as RedoclyConfig,\n  type Document,\n  lintDocument,\n  makeDocumentFromString,\n  type NormalizedProblem,\n  Source\n} from '@redocly/openapi-core'\n\nimport type { DereferencedLooseOpenAPI3Spec, LooseOpenAPI3Spec } from './types'\nimport { getDefaultRedoclyConfig } from './redocly-config'\n\ninterface ParseSchemaOptions {\n  absoluteRef: string\n  resolver: BaseResolver\n}\n\n/**\n * Validates an OpenAPI spec and bundles it into a single, normalized schema.\n *\n * The input `source` should point to a valid OpenAPI spec (3.0 or 3.1).\n *\n * Adapted from https://github.com/openapi-ts/openapi-typescript/blob/main/packages/openapi-typescript/src/lib/redoc.ts\n */\nexport async function validateOpenAPISpec<\n  TDereference extends boolean | undefined\n>(\n  source: string | URL | Buffer | Record<string, unknown>,\n  {\n    cwd,\n    redoclyConfig,\n    logger,\n    silent = false,\n    dereference = false\n  }: {\n    cwd?: string\n    redoclyConfig?: RedoclyConfig\n    logger?: Logger\n    silent?: boolean\n    dereference?: TDereference\n  } = {}\n): Promise<\n  TDereference extends true ? DereferencedLooseOpenAPI3Spec : LooseOpenAPI3Spec\n> {\n  if (!redoclyConfig) {\n    redoclyConfig = await getDefaultRedoclyConfig()\n  }\n\n  if (\n    typeof source === 'string' &&\n    (source.startsWith('https://') ||\n      source.startsWith('http://') ||\n      source.startsWith('//'))\n  ) {\n    try {\n      source = new URL(source)\n    } catch {\n      // Not a URL, continue\n    }\n  }\n\n  let absoluteRef: string\n  if (source instanceof URL) {\n    absoluteRef =\n      source.protocol === 'file:' ? fileURLToPath(source) : source.href\n  } else {\n    absoluteRef = cwd ?? process.cwd()\n  }\n\n  const resolver = new BaseResolver(redoclyConfig.resolve)\n  let document: Document\n\n  try {\n    document = await parseSchema(source, {\n      absoluteRef,\n      resolver\n    })\n  } catch (err: any) {\n    throw new Error(`Invalid OpenAPI spec: ${err.message}`)\n  }\n\n  // Check for OpenAPI 3 or greater\n  const openapiVersion = Number.parseFloat(document.parsed.openapi)\n  if (\n    document.parsed.swagger ||\n    !document.parsed.openapi ||\n    Number.isNaN(openapiVersion) ||\n    openapiVersion < 3 ||\n    openapiVersion >= 4\n  ) {\n    if (document.parsed.swagger) {\n      throw new Error(\n        'Unsupported Swagger version: 2.x. Use OpenAPI 3.x instead.'\n      )\n    }\n\n    if (document.parsed.openapi || openapiVersion < 3 || openapiVersion >= 4) {\n      throw new Error(`Unsupported OpenAPI version: ${document.parsed.openapi}`)\n    }\n\n    throw new Error('Unsupported schema format, expected `openapi: 3.x`')\n  }\n\n  const problems = await lintDocument({\n    document,\n    config: redoclyConfig.styleguide,\n    externalRefResolver: resolver\n  })\n  _processProblems(problems, { silent, logger })\n\n  const bundled = await bundle({\n    doc: document,\n    config: redoclyConfig,\n    dereference,\n    removeUnusedComponents: true,\n    externalRefResolver: resolver\n  })\n  _processProblems(bundled.problems, { silent, logger })\n\n  return bundled.bundle.parsed\n}\n\nasync function parseSchema(\n  schema: unknown,\n  { absoluteRef, resolver }: ParseSchemaOptions\n): Promise<Document> {\n  if (!schema) {\n    throw new Error('Invalid schema: empty')\n  }\n\n  if (schema instanceof URL) {\n    const result = await resolver.resolveDocument(null, absoluteRef, true)\n\n    if ('parsed' in result) {\n      const { parsed } = result\n      if (typeof parsed === 'object') {\n        return result\n      } else if (typeof parsed === 'string') {\n        // Result is a string that we need to parse down below\n        schema = parsed\n      } else {\n        throw new Error('Invalid OpenAPI spec: failed to parse remote schema')\n      }\n    } else {\n      throw result.originalError\n    }\n  }\n\n  if (schema instanceof Buffer) {\n    return parseSchema(schema.toString('utf8'), { absoluteRef, resolver })\n  }\n\n  if (typeof schema === 'string') {\n    schema = schema.trim()\n    assert(typeof schema === 'string')\n\n    // URL\n    if (\n      schema.startsWith('http://') ||\n      schema.startsWith('https://') ||\n      schema.startsWith('file://')\n    ) {\n      const url = new URL(schema)\n\n      return parseSchema(url, {\n        absoluteRef: url.protocol === 'file:' ? fileURLToPath(url) : url.href,\n        resolver\n      })\n    }\n\n    // JSON\n    if (schema[0] === '{') {\n      return {\n        source: new Source(absoluteRef, schema, 'application/json'),\n        parsed: parseJson(schema)\n      }\n    }\n\n    // Path to local file\n    // TODO: support raw local files (no ./ prefix)\n    if (schema.startsWith('/') || schema.startsWith('.')) {\n      const schemaPath = path.join(absoluteRef, schema)\n      const schemaContent = await fs.readFile(schemaPath, 'utf8')\n\n      // TODO: support local YAML files\n      return {\n        source: new Source(schemaPath, schemaContent, 'application/json'),\n        parsed: parseJson(schemaContent)\n      }\n    }\n\n    // YAML\n    const result = makeDocumentFromString(schema, absoluteRef)\n    if (\n      typeof result !== 'object' ||\n      !('parsed' in result) ||\n      typeof result.parsed !== 'object'\n    ) {\n      throw new Error('Invalid OpenAPI spec: failed to parse schema')\n    }\n\n    return result\n  }\n\n  if (typeof schema === 'object' && !Array.isArray(schema)) {\n    return {\n      source: new Source(\n        absoluteRef,\n        JSON.stringify(schema),\n        'application/json'\n      ),\n      parsed: schema\n    }\n  }\n\n  throw new Error(\n    `Error parsing OpenAPI spec: Expected string, object, or Buffer. Got ${Array.isArray(schema) ? 'Array' : typeof schema}`\n  )\n}\n\nfunction _processProblems(\n  problems: NormalizedProblem[],\n  {\n    logger,\n    silent\n  }: {\n    logger?: Logger\n    silent: boolean\n  }\n) {\n  if (problems.length) {\n    let errorMessage: string | undefined\n\n    for (const problem of problems) {\n      const problemLocation = problem.location?.[0]?.pointer\n      const problemMessage = problemLocation\n        ? `${problem.message} at ${problemLocation}`\n        : problem.message\n\n      if (problem.severity === 'error') {\n        errorMessage = problemMessage\n        logger?.error('openapi spec error', problemMessage)\n      } else if (!silent) {\n        logger?.warn('openapi spec warning', problemMessage)\n      }\n    }\n\n    if (errorMessage) {\n      throw new Error(errorMessage)\n    }\n  }\n}\n"
  },
  {
    "path": "packages/openapi-utils/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\", \"bin/*\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/platform/package.json",
    "content": "{\n  \"name\": \"@agentic/platform\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Public SDK for developers building on top of the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/platform\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-openapi-utils\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@agentic/platform-validators\": \"workspace:*\",\n    \"@modelcontextprotocol/sdk\": \"catalog:\",\n    \"mrmime\": \"^2.0.1\",\n    \"semver\": \"catalog:\",\n    \"unconfig\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@types/semver\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/platform/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/platform\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform <!-- omit from toc -->\n\n> Public SDK for developers building on top of the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n## Install\n\n```bash\nnpm i @agentic/platform\n```\n\n## Usage\n\nThe main export of `@agentic/platform` is the `defineConfig(...)` function, which enables you to configure your Agentic project with full type safety and autocomplete.\n\nHere's an example `agentic.config.ts`:\n\n```ts\nimport { defineConfig } from '@agentic/platform'\n\nexport default defineConfig({\n  name: '<Your Project Name>',\n  description: '<A brief description of your project>',\n  origin: {\n    type: 'mcp',\n    url: '<Your Remote MCP Server URL>'\n  }\n})\n```\n\n## Docs\n\nSee the [Agentic Publishing Quick Start](https://docs.agentic.so/publishing/quickstart) for more details.\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/platform/src/__snapshots__/load-agentic-config.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`loadAgenticConfig > basic-mcp 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"Test Basic MCP\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"mcp\",\n    \"url\": \"https://agentic-basic-mcp-test.onrender.com/mcp\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n  ],\n  \"slug\": \"test-basic-mcp\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > basic-openapi 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"Test Basic OpenAPI\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"spec\": \"{\"openapi\":\"3.1.0\",\"info\":{\"title\":\"JSONPlaceholder\",\"version\":\"1.0.0\"},\"paths\":{\"/posts\":{\"get\":{\"summary\":\"Get posts\",\"operationId\":\"getPosts\",\"responses\":{\"200\":{\"description\":\"Success\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/Post\"}}}}}}},\"post\":{\"summary\":\"Create post\",\"operationId\":\"createPost\",\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"required\":[\"userId\",\"title\",\"body\"],\"properties\":{\"userId\":{\"type\":\"integer\"},\"title\":{\"type\":\"string\"},\"body\":{\"type\":\"string\"}}}}}},\"responses\":{\"200\":{\"description\":\"Success\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Post\"}}}}}}},\"/posts/{postId}\":{\"get\":{\"summary\":\"Get post\",\"operationId\":\"getPost\",\"parameters\":[{\"required\":true,\"schema\":{\"type\":\"integer\"},\"name\":\"postId\",\"in\":\"path\"}],\"responses\":{\"200\":{\"description\":\"Success\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/Post\"}}}}}}}},\"components\":{\"schemas\":{\"Post\":{\"type\":\"object\",\"required\":[\"id\",\"userId\",\"title\",\"body\"],\"properties\":{\"id\":{\"type\":\"integer\"},\"userId\":{\"type\":\"integer\"},\"title\":{\"type\":\"string\"},\"body\":{\"type\":\"string\"}}}}}}\",\n    \"type\": \"openapi\",\n    \"url\": \"https://jsonplaceholder.typicode.com\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n  ],\n  \"slug\": \"test-basic-openapi\",\n  \"toolConfigs\": [\n    {\n      \"name\": \"get_posts\",\n      \"pure\": true,\n    },\n    {\n      \"name\": \"get_post\",\n      \"pure\": true,\n    },\n  ],\n}\n`;\n\nexports[`loadAgenticConfig > basic-raw-free-json 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"test-basic-raw-free-json\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://jsonplaceholder.typicode.com\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n  ],\n  \"slug\": \"test-basic-raw-free-json\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > basic-raw-free-ts 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"test-basic-raw-free-ts\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://jsonplaceholder.typicode.com\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n  ],\n  \"slug\": \"test-basic-raw-free-ts\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > everything-openapi 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"icon\": \"https://storage.agentic.so/agentic-dev-icon-circle-dark.svg\",\n  \"name\": \"Test Everything OpenAPI\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"spec\": \"{\"openapi\":\"3.1.0\",\"info\":{\"title\":\"OpenAPI server everything\",\"description\":\"OpenAPI kitchen sink server meant for testing Agentic's origin OpenAPI adapter and ToolConfig features.\",\"version\":\"0.1.0\"},\"components\":{\"schemas\":{\"User\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"email\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"email\"]}},\"parameters\":{}},\"paths\":{\"/health\":{\"get\":{\"description\":\"Check if the server is healthy\",\"operationId\":\"healthCheck\",\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\"}},\"required\":[\"status\"]}}}}}}},\"/users/{userId}\":{\"get\":{\"description\":\"Gets a user\",\"tags\":[\"users\"],\"operationId\":\"getUser\",\"parameters\":[{\"schema\":{\"type\":\"string\"},\"required\":true,\"description\":\"User ID\",\"name\":\"userId\",\"in\":\"path\"}],\"responses\":{\"200\":{\"description\":\"A user object\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/User\"}}}}}}},\"/disabled-tool\":{\"get\":{\"description\":\"Disabled tool\",\"operationId\":\"disabledTool\",\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\"}},\"required\":[\"status\"]}}}}}}},\"/disabled-for-free-plan-tool\":{\"get\":{\"description\":\"Disabled for free plan tool\",\"operationId\":\"disabledForFreePlanTool\",\"responses\":{\"200\":{\"description\":\"OK\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\"}},\"required\":[\"status\"]}}}}}}},\"/echo\":{\"post\":{\"description\":\"Echoes the request body\",\"operationId\":\"echo\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/echo-headers\":{\"get\":{\"description\":\"Echoes the request headers\",\"operationId\":\"echoHeaders\",\"responses\":{\"200\":{\"description\":\"Echoed request headers\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/pure\":{\"post\":{\"description\":\"Pure tool\",\"operationId\":\"pure\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/unpure-marked-pure\":{\"post\":{\"description\":\"Unpure tool marked pure\",\"operationId\":\"unpure_marked_pure\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body with current timestamp to not be pure\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"now\":{\"type\":\"number\"}},\"required\":[\"now\"]}}}}}}},\"/custom-cache-control-tool\":{\"post\":{\"description\":\"Custom cache control tool\",\"operationId\":\"customCacheControlTool\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/custom-rate-limit-approximate-tool\":{\"post\":{\"description\":\"Custom rate limit tool (approximate mode)\",\"operationId\":\"customRateLimitApproximateTool\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/no-store-cache-control-tool\":{\"post\":{\"description\":\"No store cache control tool\",\"operationId\":\"noStoreCacheControlTool\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/no-cache-cache-control-tool\":{\"post\":{\"description\":\"No cache cache control tool\",\"operationId\":\"noCacheCacheControlTool\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/custom-rate-limit-tool\":{\"post\":{\"description\":\"Custom rate limit tool (strict mode)\",\"operationId\":\"customRateLimitTool\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/disabled-rate-limit-tool\":{\"post\":{\"description\":\"Disabled rate limit tool\",\"operationId\":\"disabledRateLimitTool\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{}}}}}}}},\"/strict-additional-properties\":{\"post\":{\"description\":\"Echoes the request body only allowing a single \\\\\"foo\\\\\" field.\",\"operationId\":\"strictAdditionalProperties\",\"requestBody\":{\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"foo\":{\"type\":\"string\"}},\"required\":[\"foo\"]}}}},\"responses\":{\"200\":{\"description\":\"Echoed request body\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"foo\":{\"type\":\"string\"}},\"required\":[\"foo\"]}}}}}}}},\"webhooks\":{}}\",\n    \"type\": \"openapi\",\n    \"url\": \"https://agentic-platform-fixtures-everything.onrender.com\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n        {\n          \"billingScheme\": \"per_unit\",\n          \"slug\": \"requests\",\n          \"unitAmount\": 0,\n          \"usageType\": \"metered\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n    },\n    {\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"amount\": 999,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n        {\n          \"billingScheme\": \"tiered\",\n          \"slug\": \"requests\",\n          \"tiers\": [\n            {\n              \"unitAmount\": 0,\n              \"upTo\": 1000,\n            },\n            {\n              \"unitAmount\": 0.053,\n              \"upTo\": \"inf\",\n            },\n          ],\n          \"tiersMode\": \"volume\",\n          \"usageType\": \"metered\",\n        },\n      ],\n      \"name\": \"Starter\",\n      \"slug\": \"starter\",\n    },\n    {\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"amount\": 2999,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n        {\n          \"billingScheme\": \"tiered\",\n          \"slug\": \"requests\",\n          \"tiers\": [\n            {\n              \"unitAmount\": 0,\n              \"upTo\": 10000,\n            },\n            {\n              \"unitAmount\": 0.049,\n              \"upTo\": \"inf\",\n            },\n          ],\n          \"tiersMode\": \"volume\",\n          \"usageType\": \"metered\",\n        },\n      ],\n      \"name\": \"Pro\",\n      \"slug\": \"pro\",\n    },\n  ],\n  \"readme\": \"data:text/markdown;base64,IyBUZXN0IEV2ZXJ5dGhpbmcgT3BlbkFQSQoKVGhpcyBpcyB0ZXN0aW5nICoqcmVhZG1lIHJlbmRlcmluZyoqLgoKIyMgTWlzYwoKLSBbIF0gSXRlbSAxCi0gWyBdIEl0ZW0gMgotIFt4XSBJdGVtIDMKCi0tLQoKLSBfaXRhbGljXwotICoqYm9sZCoqCi0gW2xpbmtdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20pCi0gYGNvZGVgCgojIyBDb2RlCgpgYGB0cwpjb25zdCBhID0gMQoKZXhwb3J0IGZ1bmN0aW9uIGZvbygpIHsKICBjb25zb2xlLmxvZygnaGVsbG8gd29ybGQnKQp9CmBgYAoKIyMgSW1hZ2VzCgohW0ltYWdlXShodHRwczovL3BsYWNlaG9sZC5jby82MDB4NDAwKQo=\",\n  \"slug\": \"test-everything-openapi\",\n  \"toolConfigs\": [\n    {\n      \"enabled\": true,\n      \"name\": \"get_user\",\n      \"pricingPlanOverridesMap\": {\n        \"free\": {\n          \"enabled\": true,\n          \"reportUsage\": true,\n        },\n      },\n      \"pure\": true,\n      \"rateLimit\": {\n        \"enabled\": false,\n      },\n      \"reportUsage\": true,\n    },\n    {\n      \"examples\": [\n        {\n          \"args\": {\n            \"message\": \"Hello, world!\",\n          },\n          \"featured\": true,\n          \"name\": \"Example 1\",\n          \"prompt\": \"Use the echo tool to say hello.\",\n        },\n      ],\n      \"name\": \"echo\",\n    },\n    {\n      \"enabled\": false,\n      \"name\": \"disabled_tool\",\n    },\n    {\n      \"name\": \"disabled_for_free_plan_tool\",\n      \"pricingPlanOverridesMap\": {\n        \"free\": {\n          \"enabled\": false,\n        },\n      },\n    },\n    {\n      \"name\": \"pure\",\n      \"pure\": true,\n    },\n    {\n      \"name\": \"unpure_marked_pure\",\n      \"pure\": true,\n    },\n    {\n      \"cacheControl\": \"public, max-age=7200, s-maxage=7200, stale-while-revalidate=3600\",\n      \"name\": \"custom_cache_control_tool\",\n    },\n    {\n      \"cacheControl\": \"no-cache\",\n      \"name\": \"no_cache_cache_control_tool\",\n    },\n    {\n      \"cacheControl\": \"no-store\",\n      \"name\": \"no_store_cache_control_tool\",\n    },\n    {\n      \"name\": \"custom_rate_limit_tool\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 30,\n        \"limit\": 2,\n        \"mode\": \"strict\",\n      },\n    },\n    {\n      \"name\": \"custom_rate_limit_approximate_tool\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 30,\n        \"limit\": 2,\n        \"mode\": \"approximate\",\n      },\n    },\n    {\n      \"name\": \"disabled_rate_limit_tool\",\n      \"rateLimit\": {\n        \"enabled\": false,\n      },\n    },\n    {\n      \"inputSchemaAdditionalProperties\": false,\n      \"name\": \"strict_additional_properties\",\n      \"outputSchemaAdditionalProperties\": false,\n    },\n  ],\n}\n`;\n\nexports[`loadAgenticConfig > invalid: invalid-metadata-0 1`] = `[ZodValidationError: Expected string at \"icon\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-metadata-1 1`] = `[Error: Invalid \"readme\" (must be a URL or a path to a local file): \"./not-found.md\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-name-0 1`] = `[ZodValidationError: Expected string at \"name\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-name-1 1`] = `[ZodValidationError: Value must be less or equal to 1,024 at \"name\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-name-2 1`] = `[ZodValidationError: Value must be greater or equal to 1 at \"name\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-origin-url-0 1`] = `[Error: Invalid originUrl: must be a valid https URL]`;\n\nexports[`loadAgenticConfig > invalid: invalid-origin-url-1 1`] = `[TypeError: parseFunc is not a function]`;\n\nexports[`loadAgenticConfig > invalid: invalid-origin-url-2 1`] = `[ZodValidationError: Expected object at \"origin\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-origin-url-3 1`] = `[TypeError: parseFunc is not a function]`;\n\nexports[`loadAgenticConfig > invalid: invalid-slug-0 1`] = `[ZodValidationError: Invalid project slug at \"slug\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-slug-1 1`] = `[ZodValidationError: Invalid project slug at \"slug\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-slug-2 1`] = `[ZodValidationError: Invalid project slug at \"slug\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-slug-3 1`] = `[Error: Invalid project slug \"\" for project name \" \". Must be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters. For example: \"my-project\" or \"linkedin-resolver-23\"]`;\n\nexports[`loadAgenticConfig > invalid: invalid-slug-4 1`] = `[ZodValidationError: Invalid project slug at \"slug\"]`;\n\nexports[`loadAgenticConfig > invalid: pricing-base-inconsistent 1`] = `[ZodValidationError: Invalid PricingPlanLineItem \"base\": reserved \"base\" LineItems must have \"licensed\" usage type. at \"pricingPlans[1].lineItems[0]\"]`;\n\nexports[`loadAgenticConfig > invalid: pricing-custom-inconsistent 1`] = `[Error: Invalid pricingPlans: all PricingPlans which contain the same LineItems (by slug \"custom-test\") must have the same usage type (\"licensed\" or \"metered\").]`;\n\nexports[`loadAgenticConfig > invalid: pricing-duplicate-0 1`] = `[Error: Invalid pricingPlans: duplicate PricingPlan slugs. All PricingPlan slugs must be unique (e.g. \"free\", \"starter-monthly\", \"pro-annual\", etc).]`;\n\nexports[`loadAgenticConfig > invalid: pricing-duplicate-1 1`] = `[Error: Invalid pricingPlan \"basic\": duplicate line-item slugs]`;\n\nexports[`loadAgenticConfig > invalid: pricing-empty-0 1`] = `[ZodValidationError: Value must be greater or equal to 1 at \"pricingIntervals\"]`;\n\nexports[`loadAgenticConfig > invalid: pricing-empty-1 1`] = `[ZodValidationError: Value must be greater or equal to 1 at \"pricingPlans[0].lineItems\"]`;\n\nexports[`loadAgenticConfig > invalid: pricing-empty-2 1`] = `[ZodValidationError: Value must be greater or equal to 1 at \"pricingPlans\"]`;\n\nexports[`loadAgenticConfig > metadata-0 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"icon\": \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTYiIGhlaWdodD0iOTYiIHZpZXdCb3g9IjAgMCA5NiA5NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iNDgiIGN5PSI0OCIgcj0iNDgiIGZpbGw9IiM4ODg4ODgiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNi4yOTIyIDczLjIwNjdDMjIuNjI0OCA3My4yNTUgMTguOTgyNSA3My4yMDY1IDE1LjM2NTMgNzMuMDYxMUMyNi43NTIgNTUuMDQ4IDM4LjE0MDIgMzcuMDMwOSA0OS41Mjk5IDE5LjAwOTdDNTEuMTYzNSAxNy4zMjkzIDUyLjk4NDcgMTcuMTEwNyA1NC45OTMzIDE4LjM1NDFDNTcuNDkxIDIwLjQ1NTggNTguMjQzOCAyMy4wNTM5IDU3LjI1MTUgMjYuMTQ4NUM1NS40OTEzIDI5LjEzNTIgNTMuNjk0NSAzMi4wOTc1IDUxLjg2MDkgMzUuMDM1N0M0NC4xODc4IDQ3LjE3NjYgMzYuNTE0OSA1OS4zMTc2IDI4Ljg0MTcgNzEuNDU4NUMyOC4yODYxIDcyLjQ3NjMgMjcuNDM2MyA3My4wNTkgMjYuMjkyMiA3My4yMDY3WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01NS40MzAyIDM3LjM2NjhDNTUuNzU2NiAzNy41MjI0IDU2LjAyMzcgMzcuNzY1MSA1Ni4yMzE1IDM4LjA5NTJDNjQuMzYwNiA0OS44NjE1IDcyLjU0MzcgNjEuNTg5NyA4MC43ODA0IDczLjI3OTZDNzcuMTg2NyA3My4zNzY4IDczLjU5MzEgNzMuMzc2OCA2OS45OTkzIDczLjI3OTZDNjguOTc5MyA3My4wNDkgNjguMTI5NSA3Mi41MzkxIDY3LjQ0OTcgNzEuNzQ5OUM2Mi4zMzc5IDY0LjI5NDMgNTcuMTkwMiA1Ni44NjQgNTIuMDA2NSA0OS40NTkxQzUxLjQ2MjcgNDguNjcxNSA1MC45NzcyIDQ3Ljg0NTkgNTAuNTQ5NiA0Ni45ODI0QzUwLjM3MDggNDUuODY2NCA1MC42MTM3IDQ0Ljg0NjYgNTEuMjc4IDQzLjkyMjlDNTIuNjk4NiA0MS43NTE5IDU0LjA4MjcgMzkuNTY2NiA1NS40MzAyIDM3LjM2NjhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTYzLjg4MDMgNzMuMDYxQzU5LjcyODggNzMuMjA2NCA1NS41NTIzIDczLjI1NSA1MS4zNTA5IDczLjIwNjdDNTAuMjQxNyA3MS41MzgxIDQ5LjEwMDUgNjkuODg3IDQ3LjkyNzEgNjguMjUzMkM0Ni44NDUxIDY5Ljg4NCA0NS44MDA5IDcxLjUzNTEgNDQuNzk0OCA3My4yMDY3QzQwLjY5MDQgNzMuMjU1IDM2LjYxMSA3My4yMDY0IDMyLjU1NjcgNzMuMDYxQzM2LjM4NDkgNjcuMDIyMSA0MC4yNDU3IDYxLjAwMDMgNDQuMTM5MiA1NC45OTUzQzQ1LjcxNzMgNTMuMzQxOSA0Ny41ODcxIDUyLjkyOTIgNDkuNzQ4MyA1My43NTdDNTAuMzIyMyA1NC4wMzE3IDUwLjgzMjIgNTQuMzk2IDUxLjI3OCA1NC44NDk3QzU1LjUxMDkgNjAuOTAyNyA1OS43MTE3IDY2Ljk3MzIgNjMuODgwMyA3My4wNjFaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE1LjM2NTIgNzMuMDYxMUMxOC45ODI1IDczLjIwNjUgMjIuNjI0NyA3My4yNTUgMjYuMjkyMSA3My4yMDY3QzIyLjYyNSA3My40MDA0IDE4LjkzNDIgNzMuNDAwNCAxNS4yMTk1IDczLjIwNjdDMTUuMjM3NiA3My4xMTgzIDE1LjI4NjEgNzMuMDY5OCAxNS4zNjUyIDczLjA2MTFaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjU1NjggNzMuMDYxMUMzNi42MTExIDczLjIwNjUgNDAuNjkwNCA3My4yNTUgNDQuNzk0OCA3My4yMDY3QzQwLjY5MDcgNzMuNDAwNCAzNi41NjI5IDczLjQwMDQgMzIuNDExMSA3My4yMDY3QzMyLjQyOTIgNzMuMTE4MyAzMi40Nzc3IDczLjA2OTggMzIuNTU2OCA3My4wNjExWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02My44ODAzIDczLjA2MTFDNjMuOTU5NCA3My4wNjk4IDY0LjAwNzkgNzMuMTE4MyA2NC4wMjYgNzMuMjA2N0M1OS43NzcxIDczLjQwMDUgNTUuNTUyIDczLjQwMDUgNTEuMzUwOSA3My4yMDY3QzU1LjU1MjMgNzMuMjU1IDU5LjcyODkgNzMuMjA2NSA2My44ODAzIDczLjA2MTFaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K\",\n  \"name\": \"Test Metadata 0\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n  ],\n  \"readme\": \"data:text/markdown;base64,IyBUZXN0IE1ldGFkYXRhCgpUaGlzIGlzIHRlc3RpbmcgKipyZWFkbWUgcmVuZGVyaW5nKiouCgojIyBNaXNjCgotIFsgXSBJdGVtIDEKLSBbIF0gSXRlbSAyCi0gW3hdIEl0ZW0gMwoKLS0tCgotIF9pdGFsaWNfCi0gKipib2xkKioKLSBbbGlua10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbSkKLSBgY29kZWAKCiMjIENvZGUKCmBgYHRzCmNvbnN0IGEgPSAxCgpleHBvcnQgZnVuY3Rpb24gZm9vKCkgewogIGNvbnNvbGUubG9nKCdoZWxsbyB3b3JsZCcpCn0KYGBgCgojIyBJbWFnZXMKCiFbSW1hZ2VdKGh0dHBzOi8vcGxhY2Vob2xkLmNvLzYwMHg0MDApCg==\",\n  \"slug\": \"test-metadata-0\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > metadata-1 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"icon\": \"https://agentic.so/agentic-icon-circle-light.svg\",\n  \"name\": \"Test Metadata 1\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n  ],\n  \"readme\": \"https://raw.githubusercontent.com/transitive-bullshit/agentic/refs/heads/main/readme.md\",\n  \"slug\": \"test-metadata-1\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > metadata-2 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"icon\": \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDkiIGhlaWdodD0iNDkiIHZpZXdCb3g9IjAgMCA0OSA0OSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxwYXRoIGQ9Ik0wLjAxOTUzMTIgNDguMzU5NEg0OC4wMTk1VjAuMzU5Mzc1SDAuMDE5NTMxMlY0OC4zNTk0WiIgZmlsbD0idXJsKCNwYXR0ZXJuMF8yNzc5XzIwKSIvPgo8ZGVmcz4KPHBhdHRlcm4gaWQ9InBhdHRlcm4wXzI3NzlfMjAiIHBhdHRlcm5Db250ZW50VW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KPHVzZSB4bGluazpocmVmPSIjaW1hZ2UwXzI3NzlfMjAiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMDYyNSkiLz4KPC9wYXR0ZXJuPgo8aW1hZ2UgaWQ9ImltYWdlMF8yNzc5XzIwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFLQUFBQUNnQ0FZQUFBQ0x6MmN0QUFCV1BrbEVRVlI0bk8yOWQ3d2RWM1gzL1YxN1pzNDV0NmwzMlhMQnhoVU1Cb3pwdlJNSGNBeCtTU0E0aEJKQ0NnbWhCQktNZ2ZCQUlFQW9lU2pCRUFpUWdDRVFnazJDalFOdXVPS0tqVzFrU2JhNlpFbFg5OTVUWnZaNi85aGw5cmtTWUZsSDkwcFBzdnc1dmtkblp2YnNtZm5OYjVXOTl0ckMvOG9EbHUzbmYrSEY1ai8rNDdIbWlVLzZQUER6MmU3UC93dVM3L3JvMzg5Mkh3NFowYXN1LzAzNXh0ZC8xOTUvLzhQNHkzZStDN2gydHZ0MHFFdHVIL2J3MmU3RElTUFp0VmMwVzBCMThRK2VQN2xtN1duWkdTODZUODc0alg4QXl0bnUyNkVxdWNteTJlN0RJU04yOGZ6N3JZSG04cVhJMnA4dm12akloLzZlblR0UGF6ejFhVzhIN3AzdC9oMktrcHQxOTgxMkh3NFpLUmN0V1ZzQnRJWm9QSDBWNXI1N0dmL1NwMytuKytQTEhwYS80NTEvQmx3eXkxMDg1Q1MzVm1lN0Q0ZU01R3ZYYnFpR1d0amRrNWo1SzhrUFYrWXUyY0Q0VGJlZTBqNzNiZDlxUGUwRjc1V3pYdkpSb0RmYmZUMVVKSmNsaTJlN0Q0ZU0yR05QMktRampXNjE4LzZHYWErRXhZc3hoOEdjNGMzc3ZtUE5uUGJYUC8zQm90ZCtkT05KVDMwTHNHYTIrM3NvU0c3V3JaL3RQaHd5MGozOUNmZkovTkhkZHZPdUJleWFoR3crTkJjZ1k4TFljWnN4Qzl0TS91Zm5YNnBYWDNsQy9vN3ozZ1JjUE50OVB0Z2xyMXBEczkySFEwZkc1bXhnd2RJTkZlc1hNTDRiZEQ0MFdqQTBEMG9ZbWIrVjdNUkp4dGY5N0dIbCs5LzhyZGFUWC9KdWVmbExQd3BVczl6emcxWnlPZUt3MmU3RElTUEZ4ZisxMjdiR05wWndrazVPSU4wdVpFT1F0MkJvTGxob2xWdVJWWlBzM3JwbXJQMnR2LzlRdzVRbjVzOS8wZHVCemJQZC80TlJjdGsxT2R0OU9IVGsyRlBhZXZoUE5pbGdPMjJ5OWhTMFdtQUtLSUNXUXFVMGR4bXlCUk9NajFSMHZ2dngzK1A2cXg0bTUvN3RId0RYemZJVkhIU1NWL24veGdIM1NWYXUzQWhnZTEyeWRoc0tCV05BQ3NpSFlBaXdobnhjR0N0Mk0zR0UwdGx3eldPeXYzN0RkeHF2Zk5OZkFGK1ozUXM0dUNTWHUrNmM3VDRjVW1KWEhMRkZnYXF5Rk8wT0RKV1E1eUFDV1E2TkliQ0FoWHhTR0czdnhxeXdURzI3YlVYbi9YLzZ4ZWF6WC80d2U5NTd6Z09tWnZsU0Rncko3Vy8reG16MzRaQVM4K20vMzFvTloxaXRvTmVCc2dlbUNTWnpBRlNCQmc2RUdESTFqRXlOWStaWFREWW04cW1MUHYrMmh1aXh4UXRmL0tmODcrZ0plWDdOLzVvbCt5Sm04N2FkZG5nWXErUFE3a0szQjdrRnlZQU1qSURCZ1ZBRkVBekM4TlE0WnFoazR2Q0t6bjk4N2t4dXZ2R294clBQZUIzL3d4TWFjcm51K3RudXd5RWwxZkVuN0tTVmQ2eWxxVlVQNlhXaFVoQ2NHaVp6QU15b1FhaUNTRVpyY2hjbTZ6THhFT2pjZDgycDlwdGJ2MTI4ODBOL0NueDlGaTlwVmlXdlRqeHh0dnR3U0VrNUlydWxtZlZra3FaYWkvUktxS3dEblRqR1F6d0xaZ0lOLzVzeGlCaWFrN3VRcXMza0t1aHNXYjNDL3VVZmZMSDEvTjgrT2p2cXlML0ZLKzcvU1pMbjkvMlBOMFAyU2FvVGoyMUxscGNxb0dVRlplVUFtSHNXSkFBdTk5K1ZDRXB4dnpjbWRpRGRLY3dpcGIxejg5RFVOejd4ZjFwUGZzbEsrNkVQdngyWW1NWExtM0hKdTJlZE9kdDlPS1JFN3JwcjBoU3RyZ1cwVXVpVlVGV2dHckhtZ0dpY1BTZ0NsTFdLRmdOaUtDWjJJTjBKWks3U0h1b3grWk4vL2FQR1g3ZU9LRjc2MjI4RTFzM2VGYzZzNU5rdHQ4MTJIdzRwcVpZdGJ0Tm90bFZCcllLdHdLcjdtTEJYeW55WnN3Y2pBQU1UR3ZKSnczQjdOeWEzVEs1U2V2LzF4VFBrcmpzUGF6M2hxYThHZmpvN1Z6aXprdWYvZmVsczkrR1FrdkpWdjF1U0YyWEVtTFdnTm1GQThYdEtna1B2bUtoQTdyZjcvVElWaHRxN0VWTXhlUXkwMTExeEtoZXMrM3ArM29kZUExdzZzMWMzODVLWHA1d3kyMzA0dE1SV2dsb2hEQ0JaZFNDMDZrR29OY3VsS3RsbU5VTUdXMUVkRTVyYzBKcmFqVlE5NTV6Y3UrNFkremQvK2JYOGZSOTdBL0RObWIvSW1aUGNqb3pNZGg4T0taRWRPNXRVM1NZTmFvYXovcS82NUY2VitnQU5hbGRybXpBY3AvaTRvV0RFMEpvYVI4b3VrNnVndC9idXBmYVBmdi84eG5zL1BBZjR3a3hlNDB4S3pzNmRzOTJIUTByczZOQ0lsSk90eUlCNHNDa09iRmFtTVozZkZsUXk0a1pOY3I4aDdpT0lDTTMyTHFUc01uVWtkRlp2bk5OOTY1OStzbkhlK3d2Z3N3ZjYybVpEY2pyL095UzVMNUxkZGZkODdYVmJrb01nbnRYQzFyMU1ieENwbVRFNEpYaVE1dFNNaUZQZFlzVEZDcnNkNUNob3I5NHkzSDM3Vy82K2VlNTdDdUJUQi93Q1oxaHk2WFJtdXcrSGxyUzdLM1gzcm1GWjRnYlprS3dPUEJ1cFBkN0FlcEE0SnNFbzlCUnBjT0FzQ3FKTzFsR3dsa1pib2RlREk1WE9YZHRiM2I5K3g5ODFQdlNSSHYrUE1XSE84UEJzOStHUUV0dlovUkR0ZE1teXdJQVpaTWFOZUJUSmpocitKOU5VTVE2UTFyZ2Zzc3c1TUZuaC9qYlYyWXNvamZadXRPcWh4eWlkMjNjMGVkdGIvcTc0NUQ5TUF2ODhZeGQ4Z0NYWHNiSFo3c09oSThNallpNzZ6c1BMd3VIT2FPNVNzVm9HaHIwNkJwZUFiM0gySU9BODNnQkdqMElEcUttZGw0d2FvSVc2MEE3UWFJK2pWUStPaGU0dFcwWjUwNTkrTFB2U1ArMEEvbU5HcnZrQVMyNFhMWmp0UGh3eWtrMTBWdkdMV3g4dFE1QXBicml0MllBaHI0WmJBa3VCY1dDTCtKSGRvSVpKYkVWcXRhdytnUUdGM0J1RzJuQWd0QmF4RmMzT0JHUWxlaEowYjdoM29aeno2azgxMy9ENnM0RXJaK2pTRDVqa3hUWFh6SFlmRGhsUlV6eWwybmpQRWJJRU1qWFFhRUt6Z01JTnI2SEFBb0dWUUJOWWk1c2huRk96STRBSm95YmlXTEJTS0FWS0E1cUJMUndERmkzQUlsUTB1bE5vWHFFblFPK25xMWZKNXo3M3VjYmZmZVFzNEpBZXlzbzU4YVRaN3NNaEllV1J4K1RtdkxmOWx1MTBLWnBnVE81bXhCVzVTOGtQZ0NxQkZuQTBqdVhXVUlkbVlpd3d4QXVwblJkakhEQlZvVEkrdWJVQldrRmpCS05Lc3plRmpscjBPT2plZHVlSjhzbFBmb292bm44MnNIRTI3c2tnSk8rZDl1alo3c01oSWVhUy8zNk92ZXkvbnN0Y0tBUk0xb1JtQzFxNU13aURaMnR4SU15QW8vMThrVFU0WU9XaE5lOG1SMjhabDdvbDNqR3htYmNMclFlaEJWdGliRVdqNnFJTExlMVYwUDJ2QzUvU1BQZmM5L0tPdjNvdGgyZ3FWeTY5LzUyeSt1dWtYTEpvMkh6dGkzOVMzVDlSNUVzaGw4eE54V3cxb2Vtem9JT1JGMjVuaFFQVmtUaHNyaE9mc0tEOXRtQU0xeGpIaklYM2tLMXg2bGx5TitzdWI0R3R5TldpOU5DVnl0UTRkRC96ZjE4OXRIVHBuY0FIWnU2T0RFN3k3SE9mbWUwK0hQU1NHZk9tM245KzcxbTZHUElHWkZuaDJLK1JPZnN2cGwxSlhhak5aMkdSQVlmamdMY09yNDZUMUMxRFAzY0pMcVJUR3JDNVo4RWNiQU9LQ214SjNxdXdUVXUxU3Vuc2hNN25QdnYyNGgvUHZ4cjQ0WXpkbEFGSmJoLzMrTm51dzBFdHhjOXVlbVBuYi83bXI4b2NHdk9oeUFTazRaRFluSlpnb09xODJpcDR1T3BCS0xBQ3g0cjNVWU12SGFJTDM5WC91K2xCV1BsZ2Q1NkRGcEEzRVZ0UlZCM3NYTVVlQ2QxZnJKK2J2Lzk5NzVFdi9mT0xnSzB6ZG5NR0lEa0hZVXIrWkRNYnpucmRBamhnQTlVNk5sZGFWMXdwL0JMYnliUWFLeHZmdXVETjdTOS81UTNkM1RzYjJSR1FqM2p2MStRdVpOS0FxSHI3TWwrb2dRVE95elVDSzYwRDVLWmtYL1ZxT2ZiQ2U4YTV1dlpMNDJ4TXpkeDVzd2JrRmFhcXlDbHBMTEpVMjZENzR4ODlvZlc1ei80UjhLNERkTXNPaU9UeXVZTnZaR2Y0K0dOL0w5dXljU1h3OWdOMWp1NlRudmJFN0N0ZmZaMDk3ZlFMcE9yK09MdngrbTd2OTErM0tOK3c0YUd5K3U2bnlQZStjOWJrbFZjL3BFMkpXUW5aUERmNXpaZ2NpZ1lNNTA0RlkrTHNOemNSeVgrMzlJL3pWdXFZOERDZ3EzQy9WOFVoYmN0b0VyakdUKzgwTlF1U2VYc3dkNk1tV1VGZVZtaExLSmM3VlZ6Kzh6Kzkzbno3Mzc4TEhES3hOZGx4MDgyejNZYytLY2RHemRqYi8rSUhZaXZiZnVuTG5zVmVSL2ozVHpyUGVvR012djN0WCs5OTZoTm50cGZNNjVqNWkrL0pzbXdpTTdLVTdadVhWcHUzNTkxU3FlWkJ0Z0NLdVU0anR0UmdodWZBL1Btd1pBem1ESUZwT0dCb0JpTUdqaElYQXd4ZzZrczJ3SUYwWE9GT1lNcVBnT0RETDRUazF2Q3BvRnZDN2dvNlBhaTZVSGFoNmtCdkVqcVRWSlIwS2t0N05aUWJvUFhxVjM4VmVQbWc3OW1Ca2x3Kzl0SFo3a09mbU45OTVVbjV6MjUvdkYyMDRGWno2ODBqd081Qm55Tjc2TU1lWXkvOHpqUExCVkQwZGpUTnhoM0gyUzZVYldmdk13ck5NY2hHSVd0QmJneTU1RWhqR0laR29kVnc3S1RVcWZpS1U1dnBrQnJVZGlIVVFCekZCYXRYNCt6Q2tKb1ZiNEkvenVJWXRRWDBnbTBaMkxBQVUyQktTNTRwK1JLbDNBYmxCVjgvcy9HRkx6MEgrUDZnNzl1QmtOejh4aG16M1ljK01WZGU4Unl6WVdQVEhuN1ljUHRGWnc1eEFBQllmT2M3THlnM3JwM0xFc2liTUxweUlUUVhvSjB1ZERzSXBVc3NFSEdJekRLWHNaSVgwQ2hnVHVHZGdtRDcrVXlXbHRTcDk4RW1CQ0s0RkFjNEJSYXB1N0lOaVVjOG5ld0ZwN1piQWwyQm5vbVRtbHhhVjQ1b1NWWmE4aEVsWHd6bGZic2ErVGN2ZURXSENnRHROeStZN1Q1RTZYN2dnd3ZuZk9ydlg4cm9LTVpXbzlMSXg0QXRnenlIeVVibjgvM3Z2a0NiUUFOa0JBZWFKWXVRb1JFL0xGYTY2WmEyU25MNTFJVmNXcmprQS9Gc1pMd04yQkFZOVlpekNmcUVQY1Y2cGx5bWJoTG03b1E1TmFSS1V6c3BHVEFrMEVsWVVMeE5TSWFoSkROQ1BxYVVBdFhGUDNodTQ5T2ZmVHh3eFNEdjNZR1FQSHZweTJhN0QxR2FYLzdDS3h1MzNmNFlEanNNSmllSHpJWU5BODhWTTNldmY1cTk0NFpIeWh4Z0NQSU02SlN3ZXdLazZTaXhLSnc2VlorVklqZ25vWWxQbHlKSnV4ZG43NDBCSTlxZkJ4aXcxSmVJNFBmcDRjQzhYR0cxZXRENjdZSlAyU0xKa01HZHYrTkhURVJjR2xpZUlUMURwcFpzQk14Y3FPNWJQOFlsbDd5QVF3R0FYSEp3Rkhhdm52RFlVMGMrODlrM3NYQ3hWMjgyU2VRY25PZ2xGNytVM1pQR0xuWE9aSUdCckFrOUM1MHVrRG1WNitkcWtQbjArUVplTGVNbklQa0dMVzc3UFAvWEp1R1hCRk5SVmFkYXRnZk1BZWJqZUQ0ZEk0WUV1T0pWc1lISjFCWU1mdzNHQ3FaUXNsSG83WURxbHA4K3Mvem5mLzBnQnpDVU5RakpPMi8veTludUE3YlhYamJubGEvNFNOYnRIczZqRjhHV25XaTM2TmtGQzd1RFBJL1owVDFGcjc3c0diSUF0QW1GQlVNQlJSUG1aSTdGc3BDcGdrK2JGd2Vza09sY1VhZlpLdzV3ODlVQnlaZGwyMk9vTFlDV3NDMUJvU2dzVk5paDBNVUJMVXp6VEdPRjRQclJFcmRmbU9UdUFTaVZrT1ZDTnFMME1xaHUrdW5KalI5ZThrZ084cW1kZWVPSHM4dUFVODk5MXZEWU84LzljT1BHbTUvTTAwK0V3eFIyV0d4SGR0SHA3QnJrdWVTNzN6dURUZmNzMG9lNjU1cFg0cHlLdVFVc05TN1dJbmltU20wNHFSMkl2bEVMWUZoaGlYYyt5bVM3Sm13MkhaQ3A0MUlxRENuTVU5aW9OUXVHZmVOM3JaazRtZ0NKR2FEaWttMkd3SXlBM2JSdFdGZmYvV2dPZGdEcTZydG43ZVI2eXZGbXpodi80UDNOQ3k5K09ZOC9GbFlheHlCVmhyVGJPMXBmT245ZzlZTTdiejUzbmw1eitRdGxEbWdMOGtuSUVKalRoQVc1TXdiVjFBZUkwaGRrVGxVdTFNQmFMTTcySzFQR0l2MHlqYzJZQmpMeExBamNqNDhOQmlEYXhBbnl4elhVbVFMZDBMeUpYcmRZRjZjMlExRHVBbnZyTGFjTzZ2NGRLTW50cmJmTTJzbWJhKzkrVi9QYkYvMHhweDBEUjdkY2tSOXJZTEtEWFhiNHh1cUVrd1pXcUNlNzZEK2ZxYmRkK1JoZENWSkJYb0ZwWkRDL0FhM0NwVURoUXh4R0VvWkp3S2ZUUGd1QkJmU3paY3ArNlRodlVObXBxTjlvZ1dGZ0VYQ3YxQWtMS1hXRzBFNEl5MHhCeW9DQ0lGYWNmOUx5SjdyNzd1UDR6UG56Z0IzN2QvY09uT1M4OVoyemN1THMwb3YrdVBYT2QvODFKNitDazhaY2RZR3VPTnRtNTA3S3h6MzlubXoxbW9IbGlwVnJOcDlGMlJiR0JObWw1Q293V3NCb3c2VTdhVWFjUkQ0ZGVPbG9zZUpVN1J4Z0NiWHExWVR4OWlveXJTRnErODU2eGx1Z2NML0NMby93NEEwSGdLdHhiMDlMblczYXB0OVQ5blV5VGRQOXM5cXcvdkJzNTQ0VkhOUUEzTGxqNXMrNmMrc3poai80ZCs5bXhVSjR4RUtuTzlwK1c2K0NqbEllZGZUQVVzMzF5Qk1lbzMvNHFtZkxDdEJTeVN2SUdnSnpHODRHSkNTVWVzK3lyN0lCL2YrdWdCRmNka3NMRnpmVXNPUGVUcDdTWi9wN2JMd0dkUU1Id3ZGa3Uyci92aGJQZ2o2R21Kb0lRWE0zZ1NHd3UzYU5OWDV5MVFvTzRyVDlQUHZKVlRONnd1NXpucmwwN00vLytIMW1hbW9lVHo4YUdoVzB4UTlKR2JoL0Fqczh1bE9QUEhKZ3BWdmxPLy94SXQxMTd6eGRCWXk3RUo4WnpXRzA1Y1p5Q2ZaZk9ySmhuQ3BNd3lvVkRpVExjZFh3eTZDTDJmdG9SblJFRWtiYkE0LytSOFV4NFJ6Y0RMc0o2aUU1alkzWDV4bkNCYjg3aVJyMlpxTmtMcVNwdG1yWm45KythSC92MzRHVTNQNzg5aGs5WVhQRHZYOVEzSHo3WTNuR0NTNTgwY1k5U092VjMrWnhxbVVyYjJLNE5aaTNkdEVSeSszMTUvMG1DMEZWeUhwS1h1QlViOUh5aFNROUFBUFRoVVNDRURwUi80SVluTm9kSldHK1JGTFBONDNsQlFraG1wVGRnZzROWTc5Tm5FYzhrYlFYWTQ5Sis1bXdSMzJhWUxBWTM4Nk9DV2dPemQzM216WnprdE9jdWFXNjlLbFBPcTd4bHJlZHc1RUw0WWlXUzB2cVNtMTc5U3hzMmtIdmVVLzlZZkd0Znh1SUE5STk5VW5QbExYWG5hVEhBSlBxMkcvSXdGRGhKdjZFeWdaQXpPRkw3U3JSMm5SYmpITTYwa0IwL0xzWDVvc3h2T25icG9FM0JSYkFtRHFhRHRuVmdaV2pBK1RadEFodGhmQ1IzKzZMcEV1blFwZXRHTjIzT3phemt1dXlGVE4yc3V5blAzMXh0bVhqS3A1M3ZMdWh3WWdHOXphdjIwRWxyVjNkcHozOWU0TTRuNXh3YWk1dmUvTlpOQ3prZ25TVjNJQVpMdHlNTmxPNDhkU2dmcVBIbWpRU1ZPTjhnY1hUZ0tMSlR0TkhQL1pxRTZZcU9kMG5PYkhWYU1PeGt3VEVKT3JZSDF2Z2dOcldHdFBCRHN6OHY2Y21EK3JGQUhPbVptYXBMdnZDNXcwMTMvR09aNW5GVFZqUVREdzRkVDVBWmVDMmUraysrYm5mYmY3YnQzOHlpSE4yUjVlY3J0ZGQrblJaQ3RwUmNndFpTMXc2VlZZNDlSdFVieWIxeXhCdE9hOTZoNEZsRHNReG15VUdyS2VmTlFIakhraE8yeWNKejZTcUZoZHdIcVgyWFRVNXlDWmd6SEdUbUlJbm5Xd0tlYTZLSHRSTFllWDZLME1IZ3hPemVmTkRzenZ2ZkNSSHpuTVB2WmZjOU16QTdWdW9iSE5YKy9kZS9YOEhkVTc1M2c5ZXlOUzJrZkF3YzhDME1wZlJiQXBpcGFvUWVnbXFMTTd0OEd3VW5ZN1E4aThCSHZoaHZMM1poOU8rVE05NlNYOVhkZWN6NnUwNnJTdnhoNWNpbUExNVlxY216UWJuV0thNkIvVjB6VnltQmpyYytrc2x1L2cvVDhoc2R6N3o1dmZiTnJtQmJUMjRkUjJkbDUzOTJlYS9mUFhIZ3poZjkvZi9lSkg4NlB2UDFVVmdTekJoUmEyV1Q2blBmQ1l6Zm9FWjYwY2sxR2VhV0hHYmx1STgwNUxFMDUwK3RwYjhwZy9naFU1M0NWa3ZKRUN5UU5NNkc2OUhQMlAyTWFGMUlhekFnSDZmWUZHNDhjYnNvSjUzbXpORGl4WGFlVXVYMFp1RW9hWmpGbkFQdUMxd3pTL29Ibm4wdFoxWG5mT1JRWjNQWEhQdGsvVytHeDh1aDRGdHU5bU5waVhRekIzd1RFWk1hNHBwOHltSXhEa2NDK2hYelgzNFNobHMrclprLyttZ1RHc0dwa3lZN2xiNEVZOXhXOWNndEVxZHJxKzF3K0hIbGZ0TXhIQkpjK2UxT1lnbForNjhHVG1SN055NlRLaWdrZGMzcnNyaHhuV1VKdDgrOVZmdmVJdFpmKzk5QXp2aFZaYzlEenNsMmdTWjhobFdROGJsK21VTlovOEY4TzB4OGlIT0UxMFMyR1p2SjlEK3I2STFTS2JIL1BZNExGSFJlL1dHMWQyZmtBMlpwdjByeEdFNXFMT3lRcnYrM0tyQVVJWnMzalQrNjI3VmJFb3VtemZOeUlteW5WdkdwTWhjQmpHNFNkZTNicUZhczBuYjczdjN1ZG02dFQ4YzFMbjBoTWNzdHpmKzVFa3kzeVUxRy9VUmx6eHpnZWNzcHg3NU1QMzJXVmhzY0RGdTREK0daQkthaTErbmdUQjFvZmZ3aHZmQ2N0RmcwL29jZ2QweWRRRE1jZUdxQU5wd3p1REFHZS8yK2ppbEJ2Q1Z3UEF3T3I1ajRGTWFCaW01anUrWW9WT0owQ3g4R1FzRGQyekgvdnhlMnE5Nitidmt6anMrUHNnelZjTkxIOHUyTzQvaGNLRG5BVmlJWTE4VGlnbUZpbFlKc0lJVHNnQ1hHOWpIZk5QQkJuc01iYVNzQkh1M0IwWFp3d0daN2cwcmRiSEtRbDNFSUxaSnZ4b1c5MUd4TlVIaStpNUltUzFZZkhBellMWmc4Y3ljYWRmMmlxYWYzSFBIL2RqYjc2WHpzalBPTSsycDl3ejhYTGZlK0VSNms1bTJRSGM1SjlzVTRyd1FFOWd2dUlsQ1NseU1xc3R1RnZybjZhWVNWRzc0Unh3Tm0yWVRCbkNsSUlzZWJ3SzI5Q1ZJNDRFNXpnc2ZUN1pwMGxaZzNVejlUMW9QQy9kQThrYWJZNDY5ZjE5djMweEt6akhIenN5WjdyeHRpcXdKYXllb2ZyYWV6cG0vOFc3ZzNFR2ZwdmZTM3h2aGI5NzFHT1k1a2pEVzJYOVMrRUkvNHRmMU5YM0drL3RUNE5qUGxlVWpib2lHdmQ4L01SdmpzWkNBMHU4WDdiYVU3YWJ0QXo3YzRwRWFBQ2JpZm05NG5WcjVZMjBZdXFOZUpNY1hQTklLRjlaVW9BMnlmTUhPM3VtbnpZeU45U0FsNzUxKzJzeWNxTHQ3SytPS3ZlVmVPczkrMm50b2Q4NDlJQ2VxN0NxMi9PSUVocW1YYU10dzRaNHM4WDZqbTVpdzRCeHExUnR0dW1scU5qRFlOUHc2a2VpUjFrQ2F0ajBjTUQzRks3VUZ4ZHVDNE9OOGlZMG9DUmpEUG9FeFJiQis2RkI2a00xZHNGa3JlMURYaXNtbG1wazRaYjVtelFTN0p1Zys1NWtmSzEvd3ZIY2RzQlBkZVBQRG1kaTRtRVdnSFdMOVJ6Zm1teVhoRisrQWhEaGNDMWZkTktObW94QlVUaVVBcEc5VHNNV2tCbHhmSm5NUzNwR0VIVVA1RHNYM0tRbXY5QjJiVUcwYWlvbW5keXJZaWtiQ05SYk1uTGtiNWRwcloyYW82MEZLbmw4N013dDI1N2YvUEdzLzcza1hUN3ovZys5aWo2YzZPTWx1L013cHROc3V4dHoyenpVVEJ6emp2ZkFzeFA2a1pxbDV1UGtkNmNEK0x4UEZneWRSeDZIeWFXRElsUDNTTEpnQVlJdnpkUGQ0LzZleG5abDJiTi9IZ3EzUVVoMGVnOG92SFFPYTVjczI4cU1menN4SXc0T1VYSDcwd3hrNTBlUnJYL3Q5aEV2ekcyL1llU0RQSTdmZmRKU09nWnVrb3c0WEJtTEl4WmlFVmZ6REhsYVlHNEs5aVJyZFk4UWpnRFBZYnRUL2pxQk43TDBBbkQ0UE5qU2w5YllJYU45b09pdXVMeUUxNlV0b3AzSXFXWTJndmgvYWc2d0MrNUJqRDJyN0R5QzNENWtaSjhSY2Q4TWRlL3U5OThwWFN2R2YzMi8wSHZISUh2dFpadGFzMnpES2xrMnJwQW5XUDBBMzJCRkdQSUxxVGV3L0E4d1I1MjBtcGw3OEl0TkFtRG9nU1JMMUhxUSszUk5XaUdYWWROcnZhUnd3Z2t2cUJJUG9xWWNERXh1eEVqKzBxUzRHS0xqUVV3Tk0zdGpud0g3bkdVOCt6aTVmc1owQlY2VDRaWkozWHZYS21UalBMNVhHWlplZmxmM0xWMTl2NTR5OUgvaXYvV21yT3ZYMEJkbmsvU3ZJcUFzYUJBQkc1NFAraHorTWN6d01qazFrR3BEQ3FFUUFtZUJVZUdDMVZGMEhObVBhdHNCd1NGMkNJNEFyL0o0eWEycjNLZFQwT00zdFZuWEp2RldkVXFJVzZJQVpHU1hmdE9IK2ZiaDlqTC9ubmEzaGozLzBrMnphdVFaNDliNGMrMkFsSC83UWgyYmlQSHVWOHVuUFBIdjRyWC8rV2RhdEg2MU9lL2dON0NjQWpTMlcyZmEyQmN6RkIySnJvcXZIZmNQZUhteStSRWZOdmNuTWN0bkx4MEM5VUtIMjR5SUYzQjYvSjJvVC9NdzcvNDlzMmpIVHd6c3BHRk1kWVhIc1p3WHdnZWdLcEFzeVhQVHNZY3YzQ1lDTk5UOXI1ZXZ1WE1wbnYvYU05ajkrK1p2TXdHSTRlWG5xeklSaDlwQWpWNTNhZXMzdmZpRHIydEZxMVJKc09iWGZkV0RNelRjdmtxbzloRi9kb043Z3Axb0creStvdUJZd0YvZDgwMG5ucVVmYkJ6N1BZR25BdWU4VGdLdlQxb3p6NTR2aEUrcjVKbW05NkwyaDJSZ1AzdVNOc2w3WEt0RERCYUNEZUNlRVZ0RzFTNWZzMHpCYzY5S0xyVm0vWmNKYTBLOS83WStyQ3k2NG1IcTYyQUdSdkR6N3JBUFovbDdGZG5WazVIV3ZmSi9ldFhxVlBPR0pWSGZjakJiRmZxY04yZlgzelJYUkloS1lBV1BTQndwOXM4aEdjYlBMMHZLNDA5a3NxTVBna1ladFdjcVM2b0VDb0g1YmF1aFJPeHlWQjQrbzY2RFZmdFV2QnFqcXVjbVYxbjFPRXljUXQ3aE5OM1JCSXJqVmd1UU55K2pZUG5uQWV2a3QydHU4eFdaTEZ5RS91dlRaNWw4dmVDbndUL3ZTeHI1S2J2NTE1c3V6TmUvZjhvZjY5WDk5cmpsOEJiU2E2T1E0VWpUMmU4elN6R21PYVdjeTJtS3ArOUEzbWhFU0RzWThDL1h0N01FUmF6d0h1NCs2Ymt4UXhSRUxucVZrZWp0UVp3ZFF0NVAySmJRZjhScGVFSFY5Sy8zTElvWjZiVGwvZkErbzNLVDB0QjBCc0pYUW5vb3JrendRNlQ3cE9ibTk3dGFoa2N5UW9aU2YrOHhyekxmLy9WdjR3Y0FESVRtLzhSc0hxdTI5eTdxMXA4ci9kOFlmMndxSzVTdWgxNk9xTEpJMzlqOWd1bkRPWExwbFgrVzArR1JEdFN0d0Q3ZUZHK3lQd2VGRWZWTC9FMUUzR3BGTEhkV09BRXhVTmREbk1RZG1SUHJMZVFUYkUzeTJjOTlyNHJhSFNWb3Ezc05OR0RCNDhXcDg3ZWk2MzRHd05RT2RhcmV5WFR2bTdjdnQ2NTMrcElWMEpwZlFnSHpGQWlZdnUvU0oyWVVYbnNFQlhKMHpsd3N2UEZCdDd5SDJTVTh6emYvejNyZjE3cmg3NWRDQ1lWZzJIOTI2M1kxaHlnQnFzVTJPRDBzWUMwMGpLTlBMYkJpYytzM0Nqc0daU05ScVdGQW1naTRBa0lUOVRBMjA2U0FNNElQYTRRZ2hHSlc2Tm5RcE5aaURYUmNXdmxGeHBVcGllOFlsVTlqS29TeVdFNUVheG41R0hOdnZ6eTNtaUgyNWZYTGROWTlnemJybFBQUndpcm5EY0FmWWYvckNLNHAzbmZjTjRJQXNMSjFuUngxOUlOcmRxOGpsLy8zUzZ2dGZPMHNhVU15YkIwdGJzTFhqTUZDVjV0YzI4R3VrYWcwTjllVjNoOWhhYXR1RFN6b1kxaHFwVnYxRFQ0ejVNTElReXJNWjY4TXZnUUdUZHZ0WWtGcVZCbkNHbUY0NFJaallGTUNzZ2Rsc3pYeHgyYTV3emdUNUpnZXBnQ3ltbDBrcGlHZEJXbEJ1aDlhMVAzbmE1UHMrOUtuK0MvdmxrbjNndkdmSnJrcXlwZk9RWWNVTVEzbkZqNTZTcjF2N1JPRGlCOUxHdmtxdTY5WWVpSGIza1BJeGoxOVluUHZtUCttMWxaYUFMSjhEWXhtWXlwczdkbVIvejJIR2Q0NXE4RDVKL2tiMlV6ZTVwMlZkY1VCTjJDVVd4QXcyRjM3V0dVNEZCNUQxQlorcEFUZzlWZ2hFV3lCTUpncmVyL0dnajBXTkFsMzc4ZURBb3RiRUpJTzZKTEJmUnk0czRXVjZZRnlaWHFQcWZLRW1sTU9nMzcvd3VjMFh2T2hwd0srdHdWY2VkY3hqN0FVWHZMZ3hEMlRSR0xSM2tDMkVjdDN1bHYzSlZjL2pRQUhRemxCcGp2ek91ODZ4MTE1NnVoUlFOQXBZTmdLRklFUEczZC83N2x1NnYrY3drektxR1dpZ21tQnVoV1RQTUx6VjhodGlxcnNtak9iUkY5YjhDRXV0cGlwWUVtQ2w3Q29rLzZBZmVJRmhJMk5hOTN2bXp4MUdOdUw0dExjZFF4OGxmTS85ZGZneXdvMEtxaElwZTJSV3lVUXhEYWptUVhmajVwSFdCOTcvd2ZJOTczOFo4RXZyOEZXSHJaclBYLy9sdTNYTitzV04weGJCeUREczJvaVo0OTVSZThWbFR6UG4vOU44WEFHNWdVck9hMTQ3NkRiM0VGbXovbWg1NXgrK3ByTHVlZWJMV2pDbjVXN3dhSTQwZ0h2dlhXWCs1RzNEd0lOeVJzdzltMFcvOC9VUjlRU0JyYldZQTQ5bnUxQnJ1VThwQmVlRSttRUg5Z3ZPUzB3MlNOUnduMnFYUHV5UlU5ZVBtUXJuazJTMEpIUHRHZitSakJnOUQ4d1lxbTVsdnU2R0NMSCtSbWFjZVZCNDI3S3laRk1UR0t1WURPeW9xL1BFMVZjL3lwejM3Z3ZrSlM4NTErelljUkhUNG5yMm9jYytobzkvN0x6ZWhkOTU3dEFxS0ZhdGNPZWNtc1MwZ0hsZ2I3djV4T3lPbno4SytNRytQcGRmSjduYzhmTkJ0N21IbU10Ky9FcTk1K2FIYXU1V09tQmh3MldKcXNLY0ptWUVkTk85RDYzbUxGaUpXOEpsbjBVMlhWL1k3dFFJaVNubENFbDg5b3NQK0lZQ2o2RWttdnBxUHZVUWhXTy9RcVlWelVxOWFWSVBwOThHRENBZXdSVVptc0k5OGxpK1RldFVyT245UzhNNXNHZHhwQkJJcjR6clh5UFlpODd1TUZiZDZ1cVZRZzY5dWRBUklidnlSNmZrTjEzN05UM2hwT3ZzNmFkZnA4dVdiNVhkdTRibDFsdVBMNy93bVNlVzk2MWYyRndDdzBjdWdqbUxZR0lTMmk2Y0pRdkEzalhlMHF1dWZEb0hBb0I2MVlGZDlWMmU4c3lqdWZRN3Z4UG1VdWNMZ2VHQ21HczNPa1MycEFGcjF5M1Byci95TkI0a0FLdWpqMjNKRC81allScjdEZG91QWticFgwekdlRUNFUWY3dzhBdXBDLytrbnhoNm9aLzUwbXlYWE56NGNzdi9aaVZoVzZrZGtYaE8vKzh3QWhqbko2dGZxQkRmWDcrakViZHpKVkNFRkxPUTU1aGg4b0xXMUc3eXNrZkhRSGV1VWpXZ096N1o1SVpySGk5WFgvUDRjQzRWTUVNd2NoZ01MUjVHRnExMDV4Ky9IOXB0OTE0TiswdTQ2dktuNkplL09zcUExMjNKN1J2Zk9NajI5anpCNTg4L1M5ZmMraEROM1pLM1psUmNPZHdDeHo3TkZ2bUsrY2lhVGRoYmJuZ3VEekxtcEs5NnhrSXp0WDFGc09tQ09TYXBYWmFwWDJBd3VMaCtVd3dVUzcxSVlFYkNkc24zNlhHN0ZJaGhKdHVRQjR1Vi9yeEJUUTRJS2ZjeE5CTTY3SUdwdHA2VUhteUp1T3FTOFNyWTJ4bHFYTFozMFlDaFlXUnFsR0pxa3FJN1NWbDJLRnVXc2dBN2hwc3Iwbk9INVUyaE1WYVF6WnNEODVkQVl4akdkOENPYmRodUYrc1haTkk1VU4xNjh5bkZaWmMvQXJqc3dUeWZYeVo1ZHRubGcyeXZUNnBIUG1hUlhQTHRzNjNpRmh5YUI1SVpwenFHTGI0RUFHYnBBdkw1bStoZGRzbXo4cmVjKzNEZ3BuMDlsMTUzN1ZFNnZuVWhZNkJWSGI1ejQ3ZkJpVEQxR0MzVWpvbnhlbE53TmxXMC9meStKbkVFZ0FUWnRjMW1jQ3AzaU5ydVZId2cyVXdET3JVdG1NWWd3MitLQTFYUG96T0Vhb0l6SStvWU1BKzVqWm16RS9NQ0drMW9Ec05vRDdvZDhtNmJ2T3lDN2JrYm8zajA1VzdONCtZUXRJYWNTVFM1R3liSFlXSVgxbFlSNjh3RHUyYkxDTmRmOTJRR0RVQ3V2MjZRN2ZXSmxPV3orZmxQSG1HYklFTmdoa0Z5NDFtaWRGWnltY0c4UlRTT2JORzlkZjFTdmZIR2M0QTM3ZXU1ZEd6NUtiTHIvaUc3MEpGSDlCdndOcElZZHpOREFmRHBuM0JRSGh3TXJkVmY2cVJNVjc4aDNqZU1xMlNRN2xocFVrOEc2c1ZudEQ0K3RSZkNYNE1yUWw1Nm14QmJPMENwTFpyNU5rTXMweXFZeXJGaG93R3RZWGRkMW4rQzRSbVNNMEpYYlFXZFNlaE9RbnNjZXAzWVRWR3ZoZ0Y3KzIxUGtMLzljSUhqNW9GSXJxOCtNR2xmV29uSjMvMFhaMm5Ib25QQWpQbHJ6cjE5bFZmdVpsVUtRM01vRGx0T3ZuNDE1ZmN1ZUhYK2dVOS9sMzJJTytuaHh4WHkzcmM5UXh0dWdFREtjSTg5K0V6bVZGYU1wMEhNOHd2Mm04RXhYNWFHU2dMaXZFelBrSEVOMVdvM0x1L2dOOFlWTTVOOTY4Ym9teU1TRGxPL1gwbWRvWk1NdDBVMUhiMXBTVjZTc04zVzF4Y21MNFYyc1I2czNyT3VTdWgxb2RkeEFPeTBVVnYxRlhpZ0FReUR2ZVhHUitYMzNYc004TE1IK214K25lUnkzNzJEYXF0UHpOYWRqNVpiTDM5YU5RVGFjZ3dvVUk4cWFBbXQwcW1ac29CRksya2R2WWxkdDI0YzB3Ly8xWWVMVi8vSlM0RUg1S0xidFJ1ZVcxMy9nK2V3bUhqVDNLQ0ZRT0VYR3d6aEUrTlJGMVB6SVQ3RUFqL21hK3JZWDNBVWdpT1RxbDdCclMweXJOTkE1bytKeWFZZWVOTlh6VXluY2VvMGNJWVlZTWljNlpzN1BFMkNQUmxWdis5bkJGNWdTZXZVY0dWOXlZZ1M2SUx0UXJjTjNTNzBTcXhxLytreW5CcGV2MjZwWEhycDZRd1VnSmRlT3FpMitrU3E4dW02ZGNOY093cU0xSXp2N0tzS3FoN2tKVFJMNSsyTnpLZFllUVRENHo5ajR2YWJUdEV2Zk9JcjVxMGZmQjN3SzIyRWJQT1c0KzM1Zi9jZWxkMDV3NEwybENMejVwSHhjNEN6Z2pnaENXcjFhc1V4WXdCZldJcXJMOU5GYStCRk84Ny91NEVIbjlRUFB5SE1PdjArQVZocUMwYlBPemxma0hRU2UzQmtnbjBvNmIvOVh4c0MyWjdsRkFmQXNOYUlXZ2U4cXNMTldpcmRLSXJ0Z1hTZGQxTDJvSFMyWDF3eUpVU3BSc0N1NzJIWDMvZFk0UHhmOVV6MlJYSzdmbkQxZ0lMb2I1OHpsSC80cjU2dEFFMlFwdE1LYm41dVVBT2x1L2htQ2QzTUZTcGF2SXFoOWk1c2VSK1R0OTd3cU95djMvRGR4dU9mOG1sOTdGUC9SU1ozM0VWcWU4eFpOTWRPZEo5WGZ2cnYvc3B1dWZVa2N4aFVQWTJsa3pOalhBWDhvdUVaclI0MzlZbUN0YUdZaVZlL1VzZitVbEFFVmdsZ0FzZmt3N2o5WTdhTDF0dERhQ1U0R3VIZmZvUW1PaGRoNStscVBjWWV2YU5VWjdZbXhsbTZUV3VnZ1dlN1lCdDYxbFByV005VVlMcnVHV2pQM1ZaVEFpV3F0dGJXVXVPWmhuTWs3Yzl1UFZYTy85SmNCclFHWGE1dmVkc2cydWtUdWVIbWsxbDkwNm0yQmRwSTRyYkJDZERLdlcyOUhoUWx0REszQ0YvZWhLWEhNTkxySVBsV0p1KzljOW5Vdi96aVhlYUs3LzlCdHZ5b20rU29vOWZvbkxHMjJiaHBydDU5NThuVlhYZWNSRyt5TUVzRlcwRnUxSTJlR1VFS0g1YkkvVHEvRXFaa0d2cW5aL3ArNVI1OG1RZG1Yd2FOOUFNa3d6RmZKdXhSdmlQT1pxTm1xNGdmN2NOUjNEK0FORzVRNTQySE1XT0JPQjg0N0JPcUpLaTM2Y0x2VldBOHZ6MEFUeXBmbzg2elg3RC9LZ2M4VEFXaUtJTEc5cEwrQzI3cGg5VjNQN1J4M2ZYSEFnT1p6NXRuMTEwL2lIYjZSRmZmK1FTMmI1cXI4M0hGc3FGKzBBYkFyOFhiN2JvM3NaRzV0S1IyQnEwUldIazh3L2xxaXNaRzJ0c3FldmV0VzlKYnUrNlpYUEdqV0VNUzQrektiQUVZbEVLZ3lJUThFOGQ4alpaYmhMRGhRWmpsM2pBTXFqallkNTRCYzgrR0tlQ2dYLzBHZGh1V3VtUUc0ZUlTaHlVaHBkckxGVDhDb2drd1V6Yno5NmJ5djJYcUV5YTBCbW5hY0FDZmdGT3pIb2lTcWwvZmpsVDFSMHZQaVA2amxUdmVXTDlZZ0Vhbk93eG54a3JFdzZBN3RzN2x4aHNmeHFBQXlJMDNEcUtkUHBIMWR6MU9yV08vT0lFbjNIUXpqUUdsQzAzajlHWnAzYXJnclZGWWRpekYwQnlLdVp1b2RveFRUdllvdTk3VUNWbzBjK1pkM2hDeXpJL3pOZk42ZGZObTAxZEQ5WTVJSG8zRDJza3dIa3haOGx2Nk1Ra0FyYmh4NUJodVNXa3hHUDcwMjJ0eG0vL05TRElNcC8xRGZWR3Q0dGhxeExyRnJIdWhMVnNEcTI4dE9YOVB3NDBXbStRNmVtL1hlckNWSHFpVlowQmJ1WnNxT05idFVpOUJFWVkxOGZlOENYWlREN3Q3NThNSEJCVnl1M3NncWp5S2ZjMGJWaFp2T1BOUjFvZEVJZ0VZMEV3Y3VWVFdBYkRxUWRsMUczTnh3ZEV5Y3d4VU5HRCtDaGlaUjdad0o5bnVYVFFucDF6SW9QUnZyWWdEVktoNmxlZXVCRnNBWEtPb3Qwbm1QT0pHc1AzODM5eXI0cERyUndxOHhGT09OZnNrQ1NKTHY2cE5QVlNGUFR6WFFKVEI1Z3ZxT3I2WTFBNkdVUmZVYnZsL1YvNFQxSGhnU210clZyVlZmV3d3T2l2ditkcUtPT0c5S3Yxdi92Z3dvVDJqbnV1aVdrZWhnaDNvcXhucnoyNDd2amp6ckFZT3J2c2xlWDdpU2Z2YlJwL1lTeTQ1a2UzM0hXYUhuYXFNQXdqcW4wZFFLU0grWkhMM29DM3V4dVhXNThINWc1dkRUcFdPeklWT0I3b2RGN01xZXo2VTRHK1k4VUQwcTRpN2txakpYekdPYVRPVDJJTEJBVW5zd1QxeXJCSTEyOEs5S0RGQndPOHpQY3dTajBzWXJZN0wxTnREV3BhbzYwdVZBbEtjbmRuVVpDWE9CSHg5ZWo0Sk1rY1ZIUUNYZkt3UHZ3UW1qUjQwZFNKT0dDbVMrdDBMVVNYMW8zNTJ3MzNIbE1jZnZ4allidzgyTDQ4L2ZuL2I2Qk56K1k5UFp0ZjlUZWF6aDJrVXAxNVlDMlhwMUs5a05WS05CZkVNRnBaUENNL2ZaTjZlTTFEbTduanJLNGNyUHB5U2VWQWxqb1lyRHVNWlVOd25NRnhJYVFyZ1MrY09wL005RkYrcno5VEFDNkNLUUV3dlZPdHRLWlpEd2tIcUNhZjdoQVNOTUxMUndrMmFuL0MvQjZmRXFGUFJBVlN4SGM5MjRmY3F1T0dCK1pMZmdrY09rUWtWSE10bjFGbmJTZmREc0Y2M2JWa2kyN1lmeGlBQUtOdTI3MjhiVVhUQmtubXljZlVKNE42a3Zpd2xmNU5WUWF5UFJ4blBnbXA4WXFiL2lDVldNUTNaSktKK25RN0JwYUxqV0RMV2FURTFpRElQdkN6TW1mQ3ZiaUZlMVFjMURIRTE5T2s1ZnROdHdTSDhtaHpVMUpBU0hzbkZ4a1RFc0s5bmZXT0lUb2Voem53eDFOY2ViNlp2ZndFdXBldCtyWThOOFIxSmpxbjhmUXRxMWFwTFBadG5ZZExDVHB1d3FHZkxQZ2ZIblZSQ3BBS2lFeEkzQzlBQzdVN05NVmRlc1FyWTcvVmNjblBsRmZ2YlJoUWRtN09jTys4OFdxZlpmMjRqUGhzOTNDRHIxTEJramdrVkR3cC9Jd09RakFkZHJBcWZBQzR3VC9CYURjUVluK1FKa1B5K1Rha1pMNDBCeG9IalJPL0U2bG5pbkpRbS9ld1gyVkdTQ3cwZ25NYUcwL2N4SHFEaCtNQTZVQzhIWVR4UWNvVWwzdjdiQWZYeURKNHBEY1NBTTRtZE9NL0NNb1c1Q3V1VFk5UEFkUXJBYUVXNEYxUFF1a1lUOWEyUUJ0aXR1NmxHUncvYmQ0VHNLWGsxT3JpbHhHVGx5cFV5c1hWVk5JV0M0UnFlaDhkUk5KaXIwZ09sY2xGNXdhbmhZQmNHOW9vaERHOUhCWlpLZ1pCNnJHUzFiUmpxUUJmaXhtdERaa3dJdmNTSlJxWm13UWdrYnhvMHFHT0RFWmdrL1pENm1NQXlwSCtwbVh4dmVpMm56bndKQkNmcStxYmVEbHlPODFLM3E1dWZGdkNzd2Q3emJZNVp0d2prQXMrQW9pNDVOc2V0eHU0OTI5aUpxS1dUUGlmdmRoK0o0TnNwUWJkdGVjaXZ3c0lEbFZ5M0RiQUkwdkxGaDlQZXRqak1uNDczT0xLOFl3TzFpbGoxOWtvWE1EVVF3a1J1eWV1RCs0Y0oyTHZ0RkFCZ2FoQ0k5NmpCMlZORFVvUFo0QjJRQkpUcGFRSnJGcml3aXdtZ00zVTNVaHN4L3ViL3h1aDd3dWdXb3VjcTFHK2o0RUhvMlZEVmgxNENZTlF4OEZJUHBwM0FwRUpIM1lwVFRYSE8yNUIxdFc0SzM2ZkszNGVHLzB4WTE1ZElkN3FYMityNm9QNWRUOU1tQmVvaHVzMWI1ak1BeWRrOE9BQm1hOVl1cE50dGtmZURMelhDMWR2Sll0U3pYVkRGQ2FMaWpRbmpkLzczT0xTVk1GVjBXcFZvZTZWT1FEai9DSDZzTjZoYzA4OSthZHlQY0E3akhtNVFqOUV0TlBXMWhSamZkREg0WVRvbHhtMU1jb3hDTEZBWmhnQkQvQzFrUUpkZURZZHRCcGlqemp2dTRFRGEwNXJSd3owcHFjSHVmM0lqSytFZjBEZE9IQmdpbGd3aDNydVlINXRZRU5xQWJQT1dlWHZEd0w1S25nMFNnTG1aYjN0bE0wd01TdU5JMGRUdzMrUFFVZ2lVdHJ3S1ROVkxLTXhEOElpbkFTQ3FUUHJaTUtwRi83MFFWNFlqRCtyWCtKaVc5SWRqWWh3UTk2cG40Z0RZcDJiOVJabmt2Q21OcUg4UlFobVBQVUl6MUd3YWJWZjE0WjJnSDhVdnhScXVOWXpyK2lZTWpoRUxuSDFzclFQbzlCYzBCVmVmb1plZ0NmOHNTUGZ0djZTKzZuQ2VyWHU3dHM5akFKTDNkZzNPQ3phajJaaFNTZDhjaWRUK0E3Q0tWdUs5UHV1Q3l0RkR4UUd3Q2pjd3ZlTWhLR3djYUtNOU9CMDhVcXUrZ1B4UjlRRmtxZG1tendZa3VlRlNBNk9KWnorVHFIbnBmempUSldYblRPdWswZ2pVOEdiYStqcERIREJQemxGUk0yL2FyMUFaSzlYN2dWV04rRENMN2Zlb1ExZ25UQmVNSWNPRUlhbHZGMmgvNW5oNnZlRlpUdTEvTlRPQVhLZW1CdEVPQUxicXRmYTBXcDMwTTZDNmNGWTB6Q3QzWVVNQ0hRT1RaYTFTMVFNd0JKTlZmZmpGUDR5WTErY0JGOTdXQUtwQ1lENCtEVXk5eHluMXB5OUpWV3BISnNPeFh4ejE4QmV5MXhBTXRicVAvMVozN2w2NlhaUEVnUUQ4OEVUVjl5LzhGdDdpS2ptdmNVTnBtbHhuR0hJTDdOVm5EaVFBQ3lBTmZZdWhHT25mUFlhMTluSk5RUXlZcWFubVhyYnNzK1JtZ0FCVXNlN3hSRlhnYlQ1VFgzUElHTElXeENnU1h6c0xwb0lSY2JaUFc1MDNITVFxYUpMVGg1bDJzNFA5Sno2ZzdlbGpMazc5R2tuQVJ4TE84US9lK0ZoaGFMN2hHVEpsMWNCaVFSV2wxQkdBR1FCbXZCck5OREVIL0g3aFRUVEczWWpNZ3l0TlNvMVp6b2E0SEZjYXN3czJUcDlINitOL0tYT0ZZYnd5dGZXbWdUUnBOOHg3Q2hZQ1NYTmhkd1RvZGdzR0lEbmR3UlZSRnpGVkRDTm9ZZ2ZpTHl4RTE2MVNwekZWeVZ0djNUS2xjejI3ZGNMYkQxSDFhcW9laEhvZXJWZkhKbm5JYzRIRnRxNXVrRSt6L2Z6WVpoMEQ5SGRYeEFFd0RiMzAxUm1VYVFDRStHUU05WVVIUnlRTXNlMlIxUnpPNFc5V0ZqUkNRRUVBaHJoNFlKK05KeldvOFBjdW5DTUFMRmd2UGV1ZGxlVDR5SFkxR1B2SXp1emx0NzRmZnBVZDhzQWxIMVJEQUhsamVOS0t1S1JidjNnZUpCck0ramNyakJnSlNKcVNoS2ZIb2N5QmJSdjFQUDRJTkZPcjJNQ0NJVndSalh6Y0VOWXkvTUxQM3I0SzdKZHJiZmhQRHo2SHVGeVJiSXRnU3hreFhQVTBGUmJaVU4xNUNuVjJXV3pESnNjbGdJL2VtdC9jWi85NUNSbmJjYjNsMEova0htYStEeEgwdUZvVEpkUTFhVkxXcXlsT2t4aGhJTW8rTFJ6SXBZSkJyVU04MlBXQ0Z5d1pKODhxSnZ6dEMvR284RWxEVUlrNmRvdmxCRzlQWEdDMWxUbjIyaW13MjNoQTJ6cHNFYkpUSW5EeE9YUzRXTmhpZGFHWE1PUVc3TC93RUFPSVkyR2dCQWdoT3pxZEU0SlFGem1mQnNaVTBtR3VFSVBySmYrT0x3M0VhWklweSthUXhHdHFNSWVYTEE4dmkvOWZTR0xZRzFVSnp0R1o5SXdYWTVsNzA2dnVFemxSKzdlRVN3b2hIbTAyQjZJNmMyME94SllFb0h6SVVWdk5qVVhiakROU3RZRW1hS05tZkFMelpiNm1aNlhKOEtZbWFzRURyV0Zna1lGV0JlTUdlbWx5b2FmVG9Nb0xZRWhkbkd5QnVzQnpDRGdiOVdsYjFJWi9YODJYbEFYVlpkTk1CMlVZS1VuUjJ4ZFg4MTBMWmRhQ0dpeXFlZ3hidk9kZ3ZXRWNodFhDY1lKN3liTFltR3M0OCtjTXExb1YxQzlQdXZwOHZDOWEyN3dkZFNNZ01YL1FKZ2ZZdnU0SGJkOUg2a0dqcCt5bm9DUERBM0VlY2gwWmlEY05nQjV4ekwwTXpkdUZiaHVoQXAwQXlYR0pDVkJuQmhuaWhDME4xUU5DOFoxNEYvemYzRG92ZG83QWxIVVphT0hoR1hXZ2FpbU1pbHRrZWtUcnNob0JnTUgyQ3dIbllBZjJKYUQ2ODJVZXFDa0FKYXYzQzJEc0F5ajllaW9PSTNnd056MFFVcldMNzA5NDhjTDFwdDlqdjdUdW4vcVhNOHhobmg3cmlzNlkvOXJCM2JOUWhTRThDUHFaT2haZFVBalZ4VklOclZDUFV3UDUwTWpFQTRURnI1UThIOXJ2c254UnpQck42MmdzdUZmTTNjc0YwRFpvQVRLbmZwTkNHRWF0K05peW9xVzRvYmtRM3hQYkg2SVFjV1hJaG9KZThFR3lrTGJlRUQvWEdCL3hUOVJ1Wk1IRTZaZysrU2oxZEVPMlRCZ0ppVWtQaHJqUWpZUytoZmlrYnlQRUxhTXI2V21qWVh3cVZMaFJFSjJwb0JiTFJPZUZ2c1FTdnNiRlMwTUtXYndIUW5SMlFwd3d4Qm1EZzdMTHMyU2ZjeFRBbU5oSEVYd2F1eEdueFNpb256cUNnblNBNVNzSHNncFR6dktWZzJnSEFMdmk4SFhtaUlmOG5MdXZlUXdacnNQaFBSbHpURmpYUWxHd2dvcGdMVDRYUWFmZGxLQ2V3c08yWHBYYW1zRnlIM0tSQkhnaG5Tc05Pc2RhTCtsM2F0VWFnQmF6b3dQd1BBT2FCSlFTM0Z1cDdjSkliRUhOQlhzRFYwU29Bam9KNnlEVTVYZHRiWE9tUmRQVGRMRElqb0VWcWM4YnZXQ3R2WFdqTUM0dUN5WU5FMFVQT2RpWUdrazEzUlF5L0JWbk1aQ3VZNlhBa1VjTVpEcGx6cEZIREtJZEFQUzZLemJwRWNmZExFcE01UU5RWHg5UFJzRTJRRUlFeVk5dkt1TEdoNk05UktLRlBTUEdHV3ZoNGRqNjRZYzVFRm13bzlRbGJNWlFpOVlwVDJudTM5N3EvSVc2TUdIeWV0OVljWVlMSEFpUlFvM3hUa1I0T3NIK0M3Wkc2YlkzY2IrSHNkdWd5OExJUm5qSG9HYkJ3RnFLOTlqVkFia2tBWlRVTVUzVi9wVStkd01UNnAwM0Q5QytsVGI3Mlk4K0xSV2VFUzVienF0dkxTRnJBVWNkczllbDEvWlZjbzQ2WmhEdDFKSTFycE81ODlzeWVYK3JMNW14QzdxTGFDTFpSdkljRkpmaW8vaXdUTUo4WWhNMjhEZFR3S1hiNDRGbGNXc0IrKzlGVmdlYk0zK01NWFhTcTFBUHdjWHpVTWNLZzdPUlZsSVFRMXp3R2o4cUl4a2FNcnE5cFM3NGxIZlNLRVhwYk1FV1FLLzJXa1BjTWdRQndzMnl2bSt4UHJUVTlsZDhNY09MaUFjZC9XWmdEOWhlMVJuUTRhWE50YjduZnNqT2dwdUthYlUybFNyUW5nT2M5Y0VKZlBkbDd2eEpNenBuSUlVbGN6TTZaeER0UkxISG4zU2pXWEwwWFhMWGRTZEw1cW5jUDBOVmtDbGMyYThHYUJQRWUzemE4eW9tbUZRcEVBRzNlSXRKUUdnYzJFS1FPYktjMzU2WkpNd0NjVFJCa3Q5aUJFcXBKMFpCQkY5VXRZSDVmSjZpeVZEeExyWDZSYkI5SDlXbnhBcyswS2xlRmFodnY2blE2YmxwcUlFMWpkK08xbUdWYVNRVkFXcXBzMlg2WWkvcGQyQVhzQ09ZTkxoN21abzNIcFFhekNIZnBGclFMbWpIQTFENm02VUhzblRsZmF4WU1SZ0FzbUxGSU5xSlluYmR2MFZQT3UzSDVvN3JUcFpoWUtvMmVTUmNjTTlyaEM1dUxWOEIzYVd1OEhzQjdrRlFPd2thMUcxRnpCVU1Ua1lLcWxoR3pkWjJvQ0d4QmVrUHpmVGxBS29QVmh0aU5hMDRueVRNckN2UXVPaWh5K1ZYYWFDU08vTkJTOFJuOXlnVldJT29ML0lYcUNXRVVIbzlwNDRyZjMxQjV3WFc2d3RZKzc5Q25Xb1ZadEdGU0FEVWFGRjFLZnh0ZjgxS0V2SUp0clg3QkJOU0szV0ZFa3FjOHhpSVF4T3NxM3RtNXVSVGZsSjk4WE1iOWdjblFmTHFpNThiUkR0OVlwNzF2SXZNOTcvNFdxT1RtUTFxV04xTEhxL0ZNNkw2aWZxNkhYUW55QnpxVkthZ2ZrMWdpMkNVQngwUmRWRE5XTVpTRndUWFdoWEhkVCswSDRpaC9XQm5SWldiT2RDWmdsQ1JYbFAxUzRHUzQrcU9ORkVxeFBad0NxMTBESmhscURXSWVCYTAxTGFkRWNoN2ZtNnUrQldSL01lS1g0WTFPQ0QrcHVHWlBxanY4SHYwK2ozTDlheXovZkRYVzRiZ1hRQ2VSNU1DQVhnOW5CbmtaM0NtNzB3UTdUbjdUNTc2OUVzR2haVmNudnIwUWJVVnBYenlVeTh0dnZuWXE4MU5QM3ljTlB6RlVaTi9HTkoxejhOUGhHa0xkZ0lZVnJJd1pseHBYVEF5R0VwUnhZS3JjU0xlbnZQcU53QzBiMW10YWVBTGpCZHNTOVF4WCtGbno0WHNteXlvM1FLVlJtMy9JZjczRmlwRElMbXpYYk9RcjU2aFdpRVl5QXlxeVVJeWdZMVNXN1FTVjY0dXVLSXEwQkUvWms1dFlsaXZTdnhwVUg5OHVLRWgyeWF1TVJldTNiTmY2SVJmbjA2N1lFdGZpc1BXNzRqQ0hna0pBRXhDOXBEajd0SFRUdi92UVdFbDE5Tk9IMVJiVWN6NHpsMDg4Zm5mTURmOThIRW14NzFoL2o0bzFORjB2K0tBR3R3Tm5mSW1FL2pKUytyU2owSm1pemkxRmdjcFJkMXZKZ0ZtcUlJVWIzcEZuNDJZR3VvR29tVmZpSnRYSEtad1prVlV1MGpEQXk1TW9ST2dnWm9XaUpzQXJSSjBWb2JneHJLVkF0R3UyejhjWnBNYjRheC9CL1lBU3BTWXNoK1pINkxCbHM0M0NXYUgrbi9IdUtiMUVZYXFObEdDQjk3MWYwdDFTa1Exa203QWU3Z3JxZXJGZ25UQVBQUDVGL0w1ei8xaVVGako1Zk9EVjhFQSt2d1hmNVBEVDM1OXR2R1dZMjFSZ3pBTjhTaytWR01nS3hVbVFLMWdjMFZ3Sy8vRW02Y1d0enlWdTNsUnJRYjlIaGhTYksyT28xTVNQdXpKaE9GVGVHZENqRmU5dVFkZUE1WENxV0ova0dMOHRpR1FGakdUUjB2UXJsZlZ3Y2JLTUFncXhqR2k0RTVZK2VzeXRyNkdtQ1V1ZmFaZkhKb0wyVGxoeGx5Z3FhQ1dGWGZlQXFjNVZOMTV1dXBHWXJyV3ZkQjQwQmsvOWx0cHpYNjJiaXJlV2dHZGhIelo0dDM4NW91L01raWM1UHptaXdmWlhoU0ZlK3pqWC9BVitkZGIzcFdOOVp0c0NuSFF3UHBuWWdXeVNkQ3VRbUg4YWxYQlh2Tk9TSFEyQXRqOGd3blp3OU96UEdMTVVCUEh3enNuYVVBM016VUFqUWViRk02MkV4KzRsTUlCVC9FQWFZQ011TDlCcEhJdmlYWUp5a3pJM0hFK1poZ2RVUk5HVFVLTXpqczlvU3BFZEk2a1ZxVXgrUlJ2Ukh1bnJOSWF0QllYbkY4STNBTzBnM3EyTld1cXhpS1VhalJXY090VHZXbFlTRUYyUTM3V2k3N0ZsNzgwNEJyUlgvN1NJTnZyRTMzcGIzOVJMdi9lMldicnpjZVpGbFRkZmhDQysyN3g5MzRTekJRd3BsanZyamd6VFgyNEpRQ0lPckFzUWMxbWRZUGhUM3lWdzBtU1R3amVDcTQ2VjdEL1RKYUFyK2taTUl6emhlTnkxSXppY3IxeTZzWnh4Mkp3SmRBc3FnYnhveHNhcnlsNU9lSVFwTHJqMU5SZ2t1Ukc5VTM5VEY0ZXdqVUd3OXB2T016Q1puV0xYblQ5aStsSFM3UUViWUlPS2JyVDRUaWFuNzZKK0h3TTZDN0lWeDIyamRlODlsUDc4dndmaUJ6UWxaSVVWdXR2bnZNUDhnOS85bEhUd2hWcTkzR3NvQzN3TXlldEQ1N0tPTEJZdmEwdVh2c0VKRlhKQS9BSEJ4VVZiTDNBY09uMFE2QjI1M3hid1c3SzhPQkxSanRNamxJNDFTdEZ2KzBuZUxVN2lvc3NhNzJ0TDVEWklhcGhJODVKd1hoblZwT0F1M1gwRXp6K1VOVWg5ZVNudjB5cXhNbjk0ZjZrS1N0V1hXTHZ5VGlncjdZdUxsZzUrODhPSy9wUTBOMWd0L3V3bzI5eStud2xyUndwTkY3MTBzL3kxYThPZkYyMzNIejFxNE51czArcVAzM0wrZmtsMzM2eDNQbmZUekZqUWpXbDhmbUhtMnJEaTErQjNRbFpEMWZhVGRWN2tGb2pOMzN6UXhhMEpJMlpFR293Q1R1R0lUWGQ4OVB3NmpmRy90S2dzMmZGdm5NNDc5ZlBWaWVDTHVxL01Md1NTdUVDa3FOcVhVa1N5VUE5b0RWM1ROazNMeVVFcDMwTU0zZ0ZKZ0daZXBXYkpjeHV2Q3FPb0ZhM0ZNYkpGaFpaMkdSaHB6cW5ZeW5vcUdKdjhxOUk0dkhHeVljQmlOdWdlTlJqZjhxcnp2bkVmb05oTDVMenFuTU9STHRSc2gxYmR0bVh2K0gveVB0dk9TM1RiVU5hRU92cHhGbVovdmxaQTR5RFRJQnBLYWhnUlJIeElJd2VZUEIydzRNejlXOHhIU214LzJJMmRiQUZmUnVGZ1ZiTDIzd1pNYVluRFpRQ1YxMHpoRjk4V3pSUmhva0FqSWtTQVlnQk1TMXZDL29ZbE9BZERvdXFqeFdLVHgwM1llVGYxZ0FLRTVyaWdvcWgrZkJ2djU4SjZqdVlKMXFEc3JMT0hseXVzRkJkUGZLZVo3dHR6dVFKQTRjcEFLUGpNUUg1OEdqWHZQVWQ3OUUxcXdkZnl4bklkYzNxQTlGdXY0d09YU1JQUGZ0VFhQakpQODhXZzRiUkVSTEt4OXZlYmJBN2dBV1FpYnBzR2FqbjZJUU01cGhnR1libkV0QVovTGJ3SkpMUWpPQit6dzBNdFNBUFRrWURNbC9RbW9ZSFk5Z1dBQ2k0d3RBQmdPRmswK0lWTVUwcmJMZTRKWXI4aFJySFJHbG96alhsQVJsR2Zwckd6L3ZWZXNkd0QwSWNNM2o0MGNiMXprWjR5V0w5UUhXcGI0Q1dpdDBOVmFkK1hhTEJFcDVMRDJRM05GLzVpbzl5MFlYZjNQZUgvc0FrTnhmTnpJcnA5bFd2L2JDNTdab255ZnFyVDh2bUMyVTdVY1ZBY0E2c0JYYUE5TUMybk5XaytNS1dZbXRqUER6bzROMkNCNWhuQlpQc2syWUNLNjdNMjdBdjRSdEdQR0xJcFluU0F0Tnk0S09ncm5aVmVQWnJVWmZWQ3AwUGpYdGJ0Uy9PNDhBWHpTdGZyMFpSMEFxeGxWZkZoUU5oVUEwTlgwWjNLcWlMOUJvaHhrUFRZSE5nd2pTWTR1MU42MnRTVmlXVTl6c0FKa2YxSFNLYm9QblU1MTVpLy93dEg5amZaLytySkxkLy9wWUQyWDRxRy9RTjczaWJ2UGYxM3pUZERmT3loaXVRT3QyOHM4WVp4ektPaS9GU3F3ZEpKeStsRHlPRVpLSnF0czZ4aUo2ek9sVlVaTkFzM0FwQ3hkQzBRSE1ERzB2NnQ5eHZGRDdwQUJmRFl3Z1lwV2EvRklBQlhxa3FUc2Y4ZXYyNytoZEZLOWRmTVNYT0NDNThUS1IwSG5uVEE3a2pMbzVIQXNRWUliYTErbzNGSzBQMmFOMHJkeDhWT3dIMmZ1ZGdoR2hPM0VGQXQwUHppS04va2IvK0QvK00yMjdaUGlnQTdFM3k3TFpiRG1UNy9kSXdQN1RQZjlVSDVNdnZmMysyeXQrK1FQbDRjc3RBdXM0N1l6RiszcDU2THV0ekIrdTNQdHFHMU1aNllXRXN4UGI4eUVZK2hGc3hzWkhZZkI1ODB1ejd0K0pIUDhpYy9VbU94cHE1MHdlVHB6TmdZRUdvd1ZwdlYxRkVhL3RQMVkwajEyQUtTWDhsWlA2bE1lckRDTDZkRU1RT2MyUDZRQmhZTkx5Z2ZyYXNxUE40dDNvUG1NVHVDejI4SDRyaHhidk0zMzdpenlxNGNYOGYrYStUdklyeHN4bVNzMzdudzdMdUY2ZHd6YitjblMzRFpWNzRUUmJuL0tsMWI2aE1nTTVQckN2QkRkRkJvb29TOWd0TW1ObmFXQytNQTFMbWk1V0x6d1V6RFI5MGJucXdOYjNhRFVWWEN0RE1xVXZBbDllaVRtY0pFNWRTU1Y2UVVNby9BbEVUODhHOVVoTEFabnVvRFBtNGMwbWRoZVBEQTZrWEgwR3FpV2VjaEhHaUE2YUVhcW1xU3FXS05WQ05RN1hSajB6NWlFNmNIaklKV2RXazhhYTMvalczMy9idHdUendYeTI1dWYyMm1UaFBMYmZmMXRQWC8vazdzenV2UDdIYWNlZkRzL2xDMWRVSVFnVkhNSk5RYlFlWjcwZWdBZ3RHUTl2VVJ3VHdHZThabzBsUUt6Z0NQcjRXeG5TbEFOUHc2VlJOejRwdU9YV05sWDh5YjRGbTN2WWI4dTA0Qm5Ud1N4a3dYZ0VheXJ1bDlDSWtYbGVGVWlLVXJoOSszUTRKc2Nlc3hFMm84WG95WG9iVzFWQWwrWnRxaFQ2N1VOMS80a1kvN0FhdzQ5N1VpY1lmYUFmTWRoaDU3aGwvd3cwLytkaitQZVFITG5sMnczNVhXZDEzdWVFbmQxZC8rcjQzbVkrODZldTA3MXVnTGFIeWhiakRRQUFXMkFLNkhIUU9jWVROcGN1bE56dXhoYUl0Q1BXNkdVSTkvZEtyWXhOQTFBQVRQRi9uL2Jyd1MwNi9rMUVRVmEvNFpJUGFwYTFCSDFrT0pQWUg3MnhROTFraEJLbWRxbTNnVml2S3dYcXpvWnJHc05IdXE2WmQ4M1MxYi90K1Y3WHVsd3pzWnRBTmlibmptOUF1bUMzUVBPdjNQbCtlODdwejkvZng3b3ZrNVIrL2VTYlBsOG9sNXV3L09pLzd4N2Q5bENGMWVRWUE0a0dXQStOZ040SWRvMTVkVlBjR3ZtQnNoKzgrSmxIYUdwQXhxTnlmWktBMGNBQm80bEswbmZQaHZGK3BuUTlwZXVBRjhBWGdwZkVSNm40a3EyWUt1U3Q5cXhabjFBYlBxOFJsekRnUFdMVkE4Rm5YWVFKVUg4T0c3QmF2dXRPNXZ2RitPSnN2QU5HaTJFeXg0MUQ5QW15YnZzbGhXb0pzZ2RienovNW05WjYvZlRNRFhJcjFnVWhlSFQzZ09TSDdJTlhSeDN5czJMVG1CUE5mLy9DNmJKRzdHUW8xRXlyb1JyQ0xGTHRNdlBwMUxvR2tWWS82QUVtdGZrby9vU0VNYjhYc1p1LzU0ajFkNnUrRUFMUm5QeVhEc1Y5U1VrRnFCa3d5L2NDN0s3V0RGR0l2aW1COFc0R2RLdnc4VWxSNmlEcWJUeVZEUXBwL21Cc0N2b3hkc1BXQ3ZlZmJpdDV2M1VVM2l1VGpxRmFwMWpqSExwWWc5STZ5YklIbWs1NTNNVzk1OXg5bVc3ZmV2LzlQZGQ4a3o3WnVuZWx6OWtudk5XODV0N251cHcvVFgxejUrSHllVVBhMEhoTEtnQTdvdldEbmdaMkRINTlYYjdEN0IyM0NkMXV6bjFGaUhlcFFaREpPcWN4UmZLWUxRZjBHMWV2L1JodlRzYUwwQlplbEJsNGZDd1lDZERhRTRrMEE5Um1rYnJVZW5DT1JFNGZrb2xNVCtpY3hKRkl6cXZkc293U204MndhcjMwYSt4bWwyZ1RWZWgrRU5uVnpzaDJhcHp6KzZ2eDFiMzBObXpac0hNVHozRmZKemFhQnBQWS9hREd3c2ZmR0QvNUo0MFBuZkt1MzdhN0R6TEJRMmNRZXhJMk15RWF3bzRySkhaK29xTE96VW1PR2hCSERneWw5c0RFTzI3a0hyeVk0SThIZUMrd1g2bmVFVDhpRWtRUnMwMVZ3eW9KZUhhcDQxc09wU3hYdnpOamttTVNPakhhbnFYK1AydDE1eWpYSWJIMmV2aFRTS240VWl4cWwycTVVOXpnblEzMlNqcTJjd3pGMDJMRzNaci8xbW5PNGQvWHEvWHVLRDE1eWMrK0JQL2ZVS1NmbFptSXloRHYzSXRXMTFTdmUvdTdHSjE3L1dWdjFzSGtkeFZEdkIrZ0d6NEtIdWJGaFZldTFuTmNwYVJHZjFCc3MvUUJvcU1IbmdlTkdsek0wT2h2cHJLV1VsWExQZGpYd3BHK1liWG9vSm94RnAxNTQ4Z25UT0ZNZzk0SFIwMzhjL3NQUmxlMG02dGV6bkhyR204WjhlTHV2SElkcU5lZ3VqUUZuVzRIWkNjUExqMXByWG5ET2E5aXhZWWJESVAyU3k0NER6NERaK0txWE55NjY0S205NHgveGFWbSs2bXIyQWtRN2QrWG5lTW1mbk5iODFvZGVFOUxEOFdwWWNyQldNZXNFT3dheVNDTzdTRjlnMnRLWEhDRFdxZUR1SkJUejQ3a1VFejk3QjEvNG5ySlNFbmhPeTNKQTRxeTY3SjJVd1VTdFAwK3FQcWVCRWxPUDlNUzRTSEF1TEZSdE4yeWtLZERTNFlzd2h1eTJxVmlxcm1MWHFBczZaOFRaZE5rNGpDeFpObEgreWNmZlpPSEtmWG1PQjBMeThvU0hIL0NUMkdWSDNGTGNjZWQ1NW12L2VFNzNqRFArbVNlKzRCUEFIcmxsRTcvMTVnL08vY1ZWVDdLM1huWjh1MW1UbWZvY1Vkc0Z1UmZNTU9qY2dPRlVwWVV4MitRM3RkQ1pnS0dPcnk3ZzdTempnYWJ1MzBxSTdhWGdDa0JNSFk5KzVwTzB0aDl1R29IdWxmbWtOc0NpWjBGc3AzNkpBbnRXWHZWMm9acWc5bnJUL0JWYk0yMEFwN0ZVSGFWYTZ3UE8xRVdHbUlLUmtSeDUyWnZlVTJ5ODlac1A5bmtPVXZKaTQ2MEgvQ1RGeGx1djcvNzI2MTdTV0gzUDF4ci8rUFhmTG0rNS9Bejd1S2Y4bXh6N3FIKzB5eDk2T2I3SVdIN3IxWGQxbnZtYWorVjNYZmtQUnFwWXRTTEdiblBRY2JEM2dRdzdVQnEwbmpzaWZqNWhmT2hlVlpZZDZJMURjd25PYXd3OTgwWm1FbHBSc21rcU40QVErc0dYZ2hINlNUME56VXovcEZLclRJbDJYVkN4d1pNZmg3S2RnRStUNHlvZmNBL0RlcGFxWjZuV0t0VmFqZE1ycVZ5c3IyVWhlODd2Zkh2cTlEUC9icDhlNEFHVXZIUDZtVE4xcnV2TnkzLy9aZktWTDMwNXYrNldFM1hMMTE2aHF5NzZyZUtVSjF4c0gvclk3MVNMRHI4S3VKbXB5VHZLeHNJSm1kdzhJa01TM2w4L1cxSGRrcS9iUWRjcmVyU2dKbmw0SWN3UldNbGFZdjJYN2s2b0pxR1k0NE5mRmpjZ0ZnQ1ZqdTBtZjlVRCtaZUJLaVNIaHUyUmJ1amZmNDhTQTZra1FlVm8xMVZRN29idS9mVFp0bHJWZ0l2N3VoWFBiYytGVzZxMTFCUExyYUNWa25XZ2VjU1J1OXJQL3FPUFNIdm5qTWI2ZnBYazB0NDVZeWZyUGV1Wk4yU1ZPVnYvL1J0ZnlPNjgvdFJDN0JCYnZ2ZkMvTm9mdkpERGo5b3FyYkhWNWRhdDg2Zkd0NDdROHFHd1lEb2x6MWRGMFMwR0hWYjBDRUZ6OWNtZFFreGxUd1BTWkZCT1FHY2pGSXVvaDFwc0hlNklKd2wyVlQxOHB3Z1NxcGlHVHFSZmszUi9qZTNZdUwyV0JHanBSVVVXOU1CVEMzWVNlcHZBZHZ5dXdjTk53aTNTYzcrYkN0dXpWT3NDODJrOTFkWHZtbHVRSXg1NUZjMlJhUHFVS3hvaTJsNlFYWHRUa2QxMTF6Wm1PQWdOa0dkWHpVdytZSlI1M014ci8renN6cGMvOWNYeXBzc2UxenJxQ0hSaWl1cW50eSt5UmhkVkdTN2ZNNFRGYkEySldMMGlkdzlkTmdnMEZUbmNUK0djSHVKSTEzWkRvTDBKR2d1UW9YbUFZckdJenpyUmFGc0pHdU44NGhFVzJOVUJSdWtQUCsvcDJxZEI2SFM0TFB4SlF5YldNN2dyNTJFb0hiREtUVkR1U2t3TC94R2ZxaFc5aWhMdFZ0aTFpbDJuc2ZocVBTQ2lMbDJ5Z042Nlc0N0lydi9HQzJTTWJkYnNQcm0xTGpzdHYvbWEwK1M2elF1cjQ1N3llbURHN2NJODJ6VEF0ZUllc0d5NTA3N3AzTE9yVDMvNE01T1hmL2M1UThjZFJYUHBJNms2MjdEVmRqTGJvOXN1bVpLeVhrQTUydlhPMDNUcjBTbTZ5V0FiQ29lQktYeGNVT2dIbm9BTC9QYWdmVGZrQzZBeGh2aUhQaTBWd245TkIvbFRGZ3pidy9mcHFyVUdXcXk0N05QbjZ3ck00V054cEJNQTV0ZEhLWGRBdVptNlNGOFlCVW5TdEtqQWxPaWtkUTdIZlZCVkdnc01CUUNHbk5WZUF6cjMzWGxjNDkvZSs3VnNyR256cm0zbTZ5ZGhUVVh2YVMvNWNmZnh6Nzk1UHgvcWc1Szg4L2puejhaNWdlNWE4NjRQLzNiMW1SVWYyZldkejd4aTZQQnhobzg2aVd6b09HQ0sxdFJXMkgwM0UrSnJZU2Q0aWx4blFFcUxiaEpzRTJTRklrVklmNm9Tc0dnZFd5dDNRL3NXeU9kQk51SkFtYkJSQUo3NlNHRThlUVNUcWNsTlBWTUs5QU1QK29HVy9qOGd3eWJuN1lIMkhCUGFLZWl0YzM4RnozYmhtSktVQ1hYS005OTZ4VmEySnR6YXQzSEdnUGVUUm9lR0tiSUZCYnN5eXMyVGRLdDVIWG54c3o3YVB1Y3YvZ1kzYjI3R0piY3JWczNHZWIzWWJmcXVELzUrbyt6ZE4zWGhGOS9hbmZpeGpCNTVGUG44SlRDeWlKWk1vcDIxVENiYzRVSWQzZzVFcUx5dFl6WkJWVUMyWEpITTFtUVdWRjRrS2dQZFRVajdlaGllaTlKQ3RJdEtlTGpoNmVGS3JZbnRHOWFWK0NWRUliVSsxOTdZY0M5TTJBL093R29lV0wzVjBOdEFuYWpuMlUvTDJ2bVFDaDIzMkRWZ055dnE2L3JGeUl3bVp6Q2dPUXoxb0RteUNNdDgycHMyVUkwc3VkazgrK3kzQWQ4ci92TWIrLzhvSDZUa3MzbHlMMTFPT3ZydHJjVnYzVGoxM2MrOTcvNDc3eDRaWHJhV29iRTVtT0djVnRhZ291TnFrek9OYkh5OHpScEZlc0JHaTgwRXMxeVIzTlpBQ2FNS2thME1kTzVCaXV1Unh0TlFiZUhtOFlaRTFCQ2VTWUsrdnRKNnpNM1dsUG1tVzRHSjE3ckh2MjFpdy9tUFZxNUlVN1VXdW5mNDdlS0dMUUk0QXhOcWhXNjNWT3NzdWwzZGVLOVh1MjY0V090cWI4RU16dHlJNUs3NzFtSjFWNGVubi9PWjRvaVQzdy9NN2pnc2tMTndzUFVCSDdRczVHUE5SM3ptN3ZKamIvMzQ3dlUvUDdLOWNoc3RGZktHdUdJRmhHZm9sYU9HMFY5bkUxYmljamp0SmhjL2t4VWdMYzllb2Q0RXZoRTN0QUpUdDJDeUpkanNjYUE5VkRyVUl4L2hDWmErMW91M0FVbFZzQ2FjbDRJd3BNOU9DNjMwNmNjU3Azcjl2R0RkRE4wYndFNDRzR3NOVHJCZ0tpZ3JkTE5TM2F2b2JwOW9hb25WcmZybldCSXRCOTBGblhaT3Z2U2s2eHFQUHZPZHdFVnNQU0N6TFBkWjhvT2xJd0NHKzc3YmZQRnIxbVUvK3ZZbjJuZGY5c1RkUzVXczBGaEdKUkNKRzl3S0htbE1ROEFheFZTQzNhSXU5M1FGTUdUclBZTXJyZXFUUHR2UXZnSVpYb1RLS2M0ZUZMK0F0b2JaY0tYVFlSTG01MEVzSUVRS3UybU1CNGthRFNFZmkxSzVjRXRrTlJCMkliMmZPTStYdkZhM3FjcnRXSFNqcy9lWXNoNTg2clc2dUhKcmxkWlp6Z3EycmVnT3lJWldqRGNmOVlKUFpDYzkrY080OWFjT0dzbk40VWZOZGgrbXk0M21rUjk0VWZNSDN6aXZ1dkNUcnl0NzNjd3VkcVNWWnArbmxiYXdMdDA4ZUthaVlMWXBWZ3l5REdURXVyQ05xbWVYQklUbE5xUjlNV1pvQVZhT1J1a1JXVkI5ckkxR0JKTjZGUjdaY0ErWkh1dFRieWVtb1pjeXFsbVJObEplQnIwN2F1YUxxVmQrYkhmY291c3R1azNSc09aYnlFV3dPUENWRUdxc2FjY0RqMWFWbmZENGkrU0p2L3Mzd0JXMmJ6ejY0SkRjNWdkZnAyVDhybTF5NWl2ZjJGeTA1SEp6NlpmUDY2Mi85U0VzeFMwK0dHenlURjNSSDF1RE1SU2FNcmkvc3NOaUtvRWxCaGFBaTdsQnpPOFBnT3l0UnJJTGtlYkx3QzVEcFUwZFN6UzQ1TldRbHVPWkw2MTBUKzBuOXpzWUtVb1NoOExIOEVSS1RIa0ZkSzRobHVxMUhueGluY3JkcHVnbXhZNHJXTWZBdHFveHFxRzZhZVhCdVJPa3lqRW5QTzJhN01UbmZrankxci9SMnoyNEZTa0hMREw1alUvT2RoOStwV2huOUpqcTJ1Ky9xM3ZUTjgrMmVUdVh4V0RtRUlzWFpJV0U2UnhJUTl6Y29oeE1RNUJjTUptNE1uNExEU3dXWkVnd1lRR2F6TlRGekUwSnJhZGo4OS9FNmdqMVBKRW1NSVF5aWt0TW5UNGxNMGlBWUpYOERkNXRqeEJxY1NzSHRoSHBZZXdQa2M0RlVFNjU2SHFZT2E2VlU3T2IxUUd3bzJocFhSTWRYOW0wWTkyTXdpN29sS1hhcVVnM3d5eDc1RzF5OGtzK3JpYys4MnY0VlVJT1pwSGROMTA5MjMzNHRTTHJ0MlY2N3gyL1VmNzAzOTlTM2ZPangrbElEMWtJWmdpa0tYVTFqWWE0T1VZRlNDNUlJUzVoSVFQSkRjd1ZaTEVnY3dUSmpjdGtNY2JOdlRVbFpBWGEraTJzZVNxcUJiRmhXZzZBWVlnbXpMREQxL3VMK1ZoZVRZTWJZWWt4eGg1dXZheU8rNGhpN0ZXWXpoZWcyZ2EyNlpNS1BJWHZzdGlOQ3VQZXJ1dXBxMnJhOFhaZDE0SFNUbGgwUXFGbllPNHhhOHd4TC95TUh2Mk16d096a3QzOFlFUW1MditQMmU3REF4WnRMQi9qcW0vOWZubmoxOTlZN2I3amFPWW9aaTZZSWFuckNEVTlDeGJpb2k5RllFVnhGZmxiZ2l3VXpBS0JwbmRsTWc5QzZVQ3hCTnM4QitWRTUzSkVFSTZnektWdlh2QmViY0JFM2VJcmYxTUNIWVEyWURCNks2YjdLZWl0QVIwaVZrWXRMZXh3ek1lRTkzQkxCemc2NnJLYXB5eDJzbkxBcXpKMDdPaDFac1VUdjhDeVU4OEhWaC9vWnpCb2thbUxQajdiZmRoMzJkbGNWZDE1NmV2TGRULzhQZHZlc05UTUI1a0hOTVFCTUJRNHlEd0xCa0FXZ3ZpSzhqSlhrQ1dDREJ1ZjdHTDhjZzV0S0I2R2Jmd3VWcGZnVk9zUVRnM1BBVWFwRTFKVEVBWjdjQzhBMU1DQWdtRTFXZmNUMEwwSmJLZzlZaDNEYmJYb051c1c5ZkhNRjhFM1pkR0owcTA2UlFOZGNNcHRMSC9pVnhnOTRpc2Nnc0FMSWxQLzlkSFo3c09ERmwyejdZU3F2Zm1QN04zLy92L1JXVCtQT2NCY3diUWM2SXhYd1RTOEtpNmNYUmhXU1RMRDNpNmM0OWxTL0p5U3JJdTJub1BOejNTcTJLMEZpeklDekVmN1dEQkp4Y0pYUDAzVFVLTHFGWVROWk4xL1FMby9BanZrdkZhc0t6NjAyYUs3MUJjUFY3OVlqSVdKTGt5cVd6U211WGpDTG43OHBicmlPVitUb1dVWEFiTTdvMndBSWxQWHpuZ0N4TUNsTjI0ZkpYZGUrRnJXWFBoYjJsbS9nRkdRVVpBaDQ1d1JEMEpUaUtzMVhqZ1FpbkdNS1lzRTVva25OZ09tQi9rUU92UktySG1NSDNGcG9JeWdMTUN2aE0yZWxjN1R1RjlZM2ErTFlCRTdRZFk3SCtuOEcxUSsxVjh0VEZyWXJPaTRPckxzV3VoMDBhbktNYUdaYTNYa21KL1o1Yy81cm80ODVOL3N5TExybUlXMHFRTWxNbkhyb1dNRC9qcVJyVHRQMGZWWHZvSjcvL05NSmxjZnFWa1hHUUtHeFlHeDZkU3d5WEExWXdvY0NIT0J4UUx6d2NSbFdpZWhjVHkyOVh0WUZ2a0FaQXZWdVNpTGlQT0Vrem5DUUIwOGprelk4NlQ2NzVqMi8zVXA5cmJoN0w0cEQ3NmRGam9kNkZab1YxQXpoZzZ0WEtOanAxeGk1ejNxdXpwMDlJLzRmNER0OWlZeWRkTUZzOTJIZ1l0c1duZTRwWE9HMlhqNW1XeTcrbkhhMjlRaVYyamhWMVlRcE1pUnB2RjVoNDRKV1NvdzZqTUJqWVdzUWx0bllQTm51N2lmTklBaHJDekNCU1ZkN21ETUdRdlpLMXE1Y3J4MGdSeFQvb3g4NnYzUXU4ZlpmV1hsMW92YjJJVnRGcXhnOC9tVkRoOXhweDA1NlhJZE9lWmlHb3QvRE53N1cvZHdwa1E2Tng3Y2NjRDlFYXVybW5SM25LYWRiUy9NTmw3MkhMUDc5cE9ZdWlzbmEvdVYxcW1MSG1TQ0djbGdtWUdXcjRvbGJTUmZoUTYvRWl2TFVReXVtdFlZeW1KWDFBamNVQjNVb1JTc0s3ZFdXckJkaXZhbmtJbHZ1YVczZ25rNE9RY2RuN2ZkdGg1eXM1MzM2Q3UxZGNSbG1vOWRDd3hrSWVoRFJhUjkrei9OZGg5bVJIck54ODQzM1YyUGxkM3JuMjUyM3Y2RWJQZE5KOUhkTXRlVTZ4Q3pFVFdUa0pYSXZNcU5tcVFyYzdXZWo4MmY2TmNNYWFJeWpNcGNyQzdFMlhKdUNFeXEwdFhtSzN0STFZTXFKK3RlamVsOUFyUlhhYlpzaXpZT3Y4TVdSOTFFZDk2MU5uLzREZEM1RTdlczRQOUlrYzRkQjJhbHBJTlpPcTNuajVBTkh5ZFRrNDh3VS9lZWFycGJUcFR1cm1Pa3QyV0pxZFkxSmR1Q05NZWg2SUtaZ253RldwenNWMHhxdUVRRnpWRG1vcFV2MlJZV2w4R29pcG5DWkZ2SnMzdE05b3RmQ0QrOVRSdUgvY3cyVHZpNTZLYTEvQThHM0hTUnp1YnpaN3NQc3k1VDloVk5NWFk1M2M3UnB0MVpKV0tQbExLM0NxdUxLTnNMeE80ZVJhc0dSak5mSjdnVUl4MHlNNkdtdVl1ODJFR2ViMWF4YTVGc2d6WkgxNU5uYTZYYXNSbVltdTNyTzVqbC93Y2ZoeFd6NFdlcTh3QUFBQUJKUlU1RXJrSmdnZz09Ii8+CjwvZGVmcz4KPC9zdmc+\",\n  \"name\": \"Test Metadata 2\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n  ],\n  \"slug\": \"test-metadata-2\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > pricing-3-plans 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"test-pricing-3-plans\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"features\": [\n        \"Unlimited images **with watermark**\",\n        \"No backend generation\",\n        \"No custom templates\\`\",\n      ],\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n    },\n    {\n      \"features\": [\n        \"Unlimited images **without watermark**\",\n        \"Unlimited backend generation\",\n        \"No custom templates\",\n      ],\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"amount\": 999,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Starter\",\n      \"slug\": \"starter\",\n    },\n    {\n      \"features\": [\n        \"Unlimited images **without watermark**\",\n        \"Unlimited backend generation\",\n        \"Unlimited custom templates\",\n      ],\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"amount\": 2999,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Pro\",\n      \"slug\": \"pro\",\n    },\n  ],\n  \"slug\": \"test-pricing-3-plans\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > pricing-custom-0 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"test-pricing-custom-0\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n    \"year\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n    },\n    {\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"amount\": 500,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n        {\n          \"billingScheme\": \"per_unit\",\n          \"slug\": \"custom-test\",\n          \"unitAmount\": 100,\n          \"usageType\": \"metered\",\n        },\n      ],\n      \"name\": \"Basic Monthly\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 2592000,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"basic-monthly\",\n    },\n    {\n      \"interval\": \"year\",\n      \"lineItems\": [\n        {\n          \"amount\": 4800,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n        {\n          \"billingScheme\": \"per_unit\",\n          \"slug\": \"custom-test\",\n          \"unitAmount\": 80,\n          \"usageType\": \"metered\",\n        },\n      ],\n      \"name\": \"Basic Annual\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 2592000,\n        \"limit\": 1500,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"basic-annual\",\n    },\n  ],\n  \"slug\": \"test-pricing-custom-0\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > pricing-freemium 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"test-pricing-freemium\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 60,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n    {\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"amount\": 499,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Basic\",\n      \"slug\": \"basic\",\n      \"trialPeriodDays\": 7,\n    },\n  ],\n  \"slug\": \"test-pricing-freemium\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > pricing-monthly-annual 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"test-pricing-monthly-annual\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n    \"year\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"custom-base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"slug\": \"free\",\n    },\n    {\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"amount\": 100,\n          \"slug\": \"custom-base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Basic Monthly\",\n      \"slug\": \"basic-monthly\",\n    },\n    {\n      \"interval\": \"year\",\n      \"lineItems\": [\n        {\n          \"amount\": 70,\n          \"slug\": \"custom-base\",\n          \"usageType\": \"licensed\",\n        },\n      ],\n      \"name\": \"Basic Annual\",\n      \"slug\": \"basic-annual\",\n    },\n  ],\n  \"slug\": \"test-pricing-monthly-annual\",\n  \"toolConfigs\": [],\n}\n`;\n\nexports[`loadAgenticConfig > pricing-pay-as-you-go 1`] = `\n{\n  \"defaultRateLimit\": {\n    \"enabled\": true,\n    \"interval\": 60,\n    \"limit\": 1000,\n    \"mode\": \"approximate\",\n  },\n  \"name\": \"test-pricing-pay-as-you-go\",\n  \"origin\": {\n    \"location\": \"external\",\n    \"type\": \"raw\",\n    \"url\": \"https://httpbin.org\",\n  },\n  \"pricingIntervals\": [\n    \"month\",\n  ],\n  \"pricingPlans\": [\n    {\n      \"lineItems\": [\n        {\n          \"amount\": 0,\n          \"slug\": \"base\",\n          \"usageType\": \"licensed\",\n        },\n        {\n          \"billingScheme\": \"per_unit\",\n          \"slug\": \"requests\",\n          \"unitAmount\": 0,\n          \"usageType\": \"metered\",\n        },\n      ],\n      \"name\": \"Free\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 86400,\n        \"limit\": 20,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"free\",\n    },\n    {\n      \"interval\": \"month\",\n      \"lineItems\": [\n        {\n          \"billingScheme\": \"tiered\",\n          \"slug\": \"requests\",\n          \"tiers\": [\n            {\n              \"unitAmount\": 0.467,\n              \"upTo\": 999,\n            },\n            {\n              \"unitAmount\": 0.053,\n              \"upTo\": \"inf\",\n            },\n          ],\n          \"tiersMode\": \"volume\",\n          \"usageType\": \"metered\",\n        },\n      ],\n      \"name\": \"Pay-As-You-Go\",\n      \"rateLimit\": {\n        \"enabled\": true,\n        \"interval\": 86400,\n        \"limit\": 1000,\n        \"mode\": \"approximate\",\n      },\n      \"slug\": \"pay-as-you-go\",\n    },\n  ],\n  \"slug\": \"test-pricing-pay-as-you-go\",\n  \"toolConfigs\": [],\n}\n`;\n"
  },
  {
    "path": "packages/platform/src/define-config.ts",
    "content": "import type {\n  AgenticProjectConfig,\n  AgenticProjectConfigInput\n} from '@agentic/platform-types'\n\nimport { parseAgenticProjectConfig } from './parse-agentic-project-config'\n\n/**\n * This method allows Agentic projects to define their configs in a type-safe\n * way from `agentic.config.ts` files.\n *\n * It parses the given input config and performs basic validation.\n */\nexport function defineConfig(\n  config: AgenticProjectConfigInput\n): AgenticProjectConfig {\n  return parseAgenticProjectConfig(config)\n}\n"
  },
  {
    "path": "packages/platform/src/index.ts",
    "content": "export * from './define-config'\nexport * from './load-agentic-config'\nexport * from './resolve-agentic-project-config'\nexport type * from './types'\nexport * from './validate-agentic-project-config'\nexport { defaultFreePricingPlan } from '@agentic/platform-types'\n"
  },
  {
    "path": "packages/platform/src/load-agentic-config.test.ts",
    "content": "import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { describe, expect, test } from 'vitest'\n\nimport { loadAgenticConfig } from './load-agentic-config'\n\nconst fixtures = [\n  'basic-raw-free-ts',\n  'basic-raw-free-json',\n  'pricing-freemium',\n  'pricing-pay-as-you-go',\n  'pricing-3-plans',\n  'pricing-monthly-annual',\n  'pricing-custom-0',\n  'basic-openapi',\n  'basic-mcp',\n  'everything-openapi',\n  'metadata-0',\n  'metadata-1',\n  'metadata-2'\n]\n\nconst invalidFixtures = [\n  'pricing-base-inconsistent',\n  'pricing-custom-inconsistent',\n  'pricing-empty-0',\n  'pricing-empty-1',\n  'pricing-empty-2',\n  'pricing-duplicate-0',\n  'pricing-duplicate-1',\n  'invalid-origin-url-0',\n  'invalid-origin-url-1',\n  'invalid-origin-url-2',\n  'invalid-origin-url-3',\n  'invalid-name-0',\n  'invalid-name-1',\n  'invalid-name-2',\n  'invalid-slug-0',\n  'invalid-slug-1',\n  'invalid-slug-2',\n  'invalid-slug-3',\n  'invalid-slug-4',\n  'invalid-metadata-0',\n  'invalid-metadata-1'\n]\n\nconst fixturesDir = path.join(\n  fileURLToPath(import.meta.url),\n  '..',\n  '..',\n  '..',\n  '..',\n  'fixtures'\n)\n\nconst validFixturesDir = path.join(fixturesDir, 'valid')\nconst invalidFixturesDir = path.join(fixturesDir, 'invalid')\n\ndescribe('loadAgenticConfig', () => {\n  for (const fixture of fixtures) {\n    test(\n      `${fixture}`,\n      {\n        timeout: 60_000\n      },\n      async () => {\n        const fixtureDir = path.join(validFixturesDir, fixture)\n\n        const config = await loadAgenticConfig({ cwd: fixtureDir })\n        expect(config).toMatchSnapshot()\n      }\n    )\n  }\n\n  for (const fixture of invalidFixtures) {\n    test(\n      `invalid: ${fixture}`,\n      {\n        timeout: 60_000\n      },\n      async () => {\n        const fixtureDir = path.join(invalidFixturesDir, fixture)\n\n        await expect(\n          loadAgenticConfig({ cwd: fixtureDir })\n        ).rejects.toThrowErrorMatchingSnapshot()\n      }\n    )\n  }\n})\n"
  },
  {
    "path": "packages/platform/src/load-agentic-config.ts",
    "content": "import type { AgenticProjectConfig } from '@agentic/platform-types'\nimport { loadConfig } from 'unconfig'\n\nimport { validateAgenticProjectConfig } from './validate-agentic-project-config'\n\nexport async function loadAgenticConfig({\n  cwd\n}: {\n  cwd?: string\n} = {}): Promise<AgenticProjectConfig> {\n  const { config } = await loadConfig({\n    cwd,\n    sources: [\n      {\n        files: 'agentic.config',\n        extensions: ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs', 'json']\n      }\n    ]\n  })\n\n  return validateAgenticProjectConfig(config, { cwd })\n}\n"
  },
  {
    "path": "packages/platform/src/origin-adapters/mcp.ts",
    "content": "import type {\n  MCPOriginAdapter,\n  MCPOriginAdapterConfig,\n  Tool\n} from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\nimport { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\n\nexport async function resolveMCPOriginAdapter({\n  name,\n  version,\n  origin,\n  label\n}: {\n  name: string\n  origin: MCPOriginAdapterConfig\n  label: string\n  version: string\n}): Promise<{\n  origin: MCPOriginAdapter\n  tools?: Tool[]\n}> {\n  assert(\n    origin.type === 'mcp',\n    400,\n    `Invalid origin adapter type \"${origin.type}\" for ${label}`\n  )\n  const transport = new StreamableHTTPClientTransport(new URL(origin.url), {\n    requestInit: {\n      headers: origin.headers\n    }\n  })\n  const client = new McpClient({ name, version })\n\n  try {\n    await client.connect(transport)\n  } catch (err: any) {\n    throw new Error(\n      `Failed to connect to MCP server at ${origin.url} using the Streamable HTTP transport.Make sure your MCP server is running and accessible, and that your URL is using the correct path (/, /mcp, etc): ${err.message}`,\n      { cause: err }\n    )\n  }\n\n  const serverInfo = {\n    name,\n    version,\n    ...client.getServerVersion(),\n    capabilities: client.getServerCapabilities(),\n    instructions: client.getInstructions()\n  }\n\n  const listToolsResponse = await client.listTools()\n\n  // TODO: Validate MCP tools\n  const tools = listToolsResponse.tools\n\n  return {\n    tools,\n    origin: {\n      ...origin,\n      serverInfo\n    }\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/origin-adapters/openapi.ts",
    "content": "import type {\n  OpenAPIOriginAdapter,\n  OpenAPIOriginAdapterConfig,\n  Tool\n} from '@agentic/platform-types'\nimport { assert, type Logger } from '@agentic/platform-core'\nimport {\n  getToolsFromOpenAPISpec,\n  validateOpenAPISpec\n} from '@agentic/platform-openapi-utils'\n\nexport async function resolveOpenAPIOriginAdapter({\n  origin,\n  label,\n  cwd,\n  logger\n}: {\n  origin: OpenAPIOriginAdapterConfig\n  label: string\n  cwd?: string\n  logger?: Logger\n}): Promise<{\n  origin: OpenAPIOriginAdapter\n  tools?: Tool[]\n}> {\n  assert(\n    origin.type === 'openapi',\n    400,\n    `Invalid origin adapter type \"${origin.type}\" for ${label}`\n  )\n  assert(\n    origin.spec,\n    400,\n    `OpenAPI spec is required for ${label} with origin adapter type set to \"openapi\"`\n  )\n\n  // Validate and normalize the OpenAPI spec\n  const openapiSpec = await validateOpenAPISpec(origin.spec, {\n    cwd,\n    logger\n  })\n\n  // Remove origin servers from the OpenAPI spec.\n  // TODO: Ensure that `origin.url` matches any origin servers in the openapi spec?\n  delete openapiSpec.servers\n\n  // TODO: Additional, agentic-specific validation of the OpenAPI spec's\n  // operations to ensure they are valid tools.\n\n  // TODO: Simplify OpenAPI spec by removing any query params and headers\n  // specific to the Agentic API gateway.\n\n  // TODO: Extract tool definitions from OpenAPI operationIds\n\n  const dereferencedOpenAPISpec = await validateOpenAPISpec(origin.spec, {\n    cwd,\n    dereference: true\n  })\n\n  const { tools, toolToOperationMap } = await getToolsFromOpenAPISpec(\n    dereferencedOpenAPISpec\n  )\n\n  return {\n    tools,\n    origin: {\n      ...origin,\n      // Update the openapi spec with the normalized version\n      spec: JSON.stringify(openapiSpec),\n      toolToOperationMap\n    }\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/parse-agentic-project-config.ts",
    "content": "import { parseZodSchema, pruneUndefined } from '@agentic/platform-core'\nimport {\n  type AgenticProjectConfig,\n  agenticProjectConfigSchema,\n  type ResolvedAgenticProjectConfig,\n  resolvedAgenticProjectConfigSchema\n} from '@agentic/platform-types'\n\n// NOTE: The extra typing and casts here are necessary because we're overriding\n// the default zod types for some fields (e.g. `pricingPlans`) in order to get\n// stricter TypeScript types than what zod v3 allows (nested discrimianted\n// unions). We should consider removing these once we upgrade to zod v4.\n\n/**\n * @internal\n */\nexport function parseAgenticProjectConfig(\n  inputConfig: unknown,\n  { strip = false, strict = false }: { strip?: boolean; strict?: boolean } = {}\n): AgenticProjectConfig {\n  return pruneUndefined(\n    parseZodSchema(\n      strip\n        ? agenticProjectConfigSchema.strip()\n        : strict\n          ? agenticProjectConfigSchema.strict()\n          : agenticProjectConfigSchema,\n      inputConfig,\n      {\n        statusCode: 400\n      }\n    )\n  ) as AgenticProjectConfig\n}\n\n/**\n * @internal\n */\nexport function parseResolvedAgenticProjectConfig(\n  inputConfig: unknown,\n  { strip = false, strict = false }: { strip?: boolean; strict?: boolean } = {}\n): ResolvedAgenticProjectConfig {\n  return pruneUndefined(\n    parseZodSchema(\n      strip\n        ? resolvedAgenticProjectConfigSchema.strip()\n        : strict\n          ? resolvedAgenticProjectConfigSchema.strict()\n          : resolvedAgenticProjectConfigSchema,\n      inputConfig,\n      {\n        statusCode: 400\n      }\n    )\n  ) as ResolvedAgenticProjectConfig\n}\n"
  },
  {
    "path": "packages/platform/src/resolve-agentic-project-config.ts",
    "content": "import type { Logger } from '@agentic/platform-core'\nimport type {\n  AgenticProjectConfig,\n  AgenticProjectConfigRaw,\n  ResolvedAgenticProjectConfig\n} from '@agentic/platform-types'\n\nimport type { UploadFileUrlToStorageFn } from './types'\nimport {\n  parseAgenticProjectConfig,\n  parseResolvedAgenticProjectConfig\n} from './parse-agentic-project-config'\nimport { resolveMetadata } from './resolve-metadata'\nimport { resolveMetadataFiles } from './resolve-metadata-files'\nimport { resolveOriginAdapter } from './resolve-origin-adapter'\nimport { validatePricing } from './validate-pricing'\nimport { validateTools } from './validate-tools'\n\nexport async function resolveAgenticProjectConfig(\n  inputConfig: AgenticProjectConfig | AgenticProjectConfigRaw,\n  opts: {\n    logger?: Logger\n    cwd?: string\n    label?: string\n    uploadFileUrlToStorage: UploadFileUrlToStorageFn\n  }\n): Promise<ResolvedAgenticProjectConfig> {\n  const config = parseAgenticProjectConfig(inputConfig)\n\n  const { slug, version } = await resolveMetadata(config)\n  validatePricing(config)\n\n  const { readme, iconUrl } = await resolveMetadataFiles(config, opts)\n  const { origin, tools } = await resolveOriginAdapter({\n    slug,\n    version,\n    label: `project \"${slug}\"`,\n    ...opts,\n    origin: config.origin\n  })\n\n  const resolvedConfig = parseResolvedAgenticProjectConfig({\n    ...config,\n    slug,\n    version,\n    readme,\n    iconUrl,\n    origin,\n    tools\n  })\n\n  validateTools({\n    label: `project \"${slug}\"`,\n    ...opts,\n    origin: resolvedConfig.origin,\n    tools: resolvedConfig.tools,\n    toolConfigs: resolvedConfig.toolConfigs\n  })\n\n  return resolvedConfig\n}\n"
  },
  {
    "path": "packages/platform/src/resolve-metadata-file.ts",
    "content": "import type { UploadFileUrlToStorageFn } from './types'\n\nexport async function resolveMetadataFile(\n  input: string | undefined,\n  {\n    label,\n    uploadFileUrlToStorage\n  }: {\n    label: string\n    uploadFileUrlToStorage: UploadFileUrlToStorageFn\n  }\n): Promise<string | undefined> {\n  if (!input) return\n\n  try {\n    const source = new URL(input)\n\n    return uploadFileUrlToStorage(source.toString())\n  } catch {\n    throw new Error(`Invalid \"${label}\" must be a public URL: \"${input}\"`)\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/resolve-metadata-files.ts",
    "content": "import type {\n  AgenticProjectConfig,\n  ResolvedAgenticProjectConfig\n} from '@agentic/platform-types'\n\nimport type { UploadFileUrlToStorageFn } from './types'\nimport { resolveMetadataFile } from './resolve-metadata-file'\n\nexport async function resolveMetadataFiles(\n  { readme, icon }: Pick<AgenticProjectConfig, 'readme' | 'icon'>,\n  {\n    uploadFileUrlToStorage\n  }: {\n    uploadFileUrlToStorage: UploadFileUrlToStorageFn\n  }\n): Promise<Pick<ResolvedAgenticProjectConfig, 'readme' | 'iconUrl'>> {\n  if (readme) {\n    readme = await resolveMetadataFile(readme, {\n      label: 'readme',\n      uploadFileUrlToStorage\n    })\n  }\n\n  if (icon) {\n    icon = await resolveMetadataFile(icon, {\n      label: 'icon',\n      uploadFileUrlToStorage\n    })\n  }\n\n  return {\n    readme,\n    iconUrl: icon\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/resolve-metadata.ts",
    "content": "import type {\n  AgenticProjectConfig,\n  ResolvedAgenticProjectConfig\n} from '@agentic/platform-types'\nimport { assert, slugify } from '@agentic/platform-core'\nimport { isValidProjectSlug } from '@agentic/platform-validators'\nimport { clean as cleanSemver, valid as isValidSemver } from 'semver'\n\nexport async function resolveMetadata({\n  name,\n  slug,\n  version\n}: Pick<AgenticProjectConfig, 'name' | 'slug' | 'version'>): Promise<\n  Pick<ResolvedAgenticProjectConfig, 'slug' | 'version'>\n> {\n  slug ??= slugify(name)\n\n  assert(\n    isValidProjectSlug(slug),\n    `Invalid project slug \"${slug}\" for project name \"${name}\". Must be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters. For example: \"my-project\" or \"linkedin-resolver-23\"`\n  )\n\n  if (version) {\n    const normalizedVersion = cleanSemver(version)!\n    assert(version, `Invalid semver version \"${version}\" for project \"${slug}\"`)\n\n    assert(\n      isValidSemver(version),\n      `Invalid semver version \"${version}\" for project \"${slug}\"`\n    )\n\n    // Update the config with the normalized semver version\n    version = normalizedVersion\n  }\n\n  return {\n    slug,\n    version\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/resolve-origin-adapter.ts",
    "content": "import type {\n  OriginAdapter,\n  OriginAdapterConfig,\n  Tool\n} from '@agentic/platform-types'\nimport { assert, type Logger } from '@agentic/platform-core'\n\nimport { resolveMCPOriginAdapter } from './origin-adapters/mcp'\nimport { resolveOpenAPIOriginAdapter } from './origin-adapters/openapi'\nimport { validateOriginUrl } from './validate-origin-url'\n\n/**\n * Validates, normalizes, and resolves the origin adapter config for a project.\n */\nexport async function resolveOriginAdapter({\n  slug,\n  version = '0.0.0',\n  origin,\n  label,\n  cwd,\n  logger\n}: {\n  slug: string\n  origin: OriginAdapterConfig\n  label: string\n  version?: string\n  cwd?: string\n  logger?: Logger\n}): Promise<{\n  origin: OriginAdapter\n  tools?: Tool[]\n}> {\n  validateOriginUrl({ originUrl: origin.url, label })\n\n  if (origin.type === 'openapi') {\n    return resolveOpenAPIOriginAdapter({\n      origin,\n      label,\n      cwd,\n      logger\n    })\n  } else if (origin.type === 'mcp') {\n    return resolveMCPOriginAdapter({\n      name: slug,\n      version,\n      origin,\n      label\n    })\n  } else {\n    assert(\n      origin.type === 'raw',\n      400,\n      `Invalid origin adapter type \"${origin.type}\" for ${label}`\n    )\n\n    return {\n      origin\n    }\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/types.ts",
    "content": "export type UploadFileUrlToStorageFn = (source: string) => Promise<string>\n"
  },
  {
    "path": "packages/platform/src/validate-agentic-project-config.ts",
    "content": "import type { AgenticProjectConfig } from '@agentic/platform-types'\nimport { type Logger } from '@agentic/platform-core'\n\nimport { parseAgenticProjectConfig } from './parse-agentic-project-config'\nimport { resolveMetadata } from './resolve-metadata'\nimport { validateMetadataFiles } from './validate-metadata-files'\nimport { validateOriginAdapter } from './validate-origin-adapter'\nimport { validatePricing } from './validate-pricing'\n\nexport async function validateAgenticProjectConfig(\n  inputConfig: unknown,\n  {\n    strip = false,\n    ...opts\n  }: {\n    logger?: Logger\n    cwd?: string\n    strip?: boolean\n    label?: string\n  } = {}\n): Promise<AgenticProjectConfig> {\n  const config = parseAgenticProjectConfig(inputConfig, {\n    strip,\n    strict: !strip\n  })\n\n  const { slug, version } = await resolveMetadata(config)\n  validatePricing(config)\n\n  const { readme, icon } = await validateMetadataFiles(config, opts)\n  const origin = await validateOriginAdapter({\n    slug,\n    version,\n    label: `project \"${slug}\"`,\n    ...opts,\n    origin: config.origin\n  })\n\n  return parseAgenticProjectConfig(\n    {\n      ...config,\n      slug,\n      version,\n      readme,\n      icon,\n      origin\n    },\n    { strip, strict: !strip }\n  )\n}\n"
  },
  {
    "path": "packages/platform/src/validate-metadata-file.ts",
    "content": "import { readFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { lookup as lookupMimeType } from 'mrmime'\n\nexport async function validateMetadataFile(\n  input: string | undefined,\n  {\n    label,\n    cwd\n  }: {\n    label: string\n    cwd: string\n  }\n): Promise<string | undefined> {\n  if (!input) return\n\n  let source: string | ArrayBuffer | URL\n\n  try {\n    // Check if it's a URL.\n    source = new URL(input)\n\n    return source.toString()\n  } catch {\n    try {\n      // Not a URL; check if it's a local file path.\n      const buffer = await readFile(path.resolve(cwd, input))\n\n      const mime =\n        lookupMimeType(path.extname(input)) ?? 'application/octet-stream'\n\n      return `data:${mime};base64,${buffer.toString('base64')}`\n    } catch {\n      throw new Error(\n        `Invalid \"${label}\" (must be a URL or a path to a local file): \"${input}\"`\n      )\n    }\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/validate-metadata-files.ts",
    "content": "import type { AgenticProjectConfig } from '@agentic/platform-types'\n\nimport { validateMetadataFile } from './validate-metadata-file'\n\nexport async function validateMetadataFiles(\n  { readme, icon }: Pick<AgenticProjectConfig, 'readme' | 'icon'>,\n  {\n    cwd = process.cwd()\n  }: {\n    cwd?: string\n  }\n): Promise<Pick<AgenticProjectConfig, 'readme' | 'icon'>> {\n  if (readme) {\n    readme = await validateMetadataFile(readme, { label: 'readme', cwd })\n  }\n\n  if (icon) {\n    icon = await validateMetadataFile(icon, { label: 'icon', cwd })\n  }\n\n  return {\n    readme,\n    icon\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/validate-origin-adapter.ts",
    "content": "import type { OriginAdapterConfig } from '@agentic/platform-types'\nimport { assert, type Logger } from '@agentic/platform-core'\n\nimport { resolveMCPOriginAdapter } from './origin-adapters/mcp'\nimport { resolveOpenAPIOriginAdapter } from './origin-adapters/openapi'\nimport { validateOriginUrl } from './validate-origin-url'\n\n/**\n * Validates and normalizes the origin adapter for a project.\n */\nexport async function validateOriginAdapter({\n  slug,\n  version = '0.0.0',\n  origin,\n  label,\n  cwd,\n  logger\n}: {\n  slug: string\n  origin: Readonly<OriginAdapterConfig>\n  label: string\n  version?: string\n  cwd?: string\n  logger?: Logger\n}): Promise<OriginAdapterConfig> {\n  validateOriginUrl({ originUrl: origin.url, label })\n\n  if (origin.type === 'openapi') {\n    // We intentionally ignore the resolved tools here because the server will\n    // need to re-validate the OpenAPI spec and tools anyway. We do, however,\n    // override the `spec` field with the parsed, normalized version because\n    // that may have been pointing to a local file or remote URL.\n    const { origin: resolvedOriginAdapter } = await resolveOpenAPIOriginAdapter(\n      {\n        origin,\n        label,\n        cwd,\n        logger\n      }\n    )\n\n    return {\n      ...origin,\n      spec: resolvedOriginAdapter.spec\n    }\n  } else if (origin.type === 'mcp') {\n    // We intentionally ignore the resolved version and tools here because the\n    // server will need to re-validate the MCP server info and tools anyway.\n    await resolveMCPOriginAdapter({\n      name: slug,\n      version,\n      origin,\n      label\n    })\n\n    return origin\n  } else {\n    assert(\n      origin.type === 'raw',\n      400,\n      `Invalid origin adapter type \"${origin.type}\" for ${label}`\n    )\n\n    return origin\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/validate-origin-url.ts",
    "content": "import { assert } from '@agentic/platform-core'\n\nexport function validateOriginUrl({\n  originUrl,\n  label\n}: {\n  originUrl: string\n  label: string\n}) {\n  assert(originUrl, 400, `Origin URL is required for ${label}`)\n\n  try {\n    const parsedOriginUrl = new URL(originUrl)\n    assert(\n      parsedOriginUrl.protocol === 'https:',\n      'Invalid originUrl: must be a valid https URL'\n    )\n\n    assert(parsedOriginUrl.hostname, 'Invalid originUrl: must be a valid URL')\n  } catch (err) {\n    throw new Error('Invalid originUrl: must be a valid https URL', {\n      cause: err\n    })\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/validate-pricing.ts",
    "content": "import { assert } from '@agentic/platform-core'\nimport {\n  type AgenticProjectConfig,\n  getPricingPlansByInterval,\n  type PricingPlanLineItem\n} from '@agentic/platform-types'\n\nexport function validatePricing({\n  pricingIntervals,\n  pricingPlans\n}: Pick<AgenticProjectConfig, 'pricingIntervals' | 'pricingPlans'>) {\n  assert(\n    pricingPlans?.length,\n    'Invalid pricingPlans: must be a non-empty array'\n  )\n  assert(\n    pricingIntervals?.length,\n    'Invalid pricingIntervals: must be a non-empty array'\n  )\n\n  {\n    // Validate pricing interval\n    const pricingIntervalsSet = new Set(pricingIntervals)\n    assert(\n      pricingIntervalsSet.size === pricingIntervals.length,\n      'Invalid pricingIntervals: duplicate pricing intervals'\n    )\n    assert(\n      pricingIntervals.length >= 1,\n      'Invalid pricingIntervals: must contain at least one pricing interval'\n    )\n\n    if (pricingIntervals.length > 1) {\n      for (const pricingPlan of pricingPlans) {\n        if (pricingPlan.interval) {\n          assert(\n            pricingIntervalsSet.has(pricingPlan.interval),\n            `Invalid pricingPlan \"${pricingPlan.slug}\": PricingPlan \"${pricingPlan.slug}\" has invalid interval \"${pricingPlan.interval}\" which is not included in the \"pricingIntervals\" array.`\n          )\n        }\n\n        if (pricingPlan.slug === 'free') continue\n\n        assert(\n          pricingPlan.interval !== undefined,\n          `Invalid pricingPlan \"${pricingPlan.slug}\": non-free PricingPlan \"${pricingPlan.slug}\" must specify an \"interval\" because the project supports multiple pricing intervals.`\n        )\n      }\n    } else {\n      // Only a single pricing interval is supported, so default all pricing\n      // plans to use the default pricing interval.\n      const defaultPricingInterval = pricingIntervals[0]!\n      assert(\n        defaultPricingInterval,\n        'Invalid pricingIntervals: must contain at least one valid pricing interval'\n      )\n\n      for (const pricingPlan of pricingPlans) {\n        if (pricingPlan.interval) {\n          assert(\n            pricingIntervalsSet.has(pricingPlan.interval),\n            `Invalid pricingPlan \"${pricingPlan.slug}\": PricingPlan \"${pricingPlan.slug}\" has invalid interval \"${pricingPlan.interval}\" which is not included in the \"pricingIntervals\" array.`\n          )\n        }\n\n        if (pricingPlan.slug === 'free') continue\n\n        pricingPlan.interval ??= defaultPricingInterval\n      }\n    }\n  }\n\n  {\n    // Validate pricingPlans\n    const pricingPlanSlugsSet = new Set(pricingPlans.map((p) => p.slug))\n    assert(\n      pricingPlanSlugsSet.size === pricingPlans.length,\n      'Invalid pricingPlans: duplicate PricingPlan slugs. All PricingPlan slugs must be unique (e.g. \"free\", \"starter-monthly\", \"pro-annual\", etc).'\n    )\n\n    const pricingPlanLineItemSlugMap: Record<string, PricingPlanLineItem[]> = {}\n\n    for (const pricingPlan of pricingPlans) {\n      const lineItemSlugsSet = new Set(\n        pricingPlan.lineItems.map((lineItem) => lineItem.slug)\n      )\n\n      assert(\n        lineItemSlugsSet.size === pricingPlan.lineItems.length,\n        `Invalid pricingPlan \"${pricingPlan.slug}\": duplicate line-item slugs`\n      )\n\n      for (const lineItem of pricingPlan.lineItems) {\n        if (!pricingPlanLineItemSlugMap[lineItem.slug]) {\n          pricingPlanLineItemSlugMap[lineItem.slug] = []\n        }\n\n        pricingPlanLineItemSlugMap[lineItem.slug]!.push(lineItem)\n      }\n    }\n\n    for (const lineItems of Object.values(pricingPlanLineItemSlugMap)) {\n      if (lineItems.length <= 1) continue\n\n      const lineItem0 = lineItems[0]!\n\n      for (let i = 1; i < lineItems.length; ++i) {\n        const lineItem = lineItems[i]!\n\n        assert(\n          lineItem.usageType === lineItem0.usageType,\n          `Invalid pricingPlans: all PricingPlans which contain the same LineItems (by slug \"${lineItem.slug}\") must have the same usage type (\"licensed\" or \"metered\").`\n        )\n      }\n    }\n  }\n\n  // Validate PricingPlanLineItems\n  for (const pricingPlan of pricingPlans) {\n    for (const lineItem of pricingPlan.lineItems) {\n      if (lineItem.slug === 'base') {\n        assert(\n          lineItem.usageType === 'licensed',\n          `Invalid PricingPlan \"${pricingPlan.slug}\": reserved LineItem \"base\" must have \"licensed\" usage type.`\n        )\n      } else if (lineItem.slug === 'requests') {\n        assert(\n          lineItem.usageType === 'metered',\n          `Invalid PricingPlan \"${pricingPlan.slug}\": reserved \"requests\" LineItem \"${lineItem.slug}\" must have \"metered\" usage type.`\n        )\n      } else {\n        assert(\n          lineItem.slug.startsWith('custom-'),\n          `Invalid PricingPlan \"${pricingPlan.slug}\": custom LineItem \"${lineItem.slug}\" must have a slug that starts with \"custom-\". This is required so that TypeScript can discriminate between custom and reserved line-items.`\n        )\n      }\n\n      if (lineItem.usageType === 'metered') {\n        switch (lineItem.billingScheme) {\n          case 'per_unit':\n            assert(\n              (lineItem as any).unitAmount !== undefined,\n              `Invalid PricingPlan \"${pricingPlan.slug}\": metered LineItem \"${lineItem.slug}\" must specify a non-negative \"unitAmount\" when using \"per_unit\" billing scheme.`\n            )\n\n            assert(\n              (lineItem as any).tiersMode === undefined,\n              `Invalid PricingPlan \"${pricingPlan.slug}\": metered LineItem \"${lineItem.slug}\" must not specify \"tiersMode\" when using \"per_unit\" billing scheme.`\n            )\n\n            assert(\n              (lineItem as any).tiers === undefined,\n              `Invalid PricingPlan \"${pricingPlan.slug}\": metered LineItem \"${lineItem.slug}\" must not specify \"tiers\" when using \"per_unit\" billing scheme.`\n            )\n            break\n\n          case 'tiered':\n            assert(\n              (lineItem as any).unitAmount === undefined,\n              `Invalid PricingPlan \"${pricingPlan.slug}\": metered LineItem \"${lineItem.slug}\" must not specify \"unitAmount\" when using \"tiered\" billing scheme.`\n            )\n\n            assert(\n              (lineItem as any).tiers?.length,\n              `Invalid PricingPlan \"${pricingPlan.slug}\": metered LineItem \"${lineItem.slug}\" must specify a non-empty \"tiers\" array when using \"tiered\" billing scheme.`\n            )\n\n            assert(\n              (lineItem as any).tiersMode !== undefined,\n              `Invalid PricingPlan \"${pricingPlan.slug}\": metered LineItem \"${lineItem.slug}\" must specify a valid \"tiersMode\" when using \"tiered\" billing scheme.`\n            )\n\n            // TODO: Not sure if this is a valid requirement or not.\n            assert(\n              (lineItem as any).transformQuantity === undefined,\n              `Invalid pricingPlan \"${pricingPlan.slug}\": metered LineItem \"${lineItem.slug}\" must not specify \"transformQuantity\" when using \"tiered\" billing scheme.`\n            )\n            break\n\n          default:\n            assert(\n              false,\n              `Invalid PricingPlan \"${pricingPlan.slug}\": metered LineItem \"${(lineItem as any).slug}\" must specify a valid \"billingScheme\".`\n            )\n        }\n      }\n    }\n  }\n\n  // Validate deployment pricing plans to ensure they contain at least one valid\n  // plan per pricing interval configured on the project.\n  for (const pricingInterval of pricingIntervals) {\n    const pricingPlansForInterval = getPricingPlansByInterval({\n      pricingInterval,\n      pricingPlans\n    })\n\n    assert(\n      pricingPlansForInterval.length > 0,\n      400,\n      `Invalid pricing config: no pricing plans for pricing interval \"${pricingInterval}\"`\n    )\n  }\n}\n"
  },
  {
    "path": "packages/platform/src/validate-tools.ts",
    "content": "import type { OriginAdapter, Tool, ToolConfig } from '@agentic/platform-types'\nimport { assert } from '@agentic/platform-core'\n\n/**\n * Validates the origin server's tools for a project.\n */\nexport function validateTools({\n  origin,\n  tools,\n  toolConfigs,\n  label\n}: {\n  origin: OriginAdapter\n  tools: Tool[]\n  toolConfigs: ToolConfig[]\n  label: string\n}) {\n  if (!tools.length) {\n    assert(\n      origin.type === 'raw',\n      `No tools defined for ${label} with origin adapter type \"${origin.type}\"`\n    )\n  }\n\n  const toolsMap: Record<string, Tool> = {}\n  for (const tool of tools) {\n    assert(\n      !toolsMap[tool.name],\n      400,\n      `Duplicate tool name \"${tool.name}\" found in ${label}`\n    )\n    toolsMap[tool.name] = tool\n  }\n\n  for (const toolConfig of toolConfigs) {\n    const tool = toolsMap[toolConfig.name]\n    assert(\n      tool,\n      400,\n      `Tool \"${toolConfig.name}\" from \\`toolConfigs\\` not found in \\`tools\\` for ${label}`\n    )\n  }\n}\n"
  },
  {
    "path": "packages/platform/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\", \"bin/*\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/platform-core/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-core\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Core utilities shared across the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/core\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@sindresorhus/slugify\": \"catalog:\",\n    \"decircular\": \"catalog:\",\n    \"is-obj\": \"catalog:\",\n    \"ohash\": \"^2.0.11\",\n    \"parse-json\": \"catalog:\",\n    \"sort-keys\": \"catalog:\",\n    \"type-fest\": \"catalog:\",\n    \"zod\": \"catalog:\",\n    \"zod-validation-error\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/platform-core/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/platform-core\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform-core.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-core <!-- omit from toc -->\n\n> Core utilities shared across the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n> [!TIP]\n> You likely don't need this package directly. See [@agentic/cli](https://github.com/transitive-bullshit/agentic/tree/main/packages/cli), [@agentic/platform](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform), and [@agentic/platform-tool-client](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform-tool-client) for more public-facing packages.\n\n## Install\n\n```bash\nnpm i @agentic/platform-core\n```\n\n## Usage\n\n```ts\nimport {\n  assert,\n  omit,\n  pick,\n  parseJson,\n  parseZodSchema,\n  sha256,\n  getEnv,\n  sanitizeSearchParams,\n  pruneUndefined,\n  slugify\n  // etc...\n} from '@agentic/platform-core'\n```\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/platform-core/src/__snapshots__/utils.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`sha256 1`] = `\"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\"`;\n"
  },
  {
    "path": "packages/platform-core/src/errors.ts",
    "content": "import { fromError } from 'zod-validation-error'\n\nimport type { RateLimitResult } from './types'\nimport { getRateLimitHeaders } from './rate-limit-headers'\n\nexport class BaseError extends Error {\n  constructor({ message, cause }: { message: string; cause?: unknown }) {\n    super(message, { cause })\n\n    // Ensure the name of this error is the same as the class name\n    this.name = this.constructor.name\n\n    // Disabling due to https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-useless-error-capture-stack-trace.md\n    // Set stack trace to caller\n    // if (Error.captureStackTrace) {\n    //   Error.captureStackTrace(this, this.constructor)\n    // }\n  }\n}\n\nexport class HttpError extends BaseError {\n  readonly statusCode: number\n  readonly headers?: Record<string, string>\n\n  constructor({\n    message,\n    statusCode = 500,\n    headers,\n    cause\n  }: {\n    message: string\n    statusCode?: number\n    headers?: Record<string, string>\n    cause?: unknown\n  }) {\n    super({ message, cause })\n\n    this.statusCode = statusCode\n    this.headers = headers\n  }\n}\n\nexport class RateLimitError extends HttpError {\n  readonly rateLimitResult: RateLimitResult\n\n  constructor({\n    rateLimitResult,\n    message = 'Rate limit exceeded; please try again later.',\n    headers,\n    cause\n  }: {\n    rateLimitResult: RateLimitResult\n    message?: string\n    headers?: Record<string, string>\n    cause?: unknown\n  }) {\n    super({\n      message,\n      cause,\n      statusCode: 429,\n      headers: {\n        ...getRateLimitHeaders(rateLimitResult),\n        ...headers\n      }\n    })\n\n    this.rateLimitResult = rateLimitResult\n  }\n}\n\nexport class JsonRpcError extends HttpError {\n  readonly jsonRpcErrorCode: number\n  readonly jsonRpcId: string | number | null\n\n  constructor({\n    message,\n    jsonRpcErrorCode,\n    jsonRpcId = null,\n    statusCode,\n    cause\n  }: {\n    message: string\n    jsonRpcErrorCode: number\n    jsonRpcId?: string | number | null\n    statusCode?: number\n    cause?: unknown\n  }) {\n    super({ message, cause, statusCode })\n\n    this.jsonRpcErrorCode = jsonRpcErrorCode\n    this.jsonRpcId = jsonRpcId\n  }\n}\n\nexport class ZodValidationError extends HttpError {\n  constructor({\n    statusCode,\n    prefix,\n    cause\n  }: {\n    statusCode?: number\n    prefix?: string\n    cause: unknown\n  }) {\n    const error = fromError(cause, { prefix })\n    super({ message: error.message, cause, statusCode })\n  }\n}\n"
  },
  {
    "path": "packages/platform-core/src/hash-object.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\n\nimport { hashObject } from './hash-object'\n\ndescribe('hashObject', () => {\n  test('basic', async () => {\n    await expect(hashObject({ unicorn: 'rainbow' })).resolves.toBe(\n      '0bdeed89f3fbb21d7c4fa488992470030e98387c4ad3f4e18cebb70d7dac59dd'\n    )\n\n    await expect(hashObject({ a: 0, b: { a: 0, b: 0 } })).resolves.toBe(\n      await hashObject({ b: { b: 0, a: 0 }, a: 0 })\n    )\n\n    await expect(hashObject({ a: 'b' })).resolves.not.toBe(\n      await hashObject({ a: 'c' })\n    )\n  })\n\n  test('handles circular references', async () => {\n    const object = {\n      a: {\n        b: {}\n      }\n    }\n\n    object.a.b = object // Create a circular reference.\n\n    await expect(hashObject(object)).resolves.toBe(\n      'fe15b32f1f303e18ac292a995c18e0560c1031d0a7a5999a1c5cacea06cead87'\n    )\n  })\n})\n"
  },
  {
    "path": "packages/platform-core/src/hash-object.ts",
    "content": "import type { LiteralUnion } from 'type-fest'\nimport decircular from 'decircular'\nimport isObject from 'is-obj'\nimport sortKeys from 'sort-keys'\n\nimport { sha256 } from './utils'\n\nexport type Algorithm = LiteralUnion<\n  'SHA-1' | 'SHA-256' | 'SHA-384' | 'SHA-512',\n  string\n>\n\nexport type HashObjectOptions = {\n  /** @default 'SHA-256' */\n  readonly algorithm?: Algorithm\n}\n\nfunction normalizeObject(object: any): any {\n  if (typeof object === 'string') {\n    return object.normalize('NFD')\n  }\n\n  if (Array.isArray(object)) {\n    return object.map((element) => normalizeObject(element))\n  }\n\n  if (isObject(object)) {\n    return Object.fromEntries(\n      Object.entries(object).map(([key, value]) => [\n        key.normalize('NFD'),\n        normalizeObject(value)\n      ])\n    )\n  }\n\n  return object\n}\n\n/**\n * Returns a stable, deterministic hash of the given object, defaulting to\n * using `sha256` as the hashing algorithm and `hex` as the encoding.\n */\nexport async function hashObject(object: Record<string, any>): Promise<string> {\n  if (!isObject(object)) {\n    throw new TypeError('Expected an object')\n  }\n\n  const normalizedObject = normalizeObject(decircular(object))\n  const input = JSON.stringify(sortKeys(normalizedObject, { deep: true }))\n\n  return sha256(input)\n}\n"
  },
  {
    "path": "packages/platform-core/src/index.ts",
    "content": "export * from './errors'\nexport * from './hash-object'\nexport * from './rate-limit-headers'\nexport type * from './types'\nexport * from './utils'\n"
  },
  {
    "path": "packages/platform-core/src/rate-limit-headers.ts",
    "content": "import type { RateLimitResult } from './types'\n\n/**\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers-06\n */\nexport function getRateLimitHeaders(\n  rateLimitResult?: RateLimitResult\n): Record<string, string> | undefined {\n  const headers: Record<string, string> = {}\n  if (!rateLimitResult) {\n    return undefined\n  }\n\n  const { id, limit, remaining, resetTimeMs, intervalMs } = rateLimitResult\n  const intervalSeconds = Math.ceil(intervalMs / 1000)\n  const resetTimeSeconds = Math.ceil(resetTimeMs / 1000)\n\n  const rateLimitPolicy = `${limit};w=${intervalSeconds}`\n  const limitString = limit.toString()\n  const remainingString = remaining.toString()\n  const resetTimeString = resetTimeSeconds.toString()\n\n  // NOTE: Cloudflare and/or origin servers may set the x- headers, which can\n  // be pretty confusing since the end user gets both ratelimit headers.\n  // I'm hesitant to remove any extra origin headers, since they're a nice\n  // escape hatch for sending extra metadata, and the origin may in fact have\n  // its own separate rate-limiting policy, which we don't necessarily want to\n  // hide. So for now, we'll just set the standard rate-limit headers and make\n  // sure this distinction is documented.\n  headers['ratelimit-policy'] = rateLimitPolicy\n  headers['ratelimit-limit'] = limitString\n  headers['ratelimit-remaining'] = remainingString\n  headers['ratelimit-reset'] = resetTimeString\n  headers['x-ratelimit-id'] = id\n\n  if (!rateLimitResult.passed) {\n    const retryAfterSeconds = Math.max(\n      0,\n      Math.ceil((resetTimeMs - Date.now()) / 1000)\n    )\n    const retryAfterString = retryAfterSeconds.toString()\n\n    headers['retry-after'] = retryAfterString\n  }\n\n  return headers\n}\n"
  },
  {
    "path": "packages/platform-core/src/types.test.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport type { Logger } from './types'\n\ntest('Logger type is compatible with Console', () => {\n  expectTypeOf<Console>().toExtend<Logger>()\n})\n"
  },
  {
    "path": "packages/platform-core/src/types.ts",
    "content": "export interface Logger {\n  trace(message?: any, ...detail: any[]): void\n  debug(message?: any, ...detail: any[]): void\n  info(message?: any, ...detail: any[]): void\n  warn(message?: any, ...detail: any[]): void\n  error(message?: any, ...detail: any[]): void\n}\n\nexport type RateLimitResult = {\n  /**\n   * The identifier used to uniquely track this rate limit.\n   *\n   * This will typically be the customer's ID or IP address.\n   */\n  id: string\n\n  /**\n   * Whether or not the request passed the rate limit.\n   */\n  passed: boolean\n\n  /**\n   * The interval in milliseconds over which the rate limit is enforced.\n   */\n  intervalMs: number\n\n  /**\n   * The maximum number of requests that can be made per interval.\n   */\n  limit: number\n\n  /**\n   * The current number of requests that have been made against the rate limit.\n   */\n  current: number\n\n  /**\n   * The number of requests that can be made before the rate limit resets.\n   *\n   * Will be `0` if the rate limit has been exceeded.\n   */\n  remaining: number\n\n  /**\n   * The time in milliseconds since the Unix epoch UTC at which the rate limit\n   * will reset.\n   */\n  resetTimeMs: number\n}\n"
  },
  {
    "path": "packages/platform-core/src/utils.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport {\n  omit,\n  pick,\n  pruneEmpty,\n  pruneEmptyDeep,\n  sha256,\n  slugify\n} from './utils'\n\ntest('pick', () => {\n  expect(pick({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ a: 1, c: 3 })\n  expect(\n    pick({ a: { b: 'foo' }, d: -1, foo: null } as any, 'b', 'foo')\n  ).toEqual({ foo: null })\n})\n\ntest('omit', () => {\n  expect(omit({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ b: 2 })\n  expect(omit({ a: { b: 'foo' }, d: -1, foo: null }, 'b', 'foo')).toEqual({\n    a: { b: 'foo' },\n    d: -1\n  })\n  expect(omit({ a: 1, b: 2, c: 3 }, 'foo', 'bar', 'c')).toEqual({ a: 1, b: 2 })\n})\n\ntest('sha256', async () => {\n  // Test default behavior (random UUID)\n  const hash1 = await sha256()\n  const hash2 = await sha256()\n  expect(hash1).toHaveLength(64) // SHA-256 produces 64 character hex string\n  expect(hash2).toHaveLength(64)\n  expect(hash1).not.toBe(hash2) // Different UUIDs should produce different hashes\n\n  const hash3 = await sha256('foo')\n  const hash4 = await sha256('foo')\n  expect(hash3).toBe(hash4) // Same input should produce the same hash\n\n  const hash5 = await sha256('foo1')\n  expect(hash1).not.toBe(hash5)\n  expect(hash2).not.toBe(hash5)\n  expect(hash3).not.toBe(hash5)\n  expect(hash4).not.toBe(hash5)\n\n  expect(await sha256('test')).toMatchSnapshot()\n})\n\ntest('pruneEmpty', () => {\n  expect(\n    pruneEmpty({\n      a: 1,\n      b: { foo: true },\n      c: [true],\n      d: 'foo',\n      e: null,\n      f: undefined\n    })\n  ).toEqual({\n    a: 1,\n    b: { foo: true },\n    c: [true],\n    d: 'foo'\n  })\n\n  expect(pruneEmpty({ a: 0, b: {}, c: [], d: '' })).toEqual({\n    a: 0\n  })\n  expect(pruneEmpty({ b: {}, c: [], d: '' })).toEqual({})\n\n  expect(\n    pruneEmpty({\n      a: null,\n      b: { foo: [{}], bar: [null, undefined, ''] },\n      c: ['', '', ''],\n      d: '',\n      e: undefined,\n      f: [],\n      g: {}\n    })\n  ).toEqual({\n    b: { foo: [{}], bar: [null, undefined, ''] },\n    c: ['', '', '']\n  })\n})\n\ntest('pruneEmptyDeep', () => {\n  expect(\n    pruneEmptyDeep({ a: 1, b: { foo: true }, c: [true], d: 'foo' })\n  ).toEqual({\n    a: 1,\n    b: { foo: true },\n    c: [true],\n    d: 'foo'\n  })\n\n  expect(pruneEmptyDeep({ a: 0, b: {}, c: [], d: '' })).toEqual({\n    a: 0\n  })\n\n  expect(\n    pruneEmptyDeep({\n      a: null,\n      b: { foo: [{}], bar: [null, undefined, ''] },\n      c: ['', '', ''],\n      d: '',\n      e: undefined\n    })\n  ).toEqual(undefined)\n})\n\ntest('slugify', () => {\n  expect(slugify('Foo Bar')).toBe('foo-bar')\n  expect(slugify('FooBar')).toBe('foo-bar')\n  expect(slugify('FooBarBaz')).toBe('foo-bar-baz')\n  expect(slugify('FooBarBazQux')).toBe('foo-bar-baz-qux')\n  expect(slugify('FooBarBazQuxQuux')).toBe('foo-bar-baz-qux-quux')\n  expect(slugify('foo-bar')).toBe('foo-bar')\n  expect(slugify('--foo BAR --')).toBe('foo-bar')\n  expect(slugify('я люблю единорогов')).toBe('ya-lyublyu-edinorogov')\n  expect(slugify('fooBar 123 $#%')).toBe('foo-bar-123')\n  expect(slugify('  Déjà Vu!  ')).toBe('deja-vu')\n  expect(slugify('I ♥ Dogs')).toBe('i-love-dogs')\n  expect(slugify('')).toBe('')\n  expect(slugify('    ')).toBe('')\n  expect(slugify('-')).toBe('')\n  expect(slugify('--')).toBe('')\n  expect(slugify('- -')).toBe('')\n})\n"
  },
  {
    "path": "packages/platform-core/src/utils.ts",
    "content": "import type { z, ZodType } from 'zod'\nimport slugifyImpl from '@sindresorhus/slugify'\n\nimport { HttpError, ZodValidationError } from './errors'\n\nexport { default as parseJson } from 'parse-json'\n\n/**\n * From `inputObj`, create a new object that does not include `keys`.\n *\n * @example\n * ```js\n * omit({ a: 1, b: 2, c: 3 }, 'a', 'c') // { b: 2 }\n * ```\n */\nexport const omit = <\n  T extends Record<string, unknown> | object,\n  K extends keyof any\n>(\n  inputObj: T,\n  ...keys: K[]\n): Omit<T, K> => {\n  const keysSet = new Set(keys)\n  return Object.fromEntries(\n    Object.entries(inputObj).filter(([k]) => !keysSet.has(k as any))\n  ) as any\n}\n\n/**\n * From `inputObj`, create a new object that only includes `keys`.\n *\n * @example\n * ```js\n * pick({ a: 1, b: 2, c: 3 }, 'a', 'c') // { a: 1, c: 3 }\n * ```\n */\nexport const pick = <\n  T extends Record<string, unknown> | object,\n  K extends keyof T\n>(\n  inputObj: T,\n  ...keys: K[]\n): Pick<T, K> => {\n  const keysSet = new Set(keys)\n  return Object.fromEntries(\n    Object.entries(inputObj).filter(([k]) => keysSet.has(k as any))\n  ) as any\n}\n\nexport function assert(expr: unknown, message?: string): asserts expr\nexport function assert(\n  expr: unknown,\n  statusCode?: number,\n  message?: string\n): asserts expr\nexport function assert(\n  expr: unknown,\n  statusCodeOrMessage?: number | string,\n  message = 'Internal assertion failed'\n): asserts expr {\n  if (expr) {\n    return\n  }\n\n  if (typeof statusCodeOrMessage === 'number') {\n    const error = new HttpError({ statusCode: statusCodeOrMessage, message })\n    Error.captureStackTrace(error, assert)\n    throw error\n  } else {\n    const error = new Error(statusCodeOrMessage ?? message)\n    Error.captureStackTrace(error, assert)\n    throw error\n  }\n}\n\n/**\n * Parses the given input against the given Zod schema, throwing a\n * `ZodValidationError` if the input is invalid.\n */\nexport function parseZodSchema<TSchema extends ZodType<any, any, any>>(\n  schema: TSchema,\n  input: unknown,\n  {\n    error,\n    statusCode = 500\n  }: {\n    error?: string\n    statusCode?: number\n  } = {}\n): z.infer<TSchema> {\n  try {\n    return schema.parse(input)\n  } catch (err) {\n    throw new ZodValidationError({\n      prefix: error,\n      cause: err,\n      statusCode\n    })\n  }\n}\n\nexport async function sha256(\n  input: string | ArrayBuffer | ArrayBufferView = crypto.randomUUID()\n) {\n  let dataBuffer: ArrayBuffer | ArrayBufferView\n\n  if (typeof input === 'string') {\n    dataBuffer = new TextEncoder().encode(input)\n  } else {\n    dataBuffer = input\n  }\n\n  const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer as any)\n  const hashArray = Array.from(new Uint8Array(hashBuffer))\n  const hashHex = hashArray\n    .map((b) => ('00' + b.toString(16)).slice(-2))\n    .join('')\n  return hashHex\n}\n\nexport function getEnv(name: string): string | undefined {\n  try {\n    return typeof process !== 'undefined'\n      ? // eslint-disable-next-line no-process-env\n        process.env?.[name]\n      : undefined\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Creates a new `URLSearchParams` object with all values coerced to strings\n * that correctly handles arrays of values as repeated keys (or CSV) and\n * correctly removes `undefined` keys and values.\n */\nexport function sanitizeSearchParams(\n  searchParams:\n    | Record<\n        string,\n        string | number | boolean | string[] | number[] | boolean[] | undefined\n      >\n    | object = {},\n  {\n    csv = false\n  }: {\n    /**\n     * Whether to use comma-separated-values for arrays or multiple entries.\n     *\n     * Defaults to `false` and will use multiple entries.\n     */\n    csv?: boolean\n  } = {}\n): URLSearchParams {\n  const entries = Object.entries(searchParams).flatMap(([key, value]) => {\n    if (key === undefined || value === undefined) {\n      return []\n    }\n\n    if (Array.isArray(value)) {\n      return value.map((v) => [key, String(v)])\n    }\n\n    return [[key, String(value)]]\n  }) as [string, string][]\n\n  if (!csv) {\n    return new URLSearchParams(entries)\n  }\n\n  const csvEntries: Record<string, string> = {}\n  for (const [key, value] of entries) {\n    csvEntries[key] = csvEntries[key] ? `${csvEntries[key]},${value}` : value\n  }\n\n  return new URLSearchParams(csvEntries)\n}\n\nexport function pruneUndefined<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined> }> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([, value]) => value !== undefined)\n  ) as NonNullable<T>\n}\n\nexport function pruneNullOrUndefined<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined | null> }> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(\n      ([, value]) => value !== undefined && value !== null\n    )\n  ) as NonNullable<T>\n}\n\nexport function pruneNullOrUndefinedDeep<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined | null> }> {\n  if (!obj || Array.isArray(obj) || typeof obj !== 'object') return obj\n\n  return Object.fromEntries(\n    Object.entries(obj)\n      .filter(([, value]) => value !== undefined && value !== null)\n      .map(([key, value]) =>\n        Array.isArray(value)\n          ? [\n              key,\n              value\n                .filter((v) => v !== undefined && v !== null)\n                .map(pruneNullOrUndefinedDeep as any)\n            ]\n          : typeof value === 'object'\n            ? [key, pruneNullOrUndefinedDeep(value)]\n            : [key, value]\n      )\n  ) as NonNullable<T>\n}\n\nexport function pruneEmpty<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined | null> }> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([, value]) => {\n      if (value === undefined || value === null) return false\n      if (typeof value === 'string' && !value) return false\n      if (Array.isArray(value) && !value.length) return false\n      if (\n        typeof value === 'object' &&\n        !Array.isArray(value) &&\n        !Object.keys(value).length\n      ) {\n        return false\n      }\n\n      return true\n    })\n  ) as NonNullable<T>\n}\n\nexport function pruneEmptyDeep<T>(\n  value?: T\n):\n  | undefined\n  | (T extends Record<string, any>\n      ? { [K in keyof T]: Exclude<T[K], undefined | null> }\n      : T extends Array<infer U>\n        ? Array<Exclude<U, undefined | null>>\n        : Exclude<T, null>) {\n  if (value === undefined || value === null) return undefined\n\n  if (typeof value === 'string') {\n    if (!value) return undefined\n\n    return value as any\n  }\n\n  if (Array.isArray(value)) {\n    if (!value.length) return undefined\n\n    value = value\n      .map((v) => pruneEmptyDeep(v))\n      .filter((v) => v !== undefined) as any\n\n    if (!value || !Array.isArray(value) || !value.length) return undefined\n    return value as any\n  }\n\n  if (typeof value === 'object') {\n    if (!Object.keys(value).length) return undefined\n\n    value = Object.fromEntries(\n      Object.entries(value)\n        .map(([k, v]) => [k, pruneEmptyDeep(v)])\n        .filter(([, v]) => v !== undefined)\n    )\n\n    if (!value || !Object.keys(value).length) return undefined\n    return value as any\n  }\n\n  return value as any\n}\n\n/**\n * Slugifies a string.\n *\n * - converts to lowercase\n * - decamelizes (fooBar -> foo-bar)\n * - replaces non-latin characters with latin equivalents (transliteration)\n * - replaces spaces with hyphens\n * - removes trailing hyphens\n * - removes leading hyphens\n * - removes multiple consecutive hyphens\n * - removes multiple consecutive spaces\n *\n * @see https://github.com/sindresorhus/slugify\n */\nexport function slugify(input: string): string {\n  return slugifyImpl(input)\n}\n"
  },
  {
    "path": "packages/platform-core/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/tool-client/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-tool-client\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Main client for working with LLM tools hosted on the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/tool-client\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-api-client\": \"workspace:*\",\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-types\": \"workspace:*\",\n    \"@agentic/platform-validators\": \"workspace:*\",\n    \"ky\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/tool-client/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/platform-tool-client\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform-tool-client.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-tool-client <!-- omit from toc -->\n\n> Main client for working with LLM tools hosted on the Agentic platform.\n\nThe purpose of this package is to connect TypeScript LLM SDKs to Agentic's hosted tools via the `AgenticToolClient.fromIdentifier(...)` method.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n## Install\n\n```bash\nnpm i @agentic/platform-tool-client\n```\n\n## Usage\n\nThis example uses the [Vercel AI SDK](https://ai-sdk.dev) and the [`@agentic/search`](https://agentic.so/marketplace/projects/@agentic/search) tool.\n\n```ts\nimport 'dotenv/config'\n\nimport { createAISDKTools } from '@agentic/ai-sdk'\nimport { AgenticToolClient } from '@agentic/platform-tool-client'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { generateText } from 'ai'\n\nasync function main() {\n  const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n  const openai = createOpenAI({ compatibility: 'strict' })\n\n  const result = await generateText({\n    model: openai('gpt-4o-mini'),\n    tools: createAISDKTools(searchTool),\n    toolChoice: 'required',\n    temperature: 0,\n    system: 'You are a helpful assistant. Be as concise as possible.',\n    prompt: 'What is the weather in San Francisco?'\n  })\n\n  console.log(JSON.stringify(result.toolResults[0], null, 2))\n}\n\nawait main()\n```\n\nIf you have a subscription to the Agentic project, you can specify your API key either by using the `AGENTIC_API_KEY` environment variable, or by passing it explicitly:\n\n```ts\nconst searchTool = await AgenticToolClient.fromIdentifier('@agentic/search', {\n  apiKey: process.env.AGENTIC_API_KEY\n})\n```\n\nNow all tool calls will be associated with your subscription for usage-tracking and billing purposes.\n\n## Docs\n\nSee the [Agentic Quick Start](https://docs.agentic.so/marketplace) for more details on how to use Agentic tools with other TS LLM SDKs, MCP clients, and simple HTTP usage.\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/tool-client/src/agentic-tool-client.ts",
    "content": "import type { Deployment, Project } from '@agentic/platform-types'\nimport {\n  AIFunctionSet,\n  AIFunctionsProvider,\n  createAIFunction,\n  createJsonSchema,\n  getEnv\n} from '@agentic/core'\nimport { AgenticApiClient } from '@agentic/platform-api-client'\nimport { assert } from '@agentic/platform-core'\nimport { parseDeploymentIdentifier } from '@agentic/platform-validators'\nimport defaultKy, { type KyInstance } from 'ky'\n\nexport type AgenticToolClientOptions = {\n  /**\n   * Optional API key for your subscription to the Agentic project.\n   *\n   * If not set, will default to the `AGENTIC_API_KEY` environment variable.\n   *\n   * If no `apiKey` is set, the client will make unauthenticated tool calls,\n   * which may or may not be supported by the target Agentic project.\n   */\n  apiKey?: string\n\n  /**\n   * Optional custom Agentic API client.\n   */\n  agenticApiClient?: AgenticApiClient\n\n  /**\n   * Optional custom Agentic Gateway base URL.\n   *\n   * @default `https://gateway.agentic.so`\n   */\n  agenticGatewayBaseUrl?: string\n\n  /**\n   * Optional custom Ky instance.\n   *\n   * Useful for overriding the default headers, retry logic, etc.\n   */\n  ky?: KyInstance\n}\n\n/**\n * Agentic tool client which makes it easy to use an Agentic tool products with\n * all of the major TypeScript LLM SDKs, without having to go through any MCP\n * middleware.\n *\n * The resulting tool client will make simple HTTP calls to the Agentic Gateway\n * to execute tools.\n *\n * @example\n * ```ts\n * const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n * ```\n */\nexport class AgenticToolClient extends AIFunctionsProvider {\n  readonly apiKey: string | undefined\n  readonly project: Project\n  readonly deployment: Deployment\n  readonly agenticGatewayBaseUrl: string\n  readonly ky: KyInstance\n\n  protected constructor({\n    apiKey,\n    project,\n    deployment,\n    deploymentIdentifier,\n    agenticGatewayBaseUrl,\n    ky\n  }: {\n    apiKey: string | undefined\n    project: Project\n    deployment: Deployment\n    deploymentIdentifier: string\n    agenticGatewayBaseUrl: string\n    ky: KyInstance\n  }) {\n    super()\n\n    this.apiKey = apiKey\n    this.project = project\n    this.deployment = deployment\n    this.agenticGatewayBaseUrl = agenticGatewayBaseUrl\n    this.ky = apiKey\n      ? ky.extend({ headers: { Authorization: `Bearer ${apiKey}` } })\n      : ky\n\n    this._functions = new AIFunctionSet(\n      deployment.tools.map((tool) => {\n        return createAIFunction({\n          name: tool.name,\n          description: tool.description ?? '',\n          inputSchema: createJsonSchema(tool.inputSchema),\n          // TODO: we should make sure all agentic tools support OpenAI strict\n          // mode by default.\n          strict: false,\n          execute: async (json) => {\n            return ky\n              .post(\n                `${agenticGatewayBaseUrl}/${deploymentIdentifier}/${tool.name}`,\n                {\n                  json\n                }\n              )\n              .json()\n          }\n        })\n      })\n    )\n  }\n\n  /**\n   * Helper method to call a tool with either raw or stringified JSON arguments.\n   */\n  async callTool(toolName: string, args: string | Record<string, any>) {\n    const tool = this.functions.get(toolName)\n    assert(tool, `Tool \"${toolName}\" not found`)\n    return tool(typeof args === 'string' ? args : JSON.stringify(args))\n  }\n\n  /**\n   * Creates an Agentic tool client from a project or deployment identifier.\n   *\n   * You'll generally use a project identifier, which will automatically use\n   * that project's `latest` deployment, but if you want to target a specific\n   * version or preview deployment, you can use a fully-qualified deployment\n   * identifier.\n   *\n   * @param projectOrDeploymentIdentifier - The project or deployment identifier to use\n   * @param options.apiKey - Optional API key for authentication. If not provided,\n   *   automatically derived from the `AGENTIC_API_KEY` environment variable.\n   *   The key will start with `sk-...` and is found at https://agentic.so/app\n   *\n   * @example\n   * ```ts\n   * const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search')\n   * ```\n   *\n   * @example\n   * ```ts\n   * // With explicit API key\n   * const searchTool = await AgenticToolClient.fromIdentifier('@agentic/search', {\n   *   apiKey: 'sk-...'\n   * })\n   * ```\n   */\n  static async fromIdentifier(\n    projectOrDeploymentIdentifier: string,\n    {\n      apiKey = getEnv('AGENTIC_API_KEY'),\n      agenticApiClient = new AgenticApiClient(),\n      agenticGatewayBaseUrl = 'https://gateway.agentic.so',\n      ky = defaultKy\n    }: AgenticToolClientOptions = {}\n  ): Promise<AgenticToolClient> {\n    const { projectIdentifier, deploymentIdentifier, deploymentVersion } =\n      parseDeploymentIdentifier(projectOrDeploymentIdentifier, {\n        strict: false\n      })\n\n    const [project, rawDeployment] = await Promise.all([\n      agenticApiClient.getPublicProjectByIdentifier({\n        projectIdentifier,\n        populate:\n          deploymentVersion === 'latest' ? ['lastPublishedDeployment'] : []\n      }),\n\n      // Only make 1 API call in the 95% case where the deployment version is\n      // set to the default value of `latest`.\n      deploymentVersion === 'latest'\n        ? Promise.resolve(undefined)\n        : agenticApiClient.getPublicDeploymentByIdentifier({\n            deploymentIdentifier\n          })\n    ])\n\n    const deployment =\n      deploymentVersion === 'latest'\n        ? project?.lastPublishedDeployment\n        : rawDeployment\n\n    assert(project, `Project \"${projectIdentifier}\" not found`)\n    assert(deployment, `Deployment \"${deploymentIdentifier}\" not found`)\n\n    return new AgenticToolClient({\n      apiKey,\n      project,\n      deployment,\n      deploymentIdentifier,\n      agenticGatewayBaseUrl,\n      ky\n    })\n  }\n}\n"
  },
  {
    "path": "packages/tool-client/src/index.ts",
    "content": "export * from './agentic-tool-client'\n"
  },
  {
    "path": "packages/tool-client/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/types/bin/generate-project-config-json-schema.ts",
    "content": "import restoreCursor from 'restore-cursor'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\n\nimport { agenticProjectConfigSchema } from '../src'\n\nasync function main() {\n  restoreCursor()\n\n  const tempJsonSchema = zodToJsonSchema(agenticProjectConfigSchema)\n\n  const publicJsonSchema = {\n    ...tempJsonSchema,\n    $schema: 'https://json-schema.org/draft-07/schema',\n    // TODO\n    // $id: 'https://agentic.so/docs/schema.json',\n    title: 'Agentic Project Config Schema',\n    description:\n      'JSON Schema used by `agentic.config.{ts,js,json}` files to configure Agentic projects.'\n  }\n\n  // eslint-disable-next-line no-console\n  console.log(JSON.stringify(publicJsonSchema, null, 2))\n}\n\nawait main()\n"
  },
  {
    "path": "packages/types/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-types\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Core schemas and types shared across the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/types\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"generate\": \"run-s generate:*\",\n    \"generate:openapi\": \"openapi-typescript http://localhost:3001/docs --output ./src/openapi.d.ts\",\n    \"generate:json-schema\": \"tsx bin/generate-project-config-json-schema.ts > ../../apps/web/public/schema.json\",\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@agentic/platform-validators\": \"workspace:*\",\n    \"@hono/zod-openapi\": \"catalog:\",\n    \"ms\": \"catalog:\",\n    \"type-fest\": \"catalog:\",\n    \"zod\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@types/ms\": \"catalog:\",\n    \"openapi-typescript\": \"catalog:\",\n    \"restore-cursor\": \"catalog:\",\n    \"zod-to-json-schema\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/types/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/platform-types\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform-types.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-types <!-- omit from toc -->\n\n> Core schemas and types shared across the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n> [!TIP]\n> You likely don't need this package directly. See [@agentic/cli](https://github.com/transitive-bullshit/agentic/tree/main/packages/cli), [@agentic/platform](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform), and [@agentic/platform-tool-client](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform-tool-client) for more public-facing packages.\n\n## Install\n\n```bash\nnpm i @agentic/platform-types\n```\n\n## Usage\n\n```ts\nimport {\n  agenticProjectConfigSchema,\n  type AgenticProjectConfigInput,\n  resolvedAgenticProjectConfigSchema,\n  type ResolvedAgenticProjectConfig,\n  type User,\n  type Project,\n  type Deployment,\n  type Consumer,\n  type AdminMcpRequestMetadata\n  // etc...\n} from '@agentic/platform-types'\n```\n\n## Notes\n\nSome types are raw TS, some are derived from zod schemas, and most of the core database models are inferred from a generated OpenAPI spec exposed by Agentic's backend API.\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/types/src/__snapshots__/rate-limit.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`rateLimitSchema invalid 1`] = `\n[ZodError: [\n  {\n    \"code\": \"invalid_union\",\n    \"unionErrors\": [\n      {\n        \"issues\": [\n          {\n            \"code\": \"invalid_literal\",\n            \"expected\": false,\n            \"path\": [\n              \"enabled\"\n            ],\n            \"message\": \"Invalid literal value, expected false\"\n          }\n        ],\n        \"name\": \"ZodError\"\n      },\n      {\n        \"issues\": [\n          {\n            \"code\": \"invalid_union\",\n            \"unionErrors\": [\n              {\n                \"issues\": [\n                  {\n                    \"code\": \"invalid_type\",\n                    \"expected\": \"number\",\n                    \"received\": \"string\",\n                    \"path\": [\n                      \"interval\"\n                    ],\n                    \"message\": \"Expected number, received string\"\n                  }\n                ],\n                \"name\": \"ZodError\"\n              },\n              {\n                \"issues\": [\n                  {\n                    \"code\": \"too_small\",\n                    \"minimum\": 1,\n                    \"type\": \"string\",\n                    \"inclusive\": true,\n                    \"exact\": false,\n                    \"message\": \"String must contain at least 1 character(s)\",\n                    \"path\": [\n                      \"interval\"\n                    ]\n                  }\n                ],\n                \"name\": \"ZodError\"\n              }\n            ],\n            \"path\": [\n              \"interval\"\n            ],\n            \"message\": \"Invalid input\"\n          }\n        ],\n        \"name\": \"ZodError\"\n      }\n    ],\n    \"path\": [],\n    \"message\": \"Invalid input\"\n  }\n]]\n`;\n\nexports[`rateLimitSchema invalid 2`] = `\n[ZodError: [\n  {\n    \"code\": \"too_small\",\n    \"minimum\": 0,\n    \"type\": \"number\",\n    \"inclusive\": false,\n    \"exact\": false,\n    \"message\": \"Number must be greater than 0\",\n    \"path\": [\n      \"interval\"\n    ]\n  }\n]]\n`;\n\nexports[`rateLimitSchema invalid 3`] = `\n[ZodError: [\n  {\n    \"code\": \"custom\",\n    \"message\": \"Invalid interval \\\\\"--\\\\\"\",\n    \"path\": [\n      \"interval\",\n      \"interval\"\n    ]\n  }\n]]\n`;\n\nexports[`rateLimitSchema invalid 4`] = `\n[ZodError: [\n  {\n    \"code\": \"too_small\",\n    \"minimum\": 0,\n    \"type\": \"number\",\n    \"inclusive\": true,\n    \"exact\": false,\n    \"message\": \"Number must be greater than or equal to 0\",\n    \"path\": [\n      \"limit\"\n    ]\n  }\n]]\n`;\n\nexports[`rateLimitSchema valid 1`] = `\n{\n  \"enabled\": true,\n  \"interval\": 10,\n  \"limit\": 100,\n  \"mode\": \"approximate\",\n}\n`;\n\nexports[`rateLimitSchema valid 2`] = `\n{\n  \"enabled\": true,\n  \"interval\": 10,\n  \"limit\": 100,\n  \"mode\": \"approximate\",\n}\n`;\n\nexports[`rateLimitSchema valid 3`] = `\n{\n  \"enabled\": true,\n  \"interval\": 86400,\n  \"limit\": 1000,\n  \"mode\": \"strict\",\n}\n`;\n\nexports[`rateLimitSchema valid 4`] = `\n{\n  \"enabled\": false,\n}\n`;\n\nexports[`rateLimitSchema valid 5`] = `\n{\n  \"enabled\": false,\n}\n`;\n"
  },
  {
    "path": "packages/types/src/agentic-project-config.test.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport type { AgenticProjectConfigInput } from './agentic-project-config'\n\ntest('AgenticProjectConfig input types', () => {\n  expectTypeOf<{\n    name: 'test'\n    origin: {\n      type: 'openapi'\n      url: 'https://httpbin.org'\n      spec: './openapi.json'\n    }\n  }>().toExtend<AgenticProjectConfigInput>()\n\n  expectTypeOf<{\n    name: 'test'\n    origin: {\n      type: 'openapi'\n      url: 'https://httpbin.org'\n      spec: './openapi.json'\n    }\n    pricingPlans: [\n      {\n        name: 'Free'\n        slug: 'free'\n        lineItems: [\n          {\n            slug: 'base'\n            usageType: 'licensed'\n            amount: 0\n          }\n        ]\n      }\n    ]\n  }>().toExtend<AgenticProjectConfigInput>()\n\n  expectTypeOf<{\n    name: 'test'\n    origin: {\n      type: 'openapi'\n      url: 'https://httpbin.org'\n      spec: './openapi.json'\n    }\n    pricingPlans: [\n      {\n        name: 'Basic Monthly'\n        slug: 'basic-monthly'\n        lineItems: [\n          {\n            slug: 'requests'\n            usageType: 'metered'\n            billingScheme: 'per_unit'\n            unitAmount: 50\n          }\n        ]\n        rateLimit: {\n          // Make sure `interval` can use a string as input\n          interval: '30s'\n          limit: 100\n        }\n      }\n    ]\n  }>().toExtend<AgenticProjectConfigInput>()\n\n  expectTypeOf<{\n    name: 'test'\n    origin: {\n      type: 'openapi'\n      url: 'https://httpbin.org'\n      spec: './openapi.json'\n    }\n    pricingPlans: [\n      {\n        name: 'Basic Monthly'\n        slug: 'basic-monthly'\n        lineItems: [\n          {\n            slug: 'requests'\n            usageType: 'metered'\n            billingScheme: 'per_unit'\n            unitAmount: 50\n          }\n        ]\n        rateLimit: {\n          // Make sure `interval` can use a number as input\n          interval: 300\n          limit: 100\n        }\n      }\n    ]\n  }>().toExtend<AgenticProjectConfigInput>()\n\n  expectTypeOf<{\n    name: 'test'\n    origin: {\n      type: 'openapi'\n      url: 'https://httpbin.org'\n      spec: './openapi.json'\n    }\n    // Invalid because `pricingPlans` must be non-empty if defined\n    pricingPlans: []\n  }>().not.toExtend<AgenticProjectConfigInput>()\n\n  expectTypeOf<{\n    name: 'test'\n    origin: {\n      type: 'openapi'\n      url: 'https://httpbin.org'\n      spec: './openapi.json'\n    }\n    pricingPlans: [\n      {\n        name: 'Basic Monthly'\n        slug: 'basic-monthly'\n        // Invalid because `lineItems` must be non-empty\n        lineItems: []\n      }\n    ]\n  }>().not.toExtend<AgenticProjectConfigInput>()\n})\n"
  },
  {
    "path": "packages/types/src/agentic-project-config.ts",
    "content": "import type { Simplify } from 'type-fest'\nimport { isValidProjectSlug } from '@agentic/platform-validators'\nimport { z } from '@hono/zod-openapi'\n\nimport {\n  originAdapterConfigSchema,\n  originAdapterSchema\n} from './origin-adapter'\nimport {\n  defaultFreePricingPlan,\n  defaultRequestsRateLimit,\n  pricingIntervalListSchema,\n  type PricingPlanList,\n  type PricingPlanListInput,\n  pricingPlanListSchema\n} from './pricing'\nimport {\n  type RateLimit,\n  type RateLimitInput,\n  rateLimitSchema\n} from './rate-limit'\nimport {\n  type ToolConfig,\n  type ToolConfigInput,\n  toolConfigSchema,\n  toolSchema\n} from './tools'\n\n// TODO:\n// - optional external auth provider config (google, github, twitter, etc)\n// - optional stripe webhooks\n// - optional response header config (custom headers, immutability for caching, etc)\n// - optional agentic version\n// - optional version\n\nexport const agenticProjectConfigSchema = z\n  .object({\n    /**\n     * Display name for the project.\n     *\n     * Max length 1024 characters.\n     *\n     * @required\n     * @example \"My Project\"\n     * @example \"LinkedIn Resolver\"\n     */\n    name: z\n      .string()\n      .max(1024)\n      .nonempty()\n      .describe('Display name for the project. Max length 1024 characters.'),\n\n    /**\n     * Slug for the project.\n     *\n     * Must be ascii-only, lower-case, and kebab-case with no spaces between 1\n     * and 256 characters.\n     *\n     * The project's fully qualified identifier will be `@namespace/slug`, where\n     * the `namespace` is determined by the author's `username` or team slug.\n     *\n     * If not provided, the project `slug` will be derived by slugifying `name`.\n     *\n     * @example \"my-project\"\n     * @example \"linkedin-resolver-23\"\n     */\n    slug: z\n      .string()\n      .nonempty()\n      .describe(\n        'Unique project slug. Must be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters. If not provided, it will be derived by slugifying `name`.'\n      )\n      .optional()\n      .refine((slug) => (slug ? isValidProjectSlug(slug) : true), {\n        message: 'Invalid project slug'\n      }),\n\n    /**\n     * Optional semantic version of the project as a semver string.\n     *\n     * @example \"1.0.0\"\n     */\n    version: z\n      .string()\n      .nonempty()\n      .describe(\n        'Optional semantic version of the project as a semver string. Ex: 1.0.0, 0.0.1, 5.0.1, etc.'\n      )\n      .optional(),\n\n    /**\n     * Optional short description of the project.\n     *\n     * Should be no longer than a few lines.\n     */\n    description: z\n      .string()\n      .describe('A short description of the project.')\n      .optional(),\n\n    /**\n     * Optional markdown readme documenting the project (supports GitHub-flavored markdown).\n     *\n     * A string which may be either:\n     * - A URL to a remote markdown file (eg, `https://example.com/readme.md`)\n     * - A local file path (eg, `./readme.md`)\n     * - A data-uri string (eg, `data:text/markdown;base64,SGVsbG8gV29ybGQ=`)\n     */\n    readme: z\n      .string()\n      .describe(\n        'Optional markdown readme documenting the project (supports GitHub-flavored markdown).'\n      )\n      .optional(),\n\n    /**\n     * Optional logo image to use for the project.\n     *\n     * A string which may be either:\n     * - A URL to a remote image (eg, `https://example.com/logo.png`)\n     * - A local file path (eg, `./logo.png`)\n     * - A data-uri string (eg, `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...`)\n     *\n     * Logos should have a square aspect ratio.\n     *\n     * @example \"https://example.com/logo.png\"\n     */\n    icon: z\n      .string()\n      .optional()\n      .describe(\n        'Optional logo image to use for the project. Logos should have a square aspect ratio.'\n      ),\n\n    /**\n     * Optional URL to the source code of the project (eg, GitHub repo).\n     *\n     * @example \"https://github.com/my-org/my-project\"\n     */\n    sourceUrl: z\n      .string()\n      .url()\n      .describe(\n        'Optional URL to the source code of the project (eg, GitHub repo).'\n      )\n      .optional(),\n\n    /**\n     * Optional URL to the product's homepage.\n     *\n     * @example \"https://my-product.com\"\n     */\n    homepageUrl: z\n      .string()\n      .url()\n      .describe(\"Optional URL to the product's homepage.\")\n      .optional(),\n\n    /**\n     * Origin API adapter used to configure the origin API server downstream\n     * from Agentic's API gateway. It specifies whether the origin API server's\n     * is hosted externally or deployed internally to Agentic's infrastructure.\n     * If hosted externally, the origin `url` must be a valid \\`https\\` URL\n     * pointing to the remote origin server.\n     *\n     * It also specifies the format for how origin tools are defined: either as\n     * an OpenAPI spec or an MCP server.\n     *\n     * @note Currently, only external origin servers are supported. If you'd like\n     * to host your API or MCP server on Agentic's infrastructure, please reach\n     * out to support@agentic.so.\n     *\n     * @required\n     */\n    origin: originAdapterConfigSchema,\n\n    /** Optional subscription pricing config for this project. */\n    pricingPlans: pricingPlanListSchema\n      .describe(\n        'List of PricingPlans configuring which Stripe subscriptions should be available for the project. Defaults to a single free plan which is useful for developing and testing your project.'\n      )\n      .optional()\n      .default([defaultFreePricingPlan]),\n\n    /**\n     * Optional list of billing intervals to enable in pricing plans.\n     *\n     * Defaults to a single monthly interval `['month']`.\n     *\n     * To add support for annual pricing plans, for example, you can use:\n     * `['month', 'year']`.\n     *\n     * Note that for every pricing interval, you must define a corresponding set\n     * of PricingPlans in the `pricingPlans` array. If you only have one pricing\n     * interval (like the default `month` interval), `pricingPlans` don't need to\n     * specify their `interval` property. Otherwise, all PricingPlans must\n     * specify their `interval` property to differentiate between different\n     * pricing intervals.\n     */\n    pricingIntervals: pricingIntervalListSchema\n      .describe(\n        `Optional list of billing intervals to enable in the pricingPlans.\n\nDefaults to a single monthly interval \\`['month']\\`.\n\nTo add support for annual pricing plans, for example, you can use: \\`['month', 'year']\\`.`\n      )\n      .optional()\n      .default(['month']),\n\n    /**\n     * Optional default rate limits to enforce across all pricing plans.\n     *\n     * To disable the default rate-limit, set `defaultRateLimit.enabled` to\n     * `false`.\n     *\n     * Note that pricing-plan-specific rate-limits override this default (via\n     * `pricingPlans`), and tool-specific rate-limits may override both default\n     * and pricing-plan-specific rate-limits (via `toolConfigs`).\n     */\n    defaultRateLimit: rateLimitSchema\n      .optional()\n      .default(defaultRequestsRateLimit),\n\n    /**\n     * Optional list of tool configs to override the default behavior of\n     * specific tools.\n     *\n     * Make sure the tool `name` matches the origin server's tool names, either\n     * via its MCP server or OpenAPI operationIds.\n     *\n     * Tool names are expected to be unique and stable across deployments.\n     *\n     * With `toolConfigs`, tools can be disabled, set custom rate-limits,\n     * customize reporting usage for metered billing, and they can also\n     * override behavior for different pricing plans.\n     *\n     * For example, you may want to disable certain tools on a `free` pricing\n     * plan or remove the rate-limit for a specific tool on a `pro` pricing\n     * plan while keeping the defualt rate-limit in place for other tools.\n     *\n     * Note that tool-specific configs override the defaults defined in\n     * pricing plans.\n     *\n     * If a tool is defined on the origin server but not specified in\n     * `toolConfigs`, it will use the default behavior of the Agentic API\n     * gateway.\n     */\n    toolConfigs: z.array(toolConfigSchema).optional().default([])\n  })\n  .strip()\n\nexport type AgenticProjectConfigInput = Simplify<\n  Omit<\n    z.input<typeof agenticProjectConfigSchema>,\n    'pricingPlans' | 'toolConfigs'\n  > & {\n    pricingPlans?: PricingPlanListInput\n    toolConfigs?: ToolConfigInput[]\n    defaultRateLimit?: RateLimitInput\n  }\n>\nexport type AgenticProjectConfigRaw = z.output<\n  typeof agenticProjectConfigSchema\n>\nexport type AgenticProjectConfig = Simplify<\n  Omit<\n    AgenticProjectConfigRaw,\n    'pricingPlans' | 'toolConfigs' | 'defaultRateLimit'\n  > & {\n    slug: string\n    pricingPlans: PricingPlanList\n    toolConfigs: ToolConfig[]\n    defaultRateLimit: RateLimit\n  }\n>\n\nexport const resolvedAgenticProjectConfigSchema = agenticProjectConfigSchema\n  .required({\n    slug: true\n  })\n  .omit({\n    icon: true\n  })\n  .extend({\n    /**\n     * Optional logo image URL to use for the project. Logos should have a\n     * square aspect ratio.\n     *\n     * @example \"https://example.com/logo.png\"\n     */\n    iconUrl: z\n      .string()\n      .optional()\n      .describe(\n        'Optional logo image URL to use for the project. Logos should have a square aspect ratio.'\n      ),\n\n    origin: originAdapterSchema,\n    tools: z.array(toolSchema).default([])\n  })\nexport type ResolvedAgenticProjectConfig = Simplify<\n  Omit<\n    z.output<typeof resolvedAgenticProjectConfigSchema>,\n    'pricingPlans' | 'toolConfigs' | 'defaultRateLimit'\n  > & {\n    slug: string\n    pricingPlans: PricingPlanList\n    toolConfigs: ToolConfig[]\n    defaultRateLimit: RateLimit\n  }\n>\n"
  },
  {
    "path": "packages/types/src/auth-subjects.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nexport const authUserSchema = z.object({\n  type: z.literal('user'),\n  id: z.string(),\n  username: z.string()\n})\nexport type AuthUser = z.infer<typeof authUserSchema>\n"
  },
  {
    "path": "packages/types/src/index.ts",
    "content": "export * from './agentic-project-config'\nexport * from './auth-subjects'\nexport * from './mcp'\nexport type * as openapi from './openapi.d.ts'\nexport * from './origin-adapter'\nexport * from './pricing'\nexport * from './rate-limit'\nexport * from './tools'\nexport type * from './types'\nexport * from './utils'\nexport * from './webhook'\n"
  },
  {
    "path": "packages/types/src/mcp.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\n/**\n * Capabilities that a server may support.\n *\n * Known capabilities are defined here, in this schema, but this is not a\n * closed set: any server can define its own, additional capabilities.\n */\nexport const mcpServerCapabilitiesSchema = z\n  .object({\n    /**\n     * Experimental, non-standard capabilities that the server supports.\n     */\n    experimental: z.optional(z.object({}).passthrough()),\n\n    /**\n     * Present if the server supports sending log messages to the client.\n     */\n    logging: z.optional(z.object({}).passthrough()),\n\n    /**\n     * Present if the server supports sending completions to the client.\n     */\n    completions: z.optional(z.object({}).passthrough()),\n\n    /**\n     * Present if the server offers any prompt templates.\n     */\n    prompts: z.optional(\n      z\n        .object({\n          /**\n           * Whether this server supports issuing notifications for changes to\n           * the prompt list.\n           */\n          listChanged: z.optional(z.boolean())\n        })\n        .passthrough()\n    ),\n\n    /**\n     * Present if the server offers any resources to read.\n     */\n    resources: z.optional(\n      z\n        .object({\n          /**\n           * Whether this server supports clients subscribing to resource updates.\n           */\n          subscribe: z.optional(z.boolean()),\n\n          /**\n           * Whether this server supports issuing notifications for changes to\n           * the resource list.\n           */\n          listChanged: z.optional(z.boolean())\n        })\n        .passthrough()\n    ),\n\n    /**\n     * Present if the server offers any tools to call.\n     */\n    tools: z.optional(\n      z\n        .object({\n          /**\n           * Whether this server supports issuing notifications for changes to\n           * the tool list.\n           */\n          listChanged: z.optional(z.boolean())\n        })\n        .passthrough()\n    )\n  })\n  .passthrough()\n\n/**\n * After receiving an initialize request from the client, the server sends\n * this response.\n */\nexport const mcpServerInfoSchema = z.object({\n  /**\n   * The name of the MCP server.\n   */\n  name: z.string(),\n\n  /**\n   * The version of the MCP server.\n   */\n  version: z.string(),\n\n  /**\n   * The advertised capabilities of the MCP server.\n   */\n  capabilities: mcpServerCapabilitiesSchema.optional(),\n\n  /**\n   * Instructions describing how to use the server and its features.\n   *\n   * This can be used by clients to improve the LLM's understanding of\n   * available tools, resources, etc. It can be thought of like a \"hint\" to the\n   * model. For example, this information MAY be added to the system prompt.\n   */\n  instructions: z.string().optional()\n})\n"
  },
  {
    "path": "packages/types/src/openapi.d.ts",
    "content": "/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\nexport interface paths {\n    \"/v1/health\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Health check endpoint. */\n        get: operations[\"healthCheck\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/auth/password/signin\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Signs in with email and password. */\n        post: operations[\"signInWithPassword\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/auth/password/signup\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Signs up for a new account with email and password. */\n        post: operations[\"signUpWithPassword\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/auth/github/exchange\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Exchanges a GitHub OAuth code for an Agentic auth session. */\n        post: operations[\"exchangeOAuthCodeWithGitHub\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/auth/github/init\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Starts a GitHub OAuth flow. */\n        get: operations[\"initGitHubOAuthFlow\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/projects/public\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Lists projects that have been published publicly to the marketplace. */\n        get: operations[\"listPublicProjects\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/projects/public/by-identifier\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a public project by its public identifier (eg, \"@username/project-slug\"). */\n        get: operations[\"getPublicProjectByIdentifier\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/projects/public/{projectId}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a public project by ID. */\n        get: operations[\"getPublicProject\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/deployments/public/by-identifier\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a public deployment by its identifier (eg, \"@username/project-slug@latest\"). */\n        get: operations[\"getPublicDeploymentByIdentifier\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/users/{userId}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a user by ID. */\n        get: operations[\"getUser\"];\n        put?: never;\n        /** @description Updates a user by ID. */\n        post: operations[\"updateUser\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/teams\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Lists all teams the authenticated user belongs to. */\n        get: operations[\"listTeams\"];\n        put?: never;\n        /** @description Creates a new team. */\n        post: operations[\"createTeam\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/teams/{teamId}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a team by ID. */\n        get: operations[\"getTeam\"];\n        put?: never;\n        /** @description Updates a team. */\n        post: operations[\"updateTeam\"];\n        /** @description Deletes a team by ID. */\n        delete: operations[\"deleteTeam\"];\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/teams/{teamId}/members\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Creates a new team member. */\n        post: operations[\"createTeamMember\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/teams/{teamId}/members/{userId}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Updates a team member. */\n        post: operations[\"updateTeamMember\"];\n        /** @description Deletes a team member. */\n        delete: operations[\"deleteTeamMember\"];\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/storage/signed-upload-url\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a signed URL for uploading a file to Agentic's blob storage. Files are namespaced to a given project and are identified by a key that should be a hash of the file's contents, with the correct file extension. */\n        get: operations[\"getSignedStorageUploadUrl\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/projects\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Lists projects owned by the authenticated user or team. */\n        get: operations[\"listProjects\"];\n        put?: never;\n        /** @description Creates a new project. */\n        post: operations[\"createProject\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/projects/by-identifier\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a project by its public identifier (eg, \"@username/project-slug\"). */\n        get: operations[\"getProjectByIdentifier\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/projects/{projectId}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a project by ID. */\n        get: operations[\"getProject\"];\n        put?: never;\n        /** @description Updates a project. */\n        post: operations[\"updateProject\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/consumers/by-project-identifier\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a consumer for the authenticated user and the given project identifier. */\n        get: operations[\"getConsumerByProjectIdentifier\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/consumers/billing-portal\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Creates a Stripe billing portal session for the authenticated user. */\n        post: operations[\"createBillingPortalSession\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/consumers/{consumerId}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a consumer by ID. */\n        get: operations[\"getConsumer\"];\n        put?: never;\n        /** @description Updates a consumer's subscription to a different deployment or pricing plan. Set `plan` to undefined to cancel the subscription. */\n        post: operations[\"updateConsumer\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/consumers\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Lists all of the customer subscriptions for the current user. */\n        get: operations[\"listConsumers\"];\n        put?: never;\n        /** @description Upserts a consumer by modifying a customer's subscription to a project. */\n        post: operations[\"createConsumer\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/consumers/checkout\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Creates a Stripe checkout session for a consumer to modify their subscription to a project. */\n        post: operations[\"createConsumerCheckoutSession\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/consumers/{consumerId}/billing-portal\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Creates a Stripe billing portal session for a customer. */\n        post: operations[\"createConsumerBillingPortalSession\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/consumers/{consumerId}/refresh-api-key\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Refreshes a consumer's API key. */\n        post: operations[\"refreshConsumerApiKey\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/projects/{projectId}/consumers\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Lists all of the customers for a project. */\n        get: operations[\"listConsumersForProject\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/deployments/by-identifier\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a deployment by its identifier (eg, \"@username/project-slug@latest\"). */\n        get: operations[\"getDeploymentByIdentifier\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/deployments/{deploymentId}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a deployment by its ID */\n        get: operations[\"getDeployment\"];\n        put?: never;\n        /** @description Updates a deployment. */\n        post: operations[\"updateDeployment\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/deployments\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Lists deployments the user or team has access to, optionally filtering by project. */\n        get: operations[\"listDeployments\"];\n        put?: never;\n        /** @description Creates a new deployment within a project. */\n        post: operations[\"createDeployment\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/deployments/{deploymentId}/publish\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        put?: never;\n        /** @description Publishes a deployment. */\n        post: operations[\"publishDeployment\"];\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/admin/consumers/api-keys/{apiKey}\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a consumer by API key. This route is admin-only. */\n        get: operations[\"adminGetConsumerByApiKey\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/admin/consumers/{consumerId}/activate\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        get?: never;\n        /** @description Activates a consumer signifying that at least one API call has been made using the consumer's API token. This method is idempotent and admin-only. */\n        put: operations[\"adminActivateConsumer\"];\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n    \"/v1/admin/deployments/by-identifier\": {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        /** @description Gets a deployment by its public identifier. This route is admin-only. */\n        get: operations[\"adminGetDeploymentByIdentifier\"];\n        put?: never;\n        post?: never;\n        delete?: never;\n        options?: never;\n        head?: never;\n        patch?: never;\n        trace?: never;\n    };\n}\nexport type webhooks = Record<string, never>;\nexport interface components {\n    schemas: {\n        User: {\n            id: string;\n            createdAt: string;\n            updatedAt: string;\n            deletedAt?: string;\n            username: string;\n            /** @enum {string} */\n            role: \"user\" | \"admin\";\n            email: string;\n            isEmailVerified: boolean;\n            name?: string;\n            bio?: string;\n            image?: string;\n            stripeCustomerId?: string;\n        };\n        AuthSession: {\n            token: string;\n            user: components[\"schemas\"][\"User\"];\n        };\n        /** @description Public project identifier (e.g. \"@namespace/project-slug\") */\n        ProjectIdentifier: string;\n        /** @description The frequency at which a subscription is billed. */\n        PricingInterval: \"day\" | \"week\" | \"month\" | \"year\";\n        Team: Record<string, never>;\n        /** @description A Project represents a single Agentic API product. It is comprised of a series of immutable Deployments, each of which contains pricing data, origin API config, OpenAPI or MCP specs, tool definitions, and various metadata.\n         *\n         *     You can think of Agentic Projects as similar to Vercel projects. They both hold some common configuration and are comprised of a series of immutable Deployments.\n         *\n         *     Internally, Projects manage all of the Stripe billing resources across Deployments (Stripe Products, Prices, and Meters for usage-based billing). */\n        Project: {\n            /** @description Project id (e.g. \"proj_tz4a98xxat96iws9zmbrgj3a\") */\n            id: string;\n            createdAt: string;\n            updatedAt: string;\n            deletedAt?: string;\n            /** @description Display name for the project. Max length 1024 characters. */\n            name: string;\n            identifier: components[\"schemas\"][\"ProjectIdentifier\"];\n            namespace: string;\n            /** @description Unique project slug. Must be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters. If not provided, it will be derived by slugifying `name`. */\n            slug?: string;\n            private: boolean;\n            tags?: string[];\n            /** @description User id (e.g. \"user_tz4a98xxat96iws9zmbrgj3a\") */\n            userId: string;\n            /** @description Team id (e.g. \"team_tz4a98xxat96iws9zmbrgj3a\") */\n            teamId?: string;\n            /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n            lastPublishedDeploymentId?: string;\n            /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n            lastDeploymentId?: string;\n            lastPublishedDeploymentVersion?: string;\n            defaultPricingInterval: components[\"schemas\"][\"PricingInterval\"];\n            /** @enum {string} */\n            pricingCurrency: \"usd\";\n            user?: components[\"schemas\"][\"User\"];\n            team?: components[\"schemas\"][\"Team\"];\n            lastPublishedDeployment?: unknown;\n            lastDeployment?: unknown;\n            deployment?: unknown;\n        };\n        /** @description Public deployment identifier (e.g. \"@namespace/project-slug@{hash|version|latest}\") */\n        DeploymentIdentifier: string;\n        JsonSchemaObject: {\n            /** @enum {string} */\n            type: \"object\";\n            properties?: {\n                [key: string]: unknown;\n            };\n            required?: string[];\n            additionalProperties?: boolean | {\n                [key: string]: unknown;\n            };\n        };\n        Tool: {\n            /** @description Agentic tool name */\n            name: string;\n            description?: string;\n            inputSchema: components[\"schemas\"][\"JsonSchemaObject\"];\n            outputSchema?: components[\"schemas\"][\"JsonSchemaObject\"];\n            annotations?: {\n                title?: string;\n                readOnlyHint?: boolean;\n                destructiveHint?: boolean;\n                idempotentHint?: boolean;\n                openWorldHint?: boolean;\n            };\n        };\n        RateLimit: {\n            /** @enum {boolean} */\n            enabled: false;\n        } | {\n            /** @description The interval at which the rate limit is applied. Either a positive integer expressed in seconds or a valid positive [ms](https://github.com/vercel/ms) string (eg, \"10s\", \"1m\", \"8h\", \"2d\", \"1w\", \"1y\", etc). */\n            interval: number | string;\n            /** @description Maximum number of operations per interval (unitless). */\n            limit: number;\n            /**\n             * @description How to enforce the rate limit: \"strict\" (more precise but slower) or \"approximate\" (the default; faster and asynchronous but less precise).\n             * @default approximate\n             */\n            mode: \"strict\" | \"approximate\";\n            /** @default true */\n            enabled: boolean;\n        };\n        PricingPlanToolOverride: {\n            enabled?: boolean;\n            reportUsage?: boolean;\n            rateLimit?: components[\"schemas\"][\"RateLimit\"];\n        };\n        ToolConfig: {\n            /** @description Agentic tool name */\n            name: string;\n            enabled?: boolean;\n            pure?: boolean;\n            cacheControl?: string;\n            reportUsage?: boolean;\n            rateLimit?: components[\"schemas\"][\"RateLimit\"];\n            inputSchemaAdditionalProperties?: boolean;\n            outputSchemaAdditionalProperties?: boolean;\n            /** @description Allows you to override this tool's behavior or disable it entirely for different pricing plans. This is a map of PricingPlan slug to PricingPlanToolOverrides for that plan. */\n            pricingPlanOverridesMap?: {\n                [key: string]: components[\"schemas\"][\"PricingPlanToolOverride\"];\n            };\n            /** @description Examples of how to use this tool. Used to generate example usage in the tool's docs. */\n            examples?: {\n                /** @description The display name of the example. If not given, defaults to `Example 1`, `Example 2`, etc. */\n                name?: string;\n                /** @description The input prompt for agents to use when running this example. */\n                prompt: string;\n                /** @description An optional system prompt for agents to use when running this example. Defaults to `You are a helpful assistant. Be as concise as possible.` */\n                systemPrompt?: string;\n                /** @description The arguments to pass to the tool for this example. */\n                args: {\n                    [key: string]: unknown;\n                };\n                /** @description Whether this example should be featured in the docs for the project. */\n                featured?: boolean;\n                /** @description A description of the example. */\n                description?: string;\n            }[];\n        };\n        /**\n         * @description Display name for the pricing plan (eg, \"Free\", \"Starter Monthly\", \"Pro Annual\", etc)\n         * @example Starter Monthly\n         */\n        name: string;\n        /**\n         * @description PricingPlan slug (eg, \"free\", \"starter-monthly\", \"pro-annual\", etc). Should be lower-cased and kebab-cased. Should be stable across deployments.\n         * @example starter-monthly\n         */\n        slug: string;\n        /** @example API calls */\n        label: string;\n        PricingPlanTier: {\n            unitAmount?: number;\n            flatAmount?: number;\n            upTo: number | \"inf\";\n        };\n        /** @description PricingPlanLineItems represent a single line-item in a Stripe Subscription. They map to a Stripe billing `Price` and possibly a corresponding Stripe `Meter` for usage-based line-items. */\n        PricingPlanLineItem: {\n            slug: string;\n            label?: components[\"schemas\"][\"label\"];\n            /** @enum {string} */\n            usageType: \"licensed\";\n            amount: number;\n        } | {\n            slug: string;\n            label?: components[\"schemas\"][\"label\"];\n            /** @enum {string} */\n            usageType: \"metered\";\n            unitLabel?: string;\n            billingScheme: \"per_unit\" | \"tiered\";\n            unitAmount?: number;\n            tiersMode?: \"graduated\" | \"volume\";\n            tiers?: components[\"schemas\"][\"PricingPlanTier\"][];\n            defaultAggregation?: {\n                /** @default sum */\n                formula: \"sum\" | \"count\";\n            };\n            transformQuantity?: {\n                divideBy: number;\n                round: \"down\" | \"up\";\n            };\n        };\n        /** @description Represents the config for a Stripe subscription with one or more PricingPlanLineItems. */\n        PricingPlan: {\n            name: components[\"schemas\"][\"name\"];\n            slug: components[\"schemas\"][\"slug\"];\n            interval?: components[\"schemas\"][\"PricingInterval\"];\n            description?: string;\n            features?: string[];\n            trialPeriodDays?: number;\n            rateLimit?: components[\"schemas\"][\"RateLimit\"];\n            lineItems: components[\"schemas\"][\"PricingPlanLineItem\"][];\n        };\n        /** @description A Deployment is a single, immutable instance of a Project. Each deployment contains pricing plans, origin server config (OpenAPI or MCP server), tool definitions, and metadata.\n         *\n         *     Deployments are private to a developer or team until they are published, at which point they are accessible to any customers with access to the parent Project. */\n        Deployment: {\n            /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n            id: string;\n            createdAt: string;\n            updatedAt: string;\n            deletedAt?: string;\n            identifier: components[\"schemas\"][\"DeploymentIdentifier\"];\n            hash: string;\n            /** @description Optional semantic version of the project as a semver string. Ex: 1.0.0, 0.0.1, 5.0.1, etc. */\n            version?: string;\n            published: boolean;\n            /** @description Display name for the project. Max length 1024 characters. */\n            name: string;\n            /** @description A short description of the project. */\n            description?: string;\n            /** @description Optional markdown readme documenting the project (supports GitHub-flavored markdown). */\n            readme?: string;\n            /** @description Optional logo image URL to use for the project. Logos should have a square aspect ratio. */\n            iconUrl?: string;\n            /**\n             * Format: uri\n             * @description Optional URL to the source code of the project (eg, GitHub repo).\n             */\n            sourceUrl?: string;\n            /**\n             * Format: uri\n             * @description Optional URL to the product's homepage.\n             */\n            homepageUrl?: string;\n            /** @description User id (e.g. \"user_tz4a98xxat96iws9zmbrgj3a\") */\n            userId: string;\n            /** @description Team id (e.g. \"team_tz4a98xxat96iws9zmbrgj3a\") */\n            teamId?: string;\n            /** @description Project id (e.g. \"proj_tz4a98xxat96iws9zmbrgj3a\") */\n            projectId: string;\n            /** @default [] */\n            tools: components[\"schemas\"][\"Tool\"][];\n            /** @default [] */\n            toolConfigs: components[\"schemas\"][\"ToolConfig\"][];\n            /**\n             * @description List of PricingPlans configuring which Stripe subscriptions should be available for the project. Defaults to a single free plan which is useful for developing and testing your project.\n             * @default [\n             *       {\n             *         \"name\": \"Free\",\n             *         \"slug\": \"free\",\n             *         \"lineItems\": [\n             *           {\n             *             \"slug\": \"base\",\n             *             \"usageType\": \"licensed\",\n             *             \"amount\": 0\n             *           }\n             *         ],\n             *         \"rateLimit\": {\n             *           \"enabled\": true,\n             *           \"interval\": 60,\n             *           \"limit\": 1000,\n             *           \"mode\": \"approximate\"\n             *         }\n             *       }\n             *     ]\n             */\n            pricingPlans: components[\"schemas\"][\"PricingPlan\"][];\n            /**\n             * @description Optional list of billing intervals to enable in the pricingPlans.\n             *\n             *     Defaults to a single monthly interval `['month']`.\n             *\n             *     To add support for annual pricing plans, for example, you can use: `['month', 'year']`.\n             * @default [\n             *       \"month\"\n             *     ]\n             */\n            pricingIntervals: components[\"schemas\"][\"PricingInterval\"][];\n            defaultRateLimit?: components[\"schemas\"][\"RateLimit\"] & unknown;\n            project?: unknown;\n        };\n        TeamMember: {\n            createdAt: string;\n            updatedAt: string;\n            deletedAt?: string;\n            userId: string;\n            teamSlug: string;\n            teamId: string;\n            /** @enum {string} */\n            role: \"user\" | \"admin\";\n            confirmed: boolean;\n            confirmedAt?: string;\n        };\n        /** @description A Consumer represents a user who has subscribed to a Project and is used\n         *     to track usage and billing.\n         *\n         *     Consumers are linked to a corresponding Stripe Customer and Subscription.\n         *     The Stripe customer will either be the user's default Stripe Customer if the\n         *     project uses the default Agentic platform account, or a customer on the project\n         *     owner's connected Stripe account if the project has Stripe Connect enabled. */\n        Consumer: {\n            /** @description Consumer id (e.g. \"csmr_tz4a98xxat96iws9zmbrgj3a\") */\n            id: string;\n            createdAt: string;\n            updatedAt: string;\n            deletedAt?: string;\n            token: string;\n            plan?: string;\n            activated: boolean;\n            source?: string;\n            /** @description User id (e.g. \"user_tz4a98xxat96iws9zmbrgj3a\") */\n            userId: string;\n            /** @description Project id (e.g. \"proj_tz4a98xxat96iws9zmbrgj3a\") */\n            projectId: string;\n            /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n            deploymentId: string;\n            stripeStatus: string;\n            isStripeSubscriptionActive: boolean;\n            user?: components[\"schemas\"][\"User\"];\n            project?: components[\"schemas\"][\"Project\"];\n            deployment?: unknown;\n        };\n        /** @description Origin adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by `url` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools are defined: either an OpenAPI spec or an MCP server.\n         *\n         *     NOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so. */\n        OriginAdapterConfig: {\n            /**\n             * @default external\n             * @enum {string}\n             */\n            location: \"external\";\n            /**\n             * Format: uri\n             * @description Required base URL of the externally hosted origin API server. Must be a valid `https` URL.\n             *\n             *     NOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\n             */\n            url: string;\n            /** @enum {string} */\n            type: \"openapi\";\n            /** @description Local file path, URL, or JSON stringified OpenAPI spec describing the origin API server. */\n            spec: string;\n        } | {\n            /**\n             * @default external\n             * @enum {string}\n             */\n            location: \"external\";\n            /**\n             * Format: uri\n             * @description Required base URL of the externally hosted origin API server. Must be a valid `https` URL.\n             *\n             *     NOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\n             */\n            url: string;\n            /** @enum {string} */\n            type: \"mcp\";\n            headers?: {\n                [key: string]: string;\n            };\n        } | {\n            /**\n             * @default external\n             * @enum {string}\n             */\n            location: \"external\";\n            /**\n             * Format: uri\n             * @description Required base URL of the externally hosted origin API server. Must be a valid `https` URL.\n             *\n             *     NOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\n             */\n            url: string;\n            /** @enum {string} */\n            type: \"raw\";\n        };\n        AdminConsumer: {\n            /** @description Consumer id (e.g. \"csmr_tz4a98xxat96iws9zmbrgj3a\") */\n            id: string;\n            createdAt: string;\n            updatedAt: string;\n            deletedAt?: string;\n            token: string;\n            plan?: string;\n            activated: boolean;\n            source?: string;\n            /** @description User id (e.g. \"user_tz4a98xxat96iws9zmbrgj3a\") */\n            userId: string;\n            /** @description Project id (e.g. \"proj_tz4a98xxat96iws9zmbrgj3a\") */\n            projectId: string;\n            /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n            deploymentId: string;\n            stripeStatus: string;\n            isStripeSubscriptionActive: boolean;\n            user?: components[\"schemas\"][\"User\"];\n            project?: components[\"schemas\"][\"Project\"];\n            deployment?: unknown;\n            _stripeCustomerId: string;\n        };\n        /** @description Origin adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by `url` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools are defined: either an OpenAPI spec, an MCP server, or a raw HTTP REST API. */\n        OriginAdapter: {\n            /**\n             * @default external\n             * @enum {string}\n             */\n            location: \"external\";\n            /**\n             * Format: uri\n             * @description Required base URL of the externally hosted origin API server. Must be a valid `https` URL.\n             *\n             *     NOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\n             */\n            url: string;\n            /** @enum {string} */\n            type: \"openapi\";\n            /** @description JSON stringified OpenAPI spec describing the origin API server. */\n            spec: string;\n            /** @description Mapping from tool name to OpenAPI Operation info. This is used by the Agentic API gateway to route tools to the correct origin API operation, along with the HTTP method, path, params, etc. */\n            toolToOperationMap: {\n                [key: string]: {\n                    /** @description OpenAPI operationId for the tool */\n                    operationId: string;\n                    /** @description HTTP method */\n                    method: \"get\" | \"put\" | \"post\" | \"delete\" | \"patch\" | \"trace\";\n                    /** @description HTTP path template */\n                    path: string;\n                    /** @description Mapping from parameter name to HTTP source (query, path, JSON body, etc). */\n                    parameterSources: {\n                        [key: string]: \"query\" | \"header\" | \"path\" | \"cookie\" | \"body\" | \"formData\";\n                    };\n                    tags?: string[];\n                };\n            };\n        } | {\n            /**\n             * @default external\n             * @enum {string}\n             */\n            location: \"external\";\n            /**\n             * Format: uri\n             * @description Required base URL of the externally hosted origin API server. Must be a valid `https` URL.\n             *\n             *     NOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\n             */\n            url: string;\n            /** @enum {string} */\n            type: \"mcp\";\n            headers?: {\n                [key: string]: string;\n            };\n            serverInfo: {\n                name: string;\n                version: string;\n                capabilities?: {\n                    experimental?: Record<string, never>;\n                    logging?: Record<string, never>;\n                    completions?: Record<string, never>;\n                    prompts?: {\n                        listChanged?: boolean;\n                    };\n                    resources?: {\n                        subscribe?: boolean;\n                        listChanged?: boolean;\n                    };\n                    tools?: {\n                        listChanged?: boolean;\n                    };\n                };\n                instructions?: string;\n            };\n        } | {\n            /**\n             * @default external\n             * @enum {string}\n             */\n            location: \"external\";\n            /**\n             * Format: uri\n             * @description Required base URL of the externally hosted origin API server. Must be a valid `https` URL.\n             *\n             *     NOTE: Agentic currently only supports `external` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.\n             */\n            url: string;\n            /** @enum {string} */\n            type: \"raw\";\n        };\n        AdminDeployment: {\n            /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n            id: string;\n            createdAt: string;\n            updatedAt: string;\n            deletedAt?: string;\n            identifier: components[\"schemas\"][\"DeploymentIdentifier\"];\n            hash: string;\n            /** @description Optional semantic version of the project as a semver string. Ex: 1.0.0, 0.0.1, 5.0.1, etc. */\n            version?: string;\n            published: boolean;\n            /** @description Display name for the project. Max length 1024 characters. */\n            name: string;\n            /** @description A short description of the project. */\n            description?: string;\n            /** @description Optional markdown readme documenting the project (supports GitHub-flavored markdown). */\n            readme?: string;\n            /** @description Optional logo image URL to use for the project. Logos should have a square aspect ratio. */\n            iconUrl?: string;\n            /**\n             * Format: uri\n             * @description Optional URL to the source code of the project (eg, GitHub repo).\n             */\n            sourceUrl?: string;\n            /**\n             * Format: uri\n             * @description Optional URL to the product's homepage.\n             */\n            homepageUrl?: string;\n            /** @description User id (e.g. \"user_tz4a98xxat96iws9zmbrgj3a\") */\n            userId: string;\n            /** @description Team id (e.g. \"team_tz4a98xxat96iws9zmbrgj3a\") */\n            teamId?: string;\n            /** @description Project id (e.g. \"proj_tz4a98xxat96iws9zmbrgj3a\") */\n            projectId: string;\n            /** @default [] */\n            tools: components[\"schemas\"][\"Tool\"][];\n            /** @default [] */\n            toolConfigs: components[\"schemas\"][\"ToolConfig\"][];\n            /**\n             * @description List of PricingPlans configuring which Stripe subscriptions should be available for the project. Defaults to a single free plan which is useful for developing and testing your project.\n             * @default [\n             *       {\n             *         \"name\": \"Free\",\n             *         \"slug\": \"free\",\n             *         \"lineItems\": [\n             *           {\n             *             \"slug\": \"base\",\n             *             \"usageType\": \"licensed\",\n             *             \"amount\": 0\n             *           }\n             *         ],\n             *         \"rateLimit\": {\n             *           \"enabled\": true,\n             *           \"interval\": 60,\n             *           \"limit\": 1000,\n             *           \"mode\": \"approximate\"\n             *         }\n             *       }\n             *     ]\n             */\n            pricingPlans: components[\"schemas\"][\"PricingPlan\"][];\n            /**\n             * @description Optional list of billing intervals to enable in the pricingPlans.\n             *\n             *     Defaults to a single monthly interval `['month']`.\n             *\n             *     To add support for annual pricing plans, for example, you can use: `['month', 'year']`.\n             * @default [\n             *       \"month\"\n             *     ]\n             */\n            pricingIntervals: components[\"schemas\"][\"PricingInterval\"][];\n            defaultRateLimit?: components[\"schemas\"][\"RateLimit\"] & unknown;\n            project?: unknown;\n            origin: components[\"schemas\"][\"OriginAdapter\"];\n            _secret: string;\n        };\n    };\n    responses: {\n        /** @description Bad Request */\n        400: {\n            headers: {\n                [name: string]: unknown;\n            };\n            content: {\n                \"application/json\": {\n                    error: string;\n                    requestId: string;\n                };\n            };\n        };\n        /** @description Unauthorized */\n        401: {\n            headers: {\n                [name: string]: unknown;\n            };\n            content: {\n                \"application/json\": {\n                    error: string;\n                    requestId: string;\n                };\n            };\n        };\n        /** @description Forbidden */\n        403: {\n            headers: {\n                [name: string]: unknown;\n            };\n            content: {\n                \"application/json\": {\n                    error: string;\n                    requestId: string;\n                };\n            };\n        };\n        /** @description Not Found */\n        404: {\n            headers: {\n                [name: string]: unknown;\n            };\n            content: {\n                \"application/json\": {\n                    error: string;\n                    requestId: string;\n                };\n            };\n        };\n        /** @description Conflict */\n        409: {\n            headers: {\n                [name: string]: unknown;\n            };\n            content: {\n                \"application/json\": {\n                    error: string;\n                    requestId: string;\n                };\n            };\n        };\n        /** @description Gone */\n        410: {\n            headers: {\n                [name: string]: unknown;\n            };\n            content: {\n                \"application/json\": {\n                    error: string;\n                    requestId: string;\n                };\n            };\n        };\n    };\n    parameters: never;\n    requestBodies: never;\n    headers: never;\n    pathItems: never;\n}\nexport type $defs = Record<string, never>;\nexport interface operations {\n    healthCheck: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description OK */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": {\n                        status: string;\n                    };\n                };\n            };\n        };\n    };\n    signInWithPassword: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    /** Format: email */\n                    email: string;\n                    password: string;\n                };\n            };\n        };\n        responses: {\n            /** @description An auth session */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"AuthSession\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    signUpWithPassword: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    username: string;\n                    /** Format: email */\n                    email: string;\n                    password: string;\n                };\n            };\n        };\n        responses: {\n            /** @description An auth session */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"AuthSession\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    exchangeOAuthCodeWithGitHub: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    code: string;\n                };\n            };\n        };\n        responses: {\n            /** @description An auth session */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"AuthSession\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    initGitHubOAuthFlow: {\n        parameters: {\n            query: {\n                redirect_uri: string;\n                client_id?: string;\n                scope?: string;\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description Redirected to GitHub */\n            302: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content?: never;\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    listPublicProjects: {\n        parameters: {\n            query?: {\n                offset?: number | null;\n                limit?: number;\n                sort?: \"asc\" | \"desc\";\n                sortBy?: \"createdAt\" | \"updatedAt\";\n                populate?: (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\") | (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\")[];\n                tag?: string;\n                notTag?: string;\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A list of projects */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"][];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n        };\n    };\n    getPublicProjectByIdentifier: {\n        parameters: {\n            query: {\n                populate?: (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\") | (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\")[];\n                /** @description Public project identifier (e.g. \"@namespace/project-slug\") */\n                projectIdentifier: components[\"schemas\"][\"ProjectIdentifier\"];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A project */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getPublicProject: {\n        parameters: {\n            query?: {\n                populate?: (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\") | (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\")[];\n            };\n            header?: never;\n            path: {\n                /** @description Project ID */\n                projectId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A project */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getPublicDeploymentByIdentifier: {\n        parameters: {\n            query: {\n                populate?: (\"user\" | \"team\" | \"project\") | (\"user\" | \"team\" | \"project\")[];\n                /** @description Public deployment identifier (e.g. \"@namespace/project-slug@{hash|version|latest}\") */\n                deploymentIdentifier: components[\"schemas\"][\"DeploymentIdentifier\"];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A deployment object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Deployment\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getUser: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description User ID */\n                userId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A user object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"User\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    updateUser: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description User ID */\n                userId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    name?: string;\n                    bio?: string;\n                    image?: string;\n                };\n            };\n        };\n        responses: {\n            /** @description A user object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"User\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    listTeams: {\n        parameters: {\n            query?: {\n                offset?: number | null;\n                limit?: number;\n                sort?: \"asc\" | \"desc\";\n                sortBy?: \"createdAt\" | \"updatedAt\";\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A list of teams */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": (components[\"schemas\"][\"Team\"] & {\n                        id: string;\n                        createdAt: string;\n                        updatedAt: string;\n                        deletedAt?: string;\n                        slug: string;\n                        name: string;\n                        ownerId: string;\n                    })[];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n        };\n    };\n    createTeam: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    deletedAt?: string;\n                    slug: string;\n                    name: string;\n                };\n            };\n        };\n        responses: {\n            /** @description The created team */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Team\"] & {\n                        id: string;\n                        createdAt: string;\n                        updatedAt: string;\n                        deletedAt?: string;\n                        slug: string;\n                        name: string;\n                        ownerId: string;\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n        };\n    };\n    getTeam: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Team ID */\n                teamId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A team object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Team\"] & {\n                        id: string;\n                        createdAt: string;\n                        updatedAt: string;\n                        deletedAt?: string;\n                        slug: string;\n                        name: string;\n                        ownerId: string;\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    updateTeam: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Team ID */\n                teamId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    name?: string;\n                    /** @description User id (e.g. \"user_tz4a98xxat96iws9zmbrgj3a\") */\n                    ownerId: string;\n                };\n            };\n        };\n        responses: {\n            /** @description The updated team */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Team\"] & {\n                        id: string;\n                        createdAt: string;\n                        updatedAt: string;\n                        deletedAt?: string;\n                        slug: string;\n                        name: string;\n                        ownerId: string;\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    deleteTeam: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Team ID */\n                teamId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description The team that was deleted */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Team\"] & {\n                        id: string;\n                        createdAt: string;\n                        updatedAt: string;\n                        deletedAt?: string;\n                        slug: string;\n                        name: string;\n                        ownerId: string;\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    createTeamMember: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Team ID */\n                teamId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    /** @description User id (e.g. \"user_tz4a98xxat96iws9zmbrgj3a\") */\n                    userId: string;\n                    /** @enum {string} */\n                    role?: \"user\" | \"admin\";\n                };\n            };\n        };\n        responses: {\n            /** @description The created team member */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"TeamMember\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n        };\n    };\n    updateTeamMember: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Team ID */\n                teamId: string;\n                /** @description Team member user ID */\n                userId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    /** @enum {string} */\n                    role?: \"user\" | \"admin\";\n                };\n            };\n        };\n        responses: {\n            /** @description The updated team member */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"TeamMember\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    deleteTeamMember: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Team ID */\n                teamId: string;\n                /** @description Team member user ID */\n                userId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description The deleted team member */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"TeamMember\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getSignedStorageUploadUrl: {\n        parameters: {\n            query: {\n                /** @description Public project identifier (e.g. \"@namespace/project-slug\") */\n                projectIdentifier: components[\"schemas\"][\"ProjectIdentifier\"];\n                /** @description Should be a hash of the contents of the file to upload with the correct file extension (eg, \"9f86d081884c7d659a2feaa0c55ad015a.png\"). */\n                key: string;\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A signed upload URL */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": {\n                        /**\n                         * Format: uri\n                         * @description The signed upload URL.\n                         */\n                        signedUploadUrl: string;\n                        /**\n                         * Format: uri\n                         * @description The public URL the object will have once uploaded.\n                         */\n                        publicObjectUrl: string;\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    listProjects: {\n        parameters: {\n            query?: {\n                offset?: number | null;\n                limit?: number;\n                sort?: \"asc\" | \"desc\";\n                sortBy?: \"createdAt\" | \"updatedAt\";\n                populate?: (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\") | (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\")[];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A list of projects */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"][];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n        };\n    };\n    createProject: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    /** @description Display name for the project. Max length 1024 characters. */\n                    name: string;\n                    /** @description Unique project slug. Must be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters. If not provided, it will be derived by slugifying `name`. */\n                    slug?: string;\n                };\n            };\n        };\n        responses: {\n            /** @description The created project */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n        };\n    };\n    getProjectByIdentifier: {\n        parameters: {\n            query: {\n                populate?: (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\") | (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\")[];\n                /** @description Public project identifier (e.g. \"@namespace/project-slug\") */\n                projectIdentifier: components[\"schemas\"][\"ProjectIdentifier\"];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A project */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getProject: {\n        parameters: {\n            query?: {\n                populate?: (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\") | (\"user\" | \"team\" | \"lastPublishedDeployment\" | \"lastDeployment\")[];\n            };\n            header?: never;\n            path: {\n                /** @description Project ID */\n                projectId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A project */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    updateProject: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Project ID */\n                projectId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    name?: string;\n                };\n            };\n        };\n        responses: {\n            /** @description The updated project */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Project\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getConsumerByProjectIdentifier: {\n        parameters: {\n            query: {\n                /** @description Public project identifier (e.g. \"@namespace/project-slug\") */\n                projectIdentifier: components[\"schemas\"][\"ProjectIdentifier\"];\n                populate?: (\"user\" | \"project\" | \"deployment\") | (\"user\" | \"project\" | \"deployment\")[];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Consumer\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    createBillingPortalSession: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A billing portal session URL */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": {\n                        /** Format: uri */\n                        url: string;\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n            410: components[\"responses\"][\"410\"];\n        };\n    };\n    getConsumer: {\n        parameters: {\n            query?: {\n                populate?: (\"user\" | \"project\" | \"deployment\") | (\"user\" | \"project\" | \"deployment\")[];\n            };\n            header?: never;\n            path: {\n                /** @description Consumer ID */\n                consumerId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Consumer\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    updateConsumer: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Consumer ID */\n                consumerId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    plan?: string;\n                    /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n                    deploymentId?: string;\n                };\n            };\n        };\n        responses: {\n            /** @description A consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Consumer\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n            410: components[\"responses\"][\"410\"];\n        };\n    };\n    listConsumers: {\n        parameters: {\n            query?: {\n                offset?: number | null;\n                limit?: number;\n                sort?: \"asc\" | \"desc\";\n                sortBy?: \"createdAt\" | \"updatedAt\";\n                populate?: (\"user\" | \"project\" | \"deployment\") | (\"user\" | \"project\" | \"deployment\")[];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A list of consumers */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Consumer\"][];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    createConsumer: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    plan: string;\n                    source?: string;\n                    /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n                    deploymentId?: string;\n                };\n            };\n        };\n        responses: {\n            /** @description A consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Consumer\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n            410: components[\"responses\"][\"410\"];\n        };\n    };\n    createConsumerCheckoutSession: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    plan: string;\n                    source?: string;\n                    /** @description Deployment id (e.g. \"depl_tz4a98xxat96iws9zmbrgj3a\") */\n                    deploymentId?: string;\n                };\n            };\n        };\n        responses: {\n            /** @description A consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": {\n                        checkoutSession: {\n                            id: string;\n                            /** Format: uri */\n                            url: string;\n                        };\n                        consumer: components[\"schemas\"][\"Consumer\"];\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n            410: components[\"responses\"][\"410\"];\n        };\n    };\n    createConsumerBillingPortalSession: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Consumer ID */\n                consumerId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A billing portal session URL */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": {\n                        /** Format: uri */\n                        url: string;\n                    };\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n            410: components[\"responses\"][\"410\"];\n        };\n    };\n    refreshConsumerApiKey: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Consumer ID */\n                consumerId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Consumer\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    listConsumersForProject: {\n        parameters: {\n            query?: {\n                offset?: number | null;\n                limit?: number;\n                sort?: \"asc\" | \"desc\";\n                sortBy?: \"createdAt\" | \"updatedAt\";\n                populate?: (\"user\" | \"project\" | \"deployment\") | (\"user\" | \"project\" | \"deployment\")[];\n            };\n            header?: never;\n            path: {\n                /** @description Project ID */\n                projectId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A list of consumers subscribed to the given project */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Consumer\"][];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getDeploymentByIdentifier: {\n        parameters: {\n            query: {\n                populate?: (\"user\" | \"team\" | \"project\") | (\"user\" | \"team\" | \"project\")[];\n                /** @description Public deployment identifier (e.g. \"@namespace/project-slug@{hash|version|latest}\") */\n                deploymentIdentifier: components[\"schemas\"][\"DeploymentIdentifier\"];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A deployment object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Deployment\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    getDeployment: {\n        parameters: {\n            query?: {\n                populate?: (\"user\" | \"team\" | \"project\") | (\"user\" | \"team\" | \"project\")[];\n            };\n            header?: never;\n            path: {\n                /** @description deployment ID */\n                deploymentId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A deployment object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Deployment\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    updateDeployment: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description deployment ID */\n                deploymentId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    deletedAt?: string;\n                    description?: string;\n                };\n            };\n        };\n        responses: {\n            /** @description A deployment object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Deployment\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    listDeployments: {\n        parameters: {\n            query?: {\n                offset?: number | null;\n                limit?: number;\n                sort?: \"asc\" | \"desc\";\n                sortBy?: \"createdAt\" | \"updatedAt\";\n                populate?: (\"user\" | \"team\" | \"project\") | (\"user\" | \"team\" | \"project\")[];\n                /** @description Public project identifier (e.g. \"@namespace/project-slug\") */\n                projectIdentifier?: components[\"schemas\"][\"ProjectIdentifier\"];\n                /** @description Public deployment identifier (e.g. \"@namespace/project-slug@{hash|version|latest}\") */\n                deploymentIdentifier?: components[\"schemas\"][\"DeploymentIdentifier\"];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description A list of deployments */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Deployment\"][];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n        };\n    };\n    createDeployment: {\n        parameters: {\n            query?: {\n                publish?: \"true\" | \"false\";\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    /** @description Display name for the project. Max length 1024 characters. */\n                    name: string;\n                    /** @description Unique project slug. Must be ascii-only, lower-case, and kebab-case with no spaces between 1 and 256 characters. If not provided, it will be derived by slugifying `name`. */\n                    slug?: string;\n                    /** @description Optional semantic version of the project as a semver string. Ex: 1.0.0, 0.0.1, 5.0.1, etc. */\n                    version?: string;\n                    /** @description A short description of the project. */\n                    description?: string;\n                    /** @description Optional markdown readme documenting the project (supports GitHub-flavored markdown). */\n                    readme?: string;\n                    /** @description Optional logo image to use for the project. Logos should have a square aspect ratio. */\n                    icon?: string;\n                    /**\n                     * Format: uri\n                     * @description Optional URL to the source code of the project (eg, GitHub repo).\n                     */\n                    sourceUrl?: string;\n                    /**\n                     * Format: uri\n                     * @description Optional URL to the product's homepage.\n                     */\n                    homepageUrl?: string;\n                    origin: components[\"schemas\"][\"OriginAdapterConfig\"];\n                    /**\n                     * @description List of PricingPlans configuring which Stripe subscriptions should be available for the project. Defaults to a single free plan which is useful for developing and testing your project.\n                     * @default [\n                     *       {\n                     *         \"name\": \"Free\",\n                     *         \"slug\": \"free\",\n                     *         \"lineItems\": [\n                     *           {\n                     *             \"slug\": \"base\",\n                     *             \"usageType\": \"licensed\",\n                     *             \"amount\": 0\n                     *           }\n                     *         ],\n                     *         \"rateLimit\": {\n                     *           \"enabled\": true,\n                     *           \"interval\": 60,\n                     *           \"limit\": 1000,\n                     *           \"mode\": \"approximate\"\n                     *         }\n                     *       }\n                     *     ]\n                     */\n                    pricingPlans?: components[\"schemas\"][\"PricingPlan\"][];\n                    /**\n                     * @description Optional list of billing intervals to enable in the pricingPlans.\n                     *\n                     *     Defaults to a single monthly interval `['month']`.\n                     *\n                     *     To add support for annual pricing plans, for example, you can use: `['month', 'year']`.\n                     * @default [\n                     *       \"month\"\n                     *     ]\n                     */\n                    pricingIntervals?: components[\"schemas\"][\"PricingInterval\"][];\n                    defaultRateLimit?: components[\"schemas\"][\"RateLimit\"] & unknown;\n                    /** @default [] */\n                    toolConfigs?: components[\"schemas\"][\"ToolConfig\"][];\n                };\n            };\n        };\n        responses: {\n            /** @description A deployment object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Deployment\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n        };\n    };\n    publishDeployment: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description deployment ID */\n                deploymentId: string;\n            };\n            cookie?: never;\n        };\n        requestBody: {\n            content: {\n                \"application/json\": {\n                    version: string;\n                };\n            };\n        };\n        responses: {\n            /** @description A deployment object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"Deployment\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    adminGetConsumerByApiKey: {\n        parameters: {\n            query?: {\n                populate?: (\"user\" | \"project\" | \"deployment\") | (\"user\" | \"project\" | \"deployment\")[];\n            };\n            header?: never;\n            path: {\n                /** @description Consumer API key */\n                apiKey: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description An admin consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"AdminConsumer\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n    adminActivateConsumer: {\n        parameters: {\n            query?: never;\n            header?: never;\n            path: {\n                /** @description Consumer ID */\n                consumerId: string;\n            };\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description An admin consumer object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"AdminConsumer\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n            409: components[\"responses\"][\"409\"];\n            410: components[\"responses\"][\"410\"];\n        };\n    };\n    adminGetDeploymentByIdentifier: {\n        parameters: {\n            query: {\n                populate?: (\"user\" | \"team\" | \"project\") | (\"user\" | \"team\" | \"project\")[];\n                /** @description Public deployment identifier (e.g. \"@namespace/project-slug@{hash|version|latest}\") */\n                deploymentIdentifier: components[\"schemas\"][\"DeploymentIdentifier\"];\n            };\n            header?: never;\n            path?: never;\n            cookie?: never;\n        };\n        requestBody?: never;\n        responses: {\n            /** @description An admin deployment object */\n            200: {\n                headers: {\n                    [name: string]: unknown;\n                };\n                content: {\n                    \"application/json\": components[\"schemas\"][\"AdminDeployment\"];\n                };\n            };\n            400: components[\"responses\"][\"400\"];\n            401: components[\"responses\"][\"401\"];\n            403: components[\"responses\"][\"403\"];\n            404: components[\"responses\"][\"404\"];\n        };\n    };\n}\n"
  },
  {
    "path": "packages/types/src/origin-adapter.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nimport { mcpServerInfoSchema } from './mcp'\nimport { toolNameSchema } from './tools'\n\nexport const originAdapterLocationSchema = z.literal('external')\n// z.union([\n//   z.literal('external'),\n//   z.literal('internal')\n// ])\nexport type OriginAdapterLocation = z.infer<typeof originAdapterLocationSchema>\n\n// export const originAdapterInternalTypeSchema = z.union([\n//   z.literal('docker'),\n//   z.literal('mcp'),\n//   z.literal('python-fastapi'),\n//   // etc\n// ])\n// export type OriginAdapterInternalType = z.infer<\n//   typeof originAdapterInternalTypeSchema\n// >\n\nexport const commonOriginAdapterSchema = z.object({\n  location: originAdapterLocationSchema.optional().default('external'),\n\n  /** Required origin API HTTPS base URL */\n  url: z.string().url()\n    .describe(`Required base URL of the externally hosted origin API server. Must be a valid \\`https\\` URL.\n\nNOTE: Agentic currently only supports \\`external\\` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.`)\n\n  // TODO: Add support for `internal` hosted API servers\n  // internalType: originAdapterInternalTypeSchema.optional()\n})\n\n// TODO: add future support for:\n// - external mcp\n// - internal docker\n// - internal mcp\n// - internal http\n// - etc\n\nexport const openapiOriginAdapterConfigSchema = commonOriginAdapterSchema.merge(\n  z.object({\n    /**\n     * OpenAPI 3.x spec describing the origin API server.\n     */\n    type: z.literal('openapi'),\n\n    /**\n     * Local file path, URL, or JSON stringified OpenAPI spec describing the\n     * origin API server.\n     *\n     * Must be a 3.x OpenAPI spec (older versions are not supported).\n     */\n    spec: z\n      .string()\n      .describe(\n        'Local file path, URL, or JSON stringified OpenAPI spec describing the origin API server.'\n      )\n  })\n)\nexport type OpenAPIOriginAdapterConfig = z.infer<\n  typeof openapiOriginAdapterConfigSchema\n>\n\nexport const mcpOriginAdapterConfigSchema = commonOriginAdapterSchema.merge(\n  z.object({\n    /**\n     * MCP server.\n     */\n    type: z.literal('mcp'),\n\n    // Optional headers to pass to the origin API server\n    headers: z.record(z.string(), z.string()).optional()\n  })\n)\nexport type MCPOriginAdapterConfig = z.infer<\n  typeof mcpOriginAdapterConfigSchema\n>\n\n// TODO: Decide on whether to support `raw` origin adapters or not.\nexport const rawOriginAdapterConfigSchema = commonOriginAdapterSchema.merge(\n  z.object({\n    /**\n     * Marks the origin server as a raw HTTP REST API without any additional\n     * tool or service definitions.\n     *\n     * In this mode, Agentic's API gateway acts as a simple reverse-proxy\n     * to the origin server, without validating tools.\n     */\n    type: z.literal('raw')\n  })\n)\nexport type RawOriginAdapterConfig = z.infer<\n  typeof rawOriginAdapterConfigSchema\n>\n\n/**\n * Origin adapter is used to configure the origin API server downstream from\n * Agentic's API gateway. It specifies whether the origin API server denoted\n * by `url` is hosted externally or deployed internally to Agentic's\n * infrastructure. It also specifies the format for how origin tools are\n * defined: either an OpenAPI spec or an MCP server.\n *\n * NOTE: Agentic currently only supports `external` API servers. If you'd like\n * to host your API or MCP server on Agentic's infrastructure, please reach out\n * to support@agentic.so.\n */\nexport const originAdapterConfigSchema = z\n  .discriminatedUnion('type', [\n    openapiOriginAdapterConfigSchema,\n\n    mcpOriginAdapterConfigSchema,\n\n    rawOriginAdapterConfigSchema\n  ])\n  .describe(\n    `Origin adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by \\`url\\` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools are defined: either an OpenAPI spec or an MCP server.\n\nNOTE: Agentic currently only supports \\`external\\` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.`\n  )\n  .openapi('OriginAdapterConfig')\nexport type OriginAdapterConfig = z.infer<typeof originAdapterConfigSchema>\n\nexport const openapiOperationParameterSourceSchema = z.union([\n  z.literal('query'),\n  z.literal('header'),\n  z.literal('path'),\n  z.literal('cookie'),\n  z.literal('body'),\n  z.literal('formData')\n])\nexport type OpenAPIOperationParameterSource = z.infer<\n  typeof openapiOperationParameterSourceSchema\n>\n\nexport const openapiOperationHttpMethodSchema = z.union([\n  z.literal('get'),\n  z.literal('put'),\n  z.literal('post'),\n  z.literal('delete'),\n  z.literal('patch'),\n  z.literal('trace')\n])\nexport type OpenAPIOperationHttpMethod = z.infer<\n  typeof openapiOperationHttpMethodSchema\n>\n\nexport const openapiToolOperationSchema = z.object({\n  operationId: z.string().describe('OpenAPI operationId for the tool'),\n  method: openapiOperationHttpMethodSchema.describe('HTTP method'),\n  path: z.string().describe('HTTP path template'),\n  parameterSources: z\n    .record(z.string(), openapiOperationParameterSourceSchema)\n    .describe(\n      'Mapping from parameter name to HTTP source (query, path, JSON body, etc).'\n    ),\n  tags: z.array(z.string()).optional()\n})\nexport type OpenAPIToolOperation = z.infer<typeof openapiToolOperationSchema>\n\nexport const openapiOriginAdapterSchema = commonOriginAdapterSchema.merge(\n  z.object({\n    /**\n     * OpenAPI 3.x spec describing the origin API server.\n     */\n    type: z.literal('openapi'),\n\n    /**\n     * JSON stringified OpenAPI spec describing the origin API server.\n     *\n     * The origin API servers are be hidden in the embedded OpenAPI spec,\n     * because clients should only be aware of the upstream Agentic API\n     * gateway.\n     */\n    spec: z\n      .string()\n      .describe(\n        'JSON stringified OpenAPI spec describing the origin API server.'\n      ),\n\n    /**\n     * Mapping from tool name to OpenAPI Operation info.\n     *\n     * This is used by the Agentic API gateway to route tools to the correct\n     * origin API operation, along with the HTTP method, path, params, etc.\n     *\n     * @internal\n     */\n    toolToOperationMap: z\n      .record(toolNameSchema, openapiToolOperationSchema)\n      .describe(\n        'Mapping from tool name to OpenAPI Operation info. This is used by the Agentic API gateway to route tools to the correct origin API operation, along with the HTTP method, path, params, etc.'\n      )\n  })\n)\nexport type OpenAPIOriginAdapter = z.infer<typeof openapiOriginAdapterSchema>\n\nexport const mcpOriginAdapterSchema = commonOriginAdapterSchema.merge(\n  z.object({\n    /**\n     * MCP server.\n     */\n    type: z.literal('mcp'),\n\n    // Optional headers to pass to the origin API server\n    headers: z.record(z.string(), z.string()).optional(),\n\n    /**\n     * MCP server info: name, version, capabilities, instructions, etc.\n     */\n    serverInfo: mcpServerInfoSchema\n  })\n)\nexport type MCPOriginAdapter = z.infer<typeof mcpOriginAdapterSchema>\n\nexport const rawOriginAdapterSchema = commonOriginAdapterSchema.merge(\n  z.object({\n    /**\n     * Marks the origin server as a raw HTTP REST API without any additional\n     * tool or service definitions.\n     *\n     * In this mode, Agentic's API gateway acts as a simple reverse-proxy\n     * to the origin server, without validating tools.\n     *\n     * @note This mode is currently only for internal testing.\n     */\n    type: z.literal('raw')\n  })\n)\nexport type RawOriginAdapter = z.infer<typeof rawOriginAdapterSchema>\n\n/**\n * Origin adapter is used to configure the origin API server downstream from\n * Agentic's API gateway. It specifies whether the origin API server denoted\n * by `url` is hosted externally or deployed internally to Agentic's\n * infrastructure.\n *\n * It also specifies the format for how origin tools are defined: either an\n * OpenAPI spec or an MCP server.\n *\n * @note Currently, only external origin servers are supported. If you'd like\n * to host your API or MCP server on Agentic's infrastructure, please reach\n * out to support@agentic.so.\n */\nexport const originAdapterSchema = z\n  .discriminatedUnion('type', [\n    openapiOriginAdapterSchema,\n\n    mcpOriginAdapterSchema,\n\n    rawOriginAdapterSchema\n  ])\n  .describe(\n    `Origin adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by \\`url\\` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools are defined: either an OpenAPI spec, an MCP server, or a raw HTTP REST API.`\n  )\n  .openapi('OriginAdapter')\nexport type OriginAdapter = z.infer<typeof originAdapterSchema>\n"
  },
  {
    "path": "packages/types/src/pricing.test.ts",
    "content": "import { assert, expectTypeOf, test } from 'vitest'\n\nimport type {\n  CustomPricingPlanLineItemSlug,\n  PricingPlanLineItem,\n  PricingPlanList\n} from './pricing'\n\ntest('PricingPlanLineItem \"base\" type', () => {\n  expectTypeOf({\n    slug: 'base',\n    usageType: 'licensed',\n    amount: 100\n  } as const).toExtend<PricingPlanLineItem>()\n\n  expectTypeOf<{\n    slug: 'base'\n    usageType: 'licensed'\n    amount: number\n  }>().toExtend<PricingPlanLineItem>()\n})\n\ntest('PricingPlanLineItem \"requests\" per-unit type', () => {\n  expectTypeOf({\n    slug: 'requests',\n    usageType: 'metered',\n    billingScheme: 'per_unit',\n    unitAmount: 100\n  } as const).toExtend<PricingPlanLineItem>()\n\n  expectTypeOf<{\n    slug: 'requests'\n    usageType: 'metered'\n    billingScheme: 'per_unit'\n    unitAmount: number\n  }>().toExtend<PricingPlanLineItem>()\n\n  expectTypeOf({\n    slug: 'requests',\n    usageType: 'metered',\n    billingScheme: 'per_unit'\n    // invalid because `unitAmount` is required\n  } as const).not.toExtend<PricingPlanLineItem>()\n\n  expectTypeOf<{\n    slug: 'requests'\n    usageType: 'metered'\n    billingScheme: 'per_unit'\n    unitAmount?: number // invalid because `unitAmount` is required\n  }>().not.toExtend<PricingPlanLineItem>()\n})\n\ntest('PricingPlanLineItem \"requests\" tiered type', () => {\n  expectTypeOf<{\n    slug: 'requests'\n    usageType: 'metered'\n    billingScheme: 'tiered'\n    tiersMode: 'volume'\n    tiers: [\n      {\n        amount: 300\n        upTo: 1000\n      },\n      {\n        amount: 200\n        upTo: 2000\n      },\n      {\n        amount: 100\n        upTo: 'inf'\n      }\n    ]\n  }>().toExtend<PricingPlanLineItem>()\n})\n\ntest('PricingPlanLineItem \"custom\" licensed type', () => {\n  expectTypeOf({\n    slug: 'custom-licensed',\n    usageType: 'licensed',\n    amount: 100\n  } as const).toExtend<PricingPlanLineItem>()\n\n  expectTypeOf<{\n    slug: 'custom-licensed'\n    usageType: 'licensed'\n    amount: number\n  }>().toExtend<PricingPlanLineItem>()\n})\n\ntest('PricingPlanLineItem \"custom\" metered per-unit type', () => {\n  expectTypeOf({\n    slug: 'custom-test',\n    usageType: 'metered',\n    billingScheme: 'per_unit',\n    unitAmount: 100\n  } as const).toExtend<PricingPlanLineItem>()\n\n  expectTypeOf<{\n    slug: 'custom-test'\n    usageType: 'metered'\n    billingScheme: 'per_unit'\n    unitAmount: number\n  }>().toExtend<PricingPlanLineItem>()\n})\n\ntest('PricingPlanLineItem \"custom\" metered tiered type', () => {\n  expectTypeOf<{\n    slug: 'custom-test'\n    usageType: 'metered'\n    billingScheme: 'tiered'\n    tiersMode: 'volume'\n    tiers: [\n      {\n        amount: 300\n        upTo: 1000\n      },\n      {\n        amount: 200\n        upTo: 2000\n      },\n      {\n        amount: 100\n        upTo: 'inf'\n      }\n    ]\n  }>().toExtend<PricingPlanLineItem>()\n})\n\ntest('PricingPlanList type', () => {\n  // Empty array should be invalid\n  expectTypeOf<[]>().not.toExtend<PricingPlanList>()\n\n  // Empty lineItems should be invalid\n  expectTypeOf<\n    [\n      {\n        name: 'Free'\n        slug: 'free'\n        lineItems: []\n      }\n    ]\n  >().not.toExtend<PricingPlanList>()\n\n  expectTypeOf<\n    [\n      {\n        name: 'Free'\n        slug: 'free'\n        lineItems: [\n          {\n            slug: 'base'\n            usageType: 'licensed'\n            amount: 0\n          }\n        ]\n      }\n    ]\n  >().toExtend<PricingPlanList>()\n})\n\ntest('PricingPlanLineItem \"base\" type discrimination', () => {\n  const foo: PricingPlanLineItem = {\n    slug: 'base',\n    usageType: 'licensed',\n    amount: 100\n  }\n\n  expectTypeOf(foo).toExtend<PricingPlanLineItem>()\n\n  // These should fail if `slug` is not differentiating correctly.\n  expectTypeOf(foo).toExtend<{\n    slug: 'base'\n    usageType: 'licensed'\n    amount: number\n    label?: string\n  }>()\n  expectTypeOf<typeof foo>().toExtend<{\n    slug: 'base'\n  }>()\n  expectTypeOf<typeof foo>().toExtend<{\n    usageType: 'licensed'\n  }>()\n})\n\ntest('PricingPlanLineItem \"requests\" per-unit type discrimination', () => {\n  const foo: PricingPlanLineItem = {\n    slug: 'requests',\n    usageType: 'metered',\n    billingScheme: 'per_unit',\n    unitAmount: 100\n  }\n\n  expectTypeOf(foo).toExtend<PricingPlanLineItem>()\n\n  // These should fail if `slug` is not differentiating correctly.\n  expectTypeOf<typeof foo>().toExtend<{\n    slug: 'requests'\n  }>()\n  expectTypeOf<typeof foo>().toExtend<{\n    usageType: 'metered'\n  }>()\n  expectTypeOf<typeof foo>().toExtend<{\n    billingScheme: 'per_unit'\n  }>()\n  expectTypeOf<typeof foo>().toExtend<{\n    unitAmount: number\n  }>()\n})\n\ntest('PricingPlanLineItem \"metered\" type discrimination', () => {\n  const foo = {\n    usageType: 'metered'\n  } as PricingPlanLineItem\n\n  expectTypeOf(foo).toExtend<PricingPlanLineItem>()\n  assert(foo.usageType === 'metered')\n\n  // These should fail if `usageType` is not differentiating correctly.\n  expectTypeOf<typeof foo>().toExtend<{\n    slug: 'requests' | CustomPricingPlanLineItemSlug\n  }>()\n  expectTypeOf<typeof foo>().toExtend<{\n    billingScheme: 'per_unit' | 'tiered'\n  }>()\n})\n"
  },
  {
    "path": "packages/types/src/pricing.ts",
    "content": "import type { Simplify } from 'type-fest'\nimport { z } from '@hono/zod-openapi'\n\nimport { type RateLimit, rateLimitSchema } from './rate-limit'\n\n/**\n * PricingPlanTier is a single tier in a tiered pricing plan.\n */\nexport const pricingPlanTierSchema = z\n  .object({\n    unitAmount: z.number().optional(),\n    flatAmount: z.number().optional(),\n    upTo: z.union([z.number(), z.literal('inf')])\n  })\n  .refine(\n    (data) =>\n      (data.unitAmount !== undefined) !== (data.flatAmount !== undefined),\n    {\n      message: 'Either unitAmount or flatAmount must be provided, but not both'\n    }\n  )\n  .openapi('PricingPlanTier')\nexport type PricingPlanTier = z.infer<typeof pricingPlanTierSchema>\n\n/**\n * The frequency at which a subscription is billed.\n */\nexport const pricingIntervalSchema = z\n  .union([\n    z.literal('day'),\n    z.literal('week'),\n    z.literal('month'),\n    z.literal('year')\n  ])\n  .describe('The frequency at which a subscription is billed.')\n  .openapi('PricingInterval')\nexport type PricingInterval = z.infer<typeof pricingIntervalSchema>\n\n/**\n * List of billing intervals for subscriptions.\n */\nexport const pricingIntervalListSchema = z\n  .array(pricingIntervalSchema)\n  .nonempty({\n    message: 'Must contain at least one pricing interval'\n  })\n  .describe('List of billing intervals for subscriptions.')\n\n/**\n * Internal PricingPlanLineItem hash\n *\n * @internal\n */\nexport const pricingPlanLineItemHashSchema = z\n  .string()\n  .nonempty()\n  .describe('Internal PricingPlanLineItem hash')\n\n/**\n * PricingPlanLineItem slug which acts as a unique lookup key for LineItems\n * across deployments. They must be lower and kebab-cased (\"base\", \"requests\",\n * \"image-transformations\", etc).\n */\nexport const pricingPlanLineItemSlugSchema = z\n  .string()\n  .nonempty()\n  .describe(\n    'PricingPlanLineItem slug which acts as a unique lookup key for LineItems across deployments. They must be lower and kebab-cased (\"base\", \"requests\", \"image-transformations\").'\n  )\n\n/**\n * PricingPlan slug which acts as a unique lookup key for PricingPlans across deployments. They must be lower and kebab-cased and should have the interval as a suffix (\"free\", \"starter-monthly\", \"pro-annual\").\n */\nexport const pricingPlanSlugSchema = z\n  .string()\n  .nonempty()\n  .describe(\n    'PricingPlan slug which acts as a unique lookup key for PricingPlans across deployments. They must be lower and kebab-cased and should have the interval as a suffix (\"free\", \"starter-monthly\", \"pro-annual\").'\n  )\n\n/**\n * Map from internal PricingPlanLineItem **hash** to Stripe Price id\n */\nexport const stripePriceIdMapSchema = z\n  .record(pricingPlanLineItemHashSchema, z.string().describe('Stripe Price id'))\n  .describe('Map from internal PricingPlanLineItem **hash** to Stripe Price id')\n  .openapi('StripePriceIdMap')\nexport type StripePriceIdMap = z.infer<typeof stripePriceIdMapSchema>\n\n/**\n * Map from internal PricingPlanLineItem **slug** to Stripe Meter id\n */\nexport const stripeMeterIdMapSchema = z\n  .record(pricingPlanLineItemHashSchema, z.string().describe('Stripe Meter id'))\n  .describe('Map from internal PricingPlanLineItem **slug** to Stripe Meter id')\n  .openapi('StripeMeterIdMap')\nexport type StripeMeterIdMap = z.infer<typeof stripeMeterIdMapSchema>\n\n// export const pricingPlanLineItemTypeSchema = z.union([\n//   z.literal('base'),\n//   z.literal('requests'),\n//   z.literal('custom')\n// ])\n// export type PricingPlanLineItemType = z.infer<\n//   typeof pricingPlanLineItemTypeSchema\n// >\nexport type CustomPricingPlanLineItemSlug = `custom-${string}`\n\nconst commonPricingPlanLineItemSchema = z.object({\n  /**\n   * Slugs act as the primary key for LineItems. They should be lower-cased and\n   * kebab-cased (\"base\", \"requests\", \"image-transformations\").\n   *\n   * The `base` slug is reserved for a plan's default `licensed` line-item.\n   *\n   * The `requests` slug is reserved for charging using `metered` billing based\n   * on the number of request made during a given billing interval.\n   *\n   * All other PricingPlanLineItem `slugs` are considered custom LineItems.\n   *\n   * Should be stable across deployments, so if a slug refers to one type of\n   * product / line-item / metric in one deployment, it should refer to the same\n   * product / line-item / metric in future deployments, even if they are\n   * configured differently. If you are switching between a licensed and metered\n   * line-item across deployments, they must use different slugs.\n   */\n  slug: z.string(),\n\n  /**\n   * Optional label for the line-item which will be displayed on customer bills.\n   *\n   * If unset, the line-item's `slug` will be used as the label.\n   */\n  label: z.string().optional().openapi('label', { example: 'API calls' })\n})\n\n/**\n * Licensed LineItems are used to charge for fixed-price services.\n */\nexport const pricingPlanLicensedLineItemSchema =\n  commonPricingPlanLineItemSchema.merge(\n    z.object({\n      /**\n       * Licensed LineItems are used to charge for fixed-price services.\n       */\n      usageType: z.literal('licensed'),\n\n      /**\n       * The fixed amount to charge per billing interval.\n       *\n       * Specified in the smallest currency unit (e.g. cents for USD).\n       *\n       * So 100 = $1.00 USD, 1000 = $10.00 USD, etc.\n       */\n      amount: z.number().nonnegative()\n    })\n  )\n\n/**\n * Metered LineItems are used to charge for usage-based services.\n */\nexport const pricingPlanMeteredLineItemSchema =\n  commonPricingPlanLineItemSchema.merge(\n    z.object({\n      /**\n       * Metered LineItems are used to charge for usage-based services.\n       */\n      usageType: z.literal('metered'),\n\n      /**\n       * Optional label for the line-item which will be displayed on customer\n       * bills.\n       *\n       * If unset, the line-item's `slug` will be used as the unit label.\n       */\n      unitLabel: z.string().optional(),\n\n      /**\n       * Describes how to compute the price per period. Either `per_unit` or\n       * `tiered`.\n       *\n       * `per_unit` indicates that the fixed amount (specified in\n       * `unitAmount`) will be charged per unit of total usage.\n       *\n       * `tiered` indicates that the unit pricing will be computed using a\n       * tiering strategy as defined using `tiers` and `tiersMode`.\n       */\n      billingScheme: z.union([z.literal('per_unit'), z.literal('tiered')]),\n\n      /**\n       * The fixed amount to charge per unit of usage.\n       *\n       * Only applicable for `per_unit` billing schemes.\n       *\n       * Specified in the smallest currency unit (e.g. cents for USD).\n       *\n       * So 100 = $1.00 USD, 1000 = $10.00 USD, etc.\n       */\n      unitAmount: z.number().nonnegative().optional(),\n\n      // Only applicable for `tiered` billing schemes\n\n      /**\n       * Defines if the tiering price should be `graduated` or `volume` based.\n       *\n       * In `volume`-based tiering, the maximum quantity within a period\n       * determines the per unit price.\n       *\n       * In `graduated`-based tiering, the per-unit price changes successively\n       * as the quantity grows.\n       *\n       * This field requires `billingScheme` to be set to `tiered`.\n       */\n      tiersMode: z\n        .union([z.literal('graduated'), z.literal('volume')])\n        .optional(),\n\n      /**\n       * Pricing tiers for `tiered` billing schemes.\n       *\n       * This field requires `billingScheme` to be set to `tiered`.\n       */\n      tiers: z.array(pricingPlanTierSchema).nonempty().optional(),\n\n      // TODO: add support for tiered rate limits?\n\n      /**\n       * The default settings to aggregate the Stripe Meter's events with.\n       *\n       * Deafults to `{ formula: 'sum' }`.\n       */\n      defaultAggregation: z\n        .object({\n          /**\n           * Specifies how events are aggregated for a Stripe Meter.\n           * Allowed values are `count` to count the number of events and `sum`\n           * to sum each event's value .\n           *\n           * Defaults to `sum`.\n           */\n          formula: z\n            .union([z.literal('sum'), z.literal('count')])\n            .default('sum')\n        })\n        .optional(),\n\n      /**\n       * Optionally apply a transformation to the reported usage or set\n       * quantity before computing the amount billed.\n       *\n       * Cannot be combined with `tiers`.\n       */\n      transformQuantity: z\n        .object({\n          /**\n           * Divide usage by this number.\n           *\n           * Must be a positive number.\n           */\n          divideBy: z.number().positive(),\n\n          /**\n           * After division, either round the result `up` or `down`.\n           */\n          round: z.union([z.literal('down'), z.literal('up')])\n        })\n        .optional()\n    })\n  )\n\n/**\n * PricingPlanLineItems represent a single line-item in a Stripe Subscription.\n *\n * They map to a Stripe billing `Price` and possibly a corresponding Stripe\n * `Meter` for metered usage.\n */\nexport const pricingPlanLineItemSchema = z\n  .discriminatedUnion('usageType', [\n    pricingPlanLicensedLineItemSchema,\n    pricingPlanMeteredLineItemSchema\n  ])\n  .refine(\n    (data) => {\n      if (data.slug === 'base') {\n        return data.usageType === 'licensed'\n      }\n\n      return true\n    },\n    (data) => ({\n      message: `Invalid PricingPlanLineItem \"${data.slug}\": reserved \"base\" LineItems must have \"licensed\" usage type.`\n    })\n  )\n  .refine(\n    (data) => {\n      if (data.slug === 'requests') {\n        return data.usageType === 'metered'\n      }\n\n      return true\n    },\n    (data) => ({\n      message: `Invalid PricingPlanLineItem \"${data.slug}\": reserved \"requests\" LineItems must have \"metered\" usage type.`\n    })\n  )\n  .refine(\n    (data) => {\n      if (data.slug !== 'base' && data.slug !== 'requests') {\n        return data.slug.startsWith('custom-')\n      }\n\n      return true\n    },\n    (data) => ({\n      message: `Invalid PricingPlanLineItem \"${data.slug}\": custom line-item slugs must start with \"custom-\". This is required so that TypeScript can discriminate between custom and reserved line-items.`\n    })\n  )\n  .describe(\n    'PricingPlanLineItems represent a single line-item in a Stripe Subscription. They map to a Stripe billing `Price` and possibly a corresponding Stripe `Meter` for usage-based line-items.'\n  )\n  .openapi('PricingPlanLineItem')\n// export type PricingPlanLineItem = z.infer<typeof pricingPlanLineItemSchema>\n\n// These are more complex discriminated unions based on: `slug`, `usageType`,\n// and `billingScheme`. That's why we're not using zod's inference directly\n// for these types. See `./pricing.test.ts` for examples.\nexport type PricingPlanLineItemInput =\n  // \"base\" licensed line-item\n  | Simplify<\n      {\n        slug: 'base'\n      } & z.input<typeof pricingPlanLicensedLineItemSchema>\n    >\n  // \"custom\" licensed line-item\n  | Simplify<\n      {\n        slug: CustomPricingPlanLineItemSlug\n        usageType: 'licensed'\n      } & z.input<typeof pricingPlanLicensedLineItemSchema>\n    >\n  // \"requests\" metered per-unit line-item\n  | Simplify<\n      {\n        slug: 'requests'\n        usageType: 'metered'\n        billingScheme: 'per_unit'\n        unitAmount: number\n      } & Omit<\n        z.input<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'per_unit'\n        },\n        'tiers' | 'tiersMode'\n      >\n    >\n  // \"requests\" metered tiered line-item\n  | Simplify<\n      {\n        slug: 'requests'\n        usageType: 'metered'\n        billingScheme: 'tiered'\n      } & Omit<\n        z.input<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'tiered'\n        },\n        'unitAmount' | 'transformQuantity'\n      >\n    >\n  // \"custom\" metered per-unit line-item\n  | Simplify<\n      {\n        slug: CustomPricingPlanLineItemSlug\n        usageType: 'metered'\n        billingScheme: 'per_unit'\n        unitAmount: number\n      } & Omit<\n        z.input<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'per_unit'\n        },\n        'tiers' | 'tiersMode'\n      >\n    >\n  // \"custom\" metered tiered line-item\n  | Simplify<\n      {\n        slug: CustomPricingPlanLineItemSlug\n        usageType: 'metered'\n        billingScheme: 'tiered'\n      } & Omit<\n        z.input<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'tiered'\n        },\n        'unitAmount' | 'transformQuantity'\n      >\n    >\n\nexport type PricingPlanLineItem =\n  // \"base\" licensed line-item\n  | Simplify<\n      {\n        slug: 'base'\n      } & z.infer<typeof pricingPlanLicensedLineItemSchema>\n    >\n  // \"custom\" licensed line-item\n  | Simplify<\n      {\n        slug: CustomPricingPlanLineItemSlug\n        usageType: 'licensed'\n      } & z.infer<typeof pricingPlanLicensedLineItemSchema>\n    >\n  // \"requests\" metered per-unit line-item\n  | Simplify<\n      {\n        slug: 'requests'\n        usageType: 'metered'\n        billingScheme: 'per_unit'\n        unitAmount: number\n      } & Omit<\n        z.infer<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'per_unit'\n        },\n        'tiers' | 'tiersMode'\n      >\n    >\n  // \"requests\" metered tiered line-item\n  | Simplify<\n      {\n        slug: 'requests'\n        usageType: 'metered'\n        billingScheme: 'tiered'\n      } & Omit<\n        z.infer<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'tiered'\n        },\n        'unitAmount' | 'transformQuantity'\n      >\n    >\n  // \"custom\" metered per-unit line-item\n  | Simplify<\n      {\n        slug: CustomPricingPlanLineItemSlug\n        usageType: 'metered'\n        billingScheme: 'per_unit'\n        unitAmount: number\n      } & Omit<\n        z.infer<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'per_unit'\n        },\n        'tiers' | 'tiersMode'\n      >\n    >\n  // \"custom\" metered tiered line-item\n  | Simplify<\n      {\n        slug: CustomPricingPlanLineItemSlug\n        usageType: 'metered'\n        billingScheme: 'tiered'\n      } & Omit<\n        z.infer<typeof pricingPlanMeteredLineItemSchema> & {\n          billingScheme: 'tiered'\n        },\n        'unitAmount' | 'transformQuantity'\n      >\n    >\n\n/**\n * Represents the config for a single Stripe subscription plan with one or more\n * LineItems.\n */\nexport const pricingPlanSchema = z\n  .object({\n    /**\n     * Display name for the pricing plan.\n     *\n     * Used in UI and billing invoices.\n     *\n     * @required\n     * @example \"Free\"\n     * @example \"Starter Monthly\"\n     * @example \"Pro Annual\"\n     */\n    name: z\n      .string()\n      .nonempty()\n      .describe(\n        'Display name for the pricing plan (eg, \"Free\", \"Starter Monthly\", \"Pro Annual\", etc)'\n      )\n      .openapi('name', { example: 'Starter Monthly' }),\n\n    /**\n     * A unique slug for the pricing plan which acts as a stable identifier\n     * across deployments.\n     *\n     * Should be lower-kebab-cased.\n     * Should be stable across deployments.\n     *\n     * For all plans aside from `free`, the `slug` should include the `interval`\n     * as a suffix so pricing plans can be uniquely differentiated from each\n     * other across billing intervals.\n     *\n     * @required\n     * @example \"free\"\n     * @example \"starter-monthly\"\n     * @example \"pro-annual\"\n     */\n    slug: z\n      .string()\n      .nonempty()\n      .describe(\n        'PricingPlan slug (eg, \"free\", \"starter-monthly\", \"pro-annual\", etc). Should be lower-cased and kebab-cased. Should be stable across deployments.'\n      )\n      // TODO: Make `slug` optional and derive it from `name` if not provided.\n      .openapi('slug', { example: 'starter-monthly' }),\n\n    /**\n     * The frequency at which this subscription is billed.\n     */\n    interval: pricingIntervalSchema.optional(),\n\n    /**\n     * Optional description of the pricing plan (UI-only).\n     */\n    description: z.string().optional(),\n\n    /**\n     * Optional list of features of the pricing plan (UI-only).\n     */\n    features: z.array(z.string()).optional(),\n\n    /**\n     * Optional number of days for a free trial period when a customer signs up\n     * for a new subscription.\n     */\n    trialPeriodDays: z.number().nonnegative().optional(),\n\n    /**\n     * Optional rate limit to enforce for this pricing plan.\n     *\n     * You can use this to limit the number of API requests that can be made by\n     * a customer during a given interval.\n     *\n     * If not set, the pricing plan will inherit the default platform rate-limit\n     * set by `defaultRateLimit` in the Agentic project config.\n     *\n     * You can disable rate-limiting for this pricing plan by setting\n     * `rateLimit.enabled` to `false`.\n     *\n     * Note that tool-specific rate limits may override pricing-plan-specific\n     * rate-limits via `toolConfigs` in the Agentic project config.\n     */\n    rateLimit: rateLimitSchema.optional(),\n\n    /**\n     * List of LineItems which are included in the PricingPlan.\n     *\n     * Note: Agentic currently supports a max of 20 LineItems per pricing plan.\n     */\n    lineItems: z.array(pricingPlanLineItemSchema).nonempty().max(20, {\n      message:\n        'Agentic currently supports a max of 20 LineItems per pricing plan.'\n    })\n  })\n  .describe(\n    'Represents the config for a Stripe subscription with one or more PricingPlanLineItems.'\n  )\n  .openapi('PricingPlan')\n// export type PricingPlan = z.infer<typeof pricingPlanSchema>\n\nexport type PricingPlanInput = Simplify<\n  Omit<z.input<typeof pricingPlanSchema>, 'lineItems'> & {\n    lineItems: [PricingPlanLineItemInput, ...PricingPlanLineItemInput[]]\n  }\n>\n\nexport type PricingPlan = Simplify<\n  Omit<z.infer<typeof pricingPlanSchema>, 'lineItems'> & {\n    lineItems: [PricingPlanLineItem, ...PricingPlanLineItem[]]\n  }\n>\n\n/**\n * Map from PricingPlanLineItem **slug** to Stripe Product id\n */\nexport const stripeProductIdMapSchema = z\n  .record(\n    pricingPlanLineItemSlugSchema,\n    z.string().describe('Stripe Product id')\n  )\n  .describe('Map from PricingPlanLineItem **slug** to Stripe Product id')\n  .openapi('StripeProductIdMap')\nexport type StripeProductIdMap = z.infer<typeof stripeProductIdMapSchema>\n\n/**\n * List of PricingPlans\n */\nexport const pricingPlanListSchema = z\n  .array(pricingPlanSchema)\n  .nonempty({\n    message: 'Must contain at least one PricingPlan'\n  })\n  .describe('List of PricingPlans')\nexport type PricingPlanListInput = [PricingPlanInput, ...PricingPlanInput[]]\nexport type PricingPlanList = [PricingPlan, ...PricingPlan[]]\n\n/**\n * Map from internal PricingPlanLineItem **slug** to Stripe Subscription Item id\n */\nexport const stripeSubscriptionItemIdMapSchema = z\n  .record(\n    pricingPlanLineItemSlugSchema,\n    z.string().describe('Stripe Subscription Item id')\n  )\n  .describe(\n    'Map from internal PricingPlanLineItem **slug** to Stripe Subscription Item id'\n  )\n  .openapi('StripeSubscriptionItemIdMap')\nexport type StripeSubscriptionItemIdMap = z.infer<\n  typeof stripeSubscriptionItemIdMapSchema\n>\n\n// export const couponSchema = z\n//   .object({\n//     // used to uniquely identify this coupon across deployments\n//     id: z.string(),\n\n//     valid: z.boolean(),\n//     stripeCoupon: z.string(),\n\n//     name: z.string().optional(),\n\n//     currency: z.string().optional(),\n//     amount_off: z.number().optional(),\n//     percent_off: z.number().optional(),\n\n//     duration: z.string(),\n//     duration_in_months: z.number().optional(),\n\n//     redeem_by: z.date().optional(),\n//     max_redemptions: z.number().optional()\n//   })\n//   .openapi('Coupon')\n// export type Coupon = z.infer<typeof couponSchema>\n\n/**\n * The default platform rate limit for `requests` is a limit of 1000 requests\n * per minute per customer.\n */\nexport const defaultRequestsRateLimit = {\n  enabled: true,\n  interval: 60,\n  limit: 1000,\n  mode: 'approximate'\n} as const satisfies Readonly<RateLimit>\n\n/**\n * The default free pricing plan which is used for projects that don't specify\n * custom pricing plans.\n */\nexport const defaultFreePricingPlan = {\n  name: 'Free',\n  slug: 'free',\n  lineItems: [\n    {\n      slug: 'base',\n      usageType: 'licensed',\n      amount: 0\n    }\n  ],\n  rateLimit: defaultRequestsRateLimit\n} as const satisfies Readonly<PricingPlan>\n"
  },
  {
    "path": "packages/types/src/rate-limit.test.ts",
    "content": "import { expect, expectTypeOf, test } from 'vitest'\n\nimport {\n  type RateLimit,\n  type RateLimitInput,\n  rateLimitSchema\n} from './rate-limit'\n\ntest('rateLimitSchema valid', () => {\n  expect(\n    rateLimitSchema.parse({\n      interval: 10,\n      limit: 100\n    })\n  ).toMatchSnapshot()\n\n  expect(\n    rateLimitSchema.parse({\n      interval: '10s',\n      limit: 100\n    })\n  ).toMatchSnapshot()\n\n  expect(\n    rateLimitSchema.parse({\n      interval: '1 day',\n      limit: 1000,\n      mode: 'strict'\n    })\n  ).toMatchSnapshot()\n\n  expect(\n    rateLimitSchema.parse({\n      enabled: false\n    })\n  ).toMatchSnapshot()\n\n  expect(\n    rateLimitSchema.parse({\n      interval: '10m',\n      limit: 100,\n      mode: 'strict',\n      enabled: false\n    })\n  ).toMatchSnapshot()\n})\n\ntest('rateLimitSchema invalid', () => {\n  expect(() =>\n    rateLimitSchema.parse({\n      interval: '',\n      limit: 5\n    })\n  ).toThrowErrorMatchingSnapshot()\n\n  expect(() =>\n    rateLimitSchema.parse({\n      interval: 0,\n      limit: 5\n    })\n  ).toThrowErrorMatchingSnapshot()\n\n  expect(() =>\n    rateLimitSchema.parse({\n      interval: '--',\n      limit: 10\n    })\n  ).toThrowErrorMatchingSnapshot()\n\n  expect(() =>\n    rateLimitSchema.parse({\n      interval: '1 day',\n      limit: -1000\n    })\n  ).toThrowErrorMatchingSnapshot()\n})\n\ntest('RateLimit types', () => {\n  expectTypeOf({\n    interval: 10,\n    limit: 100,\n    mode: 'approximate',\n    enabled: true\n  } as const).toExtend<RateLimit>()\n\n  expectTypeOf<{\n    interval: 10\n    limit: 100\n    mode: 'strict'\n    enabled: true\n  }>().toExtend<RateLimit>()\n\n  expectTypeOf({\n    interval: '10s',\n    limit: 100,\n    mode: 'strict',\n    enabled: true\n  } as const).not.toExtend<RateLimit>()\n\n  expectTypeOf<{\n    interval: '10s'\n    limit: 100\n    mode: 'strict'\n  }>().not.toExtend<RateLimit>()\n\n  expectTypeOf({\n    enabled: false\n  } as const).toExtend<RateLimit>()\n\n  expectTypeOf<{\n    enabled: false\n  }>().toExtend<RateLimit>()\n})\n\ntest('RateLimitInput types', () => {\n  expectTypeOf({\n    interval: 10,\n    limit: 100\n  } as const).toExtend<RateLimitInput>()\n\n  expectTypeOf<{\n    interval: 10\n    limit: 100\n  }>().toExtend<RateLimitInput>()\n\n  expectTypeOf({\n    interval: 10,\n    limit: 100,\n    mode: 'strict'\n  } as const).toExtend<RateLimitInput>()\n\n  expectTypeOf<{\n    interval: 10\n    limit: 100\n    mode: 'approximate'\n  }>().toExtend<RateLimitInput>()\n\n  expectTypeOf({\n    interval: '3h',\n    limit: 100\n  } as const).toExtend<RateLimitInput>()\n\n  expectTypeOf<{\n    interval: '3h'\n    limit: 100\n  }>().toExtend<RateLimitInput>()\n\n  expectTypeOf({\n    enabled: false\n  } as const).toExtend<RateLimitInput>()\n\n  expectTypeOf<{\n    enabled: false\n  }>().toExtend<RateLimitInput>()\n})\n"
  },
  {
    "path": "packages/types/src/rate-limit.ts",
    "content": "import { z } from '@hono/zod-openapi'\nimport parseIntervalAsMs from 'ms'\n\n// TODO: Consider adding support for this in the future\n// export const rateLimitBySchema = z.union([\n//   z.literal('ip'),\n//   z.literal('customer'),\n//   z.literal('all')\n// ])\n\nexport const rateLimitModeSchema = z.union([\n  z.literal('strict'),\n  z.literal('approximate')\n])\nexport type RateLimitMode = z.infer<typeof rateLimitModeSchema>\n\n/**\n * Rate limit config for metered LineItems.\n */\nexport const rateLimitSchema = z\n  .union([\n    z.object({\n      /**\n       * Whether or not this rate limit is enabled.\n       */\n      enabled: z.literal(false)\n    }),\n    z.object({\n      /**\n       * The interval at which the rate limit is applied.\n       *\n       * Either a positive integer expressed in seconds or a valid positive\n       * [ms](https://github.com/vercel/ms) string (eg, \"10s\", \"1m\", \"8h\", \"2d\",\n       * \"1w\", \"1y\", etc).\n       */\n      interval: z\n        .union([\n          z.number().positive(), // seconds\n\n          z\n            .string()\n            .nonempty()\n            .transform((value, ctx) => {\n              try {\n                // TODO: `ms` module has broken types\n                const ms = parseIntervalAsMs(value as any) as unknown as number\n                const seconds = Math.floor(ms / 1000)\n\n                if (\n                  typeof ms !== 'number' ||\n                  Number.isNaN(ms) ||\n                  ms <= 0 ||\n                  seconds <= 0\n                ) {\n                  ctx.addIssue({\n                    code: z.ZodIssueCode.custom,\n                    message: `Invalid interval \"${value}\"`,\n                    path: ctx.path\n                  })\n\n                  return z.NEVER\n                }\n\n                return seconds\n              } catch {\n                ctx.addIssue({\n                  code: z.ZodIssueCode.custom,\n                  message: `Invalid interval \"${value}\"`,\n                  path: ctx.path\n                })\n\n                return z.NEVER\n              }\n            })\n        ])\n        .describe(\n          `The interval at which the rate limit is applied. Either a positive integer expressed in seconds or a valid positive [ms](https://github.com/vercel/ms) string (eg, \"10s\", \"1m\", \"8h\", \"2d\", \"1w\", \"1y\", etc).`\n        ),\n\n      /**\n       * Maximum number of operations per interval (unitless).\n       */\n      limit: z\n        .number()\n        .nonnegative()\n        .describe('Maximum number of operations per interval (unitless).'),\n\n      /**\n       * How to enforce the rate limit:\n       *\n       * - `strict` (more precise but slower)\n       * - `approximate` (the default; faster and asynchronous but less precise).\n       *\n       * The default rate-limiting mode is `approximate`, which means that requests\n       * are allowed to proceed immediately, with the limit being enforced\n       * asynchronously in the background. This is much faster than synchronous\n       * mode, but it is less consistent if precise adherence to rate-limits is\n       * required.\n       *\n       * With `strict` mode, requests are blocked until the current limit has\n       * been confirmed. The downside with this approach is that it introduces\n       * more latency to every request by default. The advantage is that it is\n       * more precise and consistent.\n       *\n       * @default \"approximate\"\n       */\n      mode: rateLimitModeSchema\n        .optional()\n        .default('approximate')\n        .describe(\n          'How to enforce the rate limit: \"strict\" (more precise but slower) or \"approximate\" (the default; faster and asynchronous but less precise).'\n        ),\n\n      // TODO: Consider adding support for this in the future\n      // /**\n      //  * The key to rate-limit by.\n      //  *\n      //  * - `ip`: Rate-limit by incoming IP address.\n      //  * - `customer`: Rate-limit by customer ID if available or IP address\n      //  *   otherwise.\n      //  * - `global`: Rate-limit all usage globally across customers.\n      //  *\n      //  * @default 'customer'\n      //  */\n      // rateLimitBy: rateLimitBySchema.optional().default('customer'),\n\n      /**\n       * Whether or not this rate limit is enabled.\n       *\n       * @default true\n       */\n      enabled: z.boolean().optional().default(true)\n    })\n  ])\n  .openapi('RateLimit')\n\nexport type RateLimitInput = z.input<typeof rateLimitSchema>\nexport type RateLimit = z.infer<typeof rateLimitSchema>\n"
  },
  {
    "path": "packages/types/src/temp",
    "content": "import { z } from '@hono/zod-openapi'\n\nexport const authProviderTypeSchema = z\n  .union([\n    z.literal('github'),\n    z.literal('google'),\n    z.literal('spotify'),\n    z.literal('twitter'),\n    z.literal('linkedin'),\n    z.literal('stripe')\n  ])\n  .openapi('AuthProviderType')\nexport type AuthProviderType = z.infer<typeof authProviderTypeSchema>\n\nexport const authProviderSchema = z.object({\n  provider: authProviderTypeSchema,\n\n  /** Provider-specific user id */\n  id: z.string(),\n\n  /** Provider-specific username */\n  username: z.string().optional(),\n\n  /** Standard oauth2 access token */\n  accessToken: z.string().optional(),\n\n  /** Standard oauth2 refresh token */\n  refreshToken: z.string().optional(),\n\n  /** Stripe public key */\n  publicKey: z.string().optional(),\n\n  /** OAuth scope(s) */\n  scope: z.string().optional()\n})\nexport type AuthProvider = z.infer<typeof authProviderSchema>\n\nexport const publicAuthProviderSchema = authProviderSchema\n  .omit({\n    accessToken: true,\n    refreshToken: true,\n    publicKey: true\n  })\n  .strip()\n  .openapi('AuthProvider')\nexport type PublicAuthProvider = z.infer<typeof publicAuthProviderSchema>\n\nexport const authProvidersSchema = z.record(\n  authProviderTypeSchema,\n  authProviderSchema.optional()\n)\nexport type AuthProviders = z.infer<typeof authProvidersSchema>\n\nexport const publicAuthProvidersSchema = z\n  .record(authProviderTypeSchema, publicAuthProviderSchema.optional())\n  .openapi('AuthProviders')\nexport type PublicAuthProviders = z.infer<typeof publicAuthProvidersSchema>\n"
  },
  {
    "path": "packages/types/src/tools.ts",
    "content": "import {\n  isToolNameAllowed,\n  isValidToolName,\n  toolNameRe\n} from '@agentic/platform-validators'\nimport { z } from '@hono/zod-openapi'\n\nimport { pricingPlanSlugSchema } from './pricing'\nimport { rateLimitSchema } from './rate-limit'\n\n/**\n * Agentic tool name.\n *\n * Follows OpenAI/Anthropic/Gemini function calling naming conventions.\n *\n * @example `\"get_weather\"`\n * @example `\"searchGoogle\"`\n * @example `\"get_user_info2\"`\n */\nexport const toolNameSchema = z\n  .string()\n  .nonempty()\n  .regex(toolNameRe)\n  .refine(\n    (name) => isValidToolName(name),\n    (name) => ({\n      message: `Tool name \"${name}\" is invalid; must match /^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$/.`\n    })\n  )\n  .refine(\n    (name) => isToolNameAllowed(name),\n    (name) => ({\n      message: `Tool name \"${name}\" is reserved; please choose a different name.`\n    })\n  )\n  .describe('Agentic tool name')\n\n/**\n * A zod schema representing any JSON Schema `object` schema.\n */\nexport const jsonSchemaObjectSchema = z\n  .object({\n    type: z.literal('object'),\n    // TODO: improve this schema\n    properties: z.record(z.string(), z.any()).optional(),\n    required: z.array(z.string()).optional(),\n    additionalProperties: z\n      .union([z.boolean(), z.record(z.string(), z.any())])\n      .optional()\n  })\n  .passthrough()\n  .openapi('JsonSchemaObject')\n\n/**\n * Overrides a tool's default behavior for a given pricing plan.\n *\n * You can use this, for instance, to disable tools on certain pricing plans\n * or to customize the rate-limits for specific tools on a given pricing plan.\n */\nexport const pricingPlanToolOverrideSchema = z\n  .object({\n    /**\n     * Whether this tool should be enabled for customers on a given pricing plan.\n     *\n     * If `undefined`, will use the tool's default enabled state.\n     *\n     * @default undefined\n     */\n    enabled: z.boolean().optional(),\n\n    /**\n     * Overrides whether to report default `requests` usage for metered billing\n     * for customers a given pricing plan.\n     *\n     * Note: This is only relevant if the pricing plan includes a `requests`\n     * line-item.\n     *\n     * @default undefined\n     */\n    reportUsage: z.boolean().optional(),\n\n    /**\n     * Customize or disable rate limits for this tool for customers on a given\n     * pricing plan.\n     *\n     * To disable rate-limiting for this tool on a given pricing plan, set\n     * `rateLimit.enabled` to `false`.\n     *\n     * @default undefined\n     */\n    rateLimit: rateLimitSchema.optional()\n  })\n  .openapi('PricingPlanToolOverride')\nexport type PricingPlanToolOverride = z.infer<\n  typeof pricingPlanToolOverrideSchema\n>\n\n/**\n * Example tool usage.\n */\nexport const toolConfigExampleSchema = z.object({\n  /**\n   * The display name of the example.\n   *\n   * If not given, defaults to `Example 1`, `Example 2`, etc.\n   */\n  name: z\n    .string()\n    .optional()\n    .describe(\n      'The display name of the example. If not given, defaults to `Example 1`, `Example 2`, etc.'\n    ),\n\n  /**\n   * The input prompt for agents to use when running this example.\n   */\n  prompt: z\n    .string()\n    .describe('The input prompt for agents to use when running this example.'),\n\n  /**\n   * An optional system prompt for agents to use when running this example.\n   *\n   * Defaults to `You are a helpful assistant. Be as concise as possible.`\n   */\n  systemPrompt: z\n    .string()\n    .optional()\n    .describe(\n      'An optional system prompt for agents to use when running this example. Defaults to `You are a helpful assistant. Be as concise as possible.`'\n    ),\n\n  /**\n   * The arguments to pass to the tool for this example.\n   */\n  // TODO: validate example args against the tool's input schema during\n  // config validation\n  args: z\n    .record(z.string(), z.any())\n    .describe('The arguments to pass to the tool for this example.'),\n\n  /**\n   * Whether this example should be featured in the docs for the project.\n   *\n   * The first tool with a `featured` example will be the featured tool for the\n   * project.\n   */\n  featured: z\n    .boolean()\n    .optional()\n    .describe(\n      'Whether this example should be featured in the docs for the project.'\n    ),\n\n  /**\n   * A description of the example.\n   */\n  description: z.string().optional().describe('A description of the example.')\n})\n\n/**\n * Customizes a tool's default behavior across all pricing plans.\n */\nexport const toolConfigSchema = z\n  .object({\n    /**\n     * The name of the tool, which acts as a unique, stable identifier for the\n     * tool across deployments.\n     */\n    name: toolNameSchema,\n\n    /**\n     * Whether this tool should be enabled for all customers (default).\n     *\n     * If you want to hide a tool from customers but still have it present on\n     * your origin server, set this to `false` for the given tool.\n     *\n     * @default true\n     */\n    enabled: z.boolean().optional(),\n\n    /**\n     * Whether this tool's output is deterministic and idempotent given the\n     * same input.\n     *\n     * If `true`, tool outputs will be cached aggressively for identical\n     * requests, though origin server response headers can still override this\n     * behavior on a per-request basis.\n     *\n     * If `false`, tool outputs will be cached according to the origin server's\n     * response headers on a per-request basis.\n     *\n     * @default false\n     */\n    pure: z.boolean().optional(),\n\n    /**\n     * A custom `Cache-Control` header to use for caching this tool's responses.\n     *\n     * If set, this field overrides `pure`.\n     *\n     * If not set and `pure` is `true`, the gateway will default to:\n     * `public, max-age=31560000, s-maxage=31560000, stale-while-revalidate=3600`\n     * (cache publicly for up to 1 year).\n     *\n     * If not set and `pure` is `false`, the gateway will default to `no-store`\n     * which will disable caching. This is the default gateway behavior for\n     * tools (no caching).\n     *\n     * Note that origin server response headers may also choose to disable\n     * caching on a per-request basis.\n     *\n     * @default undefined\n     */\n    cacheControl: z.string().optional(),\n\n    /**\n     * Whether calls to this tool should be reported as usage for the default\n     * `requests` line-item's metered billing.\n     *\n     * Note: This is only relevant if the customer's active pricing plan\n     * includes a `requests` line-item.\n     *\n     * @default true\n     */\n    reportUsage: z.boolean().optional(),\n\n    /**\n     * Customize the default `requests`-based rate-limiting for this tool.\n     *\n     * To disable rate-limiting for this tool, set `rateLimit.enabled` to\n     * `false`.\n     *\n     * If not set, the default rate-limiting for the active pricing plan will be\n     * used.\n     *\n     * @default undefined\n     */\n    rateLimit: rateLimitSchema.optional(),\n\n    /**\n     * Whether to allow additional properties in the tool's input schema.\n     *\n     * The default MCP spec allows additional properties. Set this to `false` if\n     * you want your tool to be more strict.\n     *\n     * @note This is only relevant if the tool has defined an `outputSchema`.\n     *\n     * @default undefined\n     */\n    inputSchemaAdditionalProperties: z.boolean().optional(),\n\n    /**\n     * Whether to allow additional properties in the tool's output schema.\n     *\n     * The default MCP spec allows additional properties. Set this to `false` if\n     * you want your tool to be more strict.\n     *\n     * @note This is only relevant if the tool has defined an `outputSchema`.\n     *\n     * @default undefined\n     */\n    outputSchemaAdditionalProperties: z.boolean().optional(),\n\n    /**\n     * Allows you to override this tool's behavior or disable it entirely for\n     * different pricing plans.\n     *\n     * This is a map from PricingPlan slug to PricingPlanToolOverride.\n     *\n     * @example\n     * {\n     *   \"free\": {\n     *     \"enabled\": false\n     *   }\n     * }\n     */\n    pricingPlanOverridesMap: z\n      .record(pricingPlanSlugSchema, pricingPlanToolOverrideSchema)\n      .optional()\n      .describe(\n        \"Allows you to override this tool's behavior or disable it entirely for different pricing plans. This is a map of PricingPlan slug to PricingPlanToolOverrides for that plan.\"\n      ),\n\n    // TODO?\n    // headers\n\n    examples: z\n      .array(toolConfigExampleSchema)\n      .optional()\n      .describe(\n        \"Examples of how to use this tool. Used to generate example usage in the tool's docs.\"\n      )\n  })\n  .openapi('ToolConfig')\n\nexport type ToolConfigInput = z.input<typeof toolConfigSchema>\nexport type ToolConfig = z.infer<typeof toolConfigSchema>\n\n/**\n * Additional properties describing a Tool to clients.\n *\n * This matches MCP tool annotations 1:1.\n *\n * NOTE: All properties in ToolAnnotations are **hints**.\n *\n * They are not guaranteed to provide a faithful description of tool behavior\n * (including descriptive properties like `title`).\n *\n * Clients should never make tool use decisions based on ToolAnnotations\n * received from untrusted servers.\n */\nexport const toolAnnotationsSchema = z\n  .object({\n    /**\n     * A human-readable title for the tool.\n     */\n    title: z.string().optional(),\n\n    /**\n     * If true, the tool does not modify its environment.\n     *\n     * Default: false\n     */\n    readOnlyHint: z.boolean().optional(),\n\n    /**\n     * If true, the tool may perform destructive updates to its environment.\n     * If false, the tool performs only additive updates.\n     *\n     * (This property is meaningful only when `readOnlyHint == false`)\n     *\n     * Default: true\n     */\n    destructiveHint: z.boolean().optional(),\n\n    /**\n     * If true, calling the tool repeatedly with the same arguments\n     * will have no additional effect on the its environment.\n     *\n     * (This property is meaningful only when `readOnlyHint == false`)\n     *\n     * Default: false\n     */\n    idempotentHint: z.boolean().optional(),\n\n    /**\n     * If true, this tool may interact with an \"open world\" of external\n     * entities. If false, the tool's domain of interaction is closed.\n     * For example, the world of a web search tool is open, whereas that\n     * of a memory tool is not.\n     *\n     * Default: true\n     */\n    openWorldHint: z.boolean().optional()\n  })\n  .passthrough()\n\n/**\n * Definition for an Agentic tool.\n *\n * This matches MCP tool scehemas 1:1.\n */\nexport const toolSchema = z\n  .object({\n    /**\n     * The name of the tool, which acts as a unique, stable identifier for the\n     * tool across deployments.\n     *\n     * @example `\"get_weather\"`\n     * @example `\"google_search\"`\n     */\n    name: toolNameSchema,\n\n    /**\n     * A description of the tool intended to be used in prompts for LLMs to\n     * understand when and how to use the tool.\n     */\n    description: z.string().optional(),\n\n    /**\n     * A JSON Schema object defining the expected parameters for the tool.\n     */\n    inputSchema: jsonSchemaObjectSchema,\n\n    /**\n     * An optional JSON Schema object defining the structure of the tool's\n     * output.\n     */\n    outputSchema: jsonSchemaObjectSchema.optional(),\n\n    /**\n     * Optional additional tool information.\n     *\n     * Used by MCP servers.\n     */\n    annotations: toolAnnotationsSchema.optional()\n  })\n  .passthrough()\n  .openapi('Tool')\nexport type Tool = z.infer<typeof toolSchema>\n"
  },
  {
    "path": "packages/types/src/types.ts",
    "content": "/**\n * This file exports backend model types which are inferred based on the\n * generated `openapi.d.ts` file. Some types are customized to provide stricter\n * types than what `@hono/zod-openapi` and `zod` v3 provide, but in general\n * these types are meant to use the backend API as a source of truth.\n */\nimport type { Simplify } from 'type-fest'\n\nimport type { components } from './openapi.d.ts'\nimport type { OriginAdapter } from './origin-adapter.js'\nimport type { PricingPlan } from './pricing'\nimport type { RateLimit } from './rate-limit.js'\nimport type { ToolConfig } from './tools'\n\n// TODO: These extra simplify statements for populated references shouldn't be\n// necessary here, but Hono's OpenAPI support is currently failing to generate\n// these self-referential types correctly in some cases, so we're just hard-\n// coding the types here to make them nicer. Same with derived fields.\n\nexport type User = components['schemas']['User']\nexport type Team = components['schemas']['Team']\nexport type TeamMember = components['schemas']['TeamMember']\nexport type AuthSession = components['schemas']['AuthSession']\n\nexport type Consumer = Simplify<\n  components['schemas']['Consumer'] & {\n    user?: User\n    project?: Project\n    deployment?: Deployment\n\n    /**\n     * A private admin URL for managing the customer's subscription. This URL\n     * is only accessible by the customer.\n     *\n     * @example https://agentic.so/app/consumers/cons_123\n     */\n    adminUrl: string\n  }\n>\n\nexport type Project = Simplify<\n  Omit<\n    components['schemas']['Project'],\n    'lastPublishedDeployment' | 'lastDeployment'\n  > & {\n    user?: User\n    team?: Team\n    lastPublishedDeployment?: Simplify<Omit<Deployment, 'project'>>\n    lastDeployment?: Simplify<Omit<Deployment, 'project'>>\n\n    /**\n     * The public base HTTP URL for the project supporting HTTP POST requests for\n     * individual tools at `/tool-name` subpaths.\n     *\n     * @example https://gateway.agentic.so/@agentic/search\n     */\n    gatewayBaseUrl: string\n\n    /**\n     * The public MCP URL for the project supporting the Streamable HTTP transport.\n     *\n     * @example https://gateway.agentic.so/@agentic/search/mcp\n     */\n    gatewayMcpUrl: string\n\n    /**\n     * The public marketplace URL for the project.\n     *\n     * @example https://agentic.so/marketplace/projects/@agentic/search\n     */\n    marketplaceUrl: string\n\n    /**\n     * A private admin URL for managing the project. This URL is only accessible\n     * by project owners.\n     *\n     * @example https://agentic.so/app/projects/@agentic/search\n     */\n    adminUrl: string\n  }\n>\nexport type Deployment = Simplify<\n  Omit<\n    components['schemas']['Deployment'],\n    'pricingPlans' | 'toolConfigs' | 'defaultRateLimit' | 'project'\n  > & {\n    pricingPlans: PricingPlan[]\n    toolConfigs: ToolConfig[]\n    defaultRateLimit: RateLimit\n    project?: Simplify<\n      Omit<Project, 'lastPublishedDeployment' | 'lastDeployment'>\n    >\n\n    /**\n     * The public base HTTP URL for the deployment supporting HTTP POST requests\n     * for individual tools at `/tool-name` subpaths.\n     *\n     * @example https://gateway.agentic.so/@agentic/search@latest\n     */\n    gatewayBaseUrl: string\n\n    /**\n     * The public MCP URL for the deployment supporting the Streamable HTTP\n     * transport.\n     *\n     * @example https://gateway.agentic.so/@agentic/search@latest/mcp\n     */\n    gatewayMcpUrl: string\n\n    /**\n     * The public marketplace URL for the deployment's project.\n     *\n     * Note that only published deployments are visible on the marketplace.\n     *\n     * @example https://agentic.so/marketplace/projects/@agentic/search\n     */\n    marketplaceUrl: string\n\n    /**\n     * A private admin URL for managing the deployment. This URL is only accessible\n     * by project owners.\n     *\n     * @example https://agentic.so/app/projects/@agentic/search/deployments/123\n     */\n    adminUrl: string\n  }\n>\n\nexport type AdminDeployment = Simplify<\n  Omit<\n    components['schemas']['AdminDeployment'],\n    'pricingPlans' | 'toolConfigs' | 'defaultRateLimit' | 'origin' | 'project'\n  > & {\n    pricingPlans: PricingPlan[]\n    toolConfigs: ToolConfig[]\n    defaultRateLimit: RateLimit\n    origin: OriginAdapter\n  } & Pick<\n      Deployment,\n      | 'gatewayBaseUrl'\n      | 'gatewayMcpUrl'\n      | 'marketplaceUrl'\n      | 'adminUrl'\n      | 'project'\n    >\n>\n\nexport type AdminConsumer = Simplify<\n  components['schemas']['AdminConsumer'] & {\n    user?: User\n    project?: Project\n    deployment?: Deployment\n  } & Pick<Consumer, 'adminUrl'>\n>\n\nexport type AgenticMcpRequestMetadata = {\n  agenticProxySecret: string\n  sessionId: string\n  isCustomerSubscriptionActive: boolean\n\n  customerId?: string\n  customerSubscriptionStatus?: string\n  customerSubscriptionPlan?: string\n\n  userId?: string\n  userEmail?: string\n  userUsername?: string\n  userName?: string\n  userCreatedAt?: string\n  userUpdatedAt?: string\n\n  deploymentId: string\n  deploymentIdentifier: string\n  projectId: string\n  projectIdentifier: string\n\n  ip?: string\n} & (\n  | {\n      // If the customer has an active subscription, these fields are guaranteed\n      // to be present in the metadata.\n      isCustomerSubscriptionActive: true\n\n      customerId: string\n      customerSubscriptionStatus: string\n\n      userId: string\n      userEmail: string\n      userUsername: string\n      userCreatedAt: string\n      userUpdatedAt: string\n    }\n  | {\n      // If the customer does not have an active subscription, then the customer\n      // fields may or may not be present.\n      isCustomerSubscriptionActive: false\n    }\n)\n"
  },
  {
    "path": "packages/types/src/utils.ts",
    "content": "import type { PricingInterval, PricingPlan } from '@agentic/platform-types'\n\nexport function getPricingPlansByInterval({\n  pricingInterval,\n  pricingPlans\n}: {\n  pricingInterval: PricingInterval\n  pricingPlans: PricingPlan[]\n}): PricingPlan[] {\n  return pricingPlans.filter(\n    (pricingPlan) =>\n      pricingPlan.interval === pricingInterval ||\n      pricingPlan.interval === undefined\n  )\n}\n\nconst pricingIntervalToLabelMap: Record<PricingInterval, string> = {\n  day: 'daily',\n  week: 'weekly',\n  month: 'monthly',\n  year: 'yearly'\n}\n\nexport function getLabelForPricingInterval(\n  pricingInterval: PricingInterval\n): string {\n  return pricingIntervalToLabelMap[pricingInterval]\n}\n"
  },
  {
    "path": "packages/types/src/webhook.ts",
    "content": "import { z } from '@hono/zod-openapi'\n\nexport const webhookSchema = z\n  .object({\n    url: z.string(),\n    events: z.array(z.string())\n  })\n  .openapi('Webhook')\nexport type Webhook = z.infer<typeof webhookSchema>\n"
  },
  {
    "path": "packages/types/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\", \"bin/*\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/validators/package.json",
    "content": "{\n  \"name\": \"@agentic/platform-validators\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Validation utils for core strings and identifiers used across the Agentic platform.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"packages/validators\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./src/index.ts\",\n  \"exports\": {\n    \".\": \"./src/index.ts\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/platform-core\": \"workspace:*\",\n    \"@paralleldrive/cuid2\": \"catalog:\",\n    \"email-validator\": \"catalog:\",\n    \"type-fest\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"files\": [\n      \"dist\"\n    ],\n    \"types\": \"./dist/index.ts\",\n    \"exports\": {\n      \".\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"import\": \"./dist/index.js\",\n        \"default\": \"./dist/index.js\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/validators/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/platform-validators\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/platform-validators.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/platform-validators <!-- omit from toc -->\n\n> Core schemas and validators shared across the Agentic platform.\n\n- [Website](https://agentic.so/publishing)\n- [Docs](https://docs.agentic.so)\n\n> [!TIP]\n> You likely don't need this package directly. See [@agentic/cli](https://github.com/transitive-bullshit/agentic/tree/main/packages/cli), [@agentic/platform](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform), and [@agentic/platform-tool-client](https://github.com/transitive-bullshit/agentic/tree/main/packages/platform-tool-client) for more public-facing packages.\n\n## Install\n\n```bash\nnpm i @agentic/platform-validators\n```\n\n## Usage\n\n```ts\nimport { parseProjectIdentifier } from '@agentic/platform-validators'\n\nconst parsedProjectIdentifier = parseProjectIdentifier('@agentic/search')\n```\n\n## Identifiers\n\n### Project Identifier\n\n- `@username/project-slug`\n- `@team-slug/project-slug`\n\n**Examples:**\n\n- `@agentic/search`\n\n### Deployment Identifier\n\n- `${projectIdentifier}` will implicitly use `${projectIdentifier}@latest`\n- `${projectIdentifier}@latest` (the most recently published deployment)\n- `${projectIdentifier}@dev` (the most recently pushed deployment)\n- `${projectIdentifier}@deploymentHash` (a specific deployment)\n- `${projectIdentifier}@version` (a specific published deployment specified via `semver`)\n\n**Examples:**\n\n- `@agentic/search`\n- `@agentic/search@latest`\n- `@agentic/search@1.0.0`\n\n### Tool Identifier\n\n- `${deploymentIdentifier}/tool_name`\n\n**Examples:**\n\n- `@agentic/search/search`\n- `@agentic/search@latest/search`\n- `@agentic/search@1.0.0/search`\n\n### Tool Names\n\n- Must start with a letter or underscore\n- Can include only letters, numbers, and underscores\n- Use either camelCase or snake_case consistently across all tools\n\n[OpenAI vs Anthropic vs Google vs MCP tool name restrictions](https://chatgpt.com/share/68419382-73a0-8007-afce-0ded7d9f05e7)\n\n## License\n\n[GNU AGPL 3.0](https://choosealicense.com/licenses/agpl-3.0/)\n"
  },
  {
    "path": "packages/validators/src/__snapshots__/parse-deployment-identifier.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 1`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 2`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 3`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 4`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 5`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 6`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 7`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 8`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@dev\",\n  \"deploymentVersion\": \"dev\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 9`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@1.0.0\",\n  \"deploymentVersion\": \"1.0.0\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 10`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 11`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 12`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 13`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 14`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 15`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 16`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 17`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 18`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 19`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 20`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@dev\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 21`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@1.0.0\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 22`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 23`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 24`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > non-strict mode valid 25`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 1`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 2`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 3`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 4`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@dev\",\n  \"deploymentVersion\": \"dev\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 5`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@1.0.0\",\n  \"deploymentVersion\": \"1.0.0\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 6`] = `\n{\n  \"deploymentHash\": \"abc123lz\",\n  \"deploymentIdentifier\": \"@username/foo-bar@abc123lz\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 7`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foobar123-yo@01234567\",\n  \"projectIdentifier\": \"@username/foobar123-yo\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar123-yo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 8`] = `\n{\n  \"deploymentIdentifier\": \"@u/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@u/foo-bar\",\n  \"projectNamespace\": \"u\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 9`] = `\n{\n  \"deploymentIdentifier\": \"@a/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@a/foo-bar\",\n  \"projectNamespace\": \"a\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 10`] = `\n{\n  \"deploymentIdentifier\": \"@foo/foobar123-yo@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@foo/foobar123-yo\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"foobar123-yo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 11`] = `\n{\n  \"deploymentIdentifier\": \"@foo/foobar123-yo@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@foo/foobar123-yo\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"foobar123-yo\",\n}\n`;\n\nexports[`parseDeploymentIdentifier > strict mode valid 12`] = `\n{\n  \"deploymentIdentifier\": \"@foo/bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@foo/bar\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"bar\",\n}\n`;\n"
  },
  {
    "path": "packages/validators/src/__snapshots__/parse-project-identifier.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`parseProjectIdentifier > non-strict mode valid 1`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 2`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 3`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 4`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 5`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 6`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 7`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 8`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 9`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 10`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 11`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 12`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 13`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 14`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 15`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 16`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 17`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@dev\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 18`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@1.0.0\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 19`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 20`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 21`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > non-strict mode valid 22`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > strict mode valid 1`] = `\n{\n  \"projectIdentifier\": \"@username/foo\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo\",\n}\n`;\n\nexports[`parseProjectIdentifier > strict mode valid 2`] = `\n{\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > strict mode valid 3`] = `\n{\n  \"projectIdentifier\": \"@username/foobar123-yo\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar123-yo\",\n}\n`;\n\nexports[`parseProjectIdentifier > strict mode valid 4`] = `\n{\n  \"projectIdentifier\": \"@u/foo-bar\",\n  \"projectNamespace\": \"u\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > strict mode valid 5`] = `\n{\n  \"projectIdentifier\": \"@a/foo-bar\",\n  \"projectNamespace\": \"a\",\n  \"projectSlug\": \"foo-bar\",\n}\n`;\n\nexports[`parseProjectIdentifier > strict mode valid 6`] = `\n{\n  \"projectIdentifier\": \"@foo/foobar123-yo\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"foobar123-yo\",\n}\n`;\n\nexports[`parseProjectIdentifier > strict mode valid 7`] = `\n{\n  \"projectIdentifier\": \"@foo/bar\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"bar\",\n}\n`;\n"
  },
  {
    "path": "packages/validators/src/__snapshots__/parse-tool-identifier.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`parseToolIdentifier > non-strict mode valid 1`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 2`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 3`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 4`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 5`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 6`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 7`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@dev\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 8`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@1.0.0\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 9`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 10`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 11`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > non-strict mode valid 12`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 1`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 2`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foo-bar@01234567\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 3`] = `\n{\n  \"deploymentHash\": \"abc123lz\",\n  \"deploymentIdentifier\": \"@username/foo-bar@abc123lz\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 4`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 5`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foobar123-yo@01234567\",\n  \"projectIdentifier\": \"@username/foobar123-yo\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar123-yo\",\n  \"toolName\": \"foo_bar_BAR_901\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 6`] = `\n{\n  \"deploymentHash\": \"01234567\",\n  \"deploymentIdentifier\": \"@username/foobar@01234567\",\n  \"projectIdentifier\": \"@username/foobar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar\",\n  \"toolName\": \"get_weather01\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 7`] = `\n{\n  \"deploymentIdentifier\": \"@username/foobar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foobar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 8`] = `\n{\n  \"deploymentIdentifier\": \"@username/foobar@dev\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foobar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 9`] = `\n{\n  \"deploymentIdentifier\": \"@username/foobar@1.0.0\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foobar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 10`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 11`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@dev\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 12`] = `\n{\n  \"deploymentIdentifier\": \"@username/foo-bar@1.0.0\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foo-bar\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 13`] = `\n{\n  \"deploymentIdentifier\": \"@username/foobar123-yo@0.0.1\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foobar123-yo\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar123-yo\",\n  \"toolName\": \"foo_bar_BAR_901\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 14`] = `\n{\n  \"deploymentIdentifier\": \"@username/foobar123-yo@0.0.1\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@username/foobar123-yo\",\n  \"projectNamespace\": \"username\",\n  \"projectSlug\": \"foobar123-yo\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 15`] = `\n{\n  \"deploymentIdentifier\": \"@u/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@u/foo-bar\",\n  \"projectNamespace\": \"u\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 16`] = `\n{\n  \"deploymentIdentifier\": \"@a/foo-bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@a/foo-bar\",\n  \"projectNamespace\": \"a\",\n  \"projectSlug\": \"foo-bar\",\n  \"toolName\": \"foo_123\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 17`] = `\n{\n  \"deploymentIdentifier\": \"@foo/foobar123-yo@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@foo/foobar123-yo\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"foobar123-yo\",\n  \"toolName\": \"foo_bar_BAR_901\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 18`] = `\n{\n  \"deploymentIdentifier\": \"@foo/foobar123-yo@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@foo/foobar123-yo\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"foobar123-yo\",\n  \"toolName\": \"foo\",\n}\n`;\n\nexports[`parseToolIdentifier > strict mode valid 19`] = `\n{\n  \"deploymentIdentifier\": \"@foo/bar@latest\",\n  \"deploymentVersion\": \"latest\",\n  \"projectIdentifier\": \"@foo/bar\",\n  \"projectNamespace\": \"foo\",\n  \"projectSlug\": \"bar\",\n  \"toolName\": \"baz\",\n}\n`;\n"
  },
  {
    "path": "packages/validators/src/index.ts",
    "content": "export * from './namespace-blacklist'\nexport * from './parse-deployment-identifier'\nexport * from './parse-project-identifier'\nexport * from './parse-tool-identifier'\nexport * from './tool-name-blacklist'\nexport type * from './types'\nexport * from './validators'\n"
  },
  {
    "path": "packages/validators/src/namespace-blacklist.ts",
    "content": "export const namespaceBlacklist = new Set([\n  // restricted because they would be confusing\n  'admin',\n  'root',\n  'sudo',\n  'mcp',\n  'sse',\n  'raw',\n  'todo',\n  'team',\n  'api',\n  'user',\n  'ai',\n  'llm',\n  'agent',\n  'agents',\n  'free',\n  'paid',\n  'tool',\n  'tools',\n  'not',\n  'openapi',\n  'error',\n  'legal',\n  'legacy',\n  'support',\n  'email',\n  'help',\n  'faq',\n  'privacy',\n  'terms',\n  'about',\n  'contact',\n  'internal',\n  'public',\n  'private',\n  '404',\n  '429',\n  '403',\n  '401',\n  '400',\n  '409',\n  '408',\n  '407',\n  '406',\n  '500',\n\n  // bad words\n  'fuck',\n  'shit',\n  'bitch',\n  'cunt',\n  'dick',\n  'pussy',\n  'ass',\n  'asshole',\n  'faggot',\n  'fag',\n  'fagot',\n  'nigger',\n  'nigga',\n  'niggers',\n  'niggas',\n  'niggers',\n  'porn',\n  'sex',\n  'anal',\n  'blowjob',\n  'cum',\n  'penis',\n  'vagina',\n  'boobs',\n  'tits',\n\n  // reserved for companies\n  'openai',\n  'anthropic',\n  'google',\n  'microsoft',\n  'meta',\n  'alibaba',\n  'amazon',\n  'apple',\n  'arista',\n  'atlassian',\n  'aws',\n  'azure',\n  'cloudflare',\n  'cisco',\n  'stripe',\n  'vercel',\n  'facebook',\n  'twitter',\n  'x',\n  'instagram',\n  'tiktok',\n  'youtube',\n  'linkedin',\n  'github',\n  'gitlab',\n  'bitbucket',\n  'slack',\n  'discord',\n  'telegram',\n  'whatsapp',\n  'snapchat',\n  'pinterest',\n  'reddit',\n  'tumblr',\n  'pornhub',\n  'xvideos',\n\n  // reserved for individuals\n  'trump',\n  'elon',\n  'elonmusk'\n])\n"
  },
  {
    "path": "packages/validators/src/parse-deployment-identifier.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\n\nimport { parseDeploymentIdentifier } from './parse-deployment-identifier'\nimport {\n  isValidDeploymentHash,\n  isValidDeploymentIdentifier,\n  isValidNamespace,\n  isValidProjectIdentifier,\n  isValidProjectSlug\n} from './validators'\n\nfunction success(...args: Parameters<typeof parseDeploymentIdentifier>) {\n  const result = parseDeploymentIdentifier(...args)\n  expect(result).toBeTruthy()\n  expect(result!.projectIdentifier).toBeTruthy()\n  expect(result!.projectNamespace).toBeTruthy()\n  expect(result!.projectSlug).toBeTruthy()\n  expect(result!.deploymentIdentifier).toBeTruthy()\n  expect(result!.deploymentVersion || result!.deploymentHash).toBeTruthy()\n  expect(isValidProjectIdentifier(result!.projectIdentifier)).toBe(true)\n  expect(isValidProjectSlug(result!.projectSlug)).toBe(true)\n  expect(isValidNamespace(result!.projectNamespace)).toBe(true)\n  expect(isValidDeploymentIdentifier(result!.deploymentIdentifier)).toBe(true)\n\n  if (result!.deploymentHash) {\n    expect(isValidDeploymentHash(result!.deploymentHash)).toBe(true)\n  }\n\n  expect(result).toMatchSnapshot()\n}\n\nfunction error(...args: Parameters<typeof parseDeploymentIdentifier>) {\n  expect(() => parseDeploymentIdentifier(...args)).throws()\n}\n\ndescribe('parseDeploymentIdentifier', () => {\n  test('strict mode valid', () => {\n    success('@username/foo-bar')\n    success('@username/foo-bar@01234567')\n    success('@username/foo-bar@latest')\n    success('@username/foo-bar@dev')\n    success('@username/foo-bar@1.0.0')\n    success('@username/foo-bar@abc123lz')\n    success('@username/foobar123-yo@01234567')\n\n    success('@u/foo-bar')\n    success('@a/foo-bar')\n    success('@foo/foobar123-yo')\n    success('@foo/foobar123-yo')\n    success('@foo/bar')\n  })\n\n  test('strict mode invalid', () => {\n    error()\n    error('')\n    error('foo')\n    error('foo/bar')\n    error('foo/bar/baz')\n    error('foo/bar/baz/qux')\n    error('@foo/bar/baz/qux')\n    error('@foo/bar/baz/qux/quux')\n    error('@foo/bar/baz/qux/quux/corge')\n    error('@foo/bar/baz/qux/quux/corge/grault')\n    error('@foo/bar/baz/qux/quux/corge/grault/garply')\n    error('@foo/bar/baz/')\n    error('@foo')\n    error('@foo/bar/')\n\n    error('@foo-bar@01234567')\n    error('@%/foo-bar@01234567')\n    error('@user/foo^bar@01234567')\n    error('@user@foo^bar@01234567')\n    error('@username/Foo-Bar@01234567')\n    error('username/foo-bar')\n    error('@Username/foo-bar')\n    error('@username/Foo-bar')\n    error('@username/foo-bar/')\n    error('@username/foo_bar')\n\n    error('@foo_bar@latest')\n\n    error('//@username/foo-bar@01234567')\n    error('https://@username/foo-bar@01234567')\n    error('https://example.com/@username/foo-bar')\n  })\n\n  test('non-strict mode valid', () => {\n    success('https://gateway.agentic.so/@username/foo-bar', { strict: false })\n    success('https://gateway.agentic.so/@username/foo-bar@latest', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar@01234567', {\n      strict: false\n    })\n    success('/@username/foo-bar@01234567', { strict: false })\n    success('@username/foo-bar@01234567/', { strict: false })\n\n    success('/@username/foo-bar@01234567/', { strict: false })\n    success('/@username/foo-bar@latest/', { strict: false })\n    success('/@username/foo-bar@dev/', { strict: false })\n    success('/@username/foo-bar@1.0.0/', { strict: false })\n    success('/@username/foo-bar/', { strict: false })\n\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar@latest', {\n      strict: false\n    })\n\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo', {\n      strict: false\n    })\n    success('/@username/foo-bar@01234567/foo', { strict: false })\n    success('@username/foo-bar@01234567/foo/', { strict: false })\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo/', {\n      strict: false\n    })\n\n    success('/@username/foo-bar@01234567/foo/', { strict: false })\n    success('/@username/foo-bar@latest/foo/', { strict: false })\n    success('/@username/foo-bar@dev/foo/', { strict: false })\n    success('/@username/foo-bar@1.0.0/foo/', { strict: false })\n    success('/@username/foo-bar/foo/', { strict: false })\n\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar/foo/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar@latest/foo/', {\n      strict: false\n    })\n  })\n\n  test('non-strict mode invalid', () => {\n    error(undefined, { strict: false })\n    error('', { strict: false })\n    error('https://gateway.agentic.so', { strict: false })\n    error('//gateway.agentic.so', { strict: false })\n    error('https://gateway.agentic.so/@username', { strict: false })\n    error('https://gateway.agentic.so/@username/', { strict: false })\n    error('https://gateway.agentic.so/call/@username/foo-bar@latest/tool', {\n      strict: false\n    })\n    error('/call/@username/foo-bar/foo', { strict: false })\n    error('//@username/foo-bar/foo', { strict: false })\n    error('@username/foo-bar/foo//', { strict: false })\n\n    error('@username/foo-bar/foo😀', { strict: false })\n    error('@username/Foo-Bar@dev/foo/', { strict: false })\n\n    error('@username/Foo', { strict: false })\n    error('@username/foo😀', { strict: false })\n  })\n})\n"
  },
  {
    "path": "packages/validators/src/parse-deployment-identifier.ts",
    "content": "import { HttpError } from '@agentic/platform-core'\n\nimport type {\n  ParsedDeploymentIdentifier,\n  ParseIdentifierOptions\n} from './types'\nimport { parseToolIdentifier } from './parse-tool-identifier'\nimport { coerceIdentifier } from './utils'\n\nconst deploymentIdentifierImplicitRe =\n  /^@([a-z0-9-]{1,256})\\/([a-z0-9-]{1,256})$/\n\nconst deploymentIdentifierHashRe =\n  /^@([a-z0-9-]{1,256})\\/([a-z0-9-]{1,256})@([a-z0-9]{8})$/\n\nconst deploymentIdentifierVersionRe =\n  /^@([a-z0-9-]{1,256})\\/([a-z0-9-]{1,256})@([\\d.a-z-@]+)$/\n\nexport function parseDeploymentIdentifier(\n  identifier?: string,\n  { strict = true, errorStatusCode = 400 }: ParseIdentifierOptions = {}\n): ParsedDeploymentIdentifier {\n  const inputIdentifier = identifier\n\n  if (!strict) {\n    try {\n      return parseToolIdentifier(identifier, {\n        strict,\n        errorStatusCode\n      })\n    } catch {\n      // ignore\n    }\n  }\n\n  if (!strict) {\n    identifier = coerceIdentifier(identifier)\n  }\n\n  if (!identifier?.length) {\n    throw new HttpError({\n      statusCode: errorStatusCode,\n      message: `Invalid deployment identifier \"${inputIdentifier}\"`\n    })\n  }\n\n  const iMatch = identifier.match(deploymentIdentifierImplicitRe)\n\n  if (iMatch) {\n    return {\n      projectIdentifier: `@${iMatch[1]!}/${iMatch[2]!}`,\n      projectNamespace: iMatch[1]!,\n      projectSlug: iMatch[2]!,\n      deploymentIdentifier: `@${iMatch[1]!}/${iMatch[2]!}@latest`,\n      deploymentVersion: 'latest'\n    }\n  }\n\n  const hMatch = identifier.match(deploymentIdentifierHashRe)\n\n  if (hMatch) {\n    return {\n      projectIdentifier: `@${hMatch[1]!}/${hMatch[2]!}`,\n      projectNamespace: hMatch[1]!,\n      projectSlug: hMatch[2]!,\n      deploymentIdentifier: `@${hMatch[1]!}/${hMatch[2]!}@${hMatch[3]!}`,\n      deploymentHash: hMatch[3]!\n    }\n  }\n\n  const vMatch = identifier.match(deploymentIdentifierVersionRe)\n\n  if (vMatch) {\n    return {\n      projectIdentifier: `@${vMatch[1]!}/${vMatch[2]!}`,\n      projectNamespace: vMatch[1]!,\n      projectSlug: vMatch[2]!,\n      deploymentIdentifier: `@${vMatch[1]!}/${vMatch[2]!}@${vMatch[3]!}`,\n      deploymentVersion: vMatch[3]!\n    }\n  }\n\n  throw new HttpError({\n    statusCode: errorStatusCode,\n    message: `Invalid deployment identifier \"${inputIdentifier}\"`\n  })\n}\n"
  },
  {
    "path": "packages/validators/src/parse-project-identifier.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\n\nimport { parseProjectIdentifier } from './parse-project-identifier'\nimport {\n  isValidNamespace,\n  isValidProjectIdentifier,\n  isValidProjectSlug\n} from './validators'\n\nfunction success(...args: Parameters<typeof parseProjectIdentifier>) {\n  const result = parseProjectIdentifier(...args)\n  expect(result).toBeTruthy()\n  expect(result!.projectIdentifier).toBeTruthy()\n  expect(result!.projectNamespace).toBeTruthy()\n  expect(result!.projectSlug).toBeTruthy()\n  expect(isValidProjectIdentifier(result!.projectIdentifier)).toBe(true)\n  expect(isValidProjectSlug(result!.projectSlug)).toBe(true)\n  expect(isValidNamespace(result!.projectNamespace)).toBe(true)\n  expect(result).toMatchSnapshot()\n}\n\nfunction error(...args: Parameters<typeof parseProjectIdentifier>) {\n  expect(() => parseProjectIdentifier(...args)).throws()\n}\n\ndescribe('parseProjectIdentifier', () => {\n  test('strict mode valid', () => {\n    success('@username/foo')\n    success('@username/foo-bar')\n    success('@username/foobar123-yo')\n    success('@u/foo-bar')\n    success('@a/foo-bar')\n    success('@foo/foobar123-yo')\n    success('@foo/bar')\n  })\n\n  test('strict mode invalid', () => {\n    error()\n    error('')\n    error('foo')\n    error('foo/bar')\n    error('foo/bar/baz')\n    error('foo/bar/baz/qux')\n    error('@foo/bar/baz/qux')\n    error('@foo/bar/baz/qux/quux')\n    error('@foo/bar/baz/qux/quux/corge')\n    error('@foo/bar/baz/qux/quux/corge/grault')\n    error('@foo/bar/baz/qux/quux/corge/grault/garply')\n    error('@foo/bar/baz/')\n    error('@foo')\n    error('@foo/bar/')\n\n    error('@foo-bar')\n    error('@%/foo-bar')\n    error('@user/foo^bar')\n    error('@user@foo^bar')\n    error('@username/Foo-Bar')\n    error('username/foo-bar/foo')\n    error('@Username/foo-bar/foo')\n    error('@username/Foo-bar/foo')\n    error('@username/foo-bar/')\n    error('username/foo-bar')\n\n    error('@foo_bar')\n    error('@Username/foo-bar')\n    error('@username/Foo-bar')\n    error('@username/foo_bar')\n    error('@username_/foo-bar')\n    error('@username/fooBar123-yo/')\n\n    error('//@username/foo-bar@01234567/foo')\n    error('https://@username/foo-bar')\n    error('https://example.com/@username/foo-bar')\n  })\n\n  test('non-strict mode valid', () => {\n    success('https://gateway.agentic.so/@username/foo-bar', {\n      strict: false\n    })\n    success('/@username/foo-bar', { strict: false })\n    success('@username/foo-bar', { strict: false })\n    success('https://gateway.agentic.so/@username/foo-bar', {\n      strict: false\n    })\n\n    success('/@username/foo-bar', { strict: false })\n    success('/@username/foo-bar', { strict: false })\n    success('/@username/foo-bar', { strict: false })\n\n    success('https://gateway.agentic.so/@username/foo-bar', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar@latest', {\n      strict: false\n    })\n\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo', {\n      strict: false\n    })\n    success('/@username/foo-bar@01234567/foo', { strict: false })\n    success('@username/foo-bar@01234567/foo/', { strict: false })\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo/', {\n      strict: false\n    })\n\n    success('/@username/foo-bar@01234567/foo/', { strict: false })\n    success('/@username/foo-bar@latest/foo/', { strict: false })\n    success('/@username/foo-bar@dev/foo/', { strict: false })\n    success('/@username/foo-bar@1.0.0/foo/', { strict: false })\n    success('/@username/foo-bar/foo/', { strict: false })\n\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar/foo/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar@latest/foo/', {\n      strict: false\n    })\n  })\n\n  test('non-strict mode invalid', () => {\n    error(undefined, { strict: false })\n    error('', { strict: false })\n    error('https://gateway.agentic.so', { strict: false })\n    error('//gateway.agentic.so', { strict: false })\n    error('https://gateway.agentic.so/@username', { strict: false })\n    error('https://gateway.agentic.so/call/@username/foo-bar@latest/tool', {\n      strict: false\n    })\n    error('/call/@username/foo-bar/foo', { strict: false })\n    error('//@username/foo-bar/foo', { strict: false })\n    error('@username/foo-bar/foo//', { strict: false })\n\n    error('@username/foo-bar/foo😀', { strict: false })\n    error('@username/Foo-Bar@dev/foo/', { strict: false })\n    error('@username/Foo-Bar', { strict: false })\n    error('@username/foo😀', { strict: false })\n  })\n})\n"
  },
  {
    "path": "packages/validators/src/parse-project-identifier.ts",
    "content": "import { HttpError } from '@agentic/platform-core'\n\nimport type { ParsedProjectIdentifier, ParseIdentifierOptions } from './types'\nimport { parseDeploymentIdentifier } from './parse-deployment-identifier'\nimport { coerceIdentifier } from './utils'\n\nconst projectIdentifierRe = /^@([a-z0-9-]{1,256})\\/([a-z0-9-]{1,256})$/\n\nexport function parseProjectIdentifier(\n  identifier?: string,\n  { strict = true, errorStatusCode = 400 }: ParseIdentifierOptions = {}\n): ParsedProjectIdentifier {\n  const inputIdentifier = identifier\n\n  if (!strict) {\n    try {\n      return parseDeploymentIdentifier(identifier, {\n        strict,\n        errorStatusCode\n      })\n    } catch {\n      // ignore\n    }\n  }\n\n  if (!strict) {\n    identifier = coerceIdentifier(identifier)\n  }\n\n  if (!identifier?.length) {\n    throw new HttpError({\n      statusCode: errorStatusCode,\n      message: `Invalid project identifier \"${inputIdentifier}\"`\n    })\n  }\n\n  const match = identifier.match(projectIdentifierRe)\n\n  if (match) {\n    return {\n      projectIdentifier: `@${match[1]!}/${match[2]!}`,\n      projectNamespace: match[1]!,\n      projectSlug: match[2]!\n    }\n  }\n\n  throw new HttpError({\n    statusCode: errorStatusCode,\n    message: `Invalid project identifier \"${inputIdentifier}\"`\n  })\n}\n"
  },
  {
    "path": "packages/validators/src/parse-tool-identifier.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\n\nimport { parseToolIdentifier } from './parse-tool-identifier'\nimport {\n  isValidDeploymentHash,\n  isValidDeploymentIdentifier,\n  isValidNamespace,\n  isValidProjectIdentifier,\n  isValidProjectSlug,\n  isValidToolName\n} from './validators'\n\nfunction success(...args: Parameters<typeof parseToolIdentifier>) {\n  const result = parseToolIdentifier(...args)\n  expect(result).toBeTruthy()\n  expect(result!.projectIdentifier).toBeTruthy()\n  expect(result!.projectNamespace).toBeTruthy()\n  expect(result!.projectSlug).toBeTruthy()\n  expect(result!.deploymentIdentifier).toBeTruthy()\n  expect(result!.deploymentVersion || result!.deploymentHash).toBeTruthy()\n  expect(isValidProjectIdentifier(result!.projectIdentifier)).toBe(true)\n  expect(isValidProjectSlug(result!.projectSlug)).toBe(true)\n  expect(isValidNamespace(result!.projectNamespace)).toBe(true)\n  expect(isValidDeploymentIdentifier(result!.deploymentIdentifier)).toBe(true)\n  expect(isValidToolName(result!.toolName)).toBe(true)\n\n  if (result!.deploymentHash) {\n    expect(isValidDeploymentHash(result!.deploymentHash)).toBe(true)\n  }\n\n  expect(result).toMatchSnapshot()\n}\n\nfunction error(...args: Parameters<typeof parseToolIdentifier>) {\n  expect(() => parseToolIdentifier(...args)).throws()\n}\n\ndescribe('parseToolIdentifier', () => {\n  test('strict mode valid', () => {\n    success('@username/foo-bar@01234567/foo')\n    success('@username/foo-bar@01234567/foo')\n    success('@username/foo-bar@abc123lz/foo')\n    success('@username/foo-bar/foo')\n    success('@username/foobar123-yo@01234567/foo_bar_BAR_901')\n    success('@username/foobar@01234567/get_weather01')\n    success('@username/foobar@latest/foo')\n    success('@username/foobar@dev/foo')\n    success('@username/foobar@1.0.0/foo')\n\n    success('@username/foo-bar@latest/foo')\n    success('@username/foo-bar@dev/foo')\n    success('@username/foo-bar@1.0.0/foo')\n    success('@username/foobar123-yo@0.0.1/foo_bar_BAR_901')\n    success('@username/foobar123-yo@0.0.1/foo')\n\n    success('@u/foo-bar/foo')\n    success('@a/foo-bar/foo_123')\n    success('@foo/foobar123-yo/foo_bar_BAR_901')\n    success('@foo/foobar123-yo/foo')\n    success('@foo/bar/baz')\n  })\n\n  test('strict mode invalid', () => {\n    error()\n    error('')\n    error('foo')\n    error('foo/bar')\n    error('foo/bar/baz')\n    error('foo/bar/baz/qux')\n    error('@foo/bar/baz/qux')\n    error('@foo/bar/baz/qux/quux')\n    error('@foo/bar/baz/qux/quux/corge')\n    error('@foo/bar/baz/qux/quux/corge/grault')\n    error('@foo/bar/baz/qux/quux/corge/grault/garply')\n    error('@foo/bar/baz/')\n    error('@foo')\n    error('@foo/bar')\n    error('@foo/bar/')\n\n    error('@foo-bar@01234567/foo')\n    error('@%/foo-bar@01234567/foo')\n    error('@user/foo^bar@01234567/foo')\n    error('@user@foo^bar@01234567/foo')\n    error('@username/Foo-Bar@01234567/foo')\n    error('username/foo-bar/foo')\n    error('@Username/foo-bar/foo')\n    error('@username/Foo-bar/foo')\n    error('@username/foo-bar/')\n    error('@username/foo-bar')\n\n    error('@foo_bar@latest/foo')\n    error('@username/foo-bar@1.0.0/foo@')\n    error('@username/foo-bar@/foo')\n    error('@username/foo-bar@/foo/')\n    error('@username/fooBar123-yo@0.0.1/foo/bar/123-456')\n\n    error('//@username/foo-bar@01234567/foo')\n    error('https://@username/foo-bar@01234567/foo')\n    error('https://example.com/@username/foo-bar/foo')\n  })\n\n  test('non-strict mode valid', () => {\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo', {\n      strict: false\n    })\n    success('/@username/foo-bar@01234567/foo', { strict: false })\n    success('@username/foo-bar@01234567/foo/', { strict: false })\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo/', {\n      strict: false\n    })\n\n    success('/@username/foo-bar@01234567/foo/', { strict: false })\n    success('/@username/foo-bar@latest/foo/', { strict: false })\n    success('/@username/foo-bar@dev/foo/', { strict: false })\n    success('/@username/foo-bar@1.0.0/foo/', { strict: false })\n    success('/@username/foo-bar/foo/', { strict: false })\n\n    success('https://gateway.agentic.so/@username/foo-bar@01234567/foo/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar/foo/', {\n      strict: false\n    })\n    success('https://gateway.agentic.so/@username/foo-bar@latest/foo/', {\n      strict: false\n    })\n  })\n\n  test('non-strict mode invalid', () => {\n    error(undefined, { strict: false })\n    error('', { strict: false })\n    error('https://gateway.agentic.so', { strict: false })\n    error('//gateway.agentic.so', { strict: false })\n    error('https://gateway.agentic.so/@username', { strict: false })\n    error('https://gateway.agentic.so/@username/foo-bar', { strict: false })\n    error('https://gateway.agentic.so/call/@username/foo-bar@latest/tool', {\n      strict: false\n    })\n    error('/call/@username/foo-bar/foo', { strict: false })\n    error('//@username/foo-bar/foo', { strict: false })\n    error('@username/foo-bar/foo//', { strict: false })\n\n    error('@username/foo-bar/foo😀', { strict: false })\n    error('@username/Foo-Bar@dev/foo/', { strict: false })\n  })\n})\n"
  },
  {
    "path": "packages/validators/src/parse-tool-identifier.ts",
    "content": "import { HttpError } from '@agentic/platform-core'\n\nimport type { ParsedToolIdentifier, ParseIdentifierOptions } from './types'\nimport { coerceIdentifier } from './utils'\n\nconst toolIdentifierImplicitRe =\n  /^@([a-z0-9-]{1,256})\\/([a-z0-9-]{1,256})\\/([a-zA-Z_][a-zA-Z0-9_-]{0,63})$/\n\nconst toolIdentifierHashRe =\n  /^@([a-z0-9-]{1,256})\\/([a-z0-9-]{1,256})@([a-z0-9]{8})\\/([a-zA-Z_][a-zA-Z0-9_-]{0,63})$/\n\nconst toolIdentifierVersionRe =\n  /^@([a-z0-9-]{1,256})\\/([a-z0-9-]{1,256})@([\\d.a-z-@]+)\\/([a-zA-Z_][a-zA-Z0-9_-]{0,63})$/\n\nexport function parseToolIdentifier(\n  identifier?: string,\n  { strict = true, errorStatusCode = 400 }: ParseIdentifierOptions = {}\n): ParsedToolIdentifier {\n  const inputIdentifier = identifier\n\n  if (!strict) {\n    identifier = coerceIdentifier(identifier)\n  }\n\n  if (!identifier?.length) {\n    throw new HttpError({\n      statusCode: errorStatusCode,\n      message: `Invalid tool identifier \"${inputIdentifier}\"`\n    })\n  }\n\n  const iMatch = identifier.match(toolIdentifierImplicitRe)\n\n  if (iMatch) {\n    return {\n      projectIdentifier: `@${iMatch[1]!}/${iMatch[2]!}`,\n      projectNamespace: iMatch[1]!,\n      projectSlug: iMatch[2]!,\n      deploymentIdentifier: `@${iMatch[1]!}/${iMatch[2]!}@latest`,\n      deploymentVersion: 'latest',\n      toolName: iMatch[3]!\n    }\n  }\n\n  const hMatch = identifier.match(toolIdentifierHashRe)\n\n  if (hMatch) {\n    return {\n      projectIdentifier: `@${hMatch[1]!}/${hMatch[2]!}`,\n      projectNamespace: hMatch[1]!,\n      projectSlug: hMatch[2]!,\n      deploymentIdentifier: `@${hMatch[1]!}/${hMatch[2]!}@${hMatch[3]!}`,\n      deploymentHash: hMatch[3]!,\n      toolName: hMatch[4]!\n    }\n  }\n\n  const vMatch = identifier.match(toolIdentifierVersionRe)\n\n  if (vMatch) {\n    return {\n      projectIdentifier: `@${vMatch[1]!}/${vMatch[2]!}`,\n      projectNamespace: vMatch[1]!,\n      projectSlug: vMatch[2]!,\n      deploymentIdentifier: `@${vMatch[1]!}/${vMatch[2]!}@${vMatch[3]!}`,\n      deploymentVersion: 'latest',\n      toolName: vMatch[4]!\n    }\n  }\n\n  throw new HttpError({\n    statusCode: errorStatusCode,\n    message: `Invalid tool identifier \"${inputIdentifier}\"`\n  })\n}\n"
  },
  {
    "path": "packages/validators/src/tool-name-blacklist.ts",
    "content": "// TODO: if we separate mcp endpoint from REST endpoint, we may be able to have\n// tools named `mcp`. would be nice not to impose a blacklist.\nexport const toolNameBlacklist = new Set([\n  // restricted because they are reserved for the platform\n  'mcp',\n  'sse'\n])\n"
  },
  {
    "path": "packages/validators/src/types.ts",
    "content": "import type { Simplify } from 'type-fest'\n\nexport type ParseIdentifierOptions = {\n  strict?: boolean\n  errorStatusCode?: number\n}\n\nexport type ParsedProjectIdentifier = {\n  projectIdentifier: string\n  projectNamespace: string\n  projectSlug: string\n}\n\nexport type ParsedDeploymentIdentifier = Simplify<\n  ParsedProjectIdentifier & {\n    deploymentIdentifier: string\n    deploymentHash?: string\n    deploymentVersion?: string\n  } & (\n      | {\n          deploymentHash: string\n        }\n      | {\n          deploymentVersion: string\n        }\n    )\n>\n\nexport type ParsedToolIdentifier = Simplify<\n  ParsedDeploymentIdentifier & {\n    toolName: string\n  }\n>\n"
  },
  {
    "path": "packages/validators/src/utils.ts",
    "content": "export function coerceIdentifier(identifier?: string): string | undefined {\n  if (!identifier) {\n    return\n  }\n\n  try {\n    const { pathname } = new URL(identifier)\n    identifier = pathname\n  } catch {}\n\n  identifier = identifier.replace(/^\\//, '')\n  identifier = identifier.replace(/\\/$/, '')\n\n  return identifier\n}\n"
  },
  {
    "path": "packages/validators/src/validators.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport {\n  isNamespaceAllowed,\n  isToolNameAllowed,\n  isValidDeploymentHash,\n  isValidDeploymentIdentifier,\n  isValidEmail,\n  isValidPassword,\n  isValidProjectIdentifier,\n  isValidProjectSlug,\n  isValidToolName,\n  isValidUsername\n} from './validators'\n\ntest('isValidEmail success', () => {\n  expect(isValidEmail('t@t.com')).toBe(true)\n  expect(isValidEmail('abc@gmail.com')).toBe(true)\n  expect(isValidEmail('abc@foo.io')).toBe(true)\n})\n\ntest('isValidEmail failure', () => {\n  expect(isValidEmail('t@t')).toBe(false)\n  expect(isValidEmail('abc')).toBe(false)\n  expect(isValidEmail('@')).toBe(false)\n})\n\ntest('isNamespaceAllowed', () => {\n  expect(isNamespaceAllowed('foo')).toBe(true)\n  expect(isNamespaceAllowed('foo-bar')).toBe(true)\n  expect(isNamespaceAllowed('vercel')).toBe(false)\n  expect(isNamespaceAllowed('ai')).toBe(false)\n  expect(isNamespaceAllowed('fuck')).toBe(false)\n})\n\ntest('isValidUsername success', () => {\n  expect(isValidUsername('z')).toBe(true)\n  expect(isValidUsername('abc')).toBe(true)\n  expect(isValidUsername('abc-123')).toBe(true)\n  expect(isValidUsername('foo123')).toBe(true)\n  expect(isValidUsername('asldfkjasldkfjlaksdfjlkas')).toBe(true)\n  expect(isValidUsername('a'.repeat(256))).toBe(true)\n})\n\ntest('isValidUsername failure (invalid)', () => {\n  expect(isValidUsername('ab%')).toBe(false)\n  expect(isValidUsername('.')).toBe(false)\n  expect(isValidUsername('$')).toBe(false)\n  expect(isValidUsername('abc_123')).toBe(false)\n  expect(isValidUsername('Foo123')).toBe(false)\n  expect(isValidUsername('a'.repeat(257))).toBe(false)\n})\n\ntest('isValidPassword success', () => {\n  expect(isValidPassword('abc')).toBe(true)\n  expect(isValidPassword('password')).toBe(true)\n  expect(isValidPassword('asldfkjasldkfjlaksdfjlkas')).toBe(true)\n})\n\ntest('isValidPassword failure', () => {\n  expect(isValidPassword('aa')).toBe(false)\n  expect(isValidPassword('.'))\n  expect(isValidPassword('a'.repeat(1025))).toBe(false)\n})\n\ntest('isValidProjectSlug success', () => {\n  expect(isValidProjectSlug('a')).toBe(true)\n  expect(isValidProjectSlug('ai')).toBe(true)\n  expect(isValidProjectSlug('aaa')).toBe(true)\n  expect(isValidProjectSlug('hello-world')).toBe(true)\n  expect(isValidProjectSlug('123-abc')).toBe(true)\n  expect(isValidProjectSlug('f'.repeat(256))).toBe(true)\n})\n\ntest('isValidProjectSlug failure', () => {\n  expect(isValidProjectSlug('hello_world')).toBe(false)\n  expect(isValidProjectSlug('a_bc')).toBe(false)\n  expect(isValidProjectSlug('abc.')).toBe(false)\n  expect(isValidProjectSlug('abc_123')).toBe(false)\n  expect(isValidProjectSlug('ah^23')).toBe(false)\n  expect(isValidProjectSlug('Hello-World')).toBe(false)\n  expect(isValidProjectSlug('f'.repeat(257))).toBe(false)\n})\n\ntest('isValidDeploymentHash success', () => {\n  expect(isValidDeploymentHash('abcdefgh')).toBe(true)\n  expect(isValidDeploymentHash('01234567')).toBe(true)\n  expect(isValidDeploymentHash('k2l3n6l2')).toBe(true)\n})\n\ntest('isValidDeploymentHash failure', () => {\n  expect(isValidDeploymentHash('aa')).toBe(false)\n  expect(isValidDeploymentHash('')).toBe(false)\n  expect(isValidDeploymentHash('Abcdefgh')).toBe(false)\n  expect(isValidDeploymentHash('012345678')).toBe(false)\n})\n\ntest('isValidProjectIdentifier success', () => {\n  expect(isValidProjectIdentifier('@username/project-slug')).toBe(true)\n  expect(isValidProjectIdentifier('@a/123')).toBe(true)\n})\n\ntest('isValidProjectIdentifier failure', () => {\n  expect(isValidProjectIdentifier('')).toBe(false)\n  expect(isValidProjectIdentifier()).toBe(false)\n  expect(isValidProjectIdentifier('foo')).toBe(false)\n  expect(isValidProjectIdentifier('@foo')).toBe(false)\n  expect(isValidProjectIdentifier('@foo//bar')).toBe(false)\n  expect(isValidProjectIdentifier('@@foo/bar')).toBe(false)\n  expect(isValidProjectIdentifier('@foo/bar/baz')).toBe(false)\n  expect(isValidProjectIdentifier('@foo/bar/tool')).toBe(false)\n  expect(isValidProjectIdentifier('@aaa//0123')).toBe(false)\n  expect(isValidProjectIdentifier('@foo@bar')).toBe(false)\n  expect(isValidProjectIdentifier('@abc/1.23')).toBe(false)\n  expect(isValidProjectIdentifier('@012345678/123@latest')).toBe(false)\n  expect(isValidProjectIdentifier('@foo@dev')).toBe(false)\n  expect(isValidProjectIdentifier('@username/Project-Slug')).toBe(false)\n  expect(isValidProjectIdentifier('@_/___')).toBe(false)\n})\n\ntest('isValidDeploymentIdentifier success', () => {\n  expect(isValidDeploymentIdentifier('@username/project-slug@01234567')).toBe(\n    true\n  )\n  expect(isValidDeploymentIdentifier('@username/project-slug@latest')).toBe(\n    true\n  )\n  expect(isValidDeploymentIdentifier('@username/project-slug@dev')).toBe(true)\n  expect(isValidDeploymentIdentifier('@username/project-slug@0.0.1')).toBe(true)\n  expect(isValidDeploymentIdentifier('@username/project-slug')).toBe(true)\n  expect(isValidDeploymentIdentifier('@a/123@01234567')).toBe(true)\n  expect(isValidDeploymentIdentifier('@a/123@0.1.0')).toBe(true)\n  expect(isValidDeploymentIdentifier('@a/123@latest')).toBe(true)\n  expect(isValidDeploymentIdentifier('@a/123@dev')).toBe(true)\n  expect(isValidDeploymentIdentifier('@a/123')).toBe(true)\n})\n\ntest('isValidDeploymentIdentifier failure', () => {\n  expect(isValidDeploymentIdentifier('')).toBe(false)\n  expect(isValidDeploymentIdentifier()).toBe(false)\n  expect(isValidDeploymentIdentifier('foo')).toBe(false)\n  expect(isValidDeploymentIdentifier('foo/bar')).toBe(false)\n  expect(isValidDeploymentIdentifier('@@foo/bar')).toBe(false)\n  expect(isValidDeploymentIdentifier('@foo/bar/baz')).toBe(false)\n  expect(isValidDeploymentIdentifier('@foo/bar/tool')).toBe(false)\n  expect(isValidDeploymentIdentifier('@a/123@0123A567/foo')).toBe(false)\n  expect(isValidDeploymentIdentifier('@_/___@012.4567')).toBe(false)\n  expect(isValidDeploymentIdentifier('@_/___@01234567')).toBe(false)\n  expect(isValidDeploymentIdentifier('@aaa//0123@01234567')).toBe(false)\n  expect(isValidDeploymentIdentifier('@foo@bar@01234567')).toBe(false)\n  expect(isValidDeploymentIdentifier('@abc/1.23@01234567')).toBe(false)\n  expect(isValidDeploymentIdentifier('012345678/123@latest')).toBe(false)\n  expect(isValidDeploymentIdentifier('012345678/123@dev')).toBe(false)\n  expect(isValidDeploymentIdentifier('012345678/123@1.0.1')).toBe(false)\n})\n\ntest('isValidToolName success', () => {\n  expect(isValidToolName('tool_name')).toBe(true)\n  expect(isValidToolName('toolName')).toBe(true)\n  expect(isValidToolName('_identIFIER0123')).toBe(true)\n  expect(isValidToolName('abc_123_foo')).toBe(true)\n  expect(isValidToolName('search_google')).toBe(true)\n  expect(isValidToolName('searchGoogle')).toBe(true)\n  expect(isValidToolName('searchGoogle2')).toBe(true)\n  expect(isValidToolName('_searchGoogle')).toBe(true)\n  expect(isValidToolName('tool-name')).toBe(true)\n})\n\ntest('isValidToolName failure', () => {\n  expect(isValidToolName('ab1.2')).toBe(false)\n  expect(isValidToolName('-foo-bar')).toBe(false)\n  expect(isValidToolName('abc/123')).toBe(false)\n  expect(isValidToolName('search_google ')).toBe(false)\n  expect(isValidToolName('-search_google')).toBe(false)\n  expect(\n    isValidToolName(\n      'too_long_too_long_too_long_too_long_too_long_too_long_too_long_to'\n    )\n  ).toBe(false)\n})\n\ntest('isToolNameAllowed', () => {\n  expect(isToolNameAllowed('foo')).toBe(true)\n  expect(isToolNameAllowed('tool_name')).toBe(true)\n  expect(isToolNameAllowed('searchGoogle')).toBe(true)\n  expect(isToolNameAllowed('mcp')).toBe(false)\n  expect(isToolNameAllowed('sse')).toBe(false)\n  expect(isToolNameAllowed()).toBe(false)\n  expect(isToolNameAllowed('')).toBe(false)\n})\n"
  },
  {
    "path": "packages/validators/src/validators.ts",
    "content": "import { isCuid } from '@paralleldrive/cuid2'\nimport emailValidator from 'email-validator'\n\nimport type { ParseIdentifierOptions } from './types'\nimport { namespaceBlacklist } from './namespace-blacklist'\nimport { parseDeploymentIdentifier } from './parse-deployment-identifier'\nimport { parseProjectIdentifier } from './parse-project-identifier'\nimport { toolNameBlacklist } from './tool-name-blacklist'\n\nexport const namespaceRe = /^[a-z0-9-]{1,256}$/\nexport const passwordRe = /^.{3,1024}$/\n\nexport const projectSlugRe = /^[a-z0-9-]{1,256}$/\nexport const deploymentHashRe = /^[a-z0-9]{8}$/\n\nexport const toolNameRe = /^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$/\n\nexport function isValidEmail(value: string): boolean {\n  return emailValidator.validate(value)\n}\n\nexport function isValidNamespace(value?: string): boolean {\n  return !!value && namespaceRe.test(value)\n}\n\nexport function isNamespaceAllowed(value?: string): boolean {\n  return !!value && isValidNamespace(value) && !namespaceBlacklist.has(value)\n}\n\nexport function isValidUsername(value?: string): boolean {\n  return isValidNamespace(value)\n}\n\nexport function isValidTeamSlug(value?: string): boolean {\n  return isValidNamespace(value)\n}\n\nexport function isValidPassword(value?: string): boolean {\n  return !!value && passwordRe.test(value)\n}\n\nexport function isValidProjectSlug(value?: string): boolean {\n  return !!value && projectSlugRe.test(value)\n}\n\nexport function isValidDeploymentHash(value?: string): boolean {\n  return !!value && deploymentHashRe.test(value)\n}\n\nexport function isValidProjectIdentifier(\n  value?: string,\n  opts?: ParseIdentifierOptions\n): boolean {\n  try {\n    return !!parseProjectIdentifier(value, opts)\n  } catch {\n    return false\n  }\n}\n\nexport function isValidDeploymentIdentifier(\n  value?: string,\n  opts?: ParseIdentifierOptions\n): boolean {\n  try {\n    return !!parseDeploymentIdentifier(value, opts)\n  } catch {\n    return false\n  }\n}\n\nexport function isValidToolName(value?: string): boolean {\n  return !!value && toolNameRe.test(value)\n}\n\nexport function isToolNameAllowed(value?: string): boolean {\n  return !!value && isValidToolName(value) && !toolNameBlacklist.has(value)\n}\n\nexport function isValidCuid(value?: string): boolean {\n  return !!value && isCuid(value)\n}\n"
  },
  {
    "path": "packages/validators/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - packages/*\n  - stdlib/*\n  - apps/*\n  - docs\n  - fixtures\n  - fixtures/valid/*\n  - examples/mcp-servers/*\n  - examples/ts-sdks/*\n\ncatalog:\n  '@ai-sdk/openai': ^1.3.23\n  '@apideck/better-ajv-errors': ^0.3.6\n  '@clack/prompts': ^0.11.0\n  '@cloudflare/workers-types': ^4.20250620.0\n  '@commander-js/extra-typings': ^14.0.0\n  '@date-fns/utc': ^2.1.0\n  '@dicebear/collection': ^9.2.3\n  '@dicebear/core': ^9.2.3\n  '@dotenvx/dotenvx': ^1.47.7\n  '@edge-runtime/vm': ^5.0.0\n  '@fisch0920/config': ^1.2.0\n  '@fisch0920/drizzle-orm': ^0.43.7\n  '@fisch0920/drizzle-zod': ^0.7.9\n  '@fisch0920/markdown-to-html': ^1.1.0\n  '@googleapis/customsearch': ^4.0.1\n  '@hono/mcp': ^0.1.0\n  '@hono/node-server': ^1.15.0\n  '@hono/sentry': ^1.2.2\n  '@hono/zod-openapi': ^0.19.9\n  '@hono/zod-validator': ^0.7.0\n  '@langchain/core': ^0.3.60\n  '@langchain/openai': ^0.5.14\n  '@llamaindex/openai': ^0.4.4\n  '@llamaindex/workflow': ^1.1.9\n  '@mastra/core': ^0.10.6\n  '@mastra/schema-compat': ^0.10.3\n  '@modelcontextprotocol/sdk': ^1.15.0\n  '@nangohq/node': 0.42.22\n  '@number-flow/react': ^0.5.10\n  '@paralleldrive/cuid2': ^2.2.2\n  '@pmndrs/assets': ^1.7.0\n  '@radix-ui/react-collapsible': ^1.1.11\n  '@radix-ui/react-dropdown-menu': 2.1.15\n  '@radix-ui/react-label': ^2.1.7\n  '@radix-ui/react-slot': 1.2.3\n  '@radix-ui/react-tabs': ^1.1.12\n  '@radix-ui/react-tooltip': ^1.2.7\n  '@react-email/components': ^0.1.1\n  '@react-three/cannon': ^6.6.0\n  '@react-three/drei': ^10.4.4\n  '@react-three/fiber': ^9.2.0\n  '@react-three/postprocessing': ^3.0.4\n  '@react-three/rapier': ^2.1.0\n  '@redocly/openapi-core': ^1.34.3\n  '@sentry/cli': ^2.46.0\n  '@sentry/cloudflare': ^9.35.0\n  '@sentry/core': ^9.35.0\n  '@sentry/node': ^9.35.0\n  '@sindresorhus/slugify': ^2.2.1\n  '@standard-schema/spec': ^1.0.0\n  '@tailwindcss/postcss': ^4.1.11\n  '@tailwindcss/typography': ^0.5.16\n  '@tanstack/react-form': ^1.14.1\n  '@tanstack/react-query': ^5.81.5\n  '@tanstack/react-query-devtools': ^5.81.5\n  '@types/canvas-confetti': ^1.9.0\n  '@types/jsrsasign': ^10.5.15\n  '@types/ms': ^2.1.0\n  '@types/node': ^24.0.14\n  '@types/react': ^19.1.8\n  '@types/react-dom': ^19.1.6\n  '@types/semver': ^7.7.0\n  '@types/three': ^0.178.0\n  '@xsai/tool': ^0.3.0-beta.4\n  agents: ^0.0.101\n  ai: ^4.3.17\n  ajv: ^8.17.1\n  ajv-formats: ^3.0.1\n  autoprefixer: ^10.4.21\n  bcryptjs: ^3.0.2\n  bumpp: ^10.2.0\n  camelcase: ^8.0.0\n  canvas-confetti: ^1.9.3\n  class-variance-authority: ^0.7.1\n  cleye: ^1.3.4\n  clsx: ^2.1.1\n  commander: ^14.0.0\n  conf: ^14.0.0\n  date-fns: ^4.1.0\n  decamelize: ^6.0.0\n  decircular: ^1.0.0\n  dedent: ^1.6.0\n  del-cli: ^6.0.0\n  delay: ^6.0.0\n  dotenv: 17.2.0\n  drizzle-kit: ^0.31.4\n  drizzle-orm: ^0.44.2\n  duck-duck-scrape: ^2.2.7\n  email-validator: ^2.0.4\n  eslint: ^9.35.0\n  eslint-plugin-drizzle: ^0.2.3\n  eventid: ^2.0.1\n  exit-hook: ^4.0.0\n  fast-content-type-parse: ^3.0.0\n  fast-uri: ^3.0.6\n  fast-xml-parser: ^5.2.5\n  fastmcp: ^3.8.2\n  genkit: ^1.13.0\n  genkitx-openai: ^0.22.3\n  get-port: ^7.1.0\n  google-auth-library: ^9.15.1\n  googleapis: ^150.0.1\n  hash-object: ^5.0.1\n  hast-util-to-jsx-runtime: ^2.3.6\n  hono: ^4.8.4\n  is-obj: ^3.0.0\n  is-relative-url: ^4.0.0\n  jsonrepair: ^3.12.0\n  jsrsasign: ^10.9.0\n  knip: ^5.62.0\n  ky: ^1.8.1\n  langchain: ^0.3.29\n  lint-staged: ^16.1.2\n  llamaindex: ^0.11.8\n  lucide-react: ^0.525.0\n  mathjs: ^13.2.3\n  mint: ^4.2.4\n  motion: ^12.19.2\n  ms: ^2.1.3\n  next: ^15.3.5\n  next-themes: ^0.4.6\n  npm-run-all2: ^8.0.4\n  octokit: ^5.0.3\n  only-allow: ^1.2.1\n  open: ^10.1.2\n  openai: ^5.5.1\n  openai-fetch: ^3.4.2\n  openai-zod-to-json-schema: ^1.1.1\n  openapi-typescript: ^7.8.0\n  ora: ^8.2.0\n  p-all: ^5.0.0\n  p-map: ^7.0.3\n  p-throttle: 6.2.0\n  p-times: ^4.0.0\n  parse-json: ^8.3.0\n  plur: ^5.1.0\n  postcss: ^8.5.6\n  postgres: ^3.4.7\n  posthog-js: ^1.256.2\n  prettier: ^3.6.2\n  react: ^19.1.0\n  react-dom: ^19.1.0\n  react-email: ^4.0.17\n  react-infinite-scroll-hook: ^6.0.1\n  react-lottie-player: ^2.1.0\n  react-medium-image-zoom: ^5.2.14\n  react-use: ^17.6.0\n  resend: ^4.6.0\n  restore-cursor: ^5.1.0\n  semver: ^7.7.2\n  server-only: ^0.0.1\n  shiki: ^3.7.0\n  simple-git-hooks: ^2.13.0\n  sonner: ^2.0.6\n  sort-keys: ^5.1.0\n  string-strip-html: ^13.4.12\n  stripe: ^18.2.1\n  suspend-react: ^0.1.3\n  tailwind-merge: ^3.3.1\n  tailwindcss: ^4.1.11\n  three: ^0.178.0\n  tsup: ^8.5.0\n  tsx: ^4.20.5\n  turbo: ^2.5.5\n  tw-animate-css: ^1.3.4\n  twitter-api-sdk: ^1.2.1\n  type-fest: ^4.41.0\n  typescript: ^5.9.2\n  unconfig: ^7.3.2\n  vite-tsconfig-paths: ^5.1.4\n  vitest: ^3.2.4\n  wikibase-sdk: ^10.2.3\n  wrangler: ^4.23.0\n  xsai: ^0.3.0-beta.4\n  zod: ^3.25.67\n  zod-to-json-schema: ^3.24.5\n  zod-validation-error: 4.0.0-beta.1\n  zoominfo-api-auth-client: ^1.0.1\n\nenablePrePostScripts: true\n\nignoredBuiltDependencies:\n  - '@fisch0920/config'\n  - puppeteer\n\nminimumReleaseAge: 1440\n\nonlyBuiltDependencies:\n  - '@sentry/cli'\n  - protobufjs\n  - tree-sitter\n\npackageManagerStrict: false\n\nupdateConfig:\n  ignoreDependencies:\n    - p-throttle\n    - '@nangohq/node'\n"
  },
  {
    "path": "readme.md",
    "content": "> [!IMPORTANT]\n> As of February, 2026, I'm archiving this project since it is no longer being actively developed. Agentic had a good run and explored some genuinely interesting ideas for the time, namely an HTTP <> MCP compatibility layer, a TS stdlib of AI functions, and cross-compat with all the major LLM libs + AI SDKs. But at the end of the day, it failed to gain traction, and I've moved on to other projects.\n\n<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# Agentic <!-- omit from toc -->\n\nYou can think of Agentic as **RapidAPI for LLM tools**.\n\nAll tools listed on Agentic's marketplace have been carefully hand curated and are regularly tested with a comprehensive set of integration tests and evals. **Agentic aims for quality, not quantity**.\n\nOn the flip side, Agentic makes it easy to **publish your own MCP servers & OpenAPI services** to Agentic's MCP Gateway and instantly start charging for agentic tool use.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so)\n\n## Key features\n\n- **Highly Curated Tools**: All publicly listed Agentic tools are manually vetted to keep an extremely high quality bar.\n- **Agentic UX**: All Agentic tools have been hand-crafted specifically for LLM tool use. We call this Agentic UX, and it's at the heart of why Agentic tools work better for LLM & MCP use cases than legacy APIs.\n- **First-Class MCP Support**: On both the publishing and consumption sides, Agentic supports MCP as a truly first-class primitive – not an afterthought.\n- **World-Class TypeScript DX**: Agentic is written in TS and strives for a Vercel-like DX, including one-line integrations with every major TS LLM SDK.\n- **Stripe Billing**: Agentic uses Stripe for billing, and most tools are _usage-based_, so you'll only pay for what you (and your agents) actually use.\n- **Blazing Fast MCP Gateway**: Agentic's MCP gateway is powered by _Cloudflare's global edge network_. Tools come with customizable caching and rate-limits, so you can REST assured that your agents will always have a fast and reliable experience.\n- **Semver**: All Agentic tools are versioned using semver, so you can choose how to handle breaking changes.\n\n## Getting started\n\n- [MCP Marketplace](https://docs.agentic.so/marketplace) - Using tools\n- [MCP Publishing](https://docs.agentic.so/publishing/quickstart) - Publishing your own tools\n\n### TypeScript LLM SDKs\n\nAgentic has first-class support for every major TS LLM SDK, including:\n\n- [Vercel AI SDK](https://docs.agentic.so/marketplace/ts-sdks/ai-sdk)\n- [OpenAI](https://docs.agentic.so/marketplace/ts-sdks/openai-chat)\n- [LangChain](https://docs.agentic.so/marketplace/ts-sdks/langchain)\n- [LlamaIndex](https://docs.agentic.so/marketplace/ts-sdks/llamaindex)\n- [Firebase Genkit](https://docs.agentic.so/marketplace/ts-sdks/genkit)\n- [Mastra](https://docs.agentic.so/marketplace/ts-sdks/mastra)\n\n## Publish your own MCP products\n\n<p align=\"center\">\n  <a href=\"https://agentic.so/publishing\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-publishing-social-image-dark-github.jpg\" width=\"640\">\n  </a>\n</p>\n\n- [Learn more about publishing with Agentic](https://agentic.so/publishing)\n- [Publish an existing MCP server with Agentic](https://docs.agentic.so/publishing/guides/existing-mcp-server)\n- [Publish an existing OpenAPI service with Agentic](https://docs.agentic.so/publishing/guides/existing-openapi-service)\n\nAnyone can publish their own live MCP products with Agentic, but you'll need to submit your MCP to us before it can be listed on the main Agentic marketplace.\n\n## Join the community\n\n- Follow us on [Twitter](https://x.com/transitive_bs)\n- Read more in our [docs](https://docs.agentic.so)\n\n## Contributing\n\n**Agentic is proudly 100% open source.**\n\nInterested in contributing or building Agentic from scratch? See [contributing.md](./contributing.md).\n"
  },
  {
    "path": "stdlib/ai-sdk/package.json",
    "content": "{\n  \"name\": \"@agentic/ai-sdk\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic adapter for the Vercel AI SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/ai-sdk\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\"\n  },\n  \"peerDependencies\": {\n    \"ai\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"ai\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/ai-sdk/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/ai-sdk\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/ai-sdk.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/ai-sdk <!-- omit from toc -->\n\n> Agentic adapter for the Vercel AI SDK.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so/marketplace/ts-sdks/ai-sdk)\n\n## Install\n\n```bash\nnpm i @agentic/ai-sdk zod ai\n```\n\n## Usage\n\nSee https://docs.agentic.so/marketplace/ts-sdks/ai-sdk\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/ai-sdk/src/ai-sdk.test.ts",
    "content": "import { EchoAITool } from '@agentic/core'\nimport { expect, test } from 'vitest'\n\nimport { createAISDKTools, createAISDKToolsFromIdentifier } from './ai-sdk'\n\ntest('createAISDKTools', () => {\n  expect(createAISDKTools(new EchoAITool())).toHaveProperty('echo')\n})\n\ntest(\n  'createAISDKToolsFromIdentifier',\n  {\n    timeout: 30_000\n  },\n  async () => {\n    await expect(\n      createAISDKToolsFromIdentifier('@agentic/search')\n    ).resolves.toHaveProperty('search')\n  }\n)\n"
  },
  {
    "path": "stdlib/ai-sdk/src/ai-sdk.ts",
    "content": "import {\n  type AIFunctionLike,\n  AIFunctionSet,\n  asAgenticSchema,\n  isZodSchema\n} from '@agentic/core'\nimport {\n  AgenticToolClient,\n  type AgenticToolClientOptions\n} from '@agentic/platform-tool-client'\nimport { jsonSchema, type Tool, tool } from 'ai'\n\nexport type AISDKTools = Record<\n  string,\n  Tool & { execute: (args: any, options: any) => PromiseLike<any> }\n>\n\n/**\n * Converts a set of Agentic stdlib AI functions to an object compatible with\n * the Vercel AI SDK's `tools` parameter.\n */\nexport function createAISDKTools(\n  ...aiFunctionLikeTools: AIFunctionLike[]\n): AISDKTools {\n  const fns = new AIFunctionSet(aiFunctionLikeTools)\n\n  return Object.fromEntries(\n    fns.map((fn) => [\n      fn.spec.name,\n      tool({\n        description: fn.spec.description,\n        parameters: isZodSchema(fn.inputSchema)\n          ? fn.inputSchema\n          : jsonSchema(asAgenticSchema(fn.inputSchema).jsonSchema),\n        execute: fn.execute\n      })\n    ])\n  )\n}\n\n/**\n * Creates a Vercel AI SDK's `tools` object from a hosted Agentic project or\n * deployment identifier.\n *\n * You'll generally use a project identifier, which will automatically use\n * that project's `latest` version, but if you want to target a specific\n * version or preview deployment, you can use a fully-qualified deployment\n * identifier.\n *\n * @example\n * ```ts\n * const tools = await createAISDKToolsFromIdentifier('@agentic/search')\n * ```\n */\nexport async function createAISDKToolsFromIdentifier(\n  projectOrDeploymentIdentifier: string,\n  opts: AgenticToolClientOptions = {}\n): Promise<AISDKTools> {\n  const agenticToolClient = await AgenticToolClient.fromIdentifier(\n    projectOrDeploymentIdentifier,\n    opts\n  )\n\n  return createAISDKTools(agenticToolClient)\n}\n"
  },
  {
    "path": "stdlib/ai-sdk/src/index.ts",
    "content": "export * from './ai-sdk'\n"
  },
  {
    "path": "stdlib/ai-sdk/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/core/package.json",
    "content": "{\n  \"name\": \"@agentic/core\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic AI utils which work with any LLM and TypeScript AI SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/core\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"dedent\": \"catalog:\",\n    \"delay\": \"catalog:\",\n    \"jsonrepair\": \"catalog:\",\n    \"ky\": \"catalog:\",\n    \"openai-zod-to-json-schema\": \"catalog:\",\n    \"p-throttle\": \"catalog:\",\n    \"type-fest\": \"catalog:\",\n    \"zod-validation-error\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"openai-fetch\": \"catalog:\"\n  },\n  \"keywords\": [\n    \"agentic\",\n    \"ai\",\n    \"sdk\",\n    \"openai\",\n    \"llm\",\n    \"tools\",\n    \"stdlib\",\n    \"standard\",\n    \"library\",\n    \"functions\",\n    \"typescript\",\n    \"agent\",\n    \"agents\"\n  ],\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/core/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/core\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/core.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/core <!-- omit from toc -->\n\n> Agentic AI utils which work with any LLM and TypeScript AI SDK.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so)\n\n## Install\n\n```bash\nnpm i @agentic/core zod\n```\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/core/src/__snapshots__/parse-structured-output.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`parseArrayOutput - handles arrays surrounded by text correctly > should return [\"a\", \"b\", \"c\"] for \"Array: [\"a\", \"b\", \"c\"]. That's all!\" 1`] = `\n[\n  \"a\",\n  \"b\",\n  \"c\",\n]\n`;\n\nexports[`parseArrayOutput - handles arrays surrounded by text correctly > should return [{\"a\": 1}, {\"b\": 2}] for \"This is the array [{\"a\": 1}, {\"b\": 2}] in the text\" 1`] = `\n[\n  {\n    \"a\": 1,\n  },\n  {\n    \"b\": 2,\n  },\n]\n`;\n\nexports[`parseArrayOutput - handles arrays surrounded by text correctly > should return [1, 2, 3] for \"The array is [1,2,3]\" 1`] = `\n[\n  1,\n  2,\n  3,\n]\n`;\n\nexports[`parseArrayOutput - handles valid arrays correctly > should return [\"a\", \"b\", \"c\"] for \"[\"a\", \"b\", \"c\"] 1`] = `\n[\n  \"a\",\n  \"b\",\n  \"c\",\n]\n`;\n\nexports[`parseArrayOutput - handles valid arrays correctly > should return [{\"a\": 1}, {\"b\": 2}] for [{\"a\": 1}, {\"b\": 2}] 1`] = `\n[\n  {\n    \"a\": 1,\n  },\n  {\n    \"b\": 2,\n  },\n]\n`;\n\nexports[`parseArrayOutput - handles valid arrays correctly > should return [1, 2, 3] for \"[1,2,3]\" 1`] = `\n[\n  1,\n  2,\n  3,\n]\n`;\n\nexports[`parseBooleanOutput - handles \\`false\\` outputs correctly > should return false for \"FALSE\" 1`] = `false`;\n\nexports[`parseBooleanOutput - handles \\`false\\` outputs correctly > should return false for \"False\" 1`] = `false`;\n\nexports[`parseBooleanOutput - handles \\`false\\` outputs correctly > should return false for \"false!\" 1`] = `false`;\n\nexports[`parseBooleanOutput - handles \\`true\\` outputs correctly > should return true for \"TRUE\" 1`] = `true`;\n\nexports[`parseBooleanOutput - handles \\`true\\` outputs correctly > should return true for \"True\" 1`] = `true`;\n\nexports[`parseBooleanOutput - handles \\`true\\` outputs correctly > should return true for \"true.\" 1`] = `true`;\n\nexports[`parseNumberOutput - handles float outputs correctly > should return -5.5 for \"   -5.5 \" 1`] = `-5.5`;\n\nexports[`parseNumberOutput - handles float outputs correctly > should return 42.42 for \"42.42\" 1`] = `42.42`;\n\nexports[`parseNumberOutput - handles integer outputs correctly > should return -5 for \"  -5 \" 1`] = `-5`;\n\nexports[`parseNumberOutput - handles integer outputs correctly > should return 42 for \"42\" 1`] = `42`;\n\nexports[`parseObjectOutput - handles JSON array of objects > should return first object {\"a\":1,\"b\":2} for [{\"a\":1,\"b\":2},{\"c\":3,\"d\":4}] 1`] = `\n{\n  \"a\": 1,\n  \"b\": 2,\n}\n`;\n\nexports[`parseObjectOutput - handles objects surrounded by text correctly > should return {\"a\":1,\"b\":2,\"c\":3} for \"The object is {\"a\":1,\"b\":2,\"c\":3}\" 1`] = `\n{\n  \"a\": 1,\n  \"b\": 2,\n  \"c\": 3,\n}\n`;\n\nexports[`parseObjectOutput - handles objects surrounded by text correctly > should return {\"name\":\"John\",\"age\":30,\"city\":\"New York\"} for \"Object: {\"name\":\"John\",\"age\":30,\"city\":\"New York\"}. That's all!\" 1`] = `\n{\n  \"age\": 30,\n  \"city\": \"New York\",\n  \"name\": \"John\",\n}\n`;\n\nexports[`parseObjectOutput - handles valid objects correctly > should return {\"a\":1,\"b\":2,\"c\":3} for {\"a\":1,\"b\":2,\"c\":3} 1`] = `\n{\n  \"a\": 1,\n  \"b\": 2,\n  \"c\": 3,\n}\n`;\n\nexports[`parseObjectOutput - handles valid objects correctly > should return {\"name\":\"John\",\"age\":30,\"city\":\"New York\"} for {\"name\":\"John\",\"age\":30,\"city\":\"New York\"} 1`] = `\n{\n  \"age\": 30,\n  \"city\": \"New York\",\n  \"name\": \"John\",\n}\n`;\n\nexports[`parseStructuredOutput - handles arrays correctly > should parse and return [1, 2, 3] for \"[1, 2, 3]\" 1`] = `\n[\n  1,\n  2,\n  3,\n]\n`;\n\nexports[`parseStructuredOutput - handles booleans correctly > should parse and return true for \"True\" 1`] = `true`;\n\nexports[`parseStructuredOutput - handles numbers correctly > should parse and return 123.45 for \"123.45\" 1`] = `123.45`;\n\nexports[`parseStructuredOutput - handles objects correctly > should parse and return {\"a\": 1, \"b\": \"two\"} for \"{\"a\": 1, \"b\": \"two\"}\" 1`] = `\n{\n  \"a\": 1,\n  \"b\": \"two\",\n}\n`;\n"
  },
  {
    "path": "stdlib/core/src/__snapshots__/utils.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`sanitizeSearchParams 1`] = `\"a=1&c=13\"`;\n\nexports[`sanitizeSearchParams 2`] = `\"a=1&a=2&a=3\"`;\n\nexports[`sanitizeSearchParams 3`] = `\"b=a&b=b&foo=true\"`;\n\nexports[`sanitizeSearchParams 4`] = `\"b=false&b=true&b=false\"`;\n\nexports[`sanitizeSearchParams 5`] = `\"flag=foo&flag=bar&flag=baz&token=test\"`;\n\nexports[`sanitizeSearchParams 6`] = `\"\"`;\n\nexports[`sanitizeSearchParams 7`] = `\"\"`;\n"
  },
  {
    "path": "stdlib/core/src/_utils.ts",
    "content": "// testing utils\n\nimport defaultKy, {\n  type AfterResponseHook,\n  type BeforeRequestHook,\n  type KyInstance\n} from 'ky'\n\nconst AGENTIC_TEST_MOCK_HEADER = 'x-agentic-test-mock'\n\nfunction defaultBeforeRequest(request: Request): Response {\n  return new Response(\n    JSON.stringify({\n      url: request.url,\n      method: request.method,\n      headers: request.headers\n    }),\n    {\n      status: 200,\n      headers: {\n        'Content-Type': 'application/json',\n        [AGENTIC_TEST_MOCK_HEADER]: '1'\n      }\n    }\n  )\n}\n\nexport function mockKyInstance(\n  ky: KyInstance = defaultKy,\n  {\n    beforeRequest = defaultBeforeRequest,\n    afterResponse\n  }: {\n    beforeRequest?: BeforeRequestHook\n    afterResponse?: AfterResponseHook\n  } = {}\n): KyInstance {\n  return ky.extend({\n    hooks: {\n      beforeRequest: beforeRequest ? [beforeRequest] : [],\n      afterResponse: afterResponse ? [afterResponse] : []\n    }\n  })\n}\n"
  },
  {
    "path": "stdlib/core/src/ai-function-set.test.ts",
    "content": "import { expect, test } from 'vitest'\nimport { z } from 'zod'\n\nimport { AIFunctionSet } from './ai-function-set'\nimport { createAIFunction } from './create-ai-function'\nimport { EchoAITool } from './echo'\n\nexport const CalculatorInputSchema = z.object({\n  expr: z.string().describe('mathematical expression to evaluate')\n})\nexport type CalculatorInput = z.infer<typeof CalculatorInputSchema>\n\nconst mockCalculator = createAIFunction(\n  {\n    name: 'calculator',\n    description:\n      'Computes the result of simple mathematical expressions. Handles basic arithmetic operations like addition, subtraction, multiplication, and division. Example expressions: \"1 + 2\", \"3.4 * 5 / 9\", \"4 - 2\"',\n    inputSchema: CalculatorInputSchema\n  },\n  async (input: CalculatorInput) => {\n    // eslint-disable-next-line no-eval, security/detect-eval-with-expression\n    const result: number = eval(input.expr)\n    return result\n  }\n)\n\ntest('AIFunctionSet constructor', () => {\n  const mockAITool = new EchoAITool()\n  const s0 = new AIFunctionSet([mockAITool, mockCalculator])\n\n  expect(s0.size).toEqual(2)\n  expect(s0.get('echo')).toBeDefined()\n  expect(s0.get('calculator')).toBeDefined()\n  expect([...s0].length).toEqual(2)\n\n  const s1 = new AIFunctionSet([s0, mockAITool, mockCalculator, mockCalculator])\n  expect(s0.size).toEqual(2)\n  expect(s1.size).toEqual(2)\n  expect(s1.get('echo')).toBeDefined()\n  expect(s1.get('calculator')).toBeDefined()\n  expect([...s1].length).toEqual(2)\n})\n\ntest('AIFunctionSet constructor invalid function', () => {\n  const mockAITool = new EchoAITool()\n\n  expect(\n    () => new AIFunctionSet([mockAITool, mockCalculator, { spec: {} } as any])\n  ).toThrowError('Invalid AIFunctionLike: [object Object]')\n})\n"
  },
  {
    "path": "stdlib/core/src/ai-function-set.ts",
    "content": "import type * as types from './types.ts'\nimport type { AIFunction } from './types.ts'\nimport { AIFunctionsProvider } from './fns'\nimport { isAIFunction } from './utils'\n\nexport type AIFunctionSetOptions = {\n  transformNameKeysFn?: (name: string) => string\n}\n\n/**\n * A set of AI functions intended to make it easier to work with large sets of\n * AI functions across different clients.\n *\n * This class mimics a built-in `Set<AIFunction>`, but with additional utility\n * methods like `pick`, `omit`, and `map`.\n *\n * Function names are case-insensitive to make it easier to match them with\n * possible LLM hallucinations.\n */\nexport class AIFunctionSet implements Iterable<types.AIFunction> {\n  protected readonly _map: Map<string, types.AIFunction>\n  protected readonly _transformNameKeysFn: (name: string) => string\n\n  constructor(\n    aiFunctionLikeObjects?: types.AIFunctionLike[],\n    { transformNameKeysFn = transformName }: AIFunctionSetOptions = {}\n  ) {\n    this._transformNameKeysFn = transformNameKeysFn\n\n    // TODO: these `instanceof` checks seem to be failing on some platforms,\n    // so for now we're using an uglier, but more reliable approach to parsing\n    // the AIFunctionLike objects.\n    const fns = aiFunctionLikeObjects?.flatMap((fn) => {\n      if (fn instanceof AIFunctionsProvider) {\n        return [...fn.functions]\n      }\n\n      if (fn instanceof AIFunctionSet) {\n        return [...fn]\n      }\n\n      if (isAIFunction(fn)) {\n        return fn\n      }\n\n      const fa = ((fn as any).functions ?? fn) as AIFunctionSet\n      if (fa) {\n        try {\n          const fns = [...fa]\n          if (fns.every(isAIFunction)) {\n            return fns\n          }\n        } catch {}\n      }\n\n      throw new Error(`Invalid AIFunctionLike: ${fn}`)\n    })\n\n    // TODO: This is the cleaner approach which should work in theory, but is\n    // not working in practice due to the `instanceof` checks failing.\n    // const fns = aiFunctionLikeObjects?.flatMap((fn) =>\n    //   fn instanceof AIFunctionsProvider\n    //     ? [...fn.functions]\n    //     : fn instanceof AIFunctionSet\n    //       ? [...fn]\n    //       : [fn]\n    // )\n\n    if (fns) {\n      for (const fn of fns) {\n        if (!isAIFunction(fn)) {\n          throw new Error(`Invalid AIFunctionLike: ${fn}`)\n        }\n      }\n    }\n\n    this._map = new Map(\n      fns\n        ? fns.map((fn) => [this._transformNameKeysFn(fn.spec.name), fn])\n        : null\n    )\n  }\n\n  get size(): number {\n    return this._map.size\n  }\n\n  add(fn: types.AIFunction): this {\n    this._map.set(this._transformNameKeysFn(fn.spec.name), fn)\n    return this\n  }\n\n  get(name: string): types.AIFunction | undefined {\n    return this._map.get(this._transformNameKeysFn(name))\n  }\n\n  set(name: string, fn: types.AIFunction): this {\n    this._map.set(this._transformNameKeysFn(name), fn)\n    return this\n  }\n\n  has(name: string): boolean {\n    return this._map.has(this._transformNameKeysFn(name))\n  }\n\n  clear(): void {\n    this._map.clear()\n  }\n\n  delete(name: string): boolean {\n    return this._map.delete(this._transformNameKeysFn(name))\n  }\n\n  pick(...keys: string[]): AIFunctionSet {\n    const keysToIncludeSet = new Set(keys.map(this._transformNameKeysFn))\n    return new AIFunctionSet(\n      Array.from(this).filter((fn) =>\n        keysToIncludeSet.has(this._transformNameKeysFn(fn.spec.name))\n      )\n    )\n  }\n\n  omit(...keys: string[]): AIFunctionSet {\n    const keysToExcludeSet = new Set(keys.map(this._transformNameKeysFn))\n    return new AIFunctionSet(\n      Array.from(this).filter(\n        (fn) => !keysToExcludeSet.has(this._transformNameKeysFn(fn.spec.name))\n      )\n    )\n  }\n\n  map<T>(fn: (fn: types.AIFunction) => T): T[] {\n    return [...this.entries].map(fn)\n  }\n\n  /**\n   * Returns a new AIFunctionSet containing only the AIFunctions in this set\n   * matching the given tags.\n   */\n  getFilteredByTags(...tags: string[]): AIFunctionSet {\n    const tagsSet = new Set(tags)\n    return this.getFilteredBy((fn) => fn.tags?.some((t) => tagsSet.has(t)))\n  }\n\n  /**\n   * Returns a new AIFunctionSet containing only the AIFunctions in this set\n   * matching a custom filter function.\n   */\n  getFilteredBy(\n    filterFn: (fn: AIFunction) => boolean | undefined\n  ): AIFunctionSet {\n    return new AIFunctionSet(Array.from(this).filter((fn) => filterFn(fn)))\n  }\n\n  /**\n   * Returns the functions in this set as an array compatible with OpenAI's\n   * chat completions `functions`.\n   */\n  get specs(): types.AIFunctionSpec[] {\n    return this.map((fn) => fn.spec)\n  }\n\n  /**\n   * Returns the functions in this set as an array compatible with OpenAI's\n   * chat completions `tools`.\n   */\n  get toolSpecs(): types.AIToolSpec[] {\n    return this.map((fn) => ({\n      type: 'function' as const,\n      function: fn.spec\n    }))\n  }\n\n  /**\n   * Returns the tools in this set compatible with OpenAI's `responses` API.\n   *\n   * Note that this is currently the same type as `AIFunctionSet.specs`, but\n   * they are separate APIs which may diverge over time, so if you're using the\n   * OpenAI `responses` API, you should reference this property.\n   */\n  get responsesToolSpecs(): types.AIFunctionSpec[] {\n    return this.specs\n  }\n\n  get entries(): IterableIterator<types.AIFunction> {\n    return this._map.values()\n  }\n\n  [Symbol.iterator](): Iterator<types.AIFunction> {\n    return this.entries\n  }\n}\n\nfunction transformName(name: string): string {\n  // TODO: decamalize?\n  return name.toLowerCase()\n}\n"
  },
  {
    "path": "stdlib/core/src/assert.ts",
    "content": "export function assert(\n  value: unknown,\n  message?: string | Error\n): asserts value {\n  if (value) {\n    return\n  }\n\n  if (!message) {\n    throw new Error('Assertion failed')\n  }\n\n  throw typeof message === 'string' ? new Error(message) : message\n}\n"
  },
  {
    "path": "stdlib/core/src/create-ai-function.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\nimport { z } from 'zod'\n\nimport { createAIFunction } from './create-ai-function'\nimport { type Msg } from './message'\n\n// TODO: Add tests for passing JSON schema directly.\n\nconst fullNameAIFunction = createAIFunction({\n  name: 'fullName',\n  description: 'Returns the full name of a person.',\n  inputSchema: z.object({\n    first: z.string(),\n    last: z.string()\n  }),\n  execute: ({ first, last }) => {\n    return `${first} ${last}`\n  }\n})\n\ndescribe('createAIFunction()', () => {\n  test('exposes OpenAI function calling spec', () => {\n    expect(fullNameAIFunction.spec.name).toEqual('fullName')\n    expect(fullNameAIFunction.spec.description).toEqual(\n      'Returns the full name of a person.'\n    )\n    expect(fullNameAIFunction.spec.parameters).toEqual({\n      properties: {\n        first: { type: 'string' },\n        last: { type: 'string' }\n      },\n      required: ['first', 'last'],\n      type: 'object',\n      additionalProperties: false\n    })\n  })\n\n  test('executes the function with JSON string', async () => {\n    expect(\n      await fullNameAIFunction('{\"first\": \"John\", \"last\": \"Doe\"}')\n    ).toEqual('John Doe')\n  })\n\n  test('executes the function with OpenAI Message', async () => {\n    const message: Msg.FuncCall = {\n      role: 'assistant',\n      content: null,\n      function_call: {\n        name: 'fullName',\n        arguments: '{\"first\": \"Jane\", \"last\": \"Smith\"}'\n      }\n    }\n\n    expect(await fullNameAIFunction(message)).toEqual('Jane Smith')\n  })\n})\n"
  },
  {
    "path": "stdlib/core/src/create-ai-function.ts",
    "content": "import type * as types from './types'\nimport { asAgenticSchema } from './schema'\nimport { assert } from './utils'\n\nexport type CreateAIFunctionArgs<\n  InputSchema extends types.AIFunctionInputSchema = types.AIFunctionInputSchema\n> = {\n  /** Name of the function. */\n  name: string\n\n  /** Description of the function. */\n  description: string\n\n  /**\n   * Zod schema or AgenticSchema for the function parameters.\n   *\n   * You can use a JSON Schema for more dynamic tool sources such as MCP by\n   * using the `createJsonSchema` utility function.\n   */\n  inputSchema: InputSchema\n\n  /**\n   * Whether to enable strict structured output generation based on the given\n   * input schema. (this is a feature of the OpenAI API)\n   *\n   * Defaults to `true`.\n   */\n  strict?: boolean\n\n  /**\n   * Optional tags to help organize functions.\n   */\n  tags?: string[]\n}\n\nexport type AIFunctionImplementation<\n  InputSchema extends types.AIFunctionInputSchema,\n  Output\n> = (params: types.inferInput<InputSchema>) => types.MaybePromise<Output>\n\n/**\n * Create a function meant to be used with OpenAI tool or function calling.\n *\n * The returned function will parse the arguments string and call the\n * implementation function with the parsed arguments.\n *\n * The `spec` property of the returned function is the spec for adding the\n * function to the OpenAI API `functions` property.\n */\nexport function createAIFunction<\n  InputSchema extends types.AIFunctionInputSchema,\n  Output\n>(\n  args: CreateAIFunctionArgs<InputSchema>,\n  /** Underlying function implementation. */\n  execute: AIFunctionImplementation<InputSchema, Output>\n): types.AIFunction<InputSchema, Output>\nexport function createAIFunction<\n  InputSchema extends types.AIFunctionInputSchema,\n  Output\n>(\n  args: CreateAIFunctionArgs<InputSchema> & {\n    /** Underlying function implementation. */\n    execute: AIFunctionImplementation<InputSchema, Output>\n  }\n): types.AIFunction<InputSchema, Output>\nexport function createAIFunction<\n  InputSchema extends types.AIFunctionInputSchema,\n  Output\n>(\n  {\n    name,\n    description,\n    inputSchema,\n    strict = true,\n    tags,\n    execute\n  }: CreateAIFunctionArgs<InputSchema> & {\n    /** Underlying function implementation. */\n    execute?: AIFunctionImplementation<InputSchema, Output>\n  },\n  /** Underlying function implementation. */\n  executeArg?: AIFunctionImplementation<InputSchema, Output>\n): types.AIFunction<InputSchema, Output> {\n  assert(name, 'createAIFunction missing required \"name\"')\n  assert(inputSchema, 'createAIFunction missing required \"inputSchema\"')\n  assert(\n    execute || executeArg,\n    'createAIFunction missing required \"execute\" function implementation'\n  )\n  assert(\n    !(execute && executeArg),\n    'createAIFunction: cannot provide both \"execute\" and a second function argument. there should only be one function implementation.'\n  )\n  execute ??= executeArg\n  assert(\n    execute,\n    'createAIFunction missing required \"execute\" function implementation'\n  )\n  assert(\n    typeof execute === 'function',\n    'createAIFunction \"execute\" must be a function'\n  )\n\n  const inputAgenticSchema = asAgenticSchema(inputSchema, { strict })\n\n  /** Parse the arguments string, optionally reading from a message. */\n  const parseInput = (\n    input: string | types.Msg\n  ): types.inferInput<InputSchema> => {\n    if (typeof input === 'string') {\n      return inputAgenticSchema.parse(input)\n    } else {\n      const args = input.function_call?.arguments\n      assert(\n        args,\n        `Missing required function_call.arguments for function \"${name}\"`\n      )\n      return inputAgenticSchema.parse(args)\n    }\n  }\n\n  // Call the underlying function implementation with the parsed arguments.\n  const aiFunction: types.AIFunction<InputSchema, Output> = (\n    input: string | types.Msg\n  ) => {\n    const parsedInput = parseInput(input)\n\n    return execute(parsedInput)\n  }\n\n  // Override the default function name with the intended name.\n  Object.defineProperty(aiFunction, 'name', {\n    value: name,\n    writable: false\n  })\n\n  aiFunction.inputSchema = inputSchema\n  aiFunction.parseInput = parseInput\n  aiFunction.execute = execute\n  aiFunction.tags = tags\n  aiFunction.spec = {\n    name,\n    description,\n    parameters: inputAgenticSchema.jsonSchema,\n    type: 'function',\n    strict\n  }\n\n  return aiFunction\n}\n"
  },
  {
    "path": "stdlib/core/src/echo.ts",
    "content": "import { z } from 'zod'\n\nimport { createAIFunction } from './create-ai-function'\nimport { aiFunction, AIFunctionsProvider } from './fns'\n\n/**\n * Test AI tool with one function `echo`, which echoes the input.\n */\nexport class EchoAITool extends AIFunctionsProvider {\n  @aiFunction({\n    name: 'echo',\n    description: 'Echoes the input.',\n    inputSchema: z.object({\n      query: z.string().describe('input query to echo')\n    })\n  })\n  async echo({ query }: { query: string }) {\n    return query\n  }\n}\n\n/**\n * Test AI function `echo`, which echoes the input.\n */\nexport const echoAIFunction = createAIFunction(\n  {\n    name: 'echo',\n    description: 'Echoes the input.',\n    inputSchema: z.object({\n      query: z.string().describe('input query to echo')\n    })\n  },\n  ({ query }: { query: string }) => {\n    return query\n  }\n)\n"
  },
  {
    "path": "stdlib/core/src/errors.ts",
    "content": "export class RetryableError extends Error {}\n\nexport class AbortError extends Error {}\n\nexport class ParseError extends RetryableError {}\n\nexport class TimeoutError extends Error {}\n"
  },
  {
    "path": "stdlib/core/src/fns.ts",
    "content": "import type * as types from './types'\nimport type { AIFunction } from './types'\nimport { AIFunctionSet } from './ai-function-set'\nimport {\n  createAIFunction,\n  type CreateAIFunctionArgs\n} from './create-ai-function'\nimport { assert } from './utils'\n\nexport type PrivateAIFunctionMetadata = CreateAIFunctionArgs & {\n  methodName: string\n}\n\n// Polyfill for `Symbol.metadata`\n// https://github.com/microsoft/TypeScript/issues/53461\ndeclare global {\n  interface SymbolConstructor {\n    readonly metadata: unique symbol\n  }\n}\n\n;(Symbol as any).metadata ??= Symbol.for('Symbol.metadata')\n\nconst _metadata = Object.create(null)\n\nif (typeof Symbol === 'function' && Symbol.metadata) {\n  Object.defineProperty(globalThis, Symbol.metadata, {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: _metadata\n  })\n}\n\nexport abstract class AIFunctionsProvider {\n  protected _functions?: AIFunctionSet\n\n  /**\n   * An `AIFunctionSet` containing all of the AI-compatible functions exposed\n   * by this class.\n   *\n   * This property is useful for manipulating AI functions across multiple\n   * sources, picking specific functions, ommitting certain functions, etc.\n   */\n  get functions(): AIFunctionSet {\n    if (!this._functions) {\n      const metadata = this.constructor[Symbol.metadata]\n      assert(\n        metadata,\n        'Your runtime does not appear to support ES decorator metadata: https://github.com/tc39/proposal-decorator-metadata/issues/14'\n      )\n      const invocables =\n        (metadata?.invocables as PrivateAIFunctionMetadata[]) ?? []\n\n      const aiFunctions = invocables.map((invocable) => {\n        const impl = (this as any)[invocable.methodName]\n        assert(impl)\n\n        return createAIFunction(invocable, impl)\n      })\n\n      this._functions = new AIFunctionSet(aiFunctions)\n    }\n\n    return this._functions\n  }\n\n  /**\n   * Returns the AIFunctions provided by this class filtered by the given tags.\n   */\n  getFunctionsFilteredByTags(...tags: string[]): AIFunctionSet {\n    return this.functions.getFilteredByTags(...tags)\n  }\n\n  /**\n   * Returns the AIFunctions provided by this class which match a custom filter\n   * function.\n   */\n  getFunctionsFilteredBy(\n    filterFn: (fn: AIFunction) => boolean | undefined\n  ): AIFunctionSet {\n    return this.functions.getFilteredBy(filterFn)\n  }\n}\n\nexport function aiFunction<\n  This extends AIFunctionsProvider,\n  InputSchema extends types.AIFunctionInputSchema,\n  OptionalArgs extends Array<undefined>,\n  Return extends types.MaybePromise<any>\n>(args: CreateAIFunctionArgs<InputSchema>) {\n  return (\n    _targetMethod: (\n      this: This,\n      input: types.inferInput<InputSchema>,\n      ...optionalArgs: OptionalArgs\n    ) => Return,\n    context: ClassMethodDecoratorContext<\n      This,\n      (\n        this: This,\n        input: types.inferInput<InputSchema>,\n        ...optionalArgs: OptionalArgs\n      ) => Return\n    >\n  ) => {\n    const methodName = String(context.name)\n    if (!context.metadata.invocables) {\n      context.metadata.invocables = []\n    }\n\n    assert(args.name, 'aiFunction requires a non-empty \"name\" argument')\n    ;(context.metadata.invocables as PrivateAIFunctionMetadata[]).push({\n      ...args,\n      methodName\n    })\n\n    context.addInitializer(function () {\n      ;(this as any)[methodName] = (this as any)[methodName].bind(this)\n      // ;(this as any)[methodName].aiFunction = this.functions.get(\n      //   name ?? methodName\n      // )\n    })\n  }\n}\n\n// declare module './fns' {\n//   // Define a type for methods decorated with @aiFunction\n//   type AIFunctionMethod<\n//     T extends z.ZodObject<any> = z.ZodObject<any>,\n//     R = any\n//   > = ((...args: any[]) => R) & {\n//     aiFunction?: AIFunction<T, R>\n//   }\n\n//   interface AIFunctionsProvider {\n//     [methodName: string]: AIFunctionMethod<any, any>\n//   }\n// }\n"
  },
  {
    "path": "stdlib/core/src/index.ts",
    "content": "export * from './ai-function-set'\nexport * from './create-ai-function'\nexport * from './echo'\nexport * from './errors'\nexport * from './fns'\nexport * from './message'\nexport * from './parse-structured-output'\nexport * from './schema'\nexport type * from './types'\nexport * from './utils'\nexport * from './zod-to-json-schema'\n"
  },
  {
    "path": "stdlib/core/src/message.test.ts",
    "content": "import type * as OpenAI from 'openai-fetch'\nimport { describe, expect, expectTypeOf, test } from 'vitest'\n\nimport type * as types from './types'\nimport { Msg } from './message'\n\ndescribe('Msg', () => {\n  test('creates a message and fixes indentation', () => {\n    const msgContent = `\n      Hello, World!\n    `\n    const msg = Msg.system(msgContent)\n    expect(msg.role).toEqual('system')\n    expect(msg.content).toEqual('Hello, World!')\n  })\n\n  test('supports disabling indentation fixing', () => {\n    const msgContent = `\n      Hello, World!\n    `\n    const msg = Msg.system(msgContent, { cleanContent: false })\n    expect(msg.content).toEqual('\\n      Hello, World!\\n    ')\n  })\n\n  test('handles tool calls request', () => {\n    const msg = Msg.toolCall([\n      {\n        id: 'fake-tool-call-id',\n        type: 'function',\n        function: {\n          arguments: '{\"prompt\": \"Hello, World!\"}',\n          name: 'hello'\n        }\n      }\n    ])\n    expectTypeOf(msg).toMatchTypeOf<types.Msg.ToolCall>()\n    expect(Msg.isToolCall(msg)).toBe(true)\n  })\n\n  test('handles tool call response', () => {\n    const msg = Msg.toolResult('Hello, World!', 'fake-tool-call-id')\n    expectTypeOf(msg).toMatchTypeOf<types.Msg.ToolResult>()\n    expect(Msg.isToolResult(msg)).toBe(true)\n  })\n\n  test('prompt message types should interop with openai-fetch message types', () => {\n    expectTypeOf({} as OpenAI.ChatMessage).toMatchTypeOf<types.Msg>()\n    expectTypeOf({} as types.Msg).toMatchTypeOf<OpenAI.ChatMessage>()\n    expectTypeOf({} as types.Msg.System).toMatchTypeOf<OpenAI.ChatMessage>()\n    expectTypeOf({} as types.Msg.User).toMatchTypeOf<OpenAI.ChatMessage>()\n    expectTypeOf({} as types.Msg.Assistant).toMatchTypeOf<OpenAI.ChatMessage>()\n    expectTypeOf({} as types.Msg.FuncCall).toMatchTypeOf<OpenAI.ChatMessage>()\n    expectTypeOf({} as types.Msg.FuncResult).toMatchTypeOf<OpenAI.ChatMessage>()\n  })\n})\n"
  },
  {
    "path": "stdlib/core/src/message.ts",
    "content": "import type { Jsonifiable } from 'type-fest'\n\nimport { cleanStringForModel, stringifyForModel } from './utils'\n\n/**\n * Generic/default OpenAI message without any narrowing applied.\n */\nexport interface Msg {\n  /**\n   * The role of the messages author. One of `system`, `user`, `assistant`,\n   * 'tool', or `function`.\n   */\n  role: Msg.Role\n\n  /**\n   * The contents of the message. `content` may be null for assistant messages\n   * with function calls or `undefined` for assistant messages if a `refusal`\n   * was given by the model.\n   */\n  content?: string | null\n\n  /**\n   * The reason the model refused to generate this message or `undefined` if the\n   * message was generated successfully.\n   */\n  refusal?: string | null\n\n  /**\n   * The name and arguments of a function that should be called, as generated\n   * by the model.\n   */\n  function_call?: Msg.Call.Function\n\n  /**\n   * The tool calls generated by the model, such as function calls.\n   */\n  tool_calls?: Msg.Call.Tool[]\n\n  /**\n   * Tool call that this message is responding to.\n   */\n  tool_call_id?: string\n\n  /**\n   * The name of the author of this message. `name` is required if role is\n   * `function`, and it should be the name of the function whose response is in the\n   * `content`. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of\n   * 64 characters.\n   */\n  name?: string\n}\n\nexport interface LegacyMsg {\n  content: string | null\n  role: Msg.Role\n  function_call?: Msg.Call.Function\n  tool_calls?: Msg.Call.Tool[]\n  tool_call_id?: string\n  name?: string\n}\n\n/** Used for multimodal chat messages. */\nexport type ChatMessageContentPart =\n  | {\n      type: 'text'\n      text: string\n    }\n  // User messages only.\n  | {\n      type: 'image_url'\n      image_url: {\n        url: string\n        detail?: 'low' | 'high' | 'auto' | (string & {})\n      }\n    }\n  | {\n      type: 'input_audio'\n      input_audio: {\n        data: string\n        format: 'mp3' | 'wav' | (string & {})\n      }\n    }\n  // Assistant messages only.\n  | {\n      type: 'refusal'\n      refusal: string\n    }\n\n/** Narrowed OpenAI Message types. */\nexport namespace Msg {\n  /** Possible roles for a message. */\n  export type Role =\n    | 'system'\n    | 'developer'\n    | 'user'\n    | 'assistant'\n    | 'function'\n    | 'tool'\n\n  export namespace Call {\n    /**\n     * The name and arguments of a function that should be called, as generated\n     * by the model.\n     */\n    export type Function = {\n      /**\n       * The arguments to call the function with, as generated by the model in\n       * JSON format.\n       */\n      arguments: string\n\n      /** The name of the function to call. */\n      name: string\n    }\n\n    /** The tool calls generated by the model, such as function calls. */\n    export type Tool = {\n      /** The ID of the tool call. */\n      id: string\n\n      /** The type of the tool. Currently, only `function` is supported. */\n      type: 'function'\n\n      /** The function that the model called. */\n      function: Call.Function\n    }\n  }\n\n  /** Message with text content for the system. */\n  export type System = {\n    role: 'system'\n    content: string\n    name?: string\n  }\n\n  /** Message with text content for the developer. */\n  export type Developer = {\n    role: 'developer'\n    content: string\n    name?: string\n  }\n\n  /** Message with text content from the user. */\n  export type User = {\n    role: 'user'\n    name?: string\n    content: string\n  }\n\n  /** Message with text content from the assistant. */\n  export type Assistant = {\n    role: 'assistant'\n    name?: string\n    content: string\n  }\n\n  /** Message with refusal reason from the assistant. */\n  export type Refusal = {\n    role: 'assistant'\n    name?: string\n    refusal: string\n  }\n\n  /** Message with arguments to call a function. */\n  export type FuncCall = {\n    role: 'assistant'\n    name?: string\n    content: null\n    function_call: Call.Function\n  }\n\n  /** Message with the result of a function call. */\n  export type FuncResult = {\n    role: 'function'\n    name: string\n    content: string\n  }\n\n  /** Message with arguments to call one or more tools. */\n  export type ToolCall = {\n    role: 'assistant'\n    name?: string\n    content: null\n    tool_calls: Call.Tool[]\n  }\n\n  /** Message with the result of a tool call. */\n  export type ToolResult = {\n    role: 'tool'\n    tool_call_id: string\n    content: string\n  }\n}\n\n/** Utility functions for creating and checking message types. */\nexport namespace Msg {\n  /** Create a system message. Cleans indentation and newlines by default. */\n  export function system(\n    content: string,\n    opts?: {\n      /** Custom name for the message. */\n      name?: string\n      /** Whether to clean extra newlines and indentation. Defaults to true. */\n      cleanContent?: boolean\n    }\n  ): Msg.System {\n    const { name, cleanContent = true } = opts ?? {}\n    return {\n      role: 'system',\n      content: cleanContent ? cleanStringForModel(content) : content,\n      ...(name ? { name } : {})\n    }\n  }\n\n  /** Create a developer message. Cleans indentation and newlines by default. */\n  export function developer(\n    content: string,\n    opts?: {\n      /** Custom name for the message. */\n      name?: string\n      /** Whether to clean extra newlines and indentation. Defaults to true. */\n      cleanContent?: boolean\n    }\n  ): Msg.Developer {\n    const { name, cleanContent = true } = opts ?? {}\n    return {\n      role: 'developer',\n      content: cleanContent ? cleanStringForModel(content) : content,\n      ...(name ? { name } : {})\n    }\n  }\n\n  /** Create a user message. Cleans indentation and newlines by default. */\n  export function user(\n    content: string,\n    opts?: {\n      /** Custom name for the message. */\n      name?: string\n      /** Whether to clean extra newlines and indentation. Defaults to true. */\n      cleanContent?: boolean\n    }\n  ): Msg.User {\n    const { name, cleanContent = true } = opts ?? {}\n    return {\n      role: 'user',\n      content: cleanContent ? cleanStringForModel(content) : content,\n      ...(name ? { name } : {})\n    }\n  }\n\n  /** Create an assistant message. Cleans indentation and newlines by default. */\n  export function assistant(\n    content: string,\n    opts?: {\n      /** Custom name for the message. */\n      name?: string\n      /** Whether to clean extra newlines and indentation. Defaults to true. */\n      cleanContent?: boolean\n    }\n  ): Msg.Assistant {\n    const { name, cleanContent = true } = opts ?? {}\n    return {\n      role: 'assistant',\n      content: cleanContent ? cleanStringForModel(content) : content,\n      ...(name ? { name } : {})\n    }\n  }\n\n  /**\n   * Create an assistant refusal message. Cleans indentation and newlines by\n   * default.\n   */\n  export function refusal(\n    refusal: string,\n    opts?: {\n      /** Custom name for the message. */\n      name?: string\n      /** Whether to clean extra newlines and indentation. Defaults to true. */\n      cleanRefusal?: boolean\n    }\n  ): Msg.Refusal {\n    const { name, cleanRefusal = true } = opts ?? {}\n    return {\n      role: 'assistant',\n      refusal: cleanRefusal ? cleanStringForModel(refusal) : refusal,\n      ...(name ? { name } : {})\n    }\n  }\n\n  /** Create a function call message with argumets. */\n  export function funcCall(\n    funcCall: {\n      /** Name of the function to call. */\n      name: string\n      /** Arguments to pass to the function. */\n      arguments: string\n    },\n    opts?: {\n      /** The name descriptor for the message.(message.name) */\n      name?: string\n    }\n  ): Msg.FuncCall {\n    return {\n      ...opts,\n      role: 'assistant',\n      content: null,\n      function_call: funcCall\n    }\n  }\n\n  /** Create a function result message. */\n  export function funcResult(\n    content: Jsonifiable,\n    name: string\n  ): Msg.FuncResult {\n    const contentString = stringifyForModel(content)\n    return { role: 'function', content: contentString, name }\n  }\n\n  /** Create a function call message with argumets. */\n  export function toolCall(\n    toolCalls: Msg.Call.Tool[],\n    opts?: {\n      /** The name descriptor for the message.(message.name) */\n      name?: string\n    }\n  ): Msg.ToolCall {\n    return {\n      ...opts,\n      role: 'assistant',\n      content: null,\n      tool_calls: toolCalls\n    }\n  }\n\n  /** Create a tool call result message. */\n  export function toolResult(\n    content: Jsonifiable,\n    toolCallId: string,\n    opts?: {\n      /** The name of the tool which was called */\n      name?: string\n    }\n  ): Msg.ToolResult {\n    const contentString = stringifyForModel(content)\n    return {\n      ...opts,\n      role: 'tool',\n      tool_call_id: toolCallId,\n      content: contentString\n    }\n  }\n\n  /** Get the narrowed message from an EnrichedResponse. */\n  export function getMessage(\n    // @TODO\n    response: any\n    // response: ChatModel.EnrichedResponse\n  ): Msg.Assistant | Msg.Refusal | Msg.FuncCall | Msg.ToolCall {\n    const msg = response.choices[0].message as Msg\n    return narrowResponseMessage(msg)\n  }\n\n  /** Narrow a message received from the API. It only responds with role=assistant */\n  export function narrowResponseMessage(\n    msg: Msg\n  ): Msg.Assistant | Msg.Refusal | Msg.FuncCall | Msg.ToolCall {\n    if (msg.content === null && msg.tool_calls != null) {\n      return Msg.toolCall(msg.tool_calls)\n    } else if (msg.content === null && msg.function_call != null) {\n      return Msg.funcCall(msg.function_call)\n    } else if (msg.content !== null && msg.content !== undefined) {\n      return Msg.assistant(msg.content)\n    } else if (msg.refusal != null) {\n      return Msg.refusal(msg.refusal)\n    } else {\n      // @TODO: probably don't want to error here\n      console.warn('Invalid message', msg)\n      throw new Error('Invalid message')\n    }\n  }\n\n  /** Check if a message is a system message. */\n  export function isSystem(message: Msg): message is Msg.System {\n    return message.role === 'system'\n  }\n  /** Check if a message is a developer message. */\n  export function isDeveloper(message: Msg): message is Msg.Developer {\n    return message.role === 'developer'\n  }\n  /** Check if a message is a user message. */\n  export function isUser(message: Msg): message is Msg.User {\n    return message.role === 'user'\n  }\n  /** Check if a message is an assistant message. */\n  export function isAssistant(message: Msg): message is Msg.Assistant {\n    return message.role === 'assistant' && message.content != null\n  }\n  /** Check if a message is an assistant refusal message. */\n  export function isRefusal(message: Msg): message is Msg.Refusal {\n    return message.role === 'assistant' && message.refusal !== null\n  }\n  /** Check if a message is a function call message with arguments. */\n  export function isFuncCall(message: Msg): message is Msg.FuncCall {\n    return message.role === 'assistant' && message.function_call != null\n  }\n  /** Check if a message is a function result message. */\n  export function isFuncResult(message: Msg): message is Msg.FuncResult {\n    return message.role === 'function' && message.name != null\n  }\n  /** Check if a message is a tool calls message. */\n  export function isToolCall(message: Msg): message is Msg.ToolCall {\n    return message.role === 'assistant' && message.tool_calls != null\n  }\n  /** Check if a message is a tool call result message. */\n  export function isToolResult(message: Msg): message is Msg.ToolResult {\n    return message.role === 'tool' && !!message.tool_call_id\n  }\n\n  /** Narrow a ChatModel.Message to a specific type. */\n  export function narrow(message: Msg.System): Msg.System\n  export function narrow(message: Msg.Developer): Msg.Developer\n  export function narrow(message: Msg.User): Msg.User\n  export function narrow(message: Msg.Assistant): Msg.Assistant\n  export function narrow(message: Msg.Assistant): Msg.Refusal\n  export function narrow(message: Msg.FuncCall): Msg.FuncCall\n  export function narrow(message: Msg.FuncResult): Msg.FuncResult\n  export function narrow(message: Msg.ToolCall): Msg.ToolCall\n  export function narrow(message: Msg.ToolResult): Msg.ToolResult\n  export function narrow(\n    message: Msg\n  ):\n    | Msg.System\n    | Msg.Developer\n    | Msg.User\n    | Msg.Assistant\n    | Msg.Refusal\n    | Msg.FuncCall\n    | Msg.FuncResult\n    | Msg.ToolCall\n    | Msg.ToolResult {\n    if (isSystem(message)) {\n      return message\n    }\n    if (isDeveloper(message)) {\n      return message\n    }\n    if (isUser(message)) {\n      return message\n    }\n    if (isAssistant(message)) {\n      return message\n    }\n    if (isRefusal(message)) {\n      return message\n    }\n    if (isFuncCall(message)) {\n      return message\n    }\n    if (isFuncResult(message)) {\n      return message\n    }\n    if (isToolCall(message)) {\n      return message\n    }\n    if (isToolResult(message)) {\n      return message\n    }\n    throw new Error('Invalid message type')\n  }\n}\n"
  },
  {
    "path": "stdlib/core/src/parse-structured-output.test.ts",
    "content": "import { assert, expect, test } from 'vitest'\nimport { z } from 'zod'\n\nimport {\n  extractJSONFromString,\n  parseArrayOutput,\n  parseBooleanOutput,\n  parseNumberOutput,\n  parseObjectOutput,\n  parseStructuredOutput\n} from './parse-structured-output'\n\ntest('extractJSONFromString should extract JSON object from string', () => {\n  let jsonStr = 'Some text {\"name\":\"John Doe\"} more text'\n  let result = extractJSONFromString(jsonStr, 'object')\n  assert.deepEqual(result[0], { name: 'John Doe' })\n\n  jsonStr =\n    'Some text {\"name\":\"John Doe\",\"age\":42,\"address\":{\"street\":\"Main Street\",\"number\":42}} more text'\n  result = extractJSONFromString(jsonStr, 'object')\n  assert.deepEqual(result[0], {\n    name: 'John Doe',\n    age: 42,\n    address: { street: 'Main Street', number: 42 }\n  })\n\n  jsonStr = 'foo {\"name\":\"John Doe\",\"school\":\"St. John\\'s\"} bar'\n  result = extractJSONFromString(jsonStr, 'object')\n  assert.deepEqual(result[0], { name: 'John Doe', school: \"St. John's\" })\n})\n\ntest('extractJSONFromString should extract an invalid JSON object from string', () => {\n  let jsonStr = 'Some text {\"name\":\\'John Doe\\'} more text'\n  let result = extractJSONFromString(jsonStr, 'object')\n  assert.deepEqual(result[0], { name: 'John Doe' })\n\n  jsonStr = 'Some text {\"name\":\"John Doe\",\"age\":42,} more text'\n  result = extractJSONFromString(jsonStr, 'object')\n  assert.deepEqual(result[0], { name: 'John Doe', age: 42 })\n})\n\ntest('extractJSONFromString should extract multiple JSON objects from string', () => {\n  let jsonStr = 'Some text {\"name\":\"John Doe\"} more text {\"name\":\"Jane Doe\"}'\n  let result = extractJSONFromString(jsonStr, 'object')\n  assert.deepEqual(result[0], { name: 'John Doe' })\n  assert.deepEqual(result[1], { name: 'Jane Doe' })\n\n  jsonStr =\n    'Some text {\"name\":\"John Doe\",\"age\":42,\"address\":{\"street\":\"Main Street\",\"number\":42}} more text {\"name\":\"Jane Doe\",\"age\":42,\"address\":{\"street\":\"Main Street\",\"number\":42}}'\n  result = extractJSONFromString(jsonStr, 'object')\n  assert.deepEqual(result[0], {\n    name: 'John Doe',\n    age: 42,\n    address: { street: 'Main Street', number: 42 }\n  })\n  assert.deepEqual(result[1], {\n    name: 'Jane Doe',\n    age: 42,\n    address: { street: 'Main Street', number: 42 }\n  })\n})\n\ntest('extractJSONFromString should extract JSON array from string', () => {\n  let jsonString = 'Some text [1,2,3] more text'\n  let result = extractJSONFromString(jsonString, 'array')\n  assert.deepEqual(result[0], [1, 2, 3])\n\n  jsonString = 'Some text [\"foo\",\"bar\",\"\\'quoted\\'\"] more text'\n  result = extractJSONFromString(jsonString, 'array')\n  assert.deepEqual(result[0], ['foo', 'bar', \"'quoted'\"])\n})\n\ntest('extractJSONFromString should extract an invalid JSON array from string', () => {\n  let jsonString = 'Some text [1,2,3,] more text'\n  let result = extractJSONFromString(jsonString, 'array')\n  assert.deepEqual(result[0], [1, 2, 3])\n\n  jsonString = \"Some text ['foo','bar'] more text\"\n  result = extractJSONFromString(jsonString, 'array')\n  assert.deepEqual(result[0], ['foo', 'bar'])\n})\n\ntest('extractJSONFromString should extract multiple JSON arrays from string', () => {\n  const jsonString = 'Some text [1,2,3] more text [4,5,6]'\n  const result = extractJSONFromString(jsonString, 'array')\n  assert.deepEqual(result[0], [1, 2, 3])\n  assert.deepEqual(result[1], [4, 5, 6])\n})\n\ntest('extractJSONFromString should return an empty array if no JSON object is found', () => {\n  const jsonString = 'Some text'\n  const result = extractJSONFromString(jsonString, 'object')\n  assert.deepEqual(result, [])\n})\n\ntest('extractJSONFromString should return an empty array if no JSON array is found', () => {\n  const jsonString = 'Some text'\n  const result = extractJSONFromString(jsonString, 'array')\n  assert.deepEqual(result, [])\n})\n\ntest('parseArrayOutput - handles valid arrays correctly', () => {\n  const output1 = parseArrayOutput('[1,2,3]')\n  const output2 = parseArrayOutput('[\"a\", \"b\", \"c\"]')\n  const output3 = parseArrayOutput('[{\"a\": 1}, {\"b\": 2}]')\n\n  expect(output1).toMatchSnapshot('should return [1, 2, 3] for \"[1,2,3]\"')\n  expect(output2).toMatchSnapshot(\n    'should return [\"a\", \"b\", \"c\"] for \"[\"a\", \"b\", \"c\"]'\n  )\n  expect(output3).toMatchSnapshot(\n    'should return [{\"a\": 1}, {\"b\": 2}] for [{\"a\": 1}, {\"b\": 2}]'\n  )\n})\n\ntest('parseArrayOutput - handles arrays surrounded by text correctly', () => {\n  const output1 = parseArrayOutput('The array is [1,2,3]')\n  const output2 = parseArrayOutput('Array: [\"a\", \"b\", \"c\"]. That\\'s all!')\n  const output3 = parseArrayOutput(\n    'This is the array [{\"a\": 1}, {\"b\": 2}] in the text'\n  )\n\n  expect(output1).toMatchSnapshot(\n    'should return [1, 2, 3] for \"The array is [1,2,3]\"'\n  )\n  expect(output2).toMatchSnapshot(\n    'should return [\"a\", \"b\", \"c\"] for \"Array: [\"a\", \"b\", \"c\"]. That\\'s all!\"'\n  )\n  expect(output3).toMatchSnapshot(\n    'should return [{\"a\": 1}, {\"b\": 2}] for \"This is the array [{\"a\": 1}, {\"b\": 2}] in the text\"'\n  )\n})\n\ntest('parseArrayOutput - throws error for invalid arrays', () => {\n  assert.throws(() => {\n    parseArrayOutput('not a valid array')\n  })\n})\n\ntest('parseObjectOutput - handles valid objects correctly', () => {\n  const output1 = parseObjectOutput('{\"a\":1,\"b\":2,\"c\":3}')\n  const output2 = parseObjectOutput(\n    '{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}'\n  )\n\n  expect(output1).toMatchSnapshot(\n    'should return {\"a\":1,\"b\":2,\"c\":3} for {\"a\":1,\"b\":2,\"c\":3}'\n  )\n  expect(output2).toMatchSnapshot(\n    'should return {\"name\":\"John\",\"age\":30,\"city\":\"New York\"} for {\"name\":\"John\",\"age\":30,\"city\":\"New York\"}'\n  )\n})\n\ntest('parseObjectOutput - handles objects surrounded by text correctly', () => {\n  const output1 = parseObjectOutput('The object is {\"a\":1,\"b\":2,\"c\":3}')\n  const output2 = parseObjectOutput(\n    'Object: {\"name\":\"John\",\"age\":30,\"city\":\"New York\"}. That\\'s all!'\n  )\n\n  expect(output1).toMatchSnapshot(\n    'should return {\"a\":1,\"b\":2,\"c\":3} for \"The object is {\"a\":1,\"b\":2,\"c\":3}\"'\n  )\n  expect(output2).toMatchSnapshot(\n    'should return {\"name\":\"John\",\"age\":30,\"city\":\"New York\"} for \"Object: {\"name\":\"John\",\"age\":30,\"city\":\"New York\"}. That\\'s all!\"'\n  )\n})\n\ntest('parseObjectOutput - handles JSON array of objects', () => {\n  const output = parseObjectOutput('[{\"a\":1,\"b\":2},{\"c\":3,\"d\":4}]')\n\n  expect(output).toMatchSnapshot(\n    'should return first object {\"a\":1,\"b\":2} for [{\"a\":1,\"b\":2},{\"c\":3,\"d\":4}]'\n  )\n})\n\ntest('parseObjectOutput - throws error for invalid objects', () => {\n  assert.throws(() => {\n    parseObjectOutput('not a valid object')\n  })\n})\n\ntest('parseBooleanOutput - handles `true` outputs correctly', () => {\n  const output1 = parseBooleanOutput('True')\n  const output2 = parseBooleanOutput('TRUE')\n  const output3 = parseBooleanOutput('true.')\n\n  expect(output1).toMatchSnapshot('should return true for \"True\"')\n  expect(output2).toMatchSnapshot('should return true for \"TRUE\"')\n  expect(output3).toMatchSnapshot('should return true for \"true.\"')\n})\n\ntest('parseBooleanOutput - handles `false` outputs correctly', () => {\n  const output1 = parseBooleanOutput('False')\n  const output2 = parseBooleanOutput('FALSE')\n  const output3 = parseBooleanOutput('false!')\n\n  expect(output1).toMatchSnapshot('should return false for \"False\"')\n  expect(output2).toMatchSnapshot('should return false for \"FALSE\"')\n  expect(output3).toMatchSnapshot('should return false for \"false!\"')\n})\n\ntest('parseBooleanOutput - throws error for invalid outputs', () => {\n  assert.throws(() => {\n    parseBooleanOutput('NotBooleanValue')\n  })\n})\n\ntest('parseNumberOutput - handles integer outputs correctly', () => {\n  const output1 = parseNumberOutput('42', z.number().int())\n  const output2 = parseNumberOutput('  -5 ', z.number().int())\n\n  expect(output1).toMatchSnapshot('should return 42 for \"42\"')\n  expect(output2).toMatchSnapshot('should return -5 for \"  -5 \"')\n})\n\ntest('parseNumberOutput - handles float outputs correctly', () => {\n  const output1 = parseNumberOutput('42.42', z.number())\n  const output2 = parseNumberOutput('   -5.5 ', z.number())\n\n  expect(output1).toMatchSnapshot('should return 42.42 for \"42.42\"')\n  expect(output2).toMatchSnapshot('should return -5.5 for \"   -5.5 \"')\n})\n\ntest('parseNumberOutput - throws error for invalid outputs', () => {\n  assert.throws(() => {\n    parseNumberOutput('NotANumber', z.number())\n  })\n})\n\ntest('parseStructuredOutput - handles arrays correctly', () => {\n  const arraySchema = z.array(z.number())\n  const output = '[1, 2, 3]'\n  const result = parseStructuredOutput(output, arraySchema)\n\n  expect(result).toMatchSnapshot(\n    'should parse and return [1, 2, 3] for \"[1, 2, 3]\"'\n  )\n})\n\ntest('parseStructuredOutput - handles objects correctly', () => {\n  const objectSchema = z.object({ a: z.number(), b: z.string() })\n  const output = '{\"a\": 1, \"b\": \"two\"}'\n  const result = parseStructuredOutput(output, objectSchema)\n\n  expect(result).toMatchSnapshot(\n    'should parse and return {\"a\": 1, \"b\": \"two\"} for \"{\"a\": 1, \"b\": \"two\"}\"'\n  )\n})\n\ntest('parseStructuredOutput - handles booleans correctly', () => {\n  const booleanSchema = z.boolean()\n  const output = 'True'\n  const result = parseStructuredOutput(output, booleanSchema)\n\n  expect(result).toMatchSnapshot('should parse and return true for \"True\"')\n})\n\ntest('parseStructuredOutput - handles numbers correctly', () => {\n  const numberSchema = z.number()\n  const output = '123.45'\n  const result = parseStructuredOutput(output, numberSchema)\n\n  expect(result).toMatchSnapshot('should parse and return 123.45 for \"123.45\"')\n})\n\ntest('parseStructuredOutput - throws error for invalid data', () => {\n  const numberSchema = z.number()\n  const output = 'not a number'\n\n  assert.throws(() => {\n    parseStructuredOutput(output, numberSchema)\n  })\n})\n"
  },
  {
    "path": "stdlib/core/src/parse-structured-output.ts",
    "content": "import type { JsonObject, JsonValue } from 'type-fest'\nimport { jsonrepair, JSONRepairError } from 'jsonrepair'\nimport { z, type ZodType } from 'zod'\nimport { fromZodError } from 'zod-validation-error'\n\nimport { ParseError } from './errors'\nimport { type SafeParseResult } from './types'\n\n/**\n * Parses a string which is expected to contain a structured JSON value.\n *\n * The JSON value is fuzzily parsed in order to support common issues like\n * missing commas, trailing commas, and unquoted keys.\n *\n * The JSON value is then parsed against a `zod` schema to enforce the shape of\n * the output.\n *\n * @returns parsed output\n */\nexport function parseStructuredOutput<T>(\n  value: unknown,\n  outputSchema: ZodType<T>\n): T {\n  if (!value || typeof value !== 'string') {\n    throw new Error('Invalid output: expected string')\n  }\n\n  const output = value as string\n\n  let result\n  if (outputSchema instanceof z.ZodArray || 'element' in outputSchema) {\n    result = parseArrayOutput(output)\n  } else if (outputSchema instanceof z.ZodObject || 'omit' in outputSchema) {\n    result = parseObjectOutput(output)\n  } else if (outputSchema instanceof z.ZodBoolean) {\n    result = parseBooleanOutput(output)\n  } else if (\n    outputSchema instanceof z.ZodNumber ||\n    'nonnegative' in outputSchema\n  ) {\n    result = parseNumberOutput(output, outputSchema as unknown as z.ZodNumber)\n  } else {\n    // Default to string output...\n    result = output\n  }\n\n  // TODO: fix typescript issue here with recursive types\n  const safeResult = (outputSchema.safeParse as any)(result)\n\n  if (!safeResult.success) {\n    throw fromZodError(safeResult.error)\n  }\n\n  return safeResult.data\n}\n\nexport function safeParseStructuredOutput<T>(\n  value: unknown,\n  outputSchema: ZodType<T>\n): SafeParseResult<T> {\n  if (!value || typeof value !== 'string') {\n    return {\n      success: false,\n      error: 'Invalid output: expected string'\n    }\n  }\n\n  const output = value as string\n\n  try {\n    const data = parseStructuredOutput<T>(output, outputSchema)\n    return {\n      success: true,\n      data\n    }\n  } catch (err: any) {\n    // console.error(err)\n\n    return {\n      success: false,\n      error: err.message\n    }\n  }\n}\n\n/**\n * Checks if character at the specified index in a string is escaped.\n *\n * @param str - string to check\n * @param i - index of the character to check\n * @returns whether the character is escaped\n */\nfunction isEscaped(str: string, i: number): boolean {\n  return i > 0 && str[i - 1] === '\\\\' && !(i > 1 && str[i - 2] === '\\\\')\n}\n\n/**\n * Extracts JSON objects or arrays from a string.\n *\n * @param input - string to extract JSON from\n * @param jsonStructureType - type of JSON structure to extract\n * @returns array of extracted JSON objects or arrays\n */\nexport function extractJSONFromString(\n  input: string,\n  jsonStructureType: 'object' | 'array'\n) {\n  const startChar = jsonStructureType === 'object' ? '{' : '['\n  const endChar = jsonStructureType === 'object' ? '}' : ']'\n  const extractedJSONValues: JsonValue[] = []\n  let nestingLevel = 0\n  let startIndex = 0\n  const isInsideQuoted = { '\"': false, \"'\": false }\n\n  for (let i = 0; i < input.length; i++) {\n    const ch = input.charAt(i)\n    switch (ch) {\n      case '\"':\n      case \"'\":\n        if (!isInsideQuoted[ch === '\"' ? \"'\" : '\"'] && !isEscaped(input, i)) {\n          isInsideQuoted[ch] = !isInsideQuoted[ch]\n        }\n\n        break\n\n      default:\n        if (!isInsideQuoted['\"'] && !isInsideQuoted[\"'\"]) {\n          switch (ch) {\n            case startChar:\n              if (nestingLevel === 0) {\n                startIndex = i\n              }\n\n              nestingLevel += 1\n\n              break\n\n            case endChar:\n              nestingLevel -= 1\n              if (nestingLevel === 0) {\n                const candidate = input.slice(startIndex, i + 1)\n                const parsed = JSON.parse(jsonrepair(candidate))\n                if (parsed && typeof parsed === 'object') {\n                  extractedJSONValues.push(parsed as JsonValue)\n                }\n              } else if (nestingLevel < 0) {\n                throw new ParseError(\n                  `Invalid JSON string: unexpected ${endChar} at position ${i}`\n                )\n              }\n          }\n        }\n    }\n  }\n\n  if (nestingLevel !== 0) {\n    throw new ParseError(\n      'Invalid JSON string: unmatched ' + startChar + ' or ' + endChar\n    )\n  }\n\n  return extractedJSONValues\n}\n\nconst BOOLEAN_OUTPUTS: Record<string, boolean> = {\n  true: true,\n  false: false,\n  t: true,\n  f: false,\n  yes: true,\n  no: false,\n  y: true,\n  n: false,\n  '1': true,\n  '0': false\n}\n\n/**\n * Parses an array output from a string.\n *\n * @param output - string to parse\n * @returns parsed array\n */\nexport function parseArrayOutput(output: string): JsonValue[] {\n  try {\n    const arrayOutput = extractJSONFromString(output, 'array')\n    if (arrayOutput.length === 0) {\n      throw new ParseError('Invalid JSON array')\n    }\n\n    const parsedOutput = arrayOutput[0]\n    if (!Array.isArray(parsedOutput)) {\n      throw new ParseError('Expected JSON array')\n    }\n\n    return parsedOutput\n  } catch (err: any) {\n    if (err instanceof JSONRepairError) {\n      throw new ParseError(err.message, { cause: err })\n    } else if (err instanceof SyntaxError) {\n      throw new ParseError(`Invalid JSON array: ${err.message}`, { cause: err })\n    } else {\n      throw err\n    }\n  }\n}\n\n/**\n * Parses an object output from a string.\n *\n * @param output - string to parse\n * @returns parsed object\n */\nexport function parseObjectOutput(output: string): JsonObject {\n  try {\n    const arrayOutput = extractJSONFromString(output, 'object')\n    if (arrayOutput.length === 0) {\n      throw new ParseError('Invalid JSON object')\n    }\n\n    let parsedOutput = arrayOutput[0]\n    if (Array.isArray(parsedOutput)) {\n      // TODO\n      parsedOutput = parsedOutput[0]\n    }\n\n    if (!parsedOutput || typeof parsedOutput !== 'object') {\n      throw new ParseError('Expected JSON object')\n    }\n\n    return parsedOutput as JsonObject\n  } catch (err: any) {\n    if (err instanceof JSONRepairError) {\n      throw new ParseError(err.message, { cause: err })\n    } else if (err instanceof SyntaxError) {\n      throw new ParseError(`Invalid JSON object: ${err.message}`, {\n        cause: err\n      })\n    } else {\n      throw err\n    }\n  }\n}\n\n/**\n * Parses a boolean output from a string.\n *\n * @param output - string to parse\n * @returns parsed boolean\n */\nexport function parseBooleanOutput(output: string): boolean {\n  output = output\n    .toLowerCase()\n    .trim()\n    .replace(/[!.?]+$/, '')\n\n  const booleanOutput = BOOLEAN_OUTPUTS[output]\n\n  if (booleanOutput === undefined) {\n    throw new ParseError(`Invalid boolean output: ${output}`)\n  } else {\n    return booleanOutput\n  }\n}\n\n/**\n * Parses a number output from a string.\n *\n * @param output - string to parse\n * @param outputSchema - zod number schema\n * @returns parsed number\n */\nexport function parseNumberOutput(\n  output: string,\n  outputSchema: z.ZodNumber\n): number {\n  output = output.trim()\n\n  const numberOutput = outputSchema.isInt\n    ? Number.parseInt(output)\n    : Number.parseFloat(output)\n\n  if (Number.isNaN(numberOutput)) {\n    throw new ParseError(`Invalid number output: ${output}`)\n  }\n\n  return numberOutput\n}\n"
  },
  {
    "path": "stdlib/core/src/reset.d.ts",
    "content": "import '@fisch0920/config/ts-reset'\n"
  },
  {
    "path": "stdlib/core/src/schema.test.ts",
    "content": "import { expect, test } from 'vitest'\nimport { z } from 'zod'\n\nimport { asAgenticSchema, createJsonSchema, isZodSchema } from './schema'\n\ntest('isZodSchema', () => {\n  expect(isZodSchema(z.object({}))).toBe(true)\n  expect(isZodSchema({})).toBe(false)\n})\n\ntest('asAgenticSchema', () => {\n  expect(asAgenticSchema(z.object({})).jsonSchema).toEqual({\n    type: 'object',\n    properties: {},\n    additionalProperties: false\n  })\n  expect(asAgenticSchema(createJsonSchema({})).jsonSchema).toEqual({})\n})\n"
  },
  {
    "path": "stdlib/core/src/schema.ts",
    "content": "import type { z } from 'zod'\nimport { jsonrepair } from 'jsonrepair'\n\nimport type * as types from './types'\nimport { parseStructuredOutput } from './parse-structured-output'\nimport { stringifyForModel } from './utils'\nimport { zodToJsonSchema } from './zod-to-json-schema'\n\n/**\n * Used to mark schemas so we can support both Zod and custom schemas.\n */\nexport const schemaSymbol = Symbol('agentic.schema')\n\n/**\n * Structured schema used across Agentic, which wraps either a Zod schema or a\n * JSON Schema.\n *\n * JSON Schema support is important to support more dynamic tool sources such as\n * MCP.\n */\nexport type AgenticSchema<TData = unknown> = {\n  /**\n   * The JSON Schema.\n   */\n  readonly jsonSchema: types.JSONSchema\n\n  /**\n   * Parses the value, validates that it matches this schema, and returns a\n   * typed version of the value if it does. Throw an error if the value does\n   * not match the schema.\n   */\n  readonly parse: types.ParseFn<TData>\n\n  /**\n   * Parses the value, validates that it matches this schema, and returns a\n   * typed version of the value if it does. Returns an error message if the\n   * value does not match the schema, and will never throw an error.\n   */\n  readonly safeParse: types.SafeParseFn<TData>\n\n  /**\n   * Used to mark schemas so we can support both Zod and custom schemas.\n   */\n  [schemaSymbol]: true\n\n  /**\n   * Schema type for inference.\n   */\n  _type: TData\n\n  /**\n   * Source Zod schema if this object was created from a Zod schema.\n   */\n  _source?: any\n}\n\nexport function isAgenticSchema(value: unknown): value is AgenticSchema {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    schemaSymbol in value &&\n    value[schemaSymbol] === true &&\n    'jsonSchema' in value &&\n    'parse' in value\n  )\n}\n\nexport function isZodSchema(value: unknown): value is z.ZodType {\n  return (\n    !!value &&\n    typeof value === 'object' &&\n    '_def' in value &&\n    '~standard' in value &&\n    (value['~standard'] as any)?.vendor === 'zod'\n  )\n}\n\nexport function asAgenticSchema<TData>(\n  schema: z.Schema<TData> | AgenticSchema<TData>,\n  opts: { strict?: boolean } = {}\n): AgenticSchema<TData> {\n  return isAgenticSchema(schema)\n    ? schema\n    : createAgenticSchemaFromZodSchema(schema, opts)\n}\n\nexport function asZodOrJsonSchema<TData>(\n  schema: z.Schema<TData> | AgenticSchema<TData>\n): z.Schema<TData> | types.JSONSchema {\n  return isZodSchema(schema) ? schema : schema.jsonSchema\n}\n\n/**\n * Create an AgenticSchema from a JSON Schema.\n *\n * All `AIFunction` input schemas accept either a Zod schema or a custom JSON\n * Schema. Use this function to wrap JSON schemas for use with `AIFunction`.\n *\n * Note that JSON Schemas are not validated by default, so you have to pass\n * in an optional `parse` function (using `ajv`, for instance) if you'd like to\n * validate them at runtime.\n */\nexport function createJsonSchema<TData = unknown>(\n  jsonSchema: types.JSONSchema,\n  {\n    parse,\n    safeParse,\n    source\n  }: {\n    parse?: types.ParseFn<TData>\n    safeParse?: types.SafeParseFn<TData>\n    source?: any\n  } = {}\n): AgenticSchema<TData> {\n  parse ??= (value: unknown) => {\n    if (typeof value === 'string') {\n      // TODO: better error messages for invalid JSON so the LLM has a better\n      // feedback loop.\n      value = JSON.parse(jsonrepair(value))\n    }\n\n    // TODO: use `cfValidateJsonSchema` from `@agentic/json-schema` here.\n    return value as TData\n  }\n\n  safeParse ??= (value: unknown) => {\n    try {\n      const result = parse(value)\n      return { success: true, data: result }\n    } catch (err: any) {\n      return { success: false, error: err.message ?? String(err) }\n    }\n  }\n\n  return {\n    [schemaSymbol]: true,\n    _type: undefined as TData,\n    jsonSchema,\n    parse,\n    safeParse,\n    _source: source\n  }\n}\n\nexport function createAgenticSchemaFromZodSchema<TData>(\n  zodSchema: z.Schema<TData>,\n  opts: { strict?: boolean } = {}\n): AgenticSchema<TData> {\n  return createJsonSchema(zodToJsonSchema(zodSchema, opts), {\n    parse: (value) => {\n      return parseStructuredOutput(value, zodSchema)\n    },\n    source: zodSchema\n  })\n}\n\nconst DEFAULT_SCHEMA_PREFIX = `\n---\n\nRespond with JSON using the following JSON schema:\n\n\\`\\`\\`json`\nconst DEFAULT_SCHEMA_SUFFIX = '```'\n\nexport function augmentSystemMessageWithJsonSchema({\n  schema,\n  system,\n  schemaPrefix = DEFAULT_SCHEMA_PREFIX,\n  schemaSuffix = DEFAULT_SCHEMA_SUFFIX\n}: {\n  schema: types.JSONSchema\n  system?: string\n  schemaPrefix?: string\n  schemaSuffix?: string\n}): string {\n  return [system, schemaPrefix, stringifyForModel(schema), schemaSuffix]\n    .filter(Boolean)\n    .join('\\n')\n    .trim()\n}\n"
  },
  {
    "path": "stdlib/core/src/types.ts",
    "content": "import type { Jsonifiable } from 'type-fest'\nimport type { z } from 'zod'\n\nimport type { AIFunctionSet } from './ai-function-set'\nimport type { AIFunctionsProvider } from './fns'\nimport type { Msg } from './message'\nimport type { AgenticSchema } from './schema'\n\nexport type { Msg } from './message'\nexport type { AgenticSchema } from './schema'\nexport type { KyInstance } from 'ky'\nexport type { ThrottledFunction } from 'p-throttle'\nexport type { SetOptional, SetRequired, Simplify } from 'type-fest'\n\nexport type Nullable<T> = T | null\n\nexport type DeepNullable<T> = T extends object\n  ? { [K in keyof T]: DeepNullable<T[K]> }\n  : Nullable<T>\n\nexport type MaybePromise<T> = T | Promise<T>\n\nexport type JSONSchema = Record<string, unknown>\n\nexport type RelaxedJsonifiable = Jsonifiable | Record<string, unknown>\n\nexport interface AIFunctionSpec {\n  /** AI Function name. */\n  name: string\n\n  /** Description of what the function does. */\n  description: string\n\n  /** JSON schema spec of the function's input parameters */\n  parameters: JSONSchema\n\n  /**\n   * The type of the function tool. Always `function`.\n   */\n  type: 'function'\n\n  /**\n   * Whether to enable strict schema adherence when generating the function\n   * parameters. Currently only supported by OpenAI's\n   * [Structured Outputs](https://platform.openai.com/docs/guides/structured-outputs).\n   */\n  strict: boolean\n}\n\nexport interface AIToolSpec {\n  type: 'function'\n  function: AIFunctionSpec\n}\n\n/**\n * A Zod object schema or a custom schema created from a JSON schema via\n * `createSchema()`.\n */\nexport type AIFunctionInputSchema = z.ZodObject<any> | AgenticSchema<any>\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type inferInput<InputSchema extends AIFunctionInputSchema> =\n  InputSchema extends AgenticSchema<any>\n    ? InputSchema['_type']\n    : InputSchema extends z.ZodTypeAny\n      ? z.infer<InputSchema>\n      : never\n\n/** The implementation of the function, with arg parsing and validation. */\nexport type AIFunctionImpl<Return> = Omit<\n  (input: string | Msg) => MaybePromise<Return>,\n  'name' | 'toString' | 'arguments' | 'caller' | 'prototype' | 'length'\n>\n\n/**\n * Flexible type which accepts any AI-function-like object, including:\n *   - `AIFunctionSet` - Sets of AI functions\n *   - `AIFunctionsProvider` - Client classes which expose an `AIFunctionSet`\n *      via the `.functions` property\n *   - `AIFunction` - Individual functions\n */\nexport type AIFunctionLike =\n  | AIFunctionsProvider\n  | AIFunction<AIFunctionInputSchema>\n  | AIFunctionSet\n\n/**\n * A function meant to be used with LLM function calling.\n */\nexport interface AIFunction<\n  // TODO\n  // InputSchema extends AIFunctionInputSchema = z.ZodObject<any>,\n  InputSchema extends AIFunctionInputSchema = AIFunctionInputSchema,\n  Output = any\n> {\n  /**\n   * Invokes the underlying AI function `execute` but first validates the input\n   * against this function's `inputSchema`. This method is callable and is\n   * meant to be passed the raw LLM JSON string or an OpenAI-compatible Message.\n   */\n  (input: string | Msg): MaybePromise<Output>\n\n  /** The schema for the input object (zod or custom schema). */\n  inputSchema: InputSchema\n\n  /** Parse the function arguments from a message. */\n  parseInput(input: string | Msg): inferInput<InputSchema>\n\n  /** The JSON schema function spec for the OpenAI API `functions` property. */\n  spec: AIFunctionSpec\n\n  /**\n   * The underlying function implementation without any arg parsing or validation.\n   */\n  // TODO: this `any` shouldn't be necessary, but it is for `createAIFunction` results to be assignable to `AIFunctionLike`\n  execute: (params: inferInput<InputSchema> | any) => MaybePromise<Output>\n\n  /** Optional tags to help organize functions. */\n  tags?: string[]\n}\n\nexport type SafeParseResult<TData> =\n  | {\n      success: true\n      data: TData\n    }\n  | {\n      success: false\n      error: string\n    }\n\nexport type ParseFn<TData> = (value: unknown) => TData\nexport type SafeParseFn<TData> = (value: unknown) => SafeParseResult<TData>\n"
  },
  {
    "path": "stdlib/core/src/utils.test.ts",
    "content": "import ky from 'ky'\nimport pThrottle from 'p-throttle'\nimport { describe, expect, test } from 'vitest'\n\nimport { mockKyInstance } from './_utils'\nimport {\n  omit,\n  pick,\n  pruneEmpty,\n  pruneEmptyDeep,\n  sanitizeSearchParams,\n  stringifyForModel,\n  throttleKy\n} from './utils'\n\ntest('pick', () => {\n  expect(pick({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ a: 1, c: 3 })\n  expect(\n    pick({ a: { b: 'foo' }, d: -1, foo: null } as any, 'b', 'foo')\n  ).toEqual({ foo: null })\n})\n\ntest('omit', () => {\n  expect(omit({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ b: 2 })\n  expect(omit({ a: { b: 'foo' }, d: -1, foo: null }, 'b', 'foo')).toEqual({\n    a: { b: 'foo' },\n    d: -1\n  })\n  expect(omit({ a: 1, b: 2, c: 3 }, 'foo', 'bar', 'c')).toEqual({ a: 1, b: 2 })\n})\n\ntest('sanitizeSearchParams', () => {\n  expect(\n    sanitizeSearchParams({ a: 1, b: undefined, c: 13 }).toString()\n  ).toMatchSnapshot()\n\n  expect(sanitizeSearchParams({ a: [1, 2, 3] }).toString()).toMatchSnapshot()\n\n  expect(\n    sanitizeSearchParams({ b: ['a', 'b'], foo: true }).toString()\n  ).toMatchSnapshot()\n\n  expect(\n    sanitizeSearchParams({ b: [false, true, false] }).toString()\n  ).toMatchSnapshot()\n\n  expect(\n    sanitizeSearchParams({\n      flag: ['foo', 'bar', 'baz'],\n      token: 'test'\n    }).toString()\n  ).toMatchSnapshot()\n\n  expect(sanitizeSearchParams({}).toString()).toMatchSnapshot()\n\n  expect(sanitizeSearchParams({ a: [] }).toString()).toMatchSnapshot()\n})\n\ndescribe('stringifyForModel', () => {\n  test('handles basic objects', () => {\n    const input = {\n      foo: 'bar',\n      nala: ['is', 'cute'],\n      kittens: null,\n      cats: undefined,\n      paws: 4.3\n    }\n    const result = stringifyForModel(input)\n    expect(result).toEqual(JSON.stringify(input, null))\n  })\n\n  test('handles empty input', () => {\n    const result = stringifyForModel()\n    expect(result).toEqual('')\n  })\n})\n\ntest('pruneEmpty', () => {\n  expect(\n    pruneEmpty({\n      a: 1,\n      b: { foo: true },\n      c: [true],\n      d: 'foo',\n      e: null,\n      f: undefined\n    })\n  ).toEqual({\n    a: 1,\n    b: { foo: true },\n    c: [true],\n    d: 'foo'\n  })\n\n  expect(pruneEmpty({ a: 0, b: {}, c: [], d: '' })).toEqual({\n    a: 0\n  })\n  expect(pruneEmpty({ b: {}, c: [], d: '' })).toEqual({})\n\n  expect(\n    pruneEmpty({\n      a: null,\n      b: { foo: [{}], bar: [null, undefined, ''] },\n      c: ['', '', ''],\n      d: '',\n      e: undefined,\n      f: [],\n      g: {}\n    })\n  ).toEqual({\n    b: { foo: [{}], bar: [null, undefined, ''] },\n    c: ['', '', '']\n  })\n})\n\ntest('pruneEmptyDeep', () => {\n  expect(\n    pruneEmptyDeep({ a: 1, b: { foo: true }, c: [true], d: 'foo' })\n  ).toEqual({\n    a: 1,\n    b: { foo: true },\n    c: [true],\n    d: 'foo'\n  })\n\n  expect(pruneEmptyDeep({ a: 0, b: {}, c: [], d: '' })).toEqual({\n    a: 0\n  })\n\n  expect(\n    pruneEmptyDeep({\n      a: null,\n      b: { foo: [{}], bar: [null, undefined, ''] },\n      c: ['', '', ''],\n      d: '',\n      e: undefined\n    })\n  ).toEqual(undefined)\n})\n\ntest(\n  'throttleKy should rate-limit requests to ky properly',\n  {\n    timeout: 60_000\n  },\n  async () => {\n    const interval = 1000\n    const throttle = pThrottle({\n      limit: 1,\n      interval,\n      strict: true\n    })\n\n    const ky2 = mockKyInstance(throttleKy(ky, throttle))\n\n    const url = 'https://httpbin.org/get'\n\n    for (let i = 0; i < 10; i++) {\n      const before = Date.now()\n      const res = await ky2.get(url)\n      const after = Date.now()\n\n      const duration = after - before\n      // console.log(duration, res.status)\n      expect(res.status).toBe(200)\n\n      // leave a bit of wiggle room for the interval\n      if (i > 0) {\n        expect(duration >= interval - interval / 5).toBeTruthy()\n      }\n    }\n  }\n)\n"
  },
  {
    "path": "stdlib/core/src/utils.ts",
    "content": "import dedent from 'dedent'\n\nimport type * as types from './types'\n\nexport { assert } from './assert'\nexport { default as delay } from 'delay'\n\n/**\n * From `inputObj`, create a new object that does not include `keys`.\n *\n * @example\n * ```js\n * omit({ a: 1, b: 2, c: 3 }, 'a', 'c') // { b: 2 }\n * ```\n */\nexport const omit = <\n  T extends Record<string, unknown> | object,\n  K extends keyof any\n>(\n  inputObj: T,\n  ...keys: K[]\n): Omit<T, K> => {\n  const keysSet = new Set(keys)\n  return Object.fromEntries(\n    Object.entries(inputObj).filter(([k]) => !keysSet.has(k as any))\n  ) as any\n}\n\n/**\n * From `inputObj`, create a new object that only includes `keys`.\n *\n * @example\n * ```js\n * pick({ a: 1, b: 2, c: 3 }, 'a', 'c') // { a: 1, c: 3 }\n * ```\n */\nexport const pick = <\n  T extends Record<string, unknown> | object,\n  K extends keyof T\n>(\n  inputObj: T,\n  ...keys: K[]\n): Pick<T, K> => {\n  const keysSet = new Set(keys)\n  return Object.fromEntries(\n    Object.entries(inputObj).filter(([k]) => keysSet.has(k as any))\n  ) as any\n}\n\nexport function pruneUndefined<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined> }> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([, value]) => value !== undefined)\n  ) as NonNullable<T>\n}\n\nexport function pruneNullOrUndefined<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined | null> }> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(\n      ([, value]) => value !== undefined && value !== null\n    )\n  ) as NonNullable<T>\n}\n\nexport function pruneNullOrUndefinedDeep<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined | null> }> {\n  if (!obj || Array.isArray(obj) || typeof obj !== 'object') return obj\n\n  return Object.fromEntries(\n    Object.entries(obj)\n      .filter(([, value]) => value !== undefined && value !== null)\n      .map(([key, value]) =>\n        Array.isArray(value)\n          ? [\n              key,\n              value\n                .filter((v) => v !== undefined && v !== null)\n                .map(pruneNullOrUndefinedDeep as any)\n            ]\n          : typeof value === 'object'\n            ? [key, pruneNullOrUndefinedDeep(value)]\n            : [key, value]\n      )\n  ) as NonNullable<T>\n}\n\nexport function pruneEmpty<T extends Record<string, any>>(\n  obj: T\n): NonNullable<{ [K in keyof T]: Exclude<T[K], undefined | null> }> {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([, value]) => {\n      if (value === undefined || value === null) return false\n      if (typeof value === 'string' && !value) return false\n      if (Array.isArray(value) && !value.length) return false\n      if (\n        typeof value === 'object' &&\n        !Array.isArray(value) &&\n        !Object.keys(value).length\n      ) {\n        return false\n      }\n\n      return true\n    })\n  ) as NonNullable<T>\n}\n\nexport function pruneEmptyDeep<T>(\n  value?: T\n):\n  | undefined\n  | (T extends Record<string, any>\n      ? { [K in keyof T]: Exclude<T[K], undefined | null> }\n      : T extends Array<infer U>\n        ? Array<Exclude<U, undefined | null>>\n        : Exclude<T, null>) {\n  if (value === undefined || value === null) return undefined\n\n  if (typeof value === 'string') {\n    if (!value) return undefined\n\n    return value as any\n  }\n\n  if (Array.isArray(value)) {\n    if (!value.length) return undefined\n\n    value = value\n      .map((v) => pruneEmptyDeep(v))\n      .filter((v) => v !== undefined) as any\n\n    if (!value || !Array.isArray(value) || !value.length) return undefined\n    return value as any\n  }\n\n  if (typeof value === 'object') {\n    if (!Object.keys(value).length) return undefined\n\n    value = Object.fromEntries(\n      Object.entries(value)\n        .map(([k, v]) => [k, pruneEmptyDeep(v)])\n        .filter(([, v]) => v !== undefined)\n    )\n\n    if (!value || !Object.keys(value).length) return undefined\n    return value as any\n  }\n\n  return value as any\n}\n\nexport function getEnv(name: string): string | undefined {\n  try {\n    return typeof process !== 'undefined'\n      ? // eslint-disable-next-line no-process-env\n        process.env?.[name]\n      : undefined\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Function that does nothing.\n */\nexport const noop = () => undefined\n\n/**\n * Throttles HTTP requests made by a ky instance.\n *\n * Very useful for enforcing rate limits.\n */\nexport function throttleKy(\n  ky: types.KyInstance,\n  throttleFn: <Arguments extends readonly unknown[], ReturnValue>(\n    function_: (...args_: Arguments) => ReturnValue\n  ) => types.ThrottledFunction<(...args_: Arguments) => ReturnValue>\n) {\n  return ky.extend({\n    hooks: {\n      beforeRequest: [throttleFn(noop)]\n    }\n  })\n}\n\n/**\n * Creates a new `URLSearchParams` object with all values coerced to strings\n * that correctly handles arrays of values as repeated keys (or CSV) and\n * correctly removes `undefined` keys and values.\n */\nexport function sanitizeSearchParams(\n  searchParams:\n    | Record<\n        string,\n        string | number | boolean | string[] | number[] | boolean[] | undefined\n      >\n    | object,\n  {\n    csv = false\n  }: {\n    /**\n     * Whether to use comma-separated-values for arrays or multiple entries.\n     *\n     * Defaults to `false` and will use multiple entries.\n     */\n    csv?: boolean\n  } = {}\n): URLSearchParams {\n  const entries = Object.entries(searchParams).flatMap(([key, value]) => {\n    if (key === undefined || value === undefined) {\n      return []\n    }\n\n    if (Array.isArray(value)) {\n      return value.map((v) => [key, String(v)])\n    }\n\n    return [[key, String(value)]]\n  }) as [string, string][]\n\n  if (!csv) {\n    return new URLSearchParams(entries)\n  }\n\n  const csvEntries: Record<string, string> = {}\n  for (const [key, value] of entries) {\n    csvEntries[key] = csvEntries[key] ? `${csvEntries[key]},${value}` : value\n  }\n\n  return new URLSearchParams(csvEntries)\n}\n\n/**\n * Stringifies a JSON value in a way that's optimized for use with LLM prompts.\n *\n * Replacement for `JSON.stringify` when working with LLMs.\n *\n * @example\n * ```ts\n * stringifyForModel({ a: 1, b: 2 }) // '{\"a\":1,\"b\":2}'\n * ```\n */\nexport function stringifyForModel(\n  jsonObject?: types.RelaxedJsonifiable,\n  replacer: (number | string)[] | null = null,\n  space: string | number = 0\n): string {\n  if (jsonObject === undefined) {\n    return ''\n  }\n\n  if (typeof jsonObject === 'string') {\n    return jsonObject\n  }\n\n  return JSON.stringify(jsonObject, replacer, space)\n}\n\nconst dedenter = dedent.withOptions({ escapeSpecialCharacters: true })\n\n/**\n * Cleans a string by removing extra newlines and indentation.\n *\n * @see: https://github.com/dmnd/dedent\n */\nexport function cleanStringForModel(text: string): string {\n  return dedenter(text).trim()\n}\n\nexport function isAIFunction(obj: any): obj is types.AIFunction {\n  if (!obj) return false\n  if (typeof obj !== 'function') return false\n  if (!obj.inputSchema) return false\n  if (!obj.parseInput) return false\n  if (!obj.spec) return false\n  if (!obj.execute) return false\n  if (!obj.spec.name || typeof obj.spec.name !== 'string') return false\n\n  return true\n}\n\nexport function getErrorMessage(error?: unknown): string {\n  if (!error) {\n    return 'unknown error'\n  }\n\n  if (typeof error === 'string') {\n    return error\n  }\n\n  const message = (error as any).message\n  if (message && typeof message === 'string') {\n    return message\n  }\n\n  try {\n    return JSON.stringify(error)\n  } catch {\n    return 'unknown error'\n  }\n}\n\nexport function getShortDateString(date: Date = new Date()): string {\n  return date.toISOString().split('T')[0]!\n}\n"
  },
  {
    "path": "stdlib/core/src/zod-to-json-schema.test.ts",
    "content": "import { describe, expect, test } from 'vitest'\nimport { z } from 'zod'\n\nimport { zodToJsonSchema } from './zod-to-json-schema'\n\ndescribe('zodToJsonSchema', () => {\n  test('handles basic objects', () => {\n    const params = zodToJsonSchema(\n      z.object({\n        name: z.string().min(1).describe('Name of the person'),\n        age: z.number().int().optional().describe('Age in years')\n      })\n    )\n\n    expect(params).toEqual({\n      additionalProperties: false,\n      type: 'object',\n      required: ['name'],\n      properties: {\n        name: {\n          type: 'string',\n          description: 'Name of the person',\n          minLength: 1\n        },\n        age: {\n          type: 'integer',\n          description: 'Age in years'\n        }\n      }\n    })\n  })\n\n  test('handles enums and unions', () => {\n    const params = zodToJsonSchema(\n      z.object({\n        name: z.string().min(1).describe('Name of the person'),\n        sexEnum: z.enum(['male', 'female']),\n        sexUnion: z.union([z.literal('male'), z.literal('female')])\n      })\n    )\n\n    expect(params).toEqual({\n      additionalProperties: false,\n      type: 'object',\n      required: ['name', 'sexEnum', 'sexUnion'],\n      properties: {\n        name: {\n          type: 'string',\n          description: 'Name of the person',\n          minLength: 1\n        },\n        sexEnum: {\n          type: 'string',\n          enum: ['male', 'female']\n        },\n        sexUnion: {\n          type: 'string',\n          enum: ['male', 'female']\n        }\n      }\n    })\n  })\n\n  test('handles optional properties in strict mode', () => {\n    const params = zodToJsonSchema(\n      z.object({\n        name: z.string().optional(),\n        age: z.number().optional().default(10)\n      }),\n      {\n        strict: true\n      }\n    )\n\n    expect(params).toEqual({\n      additionalProperties: false,\n      type: 'object',\n      required: ['name', 'age'],\n      properties: {\n        name: {\n          anyOf: [\n            {\n              type: 'string'\n            },\n            {\n              type: 'null'\n            }\n          ]\n        },\n        age: {\n          type: 'number',\n          default: 10\n        }\n      }\n    })\n  })\n})\n"
  },
  {
    "path": "stdlib/core/src/zod-to-json-schema.ts",
    "content": "import type { z } from 'zod'\nimport { zodToJsonSchema as zodToJsonSchemaImpl } from 'openai-zod-to-json-schema'\n\nimport type * as types from './types'\nimport { omit } from './utils'\n\n/** Generate a JSON Schema from a Zod schema. */\nexport function zodToJsonSchema(\n  schema: z.ZodType,\n  {\n    strict = false\n  }: {\n    strict?: boolean\n  } = {}\n): types.JSONSchema {\n  return omit(\n    zodToJsonSchemaImpl(schema, {\n      $refStrategy: 'none',\n      openaiStrictMode: strict\n    }),\n    '$schema',\n    'default',\n    'definitions',\n    'description',\n    'markdownDescription'\n  )\n}\n"
  },
  {
    "path": "stdlib/core/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/genkit/package.json",
    "content": "{\n  \"name\": \"@agentic/genkit\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic adapter for the Firebase Genkit AI SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/genkit\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\"\n  },\n  \"peerDependencies\": {\n    \"genkit\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"genkit\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/genkit/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/genkit\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/genkit.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/genkit <!-- omit from toc -->\n\n> Agentic adapter for the Firebase Genkit AI SDK.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so/marketplace/ts-sdks/genkit)\n\n## Install\n\n```bash\nnpm i @agentic/genkit zod\n```\n\n## Usage\n\nSee https://docs.agentic.so/marketplace/ts-sdks/genkit\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/genkit/src/genkit.test.ts",
    "content": "import { EchoAITool } from '@agentic/core'\nimport { Genkit } from 'genkit'\nimport { expect, test } from 'vitest'\n\nimport { createGenkitTools, createGenkitToolsFromIdentifier } from './genkit'\n\ntest('createGenkitTools', () => {\n  const genkit = new Genkit()\n  expect(createGenkitTools(genkit, new EchoAITool())).toHaveLength(1)\n})\n\ntest(\n  'createGenkitToolsFromIdentifier',\n  {\n    timeout: 30_000\n  },\n  async () => {\n    const genkit = new Genkit()\n    const tools = await createGenkitToolsFromIdentifier(\n      genkit,\n      '@agentic/search'\n    )\n    expect(tools).toHaveLength(1)\n    expect(tools[0]!.__action.name).toBe('search')\n  }\n)\n"
  },
  {
    "path": "stdlib/genkit/src/genkit.ts",
    "content": "import type { Genkit } from 'genkit'\nimport {\n  type AIFunctionLike,\n  AIFunctionSet,\n  asZodOrJsonSchema,\n  isZodSchema\n} from '@agentic/core'\nimport {\n  AgenticToolClient,\n  type AgenticToolClientOptions\n} from '@agentic/platform-tool-client'\nimport { z } from 'zod'\n\nexport type GenkitTool = ReturnType<Genkit['defineTool']>\n\n/**\n * Converts a set of Agentic stdlib AI functions to an array of Genkit tools.\n */\nexport function createGenkitTools(\n  genkit: Genkit,\n  ...aiFunctionLikeTools: AIFunctionLike[]\n): GenkitTool[] {\n  const fns = new AIFunctionSet(aiFunctionLikeTools)\n\n  return fns.map((fn) => {\n    const inputSchemaKey = isZodSchema(fn.inputSchema)\n      ? ('inputSchema' as const)\n      : ('inputJsonSchema' as const)\n\n    return genkit.defineTool(\n      {\n        name: fn.spec.name,\n        description: fn.spec.description,\n        [inputSchemaKey]: asZodOrJsonSchema(fn.inputSchema),\n        outputSchema: z.any()\n      },\n      fn.execute\n    )\n  })\n}\n\n/**\n * Creates an array of Genkit tools from a hosted Agentic project or deployment\n * identifier.\n *\n * You'll generally use a project identifier, which will automatically use\n * that project's `latest` version, but if you want to target a specific\n * version or preview deployment, you can use a fully-qualified deployment\n * identifier.\n *\n * @example\n * ```ts\n * const genkit = new Genkit()\n * const tools = await createGenkitToolsFromIdentifier(genkit, '@agentic/search')\n * ```\n */\nexport async function createGenkitToolsFromIdentifier(\n  genkit: Genkit,\n  projectOrDeploymentIdentifier: string,\n  opts: AgenticToolClientOptions = {}\n): Promise<GenkitTool[]> {\n  const agenticToolClient = await AgenticToolClient.fromIdentifier(\n    projectOrDeploymentIdentifier,\n    opts\n  )\n\n  return createGenkitTools(genkit, agenticToolClient)\n}\n"
  },
  {
    "path": "stdlib/genkit/src/index.ts",
    "content": "export * from './genkit'\n"
  },
  {
    "path": "stdlib/genkit/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\", \"*.config.ts\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/genkit/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n  test: {\n    server: {\n      deps: {\n        inline: true\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "stdlib/langchain/package.json",
    "content": "{\n  \"name\": \"@agentic/langchain\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic adapter for the LangChain TS SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/langchain\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\"\n  },\n  \"peerDependencies\": {\n    \"@langchain/core\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@langchain/core\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/langchain/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/langchain\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/langchain.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/langchain <!-- omit from toc -->\n\n> Agentic adapter for the LangChain TS SDK.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so/marketplace/ts-sdks/llamaindex)\n\n## Install\n\n```bash\nnpm i @agentic/langchain zod @langchain/core\n```\n\n## Usage\n\nSee https://docs.agentic.so/marketplace/ts-sdks/llamaindex\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/langchain/src/index.ts",
    "content": "export * from './langchain'\n"
  },
  {
    "path": "stdlib/langchain/src/langchain.test.ts",
    "content": "import { EchoAITool } from '@agentic/core'\nimport { expect, test } from 'vitest'\n\nimport {\n  createLangChainTools,\n  createLangChainToolsFromIdentifier\n} from './langchain'\n\ntest('createLangChainTools', () => {\n  expect(createLangChainTools(new EchoAITool())).toHaveLength(1)\n})\n\ntest(\n  'createLangChainToolsFromIdentifier',\n  {\n    timeout: 30_000\n  },\n  async () => {\n    const tools = await createLangChainToolsFromIdentifier('@agentic/search')\n    expect(tools).toHaveLength(1)\n    expect(tools[0]!.name).toBe('search')\n  }\n)\n"
  },
  {
    "path": "stdlib/langchain/src/langchain.ts",
    "content": "import {\n  type AIFunctionLike,\n  AIFunctionSet,\n  asZodOrJsonSchema,\n  stringifyForModel\n} from '@agentic/core'\nimport {\n  AgenticToolClient,\n  type AgenticToolClientOptions\n} from '@agentic/platform-tool-client'\nimport { DynamicStructuredTool } from '@langchain/core/tools'\n\n/**\n * Converts a set of Agentic stdlib AI functions to an array of LangChain\n * tools (`DynamicStructuredTool[]`).\n */\nexport function createLangChainTools(\n  ...aiFunctionLikeTools: AIFunctionLike[]\n): DynamicStructuredTool[] {\n  const fns = new AIFunctionSet(aiFunctionLikeTools)\n\n  return fns.map(\n    (fn) =>\n      new DynamicStructuredTool({\n        name: fn.spec.name,\n        description: fn.spec.description,\n        schema: asZodOrJsonSchema(fn.inputSchema),\n        func: async (input) => {\n          const result = await Promise.resolve(fn.execute(input))\n          // LangChain tools require the output to be a string\n          return stringifyForModel(result)\n        }\n      })\n  )\n}\n\n/**\n * Creates a Vercel AI SDK's `tools` object from a hosted Agentic project or\n * deployment identifier.\n *\n * You'll generally use a project identifier, which will automatically use\n * that project's `latest` version, but if you want to target a specific\n * version or preview deployment, you can use a fully-qualified deployment\n * identifier.\n *\n * @example\n * ```ts\n * const tools = await createLangChainToolsFromIdentifier('@agentic/search')\n * ```\n */\nexport async function createLangChainToolsFromIdentifier(\n  projectOrDeploymentIdentifier: string,\n  opts: AgenticToolClientOptions = {}\n): Promise<DynamicStructuredTool[]> {\n  const agenticToolClient = await AgenticToolClient.fromIdentifier(\n    projectOrDeploymentIdentifier,\n    opts\n  )\n\n  return createLangChainTools(agenticToolClient)\n}\n"
  },
  {
    "path": "stdlib/langchain/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/license",
    "content": "All Agentic packages under the `stdlib/` folder are MIT licensed.\n\n---\n\n**MIT License**\n\nCopyright (c) 2025 Travis Fischer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "stdlib/llamaindex/package.json",
    "content": "{\n  \"name\": \"@agentic/llamaindex\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic adapter for the LlamaIndex AI SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/llamaindex\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\"\n  },\n  \"peerDependencies\": {\n    \"llamaindex\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"llamaindex\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/llamaindex/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/llamaindex\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/llamaindex.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/llamaindex <!-- omit from toc -->\n\n> Agentic adapter for the LlamaIndex TS SDK.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so/marketplace/ts-sdks/llamaindex)\n\n## Install\n\n```bash\nnpm i @agentic/llamaindex zod llamaindex\n```\n\n## Usage\n\nSee https://docs.agentic.so/marketplace/ts-sdks/llamaindex\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/llamaindex/src/index.ts",
    "content": "export * from './llamaindex'\n"
  },
  {
    "path": "stdlib/llamaindex/src/llamaindex.test.ts",
    "content": "import { EchoAITool } from '@agentic/core'\nimport { expect, test } from 'vitest'\n\nimport {\n  createLlamaIndexTools,\n  createLlamaIndexToolsFromIdentifier\n} from './llamaindex'\n\ntest('createLlamaIndexTools', () => {\n  expect(createLlamaIndexTools(new EchoAITool())).toHaveLength(1)\n})\n\ntest(\n  'createLlamaIndexToolsFromIdentifier',\n  {\n    timeout: 30_000\n  },\n  async () => {\n    const tools = await createLlamaIndexToolsFromIdentifier('@agentic/search')\n    expect(tools).toHaveLength(1)\n    expect(tools[0]!.metadata.name).toBe('search')\n  }\n)\n"
  },
  {
    "path": "stdlib/llamaindex/src/llamaindex.ts",
    "content": "import {\n  type AIFunctionLike,\n  AIFunctionSet,\n  asZodOrJsonSchema\n} from '@agentic/core'\nimport {\n  AgenticToolClient,\n  type AgenticToolClientOptions\n} from '@agentic/platform-tool-client'\nimport { FunctionTool, type JSONValue } from 'llamaindex'\n\nexport type LlamaIndexTool = FunctionTool<any, JSONValue | Promise<JSONValue>>\n\n/**\n * Converts a set of Agentic stdlib AI functions to an array of LlamaIndex\n * tools (`FunctionTool[]`).\n */\nexport function createLlamaIndexTools(\n  ...aiFunctionLikeTools: AIFunctionLike[]\n): LlamaIndexTool[] {\n  const fns = new AIFunctionSet(aiFunctionLikeTools)\n\n  return fns.map((fn) =>\n    FunctionTool.from(fn.execute, {\n      name: fn.spec.name,\n      description: fn.spec.description,\n      // TODO: Investigate types here\n      parameters: asZodOrJsonSchema(fn.inputSchema) as any\n    })\n  )\n}\n\n/**\n * Creates an array of LlamaIndex tools from a hosted Agentic project or\n * deployment identifier.\n *\n * You'll generally use a project identifier, which will automatically use\n * that project's `latest` version, but if you want to target a specific\n * version or preview deployment, you can use a fully-qualified deployment\n * identifier.\n *\n * @example\n * ```ts\n * const tools = await createLlamaIndexToolsFromIdentifier('@agentic/search')\n * ```\n */\nexport async function createLlamaIndexToolsFromIdentifier(\n  projectOrDeploymentIdentifier: string,\n  opts: AgenticToolClientOptions = {}\n): Promise<LlamaIndexTool[]> {\n  const agenticToolClient = await AgenticToolClient.fromIdentifier(\n    projectOrDeploymentIdentifier,\n    opts\n  )\n\n  return createLlamaIndexTools(agenticToolClient)\n}\n"
  },
  {
    "path": "stdlib/llamaindex/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/mastra/package.json",
    "content": "{\n  \"name\": \"@agentic/mastra\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic adapter for the Mastra AI Agent SDK.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/mastra\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\",\n    \"test:unit\": \"vitest run\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@agentic/platform-tool-client\": \"workspace:*\",\n    \"@mastra/schema-compat\": \"catalog:\",\n    \"ai\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"@mastra/core\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@mastra/core\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/mastra/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/mastra\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/mastra.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/mastra <!-- omit from toc -->\n\n> Agentic adapter for the Mastra AI Agent SDK.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so/marketplace/ts-sdks/mastra)\n\n## Install\n\n```bash\nnpm i @agentic/mastra zod @mastra/core\n```\n\n## Usage\n\nSee https://docs.agentic.so/marketplace/ts-sdks/mastra\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/mastra/src/index.ts",
    "content": "export * from './mastra'\n"
  },
  {
    "path": "stdlib/mastra/src/mastra.test.ts",
    "content": "import { EchoAITool } from '@agentic/core'\nimport { expect, test } from 'vitest'\n\nimport { createMastraTools, createMastraToolsFromIdentifier } from './mastra'\n\ntest('createMastraTools', () => {\n  expect(createMastraTools(new EchoAITool())).toHaveProperty('echo')\n})\n\ntest(\n  'createMastraToolsFromIdentifier',\n  {\n    timeout: 30_000\n  },\n  async () => {\n    const tools = await createMastraToolsFromIdentifier('@agentic/search')\n    expect(tools).toHaveProperty('search')\n  }\n)\n"
  },
  {
    "path": "stdlib/mastra/src/mastra.ts",
    "content": "import {\n  type AIFunctionLike,\n  AIFunctionSet,\n  asAgenticSchema,\n  isZodSchema\n} from '@agentic/core'\nimport {\n  AgenticToolClient,\n  type AgenticToolClientOptions\n} from '@agentic/platform-tool-client'\nimport { createTool } from '@mastra/core/tools'\nimport { convertSchemaToZod } from '@mastra/schema-compat'\nimport { jsonSchema } from 'ai'\n\nexport type MastraTool = ReturnType<typeof createTool>\n\n/**\n * Converts a set of Agentic stdlib AI functions to an object compatible with\n * the Mastra Agent `tools` parameter.\n */\nexport function createMastraTools(\n  ...aiFunctionLikeTools: AIFunctionLike[]\n): Record<string, MastraTool> {\n  const fns = new AIFunctionSet(aiFunctionLikeTools)\n\n  return Object.fromEntries(\n    fns.map((fn) => {\n      // https://github.com/mastra-ai/mastra/tree/main/packages/schema-compat\n      const aiSchema = isZodSchema(fn.inputSchema)\n        ? fn.inputSchema\n        : jsonSchema(asAgenticSchema(fn.inputSchema).jsonSchema)\n      const inputSchema = convertSchemaToZod(aiSchema)\n\n      return [\n        fn.spec.name,\n        createTool({\n          id: fn.spec.name,\n          description: fn.spec.description,\n          inputSchema,\n          execute: (ctx) => fn.execute(ctx.context)\n        })\n      ]\n    })\n  )\n}\n\n/**\n * Creates a Mastra Agent `tools` object from a hosted Agentic project or\n * deployment identifier.\n *\n * You'll generally use a project identifier, which will automatically use\n * that project's `latest` version, but if you want to target a specific\n * version or preview deployment, you can use a fully-qualified deployment\n * identifier.\n *\n * @example\n * ```ts\n * const tools = await createMastraToolsFromIdentifier('@agentic/search')\n * ```\n */\nexport async function createMastraToolsFromIdentifier(\n  projectOrDeploymentIdentifier: string,\n  opts: AgenticToolClientOptions = {}\n): Promise<Record<string, MastraTool>> {\n  const agenticToolClient = await AgenticToolClient.fromIdentifier(\n    projectOrDeploymentIdentifier,\n    opts\n  )\n\n  return createMastraTools(agenticToolClient)\n}\n"
  },
  {
    "path": "stdlib/mastra/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/mcp/package.json",
    "content": "{\n  \"name\": \"@agentic/mcp\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic SDK for exposing tools from an MCP client in a way that easily interops with all TypeScript AI SDKs.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/mcp\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"@modelcontextprotocol/sdk\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/mcp/src/index.ts",
    "content": "export * from './mcp-tools'\nexport type * from './types'\n"
  },
  {
    "path": "stdlib/mcp/src/mcp-tools.ts",
    "content": "import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport type {\n  CallToolResult,\n  ListToolsResult\n} from '@modelcontextprotocol/sdk/types.js'\nimport {\n  AIFunctionSet,\n  AIFunctionsProvider,\n  assert,\n  createAIFunction,\n  createJsonSchema\n} from '@agentic/core'\nimport { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js'\nimport { type z } from 'zod'\n\nimport type { McpToolsFilter, McpToolsOptions } from './types'\nimport { paginate } from './paginate'\n\n/**\n * Agentic tools provider wrapping an MCP client.\n *\n * You likely want to use `createMcpTools` to create an instance of `McpTools`\n * which enables exposing MCP server tools to the agentic ecosystem.\n *\n * @see https://modelcontextprotocol.io\n */\nexport class McpTools extends AIFunctionsProvider {\n  readonly name: string\n  readonly client: McpClient\n  readonly rawToolResponses: boolean\n\n  protected _toolsMap: Map<string, ListToolsResult['tools'][number]> | undefined\n  protected readonly _toolsFilter: McpToolsFilter | undefined\n\n  protected constructor({\n    name,\n    client,\n    toolsFilter,\n    rawToolResponses = false\n  }: {\n    client: McpClient\n  } & McpToolsOptions) {\n    super()\n\n    this.name = name\n    this.client = client\n    this.rawToolResponses = rawToolResponses\n\n    this._toolsFilter = toolsFilter\n  }\n\n  override get functions(): AIFunctionSet {\n    assert(this._functions)\n    return this._functions\n  }\n\n  /**\n   * Initialize the McpTools instance by fetching all available tools from the MCP client.\n   * This method must be called before using this class' tools.\n   * It is called automatically when using `McpTools.from()`.\n   */\n  protected async _init() {\n    const capabilties = this.client.getServerCapabilities()\n    const initPromises: Promise<any>[] = []\n\n    if (capabilties?.tools) {\n      initPromises.push(this._initTools())\n    }\n\n    // TODO: handle prompts, resources, etc.\n    await Promise.all(initPromises)\n  }\n\n  protected async _initTools() {\n    const tools = await paginate({\n      size: Infinity,\n      handler: async ({ cursor }: { cursor?: string }) => {\n        const { tools, nextCursor } = await this.client.listTools({ cursor })\n        return { data: tools, nextCursor } as const\n      }\n    })\n\n    const enabledTools = this._toolsFilter\n      ? tools.filter((tool) => this._toolsFilter!(tool.name))\n      : tools\n\n    this._toolsMap = new Map(enabledTools.map((tool) => [tool.name, tool]))\n    this._updateFunctions()\n  }\n\n  protected _updateFunctions() {\n    assert(this._toolsMap)\n\n    this._functions = new AIFunctionSet(\n      Array.from(this._toolsMap.entries()).map(([_name, tool]) => {\n        return createAIFunction(\n          {\n            name: `${this.name}_${tool.name}`,\n            description: tool.description ?? `${this.name} ${tool.name}`,\n            inputSchema: createJsonSchema(tool.inputSchema),\n            strict: true\n          },\n          async (args) => {\n            const result = await this.client.callTool({\n              name: tool.name,\n              arguments: args\n            })\n\n            if (this.rawToolResponses) {\n              return result\n            }\n\n            return processToolCallResult(result as CallToolResult)\n          }\n        )\n      })\n    )\n  }\n\n  async callTool(name: string, args: z.infer<z.ZodObject<any>>) {\n    const tool =\n      this._toolsMap?.get(name) ?? this._toolsMap?.get(`${this.name}_${name}`)\n    assert(tool, `Tool ${name} not found`)\n\n    const result = await this.client.callTool({ name, arguments: args })\n    return result\n  }\n\n  /**\n   * Creates a new McpTools instance from an existing, fully initialized\n   * MCP client.\n   *\n   * You probably want to use `createMcpTool` instead, which makes initializing\n   * the MCP client and connecting to its transport easier.\n   *\n   * All tools within the `McpTools` instance will be namespaced under the given\n   * `name`.\n   */\n  static async fromMcpClient(params: { client: McpClient } & McpToolsOptions) {\n    const mcpTools = new McpTools(params)\n    await mcpTools._init()\n    return mcpTools\n  }\n}\n\n/**\n * Creates a new McpTools instance by connecting to an MCP server. You must\n * provide either an existing `transport`, an existing `serverUrl`, or a\n * `serverProcess` to spawn.\n *\n * All tools within the `McpTools` instance will be namespaced under the given\n * `name`.\n */\nexport async function createMcpTools(\n  params: McpToolsOptions\n): Promise<McpTools> {\n  const transport = await createMcpTransport(params)\n  const client = new McpClient(\n    { name: params.name, version: params.version || '1.0.0' },\n    { capabilities: {} }\n  )\n  await client.connect(transport)\n\n  return McpTools.fromMcpClient({ client, ...params })\n}\n\n/**\n * Creates a new MCP transport from either an existing `transport`, an existing\n * `serverUrl`, or a `serverProcess` to spawn.\n */\nexport async function createMcpTransport(\n  params: McpToolsOptions\n): Promise<Transport> {\n  if (params.transport) return params.transport\n\n  if (params.serverUrl) {\n    const { SSEClientTransport } = await import(\n      '@modelcontextprotocol/sdk/client/sse.js'\n    )\n    return new SSEClientTransport(new URL(params.serverUrl))\n  }\n\n  if (params.serverProcess) {\n    const { StdioClientTransport } = await import(\n      '@modelcontextprotocol/sdk/client/stdio.js'\n    )\n    return new StdioClientTransport(params.serverProcess)\n  }\n\n  throw new Error(\n    'Unable to create a server connection with supplied options. Must provide transport, stdio, or sseUrl.'\n  )\n}\n\nfunction toText(c: CallToolResult['content']) {\n  return c.map((p) => p.text || '').join('')\n}\n\nfunction processToolCallResult(result: CallToolResult) {\n  if (result.isError) return { error: toText(result.content) }\n\n  if (result.content.every((c) => !!c.text)) {\n    const text = toText(result.content)\n    if (text.trim().startsWith('{') || text.trim().startsWith('[')) {\n      try {\n        return JSON.parse(text)\n      } catch {\n        return text\n      }\n    }\n    return text\n  }\n\n  if (result.content.length === 1) return result.content[0]\n  return result\n}\n"
  },
  {
    "path": "stdlib/mcp/src/paginate.ts",
    "content": "export interface PaginateInput<T, C> {\n  size: number\n  handler: (data: {\n    cursor?: C\n    limit: number\n  }) => Promise<{ data: T[]; nextCursor?: C }>\n}\n\nexport async function paginate<T, C = number>(\n  input: PaginateInput<T, C>\n): Promise<T[]> {\n  const acc: T[] = []\n  let cursor: C | undefined\n\n  while (acc.length < input.size) {\n    const { data, nextCursor } = await input.handler({\n      cursor,\n      limit: input.size - acc.length\n    })\n    acc.push(...data)\n\n    if (nextCursor === undefined || data.length === 0) {\n      break\n    }\n\n    cursor = nextCursor\n  }\n\n  if (acc.length > input.size) {\n    acc.length = input.size\n  }\n\n  return acc\n}\n"
  },
  {
    "path": "stdlib/mcp/src/types.ts",
    "content": "import type { StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\n\nexport type McpToolsFilter = (toolName: string) => boolean\n\nexport interface McpToolsOptions {\n  /**\n   * Provide a name for this client which will be its namespace for all tools and prompts.\n   */\n  name: string\n\n  /**\n   * Provide a version number for this client (defaults to 1.0.0).\n   */\n  version?: string\n\n  /**\n   * If you already have an MCP transport you'd like to use, pass it here to connect to the server.\n   */\n  transport?: Transport\n\n  /**\n   * Start a local server process using the stdio MCP transport.\n   */\n  serverProcess?: StdioServerParameters\n\n  /**\n   * Connect to a remote server process using the SSE MCP transport.\n   */\n  serverUrl?: string\n\n  /**\n   * Return tool responses in raw MCP form instead of processing them for Genkit compatibility.\n   */\n  rawToolResponses?: boolean\n\n  /**\n   * An optional filter function to determine which tools should be enabled.\n   *\n   * By default, all tools available on the MCP server will be enabled, but you\n   * can use this to filter a subset of those tools.\n   */\n  toolsFilter?: McpToolsFilter\n}\n\n// TODO\n// export interface McpServerOptions {\n//   /** The name you want to give your server for MCP inspection. */\n//   name: string\n//\n//   /** The version you want the server to advertise to clients. Defaults to 1.0.0. */\n//   version?: string\n// }\n"
  },
  {
    "path": "stdlib/mcp/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/serpapi/package.json",
    "content": "{\n  \"name\": \"@agentic/serpapi\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic SDK for SerpAPI Google Search.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/serpapi\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/serpapi/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/serpapi\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/serpapi.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/serpapi <!-- omit from toc -->\n\n> Agentic SDK for [SerpAPI](https://serpapi.com) Google Search.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so)\n\n## Install\n\n```bash\nnpm i @agentic/serpapi zod\n```\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/serpapi/src/index.ts",
    "content": "export * from './serpapi-client'\n"
  },
  {
    "path": "stdlib/serpapi/src/serpapi-client.ts",
    "content": "import { aiFunction, AIFunctionsProvider, assert, getEnv } from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\n/**\n * All types have been exported from the `serpapi` package, which we're\n * not using directly because it is bloated and has compatibility issues.\n */\n\nexport namespace serpapi {\n  export const API_BASE_URL = 'https://serpapi.com'\n\n  export type BaseResponse<P = Record<string | number | symbol, never>> = {\n    search_metadata: {\n      id: string\n      status: string | 'Queued' | 'Processing' | 'Success'\n      json_endpoint: string\n      created_at: string\n      processed_at: string\n      raw_html_file: string\n      total_time_taken: number\n    }\n    search_parameters: {\n      engine: string\n    } & Omit<BaseParameters & P, 'api_key' | 'no_cache' | 'async' | 'timeout'>\n    serpapi_pagination?: {\n      next: string\n    }\n    pagination?: {\n      next: string\n    }\n    [key: string]: any\n  }\n\n  export type BaseParameters = {\n    /**\n     * Parameter defines the device to use to get the results. It can be set to\n     * `desktop` (default) to use a regular browser, `tablet` to use a tablet browser\n     * (currently using iPads), or `mobile` to use a mobile browser (currently\n     * using iPhones).\n     */\n    device?: 'desktop' | 'tablet' | 'mobile'\n\n    /**\n     * Parameter will force SerpApi to fetch the Google results even if a cached\n     * version is already present. A cache is served only if the query and all\n     * parameters are exactly the same. Cache expires after 1h. Cached searches\n     * are free, and are not counted towards your searches per month. It can be set\n     * to `false` (default) to allow results from the cache, or `true` to disallow\n     * results from the cache. `no_cache` and `async` parameters should not be used together.\n     */\n    no_cache?: boolean\n\n    /**\n     * Parameter defines the way you want to submit your search to SerpApi. It can\n     * be set to `false` (default) to open an HTTP connection and keep it open until\n     * you got your search results, or `true` to just submit your search to SerpApi\n     * and retrieve them later. In this case, you'll need to use our\n     * [Searches Archive API](https://serpapi.com/search-archive-api) to retrieve\n     * your results. `async` and `no_cache` parameters should not be used together.\n     * `async` should not be used on accounts with\n     * [Ludicrous Speed](https://serpapi.com/plan) enabled.\n     */\n    async?: boolean\n\n    /**\n     * Parameter defines the SerpApi private key to use.\n     */\n    api_key?: string | null\n\n    /**\n     * Specify the client-side timeout of the request. In milliseconds.\n     */\n    timeout?: number\n  }\n\n  export type GoogleParameters = BaseParameters & {\n    /**\n     * Search Query\n     * Parameter defines the query you want to search. You can use anything that you\n     * would use in a regular Google search. e.g. `inurl:`, `site:`, `intitle:`. We\n     * also support advanced search query parameters such as as_dt and as_eq. See the\n     * [full list](https://serpapi.com/advanced-google-query-parameters) of supported\n     * advanced search query parameters.\n     */\n    q: string\n\n    /**\n     * Location\n     * Parameter defines from where you want the search to originate. If several\n     * locations match the location requested, we'll pick the most popular one. Head to\n     * the [/locations.json API](https://serpapi.com/locations-api) if you need more\n     * precise control. location and uule parameters can't be used together. Avoid\n     * utilizing location when setting the location outside the U.S. when using Google\n     * Shopping and/or Google Product API.\n     */\n    location?: string\n\n    /**\n     * Encoded Location\n     * Parameter is the Google encoded location you want to use for the search. uule\n     * and location parameters can't be used together.\n     */\n    uule?: string\n\n    /**\n     * Google Place ID\n     * Parameter defines the id (`CID`) of the Google My Business listing you want to\n     * scrape. Also known as Google Place ID.\n     */\n    ludocid?: string\n\n    /**\n     * Additional Google Place ID\n     * Parameter that you might have to use to force the knowledge graph map view to\n     * show up. You can find the lsig ID by using our [Local Pack\n     * API](https://serpapi.com/local-pack) or [Places Results\n     * API](https://serpapi.com/places-results).\n     * lsig ID is also available via a redirect Google uses within [Google My\n     * Business](https://www.google.com/business/).\n     */\n    lsig?: string\n\n    /**\n     * Google Knowledge Graph ID\n     * Parameter defines the id (`KGMID`) of the Google Knowledge Graph listing you\n     * want to scrape. Also known as Google Knowledge Graph ID. Searches with kgmid\n     * parameter will return results for the originally encrypted search parameters.\n     * For some searches, kgmid may override all other parameters except start, and num\n     * parameters.\n     */\n    kgmid?: string\n\n    /**\n     * Google Cached Search Parameters ID\n     * Parameter defines the cached search parameters of the Google Search you want to\n     * scrape. Searches with si parameter will return results for the originally\n     * encrypted search parameters. For some searches, si may override all other\n     * parameters except start, and num parameters. si can be used to scrape Google\n     * Knowledge Graph Tabs.\n     */\n    si?: string\n\n    /**\n     * Domain\n     * Parameter defines the Google domain to use. It defaults to `google.com`. Head to\n     * the [Google domains page](https://serpapi.com/google-domains) for a full list of\n     * supported Google domains.\n     */\n    google_domain?: string\n\n    /**\n     * Country\n     * Parameter defines the country to use for the Google search. It's a two-letter\n     * country code. (e.g., `us` for the United States, `uk` for United Kingdom, or\n     * `fr` for France). Head to the [Google countries\n     * page](https://serpapi.com/google-countries) for a full list of supported Google\n     * countries.\n     */\n    gl?: string\n\n    /**\n     * Language\n     * Parameter defines the language to use for the Google search. It's a two-letter\n     * language code. (e.g., `en` for English, `es` for Spanish, or `fr` for French).\n     * Head to the [Google languages page](https://serpapi.com/google-languages) for a\n     * full list of supported Google languages.\n     */\n    hl?: string\n\n    /**\n     * Set Multiple Languages\n     * Parameter defines one or multiple languages to limit the search to. It uses\n     * `lang_{two-letter language code}` to specify languages and `|` as a delimiter.\n     * (e.g., `lang_fr|lang_de` will only search French and German pages). Head to the\n     * [Google lr languages page](https://serpapi.com/google-lr-languages) for a full\n     * list of supported languages.\n     */\n    lr?: string\n\n    /**\n     * as_dt\n     * Parameter controls whether to include or exclude results from the site named in\n     * the as_sitesearch parameter.\n     */\n    as_dt?: string\n\n    /**\n     * as_epq\n     * Parameter identifies a phrase that all documents in the search results must\n     * contain. You can also use the [phrase\n     * search](https://developers.google.com/custom-search/docs/xml_results#PhraseSearchqt)\n     * query term to search for a phrase.\n     */\n    as_epq?: string\n\n    /**\n     * as_eq\n     * Parameter identifies a word or phrase that should not appear in any documents in\n     * the search results. You can also use the [exclude\n     * query](https://developers.google.com/custom-search/docs/xml_results#Excludeqt)\n     * term to ensure that a particular word or phrase will not appear in the documents\n     * in a set of search results.\n     */\n    as_eq?: string\n\n    /**\n     * as_lq\n     * Parameter specifies that all search results should contain a link to a\n     * particular URL. You can also use the\n     * [link:](https://developers.google.com/custom-search/docs/xml_results#BackLinksqt)\n     * query term for this type of query.\n     */\n    as_lq?: string\n\n    /**\n     * as_nlo\n     * Parameter specifies the starting value for a search range. Use as_nlo and as_nhi\n     * to append an inclusive search range.\n     */\n    as_nlo?: string\n\n    /**\n     * as_nhi\n     * Parameter specifies the ending value for a search range. Use as_nlo and as_nhi\n     * to append an inclusive search range.\n     */\n    as_nhi?: string\n\n    /**\n     * as_oq\n     * Parameter provides additional search terms to check for in a document, where\n     * each document in the search results must contain at least one of the additional\n     * search terms. You can also use the [Boolean\n     * OR](https://developers.google.com/custom-search/docs/xml_results#BooleanOrqt)\n     * query term for this type of query.\n     */\n    as_oq?: string\n\n    /**\n     * as_q\n     * Parameter provides search terms to check for in a document. This parameter is\n     * also commonly used to allow users to specify additional terms to search for\n     * within a set of search results.\n     */\n    as_q?: string\n\n    /**\n     * as_qdr\n     * Parameter requests search results from a specified time period (quick date\n     * range). The following values are supported:\n     * `d[number]`: requests results from the specified number of past days. Example\n     * for the past 10 days: `as_qdr=d10`\n     * `w[number]`: requests results from the specified number of past weeks.\n     * `m[number]`: requests results from the specified number of past months.\n     * `y[number]`: requests results from the specified number of past years. Example\n     * for the past year: `as_qdr=y`\n     */\n    as_qdr?: string\n\n    /**\n     * as_rq\n     * Parameter specifies that all search results should be pages that are related to\n     * the specified URL. The parameter value should be a URL. You can also use the\n     * [related:](https://developers.google.com/custom-search/docs/xml_results#RelatedLinksqt)\n     * query term for this type of query.\n     */\n    as_rq?: string\n\n    /**\n     * as_sitesearch\n     * Parameter allows you to specify that all search results should be pages from a\n     * given site. By setting the as_dt parameter, you can also use it to exclude pages\n     * from a given site from your search resutls.\n     */\n    as_sitesearch?: string\n\n    /**\n     * Advanced Search Parameters\n     * (to be searched) parameter defines advanced search parameters that aren't\n     * possible in the regular query field. (e.g., advanced search for patents, dates,\n     * news, videos, images, apps, or text contents).\n     */\n    tbs?: string\n\n    /**\n     * Adult Content Filtering\n     * Parameter defines the level of filtering for adult content. It can be set to\n     * `active`, or `off` (default).\n     */\n    safe?: string\n\n    /**\n     * Exclude Auto-corrected Results\n     * Parameter defines the exclusion of results from an auto-corrected query that is\n     * spelled wrong. It can be set to `1` to exclude these results, or `0` to include\n     * them (default).\n     */\n    nfpr?: string\n\n    /**\n     * Results Filtering\n     * Parameter defines if the filters for 'Similar Results' and 'Omitted Results' are\n     * on or off. It can be set to `1` (default) to enable these filters, or `0` to\n     * disable these filters.\n     */\n    filter?: string\n\n    /**\n     * Search Type\n     * (to be matched) parameter defines the type of search you want to do.\n     * It can be set to:\n     * `(no tbm parameter)`: regular Google Search,\n     * `isch`: [Google Images API](https://serpapi.com/images-results),\n     * `lcl` - [Google Local API](https://serpapi.com/local-results)\n     * `vid`: [Google Videos API](https://serpapi.com/videos-results),\n     * `nws`: [Google News API](https://serpapi.com/news-results),\n     * `shop`: [Google Shopping API](https://serpapi.com/shopping-results),\n     * or any other Google service.\n     */\n    tbm?: string\n\n    /**\n     * Result Offset\n     * Parameter defines the result offset. It skips the given number of results. It's\n     * used for pagination. (e.g., `0` (default) is the first page of results, `10` is\n     * the 2nd page of results, `20` is the 3rd page of results, etc.).\n     * Google Local Results only accepts multiples of `20`(e.g. `20` for the second\n     * page results, `40` for the third page results, etc.) as the start value.\n     */\n    start?: number\n\n    /**\n     * Number of Results\n     * Parameter defines the maximum number of results to return. (e.g., `10` (default)\n     * returns 10 results, `40` returns 40 results, and `100` returns 100 results).\n     */\n    num?: number\n\n    /**\n     * Page Number (images)\n     * Parameter defines the page number for [Google\n     * Images](https://serpapi.com/images-results). There are 100 images per page. This\n     * parameter is equivalent to start (offset) = ijn * 100. This parameter works only\n     * for [Google Images](https://serpapi.com/images-results) (set tbm to `isch`).\n     */\n    ijn?: string\n  }\n\n  export interface SearchResult extends BaseResponse<GoogleParameters> {\n    search_metadata: SearchMetadata\n    search_parameters: SearchParameters\n    search_information: SearchInformation\n    local_map?: LocalMap\n    local_results?: LocalResults\n    answer_box?: AnswerBox\n    knowledge_graph?: KnowledgeGraph\n    inline_images?: InlineImage[]\n    inline_people_also_search_for?: InlinePeopleAlsoSearchFor[]\n    related_questions?: SearchResultRelatedQuestion[]\n    organic_results?: OrganicResult[]\n    related_searches?: RelatedSearch[]\n    pagination: Pagination\n    serpapi_pagination: Pagination\n    twitter_results?: TwitterResults\n  }\n\n  export interface TwitterResults {\n    title: string\n    link: string\n    displayed_link: string\n    tweets: Tweet[]\n  }\n\n  export interface Tweet {\n    link: string\n    snippet: string\n    published_date: string\n  }\n\n  export interface AnswerBox {\n    type: string\n    title: string\n    link: string\n    displayed_link: string\n    snippet: string\n    snippet_highlighted_words: string[]\n    images: string[]\n    about_this_result: AboutThisResult\n    about_page_link: string\n    cached_page_link: string\n  }\n\n  export interface InlineImage {\n    link: string\n    source: string\n    thumbnail: string\n    original: string\n    source_name: string\n    title?: string\n  }\n\n  export interface InlinePeopleAlsoSearchFor {\n    title: string\n    items: SearchItem[]\n    see_more_link: string\n    see_more_serpapi_link: string\n  }\n\n  export interface SearchItem {\n    name: string\n    image: string\n    link: string\n    serpapi_link: string\n  }\n\n  export interface KnowledgeGraph {\n    type: string\n    kgmid: string\n    knowledge_graph_search_link: string\n    serpapi_knowledge_graph_search_link: string\n    header_images: HeaderImage[]\n    description: string\n    source: Source\n    buttons: Button[]\n    people_also_search_for: SearchItem[]\n    people_also_search_for_link: string\n    people_also_search_for_stick: string\n    list: { [key: string]: string[] }\n  }\n\n  export interface Button {\n    text: string\n    subtitle: string\n    title: string\n    link: string\n    displayed_link: string\n    snippet?: string\n    snippet_highlighted_words?: string[]\n    answer?: string\n    thumbnail: string\n    search_link: string\n    serpapi_search_link: string\n    date?: string\n    list?: string[]\n  }\n\n  export interface HeaderImage {\n    image: string\n    source: string\n  }\n\n  export interface Source {\n    name: string\n    link: string\n  }\n\n  export interface LocalMap {\n    link: string\n    image: string\n    gps_coordinates: LocalMapGpsCoordinates\n  }\n\n  export interface LocalMapGpsCoordinates {\n    latitude: number\n    longitude: number\n    altitude: number\n  }\n\n  export interface LocalResults {\n    places: Place[]\n    more_locations_link: string\n  }\n\n  export interface Place {\n    position: number\n    title: string\n    rating?: number\n    reviews_original?: string\n    reviews?: number\n    place_id: string\n    place_id_search: string\n    lsig: string\n    thumbnail: string\n    gps_coordinates: PlaceGpsCoordinates\n    service_options: ServiceOptions\n    address?: string\n    type?: string\n    hours?: string\n  }\n\n  export interface PlaceGpsCoordinates {\n    latitude: number\n    longitude: number\n  }\n\n  export interface ServiceOptions {\n    dine_in?: boolean\n    takeout: boolean\n    no_delivery?: boolean\n  }\n\n  export interface OrganicResult {\n    position: number\n    title: string\n    link: string\n    displayed_link: string\n    thumbnail?: string\n    favicon?: string\n    snippet: string\n    snippet_highlighted_words: string[]\n    sitelinks?: Sitelinks\n    rich_snippet?: RichSnippet\n    about_this_result: AboutThisResult\n    cached_page_link: string\n    related_pages_link?: string\n    source: string\n    related_results?: RelatedResult[]\n    date?: string\n    related_questions?: OrganicResultRelatedQuestion[]\n  }\n\n  export interface AboutThisResult {\n    keywords: string[]\n    languages: string[]\n    regions: string[]\n  }\n\n  export interface OrganicResultRelatedQuestion {\n    question: string\n    snippet: string\n    snippet_links: SnippetLink[]\n  }\n\n  export interface SnippetLink {\n    text: string\n    link: string\n  }\n\n  export interface RelatedResult {\n    position: number\n    title: string\n    link: string\n    displayed_link: string\n    snippet: string\n    snippet_highlighted_words: string[]\n    about_this_result: AboutThisResult\n    cached_page_link: string\n  }\n\n  export interface RichSnippet {\n    bottom: Bottom\n  }\n\n  export interface Bottom {\n    extensions?: string[]\n    questions?: string[]\n  }\n\n  export interface Sitelinks {\n    inline: Inline[]\n  }\n\n  export interface Inline {\n    title: string\n    link: string\n  }\n\n  export interface Pagination {\n    current: number\n    next: string\n    other_pages: { [key: string]: string }\n    next_link?: string\n  }\n\n  export interface SearchResultRelatedQuestion {\n    question: string\n    snippet: string\n    title: string\n    link: string\n    displayed_link: string\n    thumbnail: string\n    next_page_token: string\n    serpapi_link: string\n    date?: string\n  }\n\n  export interface RelatedSearch {\n    query: string\n    link: string\n  }\n\n  export interface SearchInformation {\n    organic_results_state: string\n    query_displayed: string\n    total_results: number\n    time_taken_displayed: number\n    menu_items: MenuItem[]\n  }\n\n  export interface MenuItem {\n    position: number\n    title: string\n    link: string\n    serpapi_link?: string\n  }\n\n  export interface SearchMetadata {\n    id: string\n    status: string\n    json_endpoint: string\n    created_at: string\n    processed_at: string\n    google_url: string\n    raw_html_file: string\n    total_time_taken: number\n  }\n\n  export interface SearchParameters {\n    engine: string\n    q: string\n    google_domain: string\n    device?: 'desktop' | 'tablet' | 'mobile'\n  }\n\n  export type ClientParams = Partial<Omit<GoogleParameters, 'q'>>\n}\n\n/**\n * Lightweight wrapper around SerpAPI for Google search.\n *\n * @see https://serpapi.com/search-api\n */\nexport class SerpAPIClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n  protected readonly params: serpapi.ClientParams\n\n  constructor({\n    apiKey = getEnv('SERPAPI_API_KEY') ?? getEnv('SERP_API_KEY'),\n    apiBaseUrl = serpapi.API_BASE_URL,\n    ky = defaultKy,\n    ...params\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } & serpapi.ClientParams = {}) {\n    assert(\n      apiKey,\n      'SerpAPIClient missing required \"apiKey\" (defaults to \"SERPAPI_API_KEY\")'\n    )\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n    this.params = params\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl\n    })\n  }\n\n  /**\n   * Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.\n   */\n  @aiFunction({\n    name: 'serpapi_google_search',\n    description:\n      'Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.',\n    inputSchema: z.object({\n      q: z.string().describe('search query'),\n      num: z\n        .number()\n        .int()\n        .default(5)\n        .optional()\n        .describe('number of results to return')\n    })\n  })\n  async search(queryOrOpts: string | serpapi.GoogleParameters) {\n    const defaultGoogleParams: Partial<serpapi.GoogleParameters> = {}\n    const options: serpapi.GoogleParameters =\n      typeof queryOrOpts === 'string'\n        ? { ...defaultGoogleParams, q: queryOrOpts }\n        : queryOrOpts\n    const { timeout, ...rest } = this.params\n\n    // console.log('SerpAPIClient.search', options)\n    return this.ky\n      .get('search', {\n        searchParams: {\n          ...rest,\n          engine: 'google',\n          api_key: this.apiKey,\n          ...(options as any)\n        },\n        timeout\n      })\n      .json<serpapi.SearchResult>()\n  }\n}\n"
  },
  {
    "path": "stdlib/serpapi/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "stdlib/serper/package.json",
    "content": "{\n  \"name\": \"@agentic/serper\",\n  \"version\": \"8.4.4\",\n  \"description\": \"Agentic SDK for the Serper Google Search API.\",\n  \"author\": \"Travis Fischer <travis@transitivebullsh.it>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/transitive-bullshit/agentic.git\",\n    \"directory\": \"stdlib/serper\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"source\": \"./src/index.ts\",\n  \"types\": \"./dist/index.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"default\": \"./dist/index.js\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"del dist\",\n    \"test\": \"run-s test:*\",\n    \"test:typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@agentic/core\": \"workspace:*\",\n    \"ky\": \"catalog:\"\n  },\n  \"peerDependencies\": {\n    \"zod\": \"catalog:\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "stdlib/serper/readme.md",
    "content": "<p align=\"center\">\n  <a href=\"https://agentic.so\">\n    <img alt=\"Agentic\" src=\"https://raw.githubusercontent.com/transitive-bullshit/agentic/main/apps/web/public/agentic-social-image-light.jpg\" width=\"640\">\n  </a>\n</p>\n\n<p>\n  <a href=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml\"><img alt=\"Build Status\" src=\"https://github.com/transitive-bullshit/agentic/actions/workflows/main.yml/badge.svg\" /></a>\n  <a href=\"https://www.npmjs.com/package/@agentic/serper\"><img alt=\"NPM\" src=\"https://img.shields.io/npm/v/@agentic/serper.svg\" /></a>\n  <a href=\"https://prettier.io\"><img alt=\"Prettier Code Formatting\" src=\"https://img.shields.io/badge/code_style-prettier-brightgreen.svg\" /></a>\n</p>\n\n# @agentic/serper <!-- omit from toc -->\n\n> Agentic SDK for the [Serper](https://serper.dev) Google Search API.\n\n- [Website](https://agentic.so)\n- [Docs](https://docs.agentic.so)\n\n## Install\n\n```bash\nnpm i @agentic/serper zod\n```\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n"
  },
  {
    "path": "stdlib/serper/src/index.ts",
    "content": "export * from './serper-client'\n"
  },
  {
    "path": "stdlib/serper/src/serper-client.ts",
    "content": "import {\n  aiFunction,\n  AIFunctionsProvider,\n  assert,\n  getEnv,\n  omit\n} from '@agentic/core'\nimport defaultKy, { type KyInstance } from 'ky'\nimport { z } from 'zod'\n\nexport namespace serper {\n  export const API_BASE_URL = 'https://google.serper.dev'\n\n  export const SearchParamsSchema = z.object({\n    q: z.string().describe('search query'),\n    autocorrect: z.boolean().default(true).optional(),\n    gl: z.string().default('us').optional(),\n    hl: z.string().default('en').optional(),\n    page: z.number().int().default(1).optional(),\n    num: z\n      .number()\n      .int()\n      .default(10)\n      .optional()\n      .describe('number of results to return')\n  })\n  export type SearchParams = z.infer<typeof SearchParamsSchema>\n\n  export const GeneralSearchSchema = SearchParamsSchema.extend({\n    type: z\n      .enum(['search', 'images', 'videos', 'places', 'news', 'shopping'])\n      .default('search')\n      .optional()\n      .describe('Type of Google search to perform')\n  })\n  export type GeneralSearchParams = z.infer<typeof GeneralSearchSchema>\n\n  export interface SearchResponse {\n    searchParameters: SearchParameters & { type: 'search' }\n    organic: Organic[]\n    answerBox?: AnswerBox\n    knowledgeGraph?: KnowledgeGraph\n    topStories?: TopStory[]\n    peopleAlsoAsk?: PeopleAlsoAsk[]\n    relatedSearches?: RelatedSearch[]\n  }\n\n  export interface SearchImagesResponse {\n    searchParameters: SearchParameters & { type: 'images' }\n    images: Image[]\n  }\n\n  export interface SearchVideosResponse {\n    searchParameters: SearchParameters & { type: 'videos' }\n    videos: Video[]\n  }\n\n  export interface SearchPlacesResponse {\n    searchParameters: SearchParameters & { type: 'places' }\n    places: Place[]\n  }\n\n  export interface SearchNewsResponse {\n    searchParameters: SearchParameters & { type: 'news' }\n    news: News[]\n  }\n\n  export interface SearchShoppingResponse {\n    searchParameters: SearchParameters & { type: 'shopping' }\n    shopping: Shopping[]\n  }\n\n  export type Response =\n    | SearchResponse\n    | SearchImagesResponse\n    | SearchVideosResponse\n    | SearchPlacesResponse\n    | SearchNewsResponse\n    | SearchShoppingResponse\n\n  export interface KnowledgeGraph {\n    title: string\n    type: string\n    website: string\n    imageUrl: string\n    description: string\n    descriptionSource: string\n    descriptionLink: string\n    attributes: Record<string, string>\n  }\n\n  export interface Organic {\n    title: string\n    link: string\n    snippet: string\n    position: number\n    imageUrl?: string\n    sitelinks?: SiteLink[]\n  }\n\n  export interface AnswerBox {\n    snippet: string\n    snippetHighlighted?: string[]\n    title: string\n    link: string\n    date?: string\n    position?: number\n  }\n\n  export interface SiteLink {\n    title: string\n    link: string\n  }\n\n  export interface PeopleAlsoAsk {\n    question: string\n    snippet: string\n    title: string\n    link: string\n  }\n\n  export interface RelatedSearch {\n    query: string\n  }\n\n  export interface SearchParameters {\n    q: string\n    gl: string\n    hl: string\n    num: number\n    autocorrect: boolean\n    page: number\n    type: string\n    engine: string\n  }\n\n  export interface TopStory {\n    title: string\n    link: string\n    source: string\n    date: string\n    imageUrl: string\n  }\n\n  export interface Image {\n    title: string\n    imageUrl: string\n    imageWidth: number\n    imageHeight: number\n    thumbnailUrl: string\n    thumbnailWidth: number\n    thumbnailHeight: number\n    source: string\n    domain: string\n    link: string\n    googleUrl: string\n    position: number\n  }\n\n  export interface Video {\n    title: string\n    link: string\n    snippet: string\n    date: string\n    imageUrl: string\n    position: number\n  }\n\n  export interface Place {\n    position: number\n    title: string\n    address: string\n    latitude: number\n    longitude: number\n    category: string\n    phoneNumber?: string\n    website: string\n    cid: string\n    rating?: number\n    ratingCount?: number\n  }\n\n  export interface News {\n    title: string\n    link: string\n    snippet: string\n    date: string\n    source: string\n    imageUrl: string\n    position: number\n  }\n\n  export interface Shopping {\n    title: string\n    source: string\n    link: string\n    price: string\n    imageUrl: string\n    delivery?: Record<string, string>\n    rating?: number\n    ratingCount?: number\n    offers?: string\n    productId?: string\n    position: number\n  }\n\n  export type ClientParams = Partial<Omit<SearchParams, 'q'>>\n}\n\n/**\n * Lightweight wrapper around Serper for Google search.\n *\n * @see https://serper.dev\n */\nexport class SerperClient extends AIFunctionsProvider {\n  protected readonly ky: KyInstance\n  protected readonly apiKey: string\n  protected readonly apiBaseUrl: string\n  protected readonly params: serper.ClientParams\n\n  constructor({\n    apiKey = getEnv('SERPER_API_KEY'),\n    apiBaseUrl = serper.API_BASE_URL,\n    ky = defaultKy,\n    ...params\n  }: {\n    apiKey?: string\n    apiBaseUrl?: string\n    ky?: KyInstance\n  } & serper.ClientParams = {}) {\n    assert(\n      apiKey,\n      'SerperClient missing required \"apiKey\" (defaults to \"SERPER_API_KEY\")'\n    )\n\n    super()\n\n    this.apiKey = apiKey\n    this.apiBaseUrl = apiBaseUrl\n    this.params = params\n\n    this.ky = ky.extend({\n      prefixUrl: this.apiBaseUrl,\n      headers: {\n        'x-api-key': this.apiKey\n      }\n    })\n  }\n\n  /**\n   * Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.\n   */\n  @aiFunction({\n    name: 'serper_google_search',\n    description:\n      'Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.',\n    inputSchema: serper.GeneralSearchSchema.pick({\n      q: true,\n      num: true,\n      type: true\n    })\n  })\n  async search(queryOrOpts: string | serper.GeneralSearchParams) {\n    const searchType =\n      typeof queryOrOpts === 'string' ? 'search' : queryOrOpts.type || 'search'\n    return this._fetch<serper.SearchResponse>(\n      searchType,\n      typeof queryOrOpts === 'string' ? queryOrOpts : omit(queryOrOpts, 'type')\n    )\n  }\n\n  async searchImages(queryOrOpts: string | serper.SearchParams) {\n    return this._fetch<serper.SearchImagesResponse>('images', queryOrOpts)\n  }\n\n  async searchVideos(queryOrOpts: string | serper.SearchParams) {\n    return this._fetch<serper.SearchVideosResponse>('videos', queryOrOpts)\n  }\n\n  async searchPlaces(queryOrOpts: string | serper.SearchParams) {\n    return this._fetch<serper.SearchPlacesResponse>('places', queryOrOpts)\n  }\n\n  async searchNews(queryOrOpts: string | serper.SearchParams) {\n    return this._fetch<serper.SearchNewsResponse>('news', queryOrOpts)\n  }\n\n  async searchProducts(queryOrOpts: string | serper.SearchParams) {\n    return this._fetch<serper.SearchShoppingResponse>('shopping', queryOrOpts)\n  }\n\n  protected async _fetch<T extends serper.Response>(\n    endpoint: string,\n    queryOrOpts: string | serper.SearchParams\n  ): Promise<T> {\n    const params = {\n      ...this.params,\n      ...(typeof queryOrOpts === 'string' ? { q: queryOrOpts } : queryOrOpts)\n    }\n\n    return this.ky.post(endpoint, { json: params }).json<T>()\n  }\n}\n"
  },
  {
    "path": "stdlib/serper/tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n"
  },
  {
    "path": "todo.md",
    "content": "## API Gateway\n\n- **MCP**: `https://gateway.agentic.so/@{username}/{project-slug}/mcp`\n- **HTTP**: `GET/POST` `https://gateway.agentic.so/@{username}/{project-slug}/{tool-name}`\n\n## TODO: Post-MVP\n\n- **website**\n  - llms.txt for all projects\n  - handle browser back/forward with `?next=`\n  - add some social proof to signup page\n- api gateway stress tests\n- auth\n  - custom auth provider configs for projects/deployments\n- stripe\n  - declarative json-based pricing\n    - like Saasify and https://github.com/tierrun/tier\n    - https://github.com/tierrun/tier/blob/main/pricing/schema.json\n    - https://blog.tier.run/tier-hello-world-demo\n- re-add support for teams / organizations\n- consider switching to [consola](https://github.com/unjs/consola) for logging?\n- consider switching to `bun` (for `--hot` reloading!!)\n- validate stability of pricing plan slugs across deployments\n  - same for pricing plan line-items\n- replace `ms` package\n- **API gateway**\n  - SSE support? (no; post-mvp if at all; only support [streamable http](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) like smithery does, or maybe support both?)\n  - signed requests\n  - add support for custom headers on responses\n  - add ability to only report stripe usage on non-cached requests\n  - add support for ToolConfig.cost defaulting to 1, to easily support tools which cost multiple \"credits\"\n  - extra `Sentry` instrumentation (`setUser`, `captureMessage`, etc)\n  - test handling of binary bodies and responses\n  - improve logger vs console for non-hono path and util methods\n  - consider replacing `eventId` with uuids for `requestId`?\n  - openapi origin kitchen sink\n    - add more test cases to e2e tests for diff content types\n  - mcp origin kitchen sink\n  - add support for `/sse`? need to test with claude desktop\n  - test handling of resources\n- `@agentic/platform-hono`\n  - fix sentry middleware\n    - https://github.com/honojs/middleware/blob/main/packages/sentry/src/index.ts\n    - https://github.com/honojs/middleware/issues/943\n    - https://github.com/getsentry/sentry-javascript/tree/master/packages/cloudflare\n- **Origin MCP servers**\n  - how to guarantee that the request is coming from agentic?\n    - `_meta` for tool calls\n    - _still need a way of doing this for initial connection requests_\n    - _=> ask in the official mcp developers discord_\n  - mcp auth provider support\n  - test binary bodies / responses / mcp resources\n  - resources\n  - prompts\n  - other MCP features?\n- additional transactional emails\n- handle or validate against dynamic MCP origin tools\n- upgrade to zod v4\n- decide whether deployment fields like `defaultRateLimit` and others should be generated and stored in the db, or should be inferred based on `undefined` values\n- support multiple rate-limits by slug\n  - RateLimit-Policy: \"burst\";q=100;w=60,\"daily\";q=1000;w=86400\n  - https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/\n- handle hosting of deployment and user images\n- about page inspiration: https://mastra.ai/about\n- simplify overlap between `@agentic/core` and `@agentic/platform-core`\n- consider simplifying `AgenticToolClient` to only require one package per TS LLM SDK\n  - `createAISDKToolsFromIdentifier(projectIdentifier)`\n- consider allowing deployments to specify their proxy secret instead of a single, per-project proxy secret\n- add docs on using multiple tools with `AIFunctionSet`\n- add support for `crewai`\n- add scroll appearance motion to hero animation\n- add ts sdk examples to e2e tests\n- add feature about optimized context to docs\n- import react example usage component into docs\n- add [ping](https://modelcontextprotocol.io/specification/2025-03-26/basic/utilities/ping) support to mcp servers\n- fix readme css <img height=\"...\"> not taking effect because of tailwind css preflight which sets `img, video { height: auto }`\n  - we still want this for every other scenario; just want to sandbox the github-style readme markdown css...\n- add `--llm` flag to cli (https://x.com/badlogicgames/status/1940370344990441726)\n- support claude Desktop Extensions ([DXT](https://github.com/anthropics/dxt)) ([post](https://www.anthropic.com/engineering/desktop-extensions))\n- add mcp-remote to support stdio-only mcp clients like claude desktop\n- add docs on how to use with [chatgpt's mcp custom connectors](https://platform.openai.com/docs/mcp) ([requires pro account or team/enterprise/edu workspace](https://help.openai.com/en/articles/11487775-connectors-in-chatgpt#h_d2a53d4230))\n- add support for enterprise / custom / contact us pricing\n- consider changing homepage hero CTA to include publishing\n- docs: add notes about constraints on mcp origin servers (static tools)\n- analytics dashboard\n- UX onboarding\n- visual pricing plan config + previews\n- marketplace public project detail page\n  - add breadcrumb nav: marketplace > @agentic > search\n  - add last published date somewhere\n  - tool input/output schemas; move `$schema` to the top\n  - break out into a few subcomponents; some can be server components\n  - mcp inspector\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"@fisch0920/config/tsconfig-node\",\n  \"include\": [\"*.config.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "tsup.config.ts",
    "content": "import { defineConfig } from 'tsup'\n\nexport default defineConfig([\n  {\n    entry: ['src/index.ts'],\n    outDir: 'dist',\n    target: 'node18',\n    platform: 'node',\n    format: ['esm'],\n    splitting: false,\n    sourcemap: true,\n    minify: false,\n    shims: true,\n    dts: true\n  }\n])\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"ui\": \"stream\",\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist/**\", \".next/**\", \"!.next/cache/**\"],\n      \"outputLogs\": \"new-only\",\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env\", \".env.*\"]\n    },\n    \"clean\": {\n      \"cache\": false,\n      \"dependsOn\": [\"^clean\"]\n    },\n    \"test\": {\n      \"dependsOn\": [\"test:format\", \"test:lint\", \"test:typecheck\", \"test:unit\"]\n    },\n    \"test:lint\": {\n      \"dependsOn\": [\"//#test:lint\", \"^test:lint\"],\n      \"outputLogs\": \"errors-only\"\n    },\n    \"test:typecheck\": {\n      \"dependsOn\": [\"^test:typecheck\"],\n      \"outputLogs\": \"errors-only\"\n    },\n    \"test:unit\": {\n      \"dependsOn\": [\"^test:unit\"],\n      \"outputLogs\": \"errors-only\"\n    },\n    \"test:format\": {\n      \"dependsOn\": [\"//#test:format\", \"^test:format\"]\n    },\n    \"//#test:format\": {},\n    \"//#test:lint\": {},\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    },\n    \"docs\": {\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n"
  }
]